PK6:QMETA-INF/MANIFEST.MF}YJ{G{$4y,~iol׍*ur'kַd4p) Kf1*>!°b6YgQ q6+ lϩ>(:f!H_T ?c )k_(=a3w+~.iSpPq`eVU?e]dDU7rqTyc_F #μ.,*v>ڠ?|.'޺OESBo坮|tF۾NQ?b`H;f};%-&Jۮ[ l4߉sBC|ǮMp\1Ē^W՗~<\~׿xsΧl)'6L룴4Ҫ* g؆TE1-?tKWhz_fHع8IFQ}Y|NX_aEӚIb[ܜUֵףJ͊)ǯ^ٴ D%q9tmk$ 凉* L<$ƎIB9k?\4|[[XJ)y+p" 7+dm֗|~Aۻ5B72v-M׭x͞%>;#ZHf ֻ=c4 fl *6V2>`_tvE l G؃?*'::רj8aGwIj9&dGۮ}+MhN*4 AѷBzo?ތJYVt}Equ(]"Zoա1z_='Qk9SE 2fKy36|:׍;OXL!›u.2̇xT+gm|ɔf-vpN͊e]&y[7Y}pÖhS{ٹ[3ѝB"SuN/}T *fʋ<6QlIaE,*__8wB+hŜ"~Fs gn tfD|# T c?5"i*Fj oY+J% U~, h~>,o2bOC*a)<b$`07 bY>3((|n]$ՉS|I\;\mGyAo Q-,ǩ:5A>7ouhc49_g["hUug!>*%jovy.' VH?gsz[y}H47+ x{zSum9&.Xegm XP WI@<$\0`kNajYu0ۅ+rUB%`mh' s_W2ڹڍYF;*N ֢qC':fr1w Un6NF^J]$[W3S~rNvU]/ی'W9v n3tήC ?Nڠ$-;ʙc%h„*_BS1g a" D(0<Ü!)ٽM= @~i+4S5FKM?qMc+wȱb<4`!*%;MVN^Ou;_]/La㠈‚InX,fH9N(jZF^in$u68]]_Ppa?"7"6ؙq=ףt=u(SB)tYXt*x2]!&YU:CrrjMIGmy(f> }2@`PQY򨈵W;c⋼IO!Mޅu-/v0@My/Z,3BTezc3ZNm'>H{A p4.yś"93~9p ;W&a.o< &`1|q`c@C8F#JGUH#>q2Z%U-trĢg?0Ǔ93vp[,#ޚ婞8҅mbkS|p|C ^jS3 H4>~M^8EҺ[kolmPe^Nӧph?A_G$VJ4o=wl{JX g0H0(3,4.AH+hf3|qT֪pkto[iݓYDB}:|_cnn5t7>2|M4?tsXj>@6eӬ u%e(EfA+(J+YBrMHH 7L0ڏ8@jF1uNFXe k=?Wk$C"ewj=j8|u]e)8wDT.Gw9氇' ' ثDRj?Alx0Yx:X aZ b.p#-VDbx;Z$y8Ls|!Eת>.bWNHz"V,<7e4e!lXnSVNVV@i&vY'NuB]V^XN<:8* :Ka܃@Dţ'!+,^23X"kܪW/gj bD*3B)tw|DݿVjHp jX&vl%xY@Njljo"sJg4=VLN"'< 6@4u&2 aoG_xújg\Tbb58a|/wpwzeF:E0Gx-'bȭA)U޶ݺ]BgƮO-4Toh6Tk'+IBAr Kd`7&gE4L3s=N$4X1w~E1QX21I{C=5|̆a6117긨0B%g$kP HY37]J<+qj Ag[<<ˢI"̀AàN 7 hlPA.PSz'g Bh;'2.[z J5ʖG+FLHRuCYI_Q d#2sZ^)bbG1r'ݷ`zK4|^0|;D@F/RsZPX&"LTsc .% C4+%iYIA`Dc"4_eHP*+ z$}_=,& 3!}xN{lEƬE2L&*^y1{#ީ>SQDn6 D붫6D}r* vjy%Yw~[NPX\;1nSpUz|~),ݺFv^ME/TpEcWqRo^ Crq4_"@F9;xֽ=v29ie ;DjָqNF|:"aT5Mj ۮ6%𻳵eLr}yFCuV-$מ=vms|u)*ð /3D'B1g[i,A5{'h͝4ZE1Vf=DkƫkE%Z,e6Rgu-VRS~,9f /?Z,(W2S % ڥϓl"RKdYj gJ1{dK8҅\\-TEyy{=%A`Usy[["#SɷڒwI'b1oR;ek*]ݺX.<R/xwzU,td^ꭜv{ܷ}d~y>Lry;4sBi}i+0?\Nm ;š8.kzb >2ނ={^23/QG:,u #`ݎY7p]kQUj$oüҸH4i;H%9JTB|@})BAv^*}m\H{yYIYZgB#4'%xΜ0}o>cocY:rGan>6&y3Y&G:bLiw! 5Bډک=tϰ|q}о|C~[Wg؃9u7k} viSf!U :k\uekq&mS{Lt'{D;O#K@9$,*aB bu$wt>s5@VXυ`rQiI) ŒiezQ(q32kmRqf"H7gZ>bdweHm4#{Qxp44@S]e a/G C0V=̏ v׼SʦZFA7)I1榝p^c T)ǒ!Jʖk!9\|oaժ lr{?+!3:eJS~G ̞o|'yvU,^ᩓc8LIEw]1j mJ)@˳iDyҷπ qt6 =ap>#CR~6YjbANra%iN-i~.Y.ҁVwjϮP@\EFnBUt:)K>5ܽ76 2S50hyohȹlҕdI0<`U_󪭕BQWƘyAƿ$E&[e/ *e{ gb竔pGh9}uY˱!eO(wWAD4[IRB(% ;h W)[Cׅ;2`Y.$;z> ]Qhd*]8(^0]ǩ~2lXV t 3_&3!ov h ,YҚ?Sa@U S1h!VB׭Β`(~t *Ao!: B1B{= ;-d$!^O^vA${uo1Z=`ҸH5!]:R7QIyg{_wRQ 0dq@%o Ziowϸ(9qJ-XD{5 A34պdLS+@=\u^+D^#qiuVN͎v>٩<_x.gnQ]A.0&W=N`.p^ߛisI+}Od + F ɒҎ✃8#41X 8JwXAJ, iF̿(Gu! }:s+sN)yD4?ԌVjqDBf$g c=Ex L]T/:"xٰF͐؛uHXfƂxm l`KeW\g4 Xξ`^6Zf3VpNUՈkD+͔mͮgj}:];[U 8a ðY yNysGz,w#%;r( d aM]I3f,5Q!CJ91&w`mwwX6JQ2i~PC 㝇 oGrаA|w]/.`OS z/ss~:Agwd:Pj9t?"'ڶ5_xD}ȋ5NqA5E;|9Jc~;RtVuF=Ks{j|^G׍B”M#fP9UY)em]éλ_veU5`M{/hVB`v±=y&k0v?6X};_c O^mX-v zdhτGh a> faݬ%-sNݽ:$y!c$1p!X,TIMB؆g%-OK_VnGyD)u)DD2|enO9\?x-6 zVS(q*V|'EDpqpCegǣ|g2wؽA:*EUcW3%:=S_f5~R668O,ΟE,Yǟ3QZ6T]JotG!z~{_IM\,F. Tioy9c#qxȒ ,L~e fa8\Z @ Lm$1[藌( 7KgӥwoEEIzH֧ſ.VOn 3J"%n"OK@s?;`WDThEhxvv >1E9f}N%Qēi7~_# E 7n)-:"yi lհj.켺'bNTJm5D-h,UɈt4ÿѓgܣj!-Mq<(_:kfk0OanT,p*)rӼϑR!F{pη#nj2]G[_'%6n7 urmLW3p 9 [BhrHCKYјc˳ UL-hY0bj'`y]NnM;ٱc;<;"2MhqμE]KL5H3|ԍC`s[qrm ¤bǛeR\af83SBI87fa]e@o)N6^JDyjPOl9y5ٝ]& `v9JuwS妕v;_Gݨ[,1͙?eiI3U93Ċh1Mx'Y\YǃT.ՃT:Y(,e=Q xSMU_^"zUJi&ZYnB;f1@K粴+4^[{VV|`dzX行$٠qFߝi~?r)($z0. gEydɤPŴuv jy>arB?ƨ@EN(GX;tcS[2z$"^ȣ8E+rcg6mXqT-^PKs L]=UL3+)M#Swd½`٢@)mOoU_15%tL'[09{B1ڑO3HT;vQZWlںĎxjĵwڡp^9ڨ6*[\|pCHhPې`6=@Ԫ8-_Iϡ t%Nq@՟ȅc==hiR.; 2_u!&4tC֓wBST~Wxca_>4EUĜu3fE#yutv;?dwh%tbGY0i xFbiRGPFt]ͱe8e}f:9%K~x4: F‰j9_N't~j3 [t=E4!'Hn[TIqoTxVvIF'<l?c1:xi4ҕ!ƛQ}y.A&J ,Q['{է}8LS7|;yz}@`PтɞCl#[LBYZPG&I7F 6\&>|2Y\8 l^11+k+rF۔tJڠeQ2zBjE/:6E6gl}QhBHF~1?¾{Ȕqɨ٭ªTA.sv$10BV_*gک}ƣOvѾ_\{Ep(6rϹ: 5x}a(.{N]5ܬGNWpG@wX(,lyʄL Q7Vc广j^uGF{`єP̶ +$;ox4&xl R5/guwtd)@/_ꐂ{8";wuVOzuڳ×&u& [ر"r ra!M=;l< @!S^9Q(Xכ(O뵏[+dPW.qd' [}+;{ Q)vt\*Qw)`r\lBZ~EJ%~dNa' ,aMOUX^Xd쇸1r2c*A>|$(tV0Z"\g,|ͽ;mel5HW@γK)sA0!-omֽm{w 죮|}.Mê^ ~Aiu+\>mz!csN\^"ը744A4Y$H0 1JD NwJ?LbqtT'L]I,mz8\(UضD0[K7w,y SRx:֖`HD -C!L'gQGAIKu8jS26R#jD|E~|ߓ:WWNW*uB\*XMgcLi"jQ5toRyۿ]atێѪZ$W'Q4 `漸uO~O%k/t=z RBHida#ϭL0.a~0l]e[Oi\`uֱ lђnpŕש$d#;ų>ۃPd&?]EZs ᢟsY~ؒ]AlUP&w~]ӋyQ7|"[;\HipMׯs:x5N6ctUmɆ'&:z)BgvoFD0{8R{Tٲ|# F ]iG;-7nK4>Tu2pP:Ž~W,& qCp 9o>n dG Ν+Ϸy>n`ȉVmċ{ưsDŇ[m,Pn[r->t~1!p\>]{D9wn!"eCt9m$F+)v;jn6hoDOk጗CXi{RF:ZzP>-y/mue~MEXF[X]T39]6.EAe <m"y旨TzfGp{wtX2X]m@(㽾Ɠ/š ۘ冻=ѐ.빋.LJ?SW*mg#ؖ*8y@Z`t(|Bl E-Vdw贮W,Gd.G+= ;&m6P7+Sɜo+s>Plj6!uvޓ%'UɊnMklD-V5L.=!DBL/zX%E "d~ " (ȟ $U]V>#zdcr ϰryƅStm@p=sx_xbHH?nyyD@ ;As'HsƁRFaѽPoo1:5WGK5AɕYȿr&kx$G0ϡ췧!vǛ]_AxTlң店g۴`[$$OE=Z1h7pq:-r7BT Aru8>l~snCo߼FA5g0^zH%6X@ xLS%)U_+2N?PMN Th9U)b<;](/9ݶR*Vi G]N|kpDZaR:g\fVp6T*ւ. ˡv%|SuoBT(^ F=q/ط/y ;u*|b[3#˄Xg} X:=ȚGU]om}ٖuMĿ˟iv^vST-Y|hhA Y$z8\PLd2_ z r#|JB~Id(ϗz[E[65tHU$5 َ~.~6M:p*X<.X/kߢ)W2:$llx#+|g#2F}nAd?{|Nv9̡VQ!^'–¤(zmjako=$$E^ou'+o6ePFni -7$2ų(o5'%R3ZA`dal;:qϷO\0wdc)a@ǠM9w!\.O˶ڛe(6d >_t!oBtrxzP MmeJkG7BfP3FX ub(Ys#he'iӤR;-lt9n_z"y)‡åB_u e _%{+nkmZpq_= ޭkx9ѢՉ s4Lv >}&!`S gr֥&q:I̧]0K)/a5SJDgq>o>[u PD>D Nj52" I2Rvz^*)-٘Yj9zݪ*WN)ɦanZG Zןf@G!T;ȄnK9h7PN! Fj:g^凶+~|xr8x?BA#-ĩuS2(tM<ù㯾 c+Bx#$HwFȌ?"H |Ow8й'F9xr(ꋤh;0wk&7ǍDpK6G~G0JU ?Q*kAs|I 2J=s]IS~j8@÷p 9ڶ/"z V _C=DLONɦ6A P}0~>.ݦEHBJ"}CIڣi`fy!L,Ę=x>[jy?eI~GJO^ғ8BΔz<7H'Ey(!x@ٲ;oޯ݅bg;nI(o| ltKQ@~٫ w9,E'YG:&$%`靷! Y&k3Ž: 5bZ8Ȫ;iՉ QBs-=r{+4D\- asY $-AC3E60aB]b8Z6 Vo=m u9@ {/ Z ZH^.n'8_w<{m78JE>Q_84"o]aS k ;)Aϝs#Cgwih(LY`>Wu,۪ts(e`=c\%y~;aݪ71F<,/RP>v\ ,FJxr"nшopnI;ܮ`/Dn;:յ*Pg= u^8X{>dws[z`7,5#QŅP/h_-#g)>.lȼj"F.'DZ[ȺfXy}1ea5ReM]nH^_RBۣ(|}ԉͼ9Z𒯌n6∤\Cȯ$ք]\R-;[|/8 V9L>i7U;5_ {-fgXh> CsFʉeUYN2_˯bɰgF秄ȓ +"CgwD/O|"ð/>5;g:X Z gwĹoB&Ϊ U-ϯJd5j9鉜m22Q|>k*h𘱬60xbWi5qqߔ Sgs/Rکn6 )fwB[f^m'$ZgHNS}b{g⫢<L1Q]xGeb.~.ȀIڕrHwwLebHxb'j*nտ'ޕR0SڬR97cFIc) t_I?h4nXv%?~|(nP@Mw+E߁ЈɎszsH\1B2+`q ,wIHWbV4A] A| A9'E@ԑf U74k;e{w^z7]is*D^ۯ󒇦w^(i jn\yx\vX`zOO=pT|@vxԆ8Q韑ox9Cbnq=ϽYjYA]VnQ;[\\ 9͢YjZ}= #^3o4:xFTBEy cr^K7kEzxt 5] 3*m Tә9moRrJXgOo;h,f;6;N#ƦU⚸<>G8 #|x2ɚԓt1MF;W&I)Tn }ug -p"d)^ԜCb1N@C{GuslO-2ES8wk0L._~^ {HiS>S .wܞ \25CiNKLGв5ƱZ[[Sf~w;osʩ!=wNц>Q\(+B@ũ?a\L (`%0)7RUf'`A!Kjޢҳ@Aƍ7 d>ԭ4.'!%Phmj89c j$o7vdbUs', ;7Fj"X Ͷ=˰%`6^Wjhvg6/:O(!uw }&E|]'АEZ uöP1]G>8ũϐS0mQX V0gcfoxC٦^Exw Mi߆K=Jw8c<-^e?(ЗB<X@'KJE\!uٍd>*o[d> nlBk$=ݹrf̋rهׇĽk<9uc~ 4{VܯJfrj)Tó e z\*=+|ӕДMF"l)S2W2%[!b?*8G}2IP/յV9ǒ7%b,Fgh/04l$!ESTf~Y]6_X}5dG8|쒘o78/ r)kq*ɜHj?)240anNΛֳLdNÃ-qЛ4qs\z=QsRH_z6ƅ1C GvYCZ ~#(&I)8{~);UMo-^Rf<7Qc陹QrǿY/oܟ:\3ִ{q<ʥŋ1G,˃57Qow6R/=\hVHZvx?~97 "5֛btʹ _ t˶*%tY'rZ۾960 b أxC:vIJO$ tؔ=XpQW7.sߝ%%0 KOSKrw&bRw +5BZ=!n}I=h\\WkUŨvljv3VI>0gCFE9.Y1 ito RvhV|l*;zf( E*JO3F..(y훙y)[ ʪj84'vUn+9y63m/RQ1{9+QX65>7DNȁ6J&Sh*. VfԽ0Te-2ժs. U{&- A>!מ%$B!]րMֺ>QLJ'K4BD2!NU\g 5G{pi$cI껓DG|@) |SB2 2;MyǧaZ~>PGY7$bծZ%w3-@;grwt&يe_T5ؼ>ś:HtKvXXJVu¹ B歼" @pm1: ~žK嗹>4E|./ntQ'm~[>Ǟ]uo&6`;%A'[v!d>c9rϩln5}] U˟4/IZ@^m)iAqX )|z?sn ҘQңCߤ9mskUBN/[sWYs̖NЋ mʶ` -uد}"[q<Nuz/5bŘ3Ԁ]@Zz*ޱ[ ^ fdp݌c 5hߟ.S.'uK聱QNlɢb}Y>|͓Tb@JS0?sm~pT@]c̊7YvJOBrn14;R7$wX:vGEfH9>ӪuаW~vHĈߣ# x_z͜?L,jÈO)3]l9L?F1X͂ks͐ NT}]:N`3wIt~#b!D)wxHXX:jw70ga(*[}MGQ]UXd6%5V&SlgZ"F1Ћ}pH/>$a܇V<Qslbn?"sj<wћ8R@qAy{_qۼn/.L>"yi>;Jk ח}U͐M[nPBMFy}dJT)#h9h*|fTRzu{R ^Ϡ7{qvM>7hՖSUN( !E\7]Us"mlSHu4)6qa>%dwK4AɺF툁C۞u[!/ȷZ-M#06[me]Ш=`;>QVxɖM"lCǫV(GJ197^!CFG g:7Tzhv7N,:xYnEE,s,Ҫn6V7ypު+LjN- O7ESB)=>eh]OY\lJR)Lo +N=$eiQy˫7'kd,NԜr&rZV~rĔ_"] /=fhg-~)o5q kOkdF?Na$YQPf=ꅜ;us m]st%l@K?g]+׿ڳk[-ɞK1{:|4׻u (aeeW&ntTiopւ-8H;Q TE@LBIx~#Bo8&([J̐Աm]4▱ ђYm?7+?Q2oqkYMf/I5Xu`Stf#gi͏+˒wj諤(Oje1^Jɩ0 2y-? AJ<9Yցn94v{4|ZAPDNax?8 'ڎͮTeTr4B[?Ow8!]UtTϮ 9Xٴ k(x6ǻSq;nobiY& Y3{Ӌ,b Gޟ": C!) )e[C 9zyll$ Ud-AU{X]ΊT%(6djkb ax),(9HZQbG #Ed/Ӆ+8@vE?]˪_Pι9zcZ[$ؒĶH3ZaO1JsP|cI,KҢwaZkĂE}W,-ħD2=y}K{Wf@/#Nr];l㬞-IY=@9ݎ@Mm\٫kS"OW/WG:xw(j0=KJ̧ކUĎ=us%L7j G~&qHCt6\-5 W?oFkw afr)*҅?}'נپ^f SaWvOH)$ņcxl߼Ȥ[(WYG,\,ǧ1'=OA˨ [`MR[fmOg.)UDДRMi= > bx~8Χw|55'7hf2v 7ֈiLptwe\7 1>Hu02]RU%!^ $x7C,`H$ Px[\K#GbYv:[Iesmb){&,M,2`io{G!fޥHqCiPv=; ^ʊ_Cڿꥱ)`EjϒS$9{9v j"";DR域xzl>?u'oH5jn@Hl'-r~͘KoZ>Θ{fuh \s-L,:~vrN:CLlˣlЭ (FH-5n K+`=yIyb$ֆ̼v.K|'zDTL:둌Ƨ8a6 5ܨLk(WG}T>e3Is8W37M* q/rvcnLY2I-ƫ_&?nY>GK ;1$~#}-hrvmY‚Jz1!t5zKJKt91R%\7܀`TkI%̗kt&ɹkk $6EX/#rj!KoB]|V֮- hEzX۲[8lgaϭX߇@oefHpZlzn&UN6ΓG e-,ȁ4'P8nj_v[Fc'4oBdw)[tzEXoPWNN=/o?b{)b%jV(n(PT5e__Ƨb?M| Px}Que be048٧*hs;~S9{e;L8 B=1x7Ǘ˒S.xtpK\78S]uX>7uE: 1^pj&8?P,sXo~j tzYiMxZĠCm8d ۤnv,+tv0Iᔰ5a:瞗#M;իD~w\Y:ۥޯxRJ }x\뵝5+xhg;_e| IˉeCPr=!F8PO8^_w":un|Xmv'dNP}L&H#`R\zeoB^XX2̆8 y6Au b,=~o^Bu5+"!p'~7ꃔ\г͗H7j<=y ּ#u0JL~Q;.^n?+Y'W mH~ C,>4KRP$:H;J*g-BOYkOcJ@cDWY$B\om1.0t.<).V bX&Ziů*Jq8-wqH(,Ap*D:Sd c6-:4kC7>k~S6ǐFAꈯ 5 ޷8H":h,r=t ^< 5V5dٲݥ䜒Ԗ#˧t£-bmNfO G_OLG Dx~ n4:2l:_W/@Ax EDW7I|GNiD1䡕-hG{'aeҜxaNI93p:ijё86)zsT Fj{k8Ģ~u\m/3D"UGli5ܺ c]¾"F 6NCO?_zN1Mk7EX7 nk_7/nn33T*h~ ^Ц"A w^b߇Y~U#iKxTga;hPH/E7ڍ6E:pƋAa&%с|:'Ot#Qӊf}0 {`SmyvQjz\ s'۶Ӗ'*чat2?;[[>9c~ [J4mV\V-f>G4>uښzf {|ds"{K7\f%CY44 7IP.]cˌ5\qnhSS7g a?ѥqg$kS!'FR N!7?ՏG.=h(hddRx~ @(Qap"_/E·g O{}3"2W3$s}Uޝ6햿˱7yEA P;*i眫!=3 :#}T JM]4:)E仮%Z?bA0VNγ7Nj|Y%ukO^g{A'_l|]ToDfR[f9j8븣ogQ l%++//}ټ*l}S{OƎj3+Q$7Tʜ_ϡlK&i@H;HNSD9F4D'^XAVS0|hve2bLڑkx`5.5qkEKTȕ0Aq^e%B~8{ĖwiṳYt EKHIl}-d$G\Ie&*gQ *5̨F~V*lMC|=dk ̃\ٷv/CcY>]da-ra|عJSxy>ݵ:'[6!L7`Rb .ZvJ w zYHɎ(ŞŪؒ͛qbÐh~vN"QG}wMN;/w$LsKzN_Q]eo UNw3,յd>h3s[гYڄHH)폾Y7I^s'as I@{ȐYIǙN{Ci*Cث y"$7,z/-Ϩe}0fJIYIWԓb?s :wfKS2]brte&g ]Bء]DQ;6.M*Ǒg ?(6A#m-;6dܠ>DQW rf83r׮qDk&4-|&{`()6աSHy qw@^Ф4El{cZ,$} }0joOQKEQϕ_czQzWiE5Mώf/1]ͧ"q +tjC).S^͇,@kvW֜\eJ?&c r \[ q>~ɷdvIvI4(4L>ZN3E|$A6J1g90!I{A4AΪlxnԠ}Y^fmup4Nș\[vA8s~8bĚH@R[W,WH-|{P N8͇mؖ|cOb\o{$7Ga55"lH8b%Dg›BEL|JLel~T_@_>Za $eX%JM #k@%\3GEk@^4&&ݚ};BљY3n$N Tb-J]K,-n.)"3қ'Į.P;Lh让~v cDOz2i5<4IO0wxT uS,=Wc\t3OM{L<欜74 녀ճ6ϑ&M&,EF;.su쿪spPPaVt&V0J4Jf> &)p)œ'}$iX& eElf;eЎYu',R2&~,/ݴQu?T\a,O+n 9)+Tf VEWy2vWkrfVAqq=I-p˗t.t=h|\IuD˝\a%rbC,go #z=|^B\cvpo:s[{BRC [7 a6$hx|@Ek%?lm*ܥD~PoVFL1MX{Òer]n+f#ѦFS<|nEpFn]fpva4rc70/LDz+r;TgȬPz7`]OGCzn i\M BCX6q)**Xo|#tӷGp-O#Ҿ>߽l~dZS= ZZQzRJ03 @s!rBP46^ܹ@3VZL}i7-2b>,t߳V8ޙv[{9೵u4 ء@g=!EUՅqnP h]"hP`ф?Epm˻'ua_o s܄ey+Ã/\ v.m2L^;rlʼ|G$H'_V99^ގ q&.c N]|H\I+Yi,vfgGf>蒿Sff86 {U io HH7׿ER0 m.G-}=l*^KuYi;;az9egV=L&pຫɛT+ӽ jyז q ,4 >~޻g>ZfW'KeFDmQ-jDvL}w>jl5Zf䭸xΩ5 toW4ݩ;MvA0{ca{0a2L^θ;$B\(JM&R] xk h4EBԍ SAmk)wd~=1,VϬsv7mo+ めz_F;]  7-\n K)G찐\9 6Y˅op|k"9M͞3 ?8gsjl­5Dqw DD: aSy~[ab pL )0de [*sl˜}N@Ce $H/1x}Qg?'@ձ;貅/ 0Ujn%J>MQX<9^zͱDg'EvrsK(eX-,gNܠljA&F;hS%y'Cy/F}U -EOܓ;fC]54P0^29jV#;9 *:_#3"KfXd>n;EUSVN sAyB(B uU"' w5ؽxW/]g|o|&lWf/BM;n/[pMՈ;?PmsE l'3'ʍ4-V.W܍K e ݒ14c*y 8X+N4^g4EmZ7=KiR9] #?P3Uڝ R#I}b$f'uMmX>_*Fl3??Oxť8hPh%At%uWD-M3.\m :ƷU?=?ł Lf@+:ꤵ'hL%U3,8;ۆ{? ԙtpsئk2WioW C{Ʊ]u&l]>gJlVlǶS ͶLQfG1r ؞:BҮQeB7s@7lX!U\%vmTyUyyw~A%śSڨ-,RD[FQjj_Ot?Q&VwXzNA!v}$h/TCsm)JR$ Mu9c  ߺ9jv[X˪6Dqf>`—~wX{QQ弶$R>UʹnDHcH4V&ytyfui{ȩΘ!j$ۚ>B>Ql\7ro*VR%>:FʕI~QW~PM&:Qt)Խa5}sO(2`W҅^t«sQ/4b}-ڙZ~=Q>A}4)2{&>b)tӢ*:"NMϞ S-F=V}z9<"&N}=1x}C>C55{!ZDks2,A[Cw; k(pؽqS\_)v>WWKNo*@yxVT䢯L,? x<3a`m0YN5`mm1!m0j"- ,Z7z]DD Y%-(0(_h|֋jt;5CzȫB$VrKR.Ljd~zp/,{5}GIgNl!|F ՄJ5HR @xF$ MZ[!&4ԉ5\ 2󶫓[_-k~-?ɚ \]<^}n&qԜ~y~G-4Z_i$iV՜P{VSuHxjHAvlR4#ZOBmQNᷥt O쮺s }K0KezKQ+9ź WiJ9gy[Z3$n7/ԚD嘺ϝce&J.X tתkw#LUf.JX`c/g>~Ё#rw #h+w-OM2[=S'juUP.\;OtuU9O|S@Ņxxs+Yl~DYȤ%~hѩen"ܮ#;Ul!OwN~3A^陰.`3:/"_[W of X}@1ri5+F2{Mmy6k &)O1њ]炆M+N1MsTf̩*'N`ǵ%Ryl(MAfܧC8fUF7 rnGwu/ݴn< $bwGtgt]Ndf}48E(^㳢ѮʝY![D DgQ8:BX%|"N ק0؅QS-e]& 麐¾;_,9X~ k JɬƢ&Asm/rt.BMZQZd'fYgav "DƲ)v>0VkeΗRBt>lXNFweJ[uÕ#pe,0vNfMaw}y>MPt([5/z2 /3tKB;k!=8'-)8vajݕZ_Xc#&W{qj BЅ3mzBZ)=S(FEkuy~]uI%3`uw7O}ctYYP']f{wZ_%zfc]Z%%V[8v83aEal?8j@ǰu3RJfGI^xݪKBfGeZ=GS}d=a|:=5~X^9zrܻS6#>ӓ_BmpS aQ59QeZ2|4\;(w,aKI`kа4G7JUϜf$mQW9o7"h% [%ʛ?mnӘ4vd|'t}m? ͫ^lLCHR9hFB}| 9. &*g̛}`^d=ߍӇ|qܪQ_Yy1v6GYK_V Q=PV".('eV[+bdn[ۂuM9vgT2sӝeA퓔fzUZ\*/3T-[[{<F%oB@a ecF[/A3f[d&갨%Â'Ͱ@nrflYˑ0#Enkyg cȡt+x}˼ۮ\ӏMX㰟 oi%6I$&Iejyx Aig1{HH'r@%.ZNJGQ:ԮBdSPu48d:s1qc>73/"z/h'ݺ2sX$/kwÃtnW#.ҷҕ"ΰT8_Vߗ׾ypԢT.^-%OD{Jܰ՞)ŊD0f:@o.o,QDzkje:t54~k/Y=Y͔@uec2jVQ~YCӖBYY~!KDo:j%H8ٮ]u庛T4YژKmJ^/ӌUMlzgvnTLɱyCco_f٭\'/>?EОe֛BSWмs> D2qyo0!:p g]Seq?8w/AvOgde0w Y3 _y sABABqG eQu~UDA9a3Yc_}W3X9wJo怫V^7v,D% {b?>"u1)dem_MB 2Va )_(>j#NLTDK^:-nQ߅#{i: yɭkFⰮi-1˿*goxӭWdTFxƉ='.:d"|(7݉IM3=+i/`{v[r!oÐ Yc93#uubd-~ ^|Ͳ_ Hd:EW5zlQ8ic N@@D_JS2S^w'v6 J@EP=b}vɪ*gMhzmO?{ۂ}OcBEO=r{h䥽+q-uv 'RTQ|$66oڿǕ4Q%0E l5qk"sY,4? {?4t2 pFDw;UZ g_uV@a)M}x 9$]*)Lf% x8?0 D #%\@Ėhs}#N%5xCoxTBD T)k ~̓8}8Ͷ|#sZ}G&5UG-y=L]E ,_w^N_]d;?`f$ܒݥ0_+[/CdFى02:NJ)q3^@s 0,TC:A:_^ [,M3sɹ״`.;r8.!*8\n5pAsfqHO蟏;8F-Wm!rl=Y3M-zMOY=ڑ:O![e/ ͝iںH+Q )Wpy QˆX7Q <[mA O;,CN4wֹz7I΢5r4r[XkOIu x?/*UK11EHC34S7.HwѢvFE3%-b|%@n'~NT t,qy 81<oߚG-x +Fs"`Ј#^-,~ ju,RΫ=]޼Xt{d/$аTۃ!I5MP1R6(Qi`g%l;,,ۨ42[_1WUrJLF %l|/̯ϔO >`{W3Q6ۋ?xr,wPu[8T􅭩|nvK ORg;pWwFkv{S1o'ê`2[(b@Nl/<+mML«joL{:q-n/{\2FmmO0h&db]ŅrL H1mbڪGhz*6R=;;+. lBC,t`n@-En,L|n/YdJS:lfo By Q(2%{,jf6n ^ٹS#y6({0jTc];1 - Zyů.h3\g[Ae@t!#{oZ/ )݀*[DahDG֦艤{%G1WTggABKQ' #޶$jqnv ??9&?ޣ6hNv:ZN.fW-T ;Ε*wB3-^l4"cme}X|Nvy;Xg4ȕ A '`qn{UwT[5ZR;>o/MC6,&**ͯ KUMk&E [ sK;.zJByE&\e SvaTysk>Er“f̵qv*Orv>&K[f]\)UjA@p˩IBfP ctJ`\bw˼E[#߭R ?II\ʉ )6i} _X\pRk*zHe5EGg^33U%}̙y;eBIBXy3݉"Tby%t^Lv VlH{<վ. @Bt-X=&yLC!tv{QvEțD|ZJs ;ʻ(\oqy&KK_ؿI~9;-Zý+c1vέ9Յ㠖9S[{~gwsv7g>LOFaBazUzL }Շn|KJ8bS+)gNu=Wi'IDG}j-Fꋯ_1* \e $ݭB`ns0:Ch+s@vX='{p8!Hjn IhtV~?If{ȏh5͑}&2zv\%k *PJG=|HUG^Y/jdF\/׵g"^/)d{8MyPh}!Iܹ )عq7e2!yiܢutwLHsByj 45~`4+Kڽ2Eqwe;O̻|o39CHҤE]@wd ݭ[6)>ґd~ -sj`kH=kWwIbn/ض@<v+ef/B2 rfO8/_$ȰȮu̞S[pQgOgC.ݮ%a ESkye*U7δ1=-x/Atky3v'% 8w1Blkx 0$o 1F`eJCnwk,[V[h:>0"C$G%/G8Gx"3nsR}X)D]neO6rZ3NZ6n%}H#W} dIq B&2#2J`ng/K󢠽 ;Qm T:ٽ΃Yg?<;] ̧z\D ֞^bŷ#~*XΛCR1iqwycw#ƃGe:b%i=k2< kt)0e̥[V0 Y\PGw|@AEgGk J$emE|!BX8hկtԱhLky\n/5c&R>sfm|OǒYt},n.7RZOkO5ŔwWC-:TѕȚBN78:6hPf۵+WW]_v=AjZ{ŽfЊ84*3Wtsq&Vm(3kov~.6C>9Af2e6n>&H<=:r)g|`&Q:zt#ɝ>)M~Tw`XPqQxV6"8uŠ9ZWgHljy[,& nxŵˌ$-dt5q, ߉#|:|! >f1Gd7WuP?Psv%,HvEisY*_|[ۜɟ<*;Yb~NlzVyYe/ԏ]̯V9W9ڝzӑ$Y"F7inKSWT IOnH(r_@{bI [c;;ta&ʠf"`|iAj]]GH!Ӭ%ϗ{wM2X$Pq%,;qaY,gNJrǰ*ɱZ Ox2=v|}(_D$TeI䖡z:(`cT1i:φCLC*5a'Qw7[cyp3qz91^*v!:mQ4\К]_cqk˞2ɥn€NlG /BL($}s:\i?Tse!$z'ٚ|׸␸ T>oetI\̪ȸřDZ|Fo}=D=VÒAo.@7 CڙŻWHW\zȅŵ`ze/Q鬸, F&_y'6p"hGue\cQ'm`w)?2!/~ QҼ?r" v1rPN4fH8e\Moz`#, "j_LJ߿I-t*kv vB'x9d]'?Ҏ(W|[6UXV*n;4mju 긌hvdXhUj$y >pySM#:;0#B7A7_j$ѱ$ HGu0_|feo@̎[(x\zm d?Gg-_u@*|^>0TwSMs:sG) ?7)LCû_.ؘ<-.}xb(X̥:m)=2y\=ۏֆ̜9&dw~xAhw[K?]SO)+=@~&4 rfSBP:e־_&S_)@^ pH\y\;6p<~I=<433̱OnQvd9cM|& Å׃J@{4~kJlF(ɭUpQz~%AcSQ[Q)4yص_P+ ʞi(-osDRc^SB1e`vObV.\YV," avu&탕t5O3Jc{TwN-DEw X |h|ΗJι)oEO GphWE m00u0sEc6Eu*9?ʩAfTVbm8E ,ؙ?z<H3`X讃ewh8$~@}F[>2Od>G$X _L}:ʬz6O- RUZ u|7h>R<ƣJdu !kX7ۑbr2ĸD&k2$ȥ}ٔknՑԜ^}'Mɞݒ ę+[l;$gߵYsv̎AJ !+Ja(?_9l &p-Zmi h(5}(&UMC~>Qr_:2kӣNlcҶef"旙fkuU'Vn;୺0`oȮwW,hZllQZLϗqĬw);ZEzil.C҄ѽfݭ7匲 82w]@fSnǢsגw:] N/{ǻ/AzH{Uc~ԻS%TBzcLC2)lu{ƭnѼZ/0ҳq"O GW|kjW̙bK36}M^m,:,jZw)5ߪK.WhfWgHY0ct8B&Lo 0{A"OPZ 8FĈK0kYY%4OdF@`a|aq*~.m+jJ9T|@Xm8bfgҘ+Oot?TNPQ._ԫk- ~F{Nm~cN88CYTt&'/ b7'FUmڟ#PN HʟwePJPx >K^h/x]Ֆ27۵{_r%yC-:/Kg)vdUdQ6<)[ Wsa-Q՛$*nB{زd%%tpXvD☛we)_uQ7Fbx8[\Ƚ]0Cbt@y:?B21˩E8u)&ٳ*SEq5@%/ȓag%VIz–C/OңE*6?\9P ?7zBbru SUfJc j =9ı虿h 1CƋݮ~~wZ\ 8ܦH˛խ(w 3)/?֌]sDq;sZ:A<$F;^7+ #j۞ls*EE~J<$Kgd$傻%L oN~ f?)yM8ȊϮdBkK~N ^A}EBo!t.bH_=~RWcn\djb uߴ qy"q;Mov I#6fc˪h q:EvP]]ZiMʃ]˲j/ӝϿgsQ~x"癩ZƋ4ЊT+6JzBw]L$*] }q{S#єNZM3b=!mMR~I{ve+=LD5<.>m¤qN}8m IoKm5u_ݿH^lX]fQFsQQ-=PC|'s{_[pfu$.'3%0'sNh=P2zoT зOn/5iDŭ51sq.URײe'ߟw `}#@vhS/;m~D8a̮3 L8q^+(ך@tN UYB- xB> ~պZBǣ)M6?&W^AopA׳nyH-S<]\oi5=q54 `3$+v8j$?yd-ى[î&s48DwA1!fk`vvWgZ[x)E(OnfNAEyOw%( 2Z0oW1}_jQ3%h!(M `%AGuTS"~ 3K$OO`Z; Y]P9_rҶzr[+.)Թd c Y~ጄ:e P1g\}f~L[GzfƥJ:/Y芝I@jۄf&" x/u@&Gk g iZ׊isP=aqS2#:Ns~^AZ/o(`v:9Qny6#|̍$.~H; N )4ZLXScaZ8a~俺wnGn-}iFh{:*>]7y=vS닫U 2tx:?ћ±ԚǸk݀Oܛ8[]1bYr#j.X믲Q CT =r8.m78-wYG|D=dB: -\8Db֋!V`?j lmPAGY "ꓖ}!I[WiT2r)#DyQ*ogbѪaYb@TҳZf-UL:"vg\ZrshMKsWqЕc0[?@<7 ۆfڰLOhk\mH+Sc',TXF8{e>1wC`Ә6hr)hqr//]_'v:dDWeZaT3@杼)Jq'ʤ~vݐfȨDxҧ7Rw&w|R;l,D'<0{/zx*oѪv*!6 œm}7 'c&TIu7ӟ~#@> Yn&̸U2f5Hj'hܴW! 0*aTW]yo(; ; 4fnfg+`0T?S7ƘbQ~<'ĜylH Z*YjAN8\$ف=Q+4IE[ػU 4 .uI(梒>fs,Zvޔ8e"+r5>aa)ڢopUj΃Cn,!nQ ymv>otҫYLWt:g JJj RaqsYu[ɘv2OE~>mT'SU#DI tmfhYAW>D>]H [j$nZ+szےo"G!l ֽdL$l]"n&h SY,l!RXʸOI+rL}軉`oufͰe.^~ h;Mv.0Y*4,F:[ ^Z.ds$W QAћaUo.`8 {n4XX,@U .BS%kevemއ_}&7q,34c$DWKAf.bfbeתP~Llti縇ßz9!ZijU|39^Yh3:'4;6X('G>Ɋ Op]@w183pDB_yJp_z nإxx"+Z:^h4JL*;0Xɠ{9/^AeU5G-P  22(sI/D^..P6}O|^{PTk 1bY;zqF_F|]]Cnܺ9p\fO's碟M>IH}wUMFڈ(q?m_ڤ({T  2}`ICfU%n=oDwTw9z3$F?dڅՐe,ME)5i.;9~W![\܌wJߌyq8Mיl hE!qp\3aXRW x ~pZ3][f.Uഴt~=?vc[̳#-㣚I%/k:I3#c+!|JC #|k:pf38W%[O[Ⱦ\-ӂuj@VDJ,YӺC} {K8uol/G 2 "LV$]c1G9 rM~މL=*G],G 81V_5g{u CyY( Iąe+cH{w-:WLQs[BD_G#!HH ڵh-Eѭc8=@Lx\o$6B9x;[ IHdvuGQ?DHZyQeFektFuMwXN2 YB~ @ HfpВy|h`kb1_߸|ȁ:ld̎2ΗrPDPqAylZsqE%X:f2֡S 9DL%̦zx&kBA;_rDKW9u+xRۡih޿ v QQ},FG{%OKVy dŴuU+2#CTi6¼iXj;3V¾ đ4helkh |tүbzb!L&J{#d.nr6 :E']̌Y_bs=:hĬ+wN߹shFE}/[Rb-doRʞaĈ|j7ܐpҒ[]aZv)}į0pFeLUzkuYPm9vpRoc4XT#} =(+V\ mٷݪ1=AIwod8GRFR 7R>!v WYs.~NGy|s|FoFY4*Yz p/1#** ٫2CȀA]5c^ 6\Y$^MPLa3۾{_O"̏wu8vXM)_6__Pi٬MN)JXE79$KncZ XBc}MV~ PMcs\ Ea^I4和(]7g$eIp؊SS%b/e-fŚ q0V6?T6 :KQIY4;wh)56 _ G%iWd#&L'X]Xjxj+Pgxd_RQn=uNꑀr3L">w홦%%$D%e2-)"Qo13w֒Egz =r4V2䧠}ǔڤI)8Sa+mdUP3;/e-&4یH E%Tja!m䶕zn;/JۭBz!īawEn~[nmYdg=`>ܻH B-{gKA><Ӫiފ4q+"\U[Z7@\ 8#H8bA$8MS*.rסsU?Cl!i$e,Eϣ!/;)8u$A)KYe&wsn8g><@l@ܐ[gnn/-Kid 밟Ǡ)Up' ڑnGA{Ň-Z<,e}uxr>Ϙ%pao{jἶF- /3Ғkv-[t2j"N1-55&7W+FT3sT{JMAtߧw3: ζjjvF"Q6ZPMҠ #O*.yp.[_%nwE ]jۋ|y"yߍ!{و.!X6% OҽsͲW}psXRju B~rίb}(7ӲӛQZL_Cuw4?9qׅ0Zj9O=eLOg64*(1('T(AAyofa~d0M*lVE<1B.L̈L(HޭCizF|Oܟo3$dQfZ +qHc=vc~j,O xKR|OgtI T`~ENU-9z/Y"s6}\fhWpOpdp# 'U6WֽIyrr͜:{~ZE|{,.yF\5mNԼ<{Y- hCXȴ&Kdw@w&s򅇕V󆥸fIΔ-w 4^\:i+3Xn*+XeLBF@jǭs~;#3ǭwė(&%ab|W h<Ӿ{ð;!%ꣽ#s[r[棿M i %(㰱~ j6-K )n'rf{r.}) `d29?EMw [zv8nT+dV֭xJ|TU8 8m/a&frW5~V@c/L-rgBEdWIJ ܭyB,Z_,nm.ޛ#wc5[i@lo-7NCM׬A, ^V!Y(1Yiʹ4r\EWCD!KtŝxL_)Y<9l!Y-&bK7؉cDC`aV0*|%cyq[Rap9Giv x N$vid:r1h8͈l@}=1QR #{E &wOvw7OZm={Ъ^.?RIwKIeO`e_Ueӈƭ+g쎔bޞT<@bF7sB@IwL$^kX٪f}1a@m};IvַciYDS.ҁl# 0z7w3~H@[ 9XUn)ÔJ'OwB?lz'7%N [ک4u7~|ҵ hbOtQg<<=-=8W[O@ƺ>DIfFK/i (~d⽀WцT2_Eb%0 \^I-}:~#ILUi>fV~jW"÷fw w:=ZOJ0 FT9Dʺ csp|?S3O\%V;"ذ[;ܱ O(/O-cpYnkSz1𸕵MZb*|X̿HOڈgZ-M\FyɎ;y$ق<!x.}|K>ܿ &{goHOaƗ8 pAϧ֛aғ#y^9ZuʱZ_x{/zX/Tϗ]ʑ%\^FedbNڷ<]y bnT t 9y24nm̷%Txݢ!R3aO^;|2є9WrY6Zlsa{p9]8pp$i6ϖˢ!$i7K :2tP1H`sF?!}6q;Bf(*{;"OzzY[kǫgCw"sc$~k;h/aIB3$s:AZuduB)m?n;YBbeq4P{%8wl?z40%|um fhbQnˆn,[ȳs3p?K 0Ȑrh(tQW/ѭ{BsE8b z鲃;W H9Y!b3][rw @|Q:^x')ۘB}.6i/`{~­sZS :3S4Jnf(Ja,2Hm 墬@9NI\XuB`p-~ϑh`O ].ܥ;,'3ݮzw״\ \"7LEm\TCL̢hPnBU(y# zFV`0~@Pyߎo@΅ —aHz,#0S}}YI >, }yFo-|ltWjƝ>o!_'] =Z;f 3 *N;m6G1^}Cu h\A5Go'# 1^ ?zz^ΖzB3*k56L?L jVed%Ȣvݵb%}sZg|rze!gaZ?pZ| ܴBu i7)( JJL,[%a)\]w|@YmE*_.׉#/7ox߮a5GUr)Ob"a=XJ0ZH>P/Ͽ% *'Ljݠ\o8J#Cb*<懲qZ>`HD r,=AG+w/3/\PZڜQgFA_ Ma Wb~+'Ock;inXv3YwtD:ho'y̭"rOjj9u>)y1ˣ/1Up_&MF8KgZM}oPD,o[>kb~49h2CKgy}gL(ߚٚEa # jlKr,u5o>vIJp>$ /l0Of[Uf:љC7՘A{KoaTW~aJK,]'޼= YͶ(7 XS=ҀQ9d@N*'F{iA-\N<>_uko{Pg}lfqv!I\PDq 2LWngnfVc}x%Gy.='!u]4FU;o,Mrr%ѯj;&~`yߏesx5΢YZO1έJ@ ܺ|(.fٵܶA & 2^ ODGsiS;|MN\2Øє$f&ڮV~$"skfUhkĠ5Fzpoi7 ֙eW= mlֱ_i#.:C6y늱~V^Db+dVټl#X47ֵ'1:On]Ub'nUK:v  8g؇Tkծ[2 JS$"< DvYO%S9?V{WLGeu90XiW?T.< oJƗL0p}{gXAG.n'V~-6_S#msYX+j68v1&\i';Evc"ͯOaFU kO:94/_[m=A\?; g'rNpXp(mK_5ϲhCv5%t8DARB'X5$:MBQB~H1|+U76㾰b86}#OP8'IC9"fWtoLާ3`n zL{4\؛a;BR/_^ 3P07O* f}@1}[3gd:*_i `/",s8EH7Dǵ+S>xD3ۓMJ1*FMfŴ^>#a.bnif_3_n䥵" n[՛8oCwtJitnkPJÏؔA'B}:b`]+~3+^rAea`%P]ir8ѓ{{ O p )QM{NZ6뛍S'@ /,8n+WutFo6=C4U8އyaGm?\TpPw>m>N_+̲+gbO?949ґ4'C&)ҵ&Z(h*H"<_QhpIڴQx"/nȪCfb6knu]/" B4c)'XfW>>'G3s݃7 uW5}iYrh$ qⳃ5Gz=?皾=6bNIa%dkAk"g͸*vy _NTVisfNqBk2ds|L}G!jT'tҐqZW0:xbžvm"vlӐbrۃ<Η5(vݹYɪ]&i?#"рIH|=Jb `p= |}rCK7W;r: ?7hNV+d(׽):9BmHᵼ2εoѼϐtPլÒ6ٷZm#0 LSsJM`Xn܏D 8m&>|g׸-Uh+`m5O`ę~nEQ?}3\^;f{ےс^g\S|[t_՟wKgpqc oټK4[IbqlW /m 1\tśCZ #Olyܔ:&2kXǵٴ(7-+~ۺߩ7}|?{zsg0sKbua*s(%YkG@4`I&EF]PF6Ķ WSR/aĈkQ8 quLG2ѭmS S óX1ݫ(<:_e[)'|ަvZ5:$ R$rT+/?RsXm23NW|)UUF4z_)UÕ矏?4i0ߤɗʺՒ,,0+6FF1\v ՟=#ڔAm TХ,V֯Q_|" #XoHBkK;Qf: y#/g-` J k(&(wUٛ<t >qHEx]yv5bi\^OjcqONFhBRw+#;r =c(\BĄ&X<$+p}G9b>ڬE٤VP.%EJm4>(殮' lۡGS܊w$i"=TM>I٪cyPD@sgcM̪nv3L0{j8H6nKgX*|FxQX Q5bPMG aŬb7fFkZDA)Oyc >T*?A5yGaPGQDodqqLgjЍfQ{%*E&y8 p&(8Y;E.e@l*mAe[KT4kl !.NC}rW6;]*,X__y_3n' lz0SL$9|vM ]%8VWnSE Ҧ7e[>_)e O3s):;2hFxw%A&[dkwlz.U_xxnVD_˜M.Ce#P7#(+ ˯¤cH:{n¦ag EUa>Bu>VdQɉyS'*SC<{= vǟ4fuz;~+vs~l.q;vb5\6^Tqvr*!X$bK7Ԧ]na%7haÇ|2> o{UӀ /hb7҇G߇nG|1poF h|\-,$zɷνrАwAIk̛O+&b\fVnCG ?]3HFL^I 1m6[c` e@pBC Y/ kO0NȼO꟠SZ˲|y DADǻ,uùWPYT>3\ /]xm TM C39 p&}0QvYBE^_):>Ril r% BHx)hFrQ/8sj[i=>;6Pg? m--(bj,V]׮~=sRhDpi޵>һDeQ 2a:BK)ƵE%mBW+ d7~oW)uHFThY1ǩ~>[4yx7QZ 9=jW@VZ6sk*|c.nŤ'+E3q֖+P:vp8󴎹o{H^><]FcAYT8UBmJ8~67l2f4PXܪz|Sںg]r[ܾ8`Z|gKaOfȓ2Gj6p<2@]hy QYq KuznU֜r~$T)bPܩ/}vkՁjo䊷ʊ׹ K wɥH /KI zHC?VW|)_!>=?tjMId}|hҦ:1qD¹2"D,l`jo/r5Gty'fW/a5j _4O;U7[AY5\{Iݫ2O2gP 5 xaO\Z@j]ŧtry~H?7llpFe9T1˂[L^ڌĬnM10w.yOoB9: U 8s`zP}uf}+dr=%>SWj֠$h~3-lٌ::!=JCœw5p.<ʮ j8[eK/V&/lg`Hș2F8܂7ic9PRut%J,^rS>G #4}k ]4)uFZN1/# dȊ=hBw<=Ѽ1P_pѵ17n#z qHVs2OLwk 'JPshHrɚtiI*y1_>}@3˥fDk`ҳ0~,xdq=$KŢ _OTߔ*1;g&lEQP ~GuXM`Ld^ghOQ7#֛Z[V?qKv}R3yǞlV{G_s؈ DO}С4kltE;7~#ҕ)\li!iX A'Df-m#qi>Ht_OA3Z6H LLZɅˮvv>}Av7=i#4~)9[wџ w4ڨWB-|hhX+Q ;mcCn >l%J.uu7Z JfUde鷫K#f ~W'vݱOt{+w9Q"9~lcn8 8$>ZtYvX20ar#{)2?cau?APzݝ}| 4_W0(x.N|-G9B3<#4W[ӊwCg> H;.苯Sh6?gRBq.A9t51]R9^Y0Mdފ=$%yov!|O#<5U܇luaR6-'k&HUes+'^џ% $w0k|Zͬ51?-{ӫ4_hnTo0RZ.,Cڌi}Aėmr*U/~S*g8"?ȸ`dЬ2XFsk!8fcGmW,OToCo'k̫k@,vO:?1Vk*1Siv}iؚ2 "AT&e`eD53Nr;NEttE昰;>C*?^-dn]/[tX_7# D~ԾOHs'z`>1uVwBlb-~$҅不dsQwMuW6@]N삞seϷ60ص͹}R=e$RA_nn+P#:[ ?-5dxK35y0W7&L锱h;;+ܤc&h1J }B& ǪN꭯ [Ә}b-V /";+ Dkg G@~Ǡ=3XsHgvq2hwۃ5tjOiYV:1򨦹( dHpO=-V]Wv] M)A_j8тy4z.g {;!myL5CtO/I.Xa.$< u{tErz # %0p1A93.<Zoav99SԮel)= "@;to%@ IH9-5hemm_QuWcofZZŰڡۜ 0Ao}o ?6S\0]QܺVZt7-h A:Y]1j%ϫ8<\ 3w"ULd5kx k 7CEL#8ap~_|y Rfh&@cY73o,nq!}6~|~TP3f:XĩjG+7;E iY}]]k7`D8ӑxa9} Q83 @j|/ݷQ"5.h=+FbeSv8^鑨$c+>׹"@Z~B=g*kWf7K-狰iOKcG]#qU)!s5g l&ʼnlZ](j|n:C4@5s2Չci8,QӞ1W_i l%m~ň:}Тޣy. (&ܮSH?+6E~-sI& quZ`iI!剸rQIU]L0&:.s3"=h:էI{], f`T\; @8u!HCߩr0Ꮃ5_奂!-{X\XVyWW KF |> uoQWǕYAr4z`Ѱ8,u'Q)2/wmd;WuPg1X4ˎm{kپd /)|oT7p0;f?܂PrJ6giœF_2"qRF}Y /|ؒSGq3xK$zGAGy8SL_A8lub!tb?~o $< 0u%zaup-{a3w̓vܘUo7Zc*So9 ȱy\T|½A&Ǎ{h8Ȍ [!4HN2.GpشWjc!1{I7{AT*jvBa&Us~0D5MN+w.VBnd3=)zZNR 18waCӋsp>̻):jWgG1怆ڵ q+ja Kdi9gҪ->&Fc|Cv!ý-b9؋+8#I;z۝W$~//]|@ܓRоh0-w4k-dK3'@-;#].VmU|*=;jR$M26UPM2R <S|c<ߔM7pɹ|&ZuD(ޤۅn3sx烑tZOU_3fi{SբPM)v.'N!Q^n}HoΗRyPX.C{AAM]]YɰsSjdFօl4:!8ooN6p`wJH0! ۱*~-ggw^FK),S_m)@^a=3BX3T5}"~Z4+oQX#z+t@oZVma᪅ܴ##nReJ=e "ٻMth]a>hb<+ a<ꦦ9:گ 4#^s[e6{2 ze׷k>KYV} */u?w@[`̚cwSl|l` 1>BX:w;WyL9o>XyDZbas> Zάl/?à6vA˖].(P%..Ya+T1OR0Tτ2&Dc\"S1ӗGzm4xL`C!GS8Γ!Λa_= d.KW"Gvn _xo=#1aaZ͚369 ݦ9|P@C(I,D ʌ>]6LyI _6k* E_ Ȟ@wH_wxAr8*6 vÿSKm^ _hQ| w}K2D $W IQ4=+,Z./qQN ұ Rzxj',aϐdE,u"> `|4:K:؇❭e[ ̆0[hԹieW+C+iiHnPѡZi^t~flEgWSj#Ruk|E!\x!ñ NbFOm߉eAbh&&ܛpC<Mt{@Uw S<;Uu\ L, WW\LC=g~>* }4ަ2XFȢû- [}|j#_m`J=BY'D(տE>J@]Rs۪4䕻H0Մ֏(Y/j sje,v=6j_;_=ZM˂$ptYXFL{w@ѣP~KX7g]\;."8""e&r9g;1I[t8V Y+YO[pv:lvb3D&V$tP'QN*&Cp~Eo?h֣bɴ^؏=P5J=G=|=Nc>. Hr(]ގq91E0´I2wWj?oV17i } |sl@r&O:BPT_ۯV\vX28cBo\FO2*z7z[n -/0ne O8dsDUZBkJ|4b;v"܉#K/QESW齞|~~z%iK{"G[0 \l (4*@9c.m׳HޅWB]IA337MQ|vB0?YzF Zp~^m"]T #ȏ qo,zRIt"6˒Gәou3YƲ7rQ- 4K9$VSPMڑ6*ʿ -ޠKŕ2XQ9"U#]tP "A]v$._ TukN2`w5iWwG2oiTQ[`98ⴆQ8;L=PcLU5]/cI\:vc>5nh.X?#Fv<ں~E?f@ Eu9'kZr mW*zrGVVqcl 1iՈ/Na/|z__:*fe$0k/L7#_;?Tܶ?-Z/]dm,[&Qe،YX6o)b9|f Y<9OC_4[Z#蹽n0Jx07;яY+r&l6,++}gdV5mc[鍚3avdFL$ɫTmmxvٟ]jpԭ54Jw` |Ibaƍ+;G\4= Waӣ9 8rn#O S?aYbE4[G90Lo!e u(I9>E!(BVS#6V 0`jG ]g3eȄJe|q;&*Olo8%ӞBzX3gu ֻM;]֢6HG}}RvۜDF~tXga3Wx[ kt,vC: {ı>BKfwm̊`VA/J$xqVQ 1bm㬾egejtd9q6`@"z(IA>.^MIbKVasǿ=X]<( JIh: {vWw9M@5=uX?n*C_AƳ2$#lNUٻm5+9|;O ɇT&(މo(hniɗeD;B|κ_ma'76:K֋˴]|7RԥXL+Ir6vqv9f~/qO8Qم溸:znf )gt!_oh=R<;_^W TJ9%9vTT3@ݑaB˃V`g v 7%cy A(zΒg8 +B40ԗ_OH{fGPqAxY2$龑sKia)C=aqN)ͽJ¢l8*}Def縔u=}ŕǐSݓӖŖJ E:a!PtAg+pM2<:2Br\)2@V^<;l+IKӫ{=o} V0 N.җ,=sNEfp~iUa|uL%@w > {x- Ald:⾇w DR>mC֋Rj0p U,l,C*aՕTrI|=67nH7\v?hP>? ܌vc(X_)wn=\Yn L]8s.]z/Y*_=+(vX"ŧm= ~\T_^ފ@5y+ r[xn~(1rS MU W@'Vvs>IY]ari ZP&s$J٦)hp)Ľ1H+:iI'!V%J]f:q6SF{Tdq#ޜu'4Lu)16C܀:|sٚ/];DnͰɦ&mwq$I~. z_, ]FLnc_)DkGG,3JkjZoٱ!]ɨ*I0g @p}EnAlp/gUFצ *^bQzuݏ?i ޯcuKU^h&!V+b^h }H[ ;kn> uvAMb*8*N[\۬[߷v&Xybc$=(ӣ^;PܫQ7PbXQ hTr%XR?X1Dqb+}*mIp$g mtŻgi{ Cfl4 H[\#n^sZ֝CR’ 1L8LLRxw\$`LIVhϕS[w\sqv~ Dž+=J2quK9u3_)<K_E6X!?=n-m׀1"e$с83gù<9gwćj~^PopҰ.>ǥ)Nq,9)xnr#7`_6"%-١[[tc 2Ǘ7El١1N^y~aҸy8 ጶ,CASEs^?s&w-gI) +^cyWJZ:a|Z[B7}e1A1iS^uLKɻtDw,,):By|u~A9g/_3Yl coq<`z?m.Pl0H9LIWg=S7;'6{=gi'4e徸LBv4O]6UBӀnI4=,v'3 ( i@' P.Vgj+uwa-HJjcZz oO؉Wef~8I"KnGb [@M])J Tl.1C:}3cZ %B &BW8+=o+dj|,}:p,ހoPDS Xy· 65C )u3h~_ Ⱦ$ !ٳbl]]eT-8'Rੵıͫ/0jj[B]btym8F"\k9Od`4[R8yM:eqߡ{>;2'1|V.$̗,;A">pGb}o)U emz_/Ǿ0gp#WIӝξ.lni[2c.SLҘ *{M=N1}jn@K}"DkG|q|!xà(Z2ۈfv3ͅ xv a՟:Pg&uMdn@6#/Xɂ4QkQ8QTU-L\OWm_}%Q@h=jhmlwhe_5\@᪵|r5j衂˛;ӕţҷx!>;,/Lŧ uuT*@bA5/~f4rhJݳw45jKAvPjftݦyPf?\} $VȚ.EJpL|ҟ›!:xKP uj54[w/վ06l5Yb$A7='@{hYC62~5tPI>/RX$el:Q`iY 'z"vעp S8"[zf;:O-!k޹KD#qKt?ȳ({,fV'eluʈ}<eyWpA &/ LdJ ogXPv"T$D,,mCo#ԔoK9n^N M@?Twcxs1:G^n׿6詩$2 iZ*B慍 3} )+5ZSɆ^$3nGDi-&[t'ɠ2JvMႺ0fl{%Sp2>6O׻ 4HQ*0Kg$[ZGUxJ*js7;¹K -}:0LX۬]^PowPK_`mrT~zޮ6 +x&(Q,ۨR\qo u|O4ӋЁ/.MPE$gםDLK=%l/c3/'[qx-~} Є=_e*ު a_{ż0J{|6B0q>&/"*gG܎JḄVP&2]@Wqoħ.qRI;;/*〃s/g:x}xAް񇆤܃ue;)Basd{Bp9w 137em!K fpP.1,?pe&Xw[Yns%v/|*Qf~uwui~k?.[>! %eH5d9O~y$+d|36-˩.)tR(\C98F rоFW`b3{6{Xа(,,PZ5cZ[=c Y*0VN^?c3n4fnDaޖM:X ؑiՔP9{u0=}$8sU9ASȎv fP+%?O`/_-J5R$љ-:j/{, &Flut1Ւs?@!O/3]gN/˅J 2僲с y&5 : jl>8+}/oXR-!]a73;`ͼ@VٍUAg1oM*hvk6j,K+(h'ѦCu[wV }ՒY.Ruvvd`K74;?L3EsיS}\OX7jT_N{CiN5z— >[_TZV iAV? )Ki̦wc*:); J.f5(9m |pFlUٺ&tL?lQu^'/ ψWʁo"[>X[QB* yPʝn~R2YdPnӬ0ΌQ{a*N2ti!(`_'g1]zG->\Y)8hVfGw䏻qr[Q1 ķ;vhr$ΫZax+PM쓣]6 i}@W<7ui_F.\ǗaUz@٨Ɯ?_Poq}]\/̽[1U8^Of9!^i8.DYqn3&}ch>@R][wpèn`{JMYdF!"l3YsǟD AiCP=7>{$ U% h r4ٖ9QqŖ=\5Dck*YղKsBSJDZ^ޜB-jƮO/d,)l+W2MVE?+/o9}vW >jrb$7s8N"f[n ]Sfҥ7!^KOPtЋ݈")?`aڬVj}bFӐJ!S@:LS1%Lnwy iZ`Mqe޻Pc'<6QPy ۭ6X |h7lDJY(K~m唎}?WcR<4Q ~ouRkծ21u]o^VhI^Lܡ\qvEgER|Mj2C'b抮* gT~(QO ,j h rG01@f6ͭХgi+'xbmȾ؉6Dʠ*L: -ֺH@iLgF ]IrV óPزou^j>KF? (pS[/.6OjqEoн52;lxjjBB@{/?1'҅sMwUaϸ>Ki}f{w_e5hC4xNNB\i}>E@x;ڽPlV^pudX+w_\a7oky> \skATQ I}W7z\w : XA/ ;ߖ ade->ϯӳhi;{@\D* 5ϥԼ=5e/ȁzl#+B Fu$xpr$ۭ3GL4I}Q6@'Gg <-f3  aVe 5 <{4Vުm[r~XyKZP{%l7VW3K;LO=}ȇ|@G5\GfͰ(RXE#g5㒨ԋB\u[gP~䦨mǬc ?wlv"; "5;<c!Cs|Lg .@y_$}瀑[\}ؒ}zk s&>&|8x(Ӊji#o,22e *J:Zoy63⠡4ѝ~|vT\|XYA!|R LNűUG@`]އ\ -)#PwP'( OV!pיiEHZa՝󃯅gͥ}@a7;aT?hOfQMXo `81oz8PA2e>]~sVɩXWr/A$9Sw7y ,O{;zJa\%Y\=_ pvZǚJί3`?`.G'4|* 3ԏHGƏU;yD%Fsu%BдIk>L{[Cbv뺅(As ٙ/K =cjyy}utA>=Dm\ _B5LqGlȮae,0Im*& eQ~0gfВTb“1}룾=J}_,*7,{?Vb57nR$wwgK $t,d7л^HYl_e=>\N#t5%@r4D2$#/f>Xũ 4Xlflծ+gz;dXEdIVإj ]Ǖ\*lyqАcqONptỈ3+Q~ V)͍,ssXCTzr[󈻽d,8o'#,~]@ykʼT_|}]צM! }RToEe,?N!sDKtM% w|q׺=.S^6bVҏXAweo2EIz_n`kC"eZMC ]sT1ʱd/r⬸>yr%u82YGV8h^{ ryJ-" 8ti<MUy؟/߯OUݢ$MDN~V-P[=<^j0 sP3Y2ZKo3V 5.G)L60Ƃ6$vlʝt3KOPOR" 3K^ӹPiѤ!zwW8۫-ܵ8>5+yaƳ^"!eh?C_ 7-Bl&ꕺD m_^b&t ؗyx3j'EpA{f鯄5g|!n 5[F^W 1C <}!Ffl{k/ȡ A_kf\g O|Jd` ^KS\w6 lm 0gLaG;mvį|_ұCA}O<QjxsL]>ѝ_(ᦾ^MHX>Tc^)4[zgrDTǔʶ9OK -3Cl*|[gqM;_x T'P8nQr6\ I2ؤfNcaJ~I<"<'=Y"廀ckum6E+8/Z6~OvYrm ym*`ʵ֧c#V%YE]j)-+&>X=G׀ ϶ʼ%K",D{%~Nc3cuyi&14Bu02%Bq9|h.ޘ/l[ fRΘ@'vϥ1P3[DFb"5x}'t.i!Ʋf3 _w;> 0o*,"WvlS]W8뇦//FNi:3.c'9t?R'zu^Lɫrg}py)XF_b _#4XN%Jt;]IB[aPST6/o$;w|aacն)-KLn,~ַ(yO A1|XHŽyUZ jTVn s>_Oc|O'U]ot0 kgG5oo_X4SWT"tݱNg>g;ў88q/Yn/ܓ }*p׷FVv30.(E+c$qtCǿA]}J|w *J=Q@9Ʀ'y^GԪKnԷjyTk/Ψ V϶ l:Xbtz@pac53  /.0(E$hݳw1Crʀ}:t }1ݩeë. #ҊT#52-Teq/;h(vm~Ιoo^PFF泺x+5+^Ij?V9djJO.B mͧo?od\L$T&=krZYN9- b?\Ȼ2]CgHuq(PZՕ mb3t%Mb}{p "2ʰ`GOyo1ﭷUx ]ilCvZ=+rM1e{5odq~aڧnIyz:^;(3dG+G3YAXZM5 "{uruZit.:.d:j!_ۍCpWU uI:p5RTi@n_k+tWȏ}g 0 *!:̪xn!Uj˽3~#L?3w@U萠ȥTN6\]l}PpCWl1K,c(lauh4-U~aP=E ҹqz+U IN[| %nKև߉8[ک>> ,[lPl؎$HJ'qnR?|DTl ފ(6X1gʹxy:~Q" uclO*r?y=ʱ%֛a@&:"[97D"ӕ|<ho;3vQ@Z,"ކS w@gɾY<榅[ kaWvڝ6#,WF}E~xRc,ܻŲ/0oSɏ[ PLxwޙ:>w}!ۻCIgD 7@L Zv5Jۼ>*ճJ-UWQ.6u=,l36Ɍϣ(aW펮X %=KCɌIcz)gg% ^N>/f:*(_>W~(:qO7O|ܿMk̞uAK<$԰Hk ɸ\.Xl`1n٢s K} GQ V2ڽ_`n:ՂVy'+ɜ\֙^K{ z ,KFKw'Zgj?-_?o H3`k{MW(1S$$ aj{I}JLWE;@-8 IR*|#sMл/1;0JZQ2\-siXF/Wk֔w4[?%~!^?=奴j7`-%`"7%-@F\#&J"QiώkXa ?Ru \ gMw3 hl/KR$~{a3&pDT{p_uT))wOum[3RO @~*DJGYNG]\z2I|ΎSz?SO(`Q7ytnq 4rv{OvJ,.,-2Bkh{ZSH7"h5D b1\ NB5t{U>4mY1ٞ5 }@܎*m"2Ho4TpeXhMG%QerGjNbӕ Voi-p3>-tCa~48KtI8K1[ݔJ%`)zfz~Y#d@Oӏ H/t%!u[{:Tw}$A??6α)[7R+ vPlj}K+o,;ˏ8e$w8;o#fx9"xɽ,Ke =_[U J]|[u>cq|և7Ƨٟ}E¡gX&8+%5D>9쿻#t,\JY7z15E:Y\']1wUHX(k z?ݼ*ˀȂN^^^`@($&a/ qWV0q~U7,}%w~tۿq=m߹h҆nԦ_YSqsU8u3l2a]Yg|Sfk^9̷Ek`@wԟg!JXnoD2Zo~ 1U\wŠ+nݸ:oߏ3/,@¹e4P Rb2f5Eg țj^sX؝X>SKHnwNh-Z__'⽸DQTF|[uiٜj|)k߽WϣǬ j=aYb;Iǰ>[^e ʾ/:O@G 2;Xѱ֎'sS|*ۨ˚Ӗ>{puqq&}6&E}*ˆ7@Un[)+|1q:tׅ#I^$MTԭ ,Cݕ>V ?d oOy_Xyuv'բ&?)ɬ)H9ˆ.[#=~{g9wXlO5sL|JC!$}!|mtX9Rhzfykwi8)E6xp14P5 ӴK-㗙軧H/8V"w5=Hb:9~^ A1NrV.NlUL@=n_<ԑ{(r-~+`-b' MRIPjiNTyR{4i>(XS$j {f1,brYb.oz/Z x7=zr@.tFRuÆPMBiPyIE9ӎQ()&]0۹G߽7 S/&؟sɇL$O4=oOݭPI"y6ḑr~<ଔׁzFZluZB16tT0A|4cD %٘5џz%ה>ܒ,YF5,Tmc0 p5[D]!t랜̧*}mp>و^m #NW_K_ s4;%.b"CXfP*$[\X;ade1~m}@]V?_oiv]n 7 ~@H&ʻ;?ΎuE[ [fǰY]nl g$]nO|_ŋUvמ@47PpAoV%%T!'/F!So"iS۷G[{]a/D 9jGasU0r|~[Hevt$4/dhg~^խxGNޒ.g~niM~3?:tRX3?QD}'%{w=HQ{5Ŋ`g/x(J *7%D?v=K[o(2.9u 7GPzgRY3_,?c ;i5fL/{x/+/sitU`yJQ;dYsSRu/%#SS;zy}o"aĵi|_q!zLasߝE+]gVU c+mr":gQN`u&Zlf^UH,`I @f]yB7~w"֑P`;V78aD:{ 2UwfNhV<=-0íߨZ_QR'uO(>s_/V(]챹G.&p %up9n4 NHoFI9j6Y#"xu~y۠P9 ǑN9SSf`FI&/ asa -hu-"W\?3uΖkĠgٲxf yX9)2t~i^ަdS^a~s|PlZT@ar!A"p O'IjZ,eČ.R'nCL Gy84 qE]7NytE1j4LİޜqKfCo\K,#umg71hogC=҆rXʇ0E.@k=~y;)WhH`eڦS۷t}F87Du:k͔32wL,ȼ=]FmI:.K59y|{k129sn-a$ЀjTy/R{ԪMzFؾJ)Fm.q9חJTJSr,'7 灼M!`yH0Lbun{5gowֶ@),v$禎ꈵ%[_MG%w#z-R.\} ng)}!pA&#[{ %հ !`? ڏ3IFuL;w&yJ8(~nG.hq!:ٕCgoi݂@ITIA@ݳY@qW؃!w3wt﫦w'H)0C Յ̋3$ 3|bjoM}58%(wٛV_-y& 2XӸ8 USraF_.}t.2r.8)ĮUsMf閪۬ءh .sI@7cwʼnZuBӭMMp检Ӱ])pٚx\ݮ6LE CVўsc iK2$}ҼnOscG"{oY/[VL|t1Hǯis ~N=uV( ˛EXŦ5jln-E/ #GǀQ Ezhk-FuF})z &qR ߅f)!Y5Ub BN%0ISXvku v;ݬzqP{~Id{;p6xˋt6i ag4vwsxA7,9m^RlMs;][^ ߊPu[E7W_  2ljޑv<a)4KHy|KxkuWcs>>bz`DlFcWqkoԴ|LDU4PfJEޚ98++E6;Q|<qn] [zMDÄ;{QG,@7HKx@(ϮWҧhHu/vA6;'\A!4 \-6n6UqIޗ||;83PVԺŘi .Ѕt)$l3Uø^TǞ 6ꖐg%;yӵ^pٺ-bZ GupLEQ<uxq5K *$nQ|GwT?CS%Nr8/فLqHk`fZ*v'AdC2qX:C}v*{kgR3USR2 2 /QÈmIJ~:9[桵0|s {<|?ij7DQCB^wrcgR#3 M(-tۧm_$,')ܩIQIv/"Ně2Fb4 {KLm1ojnWX@ F+UҠpeA />J%E?s6桔gd?Z~%y}?FXG HZꄗG]d)WajY^|NLC8թ!gS{T,+&\9#ـalAόa~;u5r>V]us5sznWP7E\L*k0-,üi>O'CƞC;1_/B63]+}rO};8U+aLЂNqd1fS_r.5 YYE6A! zHK[fZF*aSr7\7C7 UN"e%Qm=&P9B* Aᬪ]!4p<)s^t{hXDGaAPf, 7a ӡ'=o +0n$9}k6:=\ЮCV+8'- z>a/ w?Џ*{Hj. ϷWa> }k=aN{+ E3Vl5w=fm[BO.'lޕf⪞y^ji*zAK^(|DQr/D5D#qNnV> z5ZE;|4[#;J;>6Mԗ ^_'7yh=UtikfƏ^)콫1k͢1&J:#:)N_&&>#0(x%0num'Bw$3;emlrƥIJHbn<&Bh<~4ߑbgpP/ު?|[.763AXŬQ_",Mh,K"X{5w${cPgdvieDuQvs+tԩd'!gVItR"yR!- ?F w0norH @pb]16/G!ƏB#9xY c|䵉1h: }}/I^\Eȉ^z;4nk: z=us=`#[Ss9%>)w:]pe5Ƈ{ 2,iJ{)~dvڏ;liuuslC˾Z@Q-.NaI&Hif5c*wT2y0AjRn\'x Qb|^v4$EKflvB MЗm]aDM/4 4N xS*[My9# 2 %ƻ8Hqͯ{Fòٛ"q84squyv^)W%EK9s| ֤|--81OgrM__t`);~AjĺzAޢ|E B`*:- es8WL0@A8sMTg>D2σVPõQ-y]m33OYl;~BaPr5Z-B #CS$Ӕ >H!آ!Pofj 󗂽+.L T !_ss٤!DmauD<R>:?<cgȮBqlqۿRq+uDSߠp`aW:qRR`6jH2Dd ๊8*#!IhMć"츇bT(!ĭs\iq-]>?~L5:N+c&kzǍ]!>ռ7ROBs24-ƭU)3[1B GԗΤ*DK4"_T?M~loW]6IY=V`t=&[Nb b0%? qwAh:ۥ܏*՚ʦRz1޼ȗ=}\#ZBŖ0ibyX{=.q)NFz=Xo}eև|(F3Foh!5a[{RRmxyv+=}uEа@/neg,"1dMaez&*5C#9y-ˠ:P귎2j7jli?Zߊ#z9$/ʹ4}l1ptO]' =Uci:`*Ĵ6P} Zb/}/&(R.^Ÿv5ͮPBq' ?/BRӜ贈;&>!ZS8nH1f@șfn6tG^f/8aph`#MwC_;#P a*1BcP'$a( (ή5@ƍsFfB[KH[nҝתOCsnT̺%ZPj3Ë~a:figM~ Xp4Fzv<ߒ&u2]#>/}N#x-խNVgO' /#/2MDY>y)//`ETغ953rݵB]F4]=w`נoȦ/ />F(c^ ̢N+nV18p$|<Ũ)eש1pn$6͞׽5#a>XJ}cX}8woܦxj-[1]7ּ=( mI<Q\;D'8P1G[==C!Tuۅ"1ӣgT,\ 6eNɳë <<)%19nx.6͛L}] {* C&3C63SQ`x 35B53Y߁Eԍ: Y]"Xèj^V*c5'4eԾ |Aw\r[17"hI_˿`q|5}^SI.+nqVbgJ2zB P]hf풽f x>+f/jAnɱ>Pu,iLL?D!uKmoT$쌖_UٟAԈy)/#=Bx+5vrƁ(t,Qj$k<Zƹ4aO2cWabN(JINc(i,Qt['_{3;r"n=SoHnMnߞ}oS>cXk_@78Sl b| ,GeY}sh8IdQ]\jT I98{=Q89x-|h:UWw F"wu񱷠.U*_O}Jze~os/W5T=P8a.kc*D浨g4< GԥMDIf6@fSx߼fff+ļ;uaܜ{8oٹpvyx:l"ߐ{|h8k)_x\,sjh{{Z1.pzMV4Y.6aDuoocޮ$.quZ-4k-pa3'O}i˿{58?uu9B'00(Ovlܺ;qV)ãx4>JoIOzH$ޡAGY9QFG\UGkں&8(I E_ytxC阊b9]M8I.{06RHdjef}\nLldsТئ\kq1kvH_KXrD8<}tt!RgOzKe*j\˯|fN V1GAiDk묬9<o.@n5wijert˅{/'ay ?nzD$5΢dj@Y焦+!®r}u~ìwgFz2@i6jSp!=MK* M3a^F{Oz͝hOKC=B! %77=L[aL7kh}ySۿC0J ժU !- ,N޷Q]2vz'V "Խ!yDto) Ll= tjWBg \/9|?d孻JKv%)$;b9x[5F>lp"υK0~s~7RbV40D(*|紬r(|EuH҉ݽA'ɴ*Q>m| cf)r09-->Qf/8/νY{*8b*G%GTe^𑱙͢ D"XrmOnܘa kʪ[N~wYW"Ru7W*CsP.M\o*p6[FCH0ǽ5~h0!=o:ݹR)v1[+[ERL_=+@ix*&#ZƑvkX∮r=&69v0Z(JAp0Ye6PԴtZQRbUcrdX 7&OXi?x_h %PeyנK]{!{3Yj-ΓSay~dw!=IK26i厇y`ɛq g޾a}:b`="Iy̷lW!~쎦rz69~'" (|~m&xkhd!Φ7;s 'W.-\6' ʬ4=ɜ\QjZ2{wڞ/Q -`5v\fǰqjf_:/}Vc8'5ؘ [@v+҉PwӠoJ IH^Ȧ;ᲪĐ.1Gr~ZSUeo]:M̤K]1B_'pw\+>KgaSUpqyف ,׎bܝ0UYxMBX{@7E sՄ7 "0(<~(2]aE5QAFE @.u_[\I۳C*bLֹ! .1g6?Ov;Z C6v|ҡB|+E:3LfgcE oDk 2gQ pV,H6ld8cy?+W/r`ǁ[~#hb-c*vwt~)l\VVUHq<7WvNOx&OA3{6+FBC6Y@"m[NһDX )V=Iq *cx[СU!]ɂLy"ju1Sgݳ4 J%J4*dkww?jv\m<1٫5G+LhXAj?{ߒkU(=..?!}W$SI6!FI)P~[Ѣχ;~y=!Uyc9}#ڐ(צ@'}:,D:~jaB vΔn,C#HqӜ 93ڽ Ⱦ1mH-i6 VLv&@6tmBxgbmmDf<9n1Kf9b[,0ݑaP3:SEQ %,Xsg{g~f4wݷdzo(4;;SG:&'  /\uLJ2wBk"o?F|01teբS,.I<~lSn$3 za{PcS$ t˛e"ϽVנGE7(j޲Y;/i(3XeoDX>2k.-VH$a;[BL?yY+P-X9玂WdŶ"E.ys.WXa)hVv5]$4^}~T{pP-X;#Z#WTlW9P5̴~څoU<ӊ.=ʦrr^o/ᚯ3c;y @)fχM"Up'Swݡ2Kt+X(~4n\)PTFrWAD;f"!9_[n5.=++0t]n("!eQoBgŠek<,QOt{^q-X ,ټhtGS57.)"j+bG㎺3)%\YvূL:TVJŤ%־襽`54?H,T%(jIb\Lr1?ՁԾ,5]BzySoε4;x%W[ݥK]u0{Pl@Snz\8;mz ^uX۱۱R@x%]n?bjºh.Eau j`jU)JI"j_ˡɟ[g{,(&17 jՙh -iDMv}Naudq=ftu8U5dvj.Eu8Y%_ U]8]8l9Owz sFQqt>,EPrŔbhb #qF֧ @.{`7Bv \0I"nsx;) n6[=!?ja{6:3 SM9q9n7lW[@.޾a݀89|OW@veccߪ+=JjZݩ$ޕ 8#l7n뱛o/$(b > `$Y CSxccӣKj Ⱦd$Ҏ=D u{tBYTFg; >;Qԩhu:xrf V i6l$2HLW/V ?7En5Lڴ?+†Sism:UfuAWwrN&S_0K^$"26|?|Z'|O"VؖskKBuLMi?xhхB85NH-ݾ4QҿŮN#ϯ ͮ<}<' p9.6:/iW2RɗA@&',v-T#f- Ne9{j5oWQQO>(UϑV֊ C:'nMLK[Ow^0O6gݟjNv1fQ%m| Kp]Lqgz^u,Ft;ż J j(va:8.fjHMyGڑ#} ņLj!# .c1oi?uXB.EXBFRtr-?;+WBevLLJnPy NWܗ*.j!8stDU_0;;D0RUgN9tnߨ<"]A!G ? T]1W^ i#t'/~_)o8-Ў]+FמO!j r"7tPBDӂ.RKe~gkh F^1p~I=wH:p~e2WCe.mf;fx|vc]w63 zW+G;=cQrvbtzE$]kD8pp@E˻/\ ̒hު%%1ﭿ%ڛ|",V\u%0,.ߪnK>U\3V *cZ#"1{ x 7Դ-.*SoMp:X}!lʷe CB1i(~;^WdT*I+|AKv͒'6ΰc>kŹTNgDub0;tG1g 6ˬj[]BvbBzb˕'Hm2Zd!|q}o!6l+'ӸSyyER1H/K%@U{7QC%纐Pr-_oӶS)ebxvIy-b0{ja dv}>3rVy.lD+N~#N+#?$]`,0* mW~( .Af:>탹ϦJ }^iZ_s7.gx7vڜwWqՈq\L^2clJsSNˋOsr|GV+oT眺B~&zS`Oϯf"qN Ujo"}e.HXk*NZDn@dWۨ>t%҂Rn@OŰ>E+#JJʲ^ᜀ5_\?W(pn:d%1( hSJ˳} Ѓ֨ Auuo˯5A79o5Xa%Y#gXZ~< *}oT↱JMCKP6LUf9gƬ@2Q\ҩ OousO_{ȸzrV^\:Xxx΋7 ޴d +gffx?_[u_NW"ƻ%CbU{ʇM"kg5`Č.o# :Kx-w(Qg;O1bb*@z}vu~)VV^-¹멬T,"u@ݎJ.*yČBDv# Ǖ6A" -vJlO\٫+ZY"R-PI4|hsoHXLjt-^+J=24h(* htXKCPWbSY.p!%0ƐW^ǫU{_jJLФ,_s^Y\M]5?~4]-|d?yW18qW-Pvcw%U-c? bsDA,f/p_CŻC'P7:2$D P" p+=iis{$ SpK}_ rg'<,LA^dS>0qfsVf`G**,k]*L-</@Ƽ\wb,B/6<π\o!񾊻=5i.5yP6]rqe_42,[nNL0@<9Joe{ޔlZyo021"EnU~jb%"f-`3:pܿ.ҝq@ln6#%#Kqf ¨s?)U$O{j#BמVwW!|A*g$d uUzS[|TF\Pv-2ݏ.?.?~ f['2+)e%"iڔsB@[IƗus.>#^ˆm`]x=BOيQ/dcâ ;fԿe|' UPbBaR¯aT`r{w+sWOGSir#F87W xK3QǕ~]g*)[(~z>THlPWrٞvŵ<3 $0TI fno 9P&]D.5kWdʤ!5j\͈4bR~3C>Hc*vv@\{_p;2lۺr;+X^brIaⓓHfK~!<* (ftF 8t*$4kUTMIsi S(!@& Η-iYLy.[gt29 $uZN9.!Ns~V])wDUjs;:c\oELG^)IT+PFPZ&nh5ڙoa \OK=Djv5&ڝ%PvizɲVad @Byjab0^v_y} ?B@~BIOzK:S?5;4$a $!' j^  4s8i|155mr5;fW遘bTI.@G<M\uoS;GV:E _ ) qޞ\Q7 FFkL˗ {/r3yjˀ ^.!IiYIYYr%K+4j3arVWAOm1\׌`a<*^=;nf7P$Ҝ50 uj1{=(Jk:@i W0EEF?v6[4p6ˠǶnyPogml #1}1;l4SIL_hy1#_/;T/ٝzD4TTwHudsOuSla ugcA*ҍP2ySeF/! xMnW\"WԜ]s|{x}WNֻ#$3<s.=Xs,r&|hs.E7"l~mֹb Ɵ)'E4SߥW^0)}u4N#:QF$_ԙ]i~juPAȐ)}X]0L9dQ:Cb6 פsZl^)v²?IFnuZ(qٯ=mqK *6("5ufTw3KJg9h{z? ȇhz~KyyJf0#5>7=x^!.&FkYBkn(N雌Ν$nU p)[K[*6'4SXg;;[7WС{gAH\od.7ns/'avv#WB ouL x? )mpinrG>8!Ҍ۾&al)˓Gh0ƵCs< X}zg+ꟴbz%D_RڷKntWjj +|(bC5F,"vYX9pqiڨlqTB#W)OLaK7ڶ R B TkT7 $Uv ۂςP\qz~36-}9\57Aڕc ;1 ;iP~Nd/)G{j'c.#67qU0q[)fnWUҬ E\ݮd;9mv>n"hA1wo*2bVp7[@ͩp_?%n!I:iXXp&-ݜ>ea!(dp*p:}XGwR ݴLcݩ\PRd|Z66(Jy5vKea3挺om[Hɳ*߻xy>}o|Kl(^*cGT4vPdH.8Z{#]l9;yhhxA9}NF_BҢƴ~!1eXʌMp+ 6Dӭ+]u~Q:f 􈱪^El :AE#cK|!Χyf.9ūXv+$GH?."Bk Հgov*')7\N\~gC[71KVi%q8!5(&6loF%iy:;+Q)hR۹O79pö um[~<աkk浬KǼc+Up)s}G%B%C[^bR6B}w$#ݷp + 8QҮ"Y\(>vg6y?f {w!;kLUGũ p[ xV-xdQ>ԗ);xɟ=;KhߡaNe*ыɛ#d$$.ʰ8䏂"4u~ě#_N^7t%TXj]inX閇ŖPG>'@Bf^A6BhV%} Z0;?)CGTZ:P4ky'eTUٶ<εxQ(>4eۃ9ֺ?G3OUykyn/+ިL)%- 47T#f'wfUE!V˲yTǞe5|}[^O1xV 8#gCB\lO¨NQkVTÛXY+__cs,sFe"R(9nf/S@)5)YbOlNw첧@ܕ5-Tx+kL]k؏ +P+"W7-Ro1hr~ĢIpv@A Iu]9҅N-J "]DxE'1V܂/ϛEsp@R7&36^E| xZX}X.g /өOꝰI~jn)z}Y'v ry"*u3w;=bp'w/j; gFu1UV6jN C.d}1L4ՖR|ob&U@]Kph]j;OeIGKx)N[O F47,vl VZ.DFQ7㱎٬z[ƙ qAs7^l|[>y<:8"hUC[ɎN'r-gwꊗQΉⲀ2JX<4"~1Dh51?$c|f=MbEDb-KBiL/ޑOjUmRE[tP=6E?۝gKw_#fu~iWՐ uuRf,q&dZCsjsMVi;bn΋֦ි(,j<ҾsiCA htx@௼|129w3}~ZԤ?pC3)%m41Sg jgz\Hb'qJ# .kfSW!0vwv+/ƨ"\ΞJÀd_)^/OH4a3K [FbscjCQk{1^yehŮOYz6_@ml`|}|>x1kL䔐kٓcaVAﶛ|qt괶u"t_8?G@{Oc2~N/b X/t<bSWIq/=JQ#bbdIKښ2~>O`REWw ZPꧼ[Y[^5*.R |eq$wPӌg#O4<.OuXRDhWwE!`8k[YuP_G!iL;]ӾJ!&֌]"7HuL؍(l_E4^k2H:LY"{ǫm2,&a}5Mپջq&H+.nB0R78KM6bsKJv̫ s.1L* .Ѱxhnɇ͘8\Tۭ]2dIIV)'+ Z.PƤJ2N<\Oh:?R#7@Z"; àzMXq4Ni~$%lb%Ӳ6ߠu{إNf ̼\~18=OOI6NCY:&v6k_&ݧBȟjpYTeŜPuw؝/O,!n0P,[ ]̱t[Cd,usrp R4ЫZ9#twDT8{ ,A7r5aKe.NL;MR28, y%ޓ}Szig:hݍN{$tހi2f8>ߓr=, nFW.-1$#$$Gxc;_( ] RygDX{-pG? KEhkPŚL (AsevW>p}d0[n.Iiw?4*L7:tlf~$w76p&|r":3EfU7#q4zsCcux oi%, @ċL휹Ayz {_6w~+,A+{ H+oˏ2oh -o-)\Y#Kۖtd\Ul5^ 6:/.Rz.=Ɩ˸WspEz'2#iNҍ5VU*+|a´gBj72dwe n ;rͤ zY=eyÚ/scE)"x)pYnd?F.f-nR^܅?Aߟ$l:p!WgE±VJ3?ʷ3|̎WoqݳWгg_PK 0x PK6:QMETA-INF/TPKEY.SFY.|"ؗ^q.FPf=H7YUUN^kL`|'s|7*{O]({cyƏ.7.?^=C#HS U% @83Uи]踀[,*ҶKvsxOu3C%yz9<_G=?9TBova/H6o?qr18e[EY.r_KEazG8GUOQ;YUmc |vΕm0q?̪(h(*(,O|yҭ0/ׇ|ا#Ի*O-v{c*ڵ{*|6óЍbъ1d׮fpeZ-^8l|_ś"^䢵Ҋz:ٕJWnWafy~GcXQ0~_4{ʹ/d6Wg6Yr~FvaG#LjC84 ~ZknVǥ7*&Ƀ;ϓ|1ʉgunޚ>2DP'g| --b~k?%%-l|`y5F< xnOc\Y[_Ƨ~< yo8ӣPBxW'𽛯 kzhzfy49e:,vaIe}zR'rfN(.nKu)A9XÑ@WYZvEx&eٶ6>?Ҏ>m[Wa9|Щ;z9Yҍs=NpU:'Us%:%xP@WMcP݇d'h]x^Brb օD @p>F_#Vg${PL⎺O3OK@] H1 cd=CdHb8E9x0ko}܏R7gfr-hAwF(\vvvr>/u$;MVɥ8LMHcrpB?l^)bc#e}kNW^2KLE~e69ca UbG ׹|sOB۲P_1`H=xDh+&ƪE~ Xe%M |a]Ƀԭw\*Ji$w]lmܷv>itLV:DʘR-O3#Svz>Ϯv f9qknOq0p 2CFbuЩ*DGKw Ӵ ژz.lַ& Sk⸓h׾cp3 Wc9W= gn&s#9w3K^{iG/y:S*O)rMxd\f[q-sP:= NS>pa.^;CԬ6Jgw,6@_X䨩7" N;q^@'?pl}8ElY7_5a{;pxr@<$rZ&]Crq*ڜ5v^z~O\[Z"e3Ѫ~#-M6zxϷ9 +"a'ꋴ<_U /\n^bF%uwL:jz za^=p)n. ڍ4yvM{6$bB}5RmCp{wǶ-cȣ>#c x/yB#w^'@@~;Wq.i\3b%G xdiyBmU0N*ߓgnh=r+ə iԶmdDs2u P5d1I#'7r9S 4n+oNw}}FoZ=Ax( eM@o<<-pxw74>J B8h'8=C ;U-:zmV驏4MLHjHGi@K5.2k%ܖL=HuAWe~JcEc@ [|蜒C#}7 iK_/|,} mVNݜ; tx#ϭ0K L;+e{QCT'38rp^GҨ(zqɸlQnOG&}tBVee5 1pG@opV3jHDˊ% NĻG2m[Y~ .:ӼR~ (ALv;t\=-8IGrȼxţZh~yɭyffk5A& (|2cת:TelK8|0O\$\}  a2{Hov)v#,<‹V‰3ePO}$.zBr$Lf,n7 ^xأN\b؞ޮaɤr1vUF77#{\)dEww,~ c {p"~Ұg-qe,L"rc6| ptxNu7̊1 [}6={/% +co@eR%aGGKȲ, q5vlKg!MOշppұZnt/o~$E͡G fw،`Ƀ{^! AxI!fzs>a] z؏B叔"WnE<Эt*hE˧!|3x̏`QY^Gb9D1@$ic9_ f݈-o幑@L[*uY\hM7j="_7xCoҡE4lUYcIOLVW6ei)'S% p?哵˻84ԮBt<5UAmtKKV ^taT~,-(HOVGv,{&{0gM~8wpVA[K &3yO7qs/F9cuvnٟpnDe<X-s)f'D[v{+$Xnu9Ҭ/V~@b[F,הgףpcF˚ ^AjN0fAaAx93Q:D҇A/Gl$-ࣺz6v/ۀ~B՘qzo6Y_o9xC&rvu4mF\T?W܁ GyMHS[3f]4z=.vԃ jQc>D'Zb!:mh>43zz:ε c|x +>Om?l/tY^"FIסg0'wHKJ46.|P'$[l; Jx:f&J{xMV|!B=GZs8Nzٲ4JF>袕Λ[/])Pn?A:-<]&ʷſb%>TzQ}VЙS/JK.ǕN.(Ph1rC4{I^gWo.Fen _K99s6Ns5m?#, o®-mڲNL)VzMMF*n1{#)?KN2T ٝrR υMwm hyH(?(卼~B fxyJs_Nic+~~kTP[oS25nLs1>KCRmePF8UK w;7OMwZSD;/LbH!J* GF^rBWf$2O->ݖuWnep.\w6*ٸ/xU >) p+DoZtF5dk&^y,~p:KY^KuFoՂ! Ï$LRq#TY(iUxcYj`jQWy+$cڭ X|fA9JlJc)=7k~Dԫ\Gӭ9iMQiIoJ;XIk z  D_qoȴ}(Kܑ32pOJaOG8k= ЅSp:?Fٲ 5[T5 =T0xGw6eVTP̖H=t+R6RdCY3!6mր*K 윗NKF4';`EsC^p.Ns7rܦp PjB"%;LVmJS;J j<`8^"aHB[TA1Dyҷτ`HńȞ;VCJM4AM)?@x:/"WyZ1pm2VEzNjzBsYm&z/.M8@q x}kbX>1N]5\+Oar:9ar#P7 |feNĻJ§.XIֵ܈>RSY(ƝHԀ$ !95w`#" ylX{C*E7)ϒCOŧ>4n7 },WSco9Iy>W kC8aS<rg @g|atgW((u(RعNR'Z0wZe)Rt~=ȭ30nh0~'b\[Īz4m%OI:`_dEh/$d7rOBgaKtUe܎)5C n9 gv:c/SLҊx/ǗQ?a'jٹk|ҷN#vsC`R"E!VAht ߔ(h؅%mtKgӪWp:m8Gw1f7*k[~>\(pa4F {V]ˁ.G4 JM_bz~u I|WR-qU@ygg#&„:͖+u$*=Ǘ9V,c^io3yT4ILcR Q՞GY/w-up 3ͥ_7]"MOAZLadoK'; xۢb 2ݘpeTX)ܫ^Ev+0{W"MXi8Rp|#x|C׷2Eczq1z{~qk )볢IB}'"܀+@d\/(%a^b CB( ?ciߚ$Ǎl^:^l}0ݧɂxJX[M 4!a {{q_+=Yayq(i^e5-z٨Ty0_CeTʥp𘸴wB-ܘ 1magzɋ:.jN+|6&O 3d}w{xKI%T|T7VșK\rx{yPg׵Sutz@3 Pi,΃؎LBVx6#/r/fkps{uuy8]?_ߎ.CQ2o n+px^m__v|9C}K5R8`]mNi0?pUM"S,|Fcѩwv{_i3p@3a>/aw oC#d HZ*HriAA2Wѻ_Yb%Sf)ciׅIT\m%' 迿_ϓXqê^Azc`Ӧ_Q54zoZzs -8Nn#'"clg¹2ڋopL#kCN&RQqlݜuBN[ zvownb!]CFeH3zwa*ްXܤDg].!]l|6C  yAΚ~յ OXS7 EtBű# B8v-o" VccjR T՝~<98dbNNNޘeSߗY0C$)Vb{[ =mDU K Kv}xHF04"^(BRB3ML"Ɵ s Bw<ˇ\@sGrW6bfi5/Qd:tq(GSVh Hw؝vA&!I+=2n$ }gE6F/o<܁Qh H*”s">߇39ZʏY/l?cN`A sv]T217funBroPgx(r.c%q3^CeDmX[^lқkHA<5.etܙ QYڽ!^S uҁE󕃷4E,@1[ry묫m0psEWkMo>AF'{KBET+.wyן)BU XYZvf$yUbq2–?J0'bbOe䩢@I/_ o" XVE8%ٱФOp*+mZvޱl ȈA wۆXZs8誄ųt_Pc_o8bW LUKuyp횙Q?c)q,sT̰%Kr1۔SVoy:$1[藊( Z}4y9_Obw_|fBg/&"^UTdȉ{J@s?hae^ N'vU19ѷQ|!8b _J2 sܱiY*ԺDm|FaqH'j篲@zxC:cnB0IwtqTJ֟cqCZFH2$&b+ܪxWTs&ks =6}xׯ:S []\]0s%`}q)|gmD8r8J9[(4Z!3 ]*֞VLOzVK۟W6O!c+Ȕ c۞C=/ \}xR AVE +ۭ8,^tnj}ݖ .gy}iMN2=٥/ivɧ0HoЍCKAZ w ^wWpa&zc23LT@3LHh;rx~.K{҆73LXoOF~ߤJt};l yH0ƪʿl%vCߛiwQǻsrt[Z,5zgdQv᧤u~׸ö VSy\lǮj.[lϓ܇rw's9h DmFF p؋hutG nvm1s4a}Z'It <`'~ ECY]y> )XŚyc9$ߘgcP4-5r. FDLQdJC:/_Ej?xr+\e0F o)u M47~\),1a 'c5d–'X*)Ep7kaoz-1n!BJճ")JR,. &m~=)Hacl串#Fj^z_as*NWPٺ1hDQz"?9uYEt'v A+eSL\<_`b%+Rdžncpk(a9 );5وEghvcR֖׉տZϦ/\'6|T|GtQoVXxl#%99q^{;nreZJL(ۧPjFpQ%ԨN a?j+((1̬?G9!LS^בLJv\ђ]&u㡮sҔ13G\W1ÝS]M8-#٨%&+jDو!OԭpS㲎L/[*v9w~/YB\4Tioq}J:Éxݲ~'+. {ڣ3my)~xuQZ. ]ir+HU +ȪDY9@ ;Ϫ#n,IӯEv_w8bLۊ!%LZMGD\+\e!yVFܚrv <6,%7鮧k*}KWԌ%g){#̓*x9kg,Nrk];`Z雠J]M^-H>5'ћsW!t1֦:)I{Э+QH ؚT¤/ VʹP#3K@VVBˇurΜ7N?7 xcN4YLk$`wwI}ow<@wͱ[:m6v3>ՖsUh{_5vERӷIx4&xΎ:nҖhn*L$_.tu.'j+}4y2-lԞr?nWuEsq^Jʴ0k릻Otf]~$4KSo騿&J]\ v$h.ǷO<i/a`D>`/%{ahw;n yE7 F8^t|3W2VuZ:6]j:EmBpО{՗HV㒽jKĔbNS'N9Qs'ja]n[bEQ'NMZW5`i}nٚ獭ycG"d:byL4*iH}^F Ԯ[]Am] f9姣}w99K%Am3!ͼb> 9_hd&ǪN.6q tb }㘉=VsE*YCĿ"(P]1g3C>r݄2טv:e'y@ taߦbGV*l&dP?¾t)sQXdlJUg֯ɗ<^bS:v8WOVv<$# ڧkkٕnwwpGP /NؖmSSuA:Sc8o=C[h +-BNí$)ލ(N,j2e"q=ا]&y5^̫Ky&^⮴ha|Y xV4CV8'C[zjM'5$Tl=@䑋Ib%$%XbRJ.^)ڱ3NM>zw-8\Btǫ AGSEg|@:w)l\nJFMJw8!}OB3٬=6lj5hZ$sOy4,4j(6w^zc pC(ς˾>n!~OѺ^B ]2hɧf,D.0jt`ck.Gy<WCҦIkT`>voّN1l6~]BCl7X,~Or;?ôh(vx}B kG*ŕ(+\T_W8ny);&04jos^? ]u_W˅6lX#6@q8%}v#]Fzbf_a&.V |+e'd׮^칋`+42/OW[a=B/.VK}l}8v_T0,E;A%-u_CQs%ɚToڛ۠+HU+z\pǓ#~m lѳ ٍKf.g*pfP ^ $23O]qJyAi8<߼rSwk6:ӿ];أP-NVv\"yQ=}g -yz"WܘcԽ |$}ˋuCYLR8ٹ18dUPɥ{ }a bQ՘S)U2Ζr6^{9T:k Nˆb}(ߝ-r/J'ِ;V]S J1XZiFJ9¹~§Oڛ<q~?[&&s.ς <|I{.µX%Uewٮy =4EA͏P T {SG* b{ڸ5I@CZQ];RIڐG:F ;J߰7"r׆je-:K황~$xJ\ipo 5$YxHkGn^~q%MiBO^\U6z?+n@[1ܫ|N|VBO~ zKa8kJXdl81UtX# ?]{5V[_V!S:q1fbS􊴑A%Tx[4[{#bgsM!OjG(9P0 u3Ԓ~+dJWK>\lѾ[bUz=vhAU{l^VC7F.pz:Lכ?↷H\,Ry l,/?<;#*>|n{f2h0xNKoEXOv p\>^wLz > N{xJ1\[.M[]7i S3n:}9d{HkrJi.8'/|6ĕRl]҈Bޗ>u#(Vz"`穝xYF!/ cjr=Rl Pa<} "yn ^`3z,ۗ1h:cmxLg"ҔHCNu^_Iު Uj9>c6.f~05xlMKִLɢ鶎jCtdh;7[rTIFH7BK 1I @ݴ1GO4dVUYk-7ktPfD:o 7 UU*Hjn)oRŵ[@KXL']ypzu$>d Q62%$7VJ/&kti:NoZmWtAmn&x* \,hF 'D᱕ITItݦrw5:4Fr5߁y4" ʁ!Lc-#FFӨ=A]\//x b3cW%1Lhޚ#p*h0x@w d6u>ptUp_E{MY{c%ӫmuΝlx* Xyi9!W%9Ic_8_t%a3Eo]OIؿ_ uxK)F 1!/9onnXIBm\ y_z"u+%(3 AnM8Vu..PYϯ`\twG|\8)'ãU%-%?c(IVP9y!un8R`ܷmTÝ^S^ з|e)9ƮpЄp2Y#\.^mU>#˜~4u>М]{8 *! Mt]q+-t/}|]1q㑻[Рl:A }+$|=GWCr(?O+9oRXwyB=zkp)um;| $EIVz|kN xN@W- RMYؾVv-.w!*U{&%QiG dCfy(!V*" (^gb(ƭV qa/M"ԇ]bH9Nu2+6hiD"1 `I8el(}1PTG[5rX^!X&ٓơ/)Lߠ}"Ck*j7~6MT[[10hԘ~El7Lѐ6tK|&hZESKh:>l?k|vvMlDžULi%nb\ yuۙ~;zxq5YGu* cjN*qjw[x^ >r{췛̱1C`[f`|en2iݾL~Qa$@9T9ȧfl-w@qsd\2n/ u8 !Eas 2d_Oc<&e*AgRԶħ FWRCb&W"ןBOjpaH|3{zv>͝X4\>. D%G9/ʌFܨ5#J5m'VKPoRLWeR@I̠dl쯣h#ӜFfI)xu3?-@՝pFG I|V0zv>2^`oz^Ǥaɾ+6Mgo\.LCfL}Z`}_?'9>=Q(NUDlŒ&7()~NI9:NQLodW `cqkV!C8w|+NI/e9/>1xqAyŀR ,,`Wy SPM=+crқzH%-~-bB+n9.;f4y 핎?(|-O{v{K}oYn6rSl"hEy B |~ڿ.m[vBC3+w]2.oF !ӨA-y0ttѭu+"D9 ?kow8cf-S:rPc_BaͮO*ѻđUz;B{ҰX: :' έ@C jm+|Đ3=- 55Ur,#SR>}%z Pcǫ岻̒\V,j=ϽnRH-k|^OmH; xE;ZNB-w2l!:Ʌ ؁,B/*Jݺ-<+6$;SQ~`jx+2G6~Sm󘡦uigmǜg @7p^7;IrgW7e+HQ&U܃4 ?e *J~R<)L<p. Ҟ=%'Ua(T[G)Dwt!ë&M_j?IEFf,8RoU߭ QyBph,`u[qy 7ּ@T nQfKS; zOD6u6g~ 8xE>pdDդ 1ms7*l$K6G9.@-6us,:($'پl&" <5<1Z_f1  w@CBe˙7lNj\OO/xhl\(J607*f9Sc(ِ۠~JGfMW-ziO7мS17ԮOc"UGO;zl)5kTn!lWWֹ'fmQBӸކZ_C$mTR~/eoWyߗPk2ke ZFX̬K[pk\CSNjEwUqՏ(.Uϔ]p ;vQH)sP^:@SN_{BTm kҏcǠ:h8%Sy vDZ>iO,}kndU]:܁=Wfq?? e'ڴ:v@rקZ7)|AŴ6O/XNM)ҧ!2E6yҴJr<9SWFk@fD C:B>A3䩱ze5TVӽQ#!^'^ {JN4܂[mxwFk/y'ovM S H]sgF)A3s䎦DN[(_n;z5|Q|IӎCTGv MڱG s?ވ(l&XS8f2zfތC(Gt9>8Ks?:@xhר\1rъoܖ@)A' %O#,)[2&v. 􄍡Kx.mǔHiQ*/Fjcj ̥&IIA'**9\ڋǛ:K>[݊gT=VC呜i=UL8(Eu;m9M{ _ e1󏟆3&H7kr5խÉWwH?-{Qng8wR8%Z1@c ep@գ0 2w펛Tv?wwSh~Cȷ Id\Vjd~r~?,g7'+rzS>biZLDm["Ï*;'ݦ x~p:[ةp:08]=NyøΡ/Wdw'48TQiަ2c 8Z\^O71uw5jGьϚ~W;}.!m9reډ@oDBOX0B J8ܧ0 Xk_*ۏ:#erci )hsS3=m/a ZMRP8Nc46G}c *;1jմDn'qT@йu׻9e2R搣C'7>HK}!md_Kr{ \p[EX>os8[LƒH'Nz3])zRɭΉδk#D=$rü?p* *g3)f!Μ !UmiXo~Lhoen1BTjm 1?炳gxnʫ 5ө1syRՏ[Bt~>ڷl&  :r~M :?0T'(P9gOyddUX]iBTul8 moi;zG_{]$uŨuf.(6E=~%Mp0Yn)<4;Jw-OONW&D'/n5617C ˘;{wwGbFlLuE>s/00x59ssSzs3:s(%}.'/rOea3|.@w޷AT5uv<Èk.ZZ{7+NuL↡W=rK.aQ=/:橘7>"#2_Q~N*B. ?]>A<3iC$ucxMKetX*T FG=nWvi%燪LSO&H[.%-wm(@/S.L FqBB<™X+?a_(ѡcݡʃ*j 2 *Wz7o"PYmyr_T@ͅ(gE®s֜'yqwQQf4s"҂V5_ Q^\|e0ŷZSTn.URGA+NXU+>[ٓ7Ae/&1j`7s)b<#>?x\}^ƔR>l?Yp?ģBrxt;,nH}oR7/Vq%Bj}9|0gc=F/do?k#yet;ZnGV&b8QGC`q;|n+UY-z|iGeVGW0zñ#ԑ^\<_RI" 8KN_r#HV<\vQfħ:bL-@mWrTCΉ65gi/ZSW/᚟~Q/W7V^ro"TI࠵U[]nK>]1L dށf#CIپĂvfP<" @v~:-AA,4'#}ڗ@|IX׫١ij VwӾeO8k3ćbܕt{dzo#>-w]R;V{slZJM.gFATܝ,ݭw<鶤Mp Nى.|yF}F Є2g* w)$`%Og]S$ʦPGy0-PFtõM"Z+sg=|&v~s@Tgq{dhhDC&y)4sYY0P-y5;YXrG)1xݰW:!D=BJu?=KՆ<[6~$q6,|mߞP{ t{ovf]3s4*ӂ Xjw_ }&Ѡ0zjgKas@5U?T5u|WQr(8)(qrmcCes H(~cȧSUG!} OɃ>cKdطF|-RHgXۦ,QSv k8TNՌeBӘǦq \pNs)bA1tB_U7j Ѫ_FFKq2÷`{I7SRD9::,Sdj0?=vs.aS,iB*=+od8{XuG5T U A0SÊtXbu}hdǤs=-uCvj10~L`E+ڇf+:T,N ަ_셝1G5F`7{(/+}fx1ݬ#~4;ұnp$-wHD¯o+ߊXW#$8'QQШ ]]z[/md{`7"wXJJyVDuP'gujHBojH^/ܑcz¢.*tM4Yw*tcgYK[nтK~ 8|Pzc9"p$45,o 'z ar+heq079Zs%L5OϜ;ͦv?~[Cqa 徼cvv2awDcM5vYڻ}OGKPIpvla4y~ܺ?ѯzۧmІE"6wFa/ui?7xz IP.ߑD7e&פ_tͰjT> 4Rk 飆&B afI;'d[5M[ FqM*liB$iO #:1bj2DCgOVF|)У 4/&ȏtI s2ӻt~F~<݅ZRo=xh7 5Yܟ^c/iF0<_mBzT0@f xrN]V߳Ǩ~i޺+܁{:m1v.+ƽi7ߟ֣?L- C_ q_ln({R;RIg6vd ^4 {E$iZa{hEq]jɬl^!TS>t_jx^W絨A* oh/w-T0*lTIB ϻ& ;̴ߧ8Oˮ^:0lumld kEGw*lU%\撺ma۵+psCݡ<[~]jyh/Pg8q+몧I8 f %KYHLA "7!jIdL1M5μGސ$qB:+Y52"݃U Jc/ N7⁈=Zؓ}iX m#-@G0?WWE|PrQJyqZO+GIMJ&N\?YO$L-NaI ҩ,|Ym|w#29-OqnBpFYl3D u pxI`>D\8w{mu(onLbz +~M11kB13uOydfN{9$y=!D :1zSPb 6 &ФxTQД1Zx. a#Ql-%HѸH͖es< чRs .-]Vm/ }{BԂGfo+vըu7b`+=}Z cQlqQauHsfOTyL^P]97hr%[uYܼp#m<"#\'HmCJmD$ ]\#:0AJ 5Sҟ@Qwѩ=@eȲd_sĈajh־vC/M|}-,Y9 XmP^H#4􋦒c@t~Oݩ+9 Y%wp| e`BM߭|Bs? _tsN5ϲ7ڬS a7*Hݱm6fqe!yMl,K&Kx OU)|6雿oyS`R00k/s=k3pf5i-KAȵkk8 utM ILHZ-.Nq@w@hRx_T=6]l|J.~#zd*k$Qj^o2Gǹ ;Sgg0uu"bsDykYwN;mgîS.i髴YY@QpZGK{T%钫2~gmyJf2NVLzj^2Aob?Y/0ho-\;lZEHvv2sErq6d0'Bu-X7ᶗy[쵉2^OW^Fu:Lm`Y7fkގ;WM[AtKΟ]El5 CpdWJd{Q`3c$hniy\ p*mл,;u1J\C3Bb _eg+[G)&tJuK, yjj&eg.Z},DD~~BP9 /;*^:sZגg_W==ٴD!Z mHSf}aʋE˫:\ks:vo=~?;ߚꎶ~ys׿Edn([]?h}oL1<;Fp1p^j(Ll0e>ZFቚ@;P ,7Xzm]ێj> cWu4#|L25"Iډ/~u (ѶwzU$:glo1]->$PBt`Tg:u}fD[fٸnW>A2_2rתb=ȞVv.ڬ2e`#)%{o#w-N.ِg=ET[Uih,֞0Z2<dJ{[s;}7J>ݬ}R ~I=ɳʌ ' z\8is?kS@^ycN>8w:ms$[6VWնo&\/aT0]Q*nQSԒa(fDo_֧w%HN5]=%AǶQ`MyKv= >A觱jn˱$:BfdݜG:QMAUTscfs>^ B Y6 --yrѻZZ~[Ҏ?J M.x JikA2=95̊?zO(&ᴩMdY|U_]D') QDd]w*36Z[CE1O]ٍ"Q+ uҥNNR[T[;F`k0~t]it3,Z ]1LgR'΋_et$SdzP5% H~>=1㛭 mDr암NM/|W_\k֣֟5VmL wgTS>XޯaI'Teřչc/=xy.{IWW(p'Oz06T17:-Re `~IߣK⪊a)gK Qu_<2CZhJl6Cs0o*?Xvw>l?3#Bo(TY*)R9Zd_dbV]y-v5 os@~z/lg ({ro a*hY|14C^:AVU0uaC'yIbșT{}+oQCr#F dX 2 r>*HoqNב?*~D CY{D݈gZF K7VcܧC ymod?IOeWeL |s{øS?xE FvnSN!}pE*5[ixiNl1/& )_dꗀgl- oqlmih+/o g{UDP^!Ob=:L&ҫ >$K/[A}εA(;t3F98{W8[0uBl.v Skji,]yMӵ@mxwkN,pf\PiĂ=upqΧ*tXv9}^[~S?Nœܛ 3D]tڿ].;,܌C"2<˝jh0S3O$qjYzKU: f,V[&ΚaH8?_Tyr > {x% 6S-z\_c ooG{bYTz<,;^:t,,ۇ T@_k ;YH^JO-()p ;7I}Ѥ]W`]4dW'WǶ-ckjc1N|v)+ qOJmKJ;==T.  tzC/L:aT G+˪dnXfr ~H31\&]{~쀱l]스csYu}iRql%o F Á&LRCDysw{ s=ªlz7=$!Դ4W=_ .Qa ӔU剚T!foBG ,O#`%]U~znAX~}AuHMivG1yѷ.JCژ/vq7qOozuhR}}·7J/<4e_q,3,6-vGr Jg9Nڛ]oj( TnUѷfKJZ<Ns7'&z378,jVB |(Wk<ܠ}γwO-u9l3":-2w< :j] fr-!ʜq>W?=z&חQT@E*o޸/lg%!t06;۶'W[nI{N՜ۄQ.ɃzOK>K]'W3`kc5#$e}fN nx|'Lx_:۳g"7EwD ",x K{?&uT_TJ݌BGik#>n/)" \cD^ 5CƆ.3ⷹF[LxhUr\ّ6;se<Pʥ^k,®7( DΌPabiND4pО2e'I:ǀEîZZ]nٗn}Ϳs`Pg|\m^xsUdq?>#lXG$d{G'@(#%Bq?}?*s(;ZΨ, M|$yf6.R.з5?n~gORylMJ4Tl`Hj2-qv9Q(+!mZ% ]jBΝ9E )PldWJsdB7F1%Vs;Ӣ{˥/#Vw:[o&h 9kWz:t 3")?&rZU>FWF+jl BT3ޓO#9vk DtބPs|ײ˯y.8#ď"4yxħ߯NG9KYFER*s_PunsqęwӇb$e|WtӅ UN#bO ,O^l*BNQik˹=S^ڗ|Xf)WqjF$ c:t6bTƠikHjj3;4j]q9ӵFݺDgX[zj}u Aq]{Oo@o0=۹Ԩ+Il>3 ߮1d$xZżkZX?(%*aJ/5vW' [Y$j[ĨFkҞAuVѻ,rJ+R u$t-=#$a H\7xi o©:@Ӻg4 Kg˄ qCm؉ۋa{)a.7Oڈrrvz.Px[nz j-,fڄ7M_&û!`H+p{| y̞؞-@!/nyl]vh}C*Wzuhpu2Y4' `IMA,&F,0+X:X]Qnr#0 1[D2 2_@JI}}kMMKd}9'<2 Rt#Y!rޮ2,fv^b :$8v]B&>L0&_FLP]qu^i4#F^{-l$w0IHV쭴][>sk0\JnCV9~zR)ܛ[W{`ʖmi]]= `E 7j&V؏5TSzg}p<&iŁoM^;W N%/˟_x* ɒTc[.11~VMJt-pH M>:]"c 7ᇇ6kxVs ~\~>`;cfY*\=g3šrwLmTOۙ}qY{صgz/grU~'|/Z*r {5]uR|9Pa)qAt(a*MYx?V(?./\w5l40\`e֨$a^M/`;g_b@(wy. 9G7  }o`hIo iC8,<. |nQKf~FPAT3^ea 1ZɒsqYYCB%KU<8rRGo@RR4N=AS^W9X$KnʱO` ٙM=ьV3q^?$˲N9L--W7 CpvhQۂ9o n] ]vWݲ[58Ǵ, Zr˜=N@ yjߓgll lh,i@^$xfjXRDXp7=7ל !99Q/_ P>3[x:7%<"lhz'pgfwܗ}Tv}Rw~P ҀKʯTg\ʭñ/? 2O [Ҹ~^ZLE\t,ƱT5Q޸gլH8@v֜Y@< ` $g:ï+?¶kvu9&o( " Ң :Mg/+Bpbt6϶,SSUŸ^.9I\2-*ץ1%&S$(xdn\_Y`#Z:NUXpa #k˻|T}}ܕhFOor,\ػUNC=t_As;C> kNsB%/bv]K;a4~Ceˬ5/R< (` l.K$@4u~ح/s2P=)#ݝ[,{%Ef YF A$p >jaՕjnRCft=%'tܘXV>iiz3msc!GL8;-E!Z1o"ALlovF,P YevvP2$Nٽy+؈(*Xc볋P17vXo8 oNG!)%Ի8f5 gBdc~|"l.=AbzyBhIū6v xM ќHB?Mb-7׶=J$>KH%ͷƺN_1ؼ$Wǝg8fݜwB{tLi$i|K? jߜX$l}1''h)Bߒ }Rra/qg%v%+!kq=~DlXKXD92:v^TV{Si:vbnm]os`ȴ$),Dru=[ nR/E-VEw,/Y͉K^S)/Biq 30hmo-{]]es fµuŤZѦo/vJR})Ov 8cg n5ָ]D) ] ΋şҭ 枣;{j[z 0qtZ C~=ˢ9”/#M" &4Ŀ=|%Uo6RvE o֕8Aٯd]OMq<Ŋ,rm5c>&uesmr2ZZRGM7.pej-ţ;/ӑ[(l^ZJSz:ΤGQH__Y٭v0^2g(xw|j籟`Bv\[z18- !` u=li&Z% ½.=;(8yC%$2Ӫ&&[+Kwm/ ԇ,&Jmh%r^SOzsJ~vkg2˔C*Rґ8kA82lׯeJ[23NbsAKb fFql:hX0ttFpOt3e"E .%q)q ~%Sw)Q"ٳirrt֏n'fHZLL獫Ƀ(-[iGRnquncKnz £`PWW8gzgdg-L$Q/!<xxyis`䩸O2ks۬!%aրL%F&MYE湦p΃쵳@@Sg"/ƏplzZAmlS68T,Jw6ĭ[<fuV%.'ҼfAt~*<3<Bp>xy*$t}췷܃bx%Rak6 SۀŭZlX]ytd pt5P3rվ7`jBs$6z fNHY5VѼ`p WCȜn:Xa]vuγb-iIζof3DPV yrOrnh 蓜ࢆNhemtB$$ɸj7GY7t~p pHW ֒xN3б5ALȷ;M$bۚSEP(늼B߃c&|`^6{M 43u$ҹSsl+Y(%ldʉ.}^v_Z{uz`l䏃+s({Dy)|oT|7j6ÚSPaxF]S} @Vf H۬Cp@6ӄ\AT7D$ʊa(?Zoi| /cfHk k'Ĭ$v4^̀3uA½Nm@vynJ#za88A^D?|j'PIcy!9ytC(??,-9;Vޑ,CMʧڳz 9+LqB >ko$YgZNuBv52/>Uy?/3Bu&_vK"G4,bOR;#Sne,wQrx? Ÿ<(GmHBUGk+gY= /@#Gʰ[Z6Ye#o*삶8!/%wց`f'Ӂ9~P.{0K"Hfm`Syb͌6rVaf)߳VT+e$RRsf##٣!dmsANy;g<໰R<#1si̍b怬l0?V% xב[NԈ#Cûns43`Т&ag Pn/&x!HMaQ!%vszrBTDa,am3P=bXAvRd^* 0,`L˒-l-ezIHqT:}2i+58_H(1,V H}k-[vFMe\!D{%h0mz #^zOK.bKٯ!iK98>:[Y7/nս">nF i ?0.9cJ#sV(<!Mf 4nPwJ4 RxrV^bHua)/XI8'KJ7pxsjs8dYrQo}W? 5n=ŤKh?)?sCN29+`{ +r뺶Tݖտ*N n4R}9R:"x~Gb("]c+gܫ{S7!) \# Xv5.Lw4ogq3xNmG[b"]x@۟0 B]JS q-~m5E.=^obA6d4/ȝZ/FLK{]ssz킣2g2 DWity&o']"dc 884g`<2"-aba?7Cz?2F}FhbxAKi2WvpQ,YA C_N ;g"0vv+m- ld \b腤2Ϲy/snik/6eL#Tu/& } |;cH56C@o0`j p:Pb>ٴUT*Y{zn_ u}|h`wZw .>kikk 8Sߦ]}gȽeHP%=,SG9A+B/go\ [3vdX;ķXr+XW zYͅR>1=yfuU|Qwwyvcfb3;h &oNDQc P^jS>iݺ9w<s628@ 5:_{P;j&G4vb-r#94߼D/([cH3SͯK!&ەhCk,w߸֮sIF}:Bl;-ףG.nSr:8{NɅ?vI 2VفU3}^h(ۜ6۟a]Ub1<6ɧl>wL~ l!kCX^)Ç|X뽱8+,WΆKioP+r3jwBEw*Cȉi"!%BZ@,kgfu׼h;f@ed!AyZUg06krj: |=c=60mVbm"i{,?h tyc7J`l ɬ4=RׄQGs_VAOMAz*$ݠ%q| (UFTB+ x&2D1kZ7UY46S$h6],T˰$-qc{S v I%eaY3ኹf99AS(\,03֋uN[t h/KLOZs "HChN<^1OfŝOjL _ UހXلUF[ɶZ^4rcѧDߎ\snCڙH];iJ31ު08] HxgObZޚJ6^F?!6 CX2xݛ:vz*%.c !zаq`Iy}]$9\(@.Y0Ni6MwYBgs# =oQ伊e0tXʹ(/9~&͆pb L~b7iQQSsM+E@T -\*iwVi`!pS m:g6zG jZ Xulh?nBg9;j$SVܲC্ [ cr;eRKRHO/K]}qFZ>?!@n_o/Us &M ;9oMؕv|O%`oG0IEH~|R Y<%ŏ+`8O6?Iu`TbEL)Zcd>J|LmuTCtmtwLO؞.J+ӎm[DRdy\ 5"}̒˲J61߆kB3y kxwp]I[$-ZgmG\>0~3+9/Z;c-JD67?Sm{Wsw!c'K+ 'bu#`kW'6 3yeadd9r:Rþݷ3a]7t/w:SŎbR`k/ƿ]INJUb/87wQ7m[!ڹɖuΔn?J2 #Tm#h UN狷|mG6x0\9=(.6e(;sϯ >@\_Wt~ae 7?Q>c,lllgRqQmx:#Qs-u,=k<]"}%߯9![01`UJ#Ƃ!.Ex6뜇gp~}ٍd6nu3tD0>zO}3vXkx\ũXMY.Zw;^s$( P mR%S ssÕMYazX\XǷw~>(sfS5B#=s` 4ϏwD&)K.gciћȤI7;C|>Ц_M DX4B%f 4[`פ# #5p׼ R|!1?t;c)6%Ddhء!kn9 vMo՝Il8]Kwoe5բDGwBXu=xE E ~h<ܑo١&hkU P_ú4gG?F.elf/87i.[$I0 [Uwdfl-xS@yGOGR *O mJ^o]ɤ}eO^^w%3X;o]WG<|SKeA9&k?VL^ o, s|#1-ᄌ+i>ȧ'WS.ZvVIB$,K;3? 5,Q7K;r{twr"TXO=ONK= +?Mn59\jI$0VVbƕ_$4^2/M@ae<т?gא |)478B$5PCYlS49OW磷HFo# /h~ki 9BfS?|߼ z0euXww0^=k]X}Uw6栿H-`y2z\:͆y`>vp|7쎇D50ʐ3،$lMI jZq _;  ws^fNFx囝:]_B#q#SX&a5/并P/clA%Rzg-&nIƉ yέ p [Ct¾*: FL^N<{ErIa(#Ԗ7Mo6􎸋9wOĵ4w[ Ez/+8Pn6j8Ez-~0M~#2DZMe4CaR\@Bǒb\ɠv^6Z\e1?B[VK GvFE,E?㠇ϏЍ)̶0b[l_֏N-Uf%${^y_>;mȝ|w̞A)&JpltvPMCH}Q.2ƛ k_VJ@TVӇ[g1ODW,~Bʀ 1Fl t w?_4fm|CIӮM=L{z(^Ep.D,O{)[wQ<ȟ }ziBLkYb/kp_֣qd0PeOeww=SZY|Y; ԭqB]z4]:O56 uvpp;NL_^Z\j{NZqiJH~;`w49x$}53#GJ1~}ڱ\pL$2Uc3[4 HY%yoM%!Zh9R4?ͦcЪgw P@WR *A_.^3,Gv YkOlb) 25&C4 y5њWyTeo!24Wl9y#F[přCǔQHZ! aD}ټizi srcV@_UUx7 t0?\>\@ mj5ڥ[~1?޻aC01έt- N`RZw'y:PABȺk FT]Si{>zY i}ܣo+s:r*[h*X}3~z"v"_BYbu3Sg8]Yv,/N*EtMkr[ (!S$uiL/s"? ўk9#[fF^ֽ?w)bZ}iu[Je&xEX(`׎ʀ _Ɉ}bv..Q|?ׂNӯL F O@l^x1o… 5`6u15hNnFmb^l@xYNnQ z8Nq "jTjsmKcM[|yV8qYs 뇋]~ x1&q1:BII$Q:C$D*,_Ui3nxkI&JwdK(h.1'=7cSjyz\宺&[>x4ڕ`HƘAtmYjb Άзp[F"ꀁrssy;Ex5!A㖢hmuϭ ?Bt`e+u(}><޸ÚeX. Oiq|r|e7"(5Czgtq9ͺkuH SmR8+Yw F霷jdhMb4 9Y,W[ÀۭR,=|8D=G*5pbe;Ko}<"5\yk=1hFIMۘS;~3x݆xBzk G9K>'HS?\k zm79DI%?Y3söv)`! tOHyxc΀c'"F7iohg.K|rBM5GvkOG/t̮C).\f%޲_}梁MG>Z!O$4js-q@muOѸ*2gĕej)t? }:%gJGc**C ODfdWx&s]9FLuǩ(ѧc5(U/MF8<h<"_(fHS*4֢P8] RAz|:s=2.%(͖C 9:%ei'?(KĮPK?aI;Ub8e>7ݢS5\f]!g!:}3^\d&]: ? ;X:gPp#CZ!WֹYMQRݢeˍ-+𨕱*֐n1מ3[|+ձzɗst~o$pD Y,qUMn 8HF(Vua_ϐ$~Z~sDqhfMjLpaNXtduLtZ&KH?N d/=*()"L"Ɯ$18Td.̨S_zBK$0pm{OK3i]~u4S#ǒE\ࣘ@{v\,ue] @~qLQ9#\ZI٭]KN@L]gJq%" *ٰ^7h0 ylon\Zx):~yDx{@D[5I rLv.*4C"@;jn왓зc&s `?JC8 1b;Nͦ9:lg\;t%`U, Xx~l3dEݾ!im橯-$E{}2lE<+ZJ.HGW c|@@w mǀj%4?ϿQY@oc戕'hSo>ZiH)܅?9NH0朅{wsP2XaFk'AD(%/SJٟvѣ*-{H5ϭwZz?^MGwHȬc,%!9EP"!y}Pcs;cB57g}%R_uv̘/s}K Cvd\aUSNJ! ?rzaJXiJdCrh1t;ެ^FVϮq} [.g?7-u*"(A*Z}ѓ# H(.,3At0_'09ܚ:Kˍxod0ޞFmxv6W-rRQCI\BBR$pK[G\0۸&qoRˣ6.|2 46͢"ݗMZao#qK5!vJǩ݈V쯕QѯudvUxJ8Pc ;CI fͅhSޅ]?E^AoxA{/j2"WyMk5mt(HDUv 4fh %eZz+o ȳoňV1ֱ`53 YL)Wi5pA (tIeuOw\x=:ͭ m[_9#p:vUP[w]/{[\+y8͞($h̖IZYE=]&#*h؇e|t;m( |#d̎ggۥҵ|d)gtQZBC)cah=xf-?{j_y,TV3L˵c{pGp1t͜} 5ɞ{/(]1r8MNߟaolf%ar/!%;Hwm׽Ճb{Bg^(͆#Jom?=\1@gX> -Z:2pNӦ[m9n׊>ehDpN^cKO_YQvk ,BC rueoXl2?\QVsfөj57ߣ^ -հѰwAUbqa1l' OmtL̡M82[\qJ/ Yh~ǟSs^$_n[ƗEI56ow[.)uŻ+0;e*gά 5!&xёAm1BטuIakaa^_tdx.O/da.!􌠞c8DoA~leQ++LrmHUK#h l .V&3ڬhRDN:[ Y2 G="V߬l&E fM5Nw|LJ5̗z]1[%\ Weۑ-a2_\NI^#i90ףtdHsT 2AkjrV0o-"wٕ YɖQ3+sVJS!Q+rq ޭ;v1܏2+ 2gKȘ2S4qt s-ܑ4rzd]llW.N2!#PZ@v!Ybn{ualTn]HD7JNP%mL1(M=Ქ@*Ԧ_ح ulmO=)ny>腈a'(Y V fnE : ==y\?̃ 9 i-_q~Ӿ#)oqmj87XFDvZ[ I|7B߾àgFisaGؐ[>0in'}/C`箯v|PHoT䖓 ʚ?p3 {wJA_ ሒ+_ޚƛ}pSs0cAY Mp/e 9~ŗæi *2'rU`躯ҥmh# ]K*1=|T?KD:?U[-o :ZϸTU^#mD}䧭_)AR`=n<쇨zei+ʳSD*}pB*:Myfk!.1FN@[|ŕ/uD<{懎o4|n[_&mT[{,u Tfm\tJΒ鐥j4eU?>GLLsOko֭(l 9 %( H'79Eݙw:7F=OV]bE̘1Na-vWfb˛UO^R-2Pյ[Jsbҙf]m6ڛ4 b+'@4Rbž,ȉW}N)/뻱S?!5a:|KtvDsl{]q KkqmPe+y &o;e΍W>,+/u mvGmmk5'(=4Ahps^ebIJ 27/@61ڟ(fCj4Ͷ Ki2Ѷlj#%ƛ#.=BuOM,VLQS"E yȸ{9 ]d=skMt63F=>C> ٤~D(y.PYҀ0%Ln}𛃹I]RFRu LT)h6wtƃ+4&̸ .>ď~ճh!Ѓ Vۑs%АGθ̠c\,aσٵQT ӳƹPvW(*MduBI1sP\OdN|t 1;i}^lxי{1z,EvTdrRgS ,w#]֨4#k/l2v4)/ 0ȱoH PY7u-X3=Y5#x=B^hZlc&#a3+Nt>xPOygBtptMeQ|gyPțenjt.C{oO Qqw_oq_%TSu<ȇ3g΀“CY^s^ALbr3qSsz/}πR՞TT^ Qݷl=(D^g}ZPh?8OqȖ_[brK#u3m;V ZKq+THZ̃.:Ii8-)F)`@35rtLCn@_S> o[.'1tϠt-yS\? {|"u!g0UwV]3)A< u)&S/?s'?lk^0/7_1ItKKm܄=v6mLgn~o`B ,YL$K2V!E7y[{r|ef uz \O0qbc| 9Vew9l>?܎#M Cx"O:z ̳.3tfݼ_k?Ѿ9mt"<86K.LnZoiHØsu+ I^qeGA]R2vqS)vNSȾɏN$#9*[Y4<ǘ/Fsf[y!\ ԉYB*stD܍ڈ4s'~PYh  \X(SxqRW"oU^^*J,#COsꀕ q{Nf٤w Y@HVEx}@ܱIltȆ8/٘WaGsLx{ jߢnKuy ;p,x^**Na<7CKs \ts]"`lp5T߅֕<,xdsJdhMpZɰ ݿىaaרPJCgR4#x̍M ji4U?©=O6pPRa߇T?U4H( IԱGgZ3J3cp&m %6^5_3 _A1ZW^ZZ7ܬȏtrM9{acB8b}(bޛ2_rבG2]0N?gި|]5\v-$^=^4*u=Ƹs>u֚wƠN[D@*,p"Jnѣ0=dɰKWGJ;q6ʲrMPSB-y \haw2r˂զ4ʞYs3ήRb7$-vU c mغ[B(l=: "T6#ݙ KQ8(ڋF =?c3UXL&Y,7Ӊ|ٟSW/"=S]m9J(4>tgvg `zU e- cC4& zzߏ-9_Gsiv@N6oMxpŮN ;R~|yh5`MṟoUFK Ӑuq+.58Xks5ˠ"}+VA"U< A,Tn4zPVR?, eDK8[ӏpP=‹'ûmb1^MA<|fBMT<:ι^0.3`uc(T=b p{A6_3LbGͅ-%Gl檴9*l|E"?J\ib٪ퟯvlq-ȭȉS 3Rџ{/L? ؙ)LUy[nǸboWcKVgshՕbV[s(6(ބ~MpK9PmvBwt]!”=#Cg$uxNr @*rIz?n,2:+S(U﵍b.>aeY؅PZº̄f.M`ۚ0U$<}?aDv*F(I`q-G ~wҧ7ܖнJS4iw=e/~>M0hRlbd'%SI\=zFo2q 9y?0? >,Nfym.tF':ϯ6G+$ εaE ӦM2Μ[\$Qx1@VegDdϭ߂WUob߸])^>z}S3M^ԷkVؖA)ާ9xsda|z_9U-)0Ordsa(N2SQ]BvBR!E,n976w6T&8,gv*o߃,~N==+`lĔ7__´ ? 7fZ|E>++'zj_wKqo7oXSJyQepum_©i<PevSVgU1lO v>ݶ}w!.BzcɬDږXn=|^=2dͅ%vӭ5o"FK>YVꒆ,&\l) 1B5=Xd+(|U-O$pE=3.X5o9EjaK:n=mF}R$XiÉr5]O,6B U$ZWkJ*v2"_,ޮNdjͰkܑ0 [4^_ɲw`VfVCN2fBy eK PMmG7CCL%pm 5-6m^(5V|j|έ5#.KZi.\ZѫCPHV`Պ ugDkCdql2wV&qOn ~.rkWXClo%f}lUɑS:̕LG%Y` klqX3kQiѼ0=õvVݜZ4ƻ9=F/ƥ:V_pHO)s)_$揨݃"?*)lk&Oլ1:χcqt-cډML߂}g}֬]pd&qaWΎ-:z@yi nWe8 $#$»q3G]/{ƻ@H]\7h_׋ɛ>~>`BݺqfIdž(@ݨ}e TkΕf%\QPNizv^[kw.鳳5Ch _ 9#P%~j(1 xt&dh<H1}rDYiJrp]mi#GsSeAmC߮) GNɆ5?l݋^Sܮ{g=#Su.KY02_. ,@4qϩQͭZ$r̯֗O  CFR/O!? pnb81ҢWF^{Q|e9s wTֽk4ר2V\-27VaS?vAxMPOխܬ{iқH}b\{MRDm[ym[K+cDQJ'7E0T[+y7%f@ )_wMԷ_>]g/u{ U6 ˖qէϽ}VXvo̟kbd#X{Ҷ`Q!z)'9Gm6c[P] p\wA*]6XiV-1mXiv{e g~}]~35wAEgo/zx"(*A%B %L;kcc'v 9$oQK{Hzlaq Ĉ5ʼnkPWJ >ʫ`pzmdGz3xi8oSnr܁!"bE:=TkNR+hCN" zchjMD럳j3 )>L|dKeSΙ'C"z ;ά&?Cz]'sq{b^)y|p?>U*Nk]ڟ~o}:;n-0O4SqGUE[R:\i}6Q8^|/@h;tIixcL;#\V?.?}4r^5RbKFU^|*VnͤCJZYhN=랠}'eNj4j'>R{\9({ /z.O7δlWpmT"ưhP0,O cd;wx7!2䈁7jz@ܯ|.%DduPAX7F@܌Υfuu0nOZtӔ Ovgt'7h[6m(B3ܣ(mxA?;gVrz(XHq-yTT+iHkc.ƦE)`gTgǢ8u]6=_=< j؜Z`kZu47DscԮpp3m|ƽܛ&9qgG>uLM@3xGNz\DSOIis8!UBW2b L.#"ޅzGJ A˻d|k~jyNн %j.rKzT%LZ,7Pe@ڴ=7&6ugKb:9߃RQXYC+Tu8E`ovKYhaS(x}Դ S"[&]wQl\ vث؎/c>G码":m1?W%p[X~5<῿FkfHgsׄ8UgNVȜlC/]Pٯ0WKkoc* |SP =ǥl8ªTTd ]4ī@g4lϻKȁ+#ĮyrYlSI4p-,F1˩| }:i`̸m.,s* /qQ6h(fpegӹ\2QZ07S18,*î= ;Tz rU,j$H4Rzn/dx?OΊɍ>t\,{Eqiѽʆ5@G ,b=Uw-uGޒ ܻ>p$ZНD Em`uTd} cPxX 6 /3: 8#r&:gH#x?~g~-$9xԦP^Qƃro.] s Cf἗9Ĵ#{Y qֽFz]߱hۜZ:[*;L}}${wؽhU|fG:>$eQr6EuV]̓TQV;Rk4#~Iepqxd!'D0Fޖ?C/HH7 u 7 yWo{:"lh13>}#ePKKL2p`į43bQɃ`Wl;Ixe?P?o9!rdn)q"(1y4":pu.0D&{M1/w'k.6HJ#pA1Ȼ8CyoLˮ=7tX yn CߦMW4xhuԆQbF[ą3;,d?]a"E"1LF~_pŔnKr!x6<9S1+ 1W `eĸnWpQ3M..H.HzخF[TjK`4^rE hщMpu޼nY 0X]t0kj>6UڨT|FlUqSg wE}:6?r -Uh/3s;Ϊ7yǓ/4)[-j夼y/ߪ$Pme.1pV 8mjeį_UO+/LR4W\ILMqO6/(Gt*híPdI3 SSnSӅZIzE;ǭ5:wC- wHS ?v~SP/}0Y[_Wuˡq$2 ;I$,Ud+0i9ɐE|<2SsFzEc` b:m`H9T ;L`WMQA~~ǵ %{G@G&OnUJۃ1.#)Q/CQq|DUu L';Fy(2Ad]jt'$6FOh`G4Zmv8-L~rITΜK0O*fxGm^;L01^I,bkX$Hp5]?'!yn_fv[8'[ lUNflg|{, H2%)7|=Jw<_MtEk)DԊVu7m hNL}`r),}A_QKm%D/O@su٬ p6&`3BO|@YZ+%BS|tupv PBЉcB,4)&2 l{gsەߖclӋW$ hRH*7=j. : Jn7H%>[z4^<M7H)#HKR4+A_/;݆v9X _1ćaTɁM5a9!`QowtE6,WIzri>Uaħ3"Y-B$߆"9\IpndբPi^hw޶ ;^0gz-SH-gU[ō΋uup˚{ ooWYbCL_s:-MH3M3Bư:-f@c| .v.*<'=ʻmGK0@5ҿr|' -̵ۀ3*cb}y,%cv(8dV3ݬ̒UP)H[n,{,RĿhG\ @[VYŒ6N )r?32P^>nwR0x"}yw\fful exź6mOWz̥s!pnUkxʯ2X8n-篪-ft\YX+.k. 7yoå0Et݌Զ=X"v·(SF0nA =@d6OU|]v˗2IҤ뵨Ft1+/~;IY<72 )!x8:gC\5u~Gr3<'$}-5<s]@ ꎟ O{S[2d!5=^al_L0Yy3s&W(J[ ߨP-DHKŕ@S/Pѿ=}7Xٝ{ԐѶZ@4"љ'}W {P`8vZA@z(lN~ >jm,wնTo}/!gwvl֛hsm]cQ;~`?V kQo2_ګfu27B-19ɘ.F{2oys6rWmNd!+SBlxy>Ͽ`f_D swź>16LwvgAl((hrEGbWN3zOҨ&]mvK ;qq_iG/l9Y9׹d憔#CY_#E3<4ַ}'_' /Hu3 ۪'mB$Ȗi%GjE ;fה -<'S%u"9()/ -jU+z| ɳػ'ÙV6 3iZ)9cGaL?{Mv;j825.5%&i5|FpDi]]'Wd1,N{M~ߢoSmM:7nAC2׺CfP?[7'.bh0e(U b]FI8&/br p\FQ:֜NV 럴FB|蕖-60׽ 8} 엟 OHȵBwޙ .]@7>08Փ_\&~k3aݴ<a_|y!\Hmy 'c7˖z5J~\B,;i¯}Mk;^?mw$ B21-ѭdn0>,0R xB.[aC}\ꔚZ"ehe VrWT>^Ѣ![b{bëj3m;58Q,a4߻B&JE9%9Gi/ Ij.5uMV v8~SK€*Z&ZїJ'-}%^7B qsn7Vz(+skL*\n,F{$ikM_5m `uHثȯ"cZи/􇇊;&3U53˖I\42rǹ9tҺ['rKCЊciZz>my*V.8SxU푽S)DHDaSq1ܒ<Xaʥ%6j荟~ 숁&KW_OQSe|Z"sa[+M9pl?bCFx4p6m |5l>9Hzv-'>{ox!Y)՛X+QQP|zV"8HpG[AE~"Izh. Xv{{c:y/1EɎ6ɏ4e*sKNiG*ݛ\(TR6gi95XKܹkο%L/TT9,X V.E!˽D:sKBYw]Eli Al^~hG(y2Wѽe_êЁIε?[ 7;N;Tc:nJ? ~;~';kThp^yaoo/ckK᭒GTZ[e3{Mrq,eaX;p[F;wB!n"Rۃg?%RbʍhBY:FtixO<𮣔 αa}=ĚSہ\B1x k?v 0yLԧٯ[B^&ae)ۛ |[NT#z8j&[zW(޵Y]_Cl. B8~!PDJ$Oӽ7-|#=k_ê]t@dt!u|j]{N>_; 4֤wt:n#@χ:v=ɘ 5r<2_$d,b&~N @ _l_+Mog(6[% RSPjn ^:^r:Hyt~2;6^l{;Y$&X_;/Ma΂W_2f6S^|[܈{bd۪Bו hZK)ufs9o+ mvH*F{ezG=,ĺBXv0vḓfMOoc 9+ƒg4{tJǐ[qt~~Oؙ}ku kyReґ(s|hGЬǽ0/f2bu D*/f.r!BMe@7CWb40H,wcKɳۇ$C D'<@y$@6/q rz.e9,LQTHl"Uo<@a;{)3b7e~dm0WOpu]Wj&ׄ[CxIKkf+9'bDmVU@Y[|N\v~Y:gkinRpU֑C>"W2AYYpU}~lBkz1/\"j:YsR=XR*(v˿>a /?$g%1[ȂM->G<{G "C1t j"*4Q9!#;:i PlZcU_83 :mr_Ng8qMY}9[e9R'~ä׼ZBю%g{R9T9w˫Dl]Ҋu h KgQ =1Lo]pF=I?3oRiL"3{Z8: I}iH2Ee(Ȍ"|`y~PU} :<4&;^{;zc=xg߉y ZJjJoda2$mɺݟpME>FV]j  #glS0tNLm`A પnh'+`/sos~fFCt3R6 /ΐXrʹ溋Ĝ.2b )DPMY߿hY8<୊NMPn'͞,ͨHϦ G/]0甁gGHN]ưhN`{/:Dgx3[y% q(p@ MΟovS0Wnm7-8Lk<.  BT@Sɸ;I@~ÑW:h~^9{c\XA8A3#R:\`89vE$q}=tᵫoKڝQAQGb"mS>U6'ltJKd] GÚW٥3cXiӔѫhTme~ֺ- _O.f^P[e{L~ٟ-".qT)ܺ%m{H )=v;6Mv j8X"(?oMM*s3; ZIpuS% % C*K5^/TyK/'Y0~:V2 5n(y{eOVܒ `?`v ?o{ԷD9]"%Xl9S4RUtc9v`窲5K>4KFV@m+cYKjݏRpqҵ~WOV# 1jʑ~rnwbr}q9uoBubFzDXVmGnW,v{DdTX Oe^͒4w?g X O,*"+- ,pkS*/l@"&Mx6.$&}bHx ޚ[s6szW,U" kFJN(('@_ 2-SQ[ѧj_9{:Mn.Ѵ9~n 7^9h̗GPz _qPuf ?/]2JbVTzCRX>P|W^ij; o t,d8MŌS CX!Da%Lf7[lR_g{ :߲q8t Z!?ѓi?30I&g@pFҺ|i&'j.Nt5)S Q!bQJi/GyokPutA?ձȺݽ,K V.i6qz[r{  lf=g9F:B\2JhUa=zMu@CoZ8]~#%Hٟ}Ā1盈HGȻ*PuOət՜%ѡ{(Z&]@-fWKf8%b3o]5vs˴n< 8:QD$.e.v@Mz!ِIVh0X7UA:e4Yu׮ܐSUzD'xּ%`x(v~;sE vͭ>Qkmr%.Vy=3٭IlnlUl5SJ=\r4qή-T|A$[޵w(=&qGd.̊d+պؤ ajubՌx;j5BAe "i&Om6ږ.@Ey%3h3vGi3=b]AFme>{ZIV0&nQDm?q=`~~KnF8/cWmC}!?!]Wjc8 SP옢hsϗMcqVƱB(T]: Q䖙RW5BoeZ>SܴŴ>ٛA%/P:z)PF/uz׀ k)w#piok~@ ~Gj܊BxlÎ},SN?HBcl^l+~͞cm zpɛX;fe+ sF$tBS_G;~Z{bOZJc+> FnhNnUcBYIj&mf{≂CȫĘga M7t(4t;GH֍66׼>oSb-:2 *;C٥JCKzxG#SBY4+Y.EOOĽCꇣ QnvX"ɤK#;ۿ1ԴUd~#pܛ$MǠc爋Y c^T^xi7ONv\nâ?Fu{l w[90C4 ޛ/bwC?Vj*ܮw@Y /|(zž'$ ~#bǬ.pE'6E}buU9-1?&j`Jmn4mE>B^ɪrTa4k=K\+3|tfx8(i[G s=?`iă_҅i:/lqO_yIV k$fJk=+'mﯧm0kgi[My3z\ ^b9n!!׽!E*F4(MsAag^eth򡫎U*Z/H}+GgR9,E'-Kr{#j yaiӭՌeB yeA!j^RQ+(;$w#7p@ I8*xYoBj\ZXR7,uuKφ_Dukƪ^$~M@=˨>\B;>DIp];Ό4Axa1v1?T~~1JvgA2` $T}Al ^.Wf8TA9н/a8>%@A:u-P"$˰tɼ })XbT#ڍFeW\i]ykpVﶕduʳ~:2 Au_91y dM!e5S&# 0+WK(oyugCYҌp1pJXRsAZد׬ 7HB ]ύ켮f0, >i5V9g_䈂~c{U9ܺU[~e<ۘ;\U $FJbT g Kh k\\ÅVi 1adudP}^؅i)VF~H:&g(=Cov3zoYj.ЭF2L4Yc ԔLz_eto28H@ڨ$r^_l!\ޝK *" -50ੵ19, y*flc%GWNcwۃ?bȮXE+d#%6GvfH+2+$$!rrTXte#B7KfS/oeO@,M:a(19*re,ΨF#vpݨw[@]/r$הk 3A"ޝ﮽A$k.v&IL*` =R/80sf# Q{:䎦(̳[i HaPGWz,[7Snp[mΛGmg +6Le.y_Mkq-U73q2N7%&osZ՚KŇ D} pe̎YJ< @'Y= eAeM ٫@M9b+ʘr# hu9ʜlv7Jˎ$`&+>̧Xs 䪛&*ߪYem>JQɁNnunFٌl?16+LЫ@Cb m$X5/tzzQ輻o2sN [m4 ćc;Ihl?)< {+-khxjq(,:ɹ0ySE4b!!K4M5^.x%e]Ue/͎\Ɗ3dG6# U+uj11_~Pד8Nk40fXIVD; EM/o빗(TWl4u;ߐ<Ss[ɣ?fY>sh_\6jw-ThV[[EK x*L9SPQ׻XG (AҡK{ (q}B˫2A僺S\,}#H'l{Z~LvM[O2+5ϫePb(E|nN0:oXy.-16Ћҽ*YA lD =)C T[¨SO# a]\*I؆C @'ovO>4ъedMlmkf{Raz?v@;qL:SuLk'_շ4e5%IS?@ZdIonIй]6gzu! e$ą'K^Ts4POW³CzăLс49I˹r+9BU'gA16~$?a͎d;wl_P p+3 <  6u-dlȹȈVv;i)-'%도V{nb(\b[6mʼnd*^ҷ3хWw'Wd8i9^ITy'AQG8\0_yɫ\6yʷS/-8-x-Ѹ8&FyyBY&b ?~7xgqvΒ )ߦt7|t57h˜3FG,&SMRU ɣu5-Wn#(Wh? OER! IGtU!T4En?>(o9 ?% m`NmН\F2_C%'$xQs$d{ʯNqi E7!4{`'cs?V%k=vһ[62h6VZD _t$D-4 ,mNQTpOe6,"5CeKt!qV{?H˂2MY|[#5w8(=eP>`4+;Ig:!tiD3)G]Wr@o#}A_(P7#$<vOsNw[Enh"C#QTi;k!1yF#TmXM#bL+Zַd?;/ϣ=ɕLd4Qtsڂ#Q:PϏe^;d$?|]}4oFc:0r̺+G3B'V{p˕jCn  T4$ʱ({I ¡U7^1X7%t)ZTooܜag3(*a7x"o?YZix?_TTe$Uf#y0S"4~{6Mcx(+KZoq4D`E ʡ:+ -I0Fg,r|fk%֝)pkF.7.8GN;H.Qw AZ!u?j84dz)lqYk;}zeڶ_MhY7bc[◦%}˷ІBx 3SuəٴA^񐶫4aJǭ7GWqnRxdxD)]epg79zl? l–ɖƚƘO^W;4 WIv`h~Й64./D%/-'+Vz_oAQF4k|Mj pgOi]J]tg[fwueaB> Nؘ$Z};NaMpEz'+9Z6C (/VJ'LZ:%F6[ up'wrz"t.v+Yr.+~ *qjv |Jd?qI=1ǫV|ڙ,geSbO~FceW \W?FB#Tӱ c穓m9]⏊>Ez:t3ܒ@éhee= (2P =)-qN/=gs $ͤP3P!Z9b:K6cEɝ`&0p=W!%-I<ǺWcy}'Q Z+#rjפMk۵tn q;ղm|*kx ~q~ЙoiN,20'!gu:6A 6(>)_ 4;cp?Ф-(*@i% Oj-Vށ9G-[[*IV&4Q˫l&:{Sg=gSQ_?v ]xMN ˺7Gnב`;37uZm3ڗr)c`d]Gf];ˇp~ٙ‹Cr7as ^ꌨ$&:t }o:it ڛmei܅>ZkBǁddְ0 @~fpfm9+J3k *2Dkfy/E(H>4tOȖVx SWv4K:9Ji|B6_oK٭P/06x5~D6,U͈e1r8Atp`WP(7CWEYH o6d2Ѧ=ϗԉ01E~q}P^WQ شڑ\YCLtI]wRݜ],_OdLֳB6ET*GvUC e%dh WbOM*g@۶_cuKkK|U[VQ'7q|aHb*U EY6Ր3s Ȱ|IR<9m:^PVd.E ^8e"!AB#Z&|Pe / H0OV@\N0,;/?Ho)<`a +VO<ȳs"k?iǹ^ҁ1_ @#J&"sQ #ui< t*wzJAv:(WG (f\&gQFh!tUh׳NZA9W۲Z}XKD\%Je˥yQ>ɋ$`í#V3xmg!U}p' ,- Gtmi/`VE 8" %MqЂ]-bL2Q9}u(3\S0h/Pr *܃VYz&bN-!nAw+& mH, њ D=]$%DG|r哷 Aa@|հ.Awfz !TuOr,4]u@b<GX9!Cd=v~:XSbzn49k:[O,I>4_n2[>i.(ܑFr9pN'tOW\ܓXtd]7pL3C/Sۜ5"ԋ\3Zm9cѽoi 4¥FW}A}t#7ӁWfj)3is|<#e/h<^]lkv}(ԳJ?{bZT. aQibSr<(;bd\PE񞾾$ow{O:|^ƋAID0B0YleyoOE}>f?j$am,줥s}#Vt30l^[ 4[]Hj5[fZr)fwJE_M0DLh q22R5X so_]F`P.+Oݹ?m? <N:.ü &l$8c]:ߖRdʝY@@_nVeL$J芵d_ )rw\Jڤ=j?h qey[LJr0%*~#T|i{O3*ೝ :zqܣbJY5t;+.pu;죞Z=Jxh88zVOIjZ6rV6o ˖n(]VSjyywyIox_ mq ,9F۬6gTkUq-lBYۋ#jk~~ShXH{*ҷf.V »g/nA4+$::6,E9y[3E0>?]aޝFhN`>P'4oLȚ;NH6CD"AS ٷ{[?(~-!Z,F9? wO*x:~MVx#2%#ro>D s.:WFH 3_1|70na_6tRˈuQ+uiY-FQ Kg@A|h'BW%bivՉ od`]ACU9#+Za|W'x5& ʄSIDĥumwwf%uhZnz(7,y* :E"g2#v%"p?FnEeXf| ؠupƜqF (YX,P8^`0 rְ14^Z<}䪊6%t$aU=M:-{@ـOsTX]طX(qb~Fx"S}',7g aIoo܀P^"|xWnKVA0ɇ|A@uvDRfK$wCC}SC6Wky |Y/_B\ u&n7!F`:k},k~m{,v"dč(<k(!Bʨ'~@JE]Yo7j`4TjK~'}:ANy'vz/{Kf@ UgkIܑ::ymrU8Կvgϖ/P~ݛ9#s [p0@_Ag5 ~h!#)SÊc % =9kZn2K)oi}g(Vzlemdϕլb[yBw%Py#N%eeڊ%D."\88ͫ<_ՓH@"|Z {  XATתƙ̒+h9M夲.uAw:U 00Vmfj&5ު%4 a8CVnL%ZxiUUspQ~/+L͎#f$0 \0&mлtS#:kwFY!Ƞ9K#44(6lXN[VPøz ksYA}HAXpTumcwrw=Y]$NTӒc(<+ᥜg- 6'4ΗEh^VP8ڛ5a'ATQD y!3w&Uq":kUzg |ݸhy18:p5cAef}Wo ?E0AqkՂ>Ӿ/ᄼN1Cl>q=:ɴйTҗ! ;.5 æA-R^Yw#+@4DOΣʵ~-\r|1QYiiN 6a,RkBOD_~=SDCv@/M:怢xh~8*Vw7Zڼ2W2zc]N8uXf32VBMZ{KDnݐkMMo]nbWڙak\:IIITZja`'3ӡTwv/w k RS =ڜLיݷ.,^) ސ0 W)us3$¼-Ee>^Rdyt{wi-]ouQ\l#9>{S 3Lz8 mzʒּa6_&' jgnTQbN`2r{֕31b0X7yrZeD8\{ڸ[*,O9N>/^COaDܘ{NCJ%e/G7?Ǽ7!i[Ip<]N6uBxeˌW /sI?^F:67_4*2ЩN# oqSWi$@]%̆n_n|Gn fRV-ؠ%1@~oaȋSq-y (ZLKc\ܱVVQ*eeHJ YN9MwB@^ Yi8 JUSʻè~x?9Pu "|k̔F3Sd],@Eta ث,j /lt> '|m*yV/[J gױO[E6Aa9wv<0ҧ 7sT1cIIw9-xkN]f^HkςormrqQ:fbrL7iu%&_*:!yqO\=A1|XHŽNkWyH̓=pgB?irKBղRiڣA`o!D8^f9`Ff]f޻smEQpEk%ȏaSrېXݺ~s'\6>պc _UxYTFo /ڒs+}Om; Zoy{"G*Kx; m]́cg*ۛ:m/D2&:UBlv$iwSrjW$[!/\‘A0z\#!QV~> OZ7=dd &/1 KLjf_fW@3dss}c`['z*hn,^;,B>x,|^2m7) ˺l/ +>oTug|ewbκ}ɹ]۹WO,wSb\ߺdٺXs:[1 hVwxQ|* HƮvgZ STlk_+l^K;ri܅MTyoʭ3'a_ׅ$)!I7t)}k`ގj n:$b̻B(U-LCF0gJ="/pTw%|KMڕސrB =n;k^m 4yH:|#!~OCQۯ bֆx&Tt:È97UM0 SUwM@ʲtl,G26+KY!/Z W;qUԜ) ǝWv:~*Bjo)F )1;0Jҕ#YVтۘES,ZӚfçD@=b2ngfL%Tr&7}`6-Zͬkr9dpӶ9ϸNwE;,`1T%nTV3xmNߤ ;I_q 4N(p)%+?BA/x͢\VY{F8Vr9o)X}WVN1-,\m:LgZg `eQ!T4܇LG"6y#O=!Z ;3Mu>؁$pgO鏧{A7| H}e2NlG8Ym~6#f@:b]1Zxm1DoedFòNvɧ2o /\]:l⭽UtʹAcw]d5l5=4ʽeDXf\TݢdWߎ&}MGO@S֧]0֚mE6rO^~Xےj&L$|^ߝC5r>O%+j~Qt&Qώ5 /V#MvJ=p~y8 y֗$uW ,C+{uF D#uFXo:LMӴ^(:{SJ .-bKPfax<0)pfKe xmy>ϷW}Em$RΘ՟Q=iV{c^ )mԷ4mrGÞ oRk?M\Yx eo}{P4Z3WO|q3z+:I1P(t>\{ܙ%>d*dDLyNos,Erֆeé!)+!voL2?\dfm~;~6CŰkG;8l޷|ߟJa/52{i:4j 7V;KPp%(POwTnnQ4J*wNX m-`jx~!1|aqh'`C,Rm\7䡒R$ ҵ}8lN/]-5$|3/ lvkѦSy R{lk wϜ)g1,yK iX|s]V_wӣ'G p[ W uQ`>8p Uܓ][ew{w9Gt%&qjЍ_: > #ܘugefxY_10T1J2]n~|y~)k1jic )O qS_7}ZV ⚉Nw@m|/ \nmHL$:.Ul/<$"nS ^x)9e[l>Y`nMpˍ7T&hv9Ghd#|yh416ir{^\K*d+_iۈbrƪ)k[GiX@Z[8bsM̥(l-%4@t.7om%*9#|4+^UL_pA;*,bk$I?]i;nNc9#b$g돇%ruݻLMZ0av-:'<[!j>xޗHVK.Jh- 2Y,vi_Ә_t 0Ipvige!v;^~:8n82`8>'ugqNWgm7[^ڽu/N*-S+񡋶(z'6셫Jh d_FT v EϚ~3Bkf> 6y'5{ztL9<6&W8ߍ WƐqӰ>xvqdXFrC-ko)L9hW=I@hȨϘX^.rH+4hpetC=?[9 gr X֨UIz$Fih.m] „[EUdyx+ z^wnjtB4#!ަM0 "E]Ӿ {f_\ĮZ-:M5Ӥjpg ~+Yŭ^ădˏsYԉ};pA3"Iy)Y= 31,^p5_bm6hEqmVE 0!w3{﫦s_` 03| +;ۭbrM0v4jHQэh .";P0: ppBM⨙aլ؋܆2z ͭG="U6~\J^25BѮ.^=%B-a'ޘ ni6M"sbWݪj"tK6k` 6e^6h1Z OUL;f+duR[(htOÚW$;e|QDo%-w .۪>3rW V|"I{y=2V:GdetMC#W^#9o@];@̴vܫGr6Wü}#d$*˜hX];3:S&ַ)ۇ蝢Z3I B[}.`VWֽDPf\dj &f`zS$FJ2h|F&$~TxjΞ%vT,ƳkwsfϓF!&-ݖoּk+[q20O Md/9^hP&'zJa7}n0j P uQ^ Z} ]gV{w񟿙^t|3E 1*w\yΙpmFT<|k)HI5HԌB^Ѧxl:hOٕ lfA?"q[&3~ȏJ9!u`3ž>WՀԹ:%\.j@BC_KYEwxq?fz7^^6جn. huE-끊;2/؜5hhWV538Ǎuc4:fJ$`ԯ0DžpF;!(LN r <.i,a;_Ubi׌0sUgzkKT :׵o6R8'A)[P20קbZf~Ҙ0B0IFf]_:oXrai>b&z@ng`Zh:f} i:4e)_-tۧm_=h&9x*L7w@EsU*5#=v(C~G(Zh`UjL4l5T]KlMmOz+]@[.P&[xJf2}%y̙zdn.]*,z*O?)WײĞ"*aKuREM _ˆ_WJp)jh0b?6 `jcYּTjH|5쩒fƜgMw&wYjF͚3Iѣa:p6/5mp$qnIC8U NTodWv %׽ڦCvP,}7ۭ:_Ou{7{S~{h6\NuLBx] Oxd粶*nj9՝a|-bi8ĽP.cz/j4Bu95 PW :,JטBhlM_]wj"'iKI6/"s+A" ORۿ;EG܂Y }o\;[5@~Ȏ VF e}Pfz(M7lA\3D}sl3UFݹ>۶UwߚbQ/%%IW}~i%2~ yz=LA8-4Oh$N0v, ^;QS]s,*wXo/oUg B+ sم;**! vR:w ӆ}~QK\d9M4v'?ci7([3PɃ~&L6|%>Zf'i4v$BW^μ:ʝv TAdYG,k횄ihf}8x|V~ ӯ+;a9gf=]lmrNTBݯ%Cy8s{A_) lz'P;,guPa YClf-pЗeRF"h&>#׆seqDw.@ Hn/gvVV#X;ç0do?,?_8(q8'l*ֹDE&W<%ᛁʹ66epx-G׷ysgES(ŵDZ?fy=  _~dPAk~0< -.bOl^iCԕVt[x?-eܱ4@B5~gov1QBf能#b v5`eP(&,bܑB)n5 jc;#LeK⋐"|שb+$UmZjt'2+@webU~}yH2'Ab+Ϟyx3wk:b1d6(1e{`+ {l!r7ܒ[bZN׻ qtAլ,fAo`DAgLj֠h"!",( NE%Ʃ G{;Qz]UϽ黰6v/VݑT$(}Ozo;{b[j$kdd#+tr]Rv{cs ڔ(yH sg0K'8tV HQvsTe^ P2| eԺRa_,64*[ ;g}qy>]jt%ҧ,vԅKI(/Y-B4W{Z,\E%sK6+=W5^[[+:iS׀`P;`K]2Z\c~)5)y]I%X)on׀pB77A80|Dfy+8ɒ W˷?-^_ĹZ!pwNA셟Pd.)>1:#(KjL0de9].R9vL]_m|bU9&µC) =m Q FS\%A`mW!{gx'JUxވ:?51ގ.. T;9}sJ(jR覤+ mǸ:~-1OIdRQ$8<@h}X5i^7?`c0,Fe7czgT.VsEi̍K v[zG:4C}g*朝u'[R p VŘD!}C~ZKeE }Ek]x7mv~; UN>X~RXK4u|6~h gǫ= Z)"1'~{~iߟܷb@h%ΙRXRe>U~n|ד31,I%[.1kUt&2Hٓ? -PvJj}Sf$ha*Pma`%}"@jiauUr;;o+Mr\#ll =X& 6Wy3p C}tU!5owզn/oWJgݭeҮ ~X48!=t}%`3^l" ʋGċJ)pm nw<ۉZS,ZVdz^^W= uή-3KG TAT e}i[ ZErʝ߂/DJaLO`c/Vv^d$gFfI[+W'y:yz\U'Ա1alv(ӝoGAfOv5ŮF^LFl~j%=R9ja|v`ƣGDf |93"Ҝiu{v~A4sӰf\^eSs }љ؇>)}_xGdeg8MBzTv,'xkP( xYPt pS"Io%P哥3'KZY|Lo(:nJ]%X'o<+pUjݚGeFrIf!(Sd|#_B6%\  fu_KO4=vjoa[9'9jCԭuݧb-тt mvn̍:g u:j(<;DM6q>0Z իhX/}Mey[m&׌Y/U yc_2q!Dav 􁄡҇7J<=_. xދ;C듒D)xzw`W+_Cm. Ÿcn "E}1E18 N7^87xrL+\G]]lp.KX?=CCmcӮrڽ ͹~QP=؅ʖ GhIc&Zu/pF &MË_mYm!3>bq |#iaϛdO-=#6_phXWŴ0x|lkХK"_h.޲Ɋƹq6Ŗ1 3[w@QRh 72#C 'Wg=KnܣR1-[녷giG[QňWȾdr0Zʷ?/#Kusg %:!~g =!8`hل~Jkx{)PntA 1:_Nc o;)KE/1jonWІL^HNҿlZNqX~pSڢn.T=lNRNW}1pݸ4 DXށ Xu^Bq05kU[ȸ+wnd"ݍ9 ݫ;5x¬c:cՉzYQ}Tmg2YdCXu<LAEA <۪O'~%CO/v ޝ1]blՙ*k{dkXK;ZemE3O_,]Ⱦj{+9z)x֝Y߼[>=cj0\`{ B#r)#^dG*ZYgPftto(_ rFX8$m>^mŒ _ Ӟ#+9tbWd^ҴGIBܧGxs7=/ͻCiE]y:/etmZi :0^uN1!C`$?uO{`{EY# vHFğ gu^ Asv-#[΀mN_9:bGTFf}\nLld Q(KCq+jNC(n>ė5F|; '\d7fJ!ΩP^ߍkՂd)}xg{wÀ[vq=cth+`u}% aIIf^@Yf=}jO3^o9·aG+PO0Z誄>+NAd oV4+HzXv`XW߄mT}fu?n?A\1ϲ[]fPƇlpڿu1*n_r IE߅])Bn ܻ8FCvR3)>rqo,7ۓ!R21m-Rq"$@&+/UX8~Fws]h^VvYYQ3h-n1+ o@W;=׮2p$7s(<) Cߎ!C[m cfar .=f/ZxUkO75CPǎ~[ %Q=*+hnPEdߕ~p:>3i)h`lϗԌ9,UqR,EґcYfW(.K9[H_-n*bF'*Dk0NY0Ub΄WTpj.M>2zzxq<BNROô/%gd&Sg֬$!+s_߿=8Y Ep]n,|'0-bzq^ +о$YԥQpۢo;YYӇ2ù|+vU iEAWN?C=&}ą=T-b[*[A\= vc Yf "a? V_˳od~- by3fX_ֻ7- &dNhB"!̂.#҇HCaݻ{sߒ7vI*۪-zHv]LBrTV%_g_u@Dz.QPiD&=H#O0"3#sڵ+e׬5lL?MϾ16/Χ %d!B5qXqw/Q_>مyC2K}2Ei{ԏ-g{7@ddӌst 9lL.fɱK}g8%< q*3Ln]*煬hc whCO<͢g;`Zp%Vf .?ꖼӹ8Rq %$Z:@JőJ/|szWaJ(o- iIUiyk? Gn)PJEʧvs窘;/Pr9١Yq+v|c#iJfMx <3|>MV1LRc#;+w"Y1p}|(2Ëy.#+P=)E~(VH_C?%sH17\:]Q^mVOvq!E]z5‰wA7ky9N|!O. NNzFRN9ݸVU':vzCNT 'fַ"Ӯc)Oc'_?Od)UѓL[)hY 33M@ w.%,rl t'G"2󮽝wK}@EsNV2x8kS吡3? (2gpiSq@Vhu{'0~SIJGӵEۆy-m{W])\eS $Gu(be :yM0Ǟ +G ӇB[` y &u|x7VH!5Z[xp)^#8.aKA`*з߻c>,>.OC$ ^%WY-ݥaoS眔A#MNEvW.6ؒDyvw5^V*;ga+5!"i>3*S ВAow'W'n`*)BzsN^cGlW`d}y?BaTKsZZbp2X.f;򱫫 nYZ{˖3秺?q s"6=[8-kj.ա(űG$>G Z8)HKnkbNmZxT \OԡO3tL>rD>Vx1bOH(ztS1/ܺ^_o4AR_ȅ.XS~yއ1xF<,r w^fT'&]8OLtn-{fZ=ʭf>r9z%'l1<Ӷ|xWa|6gmc|]NDZǘz>}k8buf s` ճqZtkuZ%z>g*ˍI:iD_}]qp)q;=WbF oY17D1弻Ro(nzJV`[srNZ?xv :gb.lg_;^O9͉ ܰ h!;]-|q},55FFݻNK86+q}+eS.#=kЪUdJv@;4Iݠ)b2אE-yVV!>".b:#}K~ gbjsbw9D>)lITgȠd._E\o9'butTFmOv.;V2>j]UsaTSy3O1H(J޲ԝyۚ&3YlO `3F4)eFKҋijLn IZw[dakdP:3|zTZKB*g/:(/TgN/StץfiV;ǃf^MBr.%q# 4[oDԣcjZ{9n'" u߶639GqSȖYM7i΁UWXsesgknG-̼}Dgf5et0|oAT6THFByP!S{4ED>uQlN>z,y\ ӳOoɥv\|0&%AN =2NUrOyyqE=Vp{ZE:(P\uzs\/Lׁqa'ZХKQOr`/Q[qҿ59]SGi(\И5#FWWu+7ĒD՞"ҫ{q;4gcle,UZ5m=Vsi.;J~. P O1z\VK%|A_wnwG.  >A ⇓5;A_GTn!kd*cŹSeݡW=D>34A˦)3/C~Oso8zȇU- `a;Pigg<ʳOd]yJ1g7=11tXrd0N?73ex[- eCTQf7;s0* jdGhڏ纊-:toM+EeCzL`VxzOOV|Oy[S4*6T"7?@!Of1`g&VKecH)lR[m4nQ+)N$tjP)E??sTˍk!?k4L 6yW  o.̞K1w旙=0mz̭aM%:9[Uirczo(Y<ZR̢C'^tm9\-vD]Vwjdin& ĐŰsPEvN=Ғ>17 /pA] :}L,\Wiv֩t눕FUYyp'6b*qywYNG t1 u1ZЋ^Mɜ5oMf!bIz2$v\O?j{V뗑IkEn&8"Ysa}{T𗿜csJUDQ`yYGQ \zUq Jd m}ayŷ.>C].3Nz34'l >mJ48-pN+ߚq_)tυ͒HS?>%nH21!q=~#׽.),ܮX>"L! |ߏy5DA}tfuL)=?FMAuO{x :u߻V|3iC 8Ү: 9]ӻk{{>p )"04)\ō<=zd z\u:c}qu}I^/׷9#G9XV"љbhyC. aahVsoX]@y`B%3sfkwal\ 4| Ǵ}0LNv+Nk[߷f&%oWS!&8|C,є21J# ^GO7u/_όa f6`u4sY̴\C7]G)DYRl|awz~N/-M)RՓП z [0XijKŴCrzo+nj8 ș Iibgu9:FRl8b7~:c}4̍w-o_9tpk_9Q8yzjWVZeZk}8.>VQ}<aRk5Ƞ%\ϳ]2HGfBf&knR)(CM/rvL Z97B!GNwf&|mHXpGcIqx@_$W1і ՅvӘ][mWEZJ[^E |/u5vei$jg^K3|eI yN F >MlVGo$`܎}K214S 3lH+qfP9uDqJZ> 9z[ڲFLj RkLFÛW!Z'q*Y<|V0/ɶ NsŴI@-[bݦU]1exN%w-njz8br׽>sG{Ϊ6k(ۅQ4 ^$evGa: LPFA>|wk"9P]#wNf{i?3Ct* ̈́lX ̵. DoU>LS}urtl{J Y^3K0U=i`-IesϨQYJmqbjHvzg$f5YYjcګi37C<@ ~t1Ku\=`HwX]tS= Ek6 ab[c.MD&au0ŖbykiXՎsКUrXoÌ{p6[ցːK98TS@c]GIU?'%IsyO@Y}&}Q +s^x\?QG"Dt}"7RS)˲&qO6wpe~/Ez^2|)$QZX lfkT1S7jw) ҕ<7̉X85(9ȷAW/n1EѾSuw /.q_ǻD:$g>a_߄Mt^Xu= tb}arӁb,F7aڋ29XdZ )Ջ;96Ħ EY is{%sD?Zsq jʻ(νm8ՠ4]QAQȄd.k !y} )3o_R _6 !B;^R% .Zm$G+48v;o/ݯRb+q Hn/{&!Ά,6}/r7Se~?GnmiXTꙘfnr@[^U/)?s, FjjS5; DeN{VM|(T;jVNAٌbk?LyL:c :@YZm]ta) fݓHܑ8DV!:(#'-T9"@ `r:R4{y@/n7GnVɎE" aaQKz+]q, vz\V!zleuԮrlZЍ< l o/VR_n0"X勭>@2%#}$߷ a,ﴋ{(p3Xm!r9O{C(>E3q3B[uX#x{uؿ]ysy"}[KJmk.Z?3|JweU薣$A7/7?Wz.j=`Gt޾Ɇe{tںVY:rkTH+gdF?nc~1}[6;+v4|f36Kt+w)Դ.i[ m֏yp}mTp_=xwȊ6pI(CB|i`S7#on Jdk#Y:Ox߯J6Jag'Ye&P*2HQdaH}`5CR7\lsL:F8pT\mnn~gϝfC/N&iVضvg M$YṮtd;^6CԎĸjP'3q/+^wGaӁ`|+;?)ooʣ{1k=e:g"i5 B/)~oyO(PA%/(Þֺߝ'QЫo^ĵ.̴ɹHn&zmK^Bmy}<Ui/=  ?*E'w Z?>ymE^3 m80̋gǡ>kHWO;3E̬\#bZ޸Cѯ+ peÎh &lM 3]'Sowlu<' Ai۟~}_t2 1NF({L$`) F</d幮1s ܧMQ%YH+:gK+ȅ1Wjzk wL,8U1L|yΝ{/ +/\pM%ȵ[,>f>gqȈ~hEv/TuePhsyFh;ΏxYy ` $3^r_7{HBrg%8+a3^E)UzPYT:KEI'aF.`-hZXMbhtͰX$”D—0Ѻ=b+&IhXX"JJ t7÷F[%U7X:r=Bu"<RkγP\῭{QƽiyJޣLI"_3L^w&B!62\0v}Oۦ7;8` R' '!fP1y]%52j|#j EsyyST6fE-4EEά+QԒ܎|qNK5Qŵ2к7r[Xii@ij5f_ûB0@lv~$<n=r^uݑ7{ˌ)tj9&z%&|8Ђc8b#$jq# ֗|e5[H'c/z{ƞbRBNQnf+X-$`ı iWD ݉ߙ?oo!=HykU6 e69rkrS+4eثo\ =Pys1Djr (D AVBJ JB+lGo|1<^ֽd~mK7@9S(pF2Iv:о/ёyDjye^,0 jߛ'd}a ~~.Odav5PQ9o~@ɛU>n?Χ޹eЏxif_4Iot^gO9U KSfP:3M-@PƯЦ_-Un}oxC)t}59ۙ<+ ̙<۔nWo2ÿ:xvp!,x\'nלl8)aUh ՠv;O)|'m?P`^b/.Bys_ڬ,bؒ]wNqXD8T4/NN+ B9jKD[w / $`6_us-[sXid:V|U]*MV$wKYDkkFze ʼnR;01/+ H~tź4qp$&Z3ӄ VδLFC,:\d a5sSɷV<5)|XβSԮU vJx/t0yA MM_ËS,q'ê J,?rB#Mzʧ$oGX$8%ǫCT|iy: >&?{z#V:YH ސ4|C&^)oIQ0`Q&ܯ/Zx߹+V%ږ=ћKY629fyp XxWV]"jn83 F|Um }hמPvig"%Ћw^knEq~fIя̮ݢ@B/\3^^'N ÚQuaW#l&R5{ָwb]wT[E+r/u+WfCj6LLx3@|Tog*A1XfB7aZwyEegDM6d NƭNj !Qd0K3VX(6bdW;cۄ:5in"Jۂo}hD:|E3yک$G)0n>Uf?zx@3kg}fnCh3"5c(i[:%ף+Af<4Tw/᤯A6QΧ =mo]ZRz9铝TK \QD KJ릊9RݸYQ"c6(YDDd"O&;`|1x xjkwBݣ]%8UBg/yuӪ4JCH8Kk>`$ ɖ( ϖ׌A-IFSWyWt>,?"ޏ& {n34XBy7rX ;ӟ`s{\a"юbauV~3 ̨`!`0"ʑ&@ wBuMn=Cԛz#N 'qY0SYM]M _9]TuY@nѧǏ!އ\}Svn#8;S297ucn%Qm7Z(oCy-j?ʷ6'g ]LjH~oA2E?PKN PK6:QMETA-INF/TPKEY.RSA3hbƩiAsAs-#!DqAAALLL,^uE xjAZ 8٘CY؄  AaļL;?0s~~Hj6L.c`f554044346563422r~gde`ne0hdjld^)kyrQ}&K|WƟ=ɧa= Tkdܻ d! .@y <r"- = g 4 o|2![ K@6\ b 2.3@a2&W e k@ Ad@yEwA8\ GzA?H A^4X[A @ 1d  # qȃ y{ qn@nydp d'Ay {CȽ !T3@>&ȲB 2ȂQB Hhdd> σ ȇ  AA.yd~)ȤAN;~l'Ŀ@֎@.;P WdAB<2j"p HB| s &C] 20vCyt  k l@@n@^Y m$ 6ȳ cڡ r9 <rvq m$ uCydIU Kv3 vB\ SwA << 2TȆӠm-6V cz*Dh߻ >bM JPdmS?%n \*hZh.5CVKCy*>GҭO;gp `[?߆Qr'>H}]tM[4k;D!w 21ZlR4'ilQI&\k(6$;[&~.RZfKݮ- i h;ë@H{CYc\QWς0Y * YZu_"K'(Uުp6[-| Vn%;uFJ.Q$-(qO^S *ByueblFT>U7hw#nbe-kv]ؠXĖڭڰl uѡKԩϪ umѢt9_did5yfUSO;L3_d/]Z6n=hlA ZOv*d\`PҢ|݈B-:D#N4 RɖQyܥj z,_&g;=AC&QLb rg*)s,1͂`!# #?Fy >IȑV|n;ǀ#b5h._WmRH-D[^ېe3LY6K"= )gv5ǵyXTBKxU )֊Zjp&u*U|@Wc;,V;ԕj<kUfA nF+|bnhP$C)wQTZtk/_+F[p'Wժ<m#ǩ=PrAՓƪ5A3F|~W6OUqO֫J{)d'x#h;vNGiդJmXÍ꧹6*qv6ɤcUVU_vE/Vѯ^aԪ1X7);T=FXM`wqCQʷ:ߙR#c@e[N #k@<%(,i~,G.uow+?VSvWurP~S .XS G 4F;e^ZO87F~xOOZI}d",ڣ,Q鐣xH1sj+3~9KpS#1֟zTT|qzji}{M:W 9-wNɧFp isUjTe{^K5rNAD7k{q?o-$Uv)=rmƌǾ#MYǕD["v ^U =[!m<^Cx?wJ$%023jLՆ¬Htx!(Ȩ"b{5[q_L>{zU$Kmj}ʭzp)U'cjO媅V)<IێP>kfCw-xuGJOr=&5nVCYJof"ZѤƭxM/kZQENUUfu2Ho]*'W񻳃ɰ_R5CC:s+_TꞨ(Mg9)]˚ZY)R'ƽߥljT?Sٿ[~'fp_"W=A_Vġhve `=&v+yuTC"-U}>+N-Ow꼠Hu _'9nf"Ѥ(: N4G*+UzXfsb[֦PJz*6Z5ث=.~Ze\^kUޫqse`g9nz^):,ƌwG'g*ն=GYdBN:uMbn7SzLʘY#ށRf>w~cJ-ҩOH_h#Tz2jR-%ݽ[ V^&՚lk-:\gӜq{;^Pk} N'Xsg!i6\JQ޹m#\C}ގ|.Y6WQY7J-+;yS &8y3:ؓV-']&쁠hPRJBWi x`?O:K%7-FJTy?_'C蕺j[N=@ +FwdЪnK|<5\=)JsG2ԕ=ٻQ{?_]:9+I3{k4tw e$1]$)I7E9<)YҜ<ӍIڗ23ZYD=@\Z.{< Ӕ:ԽKrGXejo˔wqFKK]I lT7T9Q8ժdUYĦz(}V^|pbO'_,~j_xZK^Oh+)3Tg7uTq}T[0>Z +9kU| яǷT/:88bh~A=GX1n''oAs|e?*K^7y\UVsﳃ3EzYQW:o:,aLh)zzwS07%9mL\%sF-8MvjF<{UmHW|VN֜Ժ[ܯe,`8}My@v@Z͖*¿,AK: ^[K{aEwGNJL9~ޑdb{j 6;h&BRywrLTKNM=`߷I} ݓS}WX.UK1]~R~q?ԶQQO.V9^U`h.g+QH4 "8LȵSzKjQ<<-Ru/ȩ.cض vJ( v akK~@*\ǽRo՟X?uشw^h) UalrٳzD٩mvSWr\$ž'fۿd YjZq{ L|hQI\Sg#ԙV\4:izl>3Ԅ7JԘSfE>;LH}Vb|5Cз&uv}Ƥ3]QUe๾ƕ*Kowf4[- Gt5e4x Atv}7 ж j8x7D:QNP75rOֲl8e΅Â{439{'l7khӲ+'ÿ-~[LﴊG=K ㉿E8Fє9 VC3ݟa-~ u'b(}'H~0N`&6ݛ 6}ף7hU[7߶h:|Z l.QcGy-˄,YY|(^QB> J;}h?Ghv@֨8{lAMxu W~6_,Aw rҙlY.Vݙkyn> v̓*X-; Ll] #D~ZiM2@8̈́Dp p@;o AVz\guCkO{7^H䳵΄غV`΋g`?*Wմ_J',~)sZSLG[ͺ ,6kFon ku%C|c|UߤS4|ls7F{#UAjyzS~5Gя4բ;(z@cO͟lL.|j}?Gl93br?5#Qku=koB]غ3mBh7ҞISVSi]U.l Z&}Z8JV"jD}改s؍A.:`w*{Pgd wofge2 \s@YY3@~ g> +~2dCAr$ 2 d S@I,@F2d,#ԝ( h*gi(uY {#u)DQxЮ#i*wA]7lLW,НTe#c O;r2 eX҆|^Z<᩸ 42e$)}rQq=›b-A%#-E##*Bz7*5ʲqQوl}c}Ed DЌ7kq=*oe6n߄7imwCd{+#.  QyWoxɭքm@o;L=˳r=*?RX>%M}`?2ܳ>}NdyQY ]6ef4;K0w]d@mm4q=gzTu\fhX滗A)%;'\Fz|x03@gXx&uo?O^ ,,7'4goZӧЧOY8%[Ǥ vz&=bwgr0~^`i~Yi898)#9r=*?\˘3a9m4 pXOף-`os2W_'\J=zT_O'\ V:p̓SGxUr=*?iONCJNWyro'\/Qp܏>KsM||Nw]`ٶ-Y8\PG=&:zT@mqmCl}LxhئǾŅXvK'*XxvǁO/lr=3ף]~e=0Dԧ/Ʋ[kgz_Gxg{r Oؿ_quW:p+ףO[b@ċ uhR,;^e^.zawxEjx\/ !_>?+!#5_^7w]q0o5uJu\]U}+ף/Zbۍ}A&ؾՈ}+ sS,bVخAh]jr=*%;,uh:-bCl#\/vea"0S_w>xo@{7hs0wFĻQzaautěq0wR߲ǃqڿ < x`c|X+0mތ6n6ؐ?e١"Uݢ>çG vέw%6{^w&mRfsv,ӟi՞ixaQSx%?rhC]ن۞=0݅xw -a<_|za=k lWu"zNWEt{7ݭq[~=}#{[q0K{+9l4©~65k_w7R6ԇ?0ԇ WO_Oý1+;3~C8)#វr0? #88p:֓Sxr| 8kqN~Soy`OOw}3;7œ?x\ ,}zC~?`/]lON^) s],5p*yN]oOњB slth/͞f| b[ClE_zף6K_h4CK^<]wVn+>VG;hC=؏hr=<K8uiQHtg8{=q=YZy'Xƃs:!/?lr=;1{LzT~% bї5\>=q=»ءyK_%X9OOOk;s- d<#X8ڲ&F)) |{/7z#G |:աosGx_sXN wy4_s^O^3 s3,03sme[Z҆ c <} ?Z4ug{CqQxG-`C}1g>\ƜߣOO}Mr0?“gGxG: h{VNu>ܯ{ ^²"x,{Q1aQLKۘehҷن?^F/'ha>fä??h#1/ga 3aҿ?/{^q/ 3=Gϟ s,;p*Xv/qK=XGxx!k#Ju Q2K\n{igoOo$K:z[Yo\/]gF){œ /-lDLË}l9 ^Xĭc__ۆm|e{rMaOgoogPE{zm{[za~w<}<77y`;ieNuǙqgzw8ϲ+8ғSGx_N̗&/9>©i ot&Cz% ?400C_|ev&Yqa쏾o%`q@V?imn of@,;P1bc 7Aqbcov4& L}Tn?:7s?o$ěq=;Dz7kG2ߓ{Gxxro'\{r\?<ӳ\': sX$kwpNF~&kp= xxI6&lH3/І:)q8b)7EzawC7Uz7H;Rz7oM;MG#xq=›7fhx\/̻ \w1l_fO3-}ڔ@̷#qXB25ؐ.LuZlmteơqСλk,xG%vUjY/s s1܁%\Gk}9* }FrІ}Y Osr٫8q`ڛqγp0JK_p1os_[K6$]11mp!ho^7YhWm2w=>fO5oNg)_|C3Ø#/DjsqXv\9j;=9zszT~ }O8=צ}GNNS,޹s0?Bor(Þ]_+?h:"^M YfO"_v4m78W;5uQ=ОK _)+ M6_nwe1X녹0G]0/CeQ_k? Y 3\/̵3\t5{Mza<*K;b=za.'\5w!K1fO:\}\K^3ף-cӏ-k̟dXcJK0% &qſ=-EKѿ_[{ [яh%*ne?ſ[voYMok嫄yݴ.G#YAðhl|>6ڞgBU}މXvb:uϹ}9q=*ePҾlXTn;[F=߬ĮG9̱~ހxk~f ܶ?^xuW ^|a,o \cZ[>!=2_F|ɶ?w Ҹܛ։\/̷ק^ogQz/9^+u'Q? <)+ZcƲX6d A ?;0y'#ɚݵXV1aQvMms)hm.Dzzͧ il۳^۳\6isKm>e@7ӿ>oſm@6Y;ӿ+W_#G[R>؄4ד)9>(m,7FѰ'v08)hYCZƵ:|.pXlBrClbی؛ظĶƲVY`2B[lAXԞɗuNKmE[> -XbEɰv83lC,m5pÚmju 4[~O2,*?lr1nm:a:e}=Zp|2^cK0^imròoakxe zp|ecbNyg+8ғSGx_QNpza.oWqh7^[c79^;NͰ^šnui\o|;+r U,o; R ̃u|_7Q#מڊ~ u80#X-uI<_:Iޡ͔a}MТw3*[)z4% f]|%▖ŬK!B|dkO%6Վ෉kꥹ9JEzduAE<_oYĬYX7mf83U75jZgfM+Z%zU{0~& ;_W9X1Ht_=Gzº=Eܵ3i[m$:UsM3gӥpS)9? ==\ҊpN*E|YMbv۷"*Z %0aNWA2-?xת ~q}!˕ϰqֲl/kX.WKLy^5O_7frzżㅚd|PD(y?Y{AOPK R0PKJvgHassets/fonts/default_bold.ttf̽\T0>3l +JUT\b  *XbCTlر욬1 Q$^cLbi71&D9gE17}%s<癙 !'`QT~}FF ʾ}r}3s uZ[w؈sXD2xXd&ϝ0#oo9#䘉oBQVѩy < 6N]ROΛ; 'OE)&k<7fByʌ׊>Xܠi̜7}1+;#8 yT05^;#x7Jkg͘{@ey4Ź3(t̚3is0_.-}ƒ/xTJDw㮄?WU΅*D( pk<+dZ;ڊ4P1ajGOP>iMD~D1ts"=BF +j<{9؎` Q*&_:z6*!QyL!bQބh?꘡Ȟ]fC (sCe <(P4G}Qh5s%*Q.gB9 :9"n:HsuIAg ?mCJ!-jWxv`#m>5CP~ B z2 %KP賀@<Ӛԣp=',C[ϰh=h[!<O.A&( eyۢpZCqCN^ "*gC?Pg %ƿ h4c,f3*fl^ZHRLD騀T0v'ԋx: G/0{ Cyx(l)-Lt0\3*l:)-, I6PwPx#S0'Cq6:/gvҢm5+{nMyhN/ ?Ԕ)O=]A>lE]0z߁GP_@CP!VE9^ea /gzSq(Dc?UpQxpt8(; &Exn 2+MBiwk*TD+=kQϴ~- o>^CkE|@i&xixfjPRjAh Wh"Eo r!R+Mub..E\]1JkgڃbHmE~6pO0/6*썺t#-o: tyQ^\FDYZ < y Jh=Fq@GQ |V!sB#Ŷ{`]'!O \-_Baǒ䵒cnOGf{=&u(~%'yMOg 8Q< <2miq(ք?Q)>%~/JԨ }㨡LE+|A.Ba^!m=3{|T$7`Cħ}l4k}? -guY~!( g *L:QjQo t,':&ՕP+GPnf~GpVS~Fa>m)mVig=(E9ym$խj'0_v}K,x3Ok8L鉺+A~`<ـY sPOh+{+_I4y 05SO ~G36fIt:eZNmJ'Q9dJ3EJEKҎ+zXC biTS7Ja0|lr"z)fifeh~/LŌ_Smi*-j{{TNDt-H"gAzm“V1+(υLV*G}Wz+t:?:x:sSME;2LL6x oghFn|sQ1"_9< u4>7ٿjO\^wTE*rMNBQo<-kp=,Hq WE-Z#S=>F0h!b 25^5EDk ':E@C& ~A<;serjdh0Z\Aʋ _,̹m;hb$X^7 |tn':)OK24 hvC5"Ov@IG]h2UfE:=DjkA7/('Wk;g .xtUsp#ha.yc@ E<F5-G_S˅g*R@a0UPM6(t\,K_y同82i]g|p¸ P˱όtOCr.H-P.邜zne@O$~PʠT1OPB"o@Jv JiDi5 0EK17)CP;@ -BsMh17@;L!$2(c)_] F.RV Ė@$7Q)④A%x u؀V҉$Cr|E~e00*Ǝ1LS\f0Wٕ7OAZ+[ FicTmvQ_{ėuF?///o?x Vz L1qajL ST40L]퍼Kk&uҺjZ)Z StLcd,`(„ L;ZZjho$l*Eda0Z!d =_o4^7^3~nZC-kufV.gjzOs=r= (4;['a.CA!YEJqaJnA31aLǠJ`PO 7-t;Ƴ><:qdA3h=` ./ 8W5ؤOBm߆7[n,Cr‡ktZ ry6p!:3]{Cgx}aha䒢Mw|:c ¿p" 7aeJrr67F:Ɠp2LkզtD7$K_uI0UAjPaZm_ O-} :Ā] a83`Q)ނS93c;;%{X A@$8p(WzLnaǬ,0q֐K9M?$UFj=^eXd \KY#&%wM6cR<:04Q"="}ep\ TM4I:Gyg )b]K͇S䡃ndå8>"R>Xׁ00Ool:I:^AAՄYț aƏ_K xh٦L|'M/3p陮g/?["1eY6Y`xLG(?2&i{4^'30;Ua.u8rDiYeK*$?7av/밓0 3DHJ&7CfTSS Fj.UgH kiTVAdx’PjB5P[wcrp6a@;W- b8_ sr0ecGVfsXOۊ EbJqFq]JV-RP'K'[Zdꊵu,Zm"lm-}]Xv~WwϷ_mopHu8hSӻNsLg]b]V\֤iNںr=fmەN2:t:κggoro3s]/N޹;}zs]=[k?7ů̯V u׍ԕ>YٳsDg}硝'v.|םg9-ڀԀG9u 4: hQPE C_ptpjCL ) ) r?:Ɔf ZZZZhsoCY{Ά;LJ// ?~:rl&"("1b`Έ"Qcdёs""k#Dy#(#*#*7jNTYԖQ.vaDwI2˔. Tth]2zKS;:vzlIlUlmسދ#N7>nwoO?%~A|ExCsl #$,H(Oxkiݒvۍn?%DΉ鉣7%L]]=أǍ?D==,y煞B:1sR|RzܤI%I+^KcoI-F߫WM^7z[#9|e.뽥ާz_u;SRƧMMHۧk9})*MtC ?9 9t`4zЙA̓ h>8lp9 >;2AEh 2}HECʆT 4d!?mHШszoX԰E ^?Fqwzdܑ/1*wQײ4YYYYYײI:{SGێNl1ncƼ;6cl#cOwhq]YNTβr.zmΫ?z'OĬW' t9?3?+?7c'6%dJ)SOcgeLofLqh3̬7ܬ۳Zfgnۜs͹7W;w>+F&^{)9/"ȱh`ʢ+<\VU\P\T||1^p{腇/ X(qE9-i1Zx.JPc{IXI%%K~[.,X_2t%K.f.*(]rgJ?.Y`)Y4`iץKG/diҚ^ze齥-˔˜]Veg,P_ָ"lk+V*vUjvu#X3}M5ki\ƚskqPn_W[/XS>|Yyuyckʿ/oY6`m׵kG-Xhmk_^{v߯BY^Vѣ""bVEiEuEc*nW^t L̬_YXr[S*oTTªҪ UUUV:[YͪuŮK[`ݢuUj_\`=Y>`}׏]?}}s[z/ B6oHPȆߪ#Wm8k㢍Uߔ)kEoo9-mM:vk֊nlVv=>k{kHm{MHM;;wڹl疝Wv"v ܕk~n#w>{ߣ'dO➁{YjO{ٞ!=jΪ]VskbF֍+[Y@ݩu_T'ԫ={[?~}\AѐԐѐ0aYæ} '5\oquwcTcrƉe[4j^#ݶY ۗoMkx?| @ցE8~?X~!CYm:a3>|###yѡG>t!<<)PZs,C0b 3RVB\1 ׄ(+k :']\ Ԅ̕Ǚi9@C,RZRcst;'DW{0@ TGC ?)YhRnb}FOC=x{yzwrs@ `ogkcmV)M`p҇ZƚtKy^SpZc)+wcce1-N||01N:r5skXڊЭC[|x;G6!TUVȥJhI]Z  :;Yyv*sa8a KBp#c(iZ)ogK^,*Zbv3;g-݀G/yޏ]Zs%N+On:x#wq\CSZsM` F ;;Dk;:[X43{"!LWP0I:))C<`68[Ε)6>&Zㅝy_@4X&g\ vҸfMcC@&l\zo*~v3ȇ3mK^>Z:hɑ#KO0ԩ[.-9ztIF#&OʔR9)tE1( ;´.j’{D3 X{6m ` qUx̋o32l "+0N€.^b_g.:>+lg4 0O<ѨS'Ã# O|B+^$l ӽ.>[p^Ɛ,zc'z7Jǯ)L;f7\~^vz.]܎B@v|Ϝ0M Cz8}B*DZx>a}hQ&t!EY[l&KomY#WWK(p+|.DÅӄ aW*>0.6,GvCITB%SwQ7# KC= L #2ҧKq/&dtgG;33^,`![g9uYRUk#j t&!PSN]ԃeV)5%{gWdX dZܬt4(kw#2(T'q*DsE d/^'nf&?:E >< 2askDd!%N奴(2 a?q'k !z->];Ld;<4'ĽF>~l#l_j.{WѮ<56:rH|F<􏽬'0i] P5KFӦam8suvt T@X'}j|gƦ%%<nb#|!~7v ̮o~5,<(LWf°m` Ї;ꣷvhocVbęz tԆ`T`0LMVt0Cm38lb.Y>}Yb|~)KW!ps2a![WMdOZ?7 C9sv_k0 x{tC!+Ua*フL Dg9g5ڲJJ" 2U}m2"Ǒ^4x GΜkpJGNo_\du=cyU|㷗>?sw|/ذxO 5C=T_<#~6@%pq,el9`_@udx7 8E旖DrGK88v}PF;*w r>^ª xLmI .T,0 V2|a9߅p9f t"WqpL֛_ _8[nؾHZ?k xz` tqQ:l򆩰) L]?y7LZwI"kh\`y/q5`*X'iBd !J9s/~|Auƭսp:}k'_3M!PKƾS&[[HXpr 47;9! $"' 08{Gj7zi\Z8gOiWK>pt(m#‚\jp QND,:,N3Ęe[^?(-XExre=l:s-=xy޴iyKs^xƍ O΅Zj[i33u/K5揎yitc H 1 (`Ʉb6 yßԧ#qT#<0;g%~XJԺW~޺;ҼLVM[Wk̽U鱐Dri8-'Qkdx\)'3a|n m& m)fc hLm`j}4fBOSr.]p$c&8Nwㅛ"^uK16Al$Q#OQϞ:4|ZxW˸fì/d̙׽Wgŏ#,+t?綢nQa!:NNj%K~s~#fHOXu P5CDhVFM5%jct2JB 'UҶ)Q`g}ӧ>JesЏ#J6Y-:<5(b@N"BIpDZµ+"''8 ?~s;k,p^xW05v8'f B/Bo~Īw}A(Hn>W Y6Ƴ7g .hRX- M ĿbOkjS^K7;'> _(Ky%Who,;Olr޸ k8LIf<1/ zB>ui Z3L$Ui" - Ք1Ѭ2`Jf__Ť0w~k /ZyR YB345ltܧ ojO/zIE`Q G'VsYĂg BC8Mdj3jIFM$[}vXµ_ q£G3K~qٳ{_WK8C?~o|(~lHo*jԎ6VpG`3=9lf,m,kȗ"ر'%Cc #<܅ᄏ: e~)s]gpJ 2Fa!dQsX&!re SdLFΰCF.=^o692񷘻jsz,:@k XOʌ jqohpΖpfH_Wb `#\^i3?>/:XRNz+v8{kn vgXàdsc$%8z$%9tqCRQhh-(pa5{65rb`I%:b"vetkK{ZU4j@OL3 5X[3.m,1bVGM#o( O~v/7 E]Mokk>hBOHiik8 qc\UX?65M'_qRL~&ƙE36Zqf^fAz4/w2*8 E?"inyFçåfUg< q8 +4"A+0x&^FH@8{g)iv ~] K^ ӫD΂^.*1 # [28L N(.zobȓC@aʕp>WK%dBrDx]UxjhƑKO2Rx(\ {F#Y~ TڃkUT`47a=bG9b,lj6ۅ_l"aF0~'lS6Uo(l#j̟_/f67pVWxi3̀@d Ӏ2Y z.RXuZ6ҐO~3ۧfu(ZW;99r`5xXRg`ƣ83"Lvָ"`X疗fO(PS^(;߸n)g\ýمYtMt?7Ew,Yp3@| m@g?_oOG{[6,<̊]2l:[*|y!H1ǫ^Ol}H#su߸'ͧ9ℕ W/_9%Qݾn0\_7`hQ3E)USlm%8}:(-q@T1fBybb@}Jځ!•w֞ - ̇-~CiL#Oփ YىKrK5&AccD_nsx*.?~ =8߁+*tގ& UId%QL 3C*0ӡ`@':`NAŗ;~Y?BAJû_#9.fK>`|!r6^0Aj+p,'ZX[QpMk{Oӎ5o.2ݶi/BoǮP<$}8:ϡeDoqJKv{70trцl5rT.QmGusXM[$OmZ PhA2y o,ƿnm:ͦ5c,Ypkİ>}`b܎:^mq#]|QCl ɳ%RhŸj YW1kqcVg?%.a/p 'l'UpSe D&wrWJB2bZ{w@rq`O 6ywFr66m9fʬ #V>- 5ƦtgJishk\1pqqRH5P'gV @!*ى7<6@}Ԯr*`8YiAgN^eG.8װp)\GݢKbYkT+CIEڲYAVR02؁O 0]QkH+u!w9x~,szѷ[X~5-Y4GecEmK,}w +p=vʺ I1Qa%۴iQҫ÷DYEJ JcsӶўæsn8]fǻ[]qiZY]`dk2*7۽\<5i0*n-`c< cᴣ`K|CsB:9;Ǩ,O 2ʂiw1H : 3)!fUkLM%25D*SԎp/۸wݦ3&-j]0P5hĉݹkOԮ4!kUOiMa~Nh 1=]bu0s#7Lyݦمcu#_t8_W/+zFl|91aiKXJY6'Kc]y愖7'MUVo@/Eˑ7hݾ}H\6`wl/, (ǂ ;0zU[7T1Uϼ"6}֕xMiQp7 4qk\VSӴrDob^1TxOx|߃RS\} !^mW E@cm52kNU+f7TS޾H1 |AѝU~J=!*RHT4 KmddvhD͡tWCfdHqՑ#\/IŁI*ndC5}qB:_i'*FtdK P1*DŘhکǚO]k:V;*ϤXztو I3/.7WWb:);y^Yq8PAtjq3H7vRi OI%N_xB|=B%\v-13w 'd#|7u-s]؉zVb uxBr3~g o&q]|+⪗Ļf1PmLNjn.\N?*C`Be^n\X-x20^xjz+ngf;<90S"_/sdFx)gw[6=|OsK.O |U: m=;9;U,tXgۤ8q7VJP3>pD].&r.,39M̑] |o3gvx~jׄPC~Z/Nn.NMWS+X+1VEC&B>Vc1撤\I Iq[w"(uT߸[}9zndB5'7n^Scsvwl^!<ؚ/n48[pn7w7G{|=g<ۄqCTp#%Gۯ9J3P(LL}WiUctrҤ-_v]yTWlUU2#~Б_'%YV^1 36Nusƿ:pZNJ  ҭCnfjEE@D :;pKJNT.v12O)RDX$[ XwD_ i /$ElӋ sF`՚)$! T0n-2Rl0Zp`Ơ>h6,$(ShBLQև߄=aЮ0 mHmgv"M7ym@濋YrU2.'MWpX[f?o~GO]aOMҵozFJNEPG>t'V3fR^ ^7La֝&8yB15-3F}`ZJ)."9//d=ww; ЋT?FK{33s\Ԧ}fmI2 QT*[J{FmGONQ/:r6cO9:(v՞>]Knj3hGg .w w yu0 yG̿0rNK#ǯ t \ lݱAB>.c1yqXݞ^בVuT4`C;cdp%m5L)dbYOKqHxN/oӍu˼鴣uH:T3[vnmĔ~?Xr:fca}(Ȥ3c{w/Z)4Gg.N.`K40) &~֯ 6txAya{t?UTz=>]!|ٸ".Kh65ˌDѨ;wws-.-ڭKh{'s]d?PC@\x RS9't,NNcD} .Oonێ&JPoW)l=f{ EQBU8* ]^^0kpo{!!pS/伙ׇh$p {;d1uڄ׎rt43b{Vj9ۦN޼iJbc-ر` 'ƶC)zǧϙ ۟L Dx:7q}# 8_9&,NjĖ&FwOvMv ܇)g 1'hc)Gl>&UQ;:f]}G \Gen'x*ٱ =D' )ld5tϲ 0xy6_4B!&iO呸GRzӵO=l87)mkK^qÀ^+cgw M s͛057E/ݺG%u+iK:>yJ:MLߠ^ p{Du/B.@ 1Eym?طHGe#eYw:h(6h;$7E pyaVqʼnk– KtM4_>i+W'tK>t*Y ;-aS$s Ţ_dw3NDOǙ9Z2 OfRqi,8ޝ' ¯3;$ZTbOUS:KJw[sa񘄶*ny.P?pg#woTgZ ̝3K*Wgc]~+^^vnǼʄW#:Xp38Jӻv~kf=z,h[omziɓziiCrl}*0IųDzܒ`O!&P ݐVrߣ&yxCGJ`I1*'6NMNǴ2A1Pd{ Czp3G(bųXe?5!ǢY+z syTD1cg-.m?:44xV^C]7H 5iYfw6QReR[=kLQ(%ω9DďxFG1Y T>g6}ma-n&Eps,mڵ1UVJyHm$Fet' 8GJ-WBJ0Op-Uz2 X/(kYjgf6q30Аp8G9"vy\Tz wH: HxEQLD` Jm*F؂FRtSQs1SJm>;e" O}h3R'L^6 Ex~ Zrk#UvpAki+2ˊFi>6r-2Ht| 8v NQ:$D |0I2(]d(Bij\h-9ifM ϔlf 3& ]ErvmcR?Dbl> *LO +,iop'S3JWp^wyno 6m#u.vNY⣑:,Xit"b;s^e*WM;NBCr]L61i~Db,ǥS#l^;<j9>ds٠-`Xy^~w LAjct!&bWo/#c1)828lvyٔ5)7RtSOzi]!VAXǤ~dm6y>z ".6%,Nl^}8)r/^<,f[-4sOil-fo_F —?}CmsG]Y:Ohn 3Uм?Peh:#~N;xnc͖HW`d]KmR<o]X|r|1e= {+󓧔<>Fݵ{z!c8j"aU@Tٮl;}Hsܦg@t.qm߆xhE/Y|>ϹLQA>i~ <}H-Hk d4W=1*Bq1ݢviM9<#̿qяgXauSy j0t!ݞdQ)XbhsjҖ9T\mE r֫?NMnkJ w̜WL?1yEFJ)^5;܊bуuבQgf84`rw9!<,fT/fD\,rrB*ݷ MY^ me>)A6MNBnRmr$^LϹ稠Dey+8 *+i %/QZP 9OѺ%q 'R"{! lz[?@pp|M{`q_N ɹszbWU]G>XɮD@.JpMp4`57y];>zO,*|=Baa=u}⠮hy]#0EwÍyسn!yo~϶)9bq˛xsyKqo(C$0c"ꏡ2_p6Ex3Cjm/sG\C%IpbEóǴ%Ead9#p8_ Ba[ܙ{f##N_|gCؓw  z{|U 4N<=z+:&a6)mvCeڢ({!]cd?V $tbNZnƌ I_:1wrSP0zWn tZ^8շZШqio+F8{8>v[[m%c>};gmWLWz'_qMLb\-񬍨S6iN:Eg_ϋ1 }~x4YH}w܇{6dы,9~xv(̰ )"F5I}92-r>C{ܲ%l*)J ! ^A.M# Ф(Ei*bT6 (*E "MEAHv?g޻wd7sΜ9s(QMSh#Sy96](I*P.]HMy hj hOf QVoy5"]&403=<ج:䥺HMg4\[./XRӭ[NgHOFE#zmF e;h#Cn}tDo}Շ/&'I3ZRXi&d%()TEn-fRisgY+T$^j^*IbXvpX?3`zid2"$xÉ!Mr/Yh1˖^Lti1%Qsr_Pb!܃<:o4=X l1kx0nھ݉B/. @?fCvnnGy:.]接c7Us6Kjqy v'Vÿ6h6tr+C=xj{,C.Ruejv߿I{Z B),-k>u.u}brp#uTGIh%} z^gбƢXګ4x8 Su*-ohw@*y@uf I7ڦ&lSl[rЩ<$^Bv:;YbR$O*$"'Lcv!F::6m6hfN(s=G 9yZ?@ӆc6󍴟4MH~P^Sa~~z[m.`<9 En8Kve={/@/5Z(! L*!BT/N٩[@Uҵ׊j4X%} rc_C{t૶`␴Y7 xqFAjґOmDa񄆵˾|7FS}R&s}hcz.c̆ 2Akv,*lv;'Sqxlf*ž_6YqP2Hb|TjtGV5DQɭ$-)&#yF"՚{&  T ^pއ?y3u&B\S{bqȃ FU)Q(R!&k^3&QG>#`5.;:[~dC(7FZ[IFV"M3?E}}A`5zfjB-a##H{VZP$.6*2<4jBJ%`1'D,%rӐEd D}\55P$ =y0ѝ=|Vդ?u8(}TKF"4}<osIhPyj y*9+%Nʿ1 qZ?>W*%zj; :3w<o[ Sc6|uN}lL,GͩڦgNZ?TY~/zۘFƀeZJ|]},P}j6|,}tؘXLX:K*]M.PhȻmkYYa8oLW,PDzGWFbQr=P)ҡ޳₄M^ʰ ŞYWMVBHKz{O?I^QX5).&{e%-@֗|tCϓz?]@󅴘/&uSׄ*ѻ=>>MЏT㻠ooC ٪rTȟevz&Lr3rڦτS4)(mc}j!gc2 xc恵Y>=fj>O՛:̛WMny~t}d{_j?51^L<9J'Z/HR AZ42G6%B`43*<;kOcHZ*+#evKT?Hߕ,t:_ʑDFidof&  Rs-KW^X#6пQh`خ[Jݺ !#AGCyɠ J1!,Xngx8|κ+ dVJ,ټ^%w±;wmH˼+@n~ۗn>8 g&}b z wlZc.;̐m̞Z"L[~b5]|aT+,tNaPaص M_f5i[%ƞҵN߉蛟Y-orX-T#,֕ow:!AFL92*rXٮC8zc!k8-wЫGDQ,Vq* ij=8 @kMr GYsK:>3{7> {|M\\#XTu&"o F<+ƐFz\)&vc ˢ,Rd6~nXcP9l'FEOGeٰ~=WS :wnPC1i镁] Xi ^'WwΫ^ɚN!]'kv8We2.kwjqZt_QR S:C)Xk'̀P9m+#phv SyviVzjеi. tHJLMO1K斦,,[^{#_{#ϒf|}sҔ1f" "k'K2rnluN$S/z_1ݻnb/;*&'e7qw8WQm %%L[0P(~Ԙ+:-WR&2t?bc&=7n6Yj>m@>VI MFq6L/~=[tQ}=a /{~0k2^L/cr3Q΂; ?gS|Ļ? {o))> yTgsT#62ZG\dOdܶˋIk|w6*?$h]4J(wKJOQzWǢJh YC.}|ֻrC qӕ@zzZ0q߮I -Vd(?j& mzJ_n,Icw:f@'NKm<%|֕t{T yAkT?5 J 2K#, 9J"BRuCrE g"ԪJjfYxBi @<,^H񋌫rPTR; ƜǤ?f\VwjҢ@ǣ iqwhSaXXCfPv…La qJ1̈L (b1P& ?" ZIȬ"trE&^h&eP#%L4㫫9UHmy뮕]xxG5 OǨB2X磽9*lLO+bU!TqV10yI;%L*,]oVAfx)BKGxT $EDo"]6WlV J'o@n'݆ qjȀwH!FO ŭ'1ar_s]+rU#ni+xn[jeb|Cj 5>Gɏdk U̚^{0Y x 5r%Q(smd1'>?nwLn;R:t`~}[4vȧB?t|ШVʆ9=1yR7휯4зQ/B{M^{Yo۠O$Wֽ4bBڧ] +^j‹f3|Q$әQ-1 g NOc71t~ r۫P`ۓ}p=,UMs kqAW\_h؞UԿLku3I/_^ׅ Wʹ `?OL#tU f" FΡü#6,8J;7vMExU&*Iܕ*:2MBߞiz=?Veue:\ B\(\tkQXxgHWݯK3T$EBhsL-MJ̅m2%-Rs!a<vSQW>#*f,r0=PJFHd$PˢB[ļ9Tk\(֗2:{u!ڒ!"\?lkkYP}ܰ (7,yV`tȌK%dgzњ0v~4 Mh4?\uIx˶X\Xf.Bٮ3b ّ]ktD=Iܚ8xȈ`*JAH҂x@Aപ'mIj3Sݯ k~ 7ɹ[sJp䟫AhpzAGt4J"0,n1}YGWYhBe0aFHMUsf '1Izo2v4dVp2y jE5i%SGL%wiE.G33k3D*|a'&'wnzpNXN?~j.F0&WOSYn.cq0ܝkw?z{ǦmzC16y<ܻ -2r&tv$EE޽1Q3F jҐ"cD*瑕;SdѨ@RR=S|r^ſ7νś3:߼I/T$z}qd7Qd7,x9v ҃F91a-7n{B2 Ed*eF4$eb TE2ۢU 윱 5MC?dC}wWSCLM6bIc"{A09y )H QՓM'L NOy('&xNz,h}l sІhʏ"lfHKMJpj٬V^DσI`r]iF\31NFrũoR%\U*ѳ;\9cӸw^OR>J+'}\w>`lSv׶;'}zjNmoΝ !ǐR-1y=y"AѷS*jZhPv`m=1 Aͥ e VA2<ķ.G/V1'=ŤIkZɕNJӱ3$w'r.[q_K5 8.pm}c;.4Me6̣=GXu 5r77nè-"ܴ:vh7 srA3*ΪEu>!7wO{_)Z/gr>R]͙3Ah눉Ȅ(}0h^u`4Ombe1ZK:]ҍG5IߐH\Nݞ.QYHr<[%%7e*y,.zOKUp}j:PQaaaa1jU;Һ9Ռ%8y 1D=eҙ݄Eܧ=`] ؂6s 4Ҙg;a:|Htfqv:yh^X.O^ˮ2G-Vs/n1̃:`U L0͘"-p`g܆*wҧ$]+u.xk?\'~-ϗa,E+׵rSق)_ET>|!=B>B8>k"J,3E,n&-Lq4t;wڑUh y88Ey:jd)<:x$6I3ieˁ_ws˕rn<~}gtd|mPw Ht2}"NC1"(z {4Ș,=|lֳv'eKڷƋI.)F*z?w~LJoǥNx2FuzSz ;9Qrӽ9$(x-`QJr*E4ZhER ]v SV3Od?\tl7;FP1f5q uu~)ħDSF-tnQr0t>ӅbI^uW {+Rp4 H4F 2pŸ,͘/&}[9 p0nj.(!}gҟ[pϸWgib;0Mt\Ɓ`#aEE`V,=?hnwv޶ lh=%s-2YudT&L_)a0;nsޮfxUW)z2a5QTQ+B*װV#'vrdujʤR$p??РB)#&O.pJ*G8ֈ5(7iW2C8#oZWJ+MqvGnH0 Hx*KqM&+&JC( Gi*,= 2ͨ^Iu!r/Tlceu $޺E{6or>6TH2A\/gRҾ8)~ecmB0jO,xLy%6I]dQ A!k? ) ~tu!$O&ʫ(*U9ƣ~^ROLDKn@ӊRYv 3CyџJx؅("kh=ʤZdQvWˢe(OtI>@ȍ6BAxE|G^I_sØ/'>F 靼jA|JR[XYQW]Z yOa (z+8I5R)TAyZa J@PW ~?x ǼWb^'5Xd ͤ6ȟZt@Fi~ܲo!GеLfxX^mAAhAATR5A$ЄBu'ɸ #Wr= KgtmJNGPBNF$~}fg.J+V|V3d6;lѲuX>꾎?>9.qmVښ|IG lB3Fms (PL2O}C0 6a}BAzl48[tINt?#Gv1,G(n~v{v3Mߐ_aoXDߘR,$_EP|3%\%)?"!~ Uʃt=x 3=O>Ei!82]] +;w~zޤ_ Z4;2ƕ'%'NV5~X $!E*,-} ]7X.6Ux=+&y/~wlXׄ^SV.D,s}^S֑c-9F[7ZW73_*ېU2+O0%aܤ\CqʿkDr /.Uc:+E W\&ӊNtsN)qIA(Gck]vhSr7{O`wTz_`uQa\wG1Nk%O5o݆ MzUY`2E߽GtUohջߢ_3A?mT0ަ_H1xxh8 ,ƫ~%JHrQz$Sm:_mQy5$EQ-ˣ]-xZ@+_5sa=F^8v/xgw[,Xӳ?=J~_ࣗY.v ޭ[m!. χhwlu6m'eZIFj|Zi:; ?[?/vY2~zzIh{4Sj)nWbA59;kMh|s 'vgAG3'X߰9>l =mm;r2ӛ7#7u%qcl<)V_9̮y^zs:T!Ⴧ oоe`V-KWuJ蘬LzsP@U͊,(rT=UP.rVҜ3|Xx- .!z}+q=lPoћc>$ RįZlqݢF#F,)S!G:=Ku| \_[ӗ)_{1n5jV:}=dXVgP=`_NIr髴F7}TYv ušTḦŨz1:$UL_)0Z[܊x‚"ꨤ/EP*3gAlg%xEuޤFQ(p|pR~ajg_~mЉ %CIIÞݱafAT(<&SXZ!j,(mw9rP"fvQw"m<JPX{G!C*P}d(cx< f"{@e CsC)Yrѿ!J챇(~=X]AFA[Bϣ1.y4JZN.>&uAhU >Zs09XCeˬg16S$\WI.0GLyaSx.z7 { >: ~_Ccg0)_/[1>ڎP^~X|A cc`d!8`ғMCFt25i 0CTqcXZ=@TO ` Lp3HdHB.KZP~%jV0b%@+S|F16i.*iFc7J0!i8qR:itb xF JDJH(|G9XXAiڒ嫧 QvV <`\Rj$c)ߓzvLL T-3D)>!Pع6By01*Uc!ϮzyT2񜬈YQ%~W S3]+ة_lrME}B$wjS "I~`WI7p>*B-#5Ίᔛ!.B>eh y(%. LΗ|Y2~VU?Rg8Ʌx;Ygn=Æ  #>37l8 E$9*O*R# v$22]!;T.6iI\3= Sjks`0c%W $I6ՃWYHqYܒ}ˋʎ+hPԞ=]:33N,pWL(:IǩD0X#Y`]-)tJ{0صLj Xd#d yȢ̫QU2R"B6rD&v[\%,kФd &lʂDem2FUAT7U Pa5Cuu '_j'̧f#NTohm,Fo9cŦUZkM3dv񩷆n5tVuӓ3?bq3Gb44HeWҠ Pzt`1$[9pdF0 ENKBU3'o|գ}cDxby4;lyE''uY:A8N-:/+4y4}Vs; ^8vBP|UA9Yi),2<0>(H]MUxrU  dV"otD!˰)*}n)*+ F)] =ڮWtEk ޘ5ظUxܑJ'I LMIaqAq0}ԋ ) s$'$Y%.&#Op}8=K%rVtͿ?R<=%la)IFvZS]$Y^e瞀is^!G&Ȯ?ۇ˥AE|HѓUz2:0(Q!C ǁ5KuF A]*: գȆ'*kύPl5Đ[\׾FS'LS/ ZmJXLw{|+|"cVܨ9" vfy8rkJQYs)p"+D=jBSi;o#sfuSVzc-cf𽴀}OXcw~[-wEoB7d,Itv1vdR!j]AJMLES:}gI@GQV*G.WC=Sڅf߮ФtGy^}H'&I(.hj* PS)5a2LR+Wc95?ix<@}6Ve1w}JՖЋ5zW|[a ]P 6FcDQ3Df+0]j -vRGJZmjQy&֯[0FoikJ,-cQjbELMZJ23Jz?d,z0ZWMUXWrm^UIIz\6onqإY\'5,&;&sk~TʳTfn禌iRƐ hmc4 x)y#FN&]0_ V_PKR,̄CSA)o $q'U#?8 y2/W7]/RkoYkYspva|~c h=ٳ}Ol2W/"AN\ 9[77.R ʉ_ykpT۫4bMWOQl5BSF<1h%9J~B39h5i\ꮶ@oEFͪ`% [hl2F&dX,TYq,Ocz0z])A -9/ Z!Tjq6s R;hIU0sÎgMTQ0q^~6wjaߐ(1T\;hRTS!nͽ9mcߢKބ(###47][!Ñ G b V0+ٟndoJg5"Mhb0'&0F/]{HP19HLM.$^w-[VYbyxدI?%ᱳÔ4tʴi_%Ǡڂ$4Ed<D82ha0TbH !j!V& f+D~PN;^C"3Ш8fzR pf0ܭ<8`|* η{M{8od$̣Feř00C 4/36 :PSX6Z \~ƽ)?MQcs_PjK:3AhhQ 2lm0&q\F:?d3$P a"Ru)٣Ͼߓ;b Iⅶٓ1j4m Fɪ(=҆ x ;天-SJHbB`J75]A!tltWԡ ӱ:ea'cK1eQY(gH95j#RBkO)p,PنQ 琠V]3I^L^)j'/ې?-۰]{^ î5OٙM?rysaVKYs9s<ʄuz=o 6N~nu]>MHwu#?Z~A듢ʭol9BAȈq7'ض\)I,NSGP9rPo`$eRq) b*Sw='$WlL'OlB }YWA>u~bUCx)sk$D[bRPN;wXsjP"ǫ*nt2 s46}+Bcrm#mV͉tb+d}tXj Ǔdbl<ҩ@znoPzd]6t$D Yl*0KG ?k՘U5 ?f6F;|j"=!9)߀ո_I_%aȿ[Mi.t-[AC/o<iji!HP^'#hb#$Y3+ru!'Sn9\S r)ƿG\o^ S΢;\FL2;Ch!D= ʀt~PElj"ųєI ]ZAz?UK+<7ԯHdz@DI37AB &ZDd%kf!!_7 OX| jlҲN|}RZ[Z%]Yn<"wYfqE@`B Ã31Oһ-EI)Po,C#h.έbKR& tL$k86k|cn(yؒ &C7D~q}qqC*?2zf ޭɾF7RMҵvH9!G$IZI#5NY-Ɉ:0KVa2">s 8䚬¡~L"yQn=GJT'Ư]vPz"8?J TIUߧܓ&VK%I8S1#w{HgARY:8C _/Jy"Q(ǟ^<0* 1eqI.Ұ9+lXW3SO B7QRWuZ/)TV҅A$$''GGL_=Xw&y%ڰ$VD3A\,a~iʉBpX~d(MJZMIL¦Hi&5%{ҵ%cXEeU|xQj^~fkuSqEt[v8 e5,g,i?ƿG+_a3G*zYl65|6bzMGo`&C٭c`cʋ<q]ǁ?_(fw~[BM}1iۤ\p@dT9-[Iߪҷwd_y30n2:ej"hYş2@ VdlrtPUGbק7CʡU yyꈔOnz-Eseo-.aYl|A0>Orґ2Œ:}u:Mf0ȧ @TW=VٓjOyOnmOC#H'5Rpj{q3#@@TϵN U"Bs"DOpzx}^j I"p9 pe Z%zhA:CP 4l(#_2,.#xX'&>BPTs/[5u~r;Qq9ዛ0+ڠ 6I*= {ם>.}4O:<6  zxP7;~m;r ;DaHt!4at/y͏,٫3\;^7;ʯsm=>Y99).boMԬgtxmP*,2Ce0@_<!P y*2|NXD+ Ϗ=0e_RJ]O?9njht6$$01O}vⓇGo~[E'ِAnt*I$;!AVa^Hr+$mT, 7vtm +(%H璂vϛ p?zxrGA=lVy--غ}U^j?&Ҥpۑ2+.ZhzZJ2]] B(#JMECEQ/iRW5,Ȗ_I9dx+\H[r e"/wWW5B=a G3lϏ-^|O(6sGGR#m:kR^r ot?FO~CQܿϐqIGSÇ!@vQ6ںؔYt۷]O2Pufz폝`;o1yד #0Zڽ…>|V`x›chK XB*s'/cl?z2#cY.1P)5Jg@ߔl<{OU0qb SWN̛c! E0o1|X-)^ԣc`w-ŵTg|}J~oS'7FV/}'Lcq1B^gbyeaXa:#Mt-.z\gtekv5p:Y_#Cє%E`aMjrOtFCeY_c@ zgB~ؤG][lahRgWt+چwdؕ2]STE0"XQņhLT4M1'5|k?8h~^sZ^}WxX/owjJK}w~Ÿ\wa4oy|nV qgQ;:=7ܤ109w4p& _Wk .MY;Spany7ZGԺťnv;g<_??^~;GN2yjCI_>:{}8UդZخokw"/$UL1^Z/o`zMػW~C-)~[_ߊsG'x7jh,?cձˌ#׌O-ck.Z[*yT?O5kQZYY0|j"oܬ:7?p7ᇵ=r*&1mQ^_z䍛er̃ߘRX c>X QZh~}Z FӸl%llb6|Kg1>'KLa&aΰ c߉<3g~٪=iFytY*)gRwfN9y~]NS|.tמcϙ=cϙH5k MHc!C>,gt}#^C\vʏ{O):\4kU|攑ʎQQƞ'eSFx.Q씑`CF G-2RFC86@k[.?;,Ր=9*?>.Q07ŰsFbQg957rJvk5Nnϱy-Nne4N2ػ|!cy9e- eX)m*-)en 7W2nIIux|qsYC]FCClԆ~T}WH=o=Ԓ؛Œ#),߈2˙)cztwbYjiAaabQNK9]gmp$A;5}Ej7.{(8L7$~%4u}3!Գu>EUzZ_2R'k/}a)#xRS>#V_G#^5lP6ck5h36@Ar,Sx7ƣ$<煌0$=0q}r: er^vȡtSUt9Cr8PSkȡccb q/cozE?x7-l?H<_gsu#.P2cQ>y`LJk3k3 =:rn`̤Lr傲oMu9QN9SY9ișY'Ms,Աj,ۜmEʾHIc#XTPXg;f֒^aܮބ™ޫm|33p$p=MhAoKbbgk۟QrM~ԣӹalg5 A?jS'sK]ZUN%5wlCZ3-1'GuuOp4){˹} E>Tgw^+RoRF=R-1Ei ;co,Ad K\?^ P )XxW g; tv𗟳[ENR'2.-$6{5> R/@/>c3ɖS-: vaTd*_vuKw깜Ա}n1K˟٨bVƍ1x:{ٶQ(}V Haqk…M-YՊ5wn#kJ}X2>mƑX{Nkf{YSM*_ѩSF,)}t~ymu9DL_4fItp~cxi!O\}|P߾r`Hʵ5ǏrMͫcƌ7/bN'"iq;Ԕ6yZXslR*)7-tghoR;omႹQ{B9wX>E7`#EE \O^3k&f|Xwl9zûu:M&}ui>W{KŕZ6׷ԗɏ=;S-x+=Ac\U)nblڥ4{b:.NX8XԷ~+.wL>r.?׷wUCyE?!]gSU= [ށ(tay۪  :ҒsV^OgjM2'7Q(G~ǎ+[YkSx?[\g'uz'E&cTqم?6KgN7L3/FݹܲMe[_JҴ✭~sx;ޡiSƚvo;OUpgOp߆3^XOzէ{1ϒ{S+58Qh'/Y|W[Tkn޽-|A^n6c++Ep^yCWTtZ:!ws^[Ė}vt> n\j66GŊIi 4᭺>#ls‡qKz{twN͝7(lի,k^TptLn{`6\|wrZn [$t/348tQ֔'k^^6wW\.kFM^ZuPmIRyDimK- díXɃ:ܧ@^FC=U(SwX$G1rȠ֗o1:r豓^YXcIRfܚEI"&}mek[աoq|r oM{}Bxt7Y4Ѧ>snxN _ny鵀^OlX^S33|zt L/L?^kюω߲Uc 2BXou`ɏ4k?kd{>A)ֿ1HM3}qsŻYz7~糫mM0|MRp})~e$r[5I /E*ڿ3m3gެ䷂Nz26W ᪽Mͦ\:z SB 87EQOazH>|vY[؀dam.x H3̟UOKmz_Zf̔DB1?O$"3|3|W(fw=3Fgx' k!ÓFogMYkofQybb^JvH/D{}8͍>ԾfOl9ұrͺr]-7l._|h]W}(zyNn461YPm{GܽR[dPc:Na4wwsnebBf]*f1y_>cml*VfUg`m'9jYޮ(ueh Q܉˜,*L%҄oZQ(ekHߥy4?}fX#^6 $g5>aٍClG1޾ͻw;k~8k?MӁW3-k_i2vmY:{?xl7Tʛ/67С7 h_;,=YFB}uۜ/>m^wxM{EeᬿX"odjJ% ResgK*cꔆ͚Q {q=qKrCge!Ç^ٻ$6|'9x"GqÏײG` >~X-~b܈oRvH~hF"dTQRE̟C!TZ4- ڜ)s^ Hmy=}="cÒX{6]ga;.N]Z}OO\P$jW;NbKq|YcKz7qV: &|' gRc$U[\5_Ov 1N64nxkbȒBe,|me%, W- 7z|ҕKRS4wӣM4z!un߲poѝ1TͪѤS^um~Km#嫶RҏiG6?&AxU;7C2\es];/q-OۧK OD >F 7ZX&͏./.}Sk>4y8]Oͣ pϋ[T'\bY˖z؞#7|̘ڏ>~E&LV֣o^q'O-^|Mbiۦ9}yJܥ U|t)YW n՛E-{;t|nկS{_Oښ!ʧW3fa.ٶmBk׮y1755m[g_=3<8MȴqcMB*k#M^ݢ rc1e4)=|̑?ܱC7gYPviU篶 ARͿ> DG]0Ķs3t[߮[ˉ OzLHO ]oTDu#z Q+\\!Z!!cY?&okv˹sS+>ӧ6PGt|O%ýn:̔ C^g핷Dv *,xT˲n ,;2 ݝw0>gu]޻֬GvG'vR S"hT$Cs}Bʇ629ӮۯN;k:SpsWRޣm>!O$ScW܆)Њ5e/*LfK))ˋY9疜ZOVD6Xیntn_?[tK&Ћ9n?Z!|Qg jy;+0>mo')gAs"Y씟jVv $6\ɞ ybXzۏģIݫ;"+$̆QiVzJ0pƳ:1[88^Я)vsbp|tfS (~ p9-Ja93r%V^`u吣1[D^ vCbp ֛}yN=vYIyMEG(6L][_H17#R.476ˇ G=?#x OAyGc{v+JAЃܽq}ފ _iosT6CKbD\v=YJ gT1.;t/1fҖ&Y/ܫNf9=e1n[E4iZӴs!vrwi>δ%?`c~ҫn@t־4_p^84׆@H@r}/IYܡđdzU6FrSe:O)ey!DtVeRW14h2]R]Ʋؑ2^a1RF-ar㛪A1AebfZl-, Xc!9*oÿ V9W,V ggG$E"alVIjc6{<=3./݋3աszR>3ي HWZ"ε='KV`kE0}Qdl9P\oVF.<jYSVu}h]7}gC4b ,xA }R<<(I zl5I5WE zٵni22[`{OPBY$um0m+6rȞu8u|JY%$|a;1jhśƁaȂӦG(Է^|NJG-ƻ*QV}wQ,sA|s Ul&g9-7ȶtෂ$7+['|$O{k JѠC j)Y2 1( ]4=4M AU : 2-<A;׮p3yʦL vʊW/+qES[bjcMD+ތYd[\/5e.m+FEXG2Mu[e%_8Vwbé>#<$YSHU apu[5tpXea9K+*k'xP.=UhC gL?j Dz$"2ץ(\ 27"1<q<Q/ , T}RBG> p "7n8\78`*&n1X-@ghV$]tHCgjʭ5vga;47*%q] [gqAs3{Hj<q"[,l5ZB餧 xoqG2iޢrn̊%խf*޼AYX:Aal uzz*U];য!)M)Wwf'YW(Xq,ȪS;M x?VΞRvg|t1 b9(\9]5uZԇ6j0:OkFZ@u ܍9îػ ('+BvVAۣɦH.@Ŵ!U՘&`D7hA2t6zFBӌ5=І XRδLk%_k^{]gh3}Wgt|W]MZ@5S*=K0 膤l%y;ڹ $A[|a'!ƈ2x:˄G|}N8u{9!.)7uwDfKge]r W4u(#> r8ͯFCpqPfg@G(.mv@za5SP^8D]̒T^m^l_.9<{ENBcbds­V\) hq BXFWW[Efzplf/e, fmç$52Et~ 2e *K\&tlrK=5yP+[m/>^|8֭J(rrmSKsw]Du2= Nv*fP*]ss6]ʩYIMf+wp(]!u_`h~&rE88[b)h|DCYtsa =a+L Q"x * \PF4.ؿ3ʵ._}k65_е]؟6Fy` ʪLy"To/Oe^, UڊJ+@;ܧB΁ `5HUZc!fs|t}4\<^ ~d/ -h{ξ,U~8j(Rs`4+Xux)^+ˤh KD6SP8<؅mXgtqTWʗᮼ:-lƣZKEadj{wܝ4W fПa.0E [P=b>o'"+ؚiN+[\~bIor_TtQ\/ u @d.nK%ikinUn[[ 6QZskG򩭵͋CsWyGFF(H m3S4W5V?m~̚[+@sIg{tY/ 'KFZuSl.|Z׳z.lsf]}HwӇOZ ض);+^St-)$ά {nSܬM##5)1%~*C[AtJ7r~%G4 HvϹZ18̝}cj%ƴh{Zs rkR5_˚ W=tS7~qVx޷ۏ`T+v_{T'?[XbV1H@9?{,)55zW@?fbZhmi2KGv3=~Æ޼u*D'oPghy {CI}]Θw@;9 Rp2$Q$뻒w,MO-aW:{Eh J bSz$)/%RU)ă{N@"qlc}ohL*eior&mI<5c!Tb<t#W%zD"p-Pgh8Rr !R@f`Z|xhWj;RA_pM﫻#EQm6,[1cTVZjW(&NPrˏ5g?+,? T3r|mm=TId J-ɉ27RP.ndna^[)Ongڛ4Rk6Nh\X<7plElA)N7V=ɵCh?-8/jܙn< ON6vʯ(ga=˟\7rfQc|,畵2!pQ_Hg,$c`}6,fRfn|󤳩ewk [u.b̝BBJIEgo"pʾ1-iy4#d&]c#*P^-`xxuIoT|?o!%twd JVC0_|*~4o+-qlyNCֶ89gCo굒-xdw1'-p|@3Sxv^#$q}Yp.k#!E֘}YTf}xݒٱΓ!B\'Z;6B-O Q|~~$};Ur(hڷUbҡN./2?P6S$_.L >W/',ptD5+ L_pU[g[eU=wgYj\ֻ7̄/$͵=m&%I%VBM{CmWM⇇3]ga(j@ZH/fnug8*[^juRK*s߯H ޅG|'x )jK^oh8♾am Vk1h5zi8|s%RQHI~HgoN+VR/l-ԬߠM_xYEVp,ĘwDbt!ϫqaɴxv`4:Ϳpv4uoXX@c'yA%IuEss엡S Rjtlo4 a _TcTtT$vj( vTPjZ 3VJ [#0BbVYK7'_tM7P#uuq@;΄S{1G窼e:T\!}'G fp{yȱ>FHBͨ 9 \VG//IE+`4p/<;\M`&*pqR  l*,|'²iJ MԿV.Pyy{W/)1*$.n-_ K|gIGWhj G0d )pa*P EJE}yj xx@RqrYUKTUE3,TcJ\MOPlC@G%_&u 'H߾ )plHǂjPNr0`^Py)2|!Wp!8NEKopj|r)Wٻ48PZ[G/wP}A0ٯS:":;zxT%ӏ`#KW ;t ~bF0nŷ'!-4T6TxOFX p'{߷kGw eZt鷿i] Ǵw Uh&5}{?yIajߖi| (w d Jjo(r0Q DovP7$ ^adv k$˿% :x灣QꢘHUe0uTmtUy%! ɧFeg!kog0]~R^_K4to q~>ƒ\rbuiN_% +ʫhw;?A/QTr90.W=΃1 >wkU 41^! Tu8nƃ@߳OӏjDoUv~P?AW {4&̃݃D%_߂6$^J/vduP*)yEyOvBr?SȖϤ|j PNUm'}! /!i`wUү0 (m AMN{j"a`ë(IXUE/V ؗ^X`m-o %b},)EC0.~&P hãW|QR/ )D]{⎼!iFcaK, D8pN999Q%Blɀ;WMG oE ^Ŭ =p |>}k#h ;/24gP-VC~;@Cָa:% UT]ZЯZCFbu_7f\yq cc$RiQ |oD"vvtuY9ƍ}C+Q0vz~#`E?f@L$W}'uzty[H 7?f13#4Sj/_݉s,Jm[1/L+l;Dе1xV>98G^,{:Y E#<$jk)#*hHC>L^OI/n+A %1% SF ۉf(ma9qi^Mo4^U>c ,@ I'vCl](#K-k7E3#Cj}^ƈxCgξon;޿wȾl|4{`!fJs5*uv*jebczChYhw9{P#7L|o$]<~Q0] f3< s (^W#VG cCD?>"m)|$nѡY[{sgYac̻XʹS"Nۉ|kiI㳛vf/NlD4o (-E4d :qTyXCpՊQ\=_MВB\f}/W4>kXiBkO x 1/P `y7ؖ_v8I-2O hGq|"YCx~}:nzŗAfm9S6щ(MŸHl5ȨY2_9ǶM_ɗ|dH6̱կ>Fq8ݿǷDfNm, bME>!$F;$^_5)>dx^fzoJexh5 )HO,Akog+OvAkQ@3{Av;'s@γ ǁ9&f `д{۟UhL%Z[Y`b`t"^O{ G/?D%~DfD,ZbcȷF%"a4B"U;T`X^|>hY_4я茈?䇹bU2Hq+re4,{Ȭ]NڍB>DIKNi7z瓙{~R_kap ~S~ AT!AS 1_ќl*3 O ќ|*38:cTSJW 09H 4AZJc nm.8 Z6;:m veEl^À[ۨ~dAKyL^2E(!0>rXI51,w߲j-oYa˯!"dK .h22r=ҏF-L 3 ?s7M~iaY9:")Sy~7sصL {!f HlDRNJYI8=c231IKK k;7>zy_$d5wl3o\ =aa_=7?zn[\|(P?Z껏CLhsxǠbߊQuXۯYG[iD~-lA q_w/r>+iW8C Q=wfU'Qޘ/#9# $ "wuZ!DFSB":B0Aeg+4s»\(QޒWfjt,lgJ>H GyϦǥǟrВ 4w;3+*aF<|u6B&+)={Q(JCc$!ZGCUF/Hi )]* nZײܢǴ&mDz!,Zvf_I7?4H^"~m^^,4I8xdNju` &TS'0==?u5@E}ҷA6ue(;8FRѭΟ6xriQJ?Nl z+/l^f(v}+Qp1TdEZ@&X/ S0k,s7n-;25-tܖ$wj\ު-|'na?m^6{ڃ{lQ |ShɃ|bimBoXMo<%ljm(g|E;|z 9s 0ȟ8~+`Hإ@{TqkI50M2~艡Wr J>R~~ei^=aB[9W)OP{()}cr* ҿ'<m_sX<:[n?_ Kbe;m |bVԩ͉9 iBZ Ip96qP>N}tO<o?Nh_P( 70m I.( !$|(^,|B8ݸ]O-f:}hMzBjK va,DT0QvupO aܘFFqLq,ﺕ.y0aT*CP&Sr?vQk?.haM v"՗O,R=ʉFo{rY{`0B{ɣH9ʇcnZ^D˅OIeTof򲲄El{ ~iFڬjb OQum.!ܔH= #Խ!" TvTcQ\lZ;JPaoz_+>Qq7Uh~aM{EJ`xIIIIǪ:BI 8z!Bj!R%iF~ [|Va1E]U1^U1%Wd+oǴ!>NDN D⃊N5|r)ۢ|btL dzt\vHSHywٺhC|"Nə{jd{T|4C%'&1/*El0z5XbL$ElѤ ;鰨'9%0^:W 5/K82m[&C2]qXfdvdpϪ9o!yZfIo5Y/cbx _6HeoKzJe'^F 0$m{z~KLvd~֏M~lc*~#Ʋk?Xt#{6x }}2r3.9qCڗ- kC1OVw/yD~C\A24FN3%4h ⸁m[Rm1wQ'/o ^A-apKӇ4PV'L3e6],ܝs~3z3x;2]jx:%]{EYv.M(<TCF,$T+1(D[McT)FTUN+5tKS|&:bܓlZ"UvepK&+0,`a2K2${j{\/35D{T}cx5BEm2]zGX֔jti}㑋\~7 #yxLl[Q9|4+O?yr$F2Ri?Jna}Ŧ tb rQJB-å-6AP*,^ڭ`*)MaRzPGdq 2ɨ=oa̿744'gL<7a2}TW<"#D12RY2yUqGzM.2red㮔F$0M\C2~~La lo>xd+@15-Jˏ™o"(f^D51YhA}|APx2I/|w*=q,iܬ3U 2 9GqtFA]s2ϤtіIKd$Zֲxs/,t#+k[nXtEv`P~Apx ?\@8>5? [I-8 aQ !"~&􏓚죽 D@'/lѸ Q ?C"~N?׸+<<礅]}|U7dM9!yH!m/׭qk&t /d +#49{iT[@O,3sGt`zQN_Ãt`SQN_Ct`HQNſist@&t䢌¿jN,@zj/p b# 7ĵ3'H : u۲S<-c-Yd ۜ~{4sM6oFt`vQ`߀=[r gOkU~ }a횇Z92}k=D9L1ӣ)+_[id6ٮ5#Igǃ릯^tQN#_:_²{V@'lN[ sKQmߋҽڊˋ'֊xW1?Md-!rK/48.X^x4Зh"7/ -K7A2S{A54:g Bs/VG!'Z&1'6q?$Npr)U!O۠Ŀn(VoѧK;իculYĕ'\HhWa;+X_tysV C?jRb odV:V*mB{m8Grp Txl 8vsk9fOm(w9̂"]实ilMϢp<8*] ZI<]5ЫPfZ[Ce(GRCdi63WO+ 8pX{Pc:̫ >^'D{܇GkxjdEeS_Pqm~;nz6>'Nz]1qj<.Nq?/'Rv{l/. !9֗ݏ Ơ#@g(#'/^`q ׁ vm!uxlC?oz vReY8 f>w^.)-I>S䫇0nUEFᯙEe=.pSĻ~լ \ϼ4H! 0%(KX\xI]˷OダZ}Sfٷn WUc|{Ck{zYGή7.! bͣκMGt(V=Imp|BwӞ W('| 4f&]4.J 1dvnKKHvnOJR< AyFWxblZó4{ֳ㙡Itd?@lߨ.G5%L'`Iяz&cy";'`.e'`, )ꫦt>Bp /0#qwjauY9=فXes`;*M۠a/tg3 gtGPg4؄0MZ"=Z"-n1PG0ɩ㝡 O'uڅ)=^0'x;wHj(ke-C~"Ӓn@arWWP6'p]h]N]"EN'|r*;Ƭl}-U#~3皶l#olJ!U Rg9r(+̇/rIcl| ;N|ZC'9#zF#Om("7KV5ӦcLOw](7$\whiZ۞>a(BpFhQ W Pq[ pFZəDMݹ ςO91MJwuƱ^-ϓڢ{׹7^CKϣď#V=r /HT,pi0 uʢb8+ Md eT;KUU<.WYVܓ#iBU^dv3yvVicU[cYtw^S]VZy!/2K{QZ Z{Vlُ8`a(mK?<Cfrz=\ng |:N˙bmp/UG`߶šʁmK2Wըu|FMւܟSCJO1O\nCQ;{Ǹ.?A&>j?<7bCF>g?Cxa{#zFpOc>Ɲ;c/tNsUaFˬ)N%ڭ1Hd{ȶ½,Cn'[n{&˯~gR(M~\,* ҎF?xoH̽.Whkc3j߳hoosG ?Yyˀ oZgpcJ| ^owuγLL1yXR c(SOXþ !'2*$i\ľ -+͒f'F؈YAɾcbT<'x5>ftV{J&&c;4.9׏+^t787LYּ̮[{~8OOc-%)kƼWּ͚H~djZXqOСuq?&Ogekބ,"sze?~>s{rޮkUN*ٴƾl3S(q)Ki{%Y:pl))e&ʤr_{7}T?S -./ζ].br^EQv-?1ՄƗGDhkOx>/O9Xݩ6qVGm,tH<ޏ"Gzr}BYGpEzwB5Gʭ~aǁJk(_ߴF*}#4g+z=yNOFa8UJRb%" jݙ:X $j/nl.\J=N Bb#@9 \l i?-}yn_t @ynDzLO7s_ 7ϣ eUͦʱᵊSt}s! Gn@K؜gk~oN_<{=+?@/cNn[yQ!)Z3~jHҩYO&xw Ҥ5˶.t6.۶l۶m۶m)N߷g옘?qYy|\+#2nh(N>q檗N&TAXO#CZ-`?#1X,kZ+kk׽r':lG~αdZ6sZ2+R;%wDdN%[Id'XEbG{֨U"/"]N25;?E1ٰqILE)ȯ*Rܜ#!7Va)HR!(,(4HďIZ°`}=0,i bd>8;Tk0?_nAܐ'ATݾoq;?w/S4=6n! o0/~bLsbzK}l C胨V[ \G@5I/ Mp+`G T]$75&.eVL\ylj\ioæz̟)[RW_ 4]cB`IFX%iēNvA_ś>_=&fAV w|Qss\= EO%l X+FFKm9M?+ƝY-!MIMx^PO |J'97 OnS+ِ<n$|PP "p',Yp'f/1Y3 CWLl] ]=wb0e8z_L }`vԭ'zEm:ɗbtXߐ@4d+NEp@!'JάJh)`4LSZ'ROZzopx@Ml|?{x8@nb)I>(°bz;at@k{jAs*!q{o)co=D_C)I=c8 #_B  bny^no^N>6Cro N=_r|>fB_o F<_RF̉@ibf̆bT>ߪ2 E*[ u4b-PU=&k.D("~(S̩ؓ&HC˰ ,=cf^|'#'/9Sybq5 C@Ks A݇!P (  +Уj5H$UEEtF\BF(}}x|@C^0Cu +LPQ=v> h7F "SzT%6&/;e=#+ Qɕ˰#;hjm1kh;Q%k:NKN6Ϡ苲CS]BY"KY"FIRMRm|MgMGQ_PT'dXYLfbYN(]a9Ҷ9Wq܇U]~զSU .롾@$*6du%_I8Sl#UUR0b$ ׉DWt WkG6MIҁ1; )AXb0bf|K?ڌ̓c[kǮ-K DL2`FJŏ (=,ѿJa)+ї`_'Ki7ZCfazsA0}s@nIjN$(R ulE ~ DX }[t"x{CeBcc15 Ze0V"E7MdkՖG7i}OM1f9NyZծ ]o"T3ӹahV7y!XkɺmE :{Cx ~q2u$mK uӦ Hj(ܨ)>+(i.m87|'6Hjb5^Z`+=,h7U}mNPWp6z=3gOƽtç-g'Y`K+ )YMJܦox돤N\InC?OW46N\/).o35֩@Yժ@I*!I7% ,#yQ0u"CA5{̀!Z5` ^.VE,߾0v8Ղf+{8,Z.x,*땂f M *08?H ,bK!`-3)|_,aDsx? Wu>"_C]/:5C+/阺:Sԕ39R?Wa`AA}8اqwv`~| D;_1}nu>"_C/N(hg! ~e~d(uvL.-K[԰ʦAH*zJAj]7Jc{*vY hgjn?n!\fL{q!gUYC]%}V+'St-["s`]D#яxij3~g&Mx %~ֹ@Z [QeI(7>%(ܪ'#5Lٓ Zi#m 77g*m#E7%Jkbd.I(VkX]^ÇTꚫ,iˇTV14 *4#wrqp2O!oNUɱ݉Xa"XFqy T:bu8OӼ9ӼFsgVn+^wDEDN/-i?~/ƙ /iKmL5eo*oi6#Oَgobe%ND9S }O$͌ *@~DeG;~7~ M&3ܼZ؃`)"yIN*A5~iT(B줒Fr)YyMd[ B`ᓮzg5`W =|tRET_TD_.I/,=uIILHS&3ӚkNOdr28t&k^+#U͓T6B !BM %p F lEoSVۣlG;K|Q>rťW菐s@)Bx".AB6"\X)oٝ\ ǥ& CPSY%=r\yy@A?p6FI&.KL9BvBc(xzxtkZavj >:*')/[gk]E{/*yX̜xj@H4c֠+HCr%6m $ZS` uꀢV? f|C{l1aJB. JyOh_qhz~!%GT*  q:jCɬN7jخZQF7sX4?ɉ{9iӃs"MfʼAU;Q/}PE%Hy_H2Bg|0!Hң,x K!v'ڒk+|\U;q|39փGI~ OɋZqۈn̉pSRk|™+2:B>*8B ^;^_i=^XYw۴e qP4X78¿O tc/O/i@/{U.BQ*d|Z@W2}>ܧ$X|(v[dQ ݡҼh$c%~@+zOSE%Ǝ2F.RTWb$rQ8|(Edǀ7AO"fPl~J" jd$x/jSҢ! trrruabs^͙G"iO1| ǒ43:( ëCWeӮWҥ4=nfwǍ6͆ y}A{:|?Qu)]#j+*Ӵ' cmC6-JG^V4 sLO"i)J-%q?'U'ێ ޥ9x 7>Wcr6+֜aH?Vqӹ']4hrZgOW\vkj{mmL4--JD1۔<=gFkj*Xz.{!æ:5}g=M-y9k={iXV.u56͇SF nɋ.^>_Y]gf3̄W[,&6g()gi:R93V&ǏExo"x">x#oapq?Hd1Ϋ ZhQN۾ƽ_*RmmcZU7)1`ĄD$yh t:tnڝ7σdw9a3C?kMj?U"X Ç P2i%/wF4GE~$_!ƅW\Rďz;dA9l8ϣM2w'' >'SA&QuL¡>d!SE&}4pOE6]ŸNmzĘQ;BOI>R ;NN>?ʸ#~TI! #}8By-/nKѝjSuҢX0hS(LWJrxşWkIߙ Q\vd^dQӤRBn=\ƢMM9l=_R9m\K2*\[)]^]\vv\1MR0K" njA}֩ ;vWXzXs4[NBZPa+|5Xd.2E P}w$"D=];5]c dsNg`+7a]_F͈,uj\KK2` >l$nu҄ϗw*U1#/u@wW܂8s4{RCJb 9bwudˡ 8w̸7$F RԴ=5$i w94 F3Qh7onfPN4I܋e\Ga0d#uSŇk4H署&d׼K'R&j~D%; <n:AՌ2vZq[7^Q9kL !BDv԰eX2LpLeN*[;4&[J1~|ɝFrh2?yJXvwz%-Vi唥 tCPI pxlOx/u/ —ժvˠu"E:ͷE@@AcMv`ڛ u*dlpk \Y˥k[|_PEc[Y &#tLQ4]4V#ۇk\X@Z6$́!8l"7pBDx#5IӨ[_|$ # lCt[ \sųmA̔bRPjTtˢ:c+,mG:@0|CQ?qȭGzc:LkɆν(eZA:ܞ ,9ڍr #Q3s1n@mfj r{<Ӝ{%ZJTU%eY=dp肥(JYyEWO#,']X.WTMM2 y dДi c.f`3%xWq|l.7٪ew7HΙv'oq챳5uuC%4S\'e71rޠbNpDnV3g1-\ىRS>< S`Z iMdzmIቓv7vy#q}^jBOdr }۬.LށHbAmd_ Iw}3Tu@uyr43voLOf1ܙ-G8šNA%A񥲚lP$JKGZ/B`>z-r>]yUt:ӀY?@]uԪ#麊_\DO L̤͓.ZgvB31^A ߡSkSy Ux.(@ŌR(kF.%0F.Yp!U`(-sJWs*y)bD*&(8gfxs*C~1q Ȋ!>Y;: <^Hnz%Q%4F JR#hÃs5 x .W݃/X6`ϡXnh' 1p¹@f!J[1B)x8^/SFajs#ҦJS̓P=۸f%׾HL @V7rmsDߡ?E@D9&N' /jdSp!|*\r7N|$JEO2 8HX%`Xu+{>G (] CRtJ t yϳ$=E1x8-2|$jx ^kuaf=$j$P¡O39e;MRLNs[}GLSu)գ!qQzf`>Ďަ& ;_>,E]Ĭf#;xe_  'NQDP!jKzg2sg_j4;3?G푇1a.)yR)qF5wch?L"`KƋ,%:.7[dMY' \O9-L G L,f-QW.>!($r.ų[xIfLQ9>$y@."欄 V-EX4&HHtx&82&4/Q=G!oAx\9U1C"J AȐ$L,)MDu+v[H,qؓ uNҜSҨ']N=nͬKD5KW{,||_|{|k݃)MϏw)@֥3bveE]r`vhoZop=wMtbK T%eFI TU _hjeDyE |5lrHT0}2p~Gًeڪ n `8Q,Hd1l!aa,뻎1׀k#lWkvCsϳ-Nm׎TM<*~󪯖yǶ$7cf*ir__nЃ Q!|4迠3sTFq^0ֈ=x.3`T]bF8 QE SQWSˆ`E^S? *'3I z)P%F± AD ( Ϊ D'8%k,GGZ4⋄; Y"ye />q <8`1v3P 13Csc`IwCc2bLk Ǝ).u+2#IfFH]06_ϪEs2ngJ"2"}I3OC3AaN; ;f)7.O*ūP b+e1Xr0d إAO@nח}-3T5O=@+2=><$utPIۂKa[?9P.c522zzP'fw_};eҭ"Ǹ11o<:j"e6;cf /P$TWW'@O"HJ1#҈ 4uz3H -H708H,sote3 "Ij㺸H2qJ +U|q,A7l)+H05j12`\9g 8d!9fg"0Jߪ.NBޚۤエfmѶOzOn{Wѱaܚ;oƦ>DǬJ>Ļi6ݝ5{$QTf\q4j 9V-Y+04?a8M=ؙ̯4S,8+ ;q^Ypb`LAovP.AY~`6y#~4 ϐi˱œ2,b:ϕ?RQH9M{OdA ywBX& xI=촄ᗕ3QpefXƎMصe~-hW_HML' ( q=<wͭ10a f%-pIpA /,jFL'\#$\<6IQfc6M`z~]Cw_Qw˄3Uo4N?i~0"If֊gH7``fX.T>[ק;Isp1W7ނByq~I?rQp+ (Q ZH.{f}q|Ẑd L9hTaa偊_MxG !VvM?WCT$eGH}=nUZ4 x]"Q 9TIccq)Z6Hp'h|I{1{mIEZ-yREMZ *G B~q5ZFଞ-%+F ׆]k[_{f7߭ 'ӦZ*Z˅& %IYKN\{QŽc4wۑՃGƳuSS\\ FNW\ͶkmmmմIE1n.nIFWqG{AD{i-@AJM3GƇgӗϯKP⸇53R#樂4(NR.Wt-͜Qխ bi?GR>0CLb&!23>B[nZ7_j,H.8$#rK TKMy碏yKMVw|z{rYWDDfJJsJ }87U:+;ujr$9K byR1}hsuUyWvSyM&ן-vXb!w}౽stk d2]Q\شbS~~yyapx!$SJ]Ru-UᬻDXq{!|᱌XN]9r1 P>PO3ͪeҽg_\jhdx:,eȒmѹUdr~Rg;-^}mFÿIt'p' ٌ䷃F8ɭ}O|!`w;xytENZHjN_3  ⧼jF#0:1(3㵢*V#\J ee(TWKb`F`e2i<-SXFKJбډ"pJd\Ճ BJ _S%Évu).'Z^`wsx\'9׷=<.Y~lH=^D81%;4,+ K " p:3/u;/;ZQ~"j"n,=xHi>α [{pW*jX5=7[ ܟG|'htC9w@[2-؀y哷ٸxXz.Ɩ%P̳yQ]I;[%%Vek/戲ONYGeҧWV^F$Qς{܆V>Y-qpURnJ}gA/y઎?2(fehIE3In:HK0}~}% kp?;~|2Co^/r]|u_ \ "cl4Ś|}o㬥ym㬶^`1Qg/Z1N19 3BWGA8V] W΃ڡRQY1vsWU; (M V(yt8 rbM%>kn4Yfҙ~pqUGcHof?lYk'!wyE"'/~NPF e0kBSxlKJbAgVeIGŪkؼH/:ُ"H 9UݾY )Ot)8 c`Kupk8x,1FNԣ/EB|1\1ԋ $sy V " jo,ɥlPv{9{9 نw5%$AOs#;soqaph/*_ZR9TIwR |>;guBnLPTQ[C I-O':rԌ+70^[6/_ӈ2+i cItʦn\ܲ'q»@r 2'#jQ0v6fj$" +f su953MQBlg+y):d|;pExDT:9.) Q4pL z8/—Ԟ f+(ۛ2@@jGe8%9^4BWLE, !,xgf2X;)QDATmh>O*l̘e5Zf"sm/>:ssܽ.? eؖ+ՕaGVA- 3ka~f]&Ve !K߯>:vOA=̇ cx7=lCb GLB2Du]xHwy"bRs&يmPO8LHAW0Q26 M#pc߶CE30z_ұ#&V&oDTkS{м{sZ6kH>H!}WJNwwL ]=DV4FKmIEhNN]mﳹ]-˕C++*@tǮ;,|-_>_>Weu8,&KвKd{Zq͑cF?Hcz.hmi]nRg\ULA@w<\t%c9"BYmfpjvͣσJ,_@ῷ  zk2saC:L É>28F;a :crwly`Ʌ/ۗZ;wYT_d+.e{9rz7/<|t;>jWS3o͌gX^.?: [y SӍY7 +0 p%E0[0I0Ӎj4ܲˉBl9@Fx} ,8,;F-텆ۢ/|s,YERQ ,cN$"Y$%+*1lb?GM1{ kM+ \/ ƽTU0gb_ז^7jsЃۊQ2һ%EE;wruvU+Ybek31Cyª":@0j,QKQ*'T8VOA( W@C`>KS>UT*.ۿ~_DQrQ^,qA*xw] OJ#@]9?.ITY_/pZ_{dhU腛»A(s8!DLʄ\G'|x'V} BAGw^\*|4|PƐ_΂=&59sWp >,D ja`nZp~(XU'ֶ_J?97 %`B!EkșQpeLƲ !獛x3< d6!i ! ^0ج5CaAXИBd7EA2'u1[ _ I:C˻/|-E6o[j#T37WsW6bM\E/I6l;:T@٣Y9Ƭb wƌ!h&@S5$&jW >y;,~{Gы?IXگ8#܅%oָٽ+%Gm!l Ÿ_ۏ 7 O>~?S7{D=j5NjG+d6[[36BjC !|wc!#<܅ᄏ: e~)!s]pJ 2Fa!dQsX&!re SdBFΰCF!=No69lo1wXp9u~Ł>7411$A7Тz{Wgw7';[Ù9#8|]5 8py~< o"xjbK-8ɯXOx؝c.+=~WpV#H I. JyDi!}dD>h"ˍ9q&p>ʞn!57evu.G`kVЪ#=A0D2 o͸D;YEsx@5=j:o]R83<į.۽3uUwM =q ,NI4vUa\4x~MI1Tgz28hřy5V̛҈fc0~3񋤹奦 gv~W),$@Цs,'x!omy&'|dW[>\T b@0FDd"qh/1Q2\6f'B ;Ҕ+}t,JbG t#.ydP91SM9Z9+ZQG@iX/DzĴrXԖm D¾Ì`N؆7Uo(l#ij̟_/f67pVW{wv8؁g=iƧsQe\\%'~q"m.<,/gO+QP:ԿY 8` >byKɞZ̈3-E%K?4xGBiu[O<.5kR(ZcɲD^z;mxy:XĶ`gV芖)tfôR AEʈ9^b@GWo{=o>鏗W4'Ze~Qi/,u%QC:)R-Mzem.\F Emrz1[^: 6;\ S 4l3Jct-V@N\\xM&>s㝃;Wql Q\Pkv4 TpM%+DfxVa$ޘ:t :,܉=_j WEw7[ -O^um8յ_PM-`3T8ZuhRG$Dk? BO#SLÍ$x|MX0mKJi$mr:BP1AVE|VP"ݖ ;NEiC$k{]T5b̄#d ̈́?Q1s]RlN8Gf̖ȫ7͙O$O KR_Px/u9y ¡5JS$gS]+ 6 m8Z9ќl+L(ym2q9ltcP(XZs;7qJ>{ޞ|Ai ҜX40r.tI6 T[cy=‚S'nZvyt>L{Ŝd}`|0=f~i#(ց~@/{%zgTow L'7m!*^#Gb}_7մEY, Ł$pbri֦譓lZS1v쵫o FȻ ON5P, ?| ihCθs[1;Gw_i7f{1C+gltѮ.xiLzƻyaɫK'lX|L ?7ko7ܔ| C.+.<ɝX֞b&?Agwym Dޝ f\&|s1M[bwNiٴ2ȪUD9OM&vMz)# <ĹRh`#7W<=\ݼ쬭<`9#Ɇ0YrP lvM.,>,狀,6;v> jW[kE! O_|aĬ4ik3{#Bkwf>Qns{qEZ1|rE4UPlV2=vH&fW%/gtҊy].:xz߾nўF=^sm+2aMuK&s0E"=z_-QXQi)Sï ( \o>.HRLTE6ajwm:dmу҂؜iD-wߜ3m׃^~yoVVd/U)'~Mv/+54*G'A 6;$옽R4Ȫ,\S{Sⓓrf9j#5L<^9?fC,9HJ< FDޭQi$|B'5]53@<%q' yIs⯐0$D' G1vζ1}CG2c*N9݈;5IpkXK+M|OML&Bmʝpr'S&? R 6Ɠ0fN;++ +:4WO #qR^| ,vST9bVT(SCNx" >HX m>}G@Y{m9cbc UGN4~ڝdM튊iJPf[oi~&RCx˙uKfۂaR>sS"u$yWm]8v\7KW#uZhDes,05onaNhySxҴa]eƪ $>.y \ıyۇDHaj{W="r,ZCS+bg])ה}M6m=7M*GX/FƟÄ'=80yzrZLvEP9 >f_[!*So)[s| [b=6T_cUйsT~% +!R6}rjT@d\C59ɫIMJ{35y&M,di N256LM="[0N<-d|RjX,eEnb؉\ꉻ90;J/w?4W=a<3;hӢVsS;,Zƕ ~jn)z/4/}P"C'DCEvm. 9tu.qЌ .:r-<68(Qŭrtݰl򾯵P;Nh|G_=D%ˆUVr)Aj?fYeHy?h 3];XsSktMjGgK.X?i#FJTJL'E?x? s6 3.ރ'O( !\iz6 4x+ќ(hN-nFV ~Ү* v]9|d؉w O^[{Yhs5Gh׮%cƎl|yg]:t?^o`3: ծ.:M։F!6R H,ԴDrc GA1GB-#rbr5DF t\^9'>^55 x$Y2YDގ[6EiJ"OVdbAHlٔbsOy/ONNj ֙6.c䍕T1LAt/QW1K+7L=f/&sc8Os^#'l802:\aƁ/@[w>)̙,5!_=|G'7'zxJX8W+)gU]!B!јNsIR.$QF'-;{w&Hud$߸[}9zndB5'S6iQScsvwl^!<o7E @wtj-8=v>v3Jm¸trաSH8%vu˾S]Zt1V\d>9yɁ֖Gv^n+thˑCr/*+ļVJ춹b{^n-YxZxUOa@ztf!73BDᢢDn "!:;pۗ!]b>,Ad ο)dnRDX$[ XD_ © /$ElӋ sF`՚)$! T0n-2Rl0Fp`Fh6480Sh?LQk c!z1]apMLo'Uҵe]3o+ాjͮ=:%[:bÖ]_}|pO֭7v޽O[6wo.E獝81í;9M;iJľc5k[fr9OlSl4GEr_ _~~{9!w"Ţ~Jgf渴gM +Te, *꣨T*Wڎ^ Ou`Olƞnst?ф5=}v1T=v!<]88Ɓ8r5ao^ݽat*FMX!<6X@"{`!4 gt|\b$ AԻ=#,ijv%K'# /NkR<Į :z 0=^ ,٧9=(먃yiiG@u 2Yf|f`ڞ 1bNk[au . fNjOXVRh YS73)<]碗iL5g~L2Ni 9=ݭ_lBp񂞅_è( 4~: Y{J+z?}B~q92{E]lk+0P4U֣{l[[א4w9|BQq'2&Rr**$J5VgNZ朔B8YH_l8 U|Z 惸r >m;;B]&޳!/K).l%F qV23lyIb{nA}\]ǥ,ýAQb]`1|yU2 {]j^;љ̈)G'i[-n:eKϾ[cG͛ǧcO+mO37?@tnGpPsLX -o3Lf0;8q3 ];<Lϳb^O>R.|0Lګ vt F乎*Wm*NTc{ JG+J 3fM]S :rkF_eh 8ktgl >C:kGo$Hӿo?X@AU/y {߿=&$!2Ϟ7ofXwלȇwؽDr. =*41}zu>hW=MOO 91G0O,Ͷbڋ#P;uڎ#f=蠡ؠ\ܘ2Y1KǓ'Mm: ]2gh,9jx֘#2٢Mo'OnΜZ0Ӧ;Z1˙z)X & pKn= 3lCL*vCJZ)zd I/{{)M%L؜:{ 7:̣@iړ1=9b=,@Cxf9,1[:UPYŌW]NC[{AFu !+HIgYz!߽EKn˗ImE%|>'v8?@⏺g/x+m$9$R {ӝt~cgci(I7{J\ *gCLė$xBC{|la|fs)Ry8r#,d#yyF2>q-p+gnSDa ImLmFUO*i?J}3@|MJyfOOkߧimHj#sGT ;VDe6җe|[)mL[dGG,\:p@t"Ix|0l`لG teߢ ` (rM_ r2]q6E+F5\?̰VA@i錈>9Ŏ5["z)uqF.Iŀ;lg?Ywa)BC'K/ey|dэÄk B]ՠoyE̫6)]Dw 46MN\lھ /t^3{KϽ-s }0 xK-%Mm5l: GQGbBR݃^ vU8G1఺@¼B}[5aːnO(bkb Y5iK *R"džMD9'u{7;ei;3(+vLY{e}!wWMb."%w̐/oudt|C.ܝi.M3Wp jB-nSec3WC4O l)i onSƭ}$Ѣs9*)QYz 1~~GDJ(1BImxTMD$b|}~ yԆmހ~Eah'('7.9_0O\z{y-*H-prAUѴ,F+8 \]1ƤXg 3|? aaU#SC(1<V-k7x(n=fUk|m=aᄐЏ7r;To Sfz&+ gnS>?6bj{!=w4?Ϝ^E1L z ck(Va:<{L[QlF&<JZ "6ŝ'n?2ՏZG[n|6=)1zLj Wg/cjU< Q"4GO~P$6nL[e/Db k1> dn\6%|lfഥr4xPd N 'ݺTV5Λ?m%`bn$eTFZ[<"!(QV3e8Jm)BZ-"ޘbы BRṸFc<_1v!Bw?Q-81;bʎDK*bLxWPJZmy! [8z6:~YKvJiч"gpn>xkmd8!s RຍfI>AJdx_ 1u^kE\#uJ&U)BH7y1f/!"_s#uOF,z%ptϕ=^d(?5]8[EwUߙ[M%eSI$$Ж"^Aދ &E)JSQ@Q)XPAi* B93޽ }>_$;w̙S'NmBqȩ6yYfթ&/Ej:rW|Ēnr:Fx2KL6ڄ;w75iv+g|;pƹL.SkWYWVAvƑs-@:=՛؇n3g-A@r; YWT<e2Bҟ${,Cs} -| 09UTy!rhyFoY1P'z]u>>5|x?Iz?ҊxO M5f֏8m!x?dxFjO*BwOw#}o1{@J>kr]&RROP"c,ɘЃh-O !!ȐdƋN i{R@Yb\uee(\O ^(5o+= y OӃŝ,L6: M]Ƭ;(D>L)!0"vs;MvzN7w,QsYr7.?TKOțu]h;E۴a<{ly>!-}<-Tc9zp*%.Kװ{ bmu½$OAgdqmYm3fwS>wrX?XLBk,[:T%}4W^{%Mi{VwPiyC$TQxU=[6KI 6m6 dfgޒN!h z<#yR!)@Gdqu>g[U1ӽԑiIE6t:Fh96O 6ht0׌LnBܤ\6O Cu[ju{h&9lUP,Dr倘ؚdf++8 7i$ز]\!/c5/=)WIRh ̑$FU./ ŋ[ ]u-Tj *cG6Y!@A>:-FGT峎KH j6+\[Lྕ#tF^r{={b}yaВZ6 HG <]j򂡹W#&M_Cg@A;щU hZ1'QfB}UVs t%.utTEuԾ^#ILQ{빼 d26lٱV#ۡhL᱙rS0Z~dexƩB QѩY  ~F'p,L I VkT-蓖OR]2xy*j:Z:ԙ` q}Lũf *Ut$F٣HGezltAy]VlXºl;ܠio)&Ů[4w49.+I A !?ZkAب@% I(IP Ɯ-MCA-p=ԄV@0x D]Dwi}sTM84 `Q-Yа&83T0_F ')~B%{O^`s P}44l7},j(cUc飏bұ7]RmfpF}_@-mU] ycb:>b5:Ju$ԿGDn"`"UP($ȲjBZ" 9HwbOŨIq1yޫ/r}zg8r~w2TA5$li?ZL+H &ά1z"ol08O;xѐyWj䠞}u|'wM8c.ݮmA;`aM^ǶجG ci /~ni~z~/|i0٭'&tVo~zw{py?V+եB,k3dgPW ;|=6}|&<OAy6oS >އ1L>^{O]Y0VT~~g޼}Z?Tor̛\泥P#~Rb9%Ur(?|AT\}5XҢ9*-~FQ]{JF2Y1.#]!d3TV$w E J4*O6O%3x3 5i(s4oY8'B4;vtXZ A :3LmOW aĺw;)cup]o@\&Rb*<и㏷4ݹ{cZ]r5۱Ѝ/w97cmk?+`ӪUspwUݡ`owthwΌԊa *]n+ PdO䛽#1B @DȀS:\;,dU؎h66=MU뀈n"p#ɵ)`äcTXb!0P@>RdQFa̠:%t20S^5a噩d#|(yOGCytLs(riTնR>:r9URլ3EX' KCq(fƛq,ɝ[6kX D=y.!e-?)àa@!`}>,ؤje>[r)9 W yin\+V\w-{ZeCigfUbz?קAUXo!_d*4UmyO1ÿQ9.Fx/"9w>X˲d$ˤ{_ej;0d?cg7QSyőwفz6ߣa+ŤT{ΝС~LZjl|zeGe?VڢBȤ5WdSfH:m3Uf֦l!WT+cTrΒXs38TDqa]Bt]ZBtmnZK$-SӆҤ)˩*˖.Cވވg$c`Y&a_\4e| x9%?)钌$D=| 8{=.SLiA*|⎊ {IM|!%1FvbUTD[vALpI3J_&5JAoN˕T ;ŏXdoyͽ|*MO*6a6Hm:Ӌd]}_OB. Rb?u_K ]Ync2YpUgs*ox'd-B %9)n'Ou*>G 9bA*l#CuET;Jsaǝ,6!#gU$q-l=z0\>g3nȢkьB?X݈ (lc0 Ga% GlG#{~ }Or|rjI@RYA5QP?me];.SqMcEEbbZ,s@zgunR35wo$;ڪ;VGlՌ jప5:=V&= n'*X )7 #+&oF_JЏ$Q•&1ix9~?Xvt{1S>aЉkV*sD$㢣l,/'Б!XZIalVԒxĽ`  A^}~3DF5.\Eo3u~Ka8zZEYyiU[/첿._uŮZOί6aW:X:hGZ"* aJ*5M#&+)K_s/9O%tǨEP+cP%4%ƼB>]@h8J S =#oפ_WKm|lKH2Mh6Nz=-Q/z7Wbm;n=k3 Kӥ6T>JF=~Ѽ5{YWퟚ%BV %* FT>$RMQ:Q!3jU%3,|!j m/e$EImXTR; ܅G?fGɏdk U̚^{0Y x 5r%Q(smd1&<7vwLn?Z:d`~u[,xl̄Oܵc#[)w_ؼkd@F-:5I7(]#;@ Ą(ApLPPBZu%|]ԆL*!ģdQC'h߰O5^{R]#I痍yfTХI¯G jr՟E OEzJfŬ7S[1O{w">tdɔFu>'QG@qy͂nN˗4&Z: 26ٮ-#E:*=yJöӧ6ES%B,xc}kɞkkRn)f,jy<ˉ=odO67'!b:1Ir=!ƕQwxu|WuSͲ# - px4 qeOT$o"ID-9z($3Ӗy# @P<q@  )bTbJ*+*mv`4S\ 9O,"_Ohɒw?ڰK{Yo۠O Wֿ8||g -^z f"ׅdHW'SWTCNBI:_H "lp;߲U6 `U?F jIʸ$w 7V~7t[JR/*C^,\r$*f$uT HFg2ϣZYc2@n@c䠷W% 'M& "~z9\l5;539 į( 0 ⥯zѰ== fߑ"' ._*+ 1il~VF@dENύCu<7WlXp< ]kvmt힊'MU;$+}7Th/tB5.e(=!>.Bz&5P j꠷t) 61UAA(^b Q'$HZ ΐ٠({^ gHRF ~_g Z|-]'6]p ۾a4KZJ-B*Ty`x-&!"T|DG2U8cX`z|!ȢIӡE/((Pysָ|7}Q/ueu4B%CDz~:a#PnX. &2{)JȎO25%`̂i %ޅiR @ߺmF\]g@4#z457q`;!TvmB)iUO }۲&D#f"*{^ݢ4rJ?R]~=mWf֮)D*|q&vmzhFXN7n"j.FP&WPYncq0̝kw?z{ǦmzC16x<̻ -2r&tv$EE޽1Q3F jҐ"cD*瑕;SdѨ@RR=Sj>}[:߼I/T$z~~tQd,xv C11~7nB2Ed*eF4$eb TE2ۢU 윱 5MC?dC}wWSCLM6bIc"{A09u )H QՓM7L L~('&xnz,h}|2sІhʏ"lfHKMJpj٬V^DσI`r]iF\31NFrũoR%\U*s;R9cط_KJ>F+'}\w>`Lv׵7&yf&7O{_)Z/gr>R]͙3Ah눉Ȅ(}0h^u`4Ombe1ZK:]ҍG5IАߐH\Nݞ)QHp<ב[%%7e*y,)zOKUIr}j:PQaaaa1jU;Һ9Ռ%8y 1D=eҙ݄Eܧ=`] ؂6s 4Ҙg;a:|t!fqv:hȊ_!ϸ^K2F.Vs/n1̃:`U L0͘"-p`g܆*w'$]+u.|ʫ_'~蟭ϕe,E+׵rSق(_EU>|!=@>\8>k"J,3E,n&-Lq4t;wڑh y88Ey:jd)<:x$6I|ѯ;Ju9M|3v:|Z6;w$:}>MPV}{過 dL^sp>>{V]lqҀK O>ۤ iRLQ݆ޔmmuNft~f J0^ XRx\ k?:unp}Bk\)'e.:tOF (~wl e O\"jyxl)XP6-Xi %7Q?w {(Y7zk7,=2L)m+U3wN9W)׮?gƚ٣G.]7;FP1f5q uu憢~)ħEAE-tnQr0t>ӅbI^5W {+Rp4 H4F poŸ,͘/&}[9 p0nj.(!}w_pϸWѧƖib0tK\Ɓ`#aEE`V,=?h(nwv޶ lh=Es-2YudT&L_)a0;nwޮfxUW)z2a5QTQ+B*װV#'vvbujʤR$p??РB)#&O.pJ*G8ֈ5(7iW2C8##oZWJ+MqvGnH0 Hx*Kq&M&+&JC( Gi*,= 2ͨ^Iu!r/Tlaeu $ܺE{lv>PHA\/ g=RҾ8-egzڄda#ԞX") J4mރz2giCC@ PAR5BH MWQTYIg>1zak]M+Ke=ϰz"\1Fb(` .PTd4B"*>I3vZY Tr'HP7Vh(C^7q7_X|q(`ҥ6ڐj7f?eT% )I҆r˾ņHQXJ2aERzuD EQI~`rC[@ ՝'*H\TdX,jR+: } 9F9uʴS.J+W\נ@6;jѲuX>꾎?>9nq]Vښ|I lB3Fms (PL2O}C0 6a}BAzj48_tINt?#K1*G(n~v{v3Mߐ_foXDߘ\,$VP|3%\%ъi?"!:~0czfz ;? }Bp#&<=x;XK ZvmrS,۵hw@eMOLNsk;6*F>ּK +c1~7w7jÇeD*t \`V{=_7WL/_:TM >\X$o1##:r"n"5Y}o lugT!b3dV 1 `jK- Iyd$,-ױ+>8_]tV3DE-rkLK$D?;ARF8m7wفqNqXu?)Q}ЃzGEqݍ8]b>ռu26T3VfLQ~^QwoW UV~IѫvxRz|c<$1ူ^Lf@)(!AȡbGDղ2RxL!I|EOHOLJtM"G .bvC&iuM|)?pmzz۽;mq`UO(Q~у^3waӟnh=sT!aWדAZk/1Y$J .ћYP V`zZެǣ7= }HHyʯ\-Ϧ G4$)P̦:)C,Q$(3{vOPҔ锣TAk^_oߺ&>6uY$4l}N|}bWe瀡^(ɳzR}9řۅXN_;CD!ϥbrW) Qȼ[cmC)(؞ Sk5ߞO9kL*A ~B2UNw^87N!|K2:1`@-f5mAn F5JelC]D(Ț+bB5l/'-BCo @Ѥ'aͤ u&7<0uVH@HK ;6CʨtZMz TvPf[Y J"δRئ0 =,$*XU `5^-ר9ڵ+ҧ{@u7͖U""_| S⑿° EJ@ JtN)QZ<;ef/|OTeH4=d*gh=GOw?ɘ]O+ uh%͞inzϭc1:z7?v[PؽT= 4^_ކ Tɉu tu,ٺ9T{@YK W۷{NTh,1+|x#z_Ey6F(-c X';Cz\+n9,uz.J/S'c1:u1j Qu{|Δz8<_dlWi YcrxeSe): k>R%';+3# 2#BXXbT2T knq+ "\> BXΜI fqrݖyA٧ԫguÉg!JpJڹqfAT("uAhT >Zs09XCeˬg16S$sJ$t?0+FSDJ !KTvJgp͐aHs2,vm2ӽڂ47F B0(jTjԤpuAnѤW 4)Y ?QgY @6%7:i>M'TtXeP]SI7ɭ[=ڻaۧ/eXydUVZFS|!3vO|&UԌ+yX‘X) &Ph04hC^ X VN\1<㻑!L'CќƐ/QC 9ih2d* -t^uqq]VFi%ӠgJ* b^adNy]/T_UP`NVZ ˧ -RkGS^@HAl¨لU'+;06nN w$jR:8 c3SsrX\P_#"CDJth&IVI@kF<(N8p9h6sOja [2X oQo(0xY%2+ [=m#+Ȅٕl`ГA#辈 6z2Jx[&@'Y=J :d8vcɱ4H24b!:PEgzwbpDc5}-F`WhbE~AܠM3 Rc؃5vcQVf!G$ _$#eo3W=P'RMCQ/$0?%6 :oV1IKK/znUO |gcka%Q6ϊ xק\]m Xw еbc4)4 e{?/Ld UBh',sԪնM7kҨau kTk\_֭D2F%f,V,̈́*ۄ@hD/C9CT@ C!®um]bipIJT҇_J`a&lНJyK%1]?<A H̳y&1J~qgZ{/^_博 e3m@1ȞOOfxԔz饄rJ_ȹuWPNDӯ4X^kr*efLʯ2ɤEç)ɩT ςGIuX$Uwz(B5oV+9آ$Fc6 4I $&+DƢ f Zc$*Ճ)Ll 6myyժ -Wvl|hUO?߅ļE{QNjw:RkgI„!s^}iV~ &Q췣ԯ鳨v<ũSN% {r&^s I"Q$GFFh6oBx7#`V?&ߔ(jERg`NdL`_ C (3abrBU&хH߳u2(Zrd"_~J#c)!riiӦJK;AIIh.%86d X?`Ő>CR3=C>MF%> WhωjeA6#!w,އq>TYWos>7p ɌNDMʀ3׃a aB h_lgmAulJ%@f?"{!{S;"皢ԣ(ԖGt)!xh;P 2t0Sfq\Fz?d3$P a"Ru)٣Ͼߓ;b Iⅶٓ1j4m Fɪ(=҆f]rTty8)rxC !BG0.L6D:jao ЄX202TOa(,r]J(|Ԕgk?ENϬ"g  T,9$=Uj!Lukv{I 4g6lמDk ϳMf l&M]B T mS41`~ڵs8UKL FN2igTF<1Am׷w:wtumݲyGU_~ڵj&VM޿([ Oe|6#C$Y?.YF<"6mCBe["2H$ˊYiI~ogѦ!H@=$ c=/ TB  ,F`HOK J3y8ҟ4{v?U<Q~իXկh [J{ H?U%'>z=LH.z5կtCi;dH[%0\V {i ~<x8X͟N򏑞JۜWdԔNoj\WQbF^ߋ禴 :D DCȡ‚nya`4WЍfT$v(/X@1֑tFoW۬tX Օwں~ דn7XJz `|Y;꣓+]FږNg˵AntA{z$:#D4Z>zs#EDaR0. =aAF<(=ߖɅ>yҥص'˗xLrbR)Q^a[PFυ%B0 gAAӧ:=zC;.$@:P|`N\ol! nT!J %|šKPpD yvDӝKrmŮqTko{9IZ.sY\+uY=yR@.ji!;1|O^nMVS}j0z$su:b<~e<5E㩔VwTN= X1N)y 5qr8Af敥*. 0 9 N &"nM^i_7zW x +Y-zwWل+U|!eیW647{_2Ȉ.>B5a#0=R /@֚G͑Fj9IxptK ˎ{ߡdn<1<Jt 0y ȦRtAbtqǷl \B(T?"gG8wv}V=/{ۑ_|Y)."n'[HJe['J`et:GpNJ*ul쐜P!4ERJ,!V gu@6kM\J6tb?}K3ʼ6<W=b Z^/3g0t)uwO(P«}fq1!)uaPJ*/AV0ǀkJVCx S%06[ao|/n(..cHtZNL>?޻5(FH7T6c9qH`uN#GoUGa"]އ<<[:`4 {Dъr$ ~Bx?xn) #Hj2Kgs)A:{4~Ei=:cUcQD" :03˒&W0,w3% ^zhUV:u@njF )AA4Rs*RBk%% B#*1 ) ё,,ģx֝r^6,<,L40K?FqrB"lvVS)jIM>l& 9bQfY,r=QԲZCvE˛hj.{O EYK oUԗ듿b3L4]NGROKH3pcOZdd9xl]֤'NCXY>GQ'mf#Gz1j>O܏K_2y#POz7`¡VႱ 01EH8ٮ@~Cs7,{[NtlA;-%ߤ}`8Jj7 Dgrzmg<;g1PʃQQ9]sְhPO ˞X@bt~}1ӭ~oTY;`2ѯ ڀGZJ7۲z5SB4[Oq+H2``fc:m#QꄼJBaC#H'5Rpj{q3#@@TϵN U"Bs"DOpzx}^j I"p9 pe Z%zhA:ăQ 4l,#_2,.#DXDz"O?Ԑb$NMlC~FkvjZvj:K 5Jȡ좒m j&K+TJAR +\^Ңp*(p@PӻVϓ9q"C\,_`KpOΫ3Re!@mFAfaFн$Q f3 W=c6Uyy[YԎA5k_ѵ&;Kwd7nX.׌'a?.p2rʱErG+1JPk O2*ƅ"ʭǩ1;>a19ڲ>= {ם>.}4O:<6  zxQ7;~m;r ;DaHt!5aT/y͏al٧3L;^7;ʯsm> RRhKQ7x$x 7GcsF[|:u~GCjVIh$viwyݕko7i_p2[ $Pm툊FB=:R X"-(@7;B`PzPLT A@. sTLՆhcvv6FB )X'çӸТ_iتf-f\.)c(!It*驀"\CG!D+"2t AmA+ =M@|^J sG/ĽZ?BrlF?HfguN 8Z6nTڠ3 FEn sQnaߵmv6o g-|Y6g3+''B n *SEfh  P@P2*Z3OCo)hE@|1罼|ɋPJ뙧Em杔$f4z⩳&->udԖG*޸U_t~9/kK͡tpJdUD)G(H2+F ]]Pz lklL I&n0ҫ{FBt.)Xkʰ'qF#w~v?W?js7=sQ=eӶE[zGTؽ5n;R&~"҅@ MOKIc+3kAeDIQyȲ(ʼ3YꊢF E=)g?Ѓo iKX>LJPg74!X1 4qEfNW|ȗѵxxRt򬦳.s#QM?8&~@aypzX+==>81~xTn)ŊK)-+ZR'oq@qNqw4huYZyfΞ3Bm«E= UgO(^~t|f76~h_#RHZ9\zjC1rq~=&(CTx&i';>)#FlJ ޻'c(1!-|! L usce{y8 d#R왔-͟u4ޝ=YL~ !Eʘ0㱩`J9hyWvMk4e4,yyU\/}Q?4֜CyLjLzQ7dO85&&xU%wD5D+͓a݈rq~Tr^^ۀtKLʚ0ܡX*/t%, Cϐ) ZXݎ2q>_hV)P~ "p裃V,Ɩ4i/F jͩN=֖|&#ik^e&=F(M sؕ'_8p'g&;}(snhײ|ccB>6#?J.zN̐oyc'R/DAK`@ܗX"~DX|шzΛX4E v!?hW@Ƶ$wVf*\5:u-j[]~ t²"M.X*r/;꽿dCl@>~q5#r%isN1Wp4w_h6Kz6Ee:EC4*Ra 2՛7*?If&p|Mlj˨V+a;3NLIK.aS??H=q5XyX #7d~\3G2qeM{ ۾ED]S.JV;ğ)MHϔ,wLy@ }Lhy ML(vƦ> 7JBs4äsWyĦ\lݴ?W^\M9va}kw6ŽQ[Q9?aʙr_."gAG|\dk}y etS`=H8VgL㋢|̝w4Q٢{M܇ĵE.mz]ƻWޚ,P8 DEQTAz^>pSzVKb{kK"hzg3 (DqNk$]U&e8e+8'U .R:i  e{!A.s3!*ER+6\$ 7Nܯm|!^G1o3Ρ 1-{ZO{qgF-{͉s vs \QB]cQSw˓D<$If3w-JvziJcHl}0ѓe_jqNio7 ڢT>(rj? #|LJ|MR(&#Tb'n_4Xvv6hh8v/_|G]{Y{MKtQUMHUv|++> 7 <]d&Jc%~ OX*a~X0:.!yG6*VO+outH`m 8y/ԫv4Ʒx~BXw»#gN};40γho n 729XHfӄs9ZWi쇶d§s6b6'3&Wn\W싑JݨWTVJܦƁo9ģ$ohׄe\F. i&H ҳΪ)14IZ &]~2-2X2F@1݄!CK2 xXmgS+`ȑ[3Y=(^ tV%aT8>²>^ڱ] uޥ_^ M}ro4߿c:HƝWK"}.RBS&ՎM)ƫG`2}h #94[T_%dm,mWQqh"}'Ӥ@[VG 8/p`ιb,U)Ri׽;ewdL_ޗ svһhĻu M㽲Ŧ _ZLᗥL$ĔS~kmZ5SጌAtLt4 z- zg( Srآܺ~eOiZ5̈ۗМOMy'T)&EjzI{|g۝-m/6'ÅU-Y8*P1s_B[+֙䪵)F-qB[X6昨Ybr%djkG._d(eUL7ZjGKMy3mTL-_xSh7)IQͭWWOs8XSMM!ˉ K矛iY2DY;?T 3I(!D)Q:!,X ъ.*1_:Y&[_U*DŽiɭNixXL:5OGSbE+NYPGi=im*H- l8w'7T PjsTȘKe5L24hs#pZ |#m*[,}X O":Gϧ2a1Q>/:22M1X|x'ݍ&%Nqv,&o-dT *Վa~ wGbsqNue[QHrNѹU^ O=}ÐY_d2m ^_+;,;WH *?~1[PZ$/MZ=L{3'ޒ.csx47s2Ȉ>WK /K:/(B'h]C 0U.+ 蒭v\;( XIy'"ϣ$JM^*%ݝX:-Ii jzzE)7^@Y`B goK[d$M2wrC Z[+Oؔfח!aj/= 2MXغP#َ7ݠN=6:} 5eL)&_a:dQP[Hau;Ŧ ʯsmeؓGK]4,^BVW,'Wӝ^D+or}\#\z )Df.5TϤ8q]נܖ:KHc@E.<{6{qJPa7" SKR]6iZx86 H]0'!we%m{^qҥ]MBʭcPq#FKL UBP|DPoS|_W))/sL"v֬o=ĴiO|m(98x;+KKM%p 6ƔNfI+37 Ϣ`d-umNC}wXu_6X=5 1;a.Hң&-X*p}#2&QbUOȎyeGj.U.p34 77,;B}ц 6*s=_h}Lj n_lݿpi\"X#lIP^ :wn^G{V`twܰC_X5 /jU~V1 wb/SD8lN(+ߴӅ_I/-50Ombp}4$+=@-HDJKo}=4h /{7+k;Ikk(cv>NVl+ю-M(9,BUwC%F.KENw-soX>|vOe^ ΕĦp݃_[PxenI]M{򸑖xY Ns0VۦY?:ovakp DHd|b%f t)%r >Ɔv|7V6sCjFH*xWJwF8$jk|6-]14Ý{h!A4ILG^2YO-^GBrC#~\C. cs;ر9)Sg޹ZDXwڃ$IOcMnJ cI3ODN`LE̠U{>Jrh/d#QYTrGcsB+f]rp|~ Jp@{.%0xv.|-Őx'fd6p*oV`T3f*::tͶ\@xq!+jJ>[^I\>xZPAMExt9ލ@tE1˲j-`AZ،ů=q<8AK(f־9StPU!uVJS/uR$ EֵUHsjD^4Z dGxwư㮧-?]>+ń+ęB:qwe~"ԯ9x. KoSu&|$I>XQ?`lMK hsIMB4戟03bn<3bvX/5 ˂-MkԢTrf{}ÔK;y5@bkrrףĞ+CJO QI@x:,ZJ~dĵ->[v3^ pw+*vvי7wX70#*/a,V5>Z}LTVȨpu Ч,,V'rIz|P#`kG)'>law0qXBꙈ O1@@nxI|!WBv`= N;D_=Yd6rrfkǯq{fm3$vC:Ӿ*MAHlU/$EPY&s2Kϖ%P$ʫ%6RG 2.d6=Yff^ ೸aJfiBڒsV e-!Z/ 8GVCFGJHR[6pܺ~45L ҋ8m+B蜱vwD*oɣePP̶$~Uw,0.O_p ͯLu漒>vN#sW ؽֳf+4g)bk("mj y_G2=H(gɅ Cᰮ$jR79JE2kp.!ֽȷ|]Ju%Dd]JW;n!x⭈.7!zTNm}ﻂnj,XXj&v 6߯BLW$۾C[oU9978L=K>{\=-L$_.]U2c29·!X;98bo#Wɷ#.cϰmijc=tAϻmRnW 9(O[MKHE 򻸇6>+B=7ʭѽ3\w+9P4w]pokeL; Oa\gwDlK>bܳ[wg^'>ƺx7yl)C{֪>NEdKR4WcD!iT]x @ej I! [ULĎUʥCR?9٥_%N+_Ӯ!CU̖m}%A,Kr,q:`؉.m~UNۥ_!ei#ם)NYpPQW %]]b/DŽV Uo :U_#O*XeXNq8&*BǏ< U7U%%{p%JbZ1|cu|Ұ;(LݛkNk13< z@Knh:)uRdȲk+%o6dmZ h?gP%zHO̝S/-!+ЇWݎ>JదW Sz+d7Yxd O+iJEJ<(NP]]Z)0| Kd]x`L)` Ƙ+_'}G|d}/xF,k(vhxHKH$~ub|>ˏ(1ɂdp.Gkh`ޜ5P)xqX~H}G)?xctQULyVk .k1{?fؗnK2ڵ^;=tJAUb"Ojt[mitЩ/lq*itի,,Q`bv8]y3:ƼK3UoR!!#n}N^! f3tKh/s76I8 ;3w߆R8rrǶ PJ ›{*f>{ Eýp{ZM`́jp+lh3nK e~\WbmhgeqBǵ*. 7%K_ymM kz)A %QSuYoNJK*iGsU8;k]W">e/BLNvʵpK>h:8rgu_ݢ^!M?델L.-PX^!bon>boLGY#2]ӄ޷L%uIܼgR~ܓaN;ƿeS.')5 Qvo?xx.oz>lՔZ@xTCVm;Ap*fk>HZUq]hY`ȝ&DY\ȕ4s*1pܕ<j%p>n^c_xƠXZP =/<8&.60R*HAveG-Z ( BX/;U{cmu}*1ت4ǚ)3, .d/k_P, { {=Cm{=i*U. +2c qj޳*!;P݉\vFI_ԬQ ʗfOg@ ?\KcB:\eWgy>|Of_oOFe>uyָ|MΜC oԧYM %DZOy ֮>CåE>|Il"D'LI*DW_Y3giGį9_9锂8*&s'XP=̝AN.#yBgVG@*MAҭ$[9x}5pldA;A?'R% b'];tWGrO&";<~ ެ,0 ZKS^Q} CW/aO"QNu7!"w :C恷SK!p*o`\*\_%~% v~ !Nb}*)[wNB%"n֘k_5>Ɲ+W&) 4eMB3L. r~ہDLAD?븿Odl`mwhޑ;Ƚs2,".%eNx r8R[ ݣ ym~P*IusBj]L% oq\\yvo ]KL:iN2J z( BBw&kXgf8OzGO147*I* nΔmkZnV4 +%ڀ\0Š'!LHv$(و -s$0᲎.N?P Ei (i&R@Tf1אQ5rnJD]O5:cj#117T̑ުѫT"^b3j |fi a~5N` Sg]˿러 "IȘSSJ-x s.!JLVk !~Č֘Wh"V4Mayl._}q6S Kc3a#NFӓ$:F}&.~LbH>D\a#3`.tsSSS瞨DTOX"$1jͲ, ::ʛTo㝞0i>'A|&l*`1fޑ4)g#p_0zφۀC@G ԓP CUENGD++e^ƹƫ5*r3V cC|?#JU*ZOU:շ)d 3Y^X<ۂiug#>Ty^~q)#)R@_Ĉh-V#vI 8³\>O,+I.0< Hslg}Y`\']^ j|҂TCS5/%SJ,FYG5ݰ<6 :jAb~=>u (mSjk:uʷ'^W 1&>G 0Ն@ހI7D,&a#:Xr,WQ *Óg< OL_5> &`̿Yޫ"j'xϢJ< `(E2f H{|/Ug@RD. !Nj*[!Ƣ]}E' K Z?b;ķOho}g8͗ûF4nXi`W#F=zs] @|PH,U! 0AP M-(J $a%bZ"uQ9e)6ka1#9%>xzMrӁ! hqevDN)&}<<=1TYT~hB΋U2P k< k߰+]WmwV6Bgj r:_o *Ab$1Uf谌0'9ܤxp'p >3ER{v/a'uŰ4dDQ+/{ePm%}ѵ{@@S7? :9$pwM&(6/kw@29' ƍoyIpGKC1wMOdxm~$+Un `#B]FY^%#ٵǃ:l ֬I$xMV(}jyn.%#w/IdMT1$aW@)N49 nHܑZQ=3F9}WSF;L ip  [YO EKkJ|LCg!6]+_fMPJ[ŋ.9d/ ]b]W=j o= `zmA4x9RA'[(ɶ,[T!KSގBd v+ZiS)v.בyQSN1:HKQ!g~ [5>)cޒq6REd M2->LDYt٪%-ԫ{M4^+KhȸOp"ż2ay>7Vkxi#-ThEu(W'_xѷ2|3t~7?I۲oqn_ĄflyQG v(,N6L@.;H8t))]Y^oE1Er_QPn?"Ґ#?"Dh^p6$ ʈy䧆 ' LWTŸeo綏c_L;պoRmIy2Ónl$,|-:+?0O6t1l#k  q7 n1g|i, ŗFcɹm>ԅ[lAo5(.uLj龲ܶ go%]`l:1_sЏŵu݉ϲW)]E;&Zb1S$}wŽd)(P j\/*Voâ<^e-7肊裷cnx<Z:mJܬox>8vAEn6_=PoaƉGdmh`Ûu&{|[ DL]a,u?nOp^"k=1 HW-4W&JifizBL(EKž5PZ><}ށĪ+GL(KsVEUג/yQ4=!ZxG$&b_ݰJ{Z+tɺ0H;LJ}ULJ:ʠuL[1Wmr) %iMzH7' b]R4P0o֛ oN/>vJ"DbLK[ÒfMz_SP%l1|NsgCT^tqtϪ,@VQk@VW']qRvc?Ot Op.dZpBF>~M-U5^b;md߸dJ)ƆOri{9}an;V::Rt9%D~]|~g kԡVmۥ+5NYv2Oo^Oش^a~% ^\qB≕qMOV35jO*sG#@C/D_+s=SۦX3t0VLMsgFF'&\Tڿa}.7~:MN]ðq|!= x@I"Q)Pp1*l*JC"gge,Rer6+Ӳ C o gno{9An+Z#"BjaZp&Igsv#ٽJzO1R@8WYeGA>NWf-sy?!wBo1[3M/#vGb*]LnGab:u5n(0ǚIp ccF0JQAos02 XKFઉ2CO]ǂ1y=LHw|WHP4_- =94_v!XF⎢۫1%]Rfau,CgY:YbjW_w#wf]Mv] Ym!u=Mly8tZBy\r>p~h@Z>-<>1HΌ^;\'Gh40X _6sc_^Nse_u- #ŋ3ߧYgRT^XY#4ŝ*_cuNY|w}w/ni} .Y6#@sQ۲벷m{L72m7:>Y1ajU{ ̽ E[Ge[8wTKp Npw;R>߻=?o\sͽήS^]c/e'hy'#5vch䞡=lKY= Dyԕ9k%xPxI\*4>6+<>gwOϐ$o!>˴gW7ۖΕ3+}X}3+ۏ-gW޷75-I :&= nY,Dao4"SuEhPDxtCrEDQDP!D~arLȢP$WH"s8?C mK&'>;U| `Q@E<I&DH0Nv< D Uh%f\ĺib,.R]ZImB.H1B`B1}&@d혍@ ; Ov,@Q "4Lr|Lɞl͐#Zj~Zj>t?o0&:6mI}ĸْDcXޒleع:&:rIqecD 01{O/\a|bb"|||r8nѨWnA8) !{R}E# % \!U6!.P~%自q$b%(ICh +ÚK /HUXդʣ U]fقAo fI8ŞIC?4U#5iRX$GShvxFk`Gǭ5ۧ['^ah8lo9MڽB ))f"zpChf|᎙`tf֎eVܥ%v peI+NL%CD;}CL;#'p%Cq+5 .kq'衾#fcxY'0C~uv.bœ Y(8Z/RpqSqSZ%#$ . ~Yd@"4VKfgﳪL쪝FMPGKOOrnF@%J:# BǘJz)6)ǪlinE>OisPyaPm\ @ G'6kI@S C2ļG{VURS!S(nbNP=ljBCP>O4DH%gdTl4_"fTԿTLmGDfq}Z "߻sg̊ȇYɇ{y>ݭu?PY rjq7ۇIT|M}SZD…KWT@A-̢%,}Ý}q鱆㲪ixV7pArfMU^Km#l#v-*6c ɔR̅87h*`IoD 4T' ib!6Rg?AGAA~jz=3R]MFsfdp&߇zSgfғ)639OBo'o:^o^?w~Ww6L0{$bf+Gä8kv%2gAaLMƖ.` R|ytj<6e3z2AY$-8}8܌s uLM8;nCT/iMD6L.Ѵ29֐MIшׅJ)+3sӈgy)*8n U`۸O@h;D ~&<4;^抜~&&Hv]rV][:'ta!? pT 4,#$_!$>2 \<|| z%.?Gu T',9amMNd'/_X$~N}sDDS ӷ5a4ruVDEaBDtl t|{rFŀnnRl]ƈR3233l/lԚYaq5+@*L^HTude_I')136XOYX_RwCAV.S @;;c.%f6~p[ؼ Φqs 331s}H+U{f\f^ ROf23W!udйY[8R/ulܩq5hq9lɯ@8.NlkGB)ǦJ5;[GG^b3v`єY<2eV4νeJS_Gaba݉rvwnW^F[5iT5Fni^&TZFJGvI|ޗtdJ N?1iO UqOKM4g1S=/Hru+),K3oڟFZnRQ 9o?h:4IU_:B[SbΒl j*fr6D8y㮣l:GƘk]t9,:J"Zג҂䔉sTmDf`-~ÄsCޝCL: Rտ^Z/Kr1eV>/k:K}3U|V,K}jZ`x.xX>%:|@`BEizumӮlmNԯr tFz_҉Wl"gejge"C*;_K%q'̋jdno9􇢬H1_&kN;"ҽc=b_qj?0l4yMm4]ѢxZ|V9Ők[B -p:bf{%GCCSh<_gztL!n CnvԮO Eenc.b"z ݥP%$r'oF|#-I?L1!M ~~70~4~Fa\H~x4CaLdZ=Gsr)WIl @紩ՀЪA+O,/``܁cgeNK>OрVIuO.@Z !GJDzf ๴G喧]Žd0c,}t9Ե}}`KMsل64 28 B4]Q̣ԂÎغND(Ӛ~^T5#߲W^ hzv;)rxeڣ~CfeF-l Rx3c[α DLجCv? ZjJ^箸o">6б}v: D`: dFe5=ZK\^Lg}{25Lf^HaeOO{{./VaMohcY +jxe*N%38xЅtAYK/!C-`*Nٞ9r]<о>6y(d>=:W8W0TdV8.|Z0]pRi9uOݤ.`i˹=ZH;l^iF}} ^+r>p\_ z.>o"v躚 wDsY ȑFsBG4nUXvb:w^t^!C*׎;^WXmXiwk Z^6 ;aJ*۫=Dt*v{d=H#?4.wim{Bcz^'\ a&{H"!|a2pӸ*_95Kjh7v~YwiP7"K,W5~3wclzS_تBt k&@xtf]ee ڤ E^&d E<3yp;h-@.];WzdB'r$ng8⿚qw7R53p-duD:lP?(LVr:P_^f&CWf4Im] m&2D"ZlB^4:Y_ASxxyyK6O7]tG&QҸv{8 \.<|˱ F>a8:v%uRBݑ>wK9ĩHv)~WS4żr UdEæyc3gvs;GFiXf|vJ(uK7G) O}t1!+U%h҃T(_Yk:;v\6MfL{Şq x#2pH A46jtT~Z"Gz5^|XU]FydI)y'2TsTAV =}Ft~r^uEsc {H&}wQ~gG wHSWoۃc7{.YdlJcX^&#u(6+Ca I~? YYa?x_}|$3(ީo/`p<BXXf4KfNT!˿>Cn "CMeLZXNʌ8u7k3FIÄ8|+@y6;~IOM8;H|h/(Ͻd_"`lBGn\E$=\:pD!R'Gk%\qN1tf0+DZRBOԗ8'ׄ[Rnw4L%FLK]}!wa_xd7:zQMaIC~3}F׺`b_x#L)iH. %e"&Y@қ)aՃm4s6Ak@NjQ>>.lEСy;A1ͩ*A]wgG/i Cn hJsjpPjLq҇LNs l"l(XJ_MKCo%gQ /C{rta*}U,6aTa}VB.B}_Re2cC.vȂ<{F^P*G܇1D\Q]b|!Dg=w^ϫYODާ=oYoW[>oWPπ}22Ֆ'n>DC_ɟ5H<8SaD!+@|R"P)6B#L*t+HTL|Dr `?0$ JUyGO<\p@tmon eiw 1ҵK1!+]~ξPLy4ِ5Ip ~qWɽIrKt#P/'' Q_Ƶ6,5? - iۋTY<Ē"8(ֳl;v^ ],jf3x\x fGyg ,&*j[ɧe 7L~؝ݙ_/,_:; r;_7?G\: ^Y7T7V(PVoҺ2;0?ŠrE5O[B N\ry1IH1Hb*4:$I6""Y Si6Ԗp7C.Nq Uin],KfrU-mrMV1yۺ&KUeYbu` nA%S Fj>Q&W @CGɬ[`(c],2P(x-}klA~#oPV_Ew"b0M]XSYUk gȍW4bSk),[ʇ]]C5mig·.q/knZ/xM)0N3"(dֽ 7Gq@(bZXٖmDSCdß1'A1z2kiSnX=Fnկp8 =](./t+6N}>z'@SA~AQETM*tU:j ҆@_T|uUr8x#xz=nUtiCDD7crv~u`tIS7WU9!յ_B<h:NB#@e yxOT)^5g K!F0 䄣 sREĤԇV-9-Spǭa7mA\e BF\04WnZ c5Q;?K 4,XuhL0lap~Q}650@s2}o>K h9^Fޟ;}ѭ?6.}>0s sO2cVg}9Y+zGz`iY?VKXKcFT{xݰZaaT-|Ic߷\e"!sGM7}^/T7^~ӏn1=$B|&UÐNCόۜrhM*WVͰK\G\'ZW@BfKtF'>gE)'&'!CBQ51VLAzN@ 5Z2놽qHC"ɞhcOMxUi.~=z`^21j 4f΃)KH)e> juboOb;AFpbM-*8NA;RtX,{iD%%=:(=fg2Թ:&$g6&ѹFZhxyYr/[U4֊ku$ a0"Dž2-yԤd#F4rxfbw27WJGvN%cMEf؟kc`:o M5$7)qP :| 7pAڏR9Clj4& 3:oBu .qO_@XZut2,S>ӌ/HY}!&CyT:p$aTo >mdAesٞYI˯OG[ztut"wI |9__3e(q۪Et:.|8ݱ$erUpp9jщ'</+HVi'Ϭo|X9oUcY6m ]aTV>=NpB6Qߢ?wfI], {r%ct(IF)@o]4(f1uaQ{o8gIʽ{=IB0,HIJ#@cE{/R@v'GX60./M+DunML'#=H',if,^'9"/RDneېWSWY? r+1]ӱ`x6Ũmd SQwi)";1MC۽N]k9inJYE4%ܚI=NiۆXAouT˵ck 堌2<%ʦ%~BMp=W%{_%C*!eu`h*8*N<ҼRך )R& BKkeBȿB͗ _ UH,XM 3\%N^ _SVVB/W*W, #VYB=B_I&U.dRS> <TWE(AZj2"Cxm>Yw7 70/7%VTB`_d+79rkW[*wL(:b\5{m\vv(` <-, l /U XY,Px?rX?X^HG]a DE Y?-[Fuf]I'NUgT?@;W~oF2}DvPEYv>ϗ{HU:>U/˓%_hHUHr探6j QwwSo2wb4Iɉ[~y^EK x+ y6J'-ȸ X%&x'Sq)_锫rEZd-n$og:6'/ V7#'x&+V-w n6,wz5-8O`Ʈ#vH< myڐ:nA`[?y}Xj\u#\y]If}:5KHsr9;nxhww[Ef~$%ފ@r j{ȝ*8&M 32|U|Lwhtwyŏ=k֧6ȩe9DDUI)/y܉ Jg?&:j9 N<@+0ã}/m/W3~G)ctf?[_M eb iBsaBU})CcHXDQzE%?bi2X>M R(waO/@÷ ʅE$C'>VWQppLWVmp^^E@W֋!} 혴}բehG"ՋaRM"!݌pKڢ#P)Tq51;$KJ1^rK2H?FvSXdb)Gv53cw.'[Ӊ)iw.iťv[Evn.aZImVvIbv.Q<5HeLv,(AC x B1gw;OͲޟY"՚]KfEoK 5*ao1G;jtR#",JqBH85#6.:y4_EJQsKz4)I 3qKJcߊf#pK_U:BKe[+r:kɲe2tW/Ȕ)Q;sS(n6to+,%?Tic,)Z/_._7_dF7+Z/nAH#XL1QP +`\"TASDtQE«[P5`3E?•ljܑ7Df(c^#7VIAKNFH[%(l_E#VD'U PH IcA/^wԷeM:gf LڷYXj$ ,Rj<}H/o1Qx5 .䟥ӗ(&6h% jZV N(yȞYREJOD̑Qh]soyHHEHYriI]~~)+G` m oxr&#CKׯv+V֝;Օc P[5y9=ka]TJ2|QqRw.%Nѣ!vH&x-fkXQТ+&KXՎ'#;jLBhe)(Yo<Hn*I(gT,R&  {z_suv@j+AOҗl+!oȲp蚔``P`ppp`ߝMKcx7{#FK{FK=k'=##K#G{}GkG#WG0ZYZUK2}6M>||WF_bV^|hZ9-@ʴVu2O8CR(BI\!!ٵCĒՙC7ثט;{*AlLm{X;lv#%N f] KZPҐ=CDDcP Aү,9B.lV+y:\mn3Vߖ&g gpg@+d^pc+Nv(jbKD,Ѳ @l^3"G% d:y6]a$9M_(8a+l3rB3}ᆆ6IUK{\$/_q׃>Ʈ:$W~؟.X'"_ukuweA?FW@DO1Q һ}v;}&U P0,Ҹ)L?kߋ#BR3v -&*_\<&T95(2׶{aY䁥©C ,zY%!dB"yD@xm 9'7h)ljK׺-̃um7AEPAG"Q x?ÇƀBuR1FZ[K{u,m";7ytnt<э1eddn|'s5@16yYYD'GE!TTTo@nYfkay lâAB 6ʨZigey{xx:? dHurMSFq;:;6[>ך<5K2a;@KFAS>{mp+;-MRG~!>]e }P?J2}haZ`r9%/88=e@5=D&AI9TT7IVA}-/緇bHBH-PTAe UtRфUy ǤtT5y1Z\ }ttr*)99l,,аs<ݞ"U[iTC\^)z@jl6UylG=)Z]Sb:͕[{UiVn/uԿy~IE?L>??Dn ]"1y>88]++ت͈uwxTgq{ K*1dvDgH0;:zz=7###F3mkB[~, ]\صz=s58 ''mt3QI>QQQa it`f^z#\|qoH`forccca{LO˻ # ;@}Eee}}}R 0_B«d7/oB$=g[# YƕHE>om=ߌqѮ~A9:cIJ[Xv,#)fjPdZ0VD ·P>9g}}׳~Y;/ c0j1'sچZ{rBF^t1-&( <$7QcG [)TmxRNM-U;;QCsBC q%YvM A T\EEX-/<(VkG`8mHY8 $V;ko# T ME%%M444l!7kkk“%dH);;'f^^V%*O^7#Ԭa*UC|X $>DkD˒&ʹfhg82I3*T{<ϡYG#|Rz ԃ(?6DT hLX+־Xͭa(hD4b$GW&|Z>cΛ ^, ցΖpш<({Y~(ŋpBN@s u#!'2Ho _Q!8 H8mxho\*r,5C'ɰ ߣ E6L$G GǀV:Ơ҇i2ĠO=j* ),ċv7wj>9&5}o@*Wp.;>3pKz gg;_ S836AvDotL ^"9afB*ّ/3##N~1TMtgN5)RIf k(Wd|f,xu c\sB(ˤ^OPKv泤–ҀU؁ 'd%/FQI2|nI%v߾8a*vq]DdO:z.齌0)'øeg$ hP-υ Br2P ϫ^h@$?ߑ|H+? ]1 (Me /f T@4ds@*r7kg;/7 ;YH$؄O2e"|[$>B??BSE{7yl'frQbvĚV"Rǚwgٟy^_|IX%B?y~4^"yj0*f{/.-` W5܅I ¨`qyt=h6u9Wj}lV=C.ƒt$xujb ~La'^sZ@ ^TMuY) S )9S i- ͉":_]+P26-ڨ_Hϗܤy5_76=hu<4u\!CK9xP "gz9Z@K.]T%_ ef"W(j=+Bag@WL(oJAQ3ˇRfJJr vQ4*&0ȯO<3;^zF*b\R!mrfR0]^:ҿpI!o(Mi^}tBH8Hף0\{2Q@Dx{T %,m͌ KqB`Os8daa\TT8Uc4#Ln^oʟ7Uɤ؊?%#IZ oAChūG^R\/:a0[B8]kEm0KaI!QAeߡj/+zlaJ$":]g5'ט&cqųj>OqsJiHPQLșDPjP|`̋sٛQRR}D&ja >Lo%FsĬ d5DTduӑfˊ9TDoByC_+EpUrF ?)6$T({W -(?ԎpckWlO; GlLQ}遘.+5/nkpfXR-DjpXlUq-70&Q)Ȏ=Al+3aj]Hy] yӴE#N't!c˔AqHz+$0IVXY^reuU_ʲ{ ңO*OgՎ$~d"NΓml!L-붆idí`E\uDlt&*JTɵqx_n\ Jw+4"&<% ,3d 8lLzg"=5xg ڛ1LLMRgd=۹>dt3ׅ}3.Ed.?G _1I+:N>N O`!}֦VFfNp,?L…_c?-Phtj<ۧyѓca?v_2".@!h=Թ I5U k v:;2"T2&N#ftw540:S߰' 4s[jPB46RT!FBM0С:FA ĬPr!T;QÕML/KkV`tlNP[ʿ$"E:pdk8Pۼ!npdZ܂}> #6,T,%Bg/0޺a\y=-̕Y佫-.>6I<ѳƚ|6: RR|S[iMT%ǤOY-M-ػJb*{7HNŲUC- 0!E+3tbr5q^;Kpq".LB=G2Dȗ'P 6LP6X'O8q`!}twk\s} 6"G]mm7~Q7YSW}A8*eQL~![mRz4B_4 *0.hZ׈=$KT Nm # KrImDz$^͞}ѵ)p.{E3t!都 T+96EX}mL0[]5ZzH _bKTHjP+v£iW`jۖ&c&尨4!,C]+*< A@k1[AO7Qo˘NhTlNx30A=w)(Qy|aQ~ݞ9ViWÀ˧yq]fquV[iÀyQPT(_{y}7oӯgl#Kn7:ۧG8是N}/ʈ!K h_* 0C%@e<hh l,^?J}e6~RVx"!P$:(*0 4J2wS| nKåEIπ@NTс /2u#&v`nM@(6e 4O?_s8 sϵs1;yƆ˝A 6VY6c9gbMx!:'Pѯ/W:B4E:d%BTdG7"QPLd3nJp u6l!CF!6%1OmyB^wi,(Z_Gw_YʷmOKsIrr1o_ZXTnؙBXsJ^0#?Ha]O<vG=GwT[.pO,/6|ov✦Y|5NW)* !ѡrjOꧫV?ђ77Ns$hQV)қIfDKpQ8TeH: :qė/#`Mfǫ&Ї,Xeu5Ha=R }kRD +rV/c+wBN"M9^-U5%&#}r+ɀ d7RvYN{nZXNEo]h uj %UwӼ{uSW[sV#TzĭUL*tVka!vAS>xo gu"ȿUW?Pg09F&ӾPpvby#-.&.!NCB}/Fܐ8J=U:C^ :[Kub-HF#tިXK~Fq\( (X3j7+s Y-UL|mHwY_Rv2xD>{ۜ"?rD}|P_|-!\͑!,JlyLǑ+,2gk4>uт3FyDG yn,r"M+ SUmkEnf4j*dtS!=m[w5ۥyA3qc_Wx}պz[vR‡Rg;ȎrtYz2B!sB;و#DFͩ_A#w*ĆA,yܮūy2u1Ty:mEC;`[)É0b51Zׁ,@.] zҒg"CCƕ=K30"HQeE.'Y@ *6omc@)ox͉#9UwF}ӭ2pۚ,%?KǧT"21Y.iA6O t`,Fz{4yi,ԩꑖ aBCC5lǹ(*%W4 $#R E~{YZF"o} Ry1jUOtN)TBgb%R?)Xq20 ğg eٷ“+l{Ym ]U[g?3Ǎejv,EL4lX d~1w/pޏJ֧d.̹}7q;ӛRS$9>c@ b ݄%b6y{$\ dbOÚ8DI LH~T޳!A*ޔлx2U 4ad?WP3`7o5ǟyˆп/0<څ BsDvF׾$uc&HNB&ŏM]߳7e.p'ԩ]_3L_ Dgׇjrd3899$;ھ%~nk>880omh6vՄ4KIhIf69)xA:v1q' 81<-tmHQENW|m/;AuoNkdH|ᢾ~ tI9D>URj@ɕY)@SCYNP\]ߩKLlQW7=ٮuTEyv[x}7_K? Iy[k.!!' Bs49= be^"N`;ɭ;GAY_FX3{tGy?E489zf2ivnpU7o\W=yR 𹳲5S/e^I8a|M$H*}-iĤ=Ԝ02$5ӎ=(Μ5>79^vgAkd!ڢDa/ )嬭e6&,F-=+0LBo_;M/pEGC>:{i9xORđ^M\ZVDuu]yo==G#6 e&ٻ t"Gı]~RczZ&n|ATZp2\ukѴwByQxc;-i)/NY< 2mj)D@lhj[A4 tvy'U.VOimcUj]dpq unYN1z9JWNg*9JrW$@Oס{%tKt0yjߐ/)=kt۷}KtuizH@}؞ ՙ<E>yH@ &*,ցSRgy”XvmQ^ L Z s<(W?eptF\1U+slPK7}  K,*l8#<-iiE%,󉸭lFCF {SufH̺oD&Db]JJKKJ!3lI4je8>vg)e3qq{9{vķxhtv&1 J-ViuDNӼ<,,Y<4|ňkcCHs\6$\tL#5sg];W9/Lgv&}**xӰ9~<;Í *V_FXr̍;HQ:صJ$7cUhn241Vs3(M{U|3קILhx`xj%7Wr̚1z0RF"Jjy3WU1O"j!Iz\I4 D}Id@Is3^w҈)LZVmEZ/9}+hk)߉Kwh>|fR&DO;TaCGнB䔳I QM`Ij/(.oi@wkXl煔էTb~DL.}q% 'v,|eebdndB*wx`¢\Q)X@ ^3(O^hȜdzǑ,~l5AQc2Yk)iop*q^s/7lFKhjh㈐NrZWS EʉF,sn /a򔡢iƺNRoj6#vF?>C!lPg,uC6z|,,=̗J{XVz\gˌnٴ{*87-SY Έ/K"!Pr8 N)Aip";FeS%!uۇ9&:E @IĉC'V(p,WRLO6-?hiۅ8 :A#cR$'o!y|Sy|*LU`bĵN\IX,)vths_Т,O݇4AM"Eёj/{%ql]ġ=:s7]Tkܩ,0EOK w}ɮixx%#ѻ>toE'q[$ Dג6B].' _g'PۤstcՄ3A4^~m[JbظDt$u3Hl#g+y MeӪ;FHa51*56%)( 10WG"G?58ܙy[XF ,\'2Q(ܛR'iaLQX>dggoJ%~!/(T«9}iT:EEeGV<EhT0Dj|B󊟮kSіe0" \uƎxtY4*2UYDD)fq%9З`N|&e⁹lYf͚ fY#ԻJ!)`IV\ɲ7P;/F+d5=&Nk9e4n2Yi2I#.zk[:5#N$ېx8^5\V)X%N@z n'SU8džFy(a' +[Yv ) `fbHF`byw$T62'( )Ho6:Y/XfhZ LD,,)iQtS63wpSXMSJ$*J5G)CcҾ (H`SǦWc_V\ːteEP97`C7hgLO J3PZ d ~Abz5xfXF#jl4ZuQ/ ̚[F\N"`a34qv4213Y_[f\,rDlPa~F 6;5jɰcR< g52 9CA\}̞9?o8,QYu dEn(ahTJ9iۄDy}HsrsQ}& * " (( jA~ڏҾa*N#9$q'WNMNIzU].KFZ I^;5GZMK&ݏB£+X8s)979-{SmuBgw;m7v?7Zus&ΝW_ SP(aNXW#RW}0v}ЙyuâY6 āz<4N?W޹?qf VO" `Ol~K-^EU! /A8P%\Q8^ .%NzG2V<U!v4,'($Ͱ 80 13::BJP}EAodπ@ -/-+Qzű2/_%*Ka:ChPʔUt1iU ՛W.#*D&%_Lp=/}-Aƽ-rיX u,~p3/ڋh->&>6.?Z>ۗշxYu45L~%eeݑNպ d. ض##b$"$㠽,VZ#c+ '#3J!0")p/"tm6@Я` cxcC6M}2n݁!RM=kۇf~I aMBQ.G]BB-Rh aCJVѓHXy떺\UV|ClGҤ"B|ؒKo59۰:wHB8xIaMb5t0cGP)jYTymk?ZY;,ĖHRTfn8y)*ԬIr!992z0`ɖ8l08 T%AˣfBdh. O#`E?wⵊ:_d~9xoSQ43z C6Yaw)נ0^Ry4 hGbՑLq3{pgx5%Fkun46j!)34(IyofI~!j|ilPI;]S_6w4sɰ~zD]<Ǯҥ˧=P$lIs$Y2Y94EX]I1tx燐h#nlc @nT_4yZ8?q[=.VE/n7#k61bzL`$'!CCmK^QE#+q"Ci.Œ29B$} OR$ČRާ܂Baђfa@[9]c85@x уI/'\,!#°Ww[sn?9cIÿxDW_-S̆iaNƢ~WCMzv|!d"O {:x+f#;>&9rLKG/=#(e˞8$w9ňp>W,L$CZD*Qb2H\]1!%|]1 a1f4Uzѳb{_97b,(rSڍ&dN]^H~ܻ<ٳ n$3y [j-tL5 )C؎@|ʙ{OM:3m Okj ~Q$Q'5Ăk8ԝ)E'a9egKݙz5h('nաxO,J\/1`r~trݯSS)#iv_ٺ|KW-8{k>6>a?5Po[dSo-ԬMnգEKsHE05?!ḅ-Ly7F_hQ|C+43@&U-9lܼŏ8ΐjAS7\-IWu 'j|ܮ:RRNe4lÀWꮞ跀%,쬄}8"4M;~lf\ cL 敲v|!~CC/0IO;Oɴ4 T  uo'ж O~Bew8=j#'ε>2F&^{^:m^Hyh[3xD+_l,O>2$kҸBbgy67_Nޓ+nX$n!&O؍h1BV\uVwLi01:)B/Ř4P0< Ih̪̲|UW{X:Aס;ᦸ#€Qtkϟq󛱨8Lgd 1؟&Zk*܈\q|gCNga a$5l$ ̸35+*b1>w3|讋|e[lA2l$wbn{r@~ִZ6]h觨̯venVϥ%ocWȪ)wS%[fZs 7k*^`aG6s6s4r2OlX @ip1[KfVb C?cS̀Nc&si:9B"rcX{Ӈsv!!?aWQΚ"2_kv,NaMB`cX8\A:~qi?YYpX WXkZ0vd.p, #2˿X q8т@GQN^h҃Cs5&>R%U3C,egt'ъC;e![Y T9(R+SLoHOz;Ϩ+lЄ#isV5|b$5JI&zar"&W\X(/%xNǷRvгH_Tk_A'}OG 2~-Xd/et`vew_Wɺ} wqf0 'w H4;@@Er8fC?3ۻ\ =y4E$00{,0q#JdMjP[PC-DDZH.<Ʃ32e݅JAyWE ƪWI_ߠW(RJE #*{v`(/! RUV}̬(//+--}֔GCu^WoDF/n?'}E>@UQDwVPz2H8׆MsX Isj#/tvgoSb(F]ggLP(sI5Pf-_M -]g?Iw@39C~p"+Ƶ2'?@la-ȶ]; n![,w ,HN2ϙ2s>w UZ[֢ |"=1)Dzz? z3 twXa2I ݠץat <.]H=(Ch#XDZ'qNf^}}swl8d4S |f'|ϸȶDxL$aͨDjUTha4_%v&ibMAj25f{ajḦ́@#ӏGKf'@!&BKz kOtFar[&N^^kq,EI1rՠgWlY͎1CV,$0Cb03$ Sz}nˍ{j|z-~r{X()i.IKU2uL);+i=J,qRW +y9J bZ7wOؒ`J{o<-*m2)UewE_H$d*aX<@j%e ?))ZjbJ4nU1ǖJ$nPV{Bk jMɓQq)ZnH䕻f#n¨t7O.S)ֻ)ܱdx@ A/Lf0~9F1.&PKȖ<)Nj~VqǀPt'pU 5\|[{'ȒQCh#U0]b}dN] MGԑIO;"'XP! 2&(BeK``z~l (ԏ~\&Zd 0!kYT\!R:B댙J+[5D{Ҷuluq×&+)aĜ:q`+BxXBn_ φ\Zz׳}|+RJF.qĸ5>mLF}` ]5w6a --a/D\:hqb {ՉU0}՘>V6[LBHsWp.59>vl|mҽii[C{̊Uzl>nCD[$TAF8K?_;P ^<7-.L`OaMaE624kSU1 GɍaHH"s_U| -ޜմ#Np)\}6{wOugPJ+&p'{z7_hKĵ .'.*cbH-hdsh0z0kDm̢?='&&n_|[_7<`3--k;ٮ̭X $½j]5/ÿ !o Tah$bxI2;GtGH0? 4(@}Hݓ@m/gm 2W:xa 'B ZS?[Ù&L峿ߒNqO-3JTU\%dn#Tt\/ $>"ƪT)Hr.9Ef$/s`;'B$[`QkWtuĮBM/2i̝t j%7<^򝑟6v a5&VoCP=Vi73A] iH~:4Qۚ$r 7.7y?[Cɾئnxnڜ.c`Z<)UF#"ւ;npiKdx&eqA2W~EwL^#ݚ֚BHMZYkFV)4J4n3GD3&ܯ_VeֶY||w |;`^HZ@oc'Ug܉oC-gvm7X]9MХs]pp \IW)|sF/?Kч0*6Ď87!U F3bCh:l |*8RId$)0qXu92@EĽhڭ  ir]E6RdجsJx2v4'X= q,rB < Oxt*PV#>aR@G B<ipS>)FCL*8QBeKլ̨te$"O$^0%0"{Etg}3P9$H%dV <ȮU c@KKU7d4uyWQT8nD'(/*%uA5Btso&McT&7lO߱Wm62u]&05! K5q]>ˡ%pݎ8{߱F^Eo٧2~jI"s 8"F$w YI2Fdy][ 3m֒yK~cJxܼŠ^<ҢJv$Wͧ\(Ps ?Q+qk~JhqJ_ >؏-NJUNGpcw*> Wq\+bKwۗI>r OCNtw"- ˡ*z_O=M7<=F {[V`p{&Dږ?wsS esko>p)CFƬjm":~Gca 5cUK[;m hL:Y FL`8@ Nwaxh<{,K_~W(@qn)xo!?A@y@ q(h2)EhD !f٣dR>Dz3 ,e~= \QpY\dO!ׇ q'GU<0=wДDJqg2 uțqQQ/n0-wT;T8.SlJ;sk`~cG_nLf\ĴjSGxA9z%£{.AeKP>8 ;35 W̨b,҈̆.{BbP}~hO빾Xsw>/d, &-/:jY/ʟI;TwS0Cn}BP^syU4n)zhע6^,jQ1W6 eKbiv%,iǙPL-'3; 3f${00"Mn[J}Z?xpVzJƊU%d=T45-HA3 o>π.d[wJ<*BiD!R3}qRCD\I.㡯Rma"#CBH)H.r"ܤ+J@$%ocblv,IH~:Wβߤ_ 4.q-ed 4)1QS-*&^%d"Si10O\ҘQG+P4qKEXq0?ɇֻuvAl󒙾Wv& l,R+A䢨GWEX2UD. ʥغ^һI _lPF !F1Bd@zPبOR^ UQYmw:a |=\!Ked([[hm~-I"ԐRڂEM.=N 8&\d҆,ҷ(.5v_G91)1d'mI}v'[S[ncrǜۭd|EL MD#m<# ?,CK3#~ c_[<G63m=L,3*.Qw8VUd;^ >L.XPH]:FmCו3aK?!zq[rVuPtWTq uR:qĒX܏:+vEaET!%dYA[} xčYm,,!nA ? #n|Mx")~3R/)zc_%K2 aIˍ@ņ~iIy'©| =h,٤xO`¹.jk|c%h]-HJ0;:ڻݣĀ_!"/ <-@vC~3?Ҏ`;n,zvE[*T_ͼxz'O5)~"E;w5ʌ@ }FOex X{3(}7-7P_0o~-4BY˜T5 R9b^H,HIzkVԖ˦,1(QԔ=MF:s[bЦ>ڇm[Mυľve6Ci$3[U4;qIgqF`p!ޝk3Z~8?*#պk+iQ*f&J.h:{uDN:|=J8di|7ɳ|HW-(kGs r=r/y`J}̅eIn_ #<aKRvm$O$':#aXK^Q,*|hkB[y61 ]ߡ!pϏGK5ڏmzބ(㝆ؿ7`k'9? l2| 7oiʟxtnXPߔݭC0i hodne(>R`V"iqu͎JobݖaK T5Կ\u~`fhiM8#hb'Kkml nT-@3P'Ze|xr&8O%ت<铕h)[uꐘJb/u )x}2g67JDL Uv{cu\:5A/-uGю/I% X‚K:T+RmWz/_D(u*`>ñN:gId1q[m cgQ<t6zcm6F:N]rxoB%x? .c._n ml M-P᪅L_21+Æ9IByt`)z[q 3zKOȸk(pF}K!}3ﷵ+bѾ`EzȒm`4\"G $k !0ΨjbEEiMaSn W?O|jvxLq5 k 6>&^G[$=wH5]iE 7q9ހh+a9?=B)7}f[_V/ɍs~Elq8˴[+ZHbnN`td9A0!,DnJ϶s5H8X|$&*#gY_PC\̍9+P+7o) ådNmQ(,RzązZ/lGpJ %~)U%&_D V&ciw2?l :캎ycrٰ^혋[v mKRT һ 4Ƿ.6f2t껫;)di~._?CJ,RjK΀H~:t_}+H0ҿvxr:e $ 0h(FvAD1 Fa~ )\{,T7Ǥ˒oPVPY+>2/ς٧2";yV00M|uU^z.9E{kwqSxon&W?FCY9r,J!x[;*۝W(,-aZQtpg]&]DG V/ÓVpVt¾tK>6GzeeKzrt|Hh}f>Ze BR`gTnU(Y;61j(C/˪݂O;項o(  ۱D0de?ic}1^vfdE!H8"!}PunFߥ)͗"M=:B9zr>^l ˞h;**Mna9ے3]; Oo|)ɃԝR;O˵n+0`D9NPY}>˧0&8|*iYc8P!u;Ew*5L|"k7nɄ 0/'s8̆3P9/۽^ >?0b|iuϯ''W R*\@=8.:kgZ8 %ar<6ƲAwk%fy'Mzkt,z[ɱ 4'/,KTaU5KC*mL054$!$7lnxBP&4\=%2Ґ*α.Vz%ZZqv`ʟ/-`KA"p](pe7~Xh;.}l[NX=~./kA8ôVd:Kr R24_s!LΜPD]0|.ޖ}~ j17,B{> ~x1}~wOiR*`&)S#[N? À0 'O>~ i3( c#?=0PQQ 1g{_VO.~c7p-S⬢Y W}Pr]QTC%#MʒݾT)DZ`?_*-5?4WxY=EgNPjn 23~y91EB%5צr+Χp&W }z nˣ[,8*Hx=Y$?lX]aN¿GzSڡ.<ʬq 1Jbm$ʶi7Տt2ӱK/NMQV?Qe& %<)a|KknK۫o4[ kRv, J5B&(!Rq7 ȴ#iB"+OV#e עs)F$QNoHmnNA%<\z\ejZ0 t| /Ō A.a]&QosUKiX ѓqmX[:&FMHQK3Ⱜ X׽*놌tˆ< TL[SM*gOv&'@AqvM*|ttdggϟȟG/J#?ݻ>>>ӧOOrJݿ{K(sl9)wf_7/&h ;"Cp_Dd[g<dVlY(%ڝ[\7F,/ˈnR2s;oP[}覅MNHLfuC:Oy=RcT s|K6L,K<6 yQV@@pbcǙ<[hbcje&V_7,i & eka >E]Nx )4O$Gк47 g:7g7MqB1؉FL+|'Zs{.'{s#syBvX{hHjj-lT} K,#7&Z;zMϯ1&;do90?hV/7&\mg?U>^3㚟\\^^rFjp;3 E9F+J!uF<'XP% "X5h\ UP">;I oe)oD¦&_%_N>sY8#U4gNm[{GgwqvxÝ . ;\:v ?cT3 #/}trVk|ؗ_NF [{48) q Wrz wCc gY}2DN\֪2}\RQXUwq.acYצ)\]˅QU&\8; g9F"U@ptgD#:(5mLSʴk:341KG4RtuձՐY*4;=lx >Y'W1:aOKR+oynZG5y'/;LTk  b^&.(J`ԻmXd.)|H~ "KbWc0-fwص@G=M]*&m1w{X:Oteu$NÚE={I!*$L|ɱK%ݓZ؝6yam)QdsEiu;$@<ۘƍBt %lǬG | W; Cg;CK+ K\{W.P~'Z dmo|r#&}J",o ,Iq8(q0: ŏ/5ߗ?,:wź`a}S ÍCUҭAdiOO7w+0u5*>+5^t_[-gi\KfNnS֔>>[Ґז@ie \V-O٠=Ts9e @T?'JaW 23@r{b|bemNl'|6yƇm.lx_W,%sٓq@8;9:ISM&=a@}%ba %N VƛRHVQ+mK/@JjԨC$\CA6C,Jwen~x}ç.ęO M<}iz` >Ӽ Zus} 's#$8@K 6j6ؑR! 6L[P/܅g-;BJM̍\]:`|ƌ:<0bVgbX,iȴLff[y//>{f )WzWׄJ% g@xm&3XYW Ģ*"HXq%$ Gʼ#6xFOZUYCc3鎂D#HeGvυ3/n-& ABt/}B oHC@ =3<OXS(o6 5r@:LI0L<ٮW61,(NchKRI2މȔuFRჱ])l1[[ $8f/o ThV\lV )x VRQRi:zGv^tQlvꙘJKvtb6lBN \Tbmڭ#v}{IWQO IwSzoî6$i$_z j4qa @rڽd-'ӞW%/aw%1V8.sǨL?+ ݆CBtnl T}uf=́q$4NVEq5Zę.dfl_=x*Ĥdn3wwdAq˛aK@ PI ߮C}DQ ~Gbۏb"t"ZqM]bS^ڦ%JA沔u۳ލ7VMRo{0O -}6nFDmEL[L:p a51gO <0*G&Xuy?v5xOohlch{~3;ХrowKׂC@#"@cb A#a2Qb<!8RxHI{t- Ӣ'ƪ^C3p9S:UXl畋7)烷ԩqTN*n,T=7/׊)74)tN;?X$zuƺHfdyIDX=n`}c3Dɥ8? 956P';!vc>Q}"ۤB˧WysJx{D01Re٥S)S* *~U+ _^x}Гp"L{=1HOn7R3_vty`qD"Y;R|#u;In1}n>2Mg;RGĽ^Rb}iXAʩi^q<]D `Or&f@8yBFR'$fΧ/^QY: XZu4ڈk44Lg ~ `$h&krZݚ K7K1x؅j)4LWxS,;R 0U>>E#IUY ~[/LiF g7{ܢviMb'Ǵ}f^D5 Q5C`u#"a|qcuG[- KI3C/ip}ßZq.AŴ ;Oi@0o0Q v1uGM-7S0}Y{A_"$ 26=?^>mY$,ڑ3KE@s ~~qtǴ/A{MR\Ơ]k #-cRY6Z_*"N>vɏӺ!E&E#lO7'ϻ n0fU  H輜f{\Eبvf%ŧ嬥Oz+qM{R? }/z " a_0 Y`́}w!g0՜a9QIzȀqygYAPe j6`!l§]d] y9<>Ĉl,}!yjx~}NBO8äcs{ܖH:Vwh(Q۲S0,YE2S!NR%k__滙X^bwҩe1e5! cBn|ytL zy=NFzzwM=^܊M7[Z<޼^ǭҡýSG~sퟗ=t^}Ɋ\l_fw}Ĥ{x80^݁ˮIH]s2tV&=T.,iidea >.Q'sھZu 2ݷME1YnqLI\ݜ8̒̒8qW<S5KXn:;X>|PH^t(m\֡:'nXGZqPAJVm>2Ƶs`bnP._ؘ7+)d>Fhhhx³wE ZH\䉭myUUUײH%!Qymc[ %$/xl+n#mg ߝOVr̫ 2"+z5iQ+"<P;~'驋'  춉&AZ2"[ x`jvT2ͬQA:=sax-֚q(*?g_Sjeö;|049#N~nZ'>Y^槞4OoF}EִBdT"Ҏe┱PG6w)ӡ+(+͉+_3Eu&u8s)2'i)WR47b}sW)79GoȲ{{44ՇT}wƄ<B_"0 Bt+7W!'ܨ ߉:C l=R~$/[n%1VTK@lös;iHrTP-TzYR*CРPptn8:W\ȉ XJO-{t/'V&9_dPE|M6 AU@!>2 -ZHRAs5\ ’ۘq*g&O&|dY|]`v^v=G&$r7%LgsMG"=C% hfj cCKcnVfLg7Hx%~H@fh釉HmXXP?o", _g[0Д f Ś0%|J1ljm`Tv~-by0 衴!9ZjR3. \ O D:.iB +#E?Iya$!<P=q6)'Z֏fMi:ˀc&i")eߥ[wxjP[J]Ra{pA:\aU:VSDھ7gI bY'txi"#,>Aͬ= ƭ GܖWCu͋){ |kɑ~|; )M{@N4Y?OP|:{UYz_cلgeَLI$ }`YIy'4'InED/Ӱ#ӱ,z r*Lvז%Z9jrugLMKVXs$-~ >RQ|9gcǘ<(/#Dg(g :^xe-N~^V)&#H{E q}.K:.f5-(_'\UW$pǛI3sY-?JEDP|hE^"&إOz' ߽4>CF}5ϣ3덻 xY)+qe X6g|wb̡!QH/'v>)~Sک%Nݦ, :7G+ztښtY\|MhT.ҎpY/Ƅw \@HtL6]hSA:Gkd$꧱%pϢcͤwW 7f|~`: Hx]^qUo 2ď$HG3mK (y&iT@=ry?5heXATJ6TWW2eB\aVTlte2j[&)OY1(.Q^76r'KJ.G$JBL*Cr`>:ZOI^-փ(,8;uRJDn9@ȁW"b:jH>`!;l[V]̸`.Z˛K.Udmj T]X%d%Iu_oMf8A-D 8F @kQ+=z9XP-O/bʲ@Aۓ{bL1i1{wrSzz"U]kʗs`dʸ)P`ŢCƽP~,aݲdS@fTĈ6L1GeJk) h+WT6dZ>s"%5fbs-z |ul–|!ݵ9եΓڒۤH]f ^JKVAJKƒos~h>g([3${ɿ0\P5rpIPu _T<"OE"Am " `8`2( =;j즺7)ߝ4X͈O5c@*v)kS='YKy (>1csӟ\:8 Y&u ۂ01YSxHW! to r_-طT,[{cwIZ̩ ICBBZq\/לyQ|onooG|Z&Gh^_}O_tZdCNeE/u@!wJ,"SuQOR5jw%:`k1)Фi_{{ݺwkz&3_9??c?0O <|7{//"+)VJe^Х#\,us67r|{aA!* xމ!j֊"K^OσR0d&՛\wqN /ꘚ={ -]pR!nB@P5Hp H,www'h{ӽ}g~k|bUkǨ)004F &OISe˒F\C;h8hv_lM$4phn(#|z-U9.M#['WstmZgo-'&FYr$pCʐ3ebU᥎zVϬ9:ЅGƽ5CX5JaCR/P='i 8Zs iT2Buu3= b542\ܾ =|f`tLgoOOOU@P*5F Iu`˕حXq)|>$Grݽ)}(;k;U8=3?T - >O޷z2<~iW p㧼z-DT*+'rtJfFk2hY\_Pvu?ۀ3{s4][#q i yVO3z+KC =3Y0ơ[B++3HM3(Pᄩ1#d伒f&ەSqF? 2ڍGoyXG(:Ru[.5 pQl280wvɝCZ`lZUXHŹ:wS>2ʇd/z印[O6C5B cLܞ<TûG1 ?'nÑ&W@1NA c~#w|nGfuSu^P\rmf.A8:p>e|mJמRCK,daqvxyb>7p":}(yTς1TZVXqVrN[br)H0fڶiZxݜw1Ef$ FZC$Q#U9{PQLxK$$_FseE0HjM[)o .G{ LZao/6jImd:n&݋Dhw䡵Q9+)r;c(0Ɍr-b02,-EHou46NÖ:D wia=#Cvp[^4"y읺ZuX_)rN!EYSYۆMFM kTnߏ)Vvb7`q}D%ױ7c嫜SRfӕZ)քvc^(լVa55mp$ud{YGY;$g]?Xr]S8Fh. 0ct䶵pʺ,CfvGo[36EAIѯ1Ki$8ngYZio1ظ7Ȃ,hq%AА0ty 4#N=x Jb!6>Eh_0ll}yrdzq! Bp@QZ-%u{ШR9!4)}LF ^}r { b|a|@4v2MO+Ţ2_[Petx^{A4J{5Kc2:V^O [X1Mu5AlsAr~,bV>R-/گ0C.=OeF 9',\ąMFEIT=)dɋ8?EVL϶Ub[]EM7,A_,z Gy?#䉀Yrg%OnЯVRJaV <&cI*Vv{ϿNirG~6.7³abqjx.a7a[ŔrRK^SR uꪳŵÞ,QSggg >} Ji+K+o___=HI|wpVoɯ#@.|>׶XL]O'ϺڐDBpQ;q b]F Aؿ$VS(Ǔ4fO$'ZOQ5رTٹ@|aB@‘-c \. ( t~V"; M!1C8C_!ނGn@7n~jvo7)&n}G Ww8M}?eBw>h{O-OyBmlO&J C(eݵpǗ|ӏIAOKݟ'0jέRX?-B>!eҞqqCѡй>yXb\t(x{0£nYddvvǨ.'/aMt-jdRlV[ 6q\uETM`:JY<uu !L0=[ R3^ ҁ"r"|ȃ[v%hlXYI:?^=vqLY ?)Yl(}xaB^)|=-$%kSoQ>It<QShOf"ZX@ ʶoʴ}Xɐ*E >l*.7ϭ6 -*"E 6n<9LRx?~"= T^N]lEE*CvMM;>e\þgW]Re4\ں7+/k=`PF ϫ1 ֡ t|+]h`s8{."23 :ẻ_%)q)&{DUVE|~o73V`yܳxʟ5U` $S8\y9 ".-),t A+҇8XZ oKbNl dH\O=xJjaWn zݭWO.}8žgefggfey"K9'T\1WhaG[SMgGGdөph!VgxhAo!OԈVϼBkN͗>?:;(fQ{P ̎K8@wHcȑ^ckcˈ C8):bn:҄^]pf ZNê4_\=GYFշQFR\(@=TKNYv2Ȍ"|({^yG4"[yf!#[.NH-n/O[hY+5Hxت$4"$=: W5G&Zk3r`ȢIу` XJ+!OmGwoI{T2R8 @*PņWI!FI',/, aBhvAI.C#HUMw9= SQ>5$Zj %A:12C:(q`ޟW.-nf|#!H??>uU;ԫjJ7c2Tg@*FFtQ܅NPHt352ٹXӴezKRXqB@0bׇ]K{YefU^vYA½? #PjiuA/nCf Q8oWz^UX%G%q gmYO;7W>xZA|io`owߗe4O-y=' a8 A$N-_N Ӧx\W*V1Xfbd;3žܛ+b8j\Ь+P=z\|8nGQ.L݅9_Х ʇjԃh8a~8'Jj.?u]^X5͛&eؿ" X=tUqadO=Pke?$BXd1@hA=̔u_"'2yӧaO:uh||_*f?Sz /<槹p  nm ylW=Ι _YY( 0 @>nS=.BfYaĴqӟbB,<82tL @aEPGթGXͅy6ӱ3ÖWɘU@Gu֮xc<۝GVVg)*f>:8'~K<1~rytyy=a ZûS~(; (xG 쇦"@‘FZԂ MZ _oPX{'cW8t6tw]M[^0r{1W7%qՎ Gt,MW=փ0_YrG?yAͨߦ#avH0j?Vh5 3GL7L۠΁`G .5u1u*:SO DqQELd]'+:-:13#Pi j'y0Z`ԗqiN 㻕cr w+p=v g.Ch],GwcstMtM Un&֬%̝SSN7"?OG=U ,>;ψ{?ڡS2 ifAnlPʳ_Jp|c봽eӋ v{ QOXi?:-t44׬h|z|ZXtN UAQI?b͞XKI]=ùWB6&E}eM iA"C|T*܋A02Qsii#',q@ǺwH@l ,J`xPOoZ@bNkQ< *.n02Fjd.5U`N8 fǪXSh+J^Yvױ^^q H]jpsU GƎ׍ ^ Gd K <\8wQ55O̰֟si^{O﹁IpV HrY.?Y7 3rvڝՔu qY@> z zeL][.g])/u'LFxG{;MgLoִb)cupSxX"tCk[mZa֖[I7cy; ¸TdDgFk9T:H&cE8˲r~N]3pu.7jᜒrobzDO^Pr`j\dwS9z=E#6?A5`ޯ9|nHd|D]|;z,<=PCsboZjhA1`ds`FoR f!rNB9R=P{=κ9xGی{+ G篓sTwXAy[/Iȣ9AO.wAΈVlu<k\Û/+Of*O)G.R)R u ?O !eW1B] ,-98]4FC7n!T#%f WNC;f"hG+i.oG/[IerU?vgggw]2 3>۟+t'AH<|Qvv}5| c_`^Hn~0_&NSۋf}sv'ȷю~WZe{2F<u6nlTqev;IƋs(Ys:gmr^=xI+p /ea=r2_is..ƔB6P|.#ZD:' OprɸuZpv8%ng.`|e.<ˣ~봎ۘ^BY#ͨ\e&xԖTBSŴ}VߛAMzX=s,Ydی~ltw*Pvguo#״_u x6PPi_dAP\Q2䒋`zB_\ rJŝd|CD*蛑X̄$諒C]MJ@~Aؾ\f"@$U|(ԔSlogikMճ;mmUiSzϾy4KBш4T},l7ѱd'1-^iI)kS;5wkܜWlZb(yQ.TOVz#rWT-:89'cӂ}cޒH>ym/Y2$ f5:?2*XNŦ*Wzf'kf#~fV_m~ˮ IT0酺a,J[>f*9㊘/"y"NMWlH~w]$5_Qq{Uquӯ ]N&&n&Gqӂ:t05gc'Ȗe^[Pj]eR)BļP5!VvOፗsO\O̥Bc?rM=N_^utKqNvT.P\ 6ֹz3L=do'~"N&"//2ct}ik%h'蜈`PC0T"_ٽnF M ghx(yG&%SQ"D GFY xa:s [5F}oEkq-ncZ犓XS#=Rn} Q*GRSH8YP PM~-O˟ol] Drsw ,>玌w^@6>\v7t W0aHT_orMHמYɭCcF=Λ'\ /h'~w+5KWGhޱUi[TTʞ;Gۼk/_#& 3 ;2/4fF@71prO\_`jjW_]^O뭮hqDκiuvzџ7gOIVx_VC`ͧBؘWī2!_=U! lZ.p,K&[7Igp)^,,&A‡ yŪP H:y /ln͍$7ٮgItQeQ*DN1X@&ᱦ -.rOzold}(ҵ"p_})wjn~M:%)zX)(=qw 畞 Nᒑ~(Ov9)p}h >қlMϻV9_΢ֆ#Gq6Ja&c#c0MɖtwU(TiG$2?E`y W^1zqw$ 8Y@Sca^F64[8,P/;J#-,,Ft R{.+>Y(_ۖlqTpȞ6CY_^xKJgP>o+Z@@Z"SH~;VO!٤PUGx*˝褁{BI/},K\}OƗb6Q|N 7>IL/eKip殃Dr=f֣P շg~Jt6YXbU&CAl7-ɜJt@a%'W_jËS,X<}8urAtC>)ɲroUV`Մ鏆o_d#2h D<^00 E V~!w_N7~CWxN| F&SPbX`앭|&sb%L*ZaL`kCGB\at@4}&\Qr/gm$Vu*1C9&Bȸ:L"bb!GkRZ{ OWxL'7 PC!. ǰ m] ¸mpB Q1ǾxQv6d h׈ʩcX8[~GU$][b2y ٿ5Z;@UӦCg7`{@ *^)d 8j)i`:YOmgWjBP|t#p(8ަɉk DMo4?19 ze?h#K| Yͷ ]3i)y@%tjaVEJ'$?_dE+6Ja_?::a+Fdzvn6)s/'x_7fx4ړ1pjmau޴4):"Vޤp@T|l\Rf䢝 SHS$`y(kg~REɺI"ѝ 6ܩxuiEb Q>- KKni1vgKA; IN6[{tW=BuI/ "Sf- ZZwjKvD(FN6/B2(^v:?UL\0.fT32Zd:Ig v⟺reG^$pS*CJM^,.vq쨁v/vBc*OuH(m mP[/e>6ߑj|Tlj)8J42Qy# \C/a0wڷP ?׊[Y.x/YU)RWYQm8+9ډhae)͋Ҷ'L\ڈ[N%2\Fh_ʍ" oYOa7-( A* Zy`AnVK$GOӣL)Ԅ #er{ h8*ͽ-(&ҙ :<:9fBEVVۜ )S +Lt7.2'8flCoxՂR&{kjjw?`.|?~(B9+U{3wC'S {#SZ[CsSSCOBv>N 9n%8HO*S"" ŠD|'Wg󢺎 v(t UV в1g2V( ˄K·iF @19D@0QQ$X#Ht! 1/Oz@7zQETҦԶXkLhTLQ@lPQ,dP17VX2j4Ktg1k5.5sMN= qZᗴcJ !x=*cLB!]_+DH&SPH;Z_Ȋ612}]sc @/Q>'\X9Q??&##"\Pa= 5<Q ֙gmY@W\qshjeפ18RD)fp=DbКC, }+GjF @%Jw0ȷ4 N6 ]H:JP@s{/).5~hޣ-4EgU)j#.Mi": !R7+c5yUrR8V?ulyFĢI݉m>m,վP[{g K5/䦷*xu=Ӈ{Xӏ]Osn2sS?,mɓd.vg%G(ߧA@ 91E[GBx8nwwյNM=aScLyr#S3W^{N$'L@.|[l ~`i"@mDT4eM`2"zjHn`\p ; uWJM?#`gAhsyq_|6(LHCs+YQQ֤{OJ XΎݠ8yv}LfKK .%dw]'0to+SAOn|P,T|{HBSRA*3Mw^"zbb7r`{C~fVV"' pDg1H1,.`zH?9>L#fxv՛Jv q d^lcy܁^ 9p;1jlC2Q㗹ʹjrq+Q_Tpmg<3jPT"t8sV_/ dEXUYBu5Sc,%6VZ\{ "GBj+l0::V.f[C ;t`g!~EZOǧ͕zfgW*ssQ Nƺ;9Nsu@mj#O[]JpWِ"BvNgLˬoc%+9U ?5b3EL`>oU)qyDGG۠2@/ΐt|$=p0O䱇 %FFcEYzyrʥ$cŰxi]MM9M\/Q+z8\[)B T dm{ְ?Ԑ]Ǣ˸&$&FmrC4=w.rAC**..0 $DI_w@a"Ml0:8t]oJ(y}pi`VNhW;Qu=;K&b;W ߊ,O|! s4lgo-A"1Zj%MKK d023 "*@rpBOdM#LE{8QSK{TJ"B^DY7ψ,Xrͪ ۣhщ4Y 15cD!e㥋 e*@%ZS/>3MR5VSK- *OԜQP3Ic݃ 1쭛Qhu mB eNH1a۴ HFؼSiY٫̕|eOwRTI*+k띸ZHPmKѢeC=-'sR /$V-PZ{C {qkRY|q e("l5fDٳJHݧ=$hnXE%v+1K{S)*gnҭo)jc֑cWǣ *mBՖ/BOXBBo(TTT>HIH6I\˴?nl||b*%%ԺjV^9Sig+ՓTiuCBȔ*MQZ_C5aSj!ES@>߹d W;1$"Ocn$:j|sh£ [Ͳ訨ɋ`[)sƳq$qsom[&>씸 P2=,ALGITq 7KvQnŐJxL93Gc?.Pczs;gk0[+V=l3S2]^nd S4 |TM :Xb* *pe%/{ ^`jG)Ћfa{Hpך7ND$AfxXZ|||vLFW^3j_]\ԳXMc6- PF?s/K)&G-8ýV[k栭]RЀ$×͗%7wSN*E%i-q)Z67_`E*8]}3Sӹ14 sʩPo~SHFAC nfY%ÊMSuŸH7ZZ"ginRť7eHj73豓ӏzW`ƶО-JR &gCSҼ4 ߡ$sCHl3ߞuDQ`tN8|GsD 8@zkB-< X43S; Z WaEuGe!!.2'!Q42kbch%QtOԞ0>Y3/be"5EzAUTj%`|Գ{~pG8Z9UiSCŅ2 dYF=HO5bo.Ou}q@-5H>e$^E_ ~9OO4߰'Lۗ<rYj Ҳ Gi2{tߕӯO51>y9b̰֨=0x3I&Ū2l +ծ1Ʒ]zj`gv[Ut 9"JwH HRJ*) s<>;Ŝ}^g֬﬙gfkf3)c=n)<5cJY2^LзJ8JETb;j@E^Ź;tr!OV>%|pk#tLJܐݹ*)7'x%i8OVbc3a@S̴s^t㤦068ѥNq3s9@@ ; _G swqٖK`˰C#ok+p$m}=9Ct:ô뮳a,A+8S 5;6/vVVf%2 ݪIȢ޿YSrV49WR̈́ɮ=$Qq# ײUO,GfbKkh7$ߠ H!XZXIw}M#"t NLہe9,wkq!&O;U0QD4QF}3"hR,b.4%٫M  AH:O;nU !oXoah*Ȑx c$ݶ!8#IPU\PZw X3ߞ-RpH>?|۾wC.3%bXRjM }ץ1e|Oz1kbC_g-|Fg*+ubQo<ٹrqD%(e'GiP9LuG F𠵮G6 L֝ˈ 򨶈 `‹m:-^lfM:ȘR֕3bs8HSvfR*-$A|T95IsF/Ohh+snq D|o)4Dw R6Ls6 24yJ$]\n\@=(xXl~_z` <2ai$XX&DU,Բ[e:+l?{Ex`cK5ZÜM~~YB_ mťΫURĊ7d:qS'W ߵOI׌ ug_^yv: {Fu4$"b\ehKUʻHӌ^G2Z@r-]WHB*(ׅ{}wNK8^[\ޖLbB{0'{*f~/h,Fm`WPPԒ"zЭptykO'n,ɧ7gzޣޮ ZS+ jOIv|- 2w6T#Ǿr0Tz?)޶ԁ=hF0v*AF-rޥk`%^|LC?RyhPu!#JQK_&Vs _,ʥGy+VZ|1ItD&dz[lHrC)D:ZlX~ +Xv/oR>8o`~ s`hna7V:'V#ca=? c̹$\@a9^[X{ }Z6.W*G$Gc< n;*nvlzYUY886;ۍeHߎPhD#n~M*bsc/uŢ4':T?l fۇX;wu< d  EW}=, M~:%g6mf:g#SiANYOLTqIKg> ^G%w`y0ŶP kӁTj&-I]ɃJڒvMnxXs>[2VkVjMY-Nbybmm-[5GLJY,+>SyULȷ7ϻƞ]UAM.<8WT۔a3J^!$$HKtMo! (}b>>=_=-Ӈ>YY`}cݲᵍG ͒468S`٭k¾z>>G`*1"Y  L\"p̐!T3w8.M.Vd" $<@ S?3jeD> A 4Օnl9,<gImMM~<l̅<"dBBrssHH|4B 16ymhsJ>:/rA(AcGn;ن5b#6p=4+5cG "1yyzUqJ̈c充>4ˡR, aA3=YgX%nZ%YW6|rN' hCl\AS*w'?\AF@!x𴭭8Q53 _V bWꕕOx}F ,+ggw~r[<88U,t[:_ n]{{{xm@38W#?*::1".'7n$̔dm~ޠ A@>3z6(xW ;n Kkk3 >SphU%{wezA+奥9Y>g!N-\K|Obʕف&dwd66 x\!c#ֺ*oކY 018r;Օ)mF8BpN9Ǖ֣n/Qnp蓑LW+VNT% 589˾,o !,OzΫ8thV>4;CV:Ʉݵ[+NA v[߹ '')>q]PC(ᓝm#gV׉|8 S<"΀9aTak]LFIHk̊Mjjs#r\kr=N=߳g2a^aK-|qvvm'4L*4[ y|l=8F>:Bjyz̸?5d61#F;_Z @X3)28gqS1 $MU!E_-P/ / KkzcT AOmL\J  >dn230*H/ocsBDBܘ|콰tR4$Ugj,LLvyZoCgkxOl_V2v`ʳxgj 2=><<ӚJM2&9ߍiiia>JY/߿L1cM/ZQыu+VVV&Pca1ר{+"fPp|yЅME'\Fw*hhBcDm ɰ$lLxk%%vL =i}>l EE!4>Б:=7h]Z&Y+nt:l 4@(YuI&Xjs5by´EjZ(ihpl\,[Y(6oga7oL0o"H)- АDeҨ/5z$u3FU3NLܹJߛo)[V6g3YDeh4Iq=2V=WNd[rPjوm{1ukmi ƢSH)*e'۪􉃲۷od]'վs<Ƞɳu|b,wqPc7Y`wwɢCnB5)In_k4ˑ22tق1Ѹ7ˀo233 ɪқ=3-RP}c3 .±jG5|N$,5M^Cg(ρ-O( |}}ϦyAui At4~fh[RO pIt` Ӧa.꯺ÌRn^,k*IB'7ᄼuǘlzՠGa470#O^ԛt^ _H89ojaX}!@o~]aL&c]8֠mSVb1)lK"kQ CSqK(]b k#-KKl.dșZmNDD%xD,>k90xKCKkpD"u')1)aO`N7gunϽQϚc*Y|MY{rAP.^hѻ\r)7Ut2/9|IF]#6z=Q)Z~ ta.o=!焿3p]-Է{z3d#rR[Ն'UX:o_\^g*#u$w:ɼylP'/5s7:F-ؽ(A[@IpKTJb iٹiֹ>n~y|r'USq73b?)>I .daEֽM"N!~%<Ix>X$(qc^1ٕ;<5 n$㗧m$࿘bRMkm:g{lMG_IG V.&8$tbm> ֪ r9$Stf0 /khy|tB{*"YRHy“H&wK/M;n\hL9@(*4}h-MqdNeK+YB/;ӣ4$X$D,i"sZJ1qT/OЙ]%uJ =HUµe3&ޥ 1y"3!7$[+8+Wf<" H"6o]"OhyvaUJ$U'ħF2wWܽ{%@F=2QvL'TĢaAIQ۾ʓꞜs>˩[mt۝!QDtpv0!by+:vL'dsxz`0?R~}5I`GZq16Hã >-0+Pޓ=MD\ic^aeTgx #߻޽F&bzn=5hm>>bVxYʼng?_mGUZ/Hwg%k] w}G׻mjTr[-"ƀ9ITREQCbM_ArAi}ێp|-(E`S"\AUiTc=9/ 휮G6kp3Ki[9-](CwpTkULC3bMge35  H^*:uUTNC6 96Ơ0<Үlyϟ1<ĝ0x̶_7_b(=Gw>C ZśW<;)B]2'!ךةđ0ADi>,6N%.Ոd0!i(͢ͳxױ<F՛'3pn0' úm[#l%fGI[ r=լt4_cdJ1_5')J8j,$Gi\=rVkA+?yUڋ h)S˅>r~pPbF sjW))p_upR =DWN4\ / U osu5=gwjqàCet:m-z"4aV_S9EXjoQTDe=],^?=F//6<ܖvvS'~対{)fX5 rƠILyuC8Ôh~ Q?qpTW]H/ĊmIF)5}`\sDpx8(=W}9"3JnHqG_Sǖ֐>dwP@p:@3 !Ý6lOF7(a(k깏lY Вc`Qxl3L?F.8ßC!*NhGN|{zﺊbJLFxf)z̊JmYSR 71?.ï1ͷ Xk77 xŨ~uU6ζk[],ܻY\ ;KN#7Z_I.Pf^ڕy}:~CcEti]{g]:Yῴ >Y! ˟U ؤoXp)?ڇ[pb>UblR=} L'TȜ|`Gk %GiHmƧp2\MZ{ j2"ƕ)p %t?1ʽ/s/Nꋖyފ4ih/|sx0=ͰR׃iR?ǸoA=)0DK*nyRy 0IS0:4D2A6lG)$ju_K/hO^1qwP 4 ZG|k;]F~qezc6&Q&2h0Z DjBb"' ^F cYGՇN/9;M_TLD{hB Mݯw#FOi-Xm}m#q/iA(gRY۞y K?hn/lZ~+mrhf :üv\o;?IJ훍^5:V@v羮FW+DTTzwA7b3ȪfuFLx:}8py{<Q@Pl9)Z36tSul'#+OY\9FI9r٫\`mGKRz7&e\HPws3w8xpa=|Y/`U%9%0"ݑ3$?}q͘&}ݤIDWL # =qnhׁFSڜ!),߷T"z᠓ ^i'3e cgѳ?gѽ-{г0W7q0Ԥ"krI=Qdra}UC}\?^5Q;43v?A( $U=,..J)$ټ 3-0(gbVrMkRmeQ$Fqj~W))FH=ӦH bukez~xH;ga˲/]_%b^ju#SjB0$Gx.k<8+riyrP {toTn Hףнm"V.%" VՈe)'u~n3r+ Rta}`e㭷K*̇z?GA54JBx`J"[ *(=g=NHtx*7ĐyM9[u֋&-b,/$8OP{_.p4kcU~Wпk6IXY? V4ǂH%t^4堄YSJWi3zF T|-eßE[夥Rʹn b~Rkn^(ݲ z_.ŧ /F]n?yn80΅!CkwG%Ъ(!9jxzS0r0#л@,"(sK ҋ.m)D61+c5ePu1Q`yM$EQP[Av{2j>tO!cj.4e٫%K kHpuT2y{z\՚_ wEʜbPúq9f!`A|Dyj&" B͟0u(nr Qh\~fܺAɢ"738r+ݘ/ÞN6f1à1Tvf_Ͽw}u5Ջmsz=\F!/DyK=qvg3Xg>f߸ ҽϞTђ!qR2tm&*"]vtWy ^BU oﰉLSI;\ .:/Y-Ig7ta0SPF1$X< <}rT H"NԤ'ET$"Abvf /Bmey$RR*~\^RMTiFs˽'qN_#D0"6!_ ˣ@-$FyVpw?5nWBD^x}HbwOqTGfgK*]vPhm!5ugQa+\"Gǯ?#aE?PWBgs?Іm9ͩag1B':@ C`Kg(`pxBzlgp 0JS 2'p1w8jTԭƆi5:$5{QĴP&c4^ ˡ˛ݰz[lqPkVf7N-OB.96C^^LjyMV#QXU XQzvؚ`'LB蒙YDÂ_S = Є=uR ?_/%k0<0b=^ .` ~Ǎw!ISII U64iX *7>$ tF0˷|0_^]ؾ.Ԇ;YK %!آ~I۠[;"/ X9DbsGD)g;v9A"ŤGAC.p63q417q,e_}3ae PD'N,?#|bߣH"ʮm( vǫb4!GJU*O]xd"/l>&,侼nl,-t{C!2 >>Q[a-r[XZVÌTA'ǣq[V}At7}`NW@Ǧ&Q3F){VG &q9oIzK"p "oEǕ2itrb{{Q:r]GDu9CsoEyYfhf@jI"2,5B߮N%f& (0oơ X'L `4r P,u{M¿onnI?3эєZ^HRfn; lSZP(ZnOŋ :)a6C]n}S,ȕ>%ZRT]f #Dު pM{KBI}CMsey6Hq`Htew &O*|猃;yp@&wfӿx-_vvM{ѡ/Lˊi=NN`ۍ)tD:W% 瀂Ğ/꫱t72[_U+(€_ۈFC]GQAɁv W< v61p4qo5)m̅܊l62Jfvf"B,M(_~ z0[tU(%\-(Yع(yYعٹؙ(99Y8Y99ع)0nj=[; zyyxq8Zqrp0C`vqt7fvt#%] Q$]LPz8BEş_,,~,auNN?bfL)!AImhrEEYG7wG3 YIa0s)nvqn>q>qNvv).qiiI)q1vqv6N)Nf?x+q)/Lq[xZK:9P~-yA6f .?luPԓ'~UT`|i-=͌~\i_˞Z]1y4VvNZ}`&/[!r 3kp=D(ݵ m+rxko!3u%t=aXI N-"Y͇!CV JOPkDtGOY {]>k5mZ`ft$gօLXp6CrJ -c㉞6B6^h `j|cm1lC@ xHF[ Pyi0;nH ƈr؏vKˬMSJOӚ"T0be:D0~BoOPf9v K(_~îT3;hmn(Ņ6) .=abV)Flϳ΂h$.O\lBʭxABL|~cll;=oeiл, l_8,G}Ͽ>=fFOwM ku|ǴQ?U/֯{k#j1vA#sG_bdÀokiG?(O :o>W5N 但 4'{JUڄ x-MEY|賉0*YUQG3MEsZn6rwS>(a#Q/𺸺o_υ%GPwDR_@GNH4 EuѺ ++h]eFw *Z7FR¼}/[R; ot{0je~ckm`!۟.~XzF+6[V4e}KW+ ]Rvo[%E{Oa?n:<=W'*.@d3,.7/K7x%豲L 3C_Ϥpj_(RzD-@DnrK$0pvrp62. _Ot &L, `T'f$4+ݯy޽ ?4`UYse"w۽"0777vu f7o><8SCY䫭c6*ho?A̝W VmxH)G- (h{!B幩7!_4ЩӮU>($FP,o#7M+&O>Ii4a1{ZZ м8 7={nllGл||]~Fmgᄶэ6/;\bCʹI =;ab3nn>yD$ FQGRyןUo*]n}9* ;RG>'UÑDwhm=t>E#!1qYYYG(eeHoB)H,b\f&4,S D>>K9#h  d{3H&4& pVg16WD*SZARںw،/ zBFprravzhcWx< 8nܖ좎U=29 ϩo[]|8](.kza삁gZ1ǭȹhWOLC2ѫ;\OJ[=FS#Lr3 CsJ呩V#]]ݣZDk'F/8l,P ;xaPY;?A$R'^koj5Oojd{Qx)Xav[ՙem.!kpwwwww k @p!8C:iznݪ;rl.7+|ǶGտLaQ0D"?:m+LLq2jU"lbccz R~ Kn }*a^9꙾d vB)H|GX_ _x?E? ,e?o^[xlJ{)%(a0gӷwdhu8$E Έ8bK( t.ŋ̣bNY oQ}qb@>lgW컭_|{m C?Gbk~9i= e2~-O_" *E# Ď/_=wнqsdn`lghm`>~g}6@>9a! w?ЄG+066kM %]%{i݊ "l$dB[XO\>dh \j28r{}ùW O}*0jkgLOO0ʰruk· ƕ#=R֩KoѨneCGRBeʎP_UUŐ!yhlbu\bľ\R;Q?K`̶aj=UyfʾUi4W4 MMMUQDTLoziy*4{Y5e "tXÜQAB~L~Bc^_d蕈6JFy/ip }ԌZ֧[ytS,[;TTDt1W$[HI^>X+ JchbYk6vV[oi1^ Ky3!;)(:KM~}f$e\z:(0 U0n[";qB< +RKp믅LSE> xnyĮAb&:) pҖsZ(-7@ODZ <`q7P-K{z4o ȏpaJX|RLGmE2bZ?Amdwh^|98 %% @ȁzt?R);x:'׾nꄞȊ :m: 4iYE-Vw_6iGtL<62ϟ2z_7jX,h},l%%UW8w~Y~@ ڲK%dR3r=c)!&6vznΏC(:Y> ;#+gj=H:o0#CqB"3Jae3؀x:獪)mloK\x-$kE`X򁏃JKq z3w/7/`> 8==;=h]t Ύ @ejB锤 BӃ)i{-k5 (k@` xHߛA\{p>_/~c>(c? y_@MK?=P+& 2Q!hBa>[( `:qXGuEF@;_ w2@W#|?YN|m6`Hl"FhGInITDpm*gJ!S6A$![p/$-V+C8lp-H=Ưs٭M?[(&_t/tYe;jg"P\ S/IHGMO*lvD8wª%}:yGXn1TfXLYٟj Հ+c犦C+Phv'U7A\ޛhkkˈ y&;gQYUAhѢ.D6)yݳޢvY=a d 5mc97OOIEPH/-lNRJtY6Ɵy%;(qw‰6rN̉p= GxpjG/뙇Z^w|Y <* }/=x)ψuP$W_u.07gbÏgv]<̠(4),)`,M4qlaz=_"6&N)\?'N8&Zuz? ץ(kY-Oc u)wݙ!~;ZbbPI讑A}_ KV~c?篼<ЬS:7ZJ࢟H}^jvKc G 9lU^`J |',$q%UtK']OwGW1{W]zѣ)Fw9 q*N8;| z 0Dxo|,1!3H1Oua ^JN\eĿI8V MID @JK}LF!M&r+|pF>&zH jI8'Y4R z?~E,H;[lqFS{ Wf\YH.twA;~_nx+}~8ˈJ ?b2L4s1v>(QDTIv &[`kK릅M_kp FCQ1R:S_h09m_̥c?3)Iv,EdH[^zO 3 x_}&Ӄ} ԭgUΊ||ͳWA.  [~,[Ѕvc᧬ F;t}D#SIF#9~jQ \ClՏ/"x^ߒFK mIV A1̚[6h[%_K Н3WTF5ՊVm>s,,4j pdI27ڦ9![Y2IL0Ɖ&jT-7r/7X83lZX2Ps[G ,hD0X! "/ 9[&٧llOƙ2 )m0 SuC*F"MMf2lRd2'ηO%?I$.:էא-oM!Li<U_kqOȲ|- zTU>"0!B-3,&߾wn^|¥ ZvEVU sc|ɖʩA rbmko͹W|>;ztw8ȶ\%j;v7BŤy+8VBf+gTGɧ#=MZ93?Aiicmoo;LYCzKߡK+7׎@ovw[ Lw/8]aŚ=#Ըҷ'98›=yokyq!}Dul^Βfd0l<3`aa{'8r&^>1Ce ؽffhhHbD~ B@pxcKFgwWKмB"Ajps6ʎ #[SwɅ攌0F*G$ys:,D jO@FbZڼfiO?< /~*Lg= ӲP\F@#!ຶ,-/uuΧ`[¦R}[eǵKx~gYgٞ#c.孙{2vÊ ů_" :#Dqq\1M_S;Bjn^#WsTar%Jռ"H,6&&e#abgt-3X $FZhZt*>+f8_Z7aI: {>&=tL} ST' ~D7o #rdU^@DZa\J@"18zC &,}<;;ʭeT+bnB4&hFW1P*'C~}0Z>|kMB79ȱ{kFgބIt"OgcUçp*!||hz3" &t1OB4@+O"GC'ty< 5`dvȇ(+( Pe Qt!;"uѲQISwDK' #5=VqLvM:G3xֽƲ/28i$9%O5]4zGjMoyGGFYڄ 9&SHJ~HLzxkb8;v{gY̑pȯ#AM]Ա(=%I2D)a ܘۤ޽z<='> ?Lr74|T:0q=k]œesln 숔a>.c9oI* %m@*cz=BKW'5@$i| `?~LB'}4WR&5X \a6c{V=Y ); ^b纕fؒF"|b+<1a/-_$zI^orwE" Ȉ),bF |6(3ݸ;3YJH "OezGF*5сiIOZa/4[{: Z&w6EFT㒨l@vtETf, 0ߨ`]zv~,/yjM=;;$IvEa\EC V@fkؔB&*b`?GSV@d?;wzQ)@?Nii0Hz{8sS=}M&p<-ViœUTR)֢tDoS`LQ} 8唒끱 2z`_Ug0R"gKɛUំ#0QQPjeҤW(NXj=GMI%zC|1F$%T/u&y,/FjsBrPLE&752bu;,s`IDTDdUys9GJCa8uC=1٪XFtuʕlڏMS뫂\nun@y+#^>CLc >;5}X\T;ȇ %Qs(F=@W&_pkJ*i%՟3Wɞd#o|{^?6X c U[vWf eu6;~;'|ǧOf wuonWCȁ@`9Ҡq ˥ZHߒdܸ,' ~;+MB=kvL)B/DfsԸ)'1?e3zU~DC^\?sk =zX ?=T-u[8KSe V@5NDE\%|CfC-D/w@q/!WV44YA Kف#qE:zz"#" meq.vT6ehaȮ ]KWX`͎z!MaX < 9cOjUkHV!oҰ hP WGvnC+k?K:lK@kl,].2V lƭa_|jy mk6p (!/gA-!+=2rT0Չ\Z LeARHT;|ݡ᱈o!Hw&eP\"J68O DkNYs#ډ:CP#ފxe1:!^}IjKF;wNf]ԗn2h*}ĥfhÞ{Y7&.υ^Xc` %P|lg")+ T7F}q)4rvcl((o^;KWfAr@O"* 0IZeKWmLvFm'R|uU4TzMH^&Yޣ<౥M ׈ڙ[$qƵ2?ߩkby[EOnio}ehWEm3p=ۿ|ލ>ֿYWS+h~ or;'XI{7(%TQ/j b \go;!aӞwև_Xbpte xA|B CX,}!;H`(:+?ӄسҗ{?L2U8:C Iכ`Ip^o2^0ͪ2csGOSWC>aMl`6^^hަ+(RUqJcR3|K)7p ;dwlmllm:@[Fz&j~!fHuPw>6x_TPp%/~8u*%A>fWG| Hy|>#~Rch?XEv0,=D<0T,<Pq˧硚]bU-g%y 3 8h>eڐmUivm~ݱO NOƯݜ&LVstgsw۷ a^2xٴNQݎ̟གྷ_ [ <>/59_h2x4O0-M~튲3{KpgTYf4⇽ 1''B|*G a+HmJ"–(cnbhLHǬ- _ MSOZXގ˗A 4w&3*Vf%e^;d~ksz5;3.=# cP 9g"lOigSmoe` sn]_ܧHYJ%86FB:RRψjNy 'nhgx&`8mCd)m./'+({4zRD5LaK/%|pY_O|5혝Rn\[uX{B\};1h@q5Q}s%ў 6@ߊ5tzGyߡ>Q5]ߑbj Kx"*+VͿ" dh"|\2-lDUA\H'P97+pfvKrMtF#2$K8+x:{>:MH j!6x&DB|0wm媊18$Ύgإ Z\=cRÓ⌘6vXQ%IWiK%E\ceD%Pp(\Н zE9Gzcd3d<ߍT Zfצ1#X[*UL֒Pc?]PǚP}Nl?j-SV{nm1jA81ê7t_!='YLo p3(3"O,U\}Eyoi{7w=ȍ<I kBe8K%is%]QKE:!ħYmiAV?T?!}igv:,ۻӼQQTW!,i5 BW o4AB,+W\#E" G{r.+@ Fl4ԢwF yUW+bK$I_ ğfeٶrnNY+H}X#8=1Ev]xycM2PUb$Y|R4X!̕flϢwwq+dR!Juk0R^>=17Ky3rb66V-;jG ߓ_*`J#Lbcvw7!hǟI}/)ei+Fi)W"/f߀#&ӄ)sMپ?AsqS%1bˣ[D./P= %"Vyl{:zR*1ǣa-;N}^azwU7`H%ͨ|L*$FcLmzS8y@0j^ݛ 8tdKV=UZK#W~b4 x .X.Jʝ#Sɻ/3]l> Dgn73_f}vwoKsmeLB0yWc֝ÜǎVM IG۽mz%m4ṡ_V=9i[t$Iw;nOHweL"N"flj:٭ 5h۟DEv?Rx^u.4Q7mn¡R Ҙ;`{MSm/;eo.Kd0D|~ %qz%O*l;mk2ֹvtu ,;;#co "{Mp5' m>R*H_08T79+' V5Wt42Y/wEmyyť6nNWzEַTpso(n5G7g*PB!__`e!$h(G €91yxu3M4 8}o'utFEj k] ~[n.k K (:e σ=y?uETV~_ܙn‡Ev,q2l -k ㅽ% rA_i3^5½8 B5* bZB}>gT}zFZDL²qLnT*߽] 1kƮCv"9J$2 Gr.wsܦ;v_z%̿6nq$~p:腌?Lf]Hߞ`$D\[!X>Rnc~^Ƨyq+du:]+uEZ!!WaQNtrd9s(VHa+% c­ Y{!(.4 Cv쿷A(DAuK$Tj75nTpP2098{p.{gLZBY_k{cSn$3D#eCBVjQJY/V~|Wؼt$Eô{Rkp+T(n|VXxv:]}KI=J./ zzQ_x'mz?K4NjזWm: Vu[2}o '_I`g"-ո}~T}64Twcq[}Zq~?zwaw05a4iR)GAgG3kLcVXT2OyQv{Ά2Cn~GmHNC-g.;ϑDٗPX|-ԃ-z48ѱEa(Ǥ).F>¼ͷs07esYQ;BiJXE1l|-e.=V޷#4) ˽Yp.E:**m#"ö9Ue!A/E,I*9[B 3/i bHY _Ͱh]JZ:Hʻ~/)3Su~_OZ&yZ4EןlXץV>&\(%x>}}t:4p9u Fk񓥲A]I]/WGc^fǾ"+n_DcUHY귯 15 wBx;!u2iK nR?MPUOث8PgKR)*hXOhB9;HWOLf$S\#5T < [qJjinAGb|YnQQSy:,D-rsL 'P3kG 1b VNw ,Q7U}sSЪ O݇?VeS%iHE,ܮF~ j_`L5L{ +prQBAˣ՗Tw} d/鶗L<\G^(_@ẗBP"'GnXaPb$Gv a-ZEBQnAK:%DBRSP@..)Ϡ)<{{==ٳgu}T;U4KMC߸0Uu^(r/q!I+Ղk4`F|1H0e34F+< k0+ֽRK7xܧt*HqjúywwV!JqY' $w++O>ai)b׸iݨ{@-jq/QFܫf?JL4.qK0ԶZ@d&뽨&ݷ:l¦.᳅6'ӽxNs/3`4٨ViCݢIgJnQ-DZl\:\ع-u~K8[:9aRI+qmdלtLs,"zb4[tt6-6U_5sZݬ Yʋ/ƞ6~q!l`qwKC s/=!,/7S%(^ މӏ;o).sT>A,D޳٦m VxeI?8Ꮻ4Ǵ`ػxO;d WjkcuP*a*JC7#qd*Ža4&>>wq1{&%mc #Tɫg_,w+@y|qm&Sao-@~mfS7- J=69s~ f(7%eUcNhzGfhS|f})!2eS  ^ho99PP:8p J) YqKircQ]Xh.\% l7tnw6Оucx-o.8Yd=s84ձlmZLP C-5\Wd!{ $z}J-s=;8|5[YJtQD^tAQOK^CWsv} {+BZJ5,e/ {ns!DC5_ynJHSqs66hDUb!C_=IvYyFZy씿'. B"kO݈@>[ѳn)G#b*~b»vd=]g9F|h"%:KDSay6GT=JX\x|),HG.|!6ABBHүٮ;_%$!c IHxN5ĉ~CtRM!K#?D#5b׫DǪQمިH֓v\O8{ۈa9F0ՋC\٤*]Kҧa SynD2 qބS٭1*f6&S%cXݑt1XMEX򏚷<(>j̑b 5B-tʿ-'I|t?Ga,U ^99^/״k,j4%c*WT"ȯHT Z  y!ATj?$,Y@&wF9=0z :m̂*5Bj)JObjR*qYU'VuP,Zy/$73CO؈oAP8=~:[GͲC fa rHALo{Mӟ4l:+8 @ʅK[I71/jܡ@sM0 hSŶd޴ۇI"X<47w5j~7IqE2kApQS\\3N;)TRrZHV(S-WD̀ jF0AqQJI̤x*V<8Za9s)gJ+*m=Cg3UnYĦ38^~:|s㐉e.}nBhhy9_faGO n0޾r s<Ʋ~nռ$/TS) 4+ˌ eɘ?oV+oP5@O.CPTcVY8&V Q<OK+=;*N?f~~ L&Tॿ?$tpؚC3I/oLGLҢ$V/??&N&j /wKJIwkʢLuB` Bɾ1o)b͠j-ڈ%<[Q X8=/3p S&<vT_Q3ԎÊOH,"[gSw2 mWQSp'Is;V 떙гJF:bȩI8-F7uTԕ0+z[J(Q.yڲ -D3y=zwC^&u'pj3ԉ+`ɽeʬ`x,Ɏ ɂH {xf;y t[Scs{l,lxLM½EK^dk@uGm=޶D\0wB>l&1L[F C6Qg^.)ar~}7'^oy;*=P 6Jmܶ&7Iwp[ C9hZ+V=(Z0<;4ao ѵ'+o ;G{%gA "{4˔S舝pK"x)r '~r0TDߊkЇzʏk<m6b(tdczŠ<"^xPpZyߘiRr!QkE+ONdYذϤE2'h=6&Ar:d1m,`z%gj(5G{C%l21q%,Ȃ1.Ű݆pÕ\YAZ1ٔa)}JF&TFQZWV[͋CT mNGM (ٕ/sYcTQŹYcu[||@{g_ kW=?ۻeX 25=A_3 cP,*#0o˅!$;WaD,Y^q9VtKt^3KZpIׅݟ4+FGȉsaaZlг,čLAW^6{ y@U8W-KL1*gMG!~ EJO\:KcL ۜ,F Jq?PPC |M,)_@n#SKo_nJu! j] b*@AMoRN Rx͏\}  t#]nG!ɇ*-D^U80o$ǢgL& Ĝt5n~NԷ!9hRaJlVX\'8D3ާw,~5Z I4]GOLAx @gѡ |HW]V P<o/XR(6<#bh߶ ˋ>C9:o z_EDy{ŚIIKvfT-ߩт9vQ;UuoE>TTp0Y&:)ƹtRtH@B$bqq4Ciu p酁r0v={z!!'fĿ.H9f% %p "J#WRä(í!Pؾ1<B!G46@Q2~qJӢ*<* k&ج\믲R8+"߯4i _:i+dK.@K޸5E'_B8i%3{ď@鱘faA[H^@#kGo*vh8&! Ͽa LBReD.jܺ/|3=+aHYj)ot[viW'20{KHxPREi)azH7OEU:fX&s r=3.T_!<+鬈T8fp^eݠ{Yiձ`͜5a57Aj`4dyeK*'q$q-V PQCɵA!VT3s%YQV,yxN8=tCW5S+^_ 5c C0k|(]acObވ6U*GK?)E ^;] O &j~sBڨ47\+j|dő |{VbC2PIADyim)$I|#5[ =v3wi{)UG10,9?v1cb" Y`V,1IF=xG*Uzsޗf[D YE׃{ P vczv;2Av^A7xo a/uFrt+ɴN/$K>4"b!74cwvatc  ؽ |$[۱XXb,; R(.Gg7dFݠƹ߉쏒_}:Ȟ̰˄j^xE$J`&a / >x$kyC_M-qŠn%rdꊁgex}Q42Q4K{vwz7(%׏~u6p%Ϥ|̿KM|]6֓pq[}r\AmFhD+̃Jx豅ʩѡ-.UsԳd}7hU#CaUJ6L݂=ʞFΓZ\yd1A2tF$dJ)?T4`Ի4%39qa>Y}УOyCu7p8DըqşpBOztx=$[sRw,sLdmbz"wEIf20HJ`C] ܈҄ڌւށхٍՃӇ?7|\Ƃ?rA8VI4K^ݟ!1VWgdc.wF^N%:UX3=(ToN|M&&Q_ >e[3mo*a'J/ܱŇP nGkbŀBaQ$Ax 3r&+b^盕F@> 3D'/C-RqrH^N<]uM/Ir/1fT`DrMO aCB˲8D"˘C#vIF6R/^;Cu Z vg5h~W-)kPK_=]~EZ#C(AVJ{`PmS9Pޘ7PJJI ,CPL>PÅXwgZ{ܱrx]Pn=$-}o̕_8`cGZ1䓋R(-iT+*4DTv ܶ{@4(x#ug^.* NU%MOp; 3:#Ѩ#: +8uywnIgM kiF{?ybj[D%MsFuޣ@ܸa+tu5yC TafhJ>L)BC ǖVtGds=tF-wBOiRM 5͙ͅHx2ROKD1Wjk$VWO{{b N;Qmex<.ÊtٙU̶5*YSOEWe>I\$栙f\Ǖz7pjCP~ʘd$s.X@4\-j~^t'0 XCCtXZIF m=*M'sdݔwzDTUdOcG:^UJ{}ў66׎ z-&>MUURJGFbz7Ef&NA_d)-wun=ϖCv zP5|kq[$!'ހYK\ؒx kG@?KZP IKV WLZU#\"Co1$T,^Q+Nr3A(77d𻋁y"ϡ[]Ӎހs?=}j^GOǫ9VءM?"1`%cEw|tB-;` )1t,gntdC'lq1;#=4shl)0n[iN{o51؜p9ʰcح5T0"H{ ?}&dkAdfLr |\JAc k~(B.e@Cpܒ8'իsΥ7;+/kn;1XW9Zed{] X8 Myr#\FMg+`{X;ZGb][ 0[ޓ%5nQwDCo#y ]3^! V>y|2/t0ү [ÀdP$a{Lʍy(LFE52:50^e W\qldkD84 9g.E h~]7(~J5?] tQ^mCP`s1V xx}Wy_ dX_ It]Ƹ_گh2U]7YTzI4,I HJ`ܿ.5:??Vؘ#ITI$ Wpն[*caR0]44 }X{ԥ ё&^꜓N!OTѣ=xcM&K9ԸN 솕lBIKjD [0B_XuL9pqv~6wwV }h}3 a(3aRKۂ'ārEVC[by3jiyE|.k;nܺSs6%mG%CY_~\8R%7{uL]KA% 䩠}VyECWC9ܛn1avoZK{`|A598 \z.,א[ _d kEwZMĿ̀qW޺pbnՄkGl4lNJw9V; ..%i)gݿq4@$&$Dv31$ņbK$F?)踷yϫ87FDD%,sT4-KKU8eTQQF QZZ:qhɅjvq?8CbCfΩk ,d)݀'Ap ͸KG}*Y~ZJDʠgiwosNٷn# 4dYmUɲr;$vGQ,SK(p5`{dmj K!w+С$*]8rӋU6g"y{bDam&S2 f78yn $ _9}<~*g| E}',ȇd49= \xob^^A^jl^~ֳWvPg'qΗ(tWH6R~#+ 4B aKbQZdA( Y5$eT0?n` dɹɟ C;Hz~g7pYz2_#sWFSOh3<;H~BwkFI^ 2ߪaM3HVư7uWS UhFV0F<͌]vw{D;DF*.AsL>U96xtnjcVLGwdmwhpUnv{oC0^x/du-ɞ#Zb7=6gEjQw ZK_ xt"E|)M-|/'Kx6&]>А@sq8'ܲa?F 1^]!imoƺBݸ鲟a(-,2/@JB">f,2H/<Ֆh9Ur fNª)[R沱c2nSfNJi;K=9g]s$}uQ_ȅhdXg&$/Uܢ5Pv[;3Fʀ{tJkJwSGVU(LQE/NpI'ȧe4FXWv&gϟ17}u[Oι6om#"!r&}n<5qaEBPӽG'.ɜTM`dbT7Y%P5$#E*0u7h_h-?OSEMu5~'`NB~Ţ!A?0fҀd ܕ`JRU.;P`nMO1#=~C UQ8)sʦ{4+NfMZ!a`9ݏwAEzo<64O_8,*#I62{exD|Ǎnz&jH`|{ޢ5XRlY@>]Md(Hxh>YTSVM'Z>4Ky |D=?rpu|"=t: 5uqD*dcL86ކ7V k<@BSʃrRY؂&aU)5G0ci~qGWXKa*(dlF^]>LiAIix͡7d[ӱ3ءX&c >'4KbJZ9,{ov*cf|sH3pMޤց$oS11s MXD&5_[=g$^9y2Ed^_2jK8pԽ9DPι QI^\x[ѪƔEs|LP^;eƏi?}y2{ D#yczk~CiTK%tt_҃ yLu0"t\3GG5#SlAcdʼn3,/3.`U y=3Os!ԘTCnj*͓[t &u뷙(] 6X `]LǬl6rϛ$). @ʗńTuw͗`syx<L:~eӉ8ۄ,]_eLп}@ǟ 4hm xG"A E0Z}%WFfSBLl yEXFUB&:f 2׫S_`4~C76 X5xr:D'͙m_ro|)͗tY֣UfN%9ݚϙ[<˔K"1=۞BiW<;9HOdtu3UDg&tX,3tj9r8-9P@% /Jگkru]~LG?Q ENV?X$LQdo7w?Lj% wLw %S2KFolJh'?+̰UwQq/퀺%Z&MgӔTAxW]9os5602 K7 rx~7dHA]5d1A7 `15Г XΚt3xEIȻv'v4rD24a'J,AY=C4bo<6ʉ|Shyq T?V87۞lr M "6}k)VnPn|ǢGj;7@}YmX`aAP f1(5 W}4vDTx$ \蚶|xG~u)[[/Π6a@P8 |'XP83G/EvDD4ݣ)a5"}MiA.QP7{| )ϱe]"QaMY eGl`h=r'2{؁t4|: ~u߾u^CLj%ӥSV.yifdIe?is8E~0Mey1?~7㳔a*&:str{inDwΖ7j\R1S=DǤ9rpqv[tMwMOȌX:[s~Y2>y5 `?\?όun;H{Xj捌 {y𲙤ZAc~ժ >nJ=]2pǒ}`_ML|`m͕T_wybXQ~gO5w0{u\6`4=tL\BGii|V-/Zm ҧ{ÔpIԂ-S--5&0[Nʇ Z M_ዕKnyj[5FYM{ϟd#uB*gÈJ:?Gg ip??iy{?W]ҟoױu˞cm~O?3ZC$YowI{K H\RY " _CmY!M3`4x"p0@':T@q$1񛻗MDz4UL"F^}  -s<"]N\YH4}6nSͩoSk{34QЅ.x;F青4;S&鵜:4 3pE nu|?}nY:GjP 9h+2^B>u)z7zwwɐnqI]tz3E92Utg⤧9/mvdMu%ZXOM{2N)5uTW40/تtfv<3<4:O>57r703d6*ClRk*WWu(|!/Aʺ=sU[d!>€_4߾ߤ/!v`n)dw M % C~  \*iOo헳~a|v1¢_XFnI5}՗z9:{sxp0ddu녚j@NSO^ 5[<:;bɧbeJCga$|M gh^͙0 G )`jP_<)0'y(2R!E6Z !pk>wX{cp@H`lP=&/雁Ҥ@~Uʤm':M#}z8(46oPưsS 8^BCsd_gC_ w@yz.!:M^7͊ [KdZ&kva.k6Vμ Ok]T8%ɣ`rxI=Rm$Gv:v>m %g#ez4$y[)BKLX*4Nh_f?4$[gT:$DCd1h*K#꺽],f5>ä:1Gm--׎77mTЭ8kŽfX$]pLVHKTҫ1ѕCxS)œ 7NlguHjr) hN2in{/ֿxyIoWYOIШ=kJC5 \~)?(peMAЉ{c0 b9'*}~$  (Dx1)J aT`B:?D!ߜ 6/Wm3Br)_y} PYg6Nj|_%ƪȳ^yS~q8D֯t&-戞'\N [RVsN6_|MSbl@+28heh|گ8F?,)Fl,#ސ;ZpIJXyЫl\̘c P0QX۲.:qww![{ % ܝKW޻ك=mFت> 8'i^-b x:F@@Xq gRQyQ`:56!Y^`!tfO0RiQ5 \E>r=yKgN1?A.xouK'PLr D_gToBkw_|?t%~ĝ ^?C=D_n֩1ĥOki/!l.p{TpoBAYkg078Kݲyv{晡/)\R)*LJx?*&(9H,qh]{A`)hM23AxJR&{~%xvZ^|tZ5JccjW;#cgx7 :+5탌q]Q@S7g%d <fz ӃF􋾌{.W}_7}_w*|HmU`>>hPEݫ Y/=d jV1M$\m8ަG2L+s9AG;ж=f̋έXSBU՜b ǤuS~* :|jzP;}.) 0SyyFڏ`*A=qޅی<+롲TUww®W㕎%VSP ZGy !*Y{{ Bi8QaUdѷc7`b4&kqT`:x}]m2u081w~GY7D* k9pÕ i-()IQ\w,oiȢdtk*= &ur_hC :G߀.۝>!xm~0-3By3h^ O* xhFT"_WE>ٳK"I/_wRΕ6F/m0;W##­ G<)Irks`B]sbl$)* k=Zg <%O\yuE=51oȝXA[?Wb-6,ɥ/Y8a"x| 2ouc:uoSSw#!'oe^T^=<"–ኩVނ _]lsuĉ6Q.{r|F%l- I|N`{sq1{ȚE`ImUBM{*^[%b;spC{DȉvṱN)6wGQ0)šTy*M`iжCO;=}iP:u_xܯM9X2|boS\u>};^ou_}nQP x)̛RE~?)Dp|_"KiR At8ÜkGc[FEڸ ~~t{Q&QWi٧C\-+0D$Z t'7a6i\#ъ=n%+ JC(e9e'-k5.Ta~t ''3襵RvLfUxhơe49Fq]v*Y Y͔(DvE,~0uК2d&YܫHI_$ue$1-^6vg _#ڨe,ەa{+Id(eaܳvS-~axhgXސM^㴮_Ę ![<]ڷSD`{<ʛzKWAD=Dws211( M7@ܪacclYUG*Q."Cä H{mpnQ*^`h^k(:!}@F#(9cU *E'Kuv01憖Nf7_aD. ύD%/Oq ;ߦő` 'Yy),R\>mZrG6&c[oze5JoK!rT4+&!I!t@v衷UxRZRs}͓p)݁ODQ@CT}@ "WOR^zO;F_} Vdo{@B}·Q:d£z3neUcg'Ml%))*Ozi+_qo |Hp"DT) :xTe.oQ??!f/f@=NZo_^$@Cg&Ϡ} iE<'aknf.rp$P)-\JD(Ja&|?\jx'-/B#8(r.D1b^g8nsMBdM9RDhC*mqYksm#ѡA $тQg FKmݺN j Ey%84kfFֶVƿ"oڎwR?/ޮ~yH# *7F2SSן T6f+Gma( }g1X]ǒf4xF0%Z=lluLUK8)|7#K4^ %XqǽZ:S3=n+vYD8;Z0[| 5Éq3vRzL7:?8 /jM@N2˩Viwz/vef+w2m>t8pf "c+I稙0J~ hy_Ўo6]eoUZxϾ/|ߍdb)t!> bk~vpЗ[\,#,^]!+<ç8 (qUf6Gqh7)&?8@03Ԛ.$Mr7 '@J : Aa-W01#5d5^&w4*_Zjr69#qp֠zً!}Gbs쀃UGӺ"p|MQy}*tGgP! fҮ^GqWbdSILewFyax}܆#+k)]u`ogHXv]LfbOS ,;vtBiik~m|s 7wwL'˶.._6vVXIR sU:3jE)80/FP11Dw1EX5bINL!+MУFDB$]5è|5ZaѤ'dQTghieYFQ['jN.B28Yjz Ɣ~ab|;E`h$9<$U85)_PW7 +u6S"ㅒ80IBBFH2yhFyʡ5S4Յ,-"61aؑ@ǯ 3 Gvnsô=Kô. E犗vт BֈVg ]h p6גd'՚UQbeM#~յybʻ a}L҃xq׫Jz6r6(7Ғ;qϨe^6r2UE@_& $F@BGU ˥|IO0uAuphNp71=^HMf G&CˊH221-tGGcP 3P:@2Kpl&T ?B68sYtpAb-$^|{v%F 4[{!\4uSEi{RĚHacະp#S7:S=Sza6o[23޻ө#8V%5i9H NՉbTM-p:I=閣iMfKf GQ)3/Gg#!8g}{y5OWF{:/e\.c8|ayךϠiٰ**v4WoLԡ~ĻE؉\L gRmɯUWdᐾ^6u0752w17e,-7%lsJYm-0ol3ӯ;XY}_GG_훣rfz"̷Djy1ʞ[Jw7v}ۙͻJE]sR> w tgS&1߄קG#1(S γI/ㄵ]O;gK3l^WѠT ?^r^FrxgV:: g "e 'Zn`RK$# p"xt$<!pL 0)D qϨ{FBrsaq!c4Rb)WSPqŸ@|7!ߏayEnI) 0C6.Xa@fB&j!2*ڵUMԞBǔvrJ +Yt*n*P ȇzEk:iB&I\(eR4KQ%l̠m<&0PÀS~7Wdnc__7;m|zIFQ;˭o9 8v|it`&m$ic ;F#f/}hR掵(:x֤pq{@F 7sPv5<^ r]E^ڶhdO{-y+jIOف)w Dh G1hb4XY(N3V9TцYIVRYbX ՘U33(31_b21`VbNt 끫+CMTH/_PIEweC '7%ARiO@( Π!ba'e%K#E.I(4Qˌa &ɼYqb=OOI ݡ yTe FlBƎn%LU DT|"Q]W_0V[dVb4"̒)뱸:w}z9=/bwe~L%cO Y Ps5 --*B05%` 9}9Q[~S^HůTh۝ /IA}Ϻߞ=M:jJsxqrB=CvvA8t8]W'y-&0kG8P\;KsƉ[Ϡk>|X[t6^](-h٣}aOJ!L/|Bh:=d{,NwqP Pr^^/`ѳ(ai`qtmlAEZtQ}nRf*lD0_ ̘P 5z|չ},vbĉ,mAxx4S 8,q&D*x's ".0Sn]9"1OR!c_Z0:r<\VoۇzT+:/XkDZ0j.4V7- s) wz;Kspd'zpWp쎤*14 e4?JgfoRՄ~:5{w󀿿mwzI`V|ǶJED_8{zU+o (G;ccFMnngMjH!`e R>ǫ9<;&,~P7wAl!.ap0[ =5 y@:oK8纊0kp(z@[vc}V^oQly%02i:zzG`VHSӳ0 ": N @4M`^hwqqw>aŅ)^^) N5?nj!'&XkڇC:pڋzkY@pLÅysP(YZ҈ZD@{͛c:Qa6` :jo7ǐ}p}6DyInDB"0 7&XF;ʀVՖdxe1Bpf&C~0PdZJIVH ؁=rph!Hg+b)K!mc JGKIM3BN8†ֲ",:/2yR}aovM^z]'!SpVUGS/Q&&6U4{x"呚$!Mo4{}=[CX9!p/~ICOQ|DUVo#-g^ ܔlbq\M³pvҵw17wwl!?qS:Xj m{9\ՂN{ȾU4:x%G~ӿ( y|Ja-8)SY@dAMv@x^Ha3ŤjA'T"بb/rY`Hrt+.rP S!\${B%%H?@Γ~άO+XfkƄ3;;} /!3F/.,.\hKQoRkZSS')V Yq0pRiv KJ\(>9EI-yE8I_d٥.RwہS1?:DBi֙~#z[ ܑ"@N)I?$BlQ0]giD+WCGɵE]8s'iU= :X 'Wi|ߗ4P^==n 5ԵGDFy"$^y 7SwbҤC(q!˗MvRse{䊞hjg]HU.[7H_DBu=Θy`JHN_~9Zs7Ns O,e,լcU1yaC6N%87ze "}#vBR7 B9E7w;9cđ(׻&0$a?^w%+҇-?9{d,z<~G*__;؅y6axR[ AwK GJ˒u&JF=O%,:#z`fn>0Fm6G^7wqlvۅ&(8+VAܴJ7y>(s[xAՏ%}R/A\})ff/>lJ1wc]+2%)N8':XDe,&)+OaI O@aGP zƠ)}cYU\7@o`gLb*?mMiW9b%Gk GV짼CƓ\AY!#CڒzQUI0rCBX&`m3?pktkC "eaj0VOl/w[5dW̠L'HHk!|8GuBFφ4m5N%4NL.bnD̴dٳJØϾ4N'3&YTT1!pBmJ[1DUkExPFG@Ẏ.146sd zp~3i2G&RTolcgSC @f7 :JM*B]XӦR=L0܂d ~5 Gsg2hS?TscF vdQ&p hhr1{v4}1jK@#28mnE[.&YjC r I-hKfʇˍ%h6S{E_q,"VF&nQ]S5.jNU[-LjvA IܾI^طҡ]848zw:Z͏ALEZ+&zm 묕(zgV[,eA0ϩ5=>eA>2^V l_I.c%?Û |:S-8'ʓv#I4`p%zWE۹[`߬ A}iYR$B~r#]*% 9[CqZN:Oia8 +>RsT.gj: \SMm9XbTm%7-ӠFKTu\cH{;zP;H]*fUK8A0d # b`Hs1m*QǺkP `^M `T!944hnarͷͳǩ+ !L JGqSn xϗWvŴmmu_0]`ohknhk v7^؎yo^Mb/ϼ_H" 2Kx-fpa,EŠ6^M6)2Sٱ > 0kO '^>ϝ`p}깔c샴 dS#buPdy{@_T% ;;%p (>i-q]B # c##""$FuJB`  <!ck6F@+BiƦNlxWefbcd M,kL44=Y Ś7+nrww ly!c'jWpq/X'4ՙqZ<;aHi"bRdٙYg1j!1 vKJv%bmeBA*qD ~E~J YplX.@Yf^&{k Yŝ]b"*.ah_cSMG?;I\SnLzVƑS쓃[%#ߚ6o _a)`>rQs`k` 050&75V47r0~}7J:U*iЭ>1?  @if)0iF|p 4"}N YR}F8k  {ݳ~`B6jaqk91tS~OD۟0M}ГuHgyF}o>+NSAsFE<~iǘIMÀ#ljuCB|` ɁhA+FB+Anq4@>1 : "@lp IPq9ٓ%G3ce=` 2F% ."P/}¡5FÍ':nc[gwZ.~m)p4Ps_ ߅_Y0%oat~Dm+r_p a&yc?70~L!lGx7Z58+}+q; H_Z" q#vQRw pmXyu_?)Ec>$0 S](H>OB&Td`dTYE t-j1u*hKQ~HЀm*Rہ ʾ\?==͜KKJ˖[1!h=h;5}hh(㣎Y>f( )fgliqgPȆڱxKO_wHCLlзvz{;\jIxe_]z[eh^r+=,Bd%FR#]Q'ijipxOci5R~֩406qfuaG$mj.]upuջMX O/X3^#;N$z ۇĽKtŢ5NV|M-t4]G g;aεBa1fMղKQ*Qz|Cf4.%Tz Lgg''.\g}VK!吃Npڏ}?0V噅,5 X xa1f |!,vxW1{T-.>INj'#Դ2^)L k4`[h)̌j46\p2ɀ9Uzq4eb״v|ǎT4 ?`$K#]VY}ǽw0Fn[mu&++bKiQѾb7D:Ta[d,4$$l!Ι\hԓITѷ@S nnYcIE&ddmɻa#`Kh$Ѱ7#E O=_&zyDI$3_ZۺZmjX](3/|@.tɦr6umkΓt dUvOh"鱟NdDDD2܎i{WM~c%n2%,ٔZFk[+ﱥDJ1DSCU31òۙYкzpM\m>IVZm^aSrV46baIGCJ8ݠGH2ބ,ۨgcqhiY1k7 RXTTT!H#` fA1a&#S}/|؛FQXh^.wnꨢW\Q*YNY;_]%qO`033(iРsN?{y=o. Hۛз͵>OMBlwDIII 3`b21 NJ(*jH//fwڳ'{]qQ `">>믫YeKf~F) L(%=B7ɦ40 DSIчQ ()]<. SlFB^gmBAAg],Ѣz|)0o["p;\%G0m(JWJTh[v|d0Bm ! :HôDŽsʮ{8e{qI le*~bvs&?c4}.fwZ[A݁KXah HjπvzGݑ̵g"|S##ܶOG 22hЃJWe6G 쑖TŃf)wp] z4CYx\.Kmngx@3?XEDT_ b `31N^~}L|kwZLX{ױv~ºbI'PB^i~~/e1vm4'nkƀZd"a+P4i˄W-.w&'_$H(]xUh`3Z T$û/eˋcs5!3 M]ۮf`'+|BCw,'Rڱh(('?K9p-t_ˊL"gzN"uFDQ"3 M„f;AvٸbhTC]M6ų;ldUWm8\.0]U@@_~8>66&EMV8wnT(@G~~=`dwNN{Q͖RAO44-38?\O$}kPpJlllσI)6JQJu!3u\n@F.R"l}`6>>MM&v%M lplu99{,je]jggf \.!]J>q>1h/OC_VykF1N%OZc}ƯH;R\,fh}yVi8i\lgkuReP[w>zGl{;?ȸ^@RjA^dCv;UoI,Iơͤ;yyx.ITWXUUՁ[UGt̳ހ-Y Diax:#i2cB8bo:2?"*$o&&OSEr"%vƥhBG;ڀrEQ[)z6%Tجk0{c IZT!ޘtnV əG=u{f3`ϳ)Ma͑*_cJt.=Gʚ᷌Ceӣz֛,{Iss~d!ppj]'s>\3H?}|s(ׯBܫy꿫nv3}Slo C+K%_G2\:<TRB@Gh[XA8c͟EڔJYw?h&$f=S,HJgbr8\Hcm(lr WRQƖ*/#/-f[*.LFmd8>겟8S"e.@ƊAۉE2˥64J3 @ r:a梈vW!H~&K,pA-3G`-s N/?4ݻm<:];̞ǘ%A#Ey;g*wRbUrȧHur# ğ?Q64wyxDQ$#g&T* K_{gg+T6.lm@ҁ+|$ M]_4R`LПQP '`tUԋ_+}۫mXM8Rq0661260oa>S6J /pc-Xɏ"I)H, L)zȪ鬖^VU6}&  ٠>>zVL^f˗9#y3ѢɂVݧO7wdCLǬo! ^/'zP#x/yõE| > $ 9vbҎvvYR$ J#tJ9mQk}DkP$]vd%tЎ7ӾQOiѦbb"SnobKdjW #g8Gf,u-R/mq{QD4C|wa={{{IPZh> fs !A^>wt*Lk1O,qa~NL$.|C]N294CPZT︬wY2ٖY3pfgUu·=@к4C/sssбܥsvny.i58\rinJ[Iz8IVK=L4^yH@wY}Ҽ_r5$eKhfg nЭ2J.d<(&'&d% p;Xu)D\zY3\X`/%)sv 6(>>0x Ԏ˳Ud,tLJʜ8[r1_Wo%~:q.o<ɔ|WRL+1Z[?o'(zBGҙw? f5xѷq'OG(\Tw`0k,CUPƑaNfV0ɺy]Y[f2 o߇B`W,s/J}5\W 8y% s%l#Pp3~U{X6.HaC|O?IaT ^?腩ZtwO,GG~m}ӻL```Iam .zeٔ`"撆]ë%TPp3EJf!q59a"|$$$q κߐ5a8/=./kTZ[T47L[ZgffΜh ̐VHq櫤['m/ay L5ãN"hcS`0M8̦3ƾy/' K Bް(񛚚, `q5zTHxa ]pp({5 Ǎ"v@<15@/V\8L'*"zOGVzXJ[o?#$7* 3b0_QQh?ᣥbL@ ̑ \M.[gBYuqXrrWNRVZ5`Tl[jPksG[%51mA6B4_Bذz闶!>\kkҼpqw'K5]$ې=ݯ3YֆuY}޻첒x<ݎn?ZtJd,RHZٝ/C–Uy,VUU%^ݽNjjhXԘB\K4iQFdU;6O _%^8p003oABG u3cyKcos MK+ڟ?V\0u*{t7{Bd-MZX tD3Z 255*i/D`* p k;a`QBlp^d_یf Q)๜Ht^_lhG T!%E0ܶ1n$h>FDmlpf@$)9ɠXKf? LD\թLc[6,T/[N|w`Q/5S9 \k>#9XpMi#Q\H9髿umIa52w5K1Nc w=FΚ~% xu1jմӴ[>]B&Xf^ *)MS,"~&`k*Uͥ8[rx^쿥,/)anp j]t+Fܜ$%55A4h*ʖקּ3@oO*U&;|Ҽb^lFA>Dt4,IȌt1#5ȃ:FVYʧOϾZNsKM 7]u M2?u{l8~헨^q,숾QQ-8>X!7x. , R#jHR.E7O/1ϤLL[ S|YbbbD_%iį&[UHwj(%oe{>.dddnveV/h,/_,4:bGhθ5Ujުńa5 @J ҩkӨI__w̙>y>:z>#,tssXzZbnu>5"H$U_Gv;2t.厉w =!:I/;*l4EݙaфtcH7٬V.~4µzi+_t/S&sD"^K߰y}k-L2Vu咏? A`e XSS&QE,cbS33:.ģi@:EU>`tSdjdJ6-d>>U\'ǰֳ.^6R22f(㊾j1Hjic$W8{kOo^HsG ,j+CQ"utyIv%ѠʪC:vQN~hwRO?s4DGq8?R?.];*"y 4rZ=xtR5n"gƚNiwMBtumG]>9k'.їVm-P !MHNX}~?>GK6 }VYȄ|IkY}ƕݵﱏd šrz)7]|ы=ztn O|0/Rn VH)ޖ4g|fh<-HΆ@ y;Z4o"# 52qZC ڎ1- ΨnC>SDAR)+׍`Vÿ" xm<(9X (-9'mIZ u0ӻz% '?F)^=WPDz#D`xdž P=$ED$[Y(hg'~' 1LvK)xGo,5b ˗]ʘFqci9V'w L%emd3u򕱘=;VbR}0 JsHJ*'qjcSƒi{+}0es13 STͿ+&/x3iWO&3ļzẓlrb`m[ |BVyE-6_U0:穑w_=Q%aF`,PgQe?#LUl`Ƒ+Dx5!Ϛ?+vz^9%c\kQRm XߏPu㤱}yͱ^:>EHǷ sjUYCi7ۂX47=3Z>&fsmGQh4iƓCCZτ긴E)Q>ۃW[E08AjtC]# E:rDJ!Øm}~D`DbF4i_QBq$T@_ydݪP}:z%9VrmAx#6Lמ>e^i3 SQ_GPr@c9zٶp@OjMWP6v.ry5ho6{0hs Q ?:% Nhr:cɵ] R=͊( td%pAꝽYJ:>|X#~@B1pjdSbʶ,ADUC?Q?]Ezq\G$wN`~"eֆh7Uz1.բb Oc`=ӼLt/GkLV:aB-&NJ嵽"1MAo*:}}/Si=%xIJ6;-7uM8_!N=JdTWyXYpeO`h)"~AA;OOj\/3wir_دlOOKk jy>6xku$VCV;k$Dl8!!?)t$I5#wN;eeV?Bh9IQu>}9Η ]b 7qHfCtv垮+JmKgrV܄ϐu@Ee/5ߡ&r4%Z|B#VZ[Za3/ũY>2qIa8`n;d&rK/[&-\0I;EU=>J=+3F"@JECk{ H``DסdtD6籿#-ܨ߱\zs?րh`R2CLM~}BrM,i@6 =`u_tCC3\8q;ll gُ*Oó;~Ou6jlI>ʈË $,שfAXXPu~aCiaHia7xJEd %EhwёC(D7aX7HkHO ?Y^ GYDTlD](8Dy\^/;ӿH+:,'&N慹2]o kO_Gp6zch$KEMPh^إ$>zx?{GNh΢FS$ 47{>;5RßZwj9ɺ,E8/jP✩^fN婢A8M|-_?|_LZ_`hh8JLͨA.!KЁ|Crh!&]~@Fٶ[;IQuǧ^em}ּ~KKh&`QP~4Хj,~BcMN%^r:ڮ[ŠU ioq`2w8) qﲓicʋiV%Ɓ&;DoWH[ME$+e)ugQ#dmsxct6ryd\&j90~/#F,1 T Wt#xz_,X@ƄS/ x =)X-0vgi+I!_r(5p@#?\oc0-tAW㬣>yWs;o= dS5YE:)[/ǿ>PP?!zo,`ep  (y vќNO<YQ웇/zWo/Q#rj!In t6y:G;mpLs{)*cJ`I-V}/,YZ/:Q.>Ȅ!Gh﨩uOu^pMo-[۶۟5{"Rb$8mn6EWCY{CU?.r A vRaؿ"0;b7^~J*L_ ƖЗn_t;ƞgVX(JFey+JdARޛ1ٞkJ\z-m^%O]oA]R@r1 X 1me‡to{\̶y}emX z(eGShÍc6-jn՟BQnpM_sR?K fĎl|r\8IǦ^|ci'7!#Ks/sQF@0::L_sZ;uǏԘG겧!S˚7&ϟϪ􇎚aDpBܬw/2 ̕6Vd)@l("ZRe:AUG"è(e_@nm CpԎ!._MaG\N|O3=v?Q" 7]+~?:]?ؖU@-z0 z;XP]_zyYL!DT󷍬r.6D%MG:-X fo_(3d13S>kM*g~fI\AZy0$G+ﯗu8] Yk 8?Tȁ̀$8 \{iΆ 5 %93PSgQQ0 OeKr&(@^ o64X\*~|qP`Cm,NOh<$Do]H7/ 5;+;A[ = <36408 O;F4>nŀ!A7C=$_ rLʇ>v41 ٔ WUXC%XٍlqTeB S0:Qe6'V 1WK{W󿽞hz÷la$_7`"/ <(XjW՚úR:1xx2Xk=c9 p^=BWR"GxHq&5Vٹ G1fPS 9.Yǡ김ĝݒHQF__{gF_Pv]_7c6xYCl 3^H sCeS,b=hբpwDD% l]?젼?Ć)qSVs>94$7;_pwxxc1L =o|LgL:#h4"S2\;%70MEC]5sLG/LL"/m5(Q^w󔇔[DABfӠG2*p>#Lĝ)6]C'V_xAcGzI{󕗉Jm(Hݍp'  ۛWШ2t 9 ?VWJvjq #1Wf(G?_N9')Qs!Y0qcLz.n?Rf}Qa = Y1FP`LlKrz(]E:yZUH2Ywe`bG Åsq mLˆnݤ?]gcJ,1e1TH8๮q 8+T͐Ial)1qhdZtwD e(lmRdwh&\7Y R:U#:GKx,pכuahjG/GBBa% h>jpCE)L U؜`Fb#\O]\r +2yut}](ջNQsȺh9(yCk|s~f!CQ1l HOs!JSC1г243s0ұ3r2sNw?eO {!ʟ[i~_u6kB`%UMKE`R9y6xA^Īs'2%lc-zM>8J*8)$D;X(@BT124?Q/yHiZk2o6iۗ2)ӾGMUU|XʾF!I HQy "|GbaV՛ڴQwnICTb| QY#A6| H-XSi{&K(I{lxu@`dc@O;~i*>z: )$pEA^~g ј:Npuw}|kNOޥT` ȉz"I,;+9F}wG;|6Fz[ĸًw}CN,)H pOf򨟧E"ڲWwHBWpFfZ|gA# >nZTF]!bmzu< !v[>Is#5tLo͌dIמ,_C8rAŅ,W٘]ou͖QxeO>ˇZ߄ݭ- &umWRYTRz u kK9QvV{mń15WBi;DsvV"m˝򢩩ɍ\]|c]˩yr먼xL 9a:'xMY˧5މ%գĄ01"U}?t=WpUCx -\'neqIB -umt!jQH{ą+ F` 6p ||353*f@Ph1dǠҪZ g\_7I9DAk,~Y< m /I3ysT ؔ 5 kӺ)Pv@QiQ)V|B@yvpp4 Vie \_ߊMTH@$cxWA<\ u,- aYYv d}aώlϝDpo&6GCr*3W③H:qk>B3ND `+Ir^Y^ +haOv2]΁C,?֐6 ҶJx%TuN],]>NH|!;1\ lJMGeE_Ma Tu;Z7BzJ𛀁lSRZ[4Zd8;_&yғYi>7iׇ`w=6ա[?1&IM E0:.Q68)\Z `ޯɋxSc}0DQ'p X~z C6*sb{XS]ǔ9x5e6BW|)K+S ƹz!h1,3 q9]@>eً?)NQYXIX8jy]@H?t +IG']̵yfG02/q6MMj#8]B70&G[b~r<Ți)Z!$*o?[GvU%ؿvO-Sե'rVe3HHXC?!|Rl?cl(.e]{|ee5e'մؤ+#툧b=x&b&`wa[U(纘&t=BkA55_oprPgYNܰRq(a=hny5%zL߭\4;o> L{%N!epbT@ktm/aeHКc1{4}fM+~ô9HN a(dr18Ba]f -4u=ˁbPczȐx+"ڹn`* ֒g6n&&|kgfy /JęQjZ'Yo,[}RS`@ڜfD)}xP.-ڵ9EyݖżVV @LaF'|ed(D:ɁabyT+ Kykam#^= +c: 6$ɒ"8%Bgv:.[ˢ6}n tsgV9*l'Zeﻄ׃(ZIS6h9ִ0J@#bl4R PW=ڇls*\BPEm͖竔Zr-ՍJ5M-γ~΁9M6ҜG崷}I| k;$hxi6뱓yJj|NP6yēctugXDc+5GQ O&*|F{D[ $$$L2 R }n [Ly:0AJ1pB\\Ȕ|)QIQxĄi!Z 030!jfqDw;^_)٘~гJ~ʟsFHNHGxRx1w?][zY;m>π N*?YS_ 9p$1%RNi# Ay|ʼJ} `z/WX^q 38Pjt10 e&IF&`*cK8G\ϴ6DoM*<<ʿE;{R7*H"8H` T0H `BU7/l a֬<2+-탣?,EB &^:<TSݰkᜫ/mB:qqE]-&ztpJ^'1nmlwBy7⏪+uήSg 3/+X?f:d%2>,ltGrcfq \Z6?>A=tz |yqeF0dxE![mLj^@"ぶ;#;%p;%Q$n|Gnʢ#،ɢ B"EfUf'͂h,C9HvE |cH:H~W'ke??֗))c (#oCXփ0#*@Lð܈ݡCޫaOPOú[yS޲~v,|שx&< lFhc.qd3MonI,1Fh;j%kv4`]'\2{ Dw éLoXҍore?=l,1aHL!4AMlt zŊbvz.4O>U&mdC’r,h;SU]P5D3pROhQ*t{Ȟq߷j{/Hl{ ypEx]rb@fg6?9^9,3&N~8&dyAST8ġ%asLNIңb{%Q>k^ SWMڷ"U#y'K.x%|! (?^ɊzsC~Af lx9Amk7Cȸ-|KX\E  K6> vg)$Hјil=JNzf33i3&SA#.e G|тW5b.~B;2X6RUdž Q(l%@b]VjX~!.o˲,S|A{襾p_p; AVqz?JvMiJtkqײU}k-SB/[3mLJmU rfT&y1>sF| gr&Ae>4<ܳKJ@P㟻n#y"ljAPlfyTl=o3!y@a9"p>tS=_AIC1*Ʀ8U/f#fp9F,-ocu-iZd(nF6-|6 7"f[: psHZ0 PTZKWA͘T]`]}mw5m ?Q;5cIe6"'dTRtbw 6jؗ3*]c7Q1@3C*Uo5SC,waS胼?>8>YjȎ%GYav(8R/4#EQS*>en3N굛/X'F mxw'k^\,g<9gl~:@)>;ZrO!s?;IW4ދ 2;'7 +(F$_ʝPRd5hO/B-j##ƪWVP7]:lAAb!cT>k`>gNQlh,N>> L(qoYέ$/pEסI+ F\eHYrAǚxW5S]]%ÞO?NY3%@|h_GˈLĆ/u@?#POJ4`F3!oM+཭$yI*BYv(Y;1t؅=5L8mD1@ZK;-yA=faA&GJQ O(Ӈ4çd7<[pIP}i0>bqk|Ncۚwa 1YҗdYxMy2\WvY*߻#[8FPE.I kDHҍֶV\k ]C :rr2hԷ y|M;%i?\$*,jXxUxĖ,N$"kj!#yO S<4+hdnx"m[W[3P.7DB]2l4.mLJs2SsFqRTl~x=δ)(s5RYW废k[=/rFe޶>˺N褴ٴ\Ej85HC3l(^t!R ܥ܌/[~u))Dħ=ˇK,&ҭv,Vp#SI4lGʟWAThow o|(IR,W8FS/Ejw۸ݏ@@3Rė>32mi~pw(1tjCC/RЮ|` :qTʈ#R|ԥ*T~Xh!Z;u\hX7{;Ν&ۨ28e2|ډ=3L摞h 4/i/ o.   0N?֒I?v3Ua =|m'kwT49+ko4=l[-Յ&҄dQKvx`,U [+9VSN)4>wvv*)yTa> 'zm]d,HՆ0i3`d^ʰPƫsvޮ!L6`,Ȍ 9ȲF ż~nwQ0%Lq-swdjuT+ٱ܆8:lp>pjՑlc^p'\,=YlBqP3~> =2LMb =N1:[5 z&&J/9HU8~:k׆?<1f93R qUdW"qŏN8 UD~/}#4s ɩ <yaT2;K{%*.ڋ`$"l< nPgCm[ބD}-HPc(VdzCUfLjZIɼ"0 [>gbmaǔ _=l47#Z@(^ 2^=Ha阧ffO=.bXa:VHqQɔxFs7I,I*ٷ ٚ o|f,0}-Th-}[ siCb%=)W ) ̱%c"}TRrd/}r QGv΃`8W6͝DuB8e r=n8vy+-4uy*i)7w o+hDj̈ma5*K7<Վs3O3FTs|D[O+ܼ}6Q>WJImu%,2L~F]B< n|VF,T c^>eovA79v-,ݓRGZ*1Fstex'Xj *R; kƿOg Zu`wEcx\,3=/SxFyXk翝Ec[k('pARC2}L YZ UWPdAϱ V ZFuBX cGj46 >2"*&%mu;^=JEqXYDPR֝潻;b=VNAwҮzO)9u$fzH[tT3,yC\ea6amךt:KWz#LX /?5fMd/͙aFwwy^R[pdEE oǘYO|fUHSV)c)FŒT靟1m%mI ÝG߽>t9hęKnYR3|;xWxE%cjeynGXMAjS'cG)RS!Ա3jKa鼇DW{+y 3 vB\F&f!%ꤿ 6 C!:_LE"M ꘥z(c))ڹ$](+5U.)+^ ̪a~Z*55WiL=5k[NŅy蘓IXfRW+e]uWDWG6]_?85t"rys(BƪDD:8فjmh!^g&QmZD@iٝǨdAd~]iһRm9uaDgoa-);/+\dkx,2{y7g|/\O Apk rGJj1J(pBXܡRbݪ*Hp*u'$f^8Ӱ+kUy\ןQϒ2ō꘬u&Ŷ[PvyqBrJ]Ӑ0uHE/Pϳ߬eET0]sxڋ.G93ڵyNԅ_opfHd|(!?<(˓|В>NT" 4h ܉uNpT.6ωףg]dS51e1їMM{]x@Z::J? hlN'`_=ߎ*[¬_Ս#AH4/B@n<*=Yp\?D뤃yV7tVO`. o}%?$>޻dWW6qu{gn 5D N8*_!WzA#s(I(ՑZf/glKf9_:Ix'KLJ i <0dGu-lf$&\$Lgݴ2Ç Yq3j6xdyiYd:x.[ C0`*!h[8|zD;u$xE~ _SbW2T~\0b*8r%'om7m[ 9TZS s9.L&JW=f֮#iU})rD&}dIŧ%s.wI`߼3%K3';*;|A7?{!f$CdʫA]nL>~4xU5qԛ}1ҧ_"<NAőCn0^ Ըe]HlO#J2%9_^iLByº2culd> /R/(Fj?)f4ߥ \ $K] 5=SrB> D@"<_+$\x=7x22WWVSS16Ҳqpxݪ,o?*;};6ƽLsV4$YsBݑ=*m.3h)=rBi[Kl#h%qGGZTDǢ冉ܢշtBpcA8s nvӴ$T@0ȓ5 1Qһ/4nk ;7l^j#]!=b!h#u)%a5`rq˚ӽ@WUyךiK^p`K"ZUBK:em}!*EVGwzr`oNKO9GV|hAʡ_E}\Tax}yydM'O^˜r 4 Gf~KJ8/֫_8_+z_;^m"is ['ow`i`jq&7YOe4\s*>5 \a~e<:Wн1>W<ۥ vEl5> . Pb6M [>w{rZ|.P5 ٧H˰gր}ުm-mSlv;]= {)!JgΓ r,T}( orՃfZp GR0`H HH<.R%2NLTH$2oJZ )?ӈ&.r&WTYQ9.OZOע!s>u`N*co1^4^/<źGk[*~i1) en904/VLK^hcx M?@5!"H"XsH@ {ۯ󰶤 o*wx@H~8ճu8c#Uh9ni6V'PKn!nQĶQ-A*jKQfСJ ,bqs!s:in!ј`,Qi/zaڕ wwLLVI@B;Qtԁ4 ݄'9&XYχBl/hVAO?ed$%FoUiCFEz{yqv|F6:,0]7k!sLN%:D5wz2gL~|ծatn!Zjf4vrѲʚB FZU|HJ1g ^B.Hyұt:1GD)!mJ2tRX]KV\^ 7a]*RO·a8ST.ȯ8AB%$BH.i;2a1ibi9bSgdZDѧ,YVwsYږeB/=Lݐ__!YCq&q/L*L(L)j+V5%' '>CŨGpGŸ>@G&LOP#sN.~X%qq5,ـ]'?ᴃ 1SJo]𦇼yyRV?$ l'04 !ٕ읖\hݚJf8!dԃW^Ow.Dld8w7(|qF0ZC=l Յ6g0ka¦?1hij6pjZ Ӭ%g<JFW{wEb"n=w>hX{n꽕j*pw k[ ^XORJ9cfMCQ1+JϣuBf't?J;g|vW<1;'[~lo LKR |]Ky4;n|FE>ZOF単!M v!mJ7KñB7\KViдZֹUBڌ2'ī5ywM6Oؓ #h0֥1 ٫V7.f' V˿w-%B:4n->s{Z{>C" Q Jo^4=.=bPw}Z<{p0|XםJ#?BHoe _y}տy}|R1E>O$-rd{kO4H;T۔[?7HIWV qfgBO24CECFB hl{${+eP wVBpzS[ sS"L!ktexx6I 0"ݷ @)3Z|Ϻ2>;CQ*.sZ4|h[kF 9 y *is(M@̪ & QSz:r=c@= znDC>R5%/D6"xGd7Ce7ʗ>OF^F I1;(BZN8e N5@.d|INֈTQ@Q-+7'sҰ2ݸEj۟yc[w&AL\+O T4]p{ w <|'X*˷si}vV(Ω$b?!y-LwA .,$nzx++x)/|{~ĸOGKMEAF15:>4g+Xi[>TV]bEtItx09o A#p"ԛ ;7XoGÀPG_L =tvrY=Yމ%mkǢ\ ftn[^U--NItodcSwnF(z@Rz{Zj$GO'N0S[?Ν߶ vl`t+Uὥj-F.297TňLOs./RxjFS 5yyhhay 9CiG}k>j_ TJ0݃arE4Ij̤zپ [t5gط0F7 eco}="y[7ލvB䛔!YDa y^CkR(%$b *p29 %$nXYח*|cQ  <|Wb+3ؙ>8-s2|$dm6PE Tڟ,(? X]4X:ZbRl? h'X[z5{#>q+:z4hd lŹ$0?Cljrܻ՞N-6&cXsk+W DG)eKGfvge ~,jwkix,հohW_ =;:\Xj [r#/ iG&UX/Wp6|,g_EqWU^h&'e!;oqi -Y̯z4E6T`ȕnclgh}'28~C5Z(2(xQ  D _i0?oSo^-̾PExD2xE0}ꄵkq]X$9RjzP\X# {v-,{ߠ05 j n;MHF)B-uuj,#s0&0,'FήDd7`-d`7oDMȺkW1o=ddACd1?@+6֜AC`F R( cAĪm h^,h"44sy[ bF7ι,7ry ч j-&Q٨6պwN `pt~CÅjR?|g@%j#P+cculҁvKTGܑ&&MLJ]dOu ]Jn*?s坩^WV^[]"[:|T ~B)ޝ,LKr5+ztC2~RFeA Q]77}iA | #~ !ԣJ  +g4~|r(a '{Gisi3^~_cT5~vq1ўWzBt~7ݧb7r7~<9˴`WG9cs»x Hei QǷM SY_(D\U<>,#lB1A.CCڮdl{2ל`sFoUOt4QϾ481 ODtP1NX.Ew35냻}{.PV 0eI\ax#-hBj@|4⅌O꭬!Ecٙxo@.Dy|nObНP:אϑ0hV됬T${qeeꉶw8BaBJ>CLjx_p\1rՃV qYrw?g]}5j5Q"vX|ȷF$P.=Ӣ?=,x[X/XqBm>}rR sz c15oE Ɋ6W=rې9S}}E}jienGK}jBKlukԲe]!o1M| #c\ߤ\y;3;zIH(9;)ӐFh9?!QT{ d?Ԣܨ&O2lY1L%A!ԣQ`W2%P )@8Ctܰ]@ ,ڭej,V絢h\1:ؽ\Y0x-n0FKc\% #1Z^s^+FG;' Td ƽ,5k_jXtt^KO沬Jl QjpSz {"j+uh %|$ E  Tpw$Tk  bQ]USͲ;7l3eBDY l \ 5ΒeZ .-ҡ-OW{ujPaQ[>LD@h ;(E䠿_6H,Dk#Ex?\zJCelTZE6B=2{eɂ@MnLeCeiuHB Zw:͡ϝ^q),fm?Uo/{qm>u4n{n{g{~8~wPU׾ 0bPD&DRPsR}ae4lKq zp⻺ι3Ľ^hd ˢ.UdR&m@u'* 5q;'qW I ?͇OQ8z]Sjz̻z-܎:w?pK^"b [ܐw--e;A Ƙ Bsh̀V٢ ~"ž<HHU gz[Aκia^}H #$슼TsQXRnd i-<kP*,[zߝxeQ–< d^wJKq;,2`QQa9}vFM1/;V`a;BB8<4]ʾd^|6!x"(>q*r#ϬX<'H]`lK̓ѻpR2 #; a'{Zk,tEp}R&EgM z"Gy+W/t삅J4TحA9?K֘.H YϬ 򉻺v߿Viަ178lG<(Q 1!%,qOϓ :_'SaۤNYTcU.h іoRWsfZ'Ai]U[WW' ثS'/ l͢q2 f!-$X(XT4 qr1< Ǜt7 `8"+N5~<3sH ޼r4pH+vt$kUĆ<1 ]𧜢Y9O,5ťcHDB %"3wI#SDtRwCTLZ#:UF04Tmw+Ot>`QZ{ݶ /=fw1B@٫VePNSiz2qA{bɡvA=.tfvI+Rً*Z Ry {DqĮDk@fǧ+A 5Gپ^LWL$΀@XОP%KFGaх{wW(2̒w>w'5k&vʦu~Lp:(QliysTje5d"1ݻ'2&>5 [X:P#oTGÌPxK|2l3Nᯝe,8 ϟ:u{g;#_& rtGh8KO*&F?|:,O _R ;V+ѶB3S. Q*C[oBnՃԍ& ʡvO"dp$Fϴ##ajmllE2bϜ/kBN!fLYp`? uUbg**Q~2.)a'uh1U^l{6b#Ӊ 92kJȐ |{vf ю%BPMQlp;9"KRzG`"!"IH!fx8 Sd`"lpWR sEs4Ou(-+#[/s!(+FG$GbG>Mfy$]0[(D-3H!_j/sR-KfS8p/w0M(n5_nqԒKmuƎ{^=)O"s?]z`3BMȷA4U Aży<0^.ض Ι&YUɖ듰ۊZm] OCḪF!7iC|ņ.bל4;ڟ[7}%/'/!0K/d2A TD/ |_ ?y 8wy9E9HcG:dVLaβ\> Yc!W:)\CFT1HǾ"Tno0m`&=4Mmg[G)+o&X)J|=JBȋ=N5gV8.G =cEX _WGt.6Nb;t?lo37?ZΗ_{AiiC}s ))_touwm0se6 *ʮi ]ȗ%`Tz^9m9>VƆas,Iٛ-򤚉֊6r`-c0-?lI[OJDu@PhlBs.Չ.fnx΃;\ȭVf0sv[UUN]>|RO& naHRn폵ji%67S/n,CVmAʝųX>^ 8 }&}]Eu;N|)[q,-Z}Ou9Mhh `W pfsA㿶uf`(m_VטҎt ,bǟN`C, *(z!qxAQkpP~EZ T3gjp[e@$;bZX a e=l0ĸS][q#L^+Y䏜J}Bb b`09X(L\e5B.[<̛$" }uv k\l!TY 3n*@U*`#{B'NRFSl3QSDoeh|l>;T5j:U4r9њޜ {DmK)$<6-%dY(ro%_8#7j.g. jOmjOp߭Iݺت!e=Ln *ʀD|qlTǽ4~zfK2瑱O^%Mjq+C+""b QX)d`[`X6_Q( ߨu=Gg@о(_,bWf KB+ {[i j@1cֶ~L-vW632Qcr&4bΨ,^SU>r1'jkP ɽ6-GqRS/ᚫLHo!RAEHH :budp=ҼZrlPt_L0Ê̥lQ}3 ѯl4j O+zG+hВ_PJ"b3))C)4((uԆS9`*3VRX0?2BWJ.u@^93U"=Zr\>:<$Gf2h^巭[a2ebߨol7bTBWjazxgGb1cdS S{;j\l9ZMN-QGRfC}C+hecϞ@1̫M.UTllbu4a]Leső2ׄQjÉ}?y96^)lF6:W/Ɖ Mg aAQqHȉa(9eEXI1$=ǿ|F%4p|Ui&k>TɄ)HP"OaڙFaVdPVemϞW/sv|:͊JFatTv{xA˛~|\ż-j\;Vvo57}9gf1)38{D&v4C)BsajhF7J+˞5jے3Z-2X΄^]rB rA(^X) P\9bb ]piPn[ eRhWa-Wg߮]ۻBֻ#^gr:)zP!ӂ>2{D_AC&WB`0*fM2U!ׂPsP[ ;~<MDcrEo,H!_56i\)(6an.0zëK2F_2f_cĚ'>251_UF:϶vJj?!VijV y9ӿk3I˛H Z;T\Lɬo1ʘ0}FՄE͌ܧHft[P9WV{aQd8Fy .N8fTzwT'[.?*rYF`v\k)KVZӃS[|zĦ@moPe$ٵb$cb}uH9l"n!d>^rg !lRFZ.F}GnT9n]OUA\F M"0l\˺Pꀀ׮5Sl_^.m`0'~j^Yt^ȊGo#CR[X6-BkE4:o_ڵ~MV@,ql s[27u keyTuKX,Il&qڝ2JܺUXjO٧AbrOz۠Y0\R*3Eϓ?f>[az2Ɍ Id"e| 02QwώN u.٩=WR5. j {{ x艡$Kmr34@2lYM_&h)y ]$o l/R=y-"fr6B%J?c&t1N\]UR'yvsc`>űt55RٟOCh mAWikM(}vr2 mk@4ҌCgVnS͇p=FUZl'lpMLDF"5wIJ9_5/=6-c'-z-;εphv^Oڹ6 d*J.eEͳ#\"E=T^#jn؁߇K"D* Pq_{\CL>C凇x#qgwdNWF6b-)?o$}u5QCfAM 2%z_Ɯ9M?|wRS/FBVP+t3qiwB͜ޞA账^BW Dy&%@7\X`E.Ya/sZ ф3qqe`}-mmi1;"/y=?Ѳ$G*e[ݝ@p`;< ܝ>H>IxݻX59oZը)sMqUH2w%DRg|2#H(dTwoPE?*+VQ;|G8^=.)0X?pV!KbZHL c= P81048,͈Z-0k ٿ*] ( 5$$]v¿ -$ {-h> 3>^w0fB A&>F]!cU=DP FJbIڿKkҚ [/68[W4G)e[t mIwߝfiɜɝ.YlXL-zIL\!R=6{V\Pl fyq{+ۢg&,_j9,/2 U7t.wkx%R9c9LePN2KsԼfƹtrb4,)OM[-{R[jEo]Q^3.fB _"JӶ:Φo~1c}lGIxbO}D+^S*e:^0PU lxbUvR7ߴ W/ۈ:A, Np0nꆖxKCZY dAv{X@Ě 2K-%ā#1Q^ipk)BR[bQ932zc֭A7V7/??ŽC<䶶{萞,Tv!Y!"ظ0Y58hWX^$:/*詝'aD LXnUI.bV uaeWXCNtx1[cxh3L֔!DJu$De ItD0@  6emHVO߾q}hokV]_}?\Ң^P1`7ƥпr@F}mg ӦqGRБ3dS0as-4Y1,|ȮesLxHOE!aR&d q^JLPdk,EPYj&af(yҮ#/KG0^ RL+Ǔ{s7(ޏ_97B1_Wm.y396ޓ6uDqt#`:u¤!Q$;'PXQ!z+0oy]+RE2(>G faXk|B"DӟA!x# EJ z.CTNHQh~T:%j`3uf9݌B K ?c|)k ¯_W_ @vrQnPڐ꼁ZFf#j>lA4DibX}**!3/=K QNڡڙsbn6[SuCh[L\se:w6%`VvCV۱H福ٱcnEK]t M/?/+ѣQ}Dyũ\ITb|TčH<ǻaocbtrs=' pfRt U1t 4ϝ~|,\6IP \ \A0 G 0ebS:dI@%Ϋ!{I{gL1]cb9ۡBit$'TQh'ź#YH% -nE#|VoM\ -C; 9ƙEj OXz*ܐF". s$Q+F' T>_/pp12ѱ122C)]P|qN^5}x՛*C?Y-zu.F&߄`|75(s}p4-rs?WzӅvAi}{Yηd +} u1H oKx\ᒠ69ßl^pYʛ1]]Kڐ㎈Pa1{(Xݬ:chqqamĤҔF>26 (Hg KV[;:OoxH~⺜7/4g 4W7eR_C#7[+^BKl?|Ef()g&#hiFhSCk̆R#&U /ǍV F*P'RzNds:1#āzS C\5AA}p$:avg")CdQŊ3JźP$KoioHB1c{8 H8R=u;VJ= %Lvd˕fe "ZDáccXwh#Nݩ% U};pށ UT"@ʠBk.Ky#Ɨ @Ēauĸjwİ@Ɵl_<ڐ|A" r.fa:B=vNΚ)҅h*tʓ"htcENĈd@0LY}J`-d y;h! ѯznhϚt7Vz c0imY KǷ%0\Uϓ:@]0t/g}Le|G }2j+nAfVrW\[sp? ɟHx u66! ~d *Q'9!mUq =NL#@`&E8XF؄ F6Z G0 m43(~2=|X;+YL(&aF:DBگz>-Ul`޷[7pZ>X=IRb@uZjBD"0x 9cT`4 ؤA} a["à#B;2pu`HPV #B&NlﲙěY$' WV pDVU_ fRfg:)`VOF1ngʰVz#a<~eRҏ̽0-eu&@X*?!B-@d24=2 ve-+펴!R(\(`,Q|2F{02Hp*;HUgwǍ*H P8:h[.C @wP`nTfhP 3€nn`B.hyȁ [0K 8418s=.WNW/!_m1mNNo;،-OTvgU:X"fwͻS?VK^/JZ!nIԙG)-ۤI^%A+R^a@*V]k>N|lQ(h_s]'SWfL -[2^]#Ǟm3yZs\4`Qg MYSi9<@bnk%`tA{|ŎUyWDx4 /G~ҳ"%mi8do'a⒂xڮA zvGHm|V-58V^Oe[!tygGA^1@,-&ځ]>A^|"N\rS,ʨŢ  ^l_ɥkKSYƮggg/\AJڪ+/q+Oޢ-Aiǰ5 I[5)bCWWԓeCbg!UOJU.O -Ύ/䢄IJEyȼN)2ޘ*3+0.d&0D.?32Qٯ6ƞ< x/DEEYT%q²Y "$^vMXER3rc!g[Vxli LB(~Uc," mDT7] \+]bzˆd ᡶR;_dbX8r-a"7JM%_ imG.KyjS!LBJ'H=yUR#\%R4ZoefܳYByC9hcӑ &g)zjdԀGs[*P;t .FzҢ*FwpS\5 ڣ:$: Yhe a=VH4V+)}J;dvUJz7͆bh.ڲ骽Ց)~CY2x1u]Le`6+=ǴŇ(xdMRYBV{mԛMkX)>^mȀsc, E+ΡB{ɮ-?:>5 F0 !*\FeF̅' k[hd Uu(_O{)3L:Z|aݱuv,R4"D0wtLhL3 **ϹexHRY2 u+ _R~2ю ش]8!I_ԔCX),C/ 4+ݙ+I1tZ<J,;6X.lY׳m DEU=bc={C>&4Bk^\ou>¥ܬ }H 9'uv<\N@8s& euQG GY|,0Gq@$"'*̊X ? 4'@po|1TTxTjpDu1/:f7j1irW| TyF|,*upYͻIGpQn -J0! \7C•)5JA+ 59PdC+"52PNEo[!7:ՙhe~J e#**Reo%,c+a>dt˹MD"=S pvA-!VM3Y&y,F-?TG9qf 4 o_jVw' 3KЋG;?Jfw@@폵򍳥.>(#ֿJj><޽U w* *r)Iva9U} !wA̓)l1?EP: .5#D !ձ뎰X}n)&GW&GrC3HY&i\=Kl#7 p4 z$茞NmPrON پA>4 E3xT[0o-z`7zCK-ߞsLHą~_\B0@"v[Ubcxl$)rvl^M:$j-lrmbT)@?=tM(}a0F !H+[N$jr$.z!F Bi0lOыZ }LL$(7R &,]k@*뀭 .pPfu"g#)jqs27VLv=!s]w b@2e[PYY$i_wgѴa7! OyF- ]L/U*X"f "~M1px3Ʊ:I}u,+p+V%M/O' 2(|Ľ8gp-7c']MȖHj7LE^۸◿E.+K̴͎R|~K5c{t4*6gj#mk[RI9M^.05ESɇ1v'T8sH'#44AØaS" !Tmu˔1">lt~h|KЇr~ޥbz5 .NnUG1jekM فv#کB@xc+ $keb Ar9Vw 'XV$Oy|(p>SteW :[';Г7Ifh̸qQl[ZeR\)r:u4zȷ;0ljrNrD' uR2Gtv50U1>x%WVSoC<;^c"8Cyd!R#Z&_&\5~Dlx=HnN}?Wz` wgS~ )a3YppuIsMsvUԹszL|@R𵌮愭siM}~h"zA~!aCaGФ7sKd)k DOvF2F1;()!6f$!6,r#b d'XᶦBҟz i6{$Cc^tDg,%ʓ>_f^m"<0:$zE4cWƛC{B (3 KaW폋_ ՟~Eg~|kΣ;Pĺ.^^0dzs✧0mh|ҷ'^u|6g֐P맒0_M:.:?P"*h2Mڡ|*?vrj N| Z\{"Ym[s޻8~AC*, ]x+XUJw!.-D O;~"\?şw?>D@SxʿuU#ʩpb`)LTq &qy:72"VJ\< N%x>92O#hNDQM v$RP#]K-cOEa $ !a80 ~ )u_*Z@rٟt+9)o){C-ZgU lPvs)TQUE>n$7b7d3يKbc1Z؏F/y,=.BpP$? K{v d(oq1>UTE&dwp$HM2cLaޘ= x\~/]E /o"H "5 j@BIo |l'|KKw욹0MtEI"v՚VXm4YkBz!,_ #Lf[Abh4?~ll|wc[߉v|MlZҨmul4װg9#?'@:ف'3J~*f_y{_?4kDMWEyAyÉ  J3'A1 %}mcS%ŲLQ)=$ͷx6O[:S/4qY4*Ʒ UZB/TI]La0 +'b'flӁ^ODth79;eN6R؋QĜ '2F!ݕ SD Ǟq+ ((BgJh" k0pf9}M":H |MFዑlG$E+T?k,/wJ^ ES̘;)Eߓ")Mt M tt ,h],-[^\a3pvXY I*\4H q~lc uT܁!_Zv' 4Z+(IU,ziAYîxcFdI-Jg{y*S[FF@utIɃYFґ!љ! ^?F6%RZ] $$]:Z_ӥ=E?c ](I)^!H* 73,-ߝfg(6h_$ZyžKx+po+^@- O뙜,2RÜS&"%Od+W=@W/^3*8I1 MTiBnzeѭBxa:g(W+ zT`Ei봕u?΅>ds18Dd֗Ф%dbp0.ԥS0)iՊlz3P.|SuA~ZZ h1߼< O/d@H$\I`8}iL*_Γocu[,*qhV7bVe;ZT5֨r.\)sS.6IFG܁K|aLQ15^#^QsΕւ+a| UWNBS26qfSsN,AyFRq] D{lPoW5Am(&cP4VFz?Y AGa1^-q~)qkJ]G6(mP&m dMm n4l;Xٞ1[TScN>wWeG?d!|oLL|A8PtS6(nS'-i[e ror$ ?ƷIQ],?cC1! &v? -.Ϗ -dJ *t s9`^tBO_˱u?aAPh*`flfc\bJW@ɮD(gF %T' 3[aqC![EX[43w/'Ӹ8_MнTd8i+7[. }{=81O3aG^ Uo/ MfˬY$r0-T誸xT``D_:N)ŗrKXB i2\k)85M}ko'旕&:;K*-rCT64!w w} Kq`NsX'xzʋV\8]@牬Dd(k !@SBb/[(9<91ƚ"YM -I䝚a}gdWh(!)ѕ7s VO.Rvm~~TLr|B$'rG l#}іʏ?/ [ՁX%(HR@2N6 .׳y:߹mjҜ J?Od(UP4586g=1nnI^ Ř=r GqN~T0ڮ]i[Û]Uq4 YQw& fv3y[fn?aKS=;1ooL cfkAQ>f5OJt!\n>cMJP/Ro ,`7boDoHۼ?:MOh *rѯ9f (퓞<1ʨ+ƻc0UEKc3B[{WK;Sx2РDl\/T_G$J QUJ V GpYCCCs㖢Z_ bR횁AG<_wEUn^ɥbDzY,V8O|:{arc: 4-([ٿhkE@M,Hy3}9>UC" ̔M2ٝN♲tr޴MqriFsߒC;3to#?K^:W#~]_)|EiNSF<<9)0bǯ.g٪-΋Y@ph9?nf!_%JMݱ`Rβuҡ%+i-L["r!ϼrr.'CC{ ͣu gˏ3hEyqJ1s-X<0/i=Qmト8$zn3j;O&.[ G]0!.ԌXV%z?ΦvHD\$=7E~̐G}a^aX/SƸ!qPUt,ctJ\_AOYHɈlֆ•8``ͅ֋Ejr@{Krm7qɉ]gJ"|>ws r'}א>c[h>7 ^k~۹!l/l7pzxyp$'w~ 9!.gzZQe0O-L&lo;T:ҡI0?j1ۺ0NHe?қ<1%\ &SD߼AH:\ȣ+F7)le]>Иl=㡣ڀ Mi?¾bCHsDbu= ~)'_{iv?+ 5bU(4CkݙNsg.mRU-z+Doѩ^ ԭ VÏP!f :Ր<5ұmxކ$9jDbiyt*C/D|߷;Hj/QQ{ALxxe {e:AKx]U7gq{f?!KVL8tbkF}eRA9?Μu}Jc5s[ JO~6woxNSίq߅?T$(B_XGא"GY!v 4uj(VbrjN .pZ| 6PԵrP\@%` i).T xjI@{biЃ c=[x͊]'q$eյڽ9 rP[yJuQvن+Xm=Yq fݐjT|I~Xn ,Blc>T[Do'EXK iܦ;=V7:H^FP<K?hKz^G . R ~hZ4 3$Q>>[23/ܹK% (vCH@ĒPeIߧf5hy"|/b x%/BJX(ܔݻnX6r^_j2Hk|Tg|WU).\Yl߂T>^(u"5CnPoo#/{.ț<.8_.$44#J$4@5ʋ<ޏ&jDyUs==;7AYCY*o2 sG^}n΋[ukq?oA˒~= m{#1_2zl#5E`mL.&ҰXUaa3K+^AsES0(4i.yBfO=NڳjQ,YBI^]V@)~py1hZ'z0t@BǗ9 Zlɦȶйȏ}̯K{(O/]̫w 0%A]]3>Ԝɦ jr.ztꖑ;}|Ve3krw|c"){֝:I^@g!5%Z5?u7Ϸ?~ާ-px06,\PEF\?Y'N(4O|&"0l|LCtLyw dk(}h!q=Hi H?t _n](VPHX7Q >%HwK ̌+aEEc)(sAG7WM5 X">>Y+l#;Zils_fv'нAմO=ךyHՂ3W$M:,ims3'q?L w%LѴ@L>zX=5h %fPS8^37R'[jrlNtT2[ 6P蜥'cűN!Ɇܽ꧍ǂ/! C &ZtO*m>J1=5[5ǥX"~BKaOnqqz?Sn jZ_CH}^*4XqwpTLDr5l`!1RuV:kv-ȳ޸] Ha:ǞH#a3Xկi%ߟ81{/ q*/|وs S7;vfTYGc,7KUz5gͨDY% $GO QN[;Jf𕏇dszZMO5WOf(ՠ$5He\4ZFr(75yrݗW_ v~∬ܛAǤtp`H=e.=i,8DʽCxP_!{O$w"77=N#$@95|CZ|@Ԣb`)VfLa%`m v06B.pz\VsHprnH+̠z T3ԐHGz.Z]T,,Q965zKz}8K;C[8k9OꮬC*;u7S1W~= .ԋIF:ߙN~)3oJ},HﭴzZҽ.@k$+ ;\a= =p>cAxw}^],õ{NQu$ ŜFTt;~S/IC-K8LWU ӒVx&mL^.^K‹}h~3zpjŃ Ej蠵Gmc%ÑųIOk㟆 TUF.<4e\ʜZݢ!͗ͻJfj-'gnܘx-]y^ _{%4nC^Š,Lß1>ۛ1+:)xx[MkM *GWn)@O:ƻӰ5Eq9}ӊƓf&)4Vcd[q{Hg pyǭ5jR]tˡq}XfY:4$^=.*/½nL *_D[ui{ op:9A5*<4>QkJ1dSчH#)/@رC5uA.kpPOo Jy1"\8tb8>bwBrMkgݜz"Ց$˨j's[G]&*>9!@F: LM;b.$* +B&fʟNG%XCwp7n#̡S;ĊIw>stxOɛ"W9ktJJU.O[dxT)%C˒;^}6PP2EKL\i.r\0~Tfc2ւ/'Փ לߥKv᧧=䅯S[$ax=NW^ {Vx ch@*GT B{ bIa M!QRQiarO7֑dG'"~xhS1[ДnY<IW6CC.O3ԩ4.@@< n}v7c{JD[$(xwnzv8QS~x,S@jՓ\#^93#.@\9Q@6Gy)b٣[x8p,6}mf3hh+x.~i0ws~RpaP7&a>Ee,DeJud1ušUҧ=Z)"/2:._z?xbn& FfIk"Fl z!kX)7Ȑ"rL9~ ?4\gb4|mQ{YAG8^/Iԉg%5"u-)?PˀwJVDYD;UT_LVF+nhvW)D'_1@Z?EkGmc+ {}b*x︒mC;j+M9-s&;pNyqj?8-_{d7 vzF]^.MP<3>~uW741&dnK)~O 4؍0yDL')>,,,MSWsh[!GTwQEBMN<\|y|ۇ~z!TCt2CB]i1ŸKž]dǐ8m~zs#g1[Eve#C ,:ЉjY }smxʤecIj.>-ղZNߴ`RnG(exAGW&JEH?}R\|#EG &z2HwU^EYi\:pv<ҏ菺'qHJ0=|ʿMt8ȓmx6짢CNg0ޤi7%S^88&~R=oS٧сSF@mAKK> K9>x欚>m]Hy葝mwrKU C/#OUGbyWZ Za򹳡:ƎMq0S*#5TPu_Vƫ5g*jauelPPt[ݚthg"tPMA$i62vbpE)xS)=C`Xq}` k`FE{*t_&6S/dž+pW-Fw5j3SdQ|.z Hz$]0f=.l|n` ˟ǒ`_KU"S%K(+*q};C['`q3Bv̡'j}m+36*E(/?ǪL?zn_Ī!RP70nGC5D?פ7vYF!nߍڒZ@DT'am}GadZ |FnTEClVRM.VOo|ټ VN໤c<ښ)Qa* +Q8\֬.2Buv.LFqr7GTw=GuBVK6uP|s7*:߭qOrCF>vja|~dWSڲ`c[6!p /9`;$k\!5_ Boٰ\1Xqj%6`|\eQnQ ئYlO'1n'v]V0DYpQ QB0+#`~+eoesk tDj vy)XC:m3_^dA x W"">a)Lt)HSjM||R¸')T NR[>7#&Kj |9Sjn,c76L=+хn뵋G"̢Tz n+ͦqg27#- $]?cfF|+!&#%Mgϲ)ݧ%kjOA&GCSԄK!Xd59R_ȗ7vN[Ө1B UCZ&6&zɾŠbpκ6ǼImB ǒz:[uOt?uK;[083"1uH|bc74HMmXǩ_04',q!*$zg>qn ab2a)!u8拒 `0`jœ[.X7D䝮Hޢ-jh˃oW#?|*;;hmuln#(2ZBٜ l7ٔw-<`>FD&_K!XxwoȴY}ŒurhYw-衕?W;g6꘴V /MF!0*Hw3gڷ$nq7TQ'{ X,`LX`J4HB9X ։JS/Ú.%qB3*/݆D^fA$zo7Pdz C=DtO.~t=HpgHG"KbWgBx)Y(:6ofu7ϑqi:pV:<3j bgwOno;2K{OM#̈́c# y s_~]jvbI,ƵI6l w7ҷQJJՏ&{&`ڍ*] TDv̨)K1#~X#eqMF6'Ə^ Xu( 1YkBFwETNq\F(8ǂ$Ivs>(¿gݕ/ڕү:`˹hdȉ~Mc^P+ͽF~vk{3Nw@!EBeoj62*-DTpxSS G\Ԣ}N|նcV(7sܤ/p8#Ѽg⽇z8wk6 K/[z~ TV>Ӑ^Ywʜ5Gnq=Gچܟb_ /,M;XL/I-柗 PۯbeɾM1 A"]T'$">'aڃ>.-KulRZ3*V4S;zxNpRoMYfȭeҽYsPuB3n~o,hcMYLqd_HKrHUjh7{)KrޟA` 8f^Gqǭ?n}ڒ-h׳hFб^DG92y>EsCE5c9,',ӛ#)oW~HWwjHVV "]xGU _@\_V*4<-TsWFHJVkWsuC]8"]&T*Ζ;)²NASj>P.W xXQ09]m4d;\\!mf5HQZܺ0ݳ b8D 39 `4|fzψ1qys leݓ&`֓^-բ[l:vlE {zᣐ_8ㄻIeivtlzzA7z4ٽ9m% (\wإ$S8rȿ*LQqj,+B-fZ_^P\=5+Ƈ dw#hh%Y *4:ESYCIr4Mp(b866| XAq6Nx!e\)z"ĖLF*@-O3ݽ}ϳ_h|o?sD\;'U΅̿ qy6E #OM)-yc 8C1!L\G.IGNh^?<χ;n}(E}5 o#_cTn|H/ަ45//A!f {5 +c\Jߜr+}[^Lo<6uP{@d[ST7|h!о\#3v4JF<|d08x%%V4 DÈ/0NE7)r`i3;4y1 s}՗_pvR]R2ZIhIQVWVM6r]d=%ê YK ! o1=Ɣ"!?8.qW)#s R9z,z[aiBJHQE,꯶⟑f6V"n++[eJ3jD]YT!#A8bֿsIM(M:|Ԣ D$?1`XǻiT)Z)Z!13oUJgbwIZdymX_ +[ p}m>LHdMڄA*nH}b5`P(- 00OT;9NZΟ&0 z!t`ƥ:=MvoGZ3U1PPn GA%ȦeއxUIKe<,y)F) hw.Cd/ipe jcKd$&ZbY109F.U#z=2TR坧DZ4;2p?r1uh/Ӕsl[=+ СkqGfw$G^':V. -ތLH_&/Mfg5z~ع<@]W`vBg>J9T>ZP;L:sĝƗ-jW׷c^I]g|ET޺R }eJƍ&= ]]W'g& 1΂c :^+]Sx^vx6wLy+?@PcRq8oEPXɴgFSwqvd. JӉ6Hc1tL}1iN;=0S?Xeq"u8Gb
 {ZiH}-ܑ&aEѹ4!R4R䶨_:lur4BJ+} QMe?(kf:6ߧЄ& 1gRR =T _c sSQb~_25WR_KӆXTD^PǀSk5ȰMn(іYP'Eyt,qIx5zPDg ykj4|Թ9@/Nsg1>*A}Y%  SC5R 'KTȚE;]eTbMA؏NJ $h?)7 ގ>v;E$)#!9uS[gvwhea>O0c0?X]8iu?-Qn쮹|~=®GZ^b e\ӐaSk,e--B\jUUƩg ItRNFDj#,zVVQ gV GOvdTkiNNz;Y¢}}mKQ=6MȺ⑅`SvK;C(*lyEe"s81ُ`Lx$$py1Y9cko5a,tvCpYN"O 0GSR)n ͧ-^ V3_$5qn9ARf+7j4+o]HcŧI_윁*p+ul`k5Cwe-9cٷT +¯`xLinM0Dscf^ڗz0žZ5w3!#L_.E^-G?Z2cPh~:}ݯy`4CR"ýRF#B7 {PzϿnddW{tۦ2S=-7aDQWxϕ H:bk=X_7b)fGIۨcW[_M\/Lvz,/`ү%*×{hii`5JX+`4<9* "Go- lxվ&LKg+,>c?ǵ>{^ ߊ@}nw.Bx~8PSG1oE~ʟE ۏOς["Okҿþ_&r!^k"KCW='}KGDq7/W6AȘ:b,|`$lu/ߟV~ha'G#|{!iV>6 ^k:iGhCɎ<PHY=]=UA t^EL$aJ:,f#^"K&m'cM iR69m]>퇸?%=DтkW?\AֻPz; -۷BiFc-|q>gφH->fuw^0#G\WM'#$_gm\#q.ڶPO;33; D+g½| wlDdR(NEI=ަEdՕ6bÖ."@eHkf y u A3]6juUNxQ**zF3ʶ[jc[@1}L0-TSȪlBr3(4:XbB0ʝUD'8ENkoO ֽcF[:r;KvƶzϾ-E={==ߒVng`/׺8.ËP6zWgfiǡ~ Є#olD)Gd"!X I8(9d{3♫ dz| lzP&i,t-[*4mػ% &p cdt 28#Z VD1r45s_f?GsF/.5]_ w|I"bz}˃Lߧ`C1$l-W70L!Ego>8ewWI!ڋV˃oC?|@7z]n`l%ltIF%(+M#J dNxo8vK~HWݤ/ ;ZыBRǚ-uDz> >[JpS\/js /b,w+ݏ^ P?"5J+*-#Þ285|[r6d.`ڟЋe[ :;a8B+|fhLREm+cSĦN-SrLeZ¢f+ ɿ w㿿8!%-K 3=_ߒ4X%Fh%il\qڸ"k^zZ=4_D! pe^AGTvk_EtHѤcȻ,~^j 5+;<25Q#*qaQy NY-ANn{Ӡ]OXLu& o 0Z"3φlxߚZ_^"==d#s;3m {c u-o$/ `e8 P_+ 3 D ),b_.apѾ& ~zJ9y5[WH{ T`|фK/By&4 <'v[e)lں5o@:S)p[ ?AGn:.KոQ؂%1J oJCy2$2nEڎ3sӵӯosxh&VөK7/}fļ@wP %@0.|IɇQ ǡN%iuY%XC|3Ž&}չLV qrhJt>NXx&nٞ3\~,aFivx<d쾈b15#Mc>}?M\nΡ+^^ZT~ Gm ݤ=F2#;@6@gY^QP?V='I[XS7e ny~쿉i]P_ȇ2 gK[iRq،5כ6pYD͖/[wix'M^ N2Kѳ4Xɩ <%''z)1_-cUX:6og|L|P4T'&(#ya9<|n$qƥt`hiH62q!  q)Kjqw1kT)п}+S3zak'hbh|6+K⇠{_#?ua~D"6*n1x\30T?.C+b)Vʧ]"$+Ɇ(h+\>JY%J'62s߉kLuh6"k+DLl)w&u!~$x\Y0kePY{d_L{]}:T|I1(3^z-MJ(v5"DnCWIݻ MI-r$>85N&G |XjFՠʌ:t~,Z]C]-R 6Y&&Pi=:TX!f6j RRJyT^|nX-~msU=xyQ+Xi((Tb]7{V.kMg/[d`S.7{eǷ^5̯n}҈}A*Jbj 4T˼!tm~I ?B S5@mdC=PXUOxH)ځs Km!0v4Vҭ'*UI2J}2 ңAK/J6'R Ȧ9I;'Jt>/~WT`#nSn!~crnzn( S"]/^=9yI 腥Sߓ9;pq^LᬘNfu072Kb^8Rb60fzDxKY}|ŧ7q ^rBpaۡ@FӍ `M<& & R\C-(vD^ wͳo =X72ce(9JXTQ9%*ROOWB_ڈ)${-aWؾ~"Q$| E,C+*R ew lyz{fgZ:[۽#zCX\/?ǕLi1??lߖpud=^W[qM[fӾ♃)F;8C=@50{FѨ|Q17Cf{N[/z`F1nҐ )0RLq I.rO1W06˵)Fm㪇p 374CTC^f9\DD$iȻKN7PA80=b4+I&9ƅ\]>J W^peGL|d Wfe '1,r.$ݘee˕Y\2Yrz͂*"W܈P| Zm1h,jMNL'NY(F`cٷ=݌B9;vx6!^r8r3I|ΧP&p].f:Fv:F;$ 1p%oVxEи[!D{Duc ΍Q; RW0pH+XF3NUj:p6uM/*.ӋJ{J/Y;,0'tU6SR.*2{E?R.)<3ι+RKb*!A%i|uHjwo}xYCR؁|!񦛗kaUUƸgJzt26+QɌ W"r&x?<%W.7~V F? ~SCiZB9Tvk.%3NooAvD*-+>[J&BκM'7o'<ە26g)'Q C#eYaaC)-8s;=:dx__-,B }79b0?aOYZ<[CFUًtS\"1KZԖInk~PM;=]}M|zK8Xn/o?3AA 0w9T@p{;Tu o zU8F}dkv3.fJ^7ݳҼoĽpt3VU_MS(ϼ .[at(0k4k$y"K-iؙ1\^?v`_w H֛(%eGۉc6@W?D8 l )R"J+=gV}z9Xrޟ"AT7를LaΖ\kfp.hg-VśH3XG>1#xUOX;W UqGADڗ=D#0zlߝnkHd b0/T. \=%8~7qoUDv5τή(t]fAVs_{][zdr]3ѝ'Ń[_h/ Q5cמ'Nhq4›}$Aގ ݺۨ7t1<u va\{7%p5SGR!Tl!BB(Z^iEx} $;!,Ǿ/%={.k\ә3gfsW;suou/sE)72WlQ%jU6 iw^ {\|ipzS壱4ҢwIS>zfOQ^=פ W4:n:pޣFUru`=ۚU9uy%so|ܙO>[XmfZ9lU_^_϶b`Rۨ?/=AvֿanƳ__8]Kl2Ҷj]7<]hjcc鋡oVF!8Kssʡ*DRq\\42uDyx{k:48 hT[`'@,5<M>Zor(Enـ7G;T \;rV@ÊH8BfVdc@CT!arq@!`A< Y KW&PF^Z@C~|y@p p4$8i x  ᙀH:ւ4Xx>~" 0V zL*HԁpoAu b; xz0y4y k@ l["p1P p`ؔ 3V k[gGa hZ Mk `tlmAW N;H#  laGr@&#tt " 03<P wtb3+#OwH7t. @6 `mp` `dzxp y  up` pdp `2 8 b$p<JiaW;PG#@71h2 tu` ^[/@q  T2\g@ñ 0up`aAP!=J!R~(\~.n0 Ќv ,&@n ߀V;=ѐ'@>d6 BiiЙ C 82o_, &he@9 P.qe@ݹW > &'@!`|H#ht~HBHW?YFD3yQD \k 1/"x/Mދ 1.䍡720.6D]bpo[#dn{ OaݟnUtv KִDYdB8Z[ TDI~y )APQe's< p%(#G(J̃9uJ|8> PZ)EyS: zQOTR6)!h OGKoTb*C!F(<))yTjeJu}Sj(ZWey%2JYĎrK@UG8lT0⚉CՊcˮ4N5x mxPa"y2Z3 Db=]z3j$?HY~R */-DPm470q=P=)\(*%ɋ3O8U_-n]X/#G1"[F(I*>[.Z2@í :U{Dwr%G@)֢S5- WL×:E] 4VZ"mROE'pH Tz[?%@Gi0I!5TϦ,D@VvxBUe@4|x,.ZiyQJ"2{eSG5 +ç1 TXr\zA瑍T8v2F{1Z|ZATyw>t)XlSqˡ{"W%X\z~2['j?(BAõcQ IڶR;ϴt_zčxBiQb,dGSl%CRbJ+U%'g ӱZyTIM#D(U0eY\P+TT䭈nͣ扳HJh\>jߪdתkU+{ٱI~TGEWJb4,IYê7е|P1mHPc[)s/DU[m2G9s?Gn 3T' V[Ȕ; eGVK˪O==ЯUW9T/Oe C|Wٙ%H `^ 1TvC(Έ+ESy?Umpe93Kv>_GJ3Ӹ%W |uV1-e؊OQUBP:ޯ#{5Zsnyʽk-BYeKz.IQډ꬘+뫴ymzŘYg2m3I楨ot:4z}侳,t3kV`}VT]G댪6a8ǐ=^&X*Zʖ#@N+ݿRhE RhܻJg}kYgʐ-媚w}IV^Bh)@˥GZqVl7(FSheيLF*B/x`U/;w}}BK;f~ɷ',:zc?kh̝τ+>sg_)l1dە"aq,qK'HpPL45UGfdcҭܟOizz^VuQ,_),/s7_ٚa8QZ\5u(NqZu-ᒞ]~!\5KqUiV O7nƗ_f٬]S= {MtJ)W},-_.G)kӯ]wtԲdZKKYԃ/>]s(,3B\#A#W冲lq2gaO.gK[flʕvƖ+5"U|BmLUO)~}zuR.vWXB#Mȯ LUIsiX>VG6;$K7WV4{[ByUk .>Ah6V| KW^SJwfZvVU=16Zq>ul{ ׹gh*Ъ[2n2J|*#5lpqYx]{@ܚcz*WeeDhMUF̼Z E˂?*#Uh{EZR^Vߪ޿ƎKgWhX(?3Uڵ*{KoV^UFeUwε/#RT?d굸ݦxy\vX\K|ԱhKaJ]J*Şb(ٳ QҩhRwǖUo&#%$K^wr*MhMRnkЉ>U(,܁ˍ&UT}6ͦwm%M:RֹS֭UagY{Ƽ<,*ގ*pTU砬<5FYP}xb/Sh$ߛKZ!WŻFI^ObO=XW>֯|r4v!WUfoO&MܧK#{F&G*I2{ Tk9baP-{*5C۔J]Se4SJ]Jf+U@K~K*mG7H{pwǕwTļ3Jm@ZPީN~'>j K*GSt\qZ~TIWT[ne4+. QUU}{kljmi,U5\Z&f,!bw} )Y%͗+_^MUؽ# K=*[#vɽ;lʫ45KAUs)[OS\ WU[Vk˲Ŀ[TYj]߫,]U.iTWjMRZ]ַթz+M[=Pte&vciu[tr+)Jl{_8Ojke-*}! ZYJUduH_}B%7r!T qΡj4uJq'hG6Tӱ D]H,rHvKKBQsaլQ_,j^.㐲̇.FjUUv}e%SGΒ~gIuƛ-ڠVL՛x=l,w|ŵZĀu>eAܓj5,D$e]P=I4 J1 "gHc…z>7ɂLYN&P?ΔIzu 6*6qk )1Z Bx>wpuhZhDCl䶡P$ǻpjI[SvVh5uGK[!TXh'|!Ag uC#ȶA'nр rT',ov=$ˈ,&Q ˆrΜU&Tad)Տ틠ϷRég:*ˇPyO`y2 qˀw}(t$iWC 0x 0,GN @`*D zf20GyMHoC@[@@(`1#fpgOՠ@ p`P l(@4``2A8|{w_P 3*7 |^I#B $ w@"BUpDǀ 7@4`-" Bu%X @!hZU@! DVrCC(  x 6tzRgF7Ю$@0Y7N=@Z0 8 x0<Wm3pD2̡~.tkC6Z@g XHLC6ra hHZB$62_V'@@0`4U=`W8`@ xNt3hd  Z@`b L$2w&Dvn~6}2rM:``3@6z |ԅy`- t 8 )%b逧Vo @" pAY6m -<$. `0Xo\Tr:@NL:BB@NPR/= `1CB}g7P pH:Af a 4  :LjBZCܠ]R<|!> `.y`1 X~0 0pФlT e  HTї 7npBz} z@)_u7AпL/kl-5]>BBv%^).yryl$fєU⁖J{w@5״Y)mdc8 @\1r$2qc\*cHzE~N8彅[pN>c/?L+5,XOPޏG^Ve1嫏Rd(iQQHT13ϲ-YO-J 8wCV>DK^~9)ޑdOVpke 7UgJ<3GLbFQTd-)i/_)υWd!vd#K{6H/"#2'噽,Us2%uLl?5K$TYTWC)"}Vd/7Nr..7g'zuŃ7&Bs]pئIߗKQ %V?fJ !$I>'+y4ia>y[\!4>ָ}pY{ZƘ_CjbΪ нb(vi0;d{v1TGZ RsR{O31!kp>ɬ1#'/|r@G_IY=zaK<}^.mqKg!Ap|>D{ĕW4(ꊽ]QIŜyb:X o`R>R/<8 VVxIVuYLOTݳ\Yjzwe 8Bp!rkbI-I1G\%\uĬU`\|W{^* ,cYxYM8D(MCJߖ,+]C93O#U9iB*e1{ o8pܿw%>MɔZQEA%S1BrueYc?*[gB,=/J)7V מ./` yḽIC8Cq2ʿro0)7~uIuu+$ Ӕ鄩oyJ>}2C*|ml%9(6,3gܥ Z WPqR07U`8 [ Y`:!ۇ+!R+k|RA6ˎaͻܑ:Aq HȞ̽|Щ^RS%'&S'Fӊ5}ZDSM@"+K!,*gXR37kEBe)5J-e ^i>@hd+B%jI;(jWNs})[c^0gSoAQRCmdMIQ3SVEY\s_%.4l,:,sD0#֕0Q% ,-oco;A'!E"ǾU 7v;~$;~Lwo%[j&[oj&wur)[U@1T% ̷t_5SRHzq_ r=(Y"۾sU6D-pY]VRŗ&()a]—KZ]OΓ}%T[Kd Y;ߴ췠/.JKU<*?wɲːz{l=1ߙR[ȑ~ɑH_4VgƖ=eo>y²K5JO?FgziMV=S6lsވa+"d{ñWyCW:Km̑Z !w8#v)T oLCF]#NL ڳ?+];DgjCT;Z̘1 ycPaNw2EUhhA1oR1eh(Lq7J,ryM&"bs:?yHK'i%qy_J< Q U•F :RDKn

HE(]K)wi뼙쬁rlse'tv fK1|^^a~.)4+%i3v)TQEX)\ J{>_A)\ 1 yb7 /Dwmw{v#K9'2[9ʎ' krhhkBIX(k7tvoUr2dzU/{v|*>Wy:^r;>*61y.ELeƥAŤ~בC|0(:{[ [j Q (ΑNc(CB KYv O5KCb~/;s,ޠc7(3;Ϩf_4>Q{ow(z%iXxt+Ōb)[@o_pkJ*W.5,C{lH_{ 2P8Oǯ JxΟNqq(b} !; ߟD(aŃ=їP\ebF Fi}|lYrl׀ȸA{6].HPW CʫT`8ʵK`jz4~K8vX8ܫ~O4p'PAV˃NRW]91Q \eO,r躬8/,Ǩc(Kp0X"DZH cxCD(T9>Y%f}3US\Q7r(j›7:W։r==;\%tvq|9ۜPޕѥ(+{Rlu(EXLDǒzSmlQ[}SF^#7=1<|EiQ\lJΌzQ4*Ћw1}>NB #Bi'Z1%׆R&'dh> ڧ+ xOC&=}'WN=m{UWY~CT1]&%Td}g^#/Niofy/.[[\+LDqMsIKk㓡G ׵E(]By{|z/;ٿ뗗+ʱ?o?|q!=G@'!3bq7IRƽlQ5>5;Gua[5G}P1dl4'ŰWo ƳP3>9A C䇴u %$5Hm͑oB^y2r #|=!D!_!EmD l-#o<x[! > G>!䳐KG~ BǑ/F~2g/G~J瑯B<ukD o#߈7#| ȗ"'d%KC>68ѐiC}B:8@Ud'ˍʲga{dGq0t辋oaIegG6RU@T48g - 6HWye5X)?~뎌}q+'n1m(9ip_9(`'U}-VYe]sއuSK١xaq.!*#L+|阃Жݳsz2E71*Tq >;?U%*#@\y!C\6#+"7@$j tF1]DM.9i$cZ1]DSz?!qkF%v r{G rGwF$]c g!o4rkg7F~yW@ E~9Sm?Fخȱ]ϐc=!^ Dy0o!| "cH <$G?B0Q9EE6#/##G?0DaWH{B^kGw * +bӖVyU#%~ /͐_!3eh?о ZU֜PG߃e8okL?w~>uH?dz >C~ۯ! > p|>HA!AoAa?A @@O8.I'p\F,rg$88H qF +G k%"Y2hJp\'n,Dv$9-X8nH"A;qH29CѮ@|(sIrcԃ 8OH`J"G=Ip^Xr'#POl䫑< 9X%$ yCbkQom/!G=J#v (9|7r$P'%PȱI.$ ǿYD&r%PN۵RA*E;tK0_@@v55ˁxˉx9ֳUk䳑A}m 5Ir3ȱc;'>!~(D~ 9c rlW.}%$zMh~ rD%X/ȷ"˝E.E^9 JrW' @@~r,g&rW'L<:Q 99Nr}W#FYXչ|Z.sN\uO9_VƼ?}/`\#+>֤`\?{^?o> Ӷ*_<<1a3Y%=0sL;[i=NۨlFe?faW;9͞--~w}' -/h8+>ybc췋cw(q>ybbbb9mENq3}9mANir>"i 9m ni 9mwEN]#r>n["&i 9 䴽l<98oTl/Rv2kh78OVl/Ql/Rl/C%A;@CvU=q@?D5u%ik',qؾF;ؾybbbbb;rھybk\/.+.+***n*͑uGH"GCbzIchI"G?Ib-r~o$=r$c9K: C 9mwFNݑ;r i{r{"}W䴽9m!i{9ro z&'rK?P9]s?v{?v?;)Pn?VLg?z(PoK?X`:x $-A?0 h߇G<{@r)Wo1o% > dA<^Әh~6i++Ӿ#?8?eOE`=>e,y8>d٫,{u ^ aٛ,{s:ޜ̲7'0䴽7?rھENۗir4rھ' H}Ųf5eoE,{+e cY}i95>OPi(~㫗:RCvN%!Gn1wF=/ϡWy>όx}C;|W!\h%y ǣ>m)!lϋr4o_'eΏ(c1k̹K%=_IOs<$=I=#=XHHWyJ%Mti.](^q>ДgHYV(YGF Xx#}P܎۰8~8h~q~fgρ;xG,ޙŻ8Ο=}ҟ3wc,o\乲{MQsLoN8c5w2{|s0�NX` V̺?uwK&?YGHVzF{?fBr/,>,[,OXܟ>ǰXǒA,̊⡬Y<>#X<GD,Y| Oei,>cX]5L:4X91[9T[zCV]7guSV]7guKV]7amsrruuκL=|uPZL!>nci,344+9ʻ@shZM|'u!MC9m#mlbBC{"Kź/z}'*^k{tUC6?t+;j]g zB~#)G,B+4OuEBn3Agl|c2WeOd#GAvq 9i7+:InVX">rD  .̧o  vJSzKYd ׌z*kcD󻷴S{.խUšhZ8V3Λ:ؼer%}z$oիwVnFc0k(~g{/L?jꇸ_83,s[M<85t1Ŧyut(|mΦn;q\fDžu0ҼY+AKl&iO$hi 8or^wAۆyjUlE',35ڸC!H4k]'H?l~kSOR9VB{F/-T❖9ai.I*@a=yZ{ck܍͊;8}Wƭό]ISO^GCmr4³>D:^]@j)}-͒.t|vS7,e:K^/H}ug#(bi4TR<;fxk5G(֡ S*Lvsnoi6̳g)=>^ZP}˒TwZIZ1Pc2rW.)ͫ𭧤HgIB"EUdUWij8Ŷޖn~N֒LNWE -,ꨙqYLv5&7jmzxU DtT"m !9m3ױVLIzWzTǸʞ5iZaCnA>9254lr,Vm!UtxV׀qh[\Շ̏9~8޳g5Г!?f t5K+Y5ϫCMbǾ>5srYjhL,1˥ 9g^5J/K<-ʝ7SqwcĮ[P7ZzǴDv˻"mNFb!"IԊ[koih=g))ʫkV ٢9XG|yCAZ!Ms뺹uޗv$Sct{d;f$ҡP+Oź.9Jܐ,֘|[SɁr܂*eT2,2;![CtJp4\%a~[Vm[@s|ivk :/[o0e衽pUzy*V-t{u%P:HHKH/9`sUM7/jЬj(rZoD LC-jHք9q])ǚP˧&Tc5N1r!hlFhxhskiVVk^{]c7hH8WѲDl Ck*u45)LʯaV5;?ڷ qYvi?+uEo|_ݨ*іjSG{1EksJ'â-;ϲ w۲9ۺDk:ٷύv^9Wicrg7o|E{a`vӕzNɮ̠hW~sG519nÝ v]4qxqN_ wO%T^֯j[*sS F֋ޙ?>L|a &7GNktY1/Ώ-T04;漤G򵒍捲'^y~7qE/Ϗ~8wTU]ŏٵ=ޛ4y;ן:]MvزS璻ˈ|-ySj(sPay{I_ 5\*[+9IF,L v/}Ʃ./=zJ_O,ԏ^,9\5xqѫep^9^۹S{^,g{;O6~Fk[SG\R}EŤݷ`ho䨹F/?uf?bg&OZ#k^|Ǻ?{'/XGJ~s;y}թ@U:61#~GC '^8tZ3{Cé GfuzhTX5{S'"W:u)tϞ?ޏ}m8QԫS? GDLYnٝg:ωog7OY}C# wL\o={S}爵G:GU5Sv&ۡNoN}ޅߡ9p:=~n$gRX3;%UĪ#m4R=}ý ewmP\!U$O>խ8O$=GBqӬ7яNG Eߟpk;ic%_s7'w N߈1\jfMGwN56QrKɖNÝK1(^"?􆝛>2:֟wL_j/ævfeLM;K#\3n]s3og[{6z|xi:Zc'Wt7&uìZ/aCrO)*:D:3yUkß$_[~ʠ~Zv[QՃm;ͳW2h?- T⧢z3^W>Z+^[{3Y!mNZ&F'V,_{OE?kqǑ?-]1Wn\f`bKiSN {xwYF/1ّ޾#?NM1l勤}ogS>x1`~盱_Ԙ[Ԫ0u7pk|ާ~p{FWzm?jL&L[ݻjd<tFVt3C}S;'\j9$?:g^\tX3MҭwfrgSMW_DiB;ɶu%ݙ&ΘK M_gF.Q>Knj:ʶ QC^\ʵstltn]6Kui\Nۂ5 C~97n~v\Y5;g;wj#uۼ] B&׬>7G\]ka>)? ?:?l#b˓u{:ָİKR޶zs{'؍\صՓGҶM u \vmMoO;4} jm_p]/9fѱ.if?_'"ƍ~?NO9~`v׻nzjaNslni枱ϩ3E> m(;O5]<ǯ))\?WRZl0ŗz;\k{S}4<|&`oYz/֯ф&},[wÂ3g[X)3:;_v}V[m^CN7\Y/N.c[h<=_Z0E–+gtl]wZsޚ6#8'cNUu \ʷ 17xΕAsnry'-llV_r0.jO}wɩu;eTyr7zG=?yՋgfF_'o5h|*Ղɝ=ONksm>pڗ^_"yv"l_-(>ܻU65cjcsv7}~'+zOG&hz w-nٷh~tU׹7PcCN n'}אF,* h'BkpƙӞ{7՘Ϸ;,v8Uc&[u2Fy^qaۖ oaڧ4wt꺾S&.m:VLXr iz~]d6 1i7jK=m-E:?DŽ`I}-ūG>~Z]uNw4myF|O()vuƋ='o6:9QV?͞491$sW x2Ҩqu,|dOm_ZBcx'&mrq6ۼWFu,{Uzlɏ~ 7M}mV_gLN߳Sn=7S[O  |0ۗCRzzoѺF5Z_7MvzC7+{RίUl>V7s3nl Ƅ͙eD NQ/g-yI&A/={Vӿ7Wm}e?,X8"=OXcmsVyPKk2rηEAD=pQ96AC{sp޸ᩏGx͞}/ׅ!ɸ4U73~^wl|NJ>K4bBw_rOd9v}Rr Ywrނ.^.?K=?뙔Akp|k5>{-F^ qo1#l\V!|>'f_[M}{1 Žߵ{G_{P;¬9;/U{znݫVmZp:u#ˆKd h*6tZ?[ۭjv!H?%z22LQivmȨCMa;T0.Coc](ng>5e3Roi1nlWDݕv+{MzW֛-.;I;wnkژ֠^fhqfV+>ϑ-j i=+p󉪓Z6[6C6s}^ntgeYg4ں4HvjUNaoyױ1{ia "/_liKFMoݾGf˛3G<;`gf~&ǵ2}C.U!}ݿr~c\7j\<ylxlq~~O{W-xf,_슊O0g3J#.}⢧Klm'ڞyͰևWvY>idž~/%.v'Vxr ^XvTR!iÇƕSj~c벻7Ypfsbܭ]Vkf"ѝ;xi*릺h}wmͩ^q#?g Oz{uϷ|7i=k}9S7l6[(g߇NX3n>_ ,^y^a潛o>- Bϴrx×~碷4GA#F9]~{u+:wʹivVոNӢ';"nЇ]zʙ!}旌N§xܨ-1Z5/\ZmCAu{/+w6ۣn&r{Km4܆9퉠g~>* + :q϶ZY\|wӜO4u-zqI#wH׾K_7­|ICCsfض_sOyE6xt6YSb'fгA3[`?_<\RAKr6g}w}Nnj;uoNM M6Prʭ>;,ӛ+kV 9Z7?߼Ư.N%Znrϟ??rvQbנ_hlskEKu[3yߞ/i}xzn>:'- \tH=ckLz|5\;mRN/uP/F϶k_*&.4X@Vng[[>x}:yaķgwW-j{]ˮwn^=:{sW~z^%~{Mwn_I ڟ[|yx߿}5; rvڗ_Z{?,g޷AOg}u,p S»,pDΟ ?qwϬZmL>i>2=~Xٺf#uHl{'M'f<3#CMU|HLײ6Ѷ`7,S>39ywj>Ώ=lPBA3__KWԗv_@n9o]./,7&,HqC3޶6r9N99 s\r;Ks)zYf ʔ.Gs{is0e_'Km,FdE4Y-gSRˢ^OLi2xIj] "Z4ٗpiޙsjYb("yi; ^Ou;c -^6K9ļn6|eK]g6ّre] ^d|uyTq_Vْre#S]y8fJׇKX)|tNK?}΢{)U<պڋλHMqWc[I +v6mιCp ~[o { Yf?8I޻? ڟy=u+>b㛄#A,MٍBAE0HoҤ F Jw"i$D s,>o%st t K^p匈&s!ح.W/jTЁ^T5^e; Vyឤ$:P0;#va5 qfl5]v>eӻ̩. Ǘ*@R?aC ޔhi,h,&ˬ18lhVmc|2J8{_0'.OXBi7i iuWE[[y%<ػ|͈P!X1>EZ*cBlPkfvZN/kۦ f h`RE]լ7Y-&31#6 9 rlm-yGȣ)$dJqXX$?z=cd$`pm1m,c:3w4V;3dq¿ÿ9TǮ8z9fmR{iA]AȢ>KP F Ӝhp mC3q] tx8* ۮV` 3\OZxKh~ N*6Ĵp{z; wCZXE ##nCȣqc4F8x5ɦj?:G)Zn1<L[V1sO!>{—m']eVUX=Cj5r 3aVC"PףaV(>G5K\Q{Kn]aOqm:Y9%ns(ЁⳖNinI JzoͰ&[ FkxYo1q30KJ=IFB'h(@bwzժ7;8ޝHO;Fo8cvA]|a8Yό -Ol'3jO2_$Aݜ3ٖD%Tou?hA-TMD[?q@1qz:JP"Q=^v=Ć%QMzY'NUcJ+T/YLF[XYYDUx[ v}5H$\oDr18aÐ"t0,>u:(xvi]X~+ )6uZ1o@^< jxj]?k-c:Z:WG)jyj T )PAOGI4G+gTԜU ^+]ۉ.x7a͒ػbdzoRZ^HPN)-6޶)SwA]J}Q> =Pa{KܲPB9 9ȵ~^U)Hc-/JQ'Ǟ`J [-tc_RU"© =ߜJW=b8]*[2U]]Xw;:&܁hpz=xI* W(ԻYJ\C%SsPC_G'rН,,UxXb{1VW<#WDhRe'WX`H )xZ$5׆)kjދy[a(y4 ;ݯ贫M5*p`XV|IޞG7n-iZZu7w[Rd`t"%Mk ř񤷅Tr|VaVbp![9n_xa|GM(~Ve|ۈ!i|V#ΌR!n\Q^ !OdWoxR'aH=X/_bh*@ka"q13ľ6JE81xi, C [8U"?m?@<"Md sd. BZPM)G iqEMլF\ih} ~kŦ+f_A/fמO'XbxM X bŚX151RA ߰fgcKԆ 1x*QnsBó:mkrټQM alf1c a;Ű?Msw r5U86u&WDj*,_뚌et8&zrH*\HgbdNrNi)Y pfMORt^\־Fo\7&Y.MdEU͗÷{W\17x\\go I/M6\Wr4rv#ytZ ǻzuƑKL nEpx !286%=ᆢl5%`4+s;V'v810b8ŲSx\liei*18܊yUa|8Uĩ*O^0 8"8wȄqx U.T4#R% e9x45j@9Ʌ9x4i ?\s4NC`8lslT,uN%,)֒D%:ַx>tIi02G+aJ&ZTTrv,S; A:\I\r*;@ v’||5ю-㦷 V*ہ:.jy:xBG.vƑ p\E$@5r V%ZJ.y:#z\p$YUTl)bT~ʅ/ť/K_p'%7" /xytq2j l-6_T^9bTr ~}6WK`+8oA,^[jV.6^*ۻͷzw,Aq/8Unqw\f2+:<$r6h@61&<c .._$Y 1}7H;{ iRɀ*mKlȽ=>$%iGH;7>(kSbDߦ:a=HT7)>U@ @Zfs "P+7}Ywubl;}u wQa__٫:\kl~ tPX_׍nQ<X-~|eXQax0pUP;nu5jF/RѰ-'TX;e3}#TaD:EEv)ʛٷ$aa7ޚk VWκ$R;o*}޼ ߮u7A KO *` G[8гMB._eiBP%.ΐPpD~uLa;m[Ѳ}%4kd^UXJ|lW$p]3kxFYA(Զy#[xyb$'AJTiyӖoW@|KqͫVFy5!8@СQ(NM0Ozc=9oE·k+ǁTIlPQl] Cnb>H_CP(] Fwe0^bo7 Qן?~"DԇHTu ZWmƎ x=(\e~.84XŤcT=S*B};}.+gJ,wrՇJT[J۝l{Aq${|Ini_~4UULHq`"jV>2([Pa>y:ČO@kcrģ|lE2XzJF?-y ${65t[0E/wiuqY# ;<ֳʋ}ʵG)"zEpEC{Lt5f<ܼ҈}|n-綕jhZadq2oE/?ol{(@p%]Vcy _ōP4C*I}.ف{Ė7sorP9qЋ“5`o|s+o/(lO욥uYyLX5;u&\#A9g*.M`omU*L(+R[j]rw׵Xv(w`w~}.+>WcyЌG\/H[ɣŌ5O O4uK"r2%밇iK8XqPd`EDχ QE<{Yxoc3_Y{x]Y KSU{u|3 g1 V6py.Sd<ԍ դQHyݒ~E EQkVy?ܾb1o,$$zS5] qo}P/.>s" \f_libb=R:>-#Y9Ê΂}x~ ʜUy޹Kѽ";q_Jm%U锹MU*+= sl}#ʨ"+&rwVP3}'s(~e.烔'k%<}xֽ7FyYxGW^le'9]l|m_)OE>W&hg+ab82F-ϋyV>Y^7GQVZf .]iAg=(a=`pwޅ5A(}kxG֤sZq;:G$lhp8K;ta}\}NWɰB:t_̩ڀt&uPK: PK n5:Ql\((5assets/advertiseUT n_n_n_ WГWГWГ{ "version":"5140", "contents":[ ] }PK n5:Q{B5assets/afrikaans.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("AF", "Afrikaans") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.afrikaansv5 .. "afrikaans_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.afrikaansv5 .. "afrikaans_traits.trt.png" lng.statistic_alias = "afrikaans" lng.categories[si.language.category.FASTSWITCH] = "afrikaans" lng.categories[si.language.category.SUBTYPE] = "afrikaans" lng.categories[si.language.category.MIXINPUT] = "afrikaans" lng.categories[si.language.category.CELLDICT] = "afrikaans" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "afrikaans" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.dictionary = nil lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q/0 $5assets/afrikaans_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() template = "eng_soft_qwerty_international_without_dict" alt_inputs = kb.eng_full_qwerty_alt_international local s = sf.new_full_keyboard( "afrikaans_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q$!dw5assets/afrikaans_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "ā", "æ", "è", "é", "ê", "ë", "ē", "ė", "ę", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "ù", "û", "ü", "ú", "ū", "ñ", "ń", "ý", "ij", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Ā","Æ", "È", "É", "Ê", "Ë", "Ē", "Ė", "Ę", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "Ù", "Û", "Ü", "Ú", "Ū", "Ñ", "Ń", "Ý", "IJ", } local accent_letter_dictionary = { [string.byte("a")] = "äàâáãåāæ", [string.byte("e")] = "èéêëēėę", [string.byte("i")] = "ïîíìīįij", [string.byte("o")] = "öôóòõōœø", [string.byte("u")] = "üùûúū", [string.byte("n")] = "ñń", [string.byte("y")] = "ýij", [string.byte("A")] = "ÀÂÁÃÅÄĀÆ", [string.byte("E")] = "ÈÉÊËĒĖĘ", [string.byte("I")] = "ÏÎÍÌĪĮIJ", [string.byte("O")] = "ÖÔÓÒÕŌŒØ", [string.byte("U")] = "ÜÙÛÚŪ", [string.byte("N")] = "ÑŃ", [string.byte("Y")] = "ÝIJ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q @65assets/albanian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("SQ", "Albanian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.albanianv5 .. "albanian_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.albanianv5 .. "albanian_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.albanianv5 .. "albanian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.albanianv5 .. "albanian_traits.trt.png" lng.statistic_alias = "albanian" lng.categories[si.language.category.FASTSWITCH] = "albanian" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "albanian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "albanian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.albanianv5 .. "albanian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.albanianv5 .. "albanian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.albanianv5 .. "albanian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QDZ%5assets/albanian_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "albanian_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q2> > #5assets/albanian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.sq_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "sq_soft_qwerty_email_uri_international" else template = "sq_soft_qwerty_international" end alt_inputs = kb.sq_full_alt else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "sq_soft_qwerty_curve_international" else template = "sq_soft_qwerty_curve_international" end alt_inputs = kb.sq_full_alt_curve shift_inputs = kb.sq_full_shift end local s = sf.new_full_keyboard( "albanian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q0\\)5assets/albanian_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "albanian_soft_qwerty", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q<5assets/albanian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "ë", "ç", } local special_upper_list = { "Ë", "Ç", } local accent_letter_dictionary = { [string.byte("e")] = "ë", [string.byte("c")] = "ç", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q>+5assets/amharic.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local packagename = pkg.amharicv5 local lng = si.new_language("AM", "Amharic") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.amharicv5 .. "amharic_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.amharicv5 .. "amharic_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.MATH + si.context.PHONE + si.context.NUMBER lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.amharicv5 .. "amharic_traits.trt.png" lng.statistic_alias = "amharic" lng.categories[si.language.category.FASTSWITCH] = "amharic" lng.categories[si.language.category.SUBTYPE] = "amharic" lng.categories[si.language.category.MIXINPUT] = "amharic" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "amharic" lng.categories[si.language.category.LAYOUT] = "amharic" lng.categories[si.language.category.SPEED] = "western" lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_amharic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_amharic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_amharic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_amharic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q}}5assets/arabic.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("AR", "Arabic") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.arabicv5 .. "arabic_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.arabicv5 .. "arabic_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.ARABIC, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.ARABIC, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", currency_type = si.currency_type.ARABIC, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.MATH + si.context.PHONE + si.context.NUMBER lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.arabicv5 .. "arabic_traits.trt.png" lng.statistic_alias = "arabic" lng.categories[si.language.category.FASTSWITCH] = "arabic" lng.categories[si.language.category.SUBTYPE] = "arabic" lng.categories[si.language.category.MIXINPUT] = "arabic" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "arabic" lng.categories[si.language.category.LAYOUT] = "arabic" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.EMOJI] = "arabic" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.arabicv5 .. "arabic.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.arabicv5 .. "arabic_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.arabicv5 .. "arabic_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, --QWERTZ { file_name = pkg.arabicv5 .. "arabic_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QO!5assets/arabic_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_num_row_on = si.is_num_line_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.ar_full_qwerty_main local expand_long_press_inputs = kb.ar_full_qwerty_expand_long_press_input local input_type = si.input_type() if not is_curve_mode then template = "arabic_soft_full_international" else template = "arabic_soft_full_curve_international" if is_num_row_on then shift_inputs = kb.ar_full_shift_curve else shift_inputs = kb.ar_full_shift_curve_num_row_off end end if is_num_row_on then alt_inputs = kb.ar_full_alt expand_long_press_inputs = kb.ar_full_qwerty_expand_long_press_input_num_row_on else alt_inputs = kb.ar_full_alt_curve_num_row_off expand_long_press_inputs = kb.ar_full_qwerty_expand_long_press_input end local s = sf.new_full_keyboard( "arabic_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.language_key_symbol = "،" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function on_long_press(sk) if si.handwrite_mask_visible() then return sk.on_click(sk) end local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local key1 = si.new_softkey() key1.main_title = sk.alt_title key1.main_input = sk.alt_title key1.on_click = function(sk_1) local main_input_len = si.get_string_length(sk_1.main_input) if main_input_len > 1 then si.input_series_precise(sk_1.main_input, "", "", false, 0) else si.input_precise(sk_1.main_input, "", "", false) end end sur.softkeys[1] = key1 si.popup_surface(sur) end local sk_2_5 = s.softkeys["sk_2_5"] sk_2_5.on_long_press_once = on_long_press s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_arabic s.softkeys["Dot"] = ck.sk_dot_arabic s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QR  !5assets/arabic_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_num_row_on = si.is_num_line_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.ar_full_qwerty_main_classic local expand_long_press_inputs local input_type = si.input_type() if is_num_row_on then alt_inputs = kb.ar_full_alt_classic else alt_inputs = kb.ar_full_alt_classic_num_row_off expand_long_press_inputs = kb.ar_full_qwerty_expand_long_press_input_classic end if not is_curve_mode then template = "arabic_soft_full_qwertz_international" else template = "arabic_soft_full_qwertz_curve_international" if is_num_row_on then shift_inputs = kb.ar_full_shift_curve_classic else shift_inputs = kb.ar_full_shift_curve_classic_num_row_off end end local s = sf.new_full_keyboard( "arabic_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.language_key_symbol = "،" s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_arabic s.softkeys["Dot"] = ck.sk_dot_arabic s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QL5assets/arabic_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false traits.right_to_left = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local arabic_characters = { "ء", "آ", "أ", "ؤ", "إ", "ئ", "ا", "ب", "ة", "ت", "ث", "ج", "ح", "خ", "د", "ذ", "ر", "ز", "س", "ش", "ص", "ض", "ط", "ظ", "ع", "غ", "ف", "ڤ", "ق", "ڨ", "ك", "ل", "ﻻ", "م", "ن", "ه", "و", "ى", "ي", "ئ", "إأ","کگ", "پ", "چ", "ژ", "ھ", "گ", "إ", "أ", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "چ" ,"٠" ,"ى", "پ", "ﻻ", "أ", "ث", "گ", "ؤ" } local accent_head = { "ق", "ف", "ه", "ج", "ي", "ب", "ل", "ا", "ت", "ك", "و", } local accent_tail = { "ڨ", "ڤ", "ھ", "چ", "ىئ", "پ", "ﻻ", "أإآء", "ث", "گ", "ؤ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) end function traits.is_input_character(c) for i, v in _G.pairs(arabic_characters) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_output_character(c) local char_code = c if char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else for i, v in _G.pairs(arabic_characters) do if c == si.u16code(v, 1) then return true end end return false end end function traits.is_userword_character(c) return ct.is_arabic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code end return c end function traits.is_case_sensitive_character(c) if c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) for i, v in _G.pairs(accent_head) do if si.u16code(v, 1) == c then return accent_tail[i] end end return nil end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_arabic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_arabic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_arabic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Qc jj5assets/armenian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("AM", "Armenian") local packagename = pkg.armenianv5 if packagename == nil then packagename = "com.cootek.smartinputv5.language.v5.armenian:" end lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.english .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = packagename .. "armenian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = packagename .. "armenian_traits.trt.png" lng.statistic_alias = "armenian" lng.categories[si.language.category.FASTSWITCH] = "armenian" lng.categories[si.language.category.SUBTYPE] = "armenian" lng.categories[si.language.category.MIXINPUT] = "armenian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "armenian" lng.categories[si.language.category.LAYOUT] = "armenian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = nil lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q|" " #5assets/armenian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local ts = si.tri_status local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs = kb.armenian_full_alt local main_inputs = kb.armenian_full_main local input_type = si.input_type() template = "armenian_soft_full_international" alt_inputs = kb.armenian_full_alt local s = sf.new_full_keyboard( "armenian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end local sk_2_3 = s.softkeys["sk_2_3"] sk_2_3.on_long_press_once = function() local status = ts.get_tri_status(ts.CAPSLOCK) if status == ts.NORMAL then ck.show_expand_symbols({"և"}, 1) else ck.show_expand_symbols({"ԵՒ"}, 1) end end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_am s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_armenian s.softkeys["Dot"] = ck.sk_dot_armenian s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QZ5assets/armenian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" require "common_keys" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = si.u16code("ա", 1) local z_code = si.u16code("ֆ", 1) local A_code = si.u16code("Ա", 1) local Z_code = si.u16code("Ֆ", 1) local zero_code = string.byte("0") local nine_code = string.byte("9") local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_armenian_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_armenian_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_armenian_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_armenian_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Q $r5assets/assamese.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("AS", "assamese") local packagename = pkg.assamesev5 lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = packagename .. "assamese_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = packagename .. "assamese_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = packagename .. "assamese_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = packagename .. "assamese_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = packagename .. "assamese_traits.trt.png" lng.statistic_alias = "assamese" lng.categories[si.language.category.FASTSWITCH] = "assamese" lng.categories[si.language.category.SUBTYPE] = "assamese" lng.categories[si.language.category.MIXINPUT] = "assamese" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "assamese" lng.categories[si.language.category.LAYOUT] = "assamese" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = packagename .. "assamese.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q--$5assets/assamese_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs = nil local alt_inputs = kb.assamese_full_alt local main_inputs = kb.assamese_full_main1 local input_type = si.input_type() template = "assamese_soft_full_international" local s = sf.new_full_keyboard( "assamese_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.assamesev5 .. "assamese_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end --process special key function new_expandkey(title) local key = si.new_softkey() key.main_title = title key.main_input = title key.on_click = function () local pi = si.pending_input local ca = si.candidates if not pi.range_exist(pi.L_RANGE_PENDING + pi.L_RANGE_CURVE + pi.L_RANGE_CONFIRM) then local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() end si.input_string(key.main_input, false) end return key end local special_key_list = { {name="sk_3_7", alt_first=true}, {name="sk_3_8", alt_first=true}, } for i=1, #special_key_list do local sk = s.softkeys[special_key_list[i].name] sk.on_click = function() si.input_string(sk.main_input, false) end sk.on_long_press_once = function() local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local firstAlt = special_key_list[i].alt_first if firstAlt == nil or firstAlt == true then sur.softkeys[1] = new_expandkey(sk.alt_input) sur.softkeys[2] = new_expandkey(sk.main_input) else sur.softkeys[1] = new_expandkey(sk.main_input) sur.softkeys[2] = new_expandkey(sk.alt_input) end si.popup_surface(sur) end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q,$5assets/assamese_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs = nil local alt_inputs = kb.assamese_full_alt local main_inputs = kb.assamese_full_main2 local input_type = si.input_type() template = "assamese_soft_full_international" local s = sf.new_full_keyboard( "assamese_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.assamesev5 .. "assamese_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end --process special key function new_expandkey(title) local key = si.new_softkey() key.main_title = title key.main_input = title key.on_click = function () local pi = si.pending_input local ca = si.candidates if not pi.range_exist(pi.L_RANGE_PENDING + pi.L_RANGE_CURVE + pi.L_RANGE_CONFIRM) then local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() end si.input_string(key.main_input, false) end return key end local special_key_list = { {name="sk_2_7", alt_first=true}, {name="sk_3_3", alt_first=true}, {name="sk_3_5", alt_first=true}, {name="sk_3_8", alt_first=true}, {name="sk_3_9", alt_first=false}, } for i=1, #special_key_list do local sk = s.softkeys[special_key_list[i].name] sk.on_click = function() si.input_string(sk.main_input, false) end sk.on_long_press_once = function() local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local firstAlt = special_key_list[i].alt_first if firstAlt == nil or firstAlt == true then sur.softkeys[1] = new_expandkey(sk.alt_input) sur.softkeys[2] = new_expandkey(sk.main_input) else sur.softkeys[1] = new_expandkey(sk.main_input) sur.softkeys[2] = new_expandkey(sk.alt_input) end si.popup_surface(sur) end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q2Ҿrr$5assets/assamese_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.bn_full_azerty_main1 local script_inputs = kb.bn_full_azerty_script1 local expand_long_press_inputs = kb.bn_full_azerty_expand_long_press_input1 local input_type = si.input_type() template = "bengali_soft_full_azerty1_international" local s = sf.new_full_keyboard( "assamese_soft_qwertz1", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.assamesev5 .. "assamese_soft_qwertz2.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "অ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end function on_long_press(sk) if si.handwrite_mask_visible() then return sk.on_click(sk) end local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local key1 = si.new_softkey() if sk.script_title and sk.script_title ~= "" then key1.main_title = sk.script_title key1.main_input = sk.script_title else key1.main_title = sk.main_title key1.main_input = sk.main_title end key1.on_click = function(sk_1) local main_input_len = si.get_string_length(sk_1.main_input) if main_input_len > 1 then si.input_series_precise(sk_1.main_input, "", "", false, 0) else si.input_precise(sk_1.main_input, "", "", false) end end sur.softkeys[1] = key1 si.popup_surface(sur) end local sk_5_7 = s.softkeys["sk_5_7"] sk_5_7.on_long_press_once = on_long_press s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_bengali s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_bengali s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qs@b.$5assets/assamese_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.bn_full_azerty_main2 local script_inputs = kb.bn_full_azerty_script2 local expand_long_press_inputs = kb.bn_full_azerty_expand_long_press_input2 local input_type = si.input_type() template = "bengali_soft_full_azerty2_international" local s = sf.new_full_keyboard( "assamese_soft_qwertz2", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.assamesev5 .. "assamese_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "অ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end for j = 1, 10 do local sk = s.softkeys["sk_" .. 1 .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end for j = 2, 7 do local sk = s.softkeys["sk_" .. 5 .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end local sk_2_1 = s.softkeys["sk_2_1"] sk_2_1.on_click = full_on_click sk_2_1.support_expand_char_type = si.expand_char_type.EXPAND_INPUT local sk_2_2 = s.softkeys["sk_2_2"] sk_2_2.on_click = full_on_click sk_2_2.support_expand_char_type = si.expand_char_type.EXPAND_INPUT function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end for i = 3, 4 do for j = 1, 10 do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click_commit end end for j = 3, 10 do local sk = s.softkeys["sk_" .. 2 .. "_" .. j] sk.on_click = full_on_click_commit end local sk_5_1 = s.softkeys["sk_5_1"] sk_5_1.on_click = full_on_click_commit function on_long_press(sk) if si.handwrite_mask_visible() then return sk.on_click(sk) end local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local key1 = si.new_softkey() if sk.script_title and sk.script_title ~= "" then key1.main_title = sk.script_title key1.main_input = sk.script_title else key1.main_title = sk.main_title key1.main_input = sk.main_title end key1.on_click = function(sk_1) local main_input_len = si.get_string_length(sk_1.main_input) if main_input_len > 1 then si.input_series_precise(sk_1.main_input, "", "", false, 0) else si.input_precise(sk_1.main_input, "", "", false) end end sur.softkeys[1] = key1 si.popup_surface(sur) end local sk_5_7 = s.softkeys["sk_5_7"] sk_5_7.on_long_press_once = on_long_press s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_bengali s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_bengali s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q_//5assets/assamese_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0980 local z_code = 0x09ff local A_code = 0x0980 local Z_code = 0x09ff local zero_code = 0x09e6 local nine_code = 0x09eF local dot_code = si.u16code("।", 1) local special_semivowel_code = si.u16code("্", 1) local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("।", 1)] = "।", } local special_vowel_list = { "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ", "ৃ", "অ", "আ", "ই", "ঈ", "উ", "ঊ", "এ", "ঐ", "ও", "ঔ", "ঋ", } local special_semivowel_list = { "্", } local special_tone_list = { "ঃ", "ং", "়", "ঁ", } local special_consonant_list = { "ক", "খ", "গ", "ঘ", "ঙ", "চ", "ছ", "জ", "ঝ", "ঞ", "ট", "ঠ", "ড", "ঢ", "ণ", "ত", "থ", "দ", "ধ", "ন", "প", "ফ", "ব", "ভ", "ম", "য", "র", "ল", "শ", "ষ", "স", "হ", "ড়", "ঢ়", "য়", } local special_attach_list = { "্", "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ", "ৃ", "ঃ", "ং", "়", "ঁ", } local special_script_list = { "্", "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ", "ঃ", "ং", "়", "ঁ", "ৃ", } local special_script_dictionary = { [si.u16code("্", 1)] = "অ", [si.u16code("া", 1)] = "আ", [si.u16code("ি", 1)] = "ই", [si.u16code("ী", 1)] = "ঈ", [si.u16code("ু", 1)] = "উ", [si.u16code("ূ", 1)] = "ঊ", [si.u16code("ে", 1)] = "এ", [si.u16code("ৈ", 1)] = "ঐ", [si.u16code("ো", 1)] = "ও", [si.u16code("ৌ", 1)] = "ঔ", [si.u16code("ঃ", 1)] = "ঃ", [si.u16code("ং", 1)] = "ং", [si.u16code("়", 1)] = "়", [si.u16code("ঁ", 1)] = "ঁ", [si.u16code("ৃ", 1)] = "ঋ", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif not traits.is_special_attach_case(code) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_last_series_input_special_group_case() then return traits.get_normal_script_main_character(script) elseif traits.is_special_semivowel_case(code) and traits.is_contain_multi_case(last_series_precise_input) then return last_series_precise_input else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(5) if not si.is_empty(last_text_from_user_input) then if traits.is_contain_triple_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local string_len = si.get_string_length(last_text_from_user_input) if string_len > 3 then last_text_from_user_input = _G.string.sub(last_text_from_user_input, string_len-2, string_len) end if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.get_normal_script_main_character(script) local string_len = si.get_string_length(script) if string_len > 1 then return script end local code = si.u16code(script, 1) if traits.is_special_script_case(code) then return special_script_dictionary[code] end return script; end function traits.is_contain_vowel_tone_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true elseif traits.is_special_tone_case(c) then return true end end return false end function traits.is_special_group_case(str) if si.is_empty(str) then return false end if str == "্য" then return true end return false end function traits.is_last_series_input_special_group_case() local precise_input = pi.get_last_series_precise_input() if not si.is_empty(precise_input) then local str_size = si.get_string_length(precise_input) if str_size < 2 then return false end local code_1 = si.u16code(precise_input, str_size) local code_2 = si.u16code(precise_input, str_size - 1) if code_1 == si.u16code("য", 1) and code_2 == special_semivowel_code then return true end end return false end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if code_se == special_semivowel_code and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_triple_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 5 then return false end local code_se = si.u16code(str, 2) local code_fo = si.u16code(str, 4) if code_se == special_semivowel_code and code_fo == special_semivowel_code then local code_fr = si.u16code(str, 1) local code_th = si.u16code(str, 3) local code_fi = si.u16code(str, 5) if traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) and traits.is_special_consonant_case(code_fi) then return true end return false end return false end function traits.is_contain_multi_case(str) local str_size = si.get_string_length(str) if str_size >= 2 then return true end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_tone_case(c) for i, v in ipairs(special_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_script_case(c) for i, v in ipairs(special_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_attach_case(c) for i, v in ipairs(special_attach_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if c == dot_code then return false end if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) if c == dot_code then return false end local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) if c == dot_code then return false end return ct.is_assamese_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) if c == dot_code then return false end return ct.is_assamese_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) if c == dot_code then return false end return ct.is_assamese_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_assamese_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_punctuation_character(c) if c == dot_code then return true end return false end return traits PK n5:QD5assets/azerbaijani.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("AZ", "Azerbaijani") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.azerbaijaniv5 .. "azerbaijani_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.azerbaijaniv5 .. "azerbaijani_traits.trt.png" lng.statistic_alias = "azerbaijani" lng.categories[si.language.category.FASTSWITCH] = "azerbaijani" lng.categories[si.language.category.SUBTYPE] = "azerbaijani" lng.categories[si.language.category.MIXINPUT] = "azerbaijani" lng.categories[si.language.category.CELLDICT] = "azerbaijani" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "azerbaijani" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = nil lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q-* &5assets/azerbaijani_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local ts = si.tri_status local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "azerbaijani_soft_full_international" local alt_inputs = kb.az_full_alt local shift_inputs local main_inputs = kb.az_full_main local input_type = si.input_type() local s = sf.new_full_keyboard( "azerbaijani_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QLçXX!5assets/azerbaijani_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local special_lower_list = { "á", "è", "é", "ê", "ë", "î", "ï", "í", "i", "ô", "ó", "ö", "û", "ü", "ğ", "ý", "ı", "ə", "ç", "ş", } local special_upper_list = { "Á", "È", "É", "Ê", "Ë", "Î", "Ï", "Í", "İ", "Ô", "Ó", "Ö", "Û", "Ü", "Ğ", "Ý", "I", "Ə", "Ç", "Ş", } local accent_dictionary = { [string.byte("a")] = "á", [string.byte("e")] = "ëèéê", [string.byte("g")] = "ğ", [string.byte("s")] = "ş", [string.byte("i")] = "îïí", [string.byte("o")] = "ôó", [string.byte("u")] = "û", [string.byte("y")] = "ý", [string.byte("A")] = "Á", [string.byte("E")] = "ËÈÉÊ", [string.byte("G")] = "Ğ", [string.byte("S")] = "Ş", [string.byte("İ")] = "ÎÏÍ", [string.byte("O")] = "ÔÓ", [string.byte("U")] = "Û", [string.byte("Y")] = "Ý", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end --special for turkish function traits.to_upper_case(c) if c ~= string.byte("i") and c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Qp5assets/basque.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("EU", "Basque") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.basquev5 .. "basque_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.basquev5 .. "basque_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.basquev5 .. "basque_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.basquev5 .. "basque_traits.trt.png" lng.statistic_alias = "basque" lng.categories[si.language.category.FASTSWITCH] = "basque" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "basque" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "basque" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.basquev5 .. "basque.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.basquev5 .. "basque_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.basquev5 .. "basque_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q]hu#5assets/basque_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "basque_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QL !5assets/basque_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.esp_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "basque_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QO))'5assets/basque_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "basque_soft_qwerty", kb.esp_tplus_qwerty_left, kb.esp_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q35assets/basque_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "ñ", "ç", } local special_upper_list = { "Ñ", "Ç", } local accent_letter_dictionary = { [string.byte("c")] = "ç", [string.byte("n")] = "ñ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Qf::5assets/belarusian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("BE", "Belarusian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, { surface_id = pkg.belarusianv5 .. "belarusian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.belarusianv5 .. "belarusian_traits.trt.png" lng.statistic_alias = "belarusian" lng.categories[si.language.category.FASTSWITCH] = "belarusian" lng.categories[si.language.category.SUBTYPE] = "belarusian" lng.categories[si.language.category.MIXINPUT] = "belarusian" lng.categories[si.language.category.CELLDICT] = "belarusian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "belarusian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = nil lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q3  b b %5assets/belarusian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs local alt_inputs = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "%", }, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€",}, {"@", "/", "-", "'", "!", "?", ";", "`", "÷"}, } local main_inputs = { {"й", "ц", "у", "к", "е", "н", "г", "ш", "ў", "з", "х",}, {"ф", "ы", "в", "а", "п", "р", "о", "л", "д", "ж", "э",}, {"я", "ч", "с", "м", "і", "т", "ь", "б", "ю",}, } local input_type = si.input_type() template = "belarusian_soft_full_international" local s = sf.new_full_keyboard( "belarusian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = false s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q511 5assets/belarusian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = si.u16code("а", 1) local z_code = si.u16code("я", 1) local A_code = si.u16code("А", 1) local Z_code = si.u16code("Я", 1) local case_insensitive_letters = { } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { "і", "ў", "ё", } local special_upper_list = { "І", "Ў", "Ё", } local accent_letter_dictionary = { [si.u16code("е", 1)] = "ё", [si.u16code("Е", 1)] = "Ё", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_cyrillic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QB/ MM5assets/bengali.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("BN", "Bengali") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.bengaliv5 .. "bengali_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.bengaliv5 .. "bengali_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.bengaliv5 .. "bengali_probhat_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.bengaliv5 .. "bengali_probhat_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.bengaliv5 .. "bengali_soft_azerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.bengaliv5 .. "bengali_soft_azerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.bengaliv5 .. "bengali_traits.trt.png" lng.statistic_alias = "bengali" lng.categories[si.language.category.FASTSWITCH] = "bengali" lng.categories[si.language.category.SUBTYPE] = "bengali" lng.categories[si.language.category.MIXINPUT] = "bengali" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "bengali" lng.categories[si.language.category.LAYOUT] = "bengali" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.bengaliv5 .. "bengali.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QEz9 9 +5assets/bengali_probhat_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template = "bengali_probhat_soft_full_international" local alt_inputs = kb.bn_probhat_full_alt local shift_inputs local main_inputs = kb.bn_probhat_full_main1 local expand_long_press_inputs = kb.bn_full_qwerty_expand_long_press_input_with_probhat_full_main2 local input_type = si.input_type() local s = sf.new_full_keyboard( "bengali_probhat_soft_qwertz1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.match_surface = pkg.bengaliv5 .. "bengali_probhat_soft_qwertz2.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_bn s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_bn_probhat s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_bn_probhat_dot"] = ck.sk_bn_probhat_dot s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q(8X X +5assets/bengali_probhat_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template = "bengali_probhat_soft_full_international_shift" local alt_inputs = kb.bn_probhat_full_alt local shift_inputs local main_inputs = kb.bn_probhat_full_main2 local expand_long_press_inputs = kb.bn_full_qwerty_expand_long_press_input local input_type = si.input_type() local s = sf.new_full_keyboard( "bengali_probhat_soft_qwertz2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.match_surface = pkg.bengaliv5 .. "bengali_probhat_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_bn s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_bn_probhat s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_bengali s.softkeys["sk_bn_probhat_dot"] = ck.sk_bn_probhat_dot_sp s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q}>5..#5assets/bengali_soft_azerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.bn_full_azerty_main1 local script_inputs = kb.bn_full_azerty_script1 local expand_long_press_inputs = kb.bn_full_azerty_expand_long_press_input1 local input_type = si.input_type() template = "bengali_soft_full_azerty1_international" local s = sf.new_full_keyboard( "bengali_soft_azerty", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.bengaliv5 .. "bengali_soft_azerty2.sur.png" s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "অ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end function on_long_press(sk) if si.handwrite_mask_visible() then return sk.on_click(sk) end local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local key1 = si.new_softkey() if sk.script_title and sk.script_title ~= "" then key1.main_title = sk.script_title key1.main_input = sk.script_title else key1.main_title = sk.main_title key1.main_input = sk.main_title end key1.on_click = function(sk_1) local main_input_len = si.get_string_length(sk_1.main_input) if main_input_len > 1 then si.input_series_precise(sk_1.main_input, "", "", false, 0) else si.input_precise(sk_1.main_input, "", "", false) end end sur.softkeys[1] = key1 si.popup_surface(sur) end local sk_5_7 = s.softkeys["sk_5_7"] sk_5_7.on_long_press_once = on_long_press s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_bengali s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_bengali s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qa캫#5assets/bengali_soft_azerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.bn_full_azerty_main2 local script_inputs = kb.bn_full_azerty_script2 local expand_long_press_inputs = kb.bn_full_azerty_expand_long_press_input2 local input_type = si.input_type() template = "bengali_soft_full_azerty2_international" local s = sf.new_full_keyboard( "bengali_soft_azerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.bengaliv5 .. "bengali_soft_azerty1.sur.png" s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "অ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end for j = 1, 10 do local sk = s.softkeys["sk_" .. 1 .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end for j = 2, 7 do local sk = s.softkeys["sk_" .. 5 .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end local sk_2_1 = s.softkeys["sk_2_1"] sk_2_1.on_click = full_on_click sk_2_1.support_expand_char_type = si.expand_char_type.EXPAND_INPUT local sk_2_2 = s.softkeys["sk_2_2"] sk_2_2.on_click = full_on_click sk_2_2.support_expand_char_type = si.expand_char_type.EXPAND_INPUT function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end for i = 3, 4 do for j = 1, 10 do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click_commit end end for j = 3, 10 do local sk = s.softkeys["sk_" .. 2 .. "_" .. j] sk.on_click = full_on_click_commit end local sk_5_1 = s.softkeys["sk_5_1"] sk_5_1.on_click = full_on_click_commit function on_long_press(sk) if si.handwrite_mask_visible() then return sk.on_click(sk) end local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local key1 = si.new_softkey() if sk.script_title and sk.script_title ~= "" then key1.main_title = sk.script_title key1.main_input = sk.script_title else key1.main_title = sk.main_title key1.main_input = sk.main_title end key1.on_click = function(sk_1) local main_input_len = si.get_string_length(sk_1.main_input) if main_input_len > 1 then si.input_series_precise(sk_1.main_input, "", "", false, 0) else si.input_precise(sk_1.main_input, "", "", false) end end sur.softkeys[1] = key1 si.popup_surface(sur) end local sk_5_7 = s.softkeys["sk_5_7"] sk_5_7.on_long_press_once = on_long_press s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_bengali s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_bengali s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QO() #5assets/bengali_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.bn_full_main1 local expand_long_press_inputs = kb.bn_full_qwerty_expand_long_press_input_full_main1 local input_type = si.input_type() template = "bn_soft_full_international1" alt_inputs = kb.bn_full_alt local s = sf.new_full_keyboard( "bengali_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.match_surface = pkg.bengaliv5 .. "bengali_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_bn s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_bn s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_bengali s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QS%  #5assets/bengali_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.bn_full_main2 local input_type = si.input_type() template = "bn_soft_full_international2" alt_inputs = kb.bn_full_alt local expand_long_press_inputs = kb.bn_full_qwerty_expand_long_press_input_full_main2 local s = sf.new_full_keyboard( "bengali_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.match_surface = pkg.bengaliv5 .. "bengali_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_bn s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_bn s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwj"] = ck.sk_zwj_zwnj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q005assets/bengali_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0981 local z_code = 0x09fb local A_code = 0x0981 local Z_code = 0x09fb local dot_code = si.u16code("।", 1) local special_semivowel_code = si.u16code("্", 1) local special_lower_list = { "ৌ", "ৈ", "া", "ৗ", "ৃ", "ব", "হ", "গ", "দ", "জ", "ড", "়", "ো", "ে", "্", "ি", "ু", "প", "র", "ক", "ত", "চ", "ট", "ং", "ম", "ন", "ঽ", "ল", "স", "য", "ষ", "ঃ", "ঔ", "ঐ", "আ", "ঈ", "ঊ", "ভ", "ঙ", "য", "ধ", "ঝ", "ঢ", "ঞ", "ও", "এ", "অ", "ই", "উ", "ফ", "র", "ক", "থ", "ছ", "ঠ", "ঁ", "ণ", "ন", "ঽ", "ল", "শ", "য়", "ষ", "ঃ", } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("।", 1)] = "।", } local special_vowel_list = { "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ", "ৃ", "অ", "আ", "ই", "ঈ", "উ", "ঊ", "এ", "ঐ", "ও", "ঔ", "ঋ", } local special_semivowel_list = { "্", } local special_tone_list = { "ঃ", "ং", "়", "ঁ", } local special_consonant_list = { "ক", "খ", "গ", "ঘ", "ঙ", "চ", "ছ", "জ", "ঝ", "ঞ", "ট", "ঠ", "ড", "ঢ", "ণ", "ত", "থ", "দ", "ধ", "ন", "প", "ফ", "ব", "ভ", "ম", "য", "র", "ল", "শ", "ষ", "স", "হ", "ড়", "ঢ়", "য়", } local special_attach_list = { "্", "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ", "ৃ", "ঃ", "ং", "়", "ঁ", } local special_script_list = { "্", "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ", "ঃ", "ং", "়", "ঁ", "ৃ", } local special_script_dictionary = { [si.u16code("্", 1)] = "অ", [si.u16code("া", 1)] = "আ", [si.u16code("ি", 1)] = "ই", [si.u16code("ী", 1)] = "ঈ", [si.u16code("ু", 1)] = "উ", [si.u16code("ূ", 1)] = "ঊ", [si.u16code("ে", 1)] = "এ", [si.u16code("ৈ", 1)] = "ঐ", [si.u16code("ো", 1)] = "ও", [si.u16code("ৌ", 1)] = "ঔ", [si.u16code("ঃ", 1)] = "ঃ", [si.u16code("ং", 1)] = "ং", [si.u16code("়", 1)] = "়", [si.u16code("ঁ", 1)] = "ঁ", [si.u16code("ৃ", 1)] = "ঋ", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif not traits.is_special_attach_case(code) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_last_series_input_special_group_case() then return traits.get_normal_script_main_character(script) elseif traits.is_special_semivowel_case(code) and traits.is_contain_multi_case(last_series_precise_input) then return last_series_precise_input else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(5) if not si.is_empty(last_text_from_user_input) then if traits.is_contain_triple_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local string_len = si.get_string_length(last_text_from_user_input) if string_len > 3 then last_text_from_user_input = _G.string.sub(last_text_from_user_input, string_len-2, string_len) end if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.get_normal_script_main_character(script) local string_len = si.get_string_length(script) if string_len > 1 then return script end local code = si.u16code(script, 1) if traits.is_special_script_case(code) then return special_script_dictionary[code] end return script; end function traits.is_contain_vowel_tone_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true elseif traits.is_special_tone_case(c) then return true end end return false end function traits.is_special_group_case(str) if si.is_empty(str) then return false end if str == "্য" then return true end return false end function traits.is_last_series_input_special_group_case() local precise_input = pi.get_last_series_precise_input() if not si.is_empty(precise_input) then local str_size = si.get_string_length(precise_input) if str_size < 2 then return false end local code_1 = si.u16code(precise_input, str_size) local code_2 = si.u16code(precise_input, str_size - 1) if code_1 == si.u16code("য", 1) and code_2 == special_semivowel_code then return true end end return false end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if code_se == special_semivowel_code and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_triple_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 5 then return false end local code_se = si.u16code(str, 2) local code_fo = si.u16code(str, 4) if code_se == special_semivowel_code and code_fo == special_semivowel_code then local code_fr = si.u16code(str, 1) local code_th = si.u16code(str, 3) local code_fi = si.u16code(str, 5) if traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) and traits.is_special_consonant_case(code_fi) then return true end return false end return false end function traits.is_contain_multi_case(str) local str_size = si.get_string_length(str) if str_size >= 2 then return true end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_tone_case(c) for i, v in ipairs(special_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_script_case(c) for i, v in ipairs(special_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_attach_case(c) for i, v in ipairs(special_attach_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if c == dot_code then return false end if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) if c == dot_code then return false end local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) if c == dot_code then return false end return ct.is_bengali_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) if c == dot_code then return false end return ct.is_bengali_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) if c == dot_code then return false end return ct.is_bengali_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_bengali_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_punctuation_character(c) if c == si.u16code("।", 1) then return true end return false end return traits PK n5:QFT*5assets/bit.lua.pngUT n_n_n_ WГWГWГbit={data32={}} for i=1,32 do bit.data32[i]=2^(32-i) end function bit:d2b(arg) local tr={} for i=1,32 do if arg >= self.data32[i] then tr[i]=1 arg=arg-self.data32[i] else tr[i]=0 end end return tr end --bit:d2b function bit:b2d(arg) local nr=0 for i=1,32 do if arg[i] ==1 then nr=nr+2^(32-i) end end return nr end --bit:b2d function bit:_xor(a,b) local op1=self:d2b(a) local op2=self:d2b(b) local r={} for i=1,32 do if op1[i]==op2[i] then r[i]=0 else r[i]=1 end end return self:b2d(r) end --bit:xor function bit:_and(a,b) local op1=self:d2b(a) local op2=self:d2b(b) local r={} for i=1,32 do if op1[i]==1 and op2[i]==1 then r[i]=1 else r[i]=0 end end return self:b2d(r) end --bit:_and function bit:_or(a,b) local op1=self:d2b(a) local op2=self:d2b(b) local r={} for i=1,32 do if op1[i]==1 or op2[i]==1 then r[i]=1 else r[i]=0 end end return self:b2d(r) end --bit:_or function bit:_not(a) local op1=self:d2b(a) local r={} for i=1,32 do if op1[i]==1 then r[i]=0 else r[i]=1 end end return self:b2d(r) end --bit:_not function bit:_rshift(a,n) local op1=self:d2b(a) local r=self:d2b(0) if n < 32 and n > 0 then for i=1,n do for i=31,1,-1 do op1[i+1]=op1[i] end op1[1]=0 end r=op1 end return self:b2d(r) end --bit:_rshift function bit:_lshift(a,n) local op1=self:d2b(a) local r=self:d2b(0) if n < 32 and n > 0 then for i=1,n do for i=1,31 do op1[i]=op1[i+1] end op1[32]=0 end r=op1 end return self:b2d(r) end --bit:_lshift function bit:print(ta) local sr="" for i=1,32 do sr=sr..ta[i] end print(sr) end PK n5:Qvee5assets/bosnian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("BS", "Bosnian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.bosnianv5 .. "bosnian_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.bosnianv5 .. "bosnian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.bosnianv5 .. "bosnian_traits.trt.png" lng.statistic_alias = "bosnian" lng.categories[si.language.category.FASTSWITCH] = "bosnian" lng.categories[si.language.category.SUBTYPE] = "bosnian" lng.categories[si.language.category.MIXINPUT] = "bosnian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "bosnian" lng.categories[si.language.category.LAYOUT] = "bosnian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.bosnianv5 .. "bosnian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.bosnianv5 .. "bosnian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.bosnianv5 .. "bosnian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qx3 "5assets/bosnian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.serbian_full_main local input_type = si.input_type() if not is_curve_mode then template = "serbian_soft_full_international" alt_inputs = kb.serbian_full_alt else template = "serbian_soft_full_curve_international" alt_inputs = kb.serbian_alt_curve shift_inputs = kb.serbian_curve_shift end local s = sf.new_full_keyboard( "bosnian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QO(5assets/bosnian_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "bosnian_soft_qwerty", kb.serbian_tplus_left, kb.serbian_tplus_right, kb.serbian_tplus_alt, si.TITLE_CASE.CHANGE, 3) s.template = "bulgarian_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q5assets/bosnian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = si.u16code("а", 1) local z_code = si.u16code("я", 1) local A_code = si.u16code("А", 1) local Z_code = si.u16code("Я", 1) local special_lower_list = { "љ", "њ", "ј", "ћ", "ѕ", "џ", "ђ", } local special_upper_list = { "Љ", "Њ", "Ј", "Ћ", "Ѕ", "Џ", "Ђ", } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_cyrillic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:QҔ5assets/bosnianlatin.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("BS", "Bosnianlatin") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.bosnianlatinv5 .. "bosnianlatin_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.bosnianlatinv5 .. "bosnianlatin_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.bosnianlatinv5 .. "bosnianlatin_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.bosnianlatinv5 .. "bosnianlatin_traits.trt.png" lng.statistic_alias = "bosnianlatin" lng.categories[si.language.category.FASTSWITCH] = "bosnian" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "bosnianlatin" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "bosnianlatin" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.bosnianlatinv5 .. "bosnianlatin.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.bosnianlatinv5 .. "bosnianlatin_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.bosnianlatinv5 .. "bosnianlatin_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qh )5assets/bosnianlatin_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "bosnianlatin_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q5Ir r '5assets/bosnianlatin_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.se_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "serbianlatin_soft_full_email_uri_international" else template = "serbianlatin_soft_full_international" end alt_inputs = kb.se_full_alt else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "serbianlatin_soft_full_email_uri_curve_international" else template = "serbianlatin_soft_full_curve_international" end alt_inputs = kb.se_full_alt_curve shift_inputs = kb.se_full_shift_curve end local s = sf.new_full_keyboard( "bosnianlatin_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qpff-5assets/bosnianlatin_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "bosnianlatin_soft_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qv"5assets/bosnianlatin_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "č", "ç", "ć", "đ", "š", "ś", "ß", "ş", "ž", "ź", "ż", } local special_upper_list = { "Č", "Ç", "Ć", "Đ", "Š", "Ś", "ß", "Ş", "Ž", "Ź", "Ż", } local accent_letter_dictionary = { [string.byte("c")] = "čçć", [string.byte("d")] = "đ", [string.byte("s")] = "šśşß", [string.byte("z")] = "žźż", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QU䅉5assets/bulgarian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("BG", "Bulgarian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.bulgarianv5 .. "bulgarian_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.bulgarianv5 .. "bulgarian_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.bulgarianv5 .. "bulgarian_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.bulgarianv5 .. "bulgarian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.bulgarianv5 .. "bulgarian_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.MATH + si.context.PHONE + si.context.NUMBER lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.bulgarianv5 .. "bulgarian_traits.trt.png" lng.statistic_alias = "bulgarian" lng.categories[si.language.category.FASTSWITCH] = "bulgarian" lng.categories[si.language.category.SUBTYPE] = "bulgarian" lng.categories[si.language.category.MIXINPUT] = "bulgarian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "russian" lng.categories[si.language.category.LAYOUT] = "bulgarian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.bulgarianv5 .. "bulgarian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.bulgarianv5 .. "bulgarian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.bulgarianv5 .. "bulgarian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.bulgarianv5 .. "bulgarian_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QRi&5assets/bulgarian_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "bulgarian_soft_phonepad", kb.bul_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qj $5assets/bulgarian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.bul_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then template = "bulgarian_soft_full_international" alt_inputs = kb.bul_full_alt else template = "bulgarian_soft_full_curve_international" alt_inputs = kb.bul_full_alt_curve shift_inputs = kb.bul_full_shift_curve end local s = sf.new_full_keyboard( "bulgarian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q.  $5assets/bulgarian_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.bul_full_qwertz_main local input_type = si.input_type() if not is_curve_mode then template = "bulgarian_soft_full_qwertz_international" alt_inputs = kb.bul_full_qwertz_alt else template = "bulgarian_soft_full_qwertz_curve_international" alt_inputs = kb.bul_full_qwertz_alt_curve shift_inputs = kb.bul_full_qwertz_alt_curve_shift end local s = sf.new_full_keyboard( "bulgarian_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QO#5assets/bulgarian_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "bulgarian_soft_tplus", kb.bul_tplus_left, kb.bul_tplus_right, kb.bul_tplus_alt, si.TITLE_CASE.CHANGE, 3) s.template = "bulgarian_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qk*5assets/bulgarian_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "bulgarian_soft_tplus_qwertz", kb.bul_tplus_qwertz_left, kb.bul_tplus_qwertz_right, kb.bul_tplus_qwertz_alt, si.TITLE_CASE.CHANGE, 3) s.template = "bulgarian_soft_tplus_qwertz_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_1_1"].on_click = function(sk) si.input_precise(sk.left_input, "", sk.alt_input, si.is_shift_pressed()) end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q&5assets/bulgarian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = si.u16code("а", 1) local r_code = si.u16code("я", 1) local A_code = si.u16code("А", 1) local R_code = si.u16code("Я", 1) local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= R_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= r_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= r_code then return true elseif char_code >= A_code and char_code <= R_code then return true else return false end end function traits.is_userword_character(c) return ct.is_cyrillic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= r_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= R_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= r_code then return true elseif c >= A_code and c <= R_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:QY5assets/burmese.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("MY", "Burmese") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.burmesev5 .. "burmese_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.burmesev5 .. "burmese_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.burmesev5 .. "burmese_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.burmesev5 .. "burmese_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.burmesev5 .. "burmese_traits.trt.png" lng.statistic_alias = "burmese" lng.categories[si.language.category.FASTSWITCH] = "burmese" lng.categories[si.language.category.SUBTYPE] = "burmese" lng.categories[si.language.category.MIXINPUT] = "burmese" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "burmese" lng.categories[si.language.category.LAYOUT] = "burmese" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.burmesev5 .. "burmese.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q6M M #5assets/burmese_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.my_full_main1 local input_type = si.input_type() template = "my_soft_qwerty_international" local s = sf.new_full_keyboard( "burmese_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty1" s.match_surface = pkg.burmesev5 .. "burmese_soft_qwerty2.sur.png" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_burmese s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q2G‘L L #5assets/burmese_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.my_full_main2 local input_type = si.input_type() template = "my_soft_qwerty_international" local s = sf.new_full_keyboard( "burmese_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty2" s.match_surface = pkg.burmesev5 .. "burmese_soft_qwerty1.sur.png" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_burmese s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QV{ #5assets/burmese_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template = "my_soft_qwertz_international" local alt_inputs local shift_inputs local main_inputs = kb.my_full_qz_main1 local input_type = si.input_type() local expand_long_press_inputs = kb.my_full_qz_alt_expand_long_press_inputs local s = sf.new_full_keyboard( "burmese_soft_qwertz1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.statistic_alias = "qwertz1" s.match_surface = pkg.burmesev5 .. "burmese_soft_qwertz2.sur.png" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_zawgyi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_my s.softkeys["Dot"] = ck.sk_dot_my s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QEyC C #5assets/burmese_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template = "my_soft_qwertz_international" local alt_inputs local shift_inputs local main_inputs = kb.my_full_qz_main2 local input_type = si.input_type() local s = sf.new_full_keyboard( "burmese_soft_qwertz2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty2" s.match_surface = pkg.burmesev5 .. "burmese_soft_qwertz1.sur.png" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_zawgyi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_my s.softkeys["Dot"] = ck.sk_dot_my s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q%<5assets/burmese_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = si.u16code("က", 1) local z_code = si.u16code("က", 1) local A_code = si.u16code("က", 1) local Z_code = si.u16code("က", 1) local dot_code = si.u16code("။", 1) local special_lower_list = { "က", "ခ", "ဂ", "ဃ", "င", "စ", "ဆ", "ဇ", "ဈ", "ဉ", "ည", "ဋ", "ဌ", "ဍ", "ဎ", "ဏ", "တ", "ထ", "ဒ", "ဓ", "န", "ပ", "ဖ", "ဗ", "ဘ", "မ", "ယ", "ရ", "လ", "ဝ", "သ", "ဟ", "ဠ", "အ", "ဢ", "ဣ", "ဤ", "၀", "၁", "၂", "၃", "၄", "၅", "၆", "၇", "၈", "၉", "ဥ", "ဦ", "ဧ", "ဨ", "ဩ", "ဪ", "ါ", "ာ", "ိ", "ီ", "ု", "ူ", "ေ", "ဲ", "ဳ", "ဴ", "ဵ", "ံ", "့", "း", "္", "်", "ျ", "ြ", "ွ", "ှ", "ဿ", } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("။", 1)] = "။", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if c == dot_code then return false end if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) if c == dot_code then return false end local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) if c == dot_code then return false end return ct.is_burmese_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) if c == dot_code then return false end return ct.is_burmese_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) if c == dot_code then return false end return ct.is_burmese_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_burmese_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_punctuation_character(c) if c == si.u16code("။", 1) then return true end return false end return traits PK n5:Q8z "5assets/cangjie_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local sk_main_inputs = kb.cangjie_qwerty_main local s = sf.new_full_keyboard( "cangjie_soft_qwerty", sk_main_inputs, nil, nil, false, si.TITLE_CASE.NO_CHANGE, 0) if si.is_international_version() then s.template = "cangjie_soft_full_international" else s.template = "cangjie_soft_full" end s.statistic_alias = "qwerty" s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PREDICT s.on_handwrite = true s.handwrite_mask = true s.additional_candidate = nil s.inline_strategy = nil s.explicit_strategy = { si.inline_strategy.PRECISE_INPUT, } s.extra_elements = { "top_bar=function_bar/candidate_bar/handwrite_half_filter_bar", "popup_revert", "popup_explicit", "sk_ent_explicit", "typing_speed_bar", } for i = 1, #sk_main_inputs do for j = 1, #sk_main_inputs[i] do local key = s.softkeys["sk_" .. i .. "_" .. j] key.on_slide_up = nil key.on_slide_down = nil key.on_long_press_once = nil end end s.on_slip_left = function() si.change_surface_by_subtype(si.surface_subtype.KEYBOARD_TPLUS) end s.on_slip_right = function() si.change_surface_by_subtype(si.surface_subtype.KEYBOARD_TPLUS) end --softkeys s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_sp"] = ck.sk_sp_cangjie s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_cht s.softkeys["sk_bk"] = ck.sk_bk_chs s.softkeys["sk_lng"] = ck.sk_lng_chs s.softkeys["sk_sym"] = ck.sk_sym_chs s.softkeys["sk_num"] = ck.sk_num_left s.softkeys["sk_que"] = ck.sk_que s.softkeys["sk_hw_mask"] = ck.sk_hw_mask s.softkeys["Comma"] = ck.sk_comma_chs s.softkeys["Dot"] = ck.sk_dot_chs s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.commit_input = lc.commit_input return s PK n5:Q.)!5assets/cangjie_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "chtzy_soft_tplus", kb.cangjie_tplus_left, kb.cangjie_tplus_right, nil, si.TITLE_CASE.NO_CHANGE, 3) if si.is_international_version() then s.template = "cangjie_soft_tplus_international" else s.template = "cangjie_soft_tplus" end s.statistic_alias = "tplus" s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PREDICT s.additional_candidate = nil s.inline_strategy = nil s.on_handwrite = true s.handwrite_mask = true s.explicit_strategy = { si.inline_strategy.PREDICT_EVIDENCE } s.extra_elements = { "top_bar=function_bar/candidate_bar/handwrite_half_filter_bar", "popup_revert", "popup_explicit", "sk_ent_explicit", "zhuyin_first_tone", "typing_speed_bar", } s.on_slip_left = function() si.change_surface_by_subtype(si.surface_subtype.KEYBOARD_FULL) end s.on_slip_right = function() si.change_surface_by_subtype(si.surface_subtype.KEYBOARD_FULL) end s.softkeys["sk_2_5"].on_long_press_once = nil --softkeys s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_sp"] = ck.sk_sp_cangjie s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_cht s.softkeys["sk_bk"] = ck.sk_bk_chs s.softkeys["sk_lng"] = ck.sk_lng_chs s.softkeys["sk_sym"] = ck.sk_sym_chs s.softkeys["sk_num"] = ck.sk_num_left s.softkeys["sk_que"] = ck.sk_que s.softkeys["Comma"] = ck.sk_comma_chs s.softkeys["Dot"] = ck.sk_dot_chs s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_hw_mask"] = ck.sk_hw_mask s.commit_input = lc.commit_input return s PK n5:QrPP5assets/cangjie_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" local si = smartinput local traits = smartinput.new_language_traits() traits.case_sensitive = false traits.commit_input_size = 5 traits.max_candidate_length = 16 traits.chinese_charset = smartinput.chinese_charset.TRADITIONAL local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") function traits.is_upper_case(c) local char_code = c return char_code >= A_code and char_code <= Z_code end function traits.is_lower_case(c) local char_code = c return char_code >= a_code and char_code <= z_code end function traits.is_input_character (c) zhuyin_chars = { {"手", "田", "水", "口", "廿", "卜", "山", "戈", "人", "心"}, {"日", "尸", "木", "火", "土", "竹", "十", "大", "中"}, {"難", "金", "女", "月", "弓", "一"}, } for i, row in _G.pairs(zhuyin_chars) do for j, zy_ch in _G.pairs(row) do if c == si.u16code(zy_ch, 1) then return true end end end return false end function traits.is_output_character(c) local char_code = c if char_code >= 0x4e00 and char_code <= 0x9fff then return true else return false end end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else return c end end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else return c end end function traits.is_case_sensitive_character(c) if c >= a_code and c <= z_code then return true elseif c >= A_code and c <= A_code then return true else return false end end traits.is_userword_character = traits.is_output_character function traits.is_word_begin_character (c) return true end function traits.is_word_middle_character (c) return true end traits.is_contact_character = traits.is_output_character return traits PK n5:Qw5assets/catalan.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("CA", "Catalan") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.catalanv5 .. "catalan_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.catalanv5 .. "catalan_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.catalanv5 .. "catalan_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.catalanv5 .. "catalan_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.catalanv5 .. "catalan_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.catalanv5 .. "catalan_traits.trt.png" lng.statistic_alias = "catalan" lng.categories[si.language.category.FASTSWITCH] = "catalan" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "catalan" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "catalan" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.catalanv5 .. "catalan.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.catalanv5 .. "catalan_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.catalanv5 .. "catalan_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.catalanv5 .. "catalan_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q%m1$5assets/catalan_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "catalan_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QKt "5assets/catalan_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "catalan_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QTW "5assets/catalan_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "catalan_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q[[(5assets/catalan_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "catalan_soft_qwerty", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q=aa(5assets/catalan_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "catalan_soft_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QJH`  5assets/catalan_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "à", "á", "â", "ã", "å", "ä", "æ", "ą", "ā", "ª", "ç", "ć", "č", "é", "è", "ê", "ë", "ę", "ē", "ė", "í", "ï", "î", "ì", "ī", "į", "ó", "ò", "ô", "õ", "ö", "ō", "œ", "ø", "º", "ú", "ü", "ù", "û", "ū", "ń", "ñ", "ł", "ŀ", } local special_upper_list = { "À", "Á", "Â", "Ã", "Å", "Ä", "Æ", "Ą", "Ā", "ª", "Ç", "Ć", "Č", "É", "È", "Ê", "Ë", "Ę", "Ē", "Ė", "Í", "Ï", "Î", "Ì", "Ī", "Į", "Ó", "Ò", "Ô", "Õ", "Ö", "Ō", "Œ", "Ø", "º", "Ú", "Ü", "Ù", "Û", "Ū", "Ń", "Ñ", "Ł", "Ŀ", } local accent_letter_dictionary = { [string.byte("a")] = "àáâãåäæąāª", [string.byte("c")] = "çćč", [string.byte("e")] = "éèêëęēė", [string.byte("i")] = "íïîìīį", [string.byte("o")] = "óòôõöōœøº", [string.byte("u")] = "úüùûū", [string.byte("n")] = "ńñ", [string.byte("l")] = "łŀ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q(q5assets/chinese_cangjie.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" require "handwrite_engine" local si = smartinput local pkg = packages local lng = smartinput.new_language("倉", "Cangjie") lng.surfaces = { --soft keyboard { surface_id = pkg.cangjiev5 .. "cangjie_soft_tplus.sur.png", surface_type = smartinput.surface_type.SOFT_KEYBOARD, surface_subtype = smartinput.surface_subtype.KEYBOARD_TPLUS, }, { surface_id = pkg.cangjiev5 .. "cangjie_soft_qwerty.sur.png", surface_type = smartinput.surface_type.SOFT_KEYBOARD, surface_subtype = smartinput.surface_subtype.KEYBOARD_FULL, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "chs_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "chs_soft_abc.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, surface_layout = si.surface_layout.QW, }, { surface_id = "number_left.sur.png", --number from phonepad surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = smartinput.context.MATH + smartinput.context.PHONE + smartinput.context.NUMBER lng.support_keyboard = { smartinput.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.cangjiev5 .. "cangjie_traits.trt.png" lng.statistic_alias = "cangjie" lng.categories[si.language.category.FASTSWITCH] = "chinese" lng.categories[si.language.category.SUBTYPE] = "chinese_cangjie" lng.categories[si.language.category.NEXTWORD] = "chinese" lng.categories[si.language.category.SPGETNEXTWORD] = "chinese" lng.categories[si.language.category.ADTLEARNING] = "chinese" lng.categories[si.language.category.USERWORD] = "chinese_traditional" lng.categories[si.language.category.LAYOUT] = "chinese_cangjie" lng.categories[si.language.category.SPEED] = "chinese" lng.categories[si.language.category.EMOJI] = "chinese_traditional" lng.categories[si.language.category.CANDIDATESHOWCONTACT] = "chinese" lng.dictionary = smartinput.new_engine(smartinput.dictionary.engine_type.OCEAN, smartinput.dictionary.dict_type.CHS_ASPECT) lng.dictionary.files = { { file_name = pkg.chtv5 .. "zhuyin.rom.png", file_type = smartinput.dictionary.image_type.ROM, open_mode = smartinput.file.READ, load_mode = smartinput.dictionary.load_mode.MMAP_ARRAY, }, { file_name = pkg.cangjiev5 .. "cangjie.rom.png", file_type = smartinput.dictionary.image_type.ROM, open_mode = smartinput.file.READ, load_mode = smartinput.dictionary.load_mode.MMAP_ARRAY, }, { file_name = pkg.cangjiev5 .. "cangjie.ram", file_type = smartinput.dictionary.image_type.RAM, open_mode = smartinput.file.READWRITE, load_mode = smartinput.dictionary.load_mode.MMAP_ARRAY, }, { file_name = pkg.cangjiev5 .. "simptrad.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "chinese_traditional.usr", file_type = smartinput.dictionary.image_type.USR, open_mode = smartinput.file.READWRITE, load_mode = smartinput.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.CHT_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.CHT_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end lng.handwrite = handwrite_engine.setup() return lng PK n5:QYZ 5assets/chinese_handwrite.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" require "handwrite_engine" local si = smartinput local pkg = packages local lng = si.new_language("手", "HandWrite") lng.surfaces = { --soft keyboard { surface_id = pkg.handwritev5 .. "chs_handwrite_full.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, }, { surface_id = pkg.handwritev5 .. "chs_handwrite_half.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "chs_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "chs_soft_abc.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, surface_layout = si.surface_layout.QW, }, { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "number_down.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.MATH + si.context.PHONE + si.context.NUMBER lng.support_keyboard = { si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.handwritev5 .. "chspy_traits.trt.png" lng.statistic_alias = "handwrite" lng.categories[si.language.category.FASTSWITCH] = "chinese" lng.categories[si.language.category.SUBTYPE] = "handwrite" lng.categories[si.language.category.NEXTWORD] = "chinese" lng.categories[si.language.category.SPGETNEXTWORD] = "chinese" lng.categories[si.language.category.ADTLEARNING] = "chinese" lng.categories[si.language.category.USERWORD] = "handwrite" lng.categories[si.language.category.RECOGRANGE] = "chinese_handwrite" lng.categories[si.language.category.LAYOUT] = "handwrite" lng.categories[si.language.category.EMOJI] = "chinese_simplified" lng.categories[si.language.category.CANDIDATESHOWCONTACT] = "chinese" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.CHS_PINYIN) lng.dictionary.files = { { file_name = pkg.pinyinv5 .. "pinyin.rom15", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, file_tag = si.dictionary.image_tag.ORDINARY_DICT_TYPE, load_mode = si.dictionary.load_mode.COMP_ARRAY, }, { file_name = pkg.pinyinv5 .. "simptrad.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, file_tag = si.dictionary.image_tag.ORDINARY_DICT_TYPE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "chinese_simplified.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, file_tag = si.dictionary.image_tag.ORDINARY_DICT_TYPE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.handwrite = handwrite_engine.setup() lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q̃&&5assets/chinese_pinyin.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" require "handwrite_engine" local si = smartinput local pkg = packages local lng = si.new_language("拼", "Pinyin") lng.on_load = function () local ts = si.tri_status ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) si.set_setting_value(si.settings.WORD_PREDICTION, true, si.settings_type.SETTING_BOOL) end lng.surfaces = { --hard keyboard { surface_id = pkg.pinyinv5 .. "chspy_hard_phonepad.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.pinyinv5 .. "chspy_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.pinyinv5 .. "chspy_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.pinyinv5 .. "chspy_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "chs_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "chs_soft_abc.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, surface_layout = si.surface_layout.QW, }, { surface_id = "number_down.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "number_right.sur.png", --number from phonepad surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more_pinyin.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.MATH + si.context.PHONE + si.context.NUMBER + si.context.EMAIL lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.pinyinv5 .. "chspy_traits.trt.png" lng.statistic_alias = "pinyin" lng.categories[si.language.category.FASTSWITCH] = "chinese" lng.categories[si.language.category.SUBTYPE] = "chinese_pinyin" lng.categories[si.language.category.MIXINPUT] = "chinese_pinyin" lng.categories[si.language.category.CELLDICT] = "chinese" lng.categories[si.language.category.NEXTWORD] = "chinese" lng.categories[si.language.category.SPGETNEXTWORD] = "chinese" lng.categories[si.language.category.ADTLEARNING] = "chinese" lng.categories[si.language.category.USERWORD] = "chinese_simplified" lng.categories[si.language.category.RECOGRANGE] = "chinese_pinyin" lng.categories[si.language.category.LAYOUT] = "chinese_pinyin" lng.categories[si.language.category.SPEED] = "chinese" lng.categories[si.language.category.CLOUDINPUT] = "zh-cn" lng.categories[si.language.category.EMOJI] = "chinese_simplified" lng.categories[si.language.category.CANDIDATESHOWCONTACT] = "chinese" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.CHS_PINYIN) if si.is_international_package() then curve_rom_file = pkg.pinyinv5 .. "pinyin_curve.rom.png" curve_layout_file = pkg.pinyinv5 .. "pinyin_layout.rom.png" else curve_rom_file = pkg.pinyinv5 .. "pinyin_curve.imy" curve_layout_file = pkg.pinyinv5 .. "pinyin_layout.imy" end lng.dictionary.files = { { file_name = pkg.pinyinv5 .. "pinyin.rom15", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, file_tag = si.dictionary.image_tag.ORDINARY_DICT_TYPE, load_mode = si.dictionary.load_mode.COMP_ARRAY, }, { file_name = "pinyin_big_rom.sdd", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, file_tag = si.dictionary.image_tag.SUPER_DICT_TYPE, load_mode = si.dictionary.load_mode.PURE_FILE, }, { file_name = pkg.pinyinv5 .. "simptrad.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, file_tag = si.dictionary.image_tag.SUPER_DICT_TYPE + si.dictionary.image_tag.ORDINARY_DICT_TYPE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "chinese_simplified.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, file_tag = si.dictionary.image_tag.ORDINARY_DICT_TYPE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, file_tag = si.dictionary.image_tag.DICT_MIX + si.dictionary.image_tag.ORDINARY_DICT_TYPE, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.config = { { file_name = pkg.pinyinv5 .. "shuangpin_zr.cfg.png", file_type = si.dictionary.image_type.SHUANGPINCONF, file_tag = si.dictionary.image_tag.ZR + si.dictionary.image_tag.SUPER_DICT_TYPE + si.dictionary.image_tag.ORDINARY_DICT_TYPE, open_mode = si.file.READ, }, { file_name = pkg.pinyinv5 .. "shuangpin_jj.cfg.png", file_type = si.dictionary.image_type.SHUANGPINCONF, file_tag = si.dictionary.image_tag.JJ + si.dictionary.image_tag.SUPER_DICT_TYPE + si.dictionary.image_tag.ORDINARY_DICT_TYPE, open_mode = si.file.READ, }, { file_name = pkg.pinyinv5 .. "shuangpin_xh.cfg.png", file_type = si.dictionary.image_type.SHUANGPINCONF, file_tag = si.dictionary.image_tag.XH + si.dictionary.image_tag.SUPER_DICT_TYPE + si.dictionary.image_tag.ORDINARY_DICT_TYPE, open_mode = si.file.READ, }, { file_name = pkg.pinyinv5 .. "shuangpin_zn.cfg.png", file_type = si.dictionary.image_type.SHUANGPINCONF, file_tag = si.dictionary.image_tag.ZN + si.dictionary.image_tag.SUPER_DICT_TYPE + si.dictionary.image_tag.ORDINARY_DICT_TYPE, open_mode = si.file.READ, }, { file_name = pkg.pinyinv5 .. "shuangpin_ms.cfg.png", file_type = si.dictionary.image_type.SHUANGPINCONF, file_tag = si.dictionary.image_tag.MS + si.dictionary.image_tag.SUPER_DICT_TYPE + si.dictionary.image_tag.ORDINARY_DICT_TYPE, open_mode = si.file.READ, }, { file_name = pkg.pinyinv5 .. "shuangpin_sg.cfg.png", file_type = si.dictionary.image_type.SHUANGPINCONF, file_tag = si.dictionary.image_tag.SG + si.dictionary.image_tag.SUPER_DICT_TYPE + si.dictionary.image_tag.ORDINARY_DICT_TYPE, open_mode = si.file.READ, }, { file_name = pkg.pinyinv5 .. "shuangpin_zg.cfg.png", file_type = si.dictionary.image_type.SHUANGPINCONF, file_tag = si.dictionary.image_tag.ZG + si.dictionary.image_tag.SUPER_DICT_TYPE + si.dictionary.image_tag.ORDINARY_DICT_TYPE, open_mode = si.file.READ, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.CHS_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.CHS_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.CHS_PINYIN) lng.curve.files = { { file_name = curve_layout_file, file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- FULL { file_name = curve_rom_file, file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.handwrite = handwrite_engine.setup() lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q+u{{$5assets/chinese_simplecangjie.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" require "handwrite_engine" local si = smartinput local pkg = packages local lng = smartinput.new_language("速", "SimpleCangjie") lng.surfaces = { --soft keyboard { surface_id = pkg.simplecangjiev5 .. "simplecangjie_soft_qwerty.sur.png", surface_type = smartinput.surface_type.SOFT_KEYBOARD, surface_subtype = smartinput.surface_subtype.KEYBOARD_FULL, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "chs_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "chs_soft_abc.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, surface_layout = si.surface_layout.QW, }, { surface_id = "number_left.sur.png", --number from phonepad surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = smartinput.context.MATH + smartinput.context.PHONE + smartinput.context.NUMBER lng.support_keyboard = { smartinput.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.simplecangjiev5 .. "simplecangjie_traits.trt.png" lng.statistic_alias = "simplecangjie" lng.categories[si.language.category.FASTSWITCH] = "chinese" lng.categories[si.language.category.SUBTYPE] = "chinese_simplecangjie" lng.categories[si.language.category.NEXTWORD] = "chinese" lng.categories[si.language.category.SPGETNEXTWORD] = "chinese" lng.categories[si.language.category.ADTLEARNING] = "chinese" lng.categories[si.language.category.USERWORD] = "chinese_traditional" lng.categories[si.language.category.LAYOUT] = "chinese_simplecangjie" lng.categories[si.language.category.SPEED] = "chinese" lng.categories[si.language.category.EMOJI] = "chinese_traditional" lng.categories[si.language.category.CANDIDATESHOWCONTACT] = "chinese" lng.dictionary = smartinput.new_engine(smartinput.dictionary.engine_type.OCEAN, smartinput.dictionary.dict_type.CHS_ASPECT) lng.dictionary.files = { { file_name = pkg.chtv5 .. "zhuyin.rom.png", file_type = smartinput.dictionary.image_type.ROM, open_mode = smartinput.file.READ, load_mode = smartinput.dictionary.load_mode.MMAP_ARRAY, }, { file_name = pkg.simplecangjiev5 .. "simplecangjie.rom.png", file_type = smartinput.dictionary.image_type.ROM, open_mode = smartinput.file.READ, load_mode = smartinput.dictionary.load_mode.MMAP_ARRAY, }, { file_name = pkg.simplecangjiev5 .. "simplecangjie.ram", file_type = smartinput.dictionary.image_type.RAM, open_mode = smartinput.file.READWRITE, load_mode = smartinput.dictionary.load_mode.MMAP_ARRAY, }, { file_name = pkg.simplecangjiev5 .. "simptrad.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "chinese_traditional.usr", file_type = smartinput.dictionary.image_type.USR, open_mode = smartinput.file.READWRITE, load_mode = smartinput.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.CHT_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.CHT_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end lng.handwrite = handwrite_engine.setup() return lng PKk5:Q5assets/chinese_simplified.usrUT  n_ n_ n_ w@TГw@TГw@TГK(+-.R(5304UH5R `X+xA !5assets/chs_handwrite_half.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" local si = smartinput local ck = common_keys local fi = si.filter_list local s = si.new_surface("chs_handwrite") if not si.is_international_version() then s.template = "chs_handwrite_half" else s.template = "chs_handwrite_half_international" end s.statistic_alias = "half" s.surface_type = si.surface_type.SOFT_KEYBOARD s.surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PREDICT s.inline_strategy = inline_strategy s.explicit_strategy = nil s.default_nextword = true s.on_handwrite = true s.on_slip_left = nil s.on_slip_right = nil inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.extra_elements = { "hand_write_half,stroke_fade_out,engine_provider_watermark", "top_bar=handwrite_half_bar/handwrite_half_filter_bar/function_bar", "hw_recog=zhl", } s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_sp"] = ck.sk_sp_hw s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_hw s.softkeys["sk_bk"] = ck.sk_bk_hw s.softkeys["sk_lng"] = ck.sk_lng_chs s.softkeys["sk_sym"] = ck.sk_sym_chs s.softkeys["sk_full"] = ck.sk_full_hw s.softkeys["sk_rog1"] = ck.sk_zh_hw s.softkeys["sk_rog2"] = ck.sk_en_hw s.softkeys["sk_close"] = ck.sk_close_hw s.softkeys["Dot"] = ck.sk_dot_hw s.softkeys["sk_place"] = ck.sk_place s.softkeys["Comma"] = ck.sk_comma_hw s.softkeys["QuestionMark"] = ck.sk_question_mark_hw s.softkeys["ExclamationMark"] = ck.sk_exclamation_mark_hw s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_num"] = ck.sk_num_down s.hardkeys[si.hard_keycode.HARD_KEYCODE_DPAD_UP] = nil s.hardkeys[si.hard_keycode.HARD_KEYCODE_DPAD_DOWN] = nil s.hardkeys[si.hard_keycode.HARD_KEYCODE_DPAD_LEFT] = nil s.hardkeys[si.hard_keycode.HARD_KEYCODE_DPAD_RIGHT] = nil s.hardkeys[si.hard_keycode.HARD_KEYCODE_DPAD_CENTER] = nil s.after_filter_op = function () fi.clear() end s.after_cand_op = function () fi.clear() end return s PK n5:Q 5assets/chs_soft_abc.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "surface_factory" require "common_keys" local si = smartinput local sf = surface_factory local ts = si.tri_status local pi = si.pending_input local ca = si.candidates local ck = common_keys local sk_main_inputs = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l"}, {"z", "x", "c", "v", "b", "n", "m"}, {"@", "_"}, } local s = sf.new_full_keyboard( "chs_soft_abc", sk_main_inputs, nil, nil, false, si.TITLE_CASE.CHANGE, 0) s.on_load = function (keyboard) s.explicit_inline = keyboard.explicit_inline s.inline_strategy = keyboard.inline_strategy s.resolve_mode = keyboard.resolve_mode s.touch_to_save = keyboard.touch_to_save end s.template = "abc" s.surface_type = si.surface_type.SOFT_SPECIAL s.surface_subtype = si.surface_subtype.KEYBOARD_FULL s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PRECISE s.inline_strategy = nil s.explicit_strategy = nil s.additional_candidate = nil s.extra_elements = { "top_bar=number_bar", } s.on_slip_stroke = true s.const_candidates = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", } local locale = dofile("locale.lua") if not locale then locale = ".cn" end for i = 1, #sk_main_inputs do for j = 1, #sk_main_inputs[i] do s.softkeys["sk_" .. i .. "_" .. j].on_long_press_once = nil s.softkeys["sk_" .. i .. "_" .. j].on_slide_up = sf.full_on_slide_up end end if si.is_current_chinese_language() then s.softkeys["sk_sym"] = ck.sk_sym_chs else s.softkeys["sk_sym"] = ck.sk_sym_eng end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_sp"] = ck.sk_sp_abc s.softkeys["sk_bk"] = ck.sk_bk_abc s.softkeys["sk_4_1"] = ck.sk_at_abc s.softkeys["sk_back"] = ck.sk_back_abc s.softkeys["Dot"] = ck.sk_dot_eng s.softkeys["sk_place"] = ck.sk_place s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_hw_mask"] = ck.sk_hw_mask s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.on_slip_left = nil s.on_slip_right = nil return s PK n5:QL^@^@5assets/chs_sym_grid.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "grid_symbol" require "common_keys" require "emoji" local si = smartinput local ck = common_keys local ct = si.context local pi = si.pending_input local sym = grid_symbol local emo = emoji local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "chs_sym_grid_international" else surface.template = "chs_sym_grid" end surface.on_load = function (old_surface) surface.explicit_inline = old_surface.explicit_inline surface.inline_strategy = old_surface.inline_strategy surface.resolve_mode = old_surface.resolve_mode surface.display_candidate_code = old_surface.display_candidate_code if old_surface.param ~= nil then surface.switch_tab(old_surface.param, true) end end surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.support_mode = ct.NUMBER + ct.MATH surface.extra_elements = { "chs_sym_types", "popup_revert", "popup_explicit", "top_bar=none", } surface.ROWS_COUNT = 4 surface.COLUMNS_COUNT = 4 surface.MAX_RECENT_SYMBOL_COUNT = surface.ROWS_COUNT * surface.COLUMNS_COUNT local symbol_punc_eng = { { {".", ",", "?", "!"}, {"'", "@", "…", ":"}, {";", "\"", "/", "_"}, {"-", "+", "`", {"()",1}}, {"(", ")", "=", "\\"}, {"~", "^", "#", "*"}, {"%", "&", "|", {"{}",1}}, {"{", "}",{"[]",1}, {"<>",1}}, {"<", ">", "$", "¥"}, {"£", "€", "¿", "¡"}, {"•", "", "", ""}, } } local symbol_punc_cn = { { {",", "。", "?", "!"}, {"、", "@", ":", ";"}, {"……", {"“”", 1}, {"‘’", 1}, "~"}, {{"()", 1}, {"《》", 1}, ".", "-"}, {"%", "——", "&", "#"}, {{"<>",1}, {"[]", 1}, {"{}", 1}, {"〔〕", 1}}, {{"「」",1}, {"『』",1}, {"【】",1}, {"〖〗",1}}, {"*", "_", "¥", "$"}, {"“", "”", "‘", "’"}, {"(", ")", "《", "》"}, {"<", ">", "[", "]"}, {"{", "}", "〔 ", "〕"}, {"「", "」", "『", "』"}, {"【", "】", "〖", "〗"} } } local symbol_number = { { {"1", "2", "3", "."}, {"4", "5", "6", ","}, {"7", "8", "9", "%"}, {"*", "0", "#", "-"} } } local symbol_emotion = { { {":-)", ":-(", ":-D", ":-P"}, {";-)", "=-O", ":-*", ":O"}, {"B-)", ":-$", ":-!", ":-["}, {"O:-)", ":-\\", ":'(",",-)"}, {":-C", ":-I", ":-O",">:-<"}, {"Orz","~zZ", "@_@", "^o^"}, {"^v^", "^ω^", "←_←", "→_→"}, {"-.-", "?_?", "π_π", "-O-"}, {"O_o", "555~", "e_e", "haha~"}, {"(>_<)", "~_~", ">o<", "-O-"}, {"-_-", "-_-#", "-_-||", "-_-b"}, {"hehe~", "oh~", "Yeah~", "Q_Q"}, {"T_T", "::>_<::", "(-.-)", "≥﹏≤"}, {"#^_^#", "^_^", "*^_^*", "*^o^*"}, {"^v^", "(^-^)", "(^o^)", "(^3^)"}, {"\\^O^/", "^o^", "+_+", "⊙_⊙"}, {"⊙▽⊙", "⊙ω⊙", "$_$", ">_<"}, {"(>_<)", "(>﹏<)", "(~o~)", "( ̄. ̄)"}, {"(*>.<*)", "(?o?)", "(ˇˍˇ)", "(⊙o⊙)"}, {"(≥3≤)", "(╯3╰)", "(°ο°)", "(☆_☆)"}, {"*^÷^*", "*^◎^*", "*^o^*", "╭∩╮"}, {"^_^¦¦¦", "^=_=^", "﹌○﹌", "~>_<~"}, {"~T_T~", "~w_w~", ">_<¦¦¦", ">o<"}, {"y^o^y", "Y(^_^)Y", "y∩__∩y", "╰_╯"}, {"╯﹏╰", "╯▂╰", "〒_〒", "~^o^~"}, {"~_~", "~`o`~", "=^_^=", "=_="}, {"≡^ˇ^≡", "≥﹏≤", "●﹏●", "●︿●"}, {"●▂●", "◑▂◐", "(*^@^*)", "(*^﹏^*)"}, {"(=^.^=)", "(=^ω^=)", "*^____^*", "@(一-一)@"}, {"^-_-^", "=@~@=", "= ̄ω ̄=", "↖(^ω^)↗"}, {"└(^o^)┘", "(ˉ(∞)ˉ)", "`(+﹏+)′", "(#\")凸"}, {"(* ̄︶ ̄*)", "`(*∩_∩*)′"}, {"~(*+﹏+*)~", "~@^_^@~"}, {"~~\(^_^)/~~", "~~~^_^~~~"}, {"~~O(∩_∩)O~~", "<(-︿-)>"}, } } local symbol_web = { { {"http://", {"www..com", 4}, "https://"}, {"ftp://", "www.", ".cn", ".com"}, {".org", "wap.", "blog.", "bbs."}, {":", ".", "/", "@"}, {"@sina.com", "@sina.cn"}, {"@hotmail.com", "@live.cn"}, {"@gmail.com", "@qq.com"}, {"@163.com", "@sohu.com"}, } } local symbol_maths = { { {"+", "-", "×", "÷"}, {"=", "≈", "≤", "≥"}, {"°", "%", "℃", "℉"}, {"‰", "㎎", "㎏", "㎜"}, {"㎝", "㎞", "㎡", "㏄"}, {"㏑", "㏒", "⊙", "∠"}, {"⊥", "∫", "∮", "∝"}, {"∞", "º", "¹", "²"}, {"³", "½", "¾", "¼"}, {"<", ">", "≮", "≯"}, {"±", "≡", "≠", "№"}, {"§", "≦", "≧", "≌"}, {"∽", "∷", "/", "∧"}, {"∨", "∏", "∪", "∩"}, {"∈", "∵", "∴", "⌒"}, {"√", "∑", "Ψ", "¤"}, {"‖", "¶", "", ""}, } } local symbol_serial = { { {"①", "②", "③", "④"}, {"⑤", "⑥", "⑦", "⑧"}, {"⑨", "⑩", "㈠", "㈡"}, {"㈢", "㈣", "㈤", "㈥"}, {"㈦", "㈧", "㈨", "㈩"}, {"⑴", "⑵", "⑶", "⑷"}, {"⑸", "⑹", "⑺", "⑻"}, {"⑼", "⑽", "⒈", "⒉"}, {"⒊", "⒋", "⒌", "⒍"}, {"⒎", "⒏", "⒐", "⒑"}, {"壹", "贰", "叁", "肆"}, {"伍", "陆", "柒", "捌"}, {"玖", "拾", "佰", "仟"}, {"万", "ⅰ", "ⅱ", "ⅲ"}, {"ⅳ", "ⅴ", "ⅵ", "ⅶ"}, {"ⅷ", "ⅸ", "ⅹ", "Ⅰ"}, {"Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ"}, {"Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ"}, {"Ⅹ", "Ⅺ", "Ⅻ", ""}, } } local symbol_radical = { { {"丶","丷","丿","乚"}, {"丨","丄","丅","亅"}, {"亻","忄","犭","扌"}, {"亠","宀","冖","乛"}, {"艹","厂","疒","礻"}, {"讠","衤","刂","阝"}, {"卩","钅","饣","丬"}, {"冫","氵","灬","彡"}, {"纟","爫","囗","辶"}, {"廴","冂","凵","丆"}, {"丌","丩","巜","乀"}, {"乁","乂","乄","乆"}, {"乊","亇","亍","亼"}, {"亽","兯","冎","勹"}, {"匚","匸","卂","卄"}, {"卍","卐","卝","卪"}, {"厃","厶","夂","夊"}, {"豸","釒","尐","屮"}, {"屵","廾","彐","彑"}, {"爿","牜","糹","罒"}, {"訁","耂","襾","覀"}, } } local symbol_pinyin = { { {"ā", "á", "ǎ", "à"}, {"ō", "ó", "ǒ", "ò"}, {"ē", "é", "ě", "è"}, {"ī", "í", "ǐ", "ì"}, {"ū", "ú", "ǔ", "ù"}, {"ǖ", "ǘ", "ǚ", "ǜ"}, {"ü", "", "", ""}, } } local symbol_russia = { { {"а", "б", "в", "г"}, {"д", "е", "ж", "з"}, {"и", "й", "к", "л"}, {"м", "Н", "о", "п"}, {"р", "с", "т", "у"}, {"ф", "х", "ц", "ч"}, {"ш", "щ", "ъ", "ы"}, {"ь", "э", "ю", "я"}, {"ё", "А", "Б", "В"}, {"Г", "Д", "Е", "Ж"}, {"З", "И", "Й", "К"}, {"Л", "М", "Н", "О"}, {"П", "Р", "С", "Т"}, {"У", "Ф", "Х", "Ц"}, {"Ч", "Ш", "Щ", "Ъ"}, {"Ы", "Ь", "Э", "Ю"}, {"Я", "Ё", "", ""}, } } local symbol_greek = { { {"α", "β", "γ", "δ"}, {"ε", "ζ", "ν", "ξ"}, {"ο", "π", "ρ", "σ"}, {"η", "θ", "ι", "κ"}, {"λ", "μ", "τ", "υ"}, {"φ", "χ", "ψ", "ω"}, {"Α", "Β", "Γ", "Δ"}, {"Ε", "Ζ", "Η", "Θ"}, {"Ι", "Κ", "Λ", "Μ"}, {"Ν", "Ξ", "Ο", "Π"}, {"Ρ", "Σ", "Τ", "Υ"}, {"Φ", "Χ", "Ψ", "Ω"}, } } local symbol_latin = { { {"Ä", "Æ", "Å", "À"}, {"Á", "Â", "Ã", "Ç"}, {"È", "É", "Ê", "Ë"}, {"Ð", "Ì", "Í", "Î"}, {"Ï", "Ö", "Ø", "Ò"}, {"Ó", "Ô", "Õ", "Ñ"}, {"Ù", "Ú", "Û", "Ü"}, {"Ý", "Þ", "ä", "æ"}, {"å", "à", "á", "â"}, {"ã", "ç", "è", "é"}, {"ê", "ë", "ð", "ì"}, {"í", "î", "ï", "ö"}, {"ø", "ò", "ó", "ô"}, {"õ", "ñ", "ù", "ú"}, {"û", "ü", "ý", "þ"}, } } local symbol_kata = { { {"ア", "イ", "ウ", "エ"}, {"オ", "ァ", "ィ", "ゥ"}, {"ェ", "ォ", "カ", "キ"}, {"ク", "ケ", "コ", "ガ"}, {"ギ", "グ", "ゲ", "ゴ"}, {"サ", "シ", "ス", "セ"}, {"ソ", "ザ", "ジ", "ズ"}, {"ゼ", "ゾ", "タ", "チ"}, {"ツ", "テ", "ト", "ダ"}, {"ヂ", "ヅ", "デ", "ド"}, {"ッ", "ナ", "ニ", "ヌ"}, {"ネ", "ノ", "ハ", "ヒ"}, {"フ", "ヘ", "ホ", "バ"}, {"ビ", "ブ", "ベ", "ボ"}, {"パ", "ピ", "プ", "ペ"}, {"ポ", "マ", "ミ", "ム"}, {"メ", "モ", "ャ", "ヤ"}, {"ュ", "ユ", "ョ", "ヨ"}, {"ラ", "リ", "ル", "レ"}, {"ロ", "ワ", "ヽ", "ヾ"}, {"ヲ", "ン", "ヴ", "ヵ"}, {"ヶ", "", "", ""}, } } local symbol_hira = { { {"あ", "い", "う", "え"}, {"お", "ぁ", "ぃ", "ぅ"}, {"ぇ", "ぉ", "か", "き"}, {"く", "け", "こ", "が"}, {"ぎ", "ぐ", "げ", "ご"}, {"さ", "し", "す", "せ"}, {"そ", "ざ", "じ", "ず"}, {"ぜ", "ぞ", "た", "ち"}, {"つ", "て", "と", "だ"}, {"ぢ", "づ", "で", "ど"}, {"っ", "な", "に", "ぬ"}, {"ね", "の", "は", "ひ"}, {"ふ", "へ", "ほ", "ば"}, {"び", "ぶ", "べ", "ぼ"}, {"ぱ", "ぴ", "ぷ", "ぺ"}, {"ぽ", "ま", "み", "む"}, {"め", "も", "や", "ゆ"}, {"よ", "ゃ", "ゅ", "ょ"}, {"ら", "り", "る", "れ"}, {"ろ", "わ", "を", "ん"}, {"ゎ", "", "", ""}, } } local symbol_zhuyin_japan = { { {"ㄅ", "ㄆ", "ㄇ", "ㄈ"}, {"ㄉ", "ㄊ", "ㄋ", "ㄌ"}, {"ㄍ", "ㄎ", "ㄏ", "ㄐ"}, {"ㄑ", "ㄒ", "ㄓ", "ㄔ"}, {"ㄕ", "ㄖ", "ㄗ", "ㄘ"}, {"ㄙ", "ㄧ", "ㄨ", "ㄩ"}, {"ㄚ", "ㄛ", "ㄜ", "ㄝ"}, {"ㄞ", "ㄟ", "ㄠ", "ㄡ"}, {"ㄢ", "ㄣ", "ㄤ", "ㄥ"}, {"ㄦ", "", "", ""}, } } local symbol_icon = { { {"☆", "★", "□", "■"}, {"○", "●", "△", "▲"}, {"▽", "▼", "◇", "◆"}, {"♀", "♂", "※", "╳"}, {"╭", "╮", "╰", "╯"}, {"︽", "︾", "︵", "︶"}, {"﹁", "﹂", "﹃", "﹄"}, {"︹", "︺", "︿", "﹀"}, {"︴", "﹌", "﹉", "﹊"}, {"﹍", "﹎", "﹏", "ˇ"}, {"‥", "︷", "︸", "«"}, {"»", "︵", "︻", "︼"}, {"↓", "↑", "↔", "↖"}, {"↙", "↗", "↘", "←"}, {"→", "↹", "♣", "♠"}, {"♥", "♦", "◣", "◢"}, {"◤", "◥", "卍", "℡"}, {"⊙", "㊣", "®", "©"}, {"™", "Š", "Õ", "‡"}, {"†", "Θ", "Ψ", "卐"}, {"㈱", "囍", "◎", ""}, } } local symbol_emoticon = { { {emo.emoji_code.EMOJI_SMILE, emo.emoji_code.EMOJI_SAD, emo.emoji_code.EMOJI_GRIN, emo.emoji_code.EMOJI_NAUGHTY}, {emo.emoji_code.EMOJI_JOY, emo.emoji_code.EMOJI_CONFUSED, emo.emoji_code.EMOJI_KISS, emo.emoji_code.EMOJI_SURPRISE}, {emo.emoji_code.EMOJI_PLEASED, emo.emoji_code.EMOJI_HEARTSHAPED, emo.emoji_code.EMOJI_WRONGED, emo.emoji_code.EMOJI_CRY}, {emo.emoji_code.EMOJI_ARROGANT, emo.emoji_code.EMOJI_ANGRY, emo.emoji_code.EMOJI_WEEP, emo.emoji_code.EMOJI_DIZZY}, } } for i = 1, #symbol_emotion do for j = 1, #symbol_emotion[i] do for k = 1, #symbol_emotion[i][j] do local new_symbol = {} new_symbol[1] = symbol_emotion[i][j][k] new_symbol["emotion"] = true symbol_emotion[i][j][k] = new_symbol end end end for i = 1, #symbol_emoticon do for j = 1, #symbol_emoticon[i] do for k = 1, #symbol_emoticon[i][j] do local new_symbol = {} new_symbol[1] = symbol_emoticon[i][j][k] new_symbol["emotion"] = true symbol_emoticon[i][j][k] = new_symbol end end end local symbol = { number = symbol_number, punc_eng = symbol_punc_eng, punc_cn = symbol_punc_cn, emoticon = {}, web = symbol_web, maths = symbol_maths, serial = symbol_serial, radical = symbol_radical, pinyin = symbol_pinyin, russia = symbol_russia, greek = symbol_greek, latin = symbol_latin, kata = symbol_kata, hira = symbol_hira, zhuyin_japan = symbol_zhuyin_japan, icon = symbol_icon } local sym_types_name = { number = "数字", punc_eng = "英文", punc_cn = "中文", emotion = "表情", emoticon = "表情图", web = "网络", maths = "数学", serial = "序号", radical = "部首", pinyin = "拼音", russia = "俄语", greek = "希腊", latin = "拉丁", kata = "片假", hira = "平假", zhuyin_japan = "注音", icon = "图形", recent = "最近" } function surface.update_recent_symbols(new_recent_symbols) symbol.recent = new_recent_symbols end local recent_symbols = sym.get_recent_symbols() surface.update_recent_symbols(sym.layout_symbol_list(recent_symbols, surface.ROWS_COUNT, surface.COLUMNS_COUNT)) function surface.set_recent_symbols(symbols) sym.set_recent_symbols(surface, symbols) end function surface.get_recent_symbols() return sym.get_recent_symbols() end if si.input_type() == ct.NUMBER or si.input_type() == ct.PASSWORD then surface.sym_current_tab = "number" else surface.sym_current_tab = "recent" end surface.sym_current_page = 1 --si.get_setting_value(si.settings.SYMBOL_CURRENT_PAGE, si.settings_type.SETTING_INT) si.set_setting_value(si.settings.SYMBOL_CURRENT_TAB_CHS, surface.sym_current_tab, si.settings_type.SETTING_STRING) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) surface.switch_tab = function(symbol_tab, is_ignore_accessibility) surface.sym_current_tab = symbol_tab surface.sym_current_page = 1 if not is_ignore_accessibility then si.set_accessibility_string("@string/accessibility_symbol_" .. symbol_tab) end si.set_setting_value(si.settings.SYMBOL_CURRENT_TAB_CHS, surface.sym_current_tab, si.settings_type.SETTING_STRING) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) surface.update_lock_status(symbol_tab) sym.reload_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) end surface.update_lock_status = function(symbol_tab) if symbol_tab == "number" then local locked = si.get_setting_value(si.settings.SYMBOL_LOCK_STATUS, si.settings_type.SETTING_INT) if locked >= 4 then locked = locked - 4; end if locked < 2 then locked = locked + 2; end si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, locked, si.settings_type.SETTING_INT) else local locked = si.get_setting_value(si.settings.SYMBOL_LOCK_STATUS, si.settings_type.SETTING_INT) if locked >= 4 then locked = locked - 4; end if locked >= 2 then locked = locked - 2; end si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, locked, si.settings_type.SETTING_INT) end end surface.prev_page = function() if table.getn(symbol[surface.sym_current_tab]) == 1 then si.set_accessibility_string("@string/accessibility_next_page_only_one") return end surface.sym_current_page = surface.sym_current_page - 1 if surface.sym_current_page < 1 then surface.sym_current_page = table.getn(symbol[surface.sym_current_tab]) end si.set_accessibility_string("@string/accessibility_next_page&" .. surface.sym_current_page) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) sym.reload_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) end surface.next_page = function() if table.getn(symbol[surface.sym_current_tab]) == 1 then si.set_accessibility_string("@string/accessibility_next_page_only_one") return end surface.sym_current_page = surface.sym_current_page + 1 if surface.sym_current_page > table.getn(symbol[surface.sym_current_tab]) then surface.sym_current_page = surface.sym_current_page - table.getn(symbol[surface.sym_current_tab]) end si.set_accessibility_string("@string/accessibility_next_page&" .. surface.sym_current_page) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) sym.reload_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) end surface.lock = function() local locked = si.get_setting_value(si.settings.SYMBOL_LOCK_STATUS, si.settings_type.SETTING_INT) if locked < 2 then if locked == 0 then si.set_accessibility_string("@string/accessibility_lock_on") si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, 1, si.settings_type.SETTING_INT); else si.set_accessibility_string("@string/accessibility_lock_off") si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, 0, si.settings_type.SETTING_INT); end else si.set_accessibility_string("@string/accessibility_lock_disabled") end end surface.on_slip_up = surface.next_page surface.on_slip_down = surface.prev_page surface.update_lock_status(surface.sym_current_tab) sym.setup_chs_symbol(surface, symbol) for k, v in _G.pairs(symbol) do surface.softkeys["sk_" .. k].main_title = sym_types_name[k] end sym.load_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) return surface PK n5:QmDD 5assets/chs_sym_keyboard1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "keyboard_symbol" local si = smartinput local ck = common_keys local ct = si.context local sym = keyboard_symbol local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "chs_sym_keyboard1_international" else surface.template = "chs_sym_keyboard1" end surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.extra_elements = { "popup_revert", "popup_explicit", } local symbol = { {"1", "2", "3", "+", "-", "@", "$", "(", ")"}, {"4", "5", "6", "*", "/", "“", "”", ":", "#"}, {"7", "8", "9", "=", "、", "!", "?"}, {"0", "."}, } local enable_slide_symbol = true sym.setup_symbol( surface, symbol, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table, "1/2", "chs_sym_keyboard2.sur.png", "chs_sym_keyboard2.sur.png", enable_slide_symbol) surface.softkeys["sk_2_8"].alt_title = ";" surface.softkeys["sk_2_8"].on_long_press_once = function() sym.show_expand_symbols({";"}, 1, true, surface) end surface.softkeys["Comma"].main_title="," surface.softkeys["Dot"].main_title="。" surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open return surface PK n5:Q@  5assets/chs_sym_keyboard2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "keyboard_symbol" local si = smartinput local ck = common_keys local sym = keyboard_symbol local surface = si.new_surface("symbol") local symbol = { {{"【】",1}, {"《》",1}, {"{}",1}, {"「」",1}, "<", ">", "&", "_", "%", "√"}, {"︳", "\\", "‖", "——", "……", "•", "€", "¥", "£", "¢"}, {"α", "β", "^", "®", "©", "™", "~", "¤"} } local enable_slide_symbol = true if si.is_international_version() then surface.template = "chs_sym_keyboard2_international" else surface.template = "chs_sym_keyboard2" end surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.extra_elements = { "popup_revert", "popup_explicit", } sym.setup_symbol( surface, symbol, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table, "2/2", "chs_sym_keyboard1.sur.png", "chs_sym_keyboard1.sur.png", enable_slide_symbol) surface.softkeys["Comma"].main_title="," surface.softkeys["Dot"].main_title="。" surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open return surface PK n5:Q! 5assets/chs_sym_keyboard3.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "keyboard_symbol" require "emoji" local si = smartinput local ck = common_keys local sym = keyboard_symbol local emo = emoji local surface = si.new_surface("symbol") local symbol = { {{":-)", emotion=true}, {";-)", emotion=true}, {":-D", emotion=true}, {":-P", emotion=true}, {":-[", emotion=true}, {":'(", emotion=true}, {"=-O", emotion=true}}, {{":-(", emotion=true}, {"B-)", emotion=true}, {":-$", emotion=true}, {":O", emotion=true}, {":-*", emotion=true}, {":-!", emotion=true}, {":-\\", emotion=true}}, {"http://", "www.", ".com", ".net", ".cn"} } local symbol_emoticon = { { {emo.emoji_code.EMOJI_SMILE, emotion=true}, {emo.emoji_code.EMOJI_JOY, emotion=true}, {emo.emoji_code.EMOJI_GRIN, emotion=true}, {emo.emoji_code.EMOJI_NAUGHTY, emotion=true}, {emo.emoji_code.EMOJI_CRY, emotion=true}, {emo.emoji_code.EMOJI_WEEP, emotion=true}, {emo.emoji_code.EMOJI_CONFUSED, emotion=true}, }, { {emo.emoji_code.EMOJI_SAD, emotion=true}, {emo.emoji_code.EMOJI_PLEASED, emotion=true}, {emo.emoji_code.EMOJI_HEARTSHAPED, emotion=true}, {emo.emoji_code.EMOJI_SURPRISE, emotion=true}, {emo.emoji_code.EMOJI_KISS, emotion=true}, {emo.emoji_code.EMOJI_WRONGED, emotion=true}, {emo.emoji_code.EMOJI_ANGRY, emotion=true}, }, {"http://", "www.", ".com", ".net", ".cn"} } if si.is_international_version() then surface.template = "eng_sym_keyboard3_international" else surface.template = "eng_sym_keyboard3" end surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.extra_elements = { "popup_revert", "popup_explicit", } local enable_slide_symbol = true if si.get_setting_value(si.settings.SYMBOL_DISPLAY_EMOTICON, si.settings_type.SETTING_BOOL) then sym.setup_symbol( surface, symbol_emoticon, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table, "3/3", "chs_sym_keyboard1.sur.png", "chs_sym_keyboard2.sur.png", enable_slide_symbol) else sym.setup_symbol( surface, symbol, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table, "3/3", "chs_sym_keyboard1.sur.png", "chs_sym_keyboard2.sur.png", enable_slide_symbol) end local sk_emo = si.new_softkey() sk_emo.on_click = function() local display_emoticon = si.get_setting_value(si.settings.SYMBOL_DISPLAY_EMOTICON, si.settings_type.SETTING_BOOL) si.set_setting_value(si.settings.SYMBOL_DISPLAY_EMOTICON, not display_emoticon, si.settings_type.SETTING_BOOL) if not display_emoticon then sym.reload_symbol( surface, symbol_emoticon, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table) else sym.reload_symbol( surface, symbol, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table) end end surface.softkeys["sk_emo"] = sk_emo surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open return surface PK n5:QɒUU"5assets/chspy_hard_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "hard_keys" local hk = hard_keys local si = smartinput local pi = si.pending_input local ca = si.candidates local surface = si.new_surface("chspy_hard_phonepad") surface.template = "" surface.surface_type = si.surface_type.HARD_KEYBOARD surface.surface_subtype = si.surface_subtype.KEYBOARD_HARD surface.support_mode = si.context.TEXT surface.multi_input_type = si.input_mode.FUZZY surface.precise_input_type = si.input_mode.PREDICT surface.shortcut_input = true surface.inline_strategy = { si.inline_strategy.PREDICT_EVIDENCE } surface.explicit_strategy = nil surface.extra_elements = { "top_bar=hard_candidate_bar", } smart_symbols = {"…", "@", ",", ";", ":", "。", "(", ")", "?", "!", "“", "”", "-", ".", "'", "~"} hk.setup_keys(surface, smart_symbols) local hk_sym = surface.hardkeys[hk.HARD_KEYCODE_SYM] hk_sym.on_click = function () --ca.confirm_item_2(ca.get_default_index()) while not pi.empty() do pi.delete_range() end ca.clear() si.change_surface_by_id("hard_symbol.sur.png") si.get_current_surface().init() end return surface PK n5:Q/V V "5assets/chspy_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pi = si.pending_input local ca = si.candidates local fi = si.filter_list local s = sf.new_phonepad_keyboard( "chspy_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.UPPER, 0) s.after_load = function() local ts = si.tri_status ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) si.set_setting_value(si.settings.WORD_PREDICTION, true, si.settings_type.SETTING_BOOL) end if not si.is_international_version() then s.template = "chs_soft_phonepad_mainland" else s.template = "chs_soft_phonepad_international" end s.statistic_alias = "phonepad" s.dialect_recommend = true s.on_slip_stroke = true s.on_handwrite = true s.shortcut_input = true s.handwrite_mask = true s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PREDICT s.inline_strategy = nil s.additional_candidate = nil s.explicit_strategy = { si.inline_strategy.PREDICT_EVIDENCE } s.extra_elements = { "top_bar=function_bar/candidate_bar/adduserword_bar/dialect_bar/handwrite_half_filter_bar", "popup_revert", "popup_explicit", "sk_single_word", "sk_ent_explicit", "sk_separator", "sk_clear", "left_scroll", "typing_speed_bar", } --softkeys local sk_1_1 = s.softkeys["sk_1_1"] sk_1_1.on_click = ck.sk_word.on_click local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.main_title = ck.sk_num_right_clear.main_title sk_2_4.on_click = ck.sk_num_right_clear.on_click sk_2_4.on_slide_up = nil sk_2_4.on_slide_down = function(sk) if si.handwrite_mask_visible() and fi.size() > 0 then fi.clear() end local default = ca.get_default_index() if ((not pi.range_exist(pi.L_RANGE_PENDING + pi.L_RANGE_CONFIRM + pi.L_RANGE_CURVE)) and (default ~= 0) and (not (ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND))) then ca.clear() end si.input_precise(sk.alt_input, "", "", false) end s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_hw_mask"] = ck.sk_hw_mask s.softkeys["sk_sp"] = ck.sk_sp_chs s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_chs s.softkeys["sk_bk"] = ck.sk_bk_chs s.softkeys["sk_cancel"] = ck.sk_cancel_chs s.softkeys["sk_lng"] = ck.sk_lng_chs s.softkeys["sk_sym"] = ck.sk_sym_chs s.softkeys["sk_sep"] = ck.sk_sep_abc s.softkeys["Dot"] = ck.sk_dot_chs s.softkeys["Comma"] = ck.sk_comma_chs s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_chs(s) s.commit_input = lc.commit_input return s PK n5:QAG% 5assets/chspy_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_inter_mode = si.is_international_version() local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main if is_curve_mode then if not is_inter_mode then template = "chs_soft_full_curve_mainland" else template = "chs_soft_full_curve_international" end alt_inputs = kb.chs_full_qwerty_alt_curve shift_inputs = kb.chs_full_qwerty_shift_curve else if not is_inter_mode then template = "chs_soft_full_mainland" else template = "chs_soft_full_international" end alt_inputs = kb.chs_full_qwerty_alt end local s = sf.new_full_keyboard( "chspy_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.UPPER, 3) s.after_load = function() local ts = si.tri_status ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) si.set_setting_value(si.settings.WORD_PREDICTION, true, si.settings_type.SETTING_BOOL) end s.template = template s.statistic_alias = "qwerty" s.on_slip_stroke = true s.on_handwrite = true s.dialect_recommend = true s.shortcut_input = true s.handwrite_mask = true s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PREDICT + si.input_mode.PRECISE s.on_curve = true s.additional_candidate = nil s.inline_strategy = nil s.explicit_strategy = { si.inline_strategy.SHUANGPIN_EVIDENCE, si.inline_strategy.DEFAULT_CURVE, si.inline_strategy.PRECISE_INPUT } s.extra_elements = { "top_bar=function_bar/candidate_bar/adduserword_bar/dialect_bar/handwrite_half_filter_bar", "popup_revert", "popup_explicit", "sk_ent_explicit", "sk_sep_sft", "typing_speed_bar", } s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_hw_mask"] = ck.sk_hw_mask s.softkeys["sk_sp"] = ck.sk_sp_chs s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_chs s.softkeys["sk_bk"] = ck.sk_bk_chs s.softkeys["sk_cancel"] = ck.sk_cancel_chs s.softkeys["sk_lng"] = ck.sk_lng_chs s.softkeys["sk_sym"] = ck.sk_sym_chs s.softkeys["sk_sep_sft"] = ck.sk_sep_sft s.softkeys["sk_num"] = ck.sk_num_down s.softkeys["Dot"] = ck.sk_dot_chs s.softkeys["sk_place"] = ck.sk_place s.softkeys["Comma"] = ck.sk_comma_chs s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.commit_input = lc.commit_input return s PK n5:Qk k 5assets/chspy_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "chspy_soft_tplus", kb.eng_tplus_qwerty_left, kb.chs_tplus_qwerty_right, kb.chs_tplus_qwerty_alt, si.TITLE_CASE.UPPER, 3) s.after_load = function() local ts = si.tri_status ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) si.set_setting_value(si.settings.WORD_PREDICTION, true, si.settings_type.SETTING_BOOL) end if not si.is_international_version() then s.template = "chs_soft_tplus_mainland" else s.template = "chs_soft_tplus_international" end s.statistic_alias = "tplus" s.on_slip_stroke = true s.on_handwrite = true s.dialect_recommend = true s.shortcut_input = true s.handwrite_mask = true s.multi_input_type = si.input_mode.FUZZY + si.input_mode.MULTITAP s.precise_input_type = si.input_mode.PREDICT + si.input_mode.PRECISE s.additional_candidate = nil s.inline_strategy = nil s.explicit_strategy = { si.inline_strategy.PREDICT_EVIDENCE } s.extra_elements = { "top_bar=function_bar/candidate_bar/adduserword_bar/dialect_bar/handwrite_half_filter_bar", "popup_revert", "popup_explicit", "sk_ent_explicit", "sk_sep_sft", "typing_speed_bar", } s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_hw_mask"] = ck.sk_hw_mask s.softkeys["sk_sp"] = ck.sk_sp_chs s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_chs s.softkeys["sk_bk"] = ck.sk_bk_chs s.softkeys["sk_cancel"] = ck.sk_cancel_chs s.softkeys["sk_lng"] = ck.sk_lng_chs s.softkeys["sk_sym"] = ck.sk_sym_chs s.softkeys["sk_sep_sft"] = ck.sk_sep_sft s.softkeys["sk_num"] = ck.sk_num_down s.softkeys["Dot"] = ck.sk_dot_chs s.softkeys["Comma"] = ck.sk_comma_chs s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.commit_input = lc.commit_input return s PK n5:Qvj 5assets/chspy_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" local traits = smartinput.new_language_traits() traits.separator = "" traits.case_sensitive = false traits.max_candidate_length = 16 traits.chinese_charset = smartinput.chinese_charset.SIMPLIFIED local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") function traits.is_upper_case(c) local char_code = c return char_code >= A_code and char_code <= Z_code end function traits.is_lower_case(c) local char_code = c return char_code >= a_code and char_code <= z_code end traits.is_input_character = function (c) if traits.is_lower_case(c) then return true elseif c == string.byte("`") then return true else return false end end function traits.is_output_character(c) local char_code = c if char_code >= 0x4e00 and char_code <= 0x9fff then return true else return false end end traits.is_userword_character = traits.is_output_character function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else return c end end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else return c end end function traits.is_case_sensitive_character(c) if c >= a_code and c <= z_code then return true elseif c >= A_code and c <= A_code then return true else return false end end function traits.is_word_begin_character(c) if c == string.byte("`") then --smartinput.print("word begin = false") return false else --smartinput.print("word begin = true") return true end end function traits.is_word_middle_character(c) return true end function traits.get_output_char(c) --smartinput.print("####traits.get_output_char(" .. c .. ") called") local map = { CT_BihuaHeng = {0x31D0, 0x4e00}, CT_BihuaShu = {0x31D1, 0x4e28}, CT_BihuaPie = {0x31D3, 0x4e3f}, CT_BihuaNa = {0x31CF, 0x4e36}, CT_BihuaZhe = {0x31D5, 0x4e59} } for i, e in pairs(map) do if c == e[1] then return e[2] end end return c end function traits.get_trans_letter(c) local map = { comma = {0x002C, 0xFF0C}, dot = {0x002E, 0x3002}, {0x003f, 0xFF1F}, -- question mark {0x0021, 0xFF01}, -- exclamation mark {0x003A, 0xFF1A}, -- colon {0x003B, 0xFF1B}, -- semicolon {0x005C, 0x3001}, -- pause mark {0x0028, 0xFF08}, -- left parenthesis {0x0029, 0xFF09}, -- right parenthesis {0x005B, 0x3010}, -- left bracket {0x005D, 0x3011}, -- right bracket {0x003C, 0x300A}, -- left book title punctuation mark {0x003E, 0x300B}, -- right book title punctuation mark {0x007B, 0xFF5B}, -- left brace {0x007D, 0xFF5D}, -- right brace } --smartinput.print("####traits.get_trans_letter") for i, e in pairs(map) do if c == e[1] then --smartinput.print("####traits.get_trans_letter: " .. e[1] .. "=" .. e[2]) return e[2] end end return c end traits.is_contact_character = traits.is_output_character return traits PK n5:Q)!5assets/chsstroke_soft.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "lua_calls" local si = smartinput local ck = common_keys local pi = si.pending_input local ca = si.candidates local lc = lua_calls local s = si.new_surface("chsstroke_soft") if not si.is_international_version() then s.template = "chsstroke_soft_mainland" else s.template = "chsstroke_soft_international" end s.statistic_alias = "other" s.surface_type = si.surface_type.SOFT_KEYBOARD s.surface_subtype = smartinput.surface_subtype.KEYBOARD_OTHER s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PREDICT s.inline_strategy = nil s.on_slip_left = nil s.on_slip_right = nil s.on_handwrite = true s.handwrite_mask = true s.explicit_strategy = { si.inline_strategy.PREDICT_EVIDENCE } s.extra_elements = { "top_bar=function_bar/candidate_bar/handwrite_half_filter_bar", "popup_revert", "popup_explicit", "sk_ent_explicit", "left_scroll", "typing_speed_bar", } input_cont = { "㇐", "㇑", "㇓", "㇏", "㇕", "`", "*", ":", "…", } input_name = { "heng", "shu", "pie", "na", "zhe", "ci", "tong", "colon", "ellipsis", } input_main_title = { "一", "丨", "丿", "丶", "乙", "词语", "通配", ":", "…", } input_alt_title = { "足", "疒", "纟", "钅", "宀", "月", "衤", "雨", "走", } alt_action_traits = { {"㇑", "㇕", "㇐", "㇑", "㇐", "㇑", "㇐"}, {"㇏", "㇐", "㇓", "㇏", "㇐"}, {"㇕", "㇕", "㇐"}, {"㇓", "㇐", "㇐", "㇐", "㇕"}, {"㇏", "㇏", "㇕"}, {"㇓", "㇕", "㇐", "㇐"}, {"㇏", "㇕", "㇑", "㇓", "㇏"}, {"㇐", "㇏", "㇕", "㇑", "㇏", "㇏", "㇏", "㇏"}, {"㇐", "㇑", "㇐", "㇑", "㇐", "㇓", "㇏"}, } for i, v in pairs(input_cont) do local sk = si.new_softkey() sk.main_title = input_main_title[i] sk.alt_title = input_alt_title[i] sk.on_click = function () si.input_precise(v, "", "", false) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end end sk.on_slide_down = function () for j, ac in pairs(alt_action_traits[i]) do si.input_precise(ac, "", "", false) end end s.softkeys["sk_" .. input_name[i]] = sk end local sk_colon = s.softkeys["sk_colon"] sk_colon.on_click = function () ck.commit_chs() si.input_string(sk_colon.main_title, false) end local sk_ellipsis = s.softkeys["sk_ellipsis"] sk_ellipsis.on_click = function () ck.commit_chs() si.input_string(sk_ellipsis.main_title, false) end s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_sp"] = ck.sk_sp_stroke s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_stroke s.softkeys["sk_bk"] = ck.sk_bk_chs s.softkeys["sk_cancel"] = ck.sk_cancel_stroke s.softkeys["sk_lng"] = ck.sk_lng_chs s.softkeys["sk_sym"] = ck.sk_sym_chs s.softkeys["sk_abc"] = ck.sk_abc s.softkeys["sk_num"] = ck.sk_num_right s.softkeys["Dot"] = ck.sk_dot_chs s.softkeys["sk_place"] = ck.sk_place s.softkeys["Comma"] = ck.sk_comma_chs s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_hw_mask"] = ck.sk_hw_mask ck.setup_emoji_list_chs(s) s.commit_input = lc.commit_input return s PK n5:Qi7 5assets/chsstroke_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" local traits = smartinput.new_language_traits() traits.case_sensitive = false traits.max_candidate_length = 16 traits.chinese_charset = smartinput.chinese_charset.SIMPLIFIED input_char = { "㇐","㇑","㇓","㇏","㇕","*" } input_code = { 12752, 12753, 12755, 12751, 12757, 42 } local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") function traits.is_upper_case(c) local char_code = c return char_code >= A_code and char_code <= Z_code end function traits.is_lower_case(c) local char_code = c return char_code >= a_code and char_code <= z_code end function traits.is_input_character (c) for i, v in pairs(input_code) do if c == v then return true end end if c == 96 then return true end return false end function traits.is_output_character(c) local char_code = c if char_code >= 0x4e00 and char_code <= 0x9fff then return true else return false end end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else return c end end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else return c end end function traits.is_case_sensitive_character(c) if c >= a_code and c <= z_code then return true elseif c >= A_code and c <= A_code then return true else return false end end traits.is_ignore_when_candidate_empty = traits.is_input_character traits.is_userword_character = traits.is_output_character function traits.is_word_begin_character (c) return true end function traits.is_word_middle_character (c) return true end function traits.get_output_char(c) --smartinput.print("####traits.get_output_char(" .. c .. ") called") local map = { CT_BihuaHeng = {0x31D0, 0x4e00}, CT_BihuaShu = {0x31D1, 0x4e28}, CT_BihuaPie = {0x31D3, 0x4e3f}, CT_BihuaNa = {0x31CF, 0x4e36}, CT_BihuaZhe = {0x31D5, 0x4e59} } for i, e in pairs(map) do if c == e[1] then return e[2] end end return c end traits.is_contact_character = traits.is_output_character return traits PK n5:QĖڛ"5assets/chswb_hard_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "hard_keys" local hk = hard_keys local si = smartinput local pi = si.pending_input local ca = si.candidates local surface = si.new_surface("chswb_hard_phonepad") surface.template = "" surface.surface_type = si.surface_type.HARD_KEYBOARD surface.surface_subtype = si.surface_subtype.KEYBOARD_HARD surface.support_mode = si.context.TEXT surface.multi_input_type = si.input_mode.FUZZY surface.precise_input_type = si.input_mode.PREDICT surface.shortcut_input = true surface.inline_strategy = { si.inline_strategy.PRECISE_INPUT } surface.explicit_strategy = nil surface.extra_elements = { "top_bar=hard_candidate_bar", } surface.additional_candidate = nil surface.display_candidate_code = true smart_symbols = {"…", "@", ",", ";", ":", "。", "(", ")", "?", "!", "“", "”", "-", ".", "'", "~"} hk.setup_keys(surface, smart_symbols) local hk_sym = surface.hardkeys[hk.HARD_KEYCODE_SYM] hk_sym.on_click = function () --ca.confirm_item_2(ca.get_default_index()) while not pi.empty() do pi.delete_range() end ca.clear() si.change_surface_by_id("hard_symbol.sur.png") si.get_current_surface().init() end return surface PK n5:QZ 5assets/chswb_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local pi = si.pending_input local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_full_keyboard( "chswb_soft_qwerty", kb.eng_full_qwerty_main, kb.chs_full_qwerty_alt, nil, true, si.TITLE_CASE.UPPER, 3) if not si.is_international_version() then s.template = "wb_soft_full" else s.template = "wb_soft_full_international" end s.statistic_alias = "qwerty" s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PREDICT s.additional_candidate = nil s.display_candidate_code = true s.shortcut_input = true s.inline_strategy = nil s.on_handwrite = true s.handwrite_mask = true s.explicit_strategy = { si.inline_strategy.PRECISE_INPUT } s.extra_elements = { "top_bar=function_bar/candidate_bar/handwrite_half_filter_bar", "popup_explicit", "sk_ent_explicit", "popup_revert", "typing_speed_bar", } s.softkeys["sk_3_1"].on_click = function (sk, key_name) if ck.pinyin_enabled() then if pi.empty() then ck.commit_wubi_z() si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) elseif pi.get_signal_code() ~= 0 then --Z mode si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end else si.input_keycode(_G.config.L_KEYCODE_PINYIN_DISABLED) end if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end end s.softkeys["sk_3_1"].on_slide_up = function (sk, key_name) if ck.pinyin_enabled() then if sk.shift_input == nil then if pi.empty() then ck.commit_wubi_z() si.input_precise(sk.main_input, key_name, sk.alt_input, not si.is_shift_pressed()) elseif pi.get_signal_code() ~= 0 then --Z mode si.input_precise(sk.main_input, key_name, sk.alt_input, not si.is_shift_pressed()) end else si.input_precise(sk.shift_input, "", "", not si.is_shift_pressed()) end else si.input_keycode(_G.config.L_KEYCODE_PINYIN_DISABLED) end end s.softkeys["sk_3_1"].on_long_press_once = function (sk) local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local key1 = si.new_softkey() key1.main_title = sk.alt_title key1.main_input = sk.alt_title key1.on_click = function(sk_1) si.input_precise(sk_1.main_title, "", "", false) end sur.softkeys[1] = key1 local key2 = si.new_softkey() key2.main_title = sk.main_title key2.main_input = sk.main_input key2.on_click = function(sk_2) if ck.pinyin_enabled() then ck.commit_wubi_z() si.input_precise(sk_2.main_input, "", "", false) else si.candidates.clear() -- do nothing, for packup popup surface si.input_keycode(_G.config.L_KEYCODE_PINYIN_DISABLED) end end sur.softkeys[2] = key2 si.popup_surface(sur) si.set_default_key(1) end -- not correct mistyping for "z" & "x" s.softkeys["sk_3_1"].mistyping_tolerant = false s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_sp"] = ck.sk_sp_chs s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_chs s.softkeys["sk_bk"] = ck.sk_bk_chs s.softkeys["sk_cancel"] = ck.sk_cancel_chs s.softkeys["sk_lng"] = ck.sk_lng_chs s.softkeys["sk_sym"] = ck.sk_sym_chs s.softkeys["sk_crt"] = ck.sk_crt s.softkeys["sk_num"] = ck.sk_num_down s.softkeys["Dot"] = ck.sk_dot_chs s.softkeys["sk_place"] = ck.sk_place s.softkeys["Comma"] = ck.sk_comma_chs s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_hw_mask"] = ck.sk_hw_mask s.commit_input = lc.commit_input s.on_slip_left = function() si.change_surface_by_subtype(si.surface_subtype.KEYBOARD_TPLUS) end s.on_slip_right = function() si.change_surface_by_subtype(si.surface_subtype.KEYBOARD_TPLUS) end return s PK n5:QjK5assets/chswb_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local pi = si.pending_input local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "chswb_soft_tplus", kb.wubi_tplus_left, kb.wubi_tplus_right, kb.chs_tplus_qwerty_alt, si.TITLE_CASE.UPPER, 3) if not si.is_international_version() then s.template = "wb_soft_tplus" else s.template = "wb_soft_tplus_international" end s.statistic_alias = "tplus" s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PREDICT s.additional_candidate = nil s.display_candidate_code = true s.shortcut_input = true s.inline_strategy = nil s.on_handwrite = true s.handwrite_mask = true s.explicit_strategy = { si.inline_strategy.PREDICT_EVIDENCE } s.extra_elements = { "top_bar=function_bar/candidate_bar/handwrite_half_filter_bar", "popup_explicit", "sk_ent_explicit", "popup_revert", "typing_speed_bar", } s.softkeys["sk_3_1"].on_click = function (sk, key_name) if ck.pinyin_enabled() then if pi.empty() then ck.commit_wubi_z() si.input_precise(sk.left_input, key_name, sk.alt_input, si.is_shift_pressed()) elseif pi.get_signal_code() ~= 0 then --Z mode si.input_precise(sk.left_input, key_name, sk.alt_input, si.is_shift_pressed()) end else si.input_keycode(_G.config.L_KEYCODE_PINYIN_DISABLED) end end s.softkeys["sk_3_1"].on_slide_up = function (sk) if ck.pinyin_enabled() then if si.is_empty(sk.left_input) or si.is_empty(sk.right_input) then if pi.empty() then ck.commit_wubi_z() si.input_precise(sk.left_input .. sk.right_input, "", sk.alt_input, not si.is_shift_pressed()) elseif pi.get_signal_code() ~= 0 then --Z mode si.input_precise(sk.left_input .. sk.right_input, "", sk.alt_input, not si.is_shift_pressed()) end else si.input_multi(sk.left_input .. sk.right_input, sk.alt_input, not si.is_shift_pressed()) end else si.input_keycode(_G.config.L_KEYCODE_PINYIN_DISABLED) end end s.softkeys["sk_3_1"].on_long_press_once = function (sk) local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local key1 = si.new_softkey() key1.main_title = sk.alt_title key1.main_input = sk.alt_title key1.on_click = function(sk_1) si.input_precise(sk_1.main_title, "", "", false) end sur.softkeys[1] = key1 local key2 = si.new_softkey() key2.main_title = sk.main_title key2.main_input = sk.left_input key2.on_click = function(sk_2) if ck.pinyin_enabled() then ck.commit_wubi_z() si.input_precise(sk_2.main_input, "", "", false) else si.candidates.clear() -- do nothing, for packup popup surface si.input_keycode(_G.config.L_KEYCODE_PINYIN_DISABLED) end end sur.softkeys[2] = key2 si.popup_surface(sur) si.set_default_key(1) end s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_sp"] = ck.sk_sp_chs s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_chs s.softkeys["sk_bk"] = ck.sk_bk_chs s.softkeys["sk_cancel"] = ck.sk_cancel_chs s.softkeys["sk_lng"] = ck.sk_lng_chs s.softkeys["sk_sym"] = ck.sk_sym_chs s.softkeys["sk_crt"] = ck.sk_crt s.softkeys["sk_num"] = ck.sk_num_down s.softkeys["Dot"] = ck.sk_dot_chs s.softkeys["Comma"] = ck.sk_comma_chs s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_hw_mask"] = ck.sk_hw_mask s.commit_input = lc.commit_input s.on_slip_left = function() si.change_surface_by_subtype(si.surface_subtype.KEYBOARD_FULL) end s.on_slip_right = function() si.change_surface_by_subtype(si.surface_subtype.KEYBOARD_FULL) end return s PK n5:QkWm m 5assets/chswb_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" local traits = smartinput.new_language_traits() traits.separator = "" traits.case_sensitive = false traits.commit_input_size = 4 traits.max_candidate_length = 16 traits.chinese_charset = smartinput.chinese_charset.SIMPLIFIED local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") function traits.is_wubi_z_code(c) if c == z_code or c == Z_code then return true else return false end end function traits.is_upper_case(c) local char_code = c return char_code >= A_code and char_code <= Z_code end function traits.is_lower_case(c) local char_code = c return char_code >= a_code and char_code <= z_code end traits.is_input_character = function (c) if traits.is_lower_case(c) then return true elseif c == string.byte("`") then return true else return false end end function traits.is_output_character(c) local char_code = c if char_code >= 0x4e00 and char_code <= 0x9fff then return true else return false end end traits.is_userword_character = traits.is_output_character function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else return c end end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else return c end end function traits.is_case_sensitive_character(c) if c >= a_code and c <= z_code then return true elseif c >= A_code and c <= A_code then return true else return false end end function traits.is_word_begin_character(c) if c == string.byte("`") then --smartinput.print("word begin = false") return false else --smartinput.print("word begin = true") return true end end function traits.is_word_middle_character(c) return true end function traits.get_output_char(c) --smartinput.print("####traits.get_output_char(" .. c .. ") called") local map = { CT_BihuaHeng = {0x31D0, 0x4e00}, CT_BihuaShu = {0x31D1, 0x4e28}, CT_BihuaPie = {0x31D3, 0x4e3f}, CT_BihuaNa = {0x31CF, 0x4e36}, CT_BihuaZhe = {0x31D5, 0x4e59} } for i, e in pairs(map) do if c == e[1] then return e[2] end end return c end function traits.get_trans_letter(c) local map = { comma = {0x002C, 0xFF0C}, dot = {0x002E, 0x3002}, {0x003f, 0xFF1F}, -- question mark {0x0021, 0xFF01}, -- exclamation mark {0x003A, 0xFF1A}, -- colon {0x003B, 0xFF1B}, -- semicolon {0x005C, 0x3001}, -- pause mark {0x0028, 0xFF08}, -- left parenthesis {0x0029, 0xFF09}, -- right parenthesis {0x005B, 0x3010}, -- left bracket {0x005D, 0x3011}, -- right bracket {0x003C, 0x300A}, -- left book title punctuation mark {0x003E, 0x300B}, -- right book title punctuation mark {0x007B, 0xFF5B}, -- left brace {0x007D, 0xFF5D}, -- right brace } --smartinput.print("####traits.get_trans_letter") for i, e in pairs(map) do if c == e[1] then --smartinput.print("####traits.get_trans_letter: " .. e[1] .. "=" .. e[2]) return e[2] end end return c end traits.is_contact_character = traits.is_output_character return traits PK n5:Q="5assets/chtzy_hard.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" local si = smartinput local pi = si.pending_input local ca = si.candidates local fl = si.filter_list local fs = si.current_focus local surface = si.new_surface("chtzy_hard") surface.surface_type = si.surface_type.HARD_KEYBOARD surface.surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD surface.support_mode = si.context.TEXT surface.multi_input_type = si.input_mode.FUZZY + smartinput.input_mode.MULTITAP surface.precise_input_type = si.input_mode.PREDICT + smartinput.input_mode.PRECISE return surface PK n5:Q p//"5assets/chtzy_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local fi = si.filter_list local s = sf.new_phonepad_keyboard( "chtzy_soft_phonepad", kb.cht_phonepad_main, nil, si.TITLE_CASE.UPPER, 0) if si.is_international_version() then s.template = "cht_soft_phonepad_international" else s.template = "cht_soft_phonepad" end s.statistic_alias = "phonepad" s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PREDICT s.additional_candidate = nil s.inline_strategy = nil s.on_handwrite = true s.handwrite_mask = true s.explicit_strategy = { si.inline_strategy.PREDICT_EVIDENCE } s.extra_elements = { "top_bar=function_bar/candidate_bar/handwrite_half_filter_bar", "popup_revert", "popup_explicit", "sk_ent_explicit", "left_scroll", "zhuyin_first_tone", "separator", "typing_speed_bar", } --softkeys local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_num_right.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_ent"] = ck.sk_ent_cht s.softkeys["sk_bk"] = ck.sk_bk_chs s.softkeys["sk_cancel"] = ck.sk_cancel_chs s.softkeys["sk_lng"] = ck.sk_lng_chs s.softkeys["sk_sym"] = ck.sk_sym_cht s.softkeys["sk_num"] = ck.sk_num_right s.softkeys["sk_abc"] = ck.sk_abc s.softkeys["Comma"] = ck.sk_comma_chs s.softkeys["Dot"] = ck.sk_dot_cht s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_hw_mask"] = ck.sk_hw_mask ck.setup_emoji_list_chs(s) local pi = si.pending_input local function tone_character(c) if c == 0x02c7 or c == 0x02cb or c == 0x02ca or c == 0x02d9 or c == 0x2c9 then return true else return false end end local function prev_is_tone() if not pi.range_exist(pi.L_RANGE_PENDING) then return false end local last_input = pi.get_last_input() --si.print (last_input) u16str = si.utf8_to_utf16(last_input) local pre_is_tone = true for k, v in _G.pairs(u16str) do -- si.print(v) if not tone_character(v) then pre_is_tone = false break end end return pre_is_tone end local function next_tone(c) for k, v in _G.pairs(c) do if v == 0x02c7 then return 0x02cb end if v == 0x02cb then return 0x02ca end if v == 0x02ca then return 0x02d9 end end return 0x02c7 end local sk_tone = s.softkeys["sk_4_2"] sk_tone.on_click = function() local last_input = pi.get_last_input() local u16str = si.utf8_to_utf16(last_input) if prev_is_tone() then pi.delete_character() end if pi.empty() then si.input_string(_G.string.sub(sk_tone.main_input, 1, 2), false) else si.input_precise(si.u16char(next_tone(u16str)), "", "", false) end if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end end sk_tone.on_long_press_once = function() if prev_is_tone() then pi.delete_character() end if pi.empty() then local tb = {} local num = 1 for sym in si.u16_iter(sk_tone.main_input) do tb[num] = si.u16char(sym) num = num + 1 end ck.show_expand_symbols(tb, 1) else sf.on_long_press_once(sk_tone) end end local sk_sp = si.new_softkey() sk_sp.on_click = function() local ca = si.candidates local default = ca.get_default_index() if not pi.empty() and si.bopomofo_tone(1) then if prev_is_tone() then ca.confirm_item_2(default) else si.input_precise("ˉ", "", "", false) end elseif not pi.empty() and ca.empty() then pi.commit_input() elseif default ~= 0 then ca.confirm_item_2(default) else if fi.size() > 0 then --handwrite mask candidate fi.clear() end ca.clear() si.input_keycode(_G.config.L_KEYCODE_SPACE) end end sk_sp.on_long_press_once = function() ck.show_voice_input_view(ck.commit_chs) end sk_sp.on_long_press_slide_left = ck.sk_sp_chs.on_long_press_slide_left sk_sp.on_long_press_slide_right = ck.sk_sp_chs.on_long_press_slide_right sk_sp.on_slide_left = ck.sk_sp_chs.on_slide_left sk_sp.on_slide_right = ck.sk_sp_chs.on_slide_right s.softkeys["sk_sp"] = sk_sp s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.commit_input = lc.commit_input return s PK n5:QBڌ 5assets/chtzy_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local fi = si.filter_list local sk_main_inputs = kb.cht_qwerty_main local s = sf.new_full_keyboard( "chtzy_soft_qwerty", kb.cht_full_main, nil, nil, false, si.TITLE_CASE.NO_CHANGE, 0) if si.is_international_version() then s.template = "cht_soft_qwerty_international" else s.template = "cht_soft_qwerty" end s.statistic_alias = "qwerty" s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PREDICT s.additional_candidate = nil s.inline_strategy = nil s.on_handwrite = true s.handwrite_mask = true s.explicit_strategy = { si.inline_strategy.PRECISE_INPUT, } s.extra_elements = { "top_bar=function_bar/candidate_bar/handwrite_half_filter_bar", "popup_revert", "popup_explicit", "sk_ent_explicit", "zhuyin_first_tone", "typing_speed_bar", } s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_ent"] = ck.sk_ent_cht s.softkeys["sk_bk"] = ck.sk_bk_chs s.softkeys["sk_cancel"] = ck.sk_cancel_chs s.softkeys["sk_lng"] = ck.sk_lng_chs s.softkeys["sk_sym"] = ck.sk_sym_cht s.softkeys["Comma"] = ck.sk_comma_chs s.softkeys["Dot"] = ck.sk_dot_cht s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_hw_mask"] = ck.sk_hw_mask local sk_main_inputs = kb.cht_full_main for i = 1, #sk_main_inputs do for j = 1, #sk_main_inputs[i] do local key = s.softkeys["sk_" .. i .. "_" .. j] key.on_slide_up = nil key.on_slide_down = nil key.on_long_press_once = nil end end function tone_character(c) if c == 0x02c7 or c == 0x02cb or c == 0x02ca or c == 0x02d9 or c == 0x2c9 then return true else return false end end local pi = si.pending_input function prev_is_tone() if not pi.range_exist(pi.L_RANGE_PENDING) then return false end local last_input = pi.get_last_input() --si.print (last_input) u16str = si.utf8_to_utf16(last_input) local pre_is_tone = true for k, v in _G.pairs(u16str) do --si.print(v) if not tone_character(v) then pre_is_tone = false break end end return pre_is_tone end function full_on_click2(sk, key_name) if prev_is_tone() then pi.delete_character() end if pi.empty() then if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end si.input_string(sk.main_input, false) else sf.full_on_click(sk, key_name) end end local sk_1_3 = s.softkeys["sk_1_3"] local sk_1_4 = s.softkeys["sk_1_4"] local sk_1_6 = s.softkeys["sk_1_6"] local sk_1_7 = s.softkeys["sk_1_7"] local tone_sk = { sk_1_3, sk_1_4, sk_1_6, sk_1_7, } for k, v in _G.pairs(tone_sk) do v.on_click = full_on_click2 end local sk_sp = si.new_softkey() sk_sp.mistyping_tolerant = true sk_sp.on_click = function(sk, key_name) local ca = si.candidates local default = ca.get_default_index() if not pi.empty() and si.bopomofo_tone(1) then if prev_is_tone() then ca.confirm_item_2(default) else si.input_precise("ˉ", key_name, "", false) end elseif not pi.empty() and ca.empty() then pi.commit_input() elseif default ~= 0 then ca.confirm_item_2(default) else if fi.size() > 0 then --handwrite mask candidates fi.clear() end ca.clear() si.input_keycode(_G.config.L_KEYCODE_SPACE) end end sk_sp.on_long_press_once = function() ck.show_voice_input_view(ck.commit_chs) end sk_sp.on_long_press_slide_left = ck.sk_sp_chs.on_long_press_slide_left sk_sp.on_long_press_slide_right = ck.sk_sp_chs.on_long_press_slide_right sk_sp.on_slide_left = ck.sk_sp_chs.on_slide_left sk_sp.on_slide_right = ck.sk_sp_chs.on_slide_right s.softkeys["sk_sp"] = sk_sp s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.commit_input = lc.commit_input return s PK n5:Q n5assets/chtzy_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local fi = si.filter_list local s = sf.new_tplus_keyboard( "chtzy_soft_tplus", kb.cht_tplus_left, kb.cht_tplus_right, nil, si.TITLE_CASE.NO_CHANGE, 15) if si.is_international_version() then s.template = "cht_soft_tplus_international" else s.template = "cht_soft_tplus" end s.statistic_alias = "tplus" s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PREDICT s.additional_candidate = nil s.inline_strategy = nil s.on_handwrite = true s.handwrite_mask = true s.explicit_strategy = { si.inline_strategy.PREDICT_EVIDENCE } s.extra_elements = { "top_bar=function_bar/candidate_bar/handwrite_half_filter_bar", "popup_revert", "popup_explicit", "sk_ent_explicit", "zhuyin_first_tone", "typing_speed_bar", } --softkeys s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_ent"] = ck.sk_ent_cht s.softkeys["sk_bk"] = ck.sk_bk_chs s.softkeys["sk_cancel"] = ck.sk_cancel_chs s.softkeys["sk_lng"] = ck.sk_lng_chs s.softkeys["sk_sym"] = ck.sk_sym_cht s.softkeys["Comma"] = ck.sk_comma_chs s.softkeys["Dot"] = ck.sk_dot_cht s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_hw_mask"] = ck.sk_hw_mask for k, v in _G.pairs(s.softkeys) do v.on_slide_up = nil v.on_slide_upleft = nil v.on_slide_upright = nil end function tone_character(c) if c == 0x02c7 or c == 0x02cb or c == 0x02ca or c == 0x02d9 or c == 0x2c9 then return true else return false end end local pi = si.pending_input function prev_is_tone() if not pi.range_exist(pi.L_RANGE_PENDING) then return false end local last_input = pi.get_last_input() --si.print (last_input) u16str = si.utf8_to_utf16(last_input) local pre_is_tone = true for k, v in _G.pairs(u16str) do --si.print(v) if not tone_character(v) then pre_is_tone = false break end end return pre_is_tone end function tplus_on_click2(sk) local last_input = pi.get_last_input() if prev_is_tone() then pi.delete_character() end if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end if not pi.empty() then if last_input == sk.left_input then sf.tplus_on_slide_right(sk) elseif last_input == sk.right_input then sf.tplus_on_slide_left(sk) else sf.tplus_on_slide_left(sk) end else si.input_string(sk.left_input, false) end end function tplus_on_slide_left2(sk) if prev_is_tone() then pi.delete_character() end if pi.empty() then si.input_string(sk.left_input, false) else sf.tplus_on_slide_left(sk) end end function tplus_on_slide_right2(sk) if prev_is_tone() then pi.delete_character() end if pi.empty() then si.input_string(sk.right_input, false) else sf.tplus_on_slide_right(sk) end end function on_long_press_once2(sk) if prev_is_tone() then pi.delete_character() end if pi.empty() then ck.show_expand_symbols({sk.left_input, sk.right_input}, 1) else sf.on_long_press_once(sk) end end local sk_1_2 = s.softkeys["sk_1_2"] local sk_1_4 = s.softkeys["sk_1_4"] local tone_sk = { sk_1_2, sk_1_4 } local sk_5_1 = s.softkeys["sk_5_1"] sk_5_1.on_long_press_once = nil for k, v in _G.pairs(tone_sk) do v.on_click = tplus_on_click2 v.on_slide_left = tplus_on_slide_left2 v.on_slide_right = tplus_on_slide_right2 v.on_long_press_once = on_long_press_once2 end local sk_sp = si.new_softkey() sk_sp.on_click = function() local ca = si.candidates local default = ca.get_default_index() if not pi.empty() and si.bopomofo_tone(1) then if prev_is_tone() then ca.confirm_item_2(default) else si.input_precise("ˉ", "", "", false) end elseif not pi.empty() and ca.empty() then pi.commit_input() elseif default ~= 0 then ca.confirm_item_2(default) else if fi.size() > 0 then --handwrite mask candidates fi.clear() end ca.clear() si.input_keycode(_G.config.L_KEYCODE_SPACE) end end sk_sp.on_long_press_once = function() ck.show_voice_input_view(ck.commit_chs) end sk_sp.on_long_press_slide_left = ck.sk_sp_chs.on_long_press_slide_left sk_sp.on_long_press_slide_right = ck.sk_sp_chs.on_long_press_slide_right sk_sp.on_slide_left = ck.sk_sp_chs.on_slide_left sk_sp.on_slide_right = ck.sk_sp_chs.on_slide_right s.softkeys["sk_sp"] = sk_sp s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.commit_input = lc.commit_input return s PK n5:Q 5assets/chtzy_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" local si = smartinput local traits = smartinput.new_language_traits() traits.case_sensitive = false traits.max_candidate_length = 16 traits.chinese_charset = smartinput.chinese_charset.TRADITIONAL local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") function traits.is_upper_case(c) local char_code = c return char_code >= A_code and char_code <= Z_code end function traits.is_lower_case(c) local char_code = c return char_code >= a_code and char_code <= z_code end function traits.is_input_character (c) zhuyin_chars = { {"ㄅ", "ㄉ", "ˇ", "ˋ", "ㄓ", "ˊ", "˙", "ㄚ", "ㄞ", "ㄢ"}, {"ㄆ", "ㄊ", "ㄍ", "ㄐ", "ㄔ", "ㄗ", "ㄧ", "ㄛ", "ㄟ", "ㄣ"}, {"ㄇ", "ㄋ", "ㄎ", "ㄑ", "ㄕ", "ㄘ", "ㄨ", "ㄜ", "ㄠ", "ㄤ"}, {"ㄈ", "ㄌ", "ㄏ", "ㄒ", "ㄖ", "ㄙ", "ㄩ", "ㄝ", "ㄡ", "ㄥ"}, {"ㄦ", "ˉ"} } for i, row in _G.pairs(zhuyin_chars) do for j, zy_ch in _G.pairs(row) do if c == si.u16code(zy_ch, 1) then return true end end end return false end function traits.is_output_character(c) local char_code = c if char_code >= 0x4e00 and char_code <= 0x9fff then return true else return false end end function traits.is_output_character(c) local char_code = c if char_code >= 0x4e00 and char_code <= 0x9fff then return true else return false end end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else return c end end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else return c end end function traits.is_case_sensitive_character(c) if c >= a_code and c <= z_code then return true elseif c >= A_code and c <= A_code then return true else return false end end traits.is_ignore_when_candidate_empty = traits.is_input_character traits.is_userword_character = traits.is_output_character function traits.is_word_begin_character (c) zhuyin_tones = { "ˇ", "ˋ", "ˊ", "˙", "ˉ"} for i, tones in pairs(zhuyin_tones) do --si.print("zhuyin_begin") --si.print(c) --si.print(si.u16code(tones, 1)) if c == si.u16code(tones, 1) then --si.print("tones") return false end end return true end function traits.is_bopomofo_tone(c) return not traits.is_word_begin_character (c) end function traits.is_word_middle_character (c) return true end traits.is_contact_character = traits.is_output_character return traits PK n5:Q(5assets/clipboard.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" local si = smartinput local ck = common_keys local surface = si.new_surface("clipboard") surface.on_load = function (old_surface) surface.softkeys["sk_url"] = old_surface.softkeys["sk_url"] surface.softkeys["sk_voice"] = old_surface.softkeys["sk_voice"] surface.softkeys["sk_hw_mask"] = old_surface.softkeys["sk_hw_mask"] surface.softkeys["sk_edit"] = old_surface.softkeys["sk_edit"] surface.softkeys["sk_clipboard"] = ck.sk_back_to_previous surface.softkeys["sk_back"] = ck.sk_back_to_previous surface.softkeys["sk_bk"] = old_surface.softkeys["sk_bk"] surface.softkeys["sk_quick_switcher"] = old_surface.softkeys["sk_quick_switcher"] surface.softkeys["sk_mo"] = old_surface.softkeys["sk_mo"] surface.softkeys["sk_clear_candidate"] = old_surface.softkeys["sk_clear_candidate"] surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open end surface.template = "clipboard" surface.surface_type = smartinput.surface_type.SOFT_SPECIAL surface.touch_correct = false surface.softkeys["sk_back_from_clipboard"] = si.new_softkey() surface.softkeys["sk_back_from_clipboard"].on_click = function() si.back_to_keyboard() end surface.extra_elements = { "clipboard_view", "top_bar=none", } return surfacePK n5:Q}W`W`5assets/common_keys.lua.pngUT n_n_n_ WГWГWГrequire "smartinput" local P = {} P._G = _G if _REQUIREDNAME == nil then common_keys = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local si = _G.smartinput local pi = si.pending_input local ca = si.candidates local ts = si.tri_status local fi = si.filter_list function setup_dpad_keys(surface) local hk_up = si.new_hardkey() surface.hardkeys[si.hard_keycode.HARD_KEYCODE_DPAD_UP] = hk_up hk_up.on_click = function () if not ca.empty() then si.input_keycode(_G.config.L_KEYCODE_FUN_CANDIDATE_UP) else return 1 end end local hk_down = si.new_hardkey() surface.hardkeys[si.hard_keycode.HARD_KEYCODE_DPAD_DOWN] = hk_down hk_down.on_click = function () if not ca.empty() then si.input_keycode(_G.config.L_KEYCODE_FUN_CANDIDATE_DOWN) else return 1 end end local hk_left = si.new_hardkey() surface.hardkeys[si.hard_keycode.HARD_KEYCODE_DPAD_LEFT] = hk_left hk_left.on_click = function () if not ca.empty() then local index = ca.get_default_index() - 1 if index < 1 then index = 1 end if index >= 1 then ca.set_default_index(index) end si.input_keycode(_G.config.L_KEYCODE_FUN_CANDIDATE_LEFT) else return 1 end end local hk_right = si.new_hardkey() surface.hardkeys[si.hard_keycode.HARD_KEYCODE_DPAD_RIGHT] = hk_right hk_right.on_click = function () if not ca.empty() then local index = ca.get_default_index() + 1 if ca.get_item(index) ~= nil then ca.set_default_index(index) si.input_keycode(_G.config.L_KEYCODE_FUN_CANDIDATE_RIGHT) end else return 1 end end local hk_center = si.new_hardkey() surface.hardkeys[si.hard_keycode.HARD_KEYCODE_DPAD_CENTER] = hk_center hk_center.on_click = function () if not ca.empty() then local default = ca.get_default_index() if default ~= 0 then ca.confirm_item_2(default) end else return 1 end end end function surface_on_slip_left() local surface = si.get_current_surface(); local st = surface.surface_subtype + 1 if st > si.surface_subtype.KEYBOARD_TPLUS then st = si.surface_subtype.KEYBOARD_PHONEPAD end si.change_surface_by_subtype(st) end function surface_on_slip_right() local surface = si.get_current_surface(); local st = surface.surface_subtype - 1 if st < si.surface_subtype.KEYBOARD_PHONEPAD then st = si.surface_subtype.KEYBOARD_TPLUS end si.change_surface_by_subtype(st) end function commit_eng() --commit user input directly if not pi.context_empty() then pi.finish_composing() end if not pi.empty() then local default = ca.get_default_index() if default ~= 0 then ca.confirm_item_2(default) end end local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() clear_wave_hints() end function commit_eng_no_space() local changed = false local sym_setting = si.get_setting_value(si.settings.AUTO_SPACE, si.settings_type.SETTING_BOOL); if sym_setting then si.set_setting_value(si.settings.AUTO_SPACE, false, si.settings_type.SETTING_BOOL) changed = true end commit_eng() if changed then si.set_setting_value(si.settings.AUTO_SPACE, true, si.settings_type.SETTING_BOOL) end end function commit_wubi_z() if pi.get_signal_code() ~= 0 then return end --confirm the default item if pending exist local default = ca.get_default_index() if pi.range_exist(pi.L_RANGE_PENDING) then if default ~= 0 then ca.confirm_item_2(default) else while pi.range_exist(pi.L_RANGE_PENDING) do pi.delete_range() end end end --confirm external candidate, maybe from voice local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end end function commit_chs() --confirm the default item if pending exist local default = ca.get_default_index() if pi.range_exist(pi.L_RANGE_PENDING + pi.L_RANGE_CURVE) then ca.confirm_item_2(default) end --confirm external candidate, maybe from voice local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end --clear pending which can't be confirmed once if pi.range_exist(pi.L_RANGE_PENDING) then pi.delete_range() end --commit the confirmed range if pi.range_exist(pi.L_RANGE_CONFIRM) then pi.commit_input() end --clear signal code for wubi if exist if pi.get_signal_code() ~= 0 then pi.delete_character() end --clear candidates if associate words ca.clear() end function clear_default_nextword() if pi.empty() then local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) ~= ca.SOURCE_EXTERNALCAND then ca.clear() end end end function symbol_keyboard_clear_candidate() if not ca.empty() and si.is_open_symbol_keyboard_clear_cand() then ca.clear() end end function clear_wave_hints() if si.nextword_candidates_visible() then si.clear_nextword_candidates() end --no nextphrase now, so comment it for further use maybe --if si.nextphrase_candidates_visible() then -- si.clear_nextphrase_candidates() --end --si.clear_confirmed_string() end function pinyin_enabled() local langs = si.get_enabled_languages() for idx, id in _G.pairs(langs) do local lang = si.get_language(id) if lang ~= nil and lang.full_name == "Pinyin" then return true end end return false end function clear_hw() local ret = fi.size() > 0 or ca.empty() --return false if only has candidates(maybe associate words or voice candidates) if fi.size() > 0 then fi.clear() end if not ca.empty() then ca.clear() end return ret end local function is_end_punctuation(c) if c == _G.string.byte(".") or c == _G.string.byte("?") or c == _G.string.byte("!") then return true end return false end local function is_chs_character(c) if c >= 0x4e00 and c <= 0x9fff then return true end return false end local function is_whitespace_character(c) if c == _G.string.byte(" ") or c == _G.string.byte("\n")then return true end return false end local function is_letter_or_digit(c) if c >= _G.string.byte("0") and c <= _G.string.byte("9") then return true end local cur = si.get_current_language() if cur ~= nil then if cur.get_traits().is_output_character(c) then return true end end local mix = si.get_mixed_languages() for i, v in _G.ipairs(mix) do local lang = si.get_language(v) if lang.get_traits().is_output_character(c) then return true end end return false end local function support_auto_append_dot() local input_type = si.input_type() if input_type == si.context.PHONE or input_type == si.context.MATH or input_type == si.context.NUMBER then return false else return true end end local function auto_append_symbol( symbol ) local n, str = si.get_text_before_cursor(3) if n == 2 or n == 3 then local arr = si.utf8_to_utf16(str) local space = _G.string.byte(" ") local eat = 0 if ((n == 2 and is_letter_or_digit(arr[1]) and arr[2] == space) or (n == 3 and is_letter_or_digit(arr[2]) and arr[3] == space)) then eat = 1; elseif (n == 3 and is_letter_or_digit(arr[1]) and arr[2] == space and arr[3] == space) then eat = 2; end for i = 1, eat do si.input_keycode(_G.config.L_KEYCODE_BACKSPACE) end if eat > 0 then si.input_string(symbol, false) end end si.input_string(" ", false) end local function auto_append_bn_dot() auto_append_symbol("।") end local function auto_append_am_dot() auto_append_symbol("։") end local function auto_append_dot() auto_append_symbol(".") end local function auto_append_changeable_hi_dot() auto_append_symbol("।") end local function auto_append_nepali_dot() auto_append_symbol("।") end local function auto_append_zawgyi_dot() auto_append_symbol("။") end local function auto_append_sa_dot() auto_append_symbol("᱿") end local function is_text_before_cursor_chs() local n, str = si.get_text_before_cursor(1) if n == 1 then local arr = si.utf8_to_utf16(str) if is_chs_character(arr[1]) then return true end end return false end local sk_bk_on_long_press_begin = function (sk_bk) sk_bk.count = 0 sk_bk.time = si.get_tick_count() end local function sk_bk_on_long_press_multi(sk_bk) if not pi.empty() then sk_bk.on_click() sk_bk.time = si.get_tick_count() else local pre = sk_bk.time local now = si.get_tick_count() -- time unit: nanoseconds local time_step_short = 0 local time_step_long = 50000000 if sk_bk.count < 10 then if now - pre > time_step_short then sk_bk.count = sk_bk.count + 1 sk_bk.time = now sk_bk.on_click() end else if now - pre > time_step_long then sk_bk.count = sk_bk.count + 1 sk_bk.time = now if not pi.context_empty() then pi.finish_composing() end si.input_keycode(_G.config.L_KEYCODE_FUN_DELWORD) end end end end sk_bk_on_long_press_end = function(sk_bk) sk_bk.count = 0 end local function sk_sym_on_click(sym_grid, sym_keyboard1, func_commit) symbol_keyboard_clear_candidate() local s = si.get_current_surface() local sym_setting = si.get_setting_value(si.settings.SYMBOL_KEYBOARD_LAYOUT, si.settings_type.SETTING_INT); if si.input_type() == si.context.URI then if sym_setting == si.symbol_keyboard.FULL_KEYS then si.set_accessibility_string("@string/accessibility_sym_full") si.change_surface_by_id(sym_keyboard1) elseif sym_setting == si.symbol_keyboard.TWELVE_KEYS then si.set_accessibility_string("@string/accessibility_sym_twelve") func_commit() si.change_surface_by_id(sym_keyboard1) else if s.surface_subtype == si.surface_subtype.KEYBOARD_FULL or s.surface_subtype == si.surface_subtype.KEYBOARD_TPLUS then si.set_accessibility_string("@string/accessibility_sym_full") si.change_surface_by_id(sym_keyboard1) else si.set_accessibility_string("@string/accessibility_sym_twelve") func_commit() si.change_surface_by_id(sym_keyboard1) end end else if sym_setting == si.symbol_keyboard.FULL_KEYS then si.set_accessibility_string("@string/accessibility_sym_full") si.change_surface_by_id(sym_keyboard1) elseif sym_setting == si.symbol_keyboard.TWELVE_KEYS then si.set_accessibility_string("@string/accessibility_sym_twelve") func_commit() si.change_surface_by_id(sym_keyboard1) else if s.surface_subtype == si.surface_subtype.KEYBOARD_FULL or s.surface_subtype == si.surface_subtype.KEYBOARD_TPLUS then si.set_accessibility_string("@string/accessibility_sym_full") si.change_surface_by_id(sym_keyboard1) else si.set_accessibility_string("@string/accessibility_sym_twelve") func_commit() si.change_surface_by_id(sym_keyboard1) end end end end local function sk_sym_chs_on_click(sym_grid, sym_keyboard1, func_commit) symbol_keyboard_clear_candidate() if si.get_setting_value(si.settings.SHOULD_CHS_SYM_SHOW_GRID_KEYBOARD, si.settings_type.SETTING_BOOL) then si.set_accessibility_string("@string/accessibility_sym_twelve") func_commit() si.change_surface_by_id(sym_grid) else local s = si.get_current_surface() local sym_setting = si.get_setting_value(si.settings.SYMBOL_KEYBOARD_LAYOUT, si.settings_type.SETTING_INT); if si.input_type() == si.context.URI then if sym_setting == si.symbol_keyboard.FULL_KEYS then si.set_accessibility_string("@string/accessibility_sym_full") si.change_surface_by_id(sym_keyboard1) elseif sym_setting == si.symbol_keyboard.TWELVE_KEYS then si.set_accessibility_string("@string/accessibility_sym_twelve") func_commit() s.param = "web" si.change_surface_by_id(sym_grid) else if s.surface_subtype == si.surface_subtype.KEYBOARD_FULL or s.surface_subtype == si.surface_subtype.KEYBOARD_TPLUS then si.set_accessibility_string("@string/accessibility_sym_full") si.change_surface_by_id(sym_keyboard1) else si.set_accessibility_string("@string/accessibility_sym_twelve") func_commit() s.param = "web" si.change_surface_by_id(sym_grid) end end else if sym_setting == si.symbol_keyboard.FULL_KEYS then si.set_accessibility_string("@string/accessibility_sym_full") si.change_surface_by_id(sym_keyboard1) elseif sym_setting == si.symbol_keyboard.TWELVE_KEYS then si.set_accessibility_string("@string/accessibility_sym_twelve") func_commit() si.change_surface_by_id(sym_grid) else if s.surface_subtype == si.surface_subtype.KEYBOARD_FULL or s.surface_subtype == si.surface_subtype.KEYBOARD_TPLUS then si.set_accessibility_string("@string/accessibility_sym_full") si.change_surface_by_id(sym_keyboard1) else si.set_accessibility_string("@string/accessibility_sym_twelve") func_commit() si.change_surface_by_id(sym_grid) end end end end end local function sk_sym_jap_on_click(sym_grid, func_commit) si.set_accessibility_string("@string/accessibility_sym_twelve") func_commit() si.change_surface_by_id(sym_grid) end --TODO:too complex local function switch_language() si.set_accessibility_string("@string/accessibility_switch_language") local language_history_first = "" local language_history_second = "" local language_history = si.get_setting_value(si.settings.SAVED_LANGUAGE_HISTORY, si.settings_type.SETTING_STRING) local pre = si.get_setting_value(si.settings.PREUSED_LANGUAGE) local cur = si.get_setting_value(si.settings.CURRENT_LANGUAGE) local new_language = pre local new_pre_language = cur if language_history ~= "" then local s, e = _G.string.find(language_history, ",") if s then language_history_first = _G.string.sub(language_history, 1, s - 1) language_history_second = _G.string.sub(language_history, s + 1) if language_history_first ~= "" and language_history_first ~= cur then new_language = language_history_first new_pre_language = language_history_second elseif language_history_second ~= "" and language_history_second ~= cur then new_language = language_history_second new_pre_language = language_history_first end end si.set_setting_value(si.settings.SAVED_LANGUAGE_HISTORY, "", si.settings_type.SETTING_STRING) end if new_language ~= cur and si.get_language(new_language) ~= nil then si.set_current_language(new_language) if new_pre_language ~= "" and si.get_language(new_pre_language) ~= nil then si.set_setting_value(si.settings.PREUSED_LANGUAGE, new_pre_language, si.settings_type.SETTING_STRING) end else si.input_keycode(_G.config.L_KEYCODE_LANGUAGE) end end function is_language_enabled(langId) if langId == nil then return false end local langs = si.get_enabled_languages() for idx, id in _G.pairs(langs) do local lang = si.get_language(id) if lang ~= nil and id == langId then return true end end return false end function switch_to_last_lang_from_eng() local lang_key_enabled = si.get_setting_value(si.settings.LANG_KEY_ENABLED, si.settings_type.SETTING_BOOL) if not lang_key_enabled then commit_eng_no_space() si.input_keycode(_G.config.L_KEYCODE_FUN_SWITCH_LAST_LANG) end end function switch_to_last_lang_from_chs() local lang_key_enabled = si.get_setting_value(si.settings.LANG_KEY_ENABLED, si.settings_type.SETTING_BOOL) if not lang_key_enabled then commit_chs() si.input_keycode(_G.config.L_KEYCODE_FUN_SWITCH_LAST_LANG) end end function switch_to_next_lang_from_eng() local lang_key_enabled = si.get_setting_value(si.settings.LANG_KEY_ENABLED, si.settings_type.SETTING_BOOL) if not lang_key_enabled then commit_eng_no_space() si.input_keycode(_G.config.L_KEYCODE_FUN_SWITCH_NEXT_LANG) end end function switch_to_next_lang_from_chs() local lang_key_enabled = si.get_setting_value(si.settings.LANG_KEY_ENABLED, si.settings_type.SETTING_BOOL) if not lang_key_enabled then commit_chs() si.input_keycode(_G.config.L_KEYCODE_FUN_SWITCH_NEXT_LANG) end end local function click_lng_key() local langs = si.get_enabled_languages() if _G.table.getn(langs) < 2 then si.input_keycode(_G.config.L_KEYCODE_LANGUAGE) else si.input_keycode(_G.config.L_KEYCODE_FUN_SWITCH_NEXT_LANG) end end local function get_current_page(current_surface) local next_key = current_surface.softkeys["NextPage"] if next_key ~= nil then local title = next_key.main_title if title ~= nil then local page_number = _G.tostring(_G.string.byte(title, 1) - 48) return page_number else return nil end else return nil end end function setup_emoji_list_eng(s) local emolist = _G.dofile("emo_list_en.lua") local engemolist = {"!", "?", "-", "~", "(", ")", "$", "%", "(", ")", "@", "#"} if not emolist then emolist = engemolist end for idx, emo in _G.pairs(emolist) do local sk = si.new_softkey() if emo ~= "" then sk.main_title = emo else sk.main_title = engemolist[idx] end function sk.on_click() si.input_string(sk.main_title, false) end function sk.on_long_press_once() si.input_keycode(_G.config.L_KEYCODE_FUN_CUSTOM_SYMBOL_EN) end s.softkeys["emo_"..idx] = sk end end function setup_emoji_list_chs(s) local emolist = _G.dofile("emo_list_zh.lua") local chsemolist = {"!", "?", ".", "~", "(", ")", "¥", "*", "(", ")", "@", "#"} if not emolist then emolist = chsemolist end for idx, emo in _G.pairs(emolist) do local sk = si.new_softkey() if emo ~= "" then sk.main_title = emo else sk.main_title = chsemolist[idx] end function sk.on_click() if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end si.input_string(sk.main_title, false) end s.softkeys["emo_"..idx] = sk end end --prediction-unrelated key such as sk_sp should not be in transaction local function end_transaction() if si.get_cache_input() > 0 then si.set_transaction(si.TRANSACTION_END) end end -- place key sk_place = si.new_softkey() sk_place.main_title = "" sk_place.on_click = function() end -- dict key sk_dict = si.new_softkey() sk_dict.on_click = function() si.input_keycode(_G.config.L_KEYCODE_PREDICT) end -- shift key to change surface sk_sft_sur = si.new_softkey() sk_sft_sur.on_click = function() local status = ts.get_tri_status(ts.SURLOCK) if status == ts.NORMAL then ts.set_tri_status(ts.SURLOCK, ts.TOGGLED) else ts.set_tri_status(ts.SURLOCK, ts.NORMAL) end sk_sft_sur.last_surlock_status = status end sk_sft_sur.on_double_click = function() local status = ts.get_tri_status(ts.SURLOCK) if sk_sft_sur.last_surlock_status == ts.LOCKED then if status ~= ts.NORMAL then ts.set_tri_status(ts.SURLOCK, ts.NORMAL) end else ts.set_tri_status(ts.SURLOCK, ts.LOCKED) end sk_sft_sur.last_surlock_status = status end -- shift key sk_sft = si.new_softkey() sk_sft.on_click = function() local status = ts.get_tri_status(ts.CAPSLOCK) if status == ts.NORMAL then ts.set_tri_status(ts.CAPSLOCK, ts.TOGGLED) si.set_accessibility_string("@string/accessibility_shift_toggled") else ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) si.set_accessibility_string("@string/accessibility_shift_normal") end sk_sft.last_eng_capslock_status = status end sk_sft.on_double_click = function() local status = ts.get_tri_status(ts.CAPSLOCK) if sk_sft.last_eng_capslock_status == ts.LOCKED then if status ~= ts.NORMAL then ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) si.set_accessibility_string("@string/accessibility_shift_normal") end else ts.set_tri_status(ts.CAPSLOCK, ts.LOCKED) si.set_accessibility_string("@string/accessibility_shift_locked") end sk_sft.last_eng_capslock_status = status end -- more key sk_mo = si.new_softkey() sk_mo.on_click = function () si.set_accessibility_string("@string/accessibility_more_panel") si.change_surface_by_type(si.surface_type.SOFT_FULLCANDIDATE) end -- back key, to keyboard sk_back_to_keyboard = si.new_softkey() sk_back_to_keyboard.on_click = function () si.set_accessibility_string("@string/accessibility_back_to_keyboard") si.back_to_keyboard() end -- back key, to previous surface sk_back_to_previous = si.new_softkey() sk_back_to_previous.on_click = function () si.set_accessibility_string("@string/accessibility_back_to_previous") si.back_to_previous() end -- back key, to previous surface sk_back_to_previous_abc = si.new_softkey() sk_back_to_previous_abc.main_title = "abc" sk_back_to_previous_abc.on_click = function () si.set_accessibility_string("@string/accessibility_back_to_previous") si.back_to_previous() end --back key, to keyboard, in chs soft abc sk_back_abc = si.new_softkey() sk_back_abc.on_click = function () si.set_accessibility_string("@string/accessibility_back_to_keyboard") ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) si.back_to_keyboard() end -- edit key sk_edit = si.new_softkey() sk_edit.on_click = function() si.set_accessibility_string("@string/accessibility_edit_sur") si.change_surface_by_id("edit.sur.png") end -- edit key for english sk_edit_eng = si.new_softkey() sk_edit_eng.on_click = function() si.set_accessibility_string("@string/accessibility_edit_sur") commit_eng() si.change_surface_by_id("edit.sur.png") end -- edit key for chinese sk_edit_chs = si.new_softkey() sk_edit_chs.on_click = function() si.set_accessibility_string("@string/accessibility_edit_sur") commit_chs() si.change_surface_by_id("edit.sur.png") end sk_clipboard = si.new_softkey() sk_clipboard.on_click = function() si.change_surface_by_id("clipboard.sur.png") end -- url navigator key sk_url = si.new_softkey() sk_url.on_click = function() si.change_surface_by_id("url_navigator.sur.png") end -- url navigator key for english sk_url_eng = si.new_softkey() sk_url_eng.on_click = function() commit_eng() si.change_surface_by_id("url_navigator.sur.png") end -- url navigator key for chinese sk_url_chs = si.new_softkey() sk_url_chs.on_click = function() commit_chs() si.change_surface_by_id("url_navigator.sur.png") end --voice key sk_voice = si.new_softkey() sk_voice.on_click = function() si.set_accessibility_string("@string/accessibility_voice") si.change_surface_by_id("voice.sur.png") end -- voice key for english sk_voice_eng = si.new_softkey() sk_voice_eng.on_click = function() commit_eng() si.set_accessibility_string("@string/accessibility_voice") si.change_surface_by_id("voice.sur.png") end -- voice key for chinese sk_voice_chs = si.new_softkey() sk_voice_chs.on_click = function() commit_chs() si.set_accessibility_string("@string/accessibility_voice") si.change_surface_by_id("voice.sur.png") end -- cancel key for english sk_cancel_eng = si.new_softkey() function sk_cancel_eng.on_click() pi.cancel_resolve() end -- cancel key for chinese sk_cancel_chs = si.new_softkey() sk_cancel_chs.on_click = function() if not pi.stroke_filter_empty() then pi.delete_stroke() elseif pi.range_exist(pi.L_RANGE_CONFIRM) then pi.cancel_confirm() end end -- cancel key for stroke sk_cancel_stroke = si.new_softkey() sk_cancel_stroke.on_click = function() if pi.range_exist(pi.L_RANGE_CONFIRM) then pi.cancel_confirm() end end -- clear_candidate key for sk_clear_candidate = si.new_softkey() sk_clear_candidate.on_click = function() if not ca.empty() or not pi.empty() then ca.clear() while not pi.empty() do pi.delete_range() end end end -- number key for phonepad sk_num_right = si.new_softkey() sk_num_right.main_title = "123" sk_num_right.on_click = function() symbol_keyboard_clear_candidate() si.set_accessibility_string("@string/accessibility_number_panel") si.change_surface_by_id("number_right.sur.png") end -- number key for chs phonepad sk_num_right_chs = si.new_softkey() sk_num_right_chs.main_title = "123" sk_num_right_chs.main_title = "@string/chs_key_num_title" sk_num_right_chs.on_click = sk_num_right.on_click --sk num-clear for chs phonepad sk_num_right_clear = si.new_softkey() sk_num_right_clear.main_title = nil sk_num_right_clear.on_click = function() local is_external = false if not ca.empty() and ca.get_item_source(ca.get_item(1)) == ca.SOURCE_EXTERNALCAND then is_external = true end if (not pi.empty() or is_external) then ca.clear() while not pi.empty() do pi.delete_range() end else symbol_keyboard_clear_candidate() si.set_accessibility_string("@string/accessibility_number_panel") si.change_surface_by_id("number_right.sur.png") end end -- number key for qwerty & tplus sk_num_left = si.new_softkey() sk_num_left.main_title = "123" sk_num_left.on_click = function() symbol_keyboard_clear_candidate() si.set_accessibility_string("@string/accessibility_number_panel") si.change_surface_by_id("number_left.sur.png") end sk_num_left.on_long_press_once = function() commit_chs() si.change_surface_by_id("chs_soft_abc.sur.png") end -- number key for qwerty & tplus sk_num_down = si.new_softkey() sk_num_down.main_title = "123" sk_num_down.on_click = function() symbol_keyboard_clear_candidate() si.change_surface_by_id("number_down.sur.png") end -- abc key for chinese sk_abc = si.new_softkey() sk_abc.main_title = "abc" sk_abc.on_click = function() commit_chs() si.change_surface_by_id("chs_soft_abc.sur.png") end -- abc key for korean sk_abc_kr = si.new_softkey() sk_abc_kr.main_title = "abc" sk_abc_kr.on_click = function() commit_eng_no_space() si.change_surface_by_id("chs_soft_abc.sur.png") end -- language key for english sk_lng_eng = si.new_softkey() sk_lng_eng.main_title = "" sk_lng_eng.on_click = function() commit_eng_no_space() click_lng_key() end sk_lng_eng.on_long_press_once = function() commit_eng_no_space() si.input_keycode(_G.config.L_KEYCODE_LANGUAGE) end -- language key for chinese, always more than one language sk_lng_chs = si.new_softkey() sk_lng_chs.on_click = function() commit_chs() click_lng_key() end sk_lng_chs.on_long_press_once = function() commit_chs() si.input_keycode(_G.config.L_KEYCODE_LANGUAGE) end --handwrite mask key sk_hw_mask = si.new_softkey() sk_hw_mask.on_click = function() if si.get_current_surface().surface_type ~= si.SOFT_KEYBOARD then si.back_to_keyboard() end if si.handwrite_mask_visible() then si.set_handwrite_mask_manually(si.HANDWRITE_MASK_HIDE) else si.set_handwrite_mask_manually(si.HANDWRITE_MASK_SHOW) commit_chs() end end --sk dot for english sk_dot_eng = si.new_softkey() sk_dot_eng.main_title = "." sk_dot_eng.on_click = function() end_transaction() clear_default_nextword() si.input_precise(".", "", "", false) end --sk dot for bengal sk_dot_bn = si.new_softkey() sk_dot_bn.main_title = "।" sk_dot_bn.on_click = function() end_transaction() clear_default_nextword() si.input_precise(sk_dot_bn.main_title, "", "", false) end sk_dot_bn.on_long_press_once = function() show_expand_symbols({"ঽ", "ʼ", '!', ',', '?', '.', "'", "ৎ",}, 8) end sk_dot_bn_probhat = si.new_softkey() sk_dot_bn_probhat.main_title = "।" sk_dot_bn_probhat.on_click = function() end_transaction() clear_default_nextword() si.input_precise(sk_dot_bn_probhat.main_title, "", "", false) end sk_dot_bn_probhat.on_long_press_once = function() show_expand_symbols({"ঽ", "ʼ", "॥", '!', ',', '?', '.', "'", "়"}, 9) end --sk dot for burmese sk_dot_burmese = si.new_softkey() sk_dot_burmese.main_title = "." sk_dot_burmese.on_click = sk_dot_eng.on_click sk_dot_burmese.on_long_press_once = function() show_expand_symbols({'!', ',', '.', '?'}, 3) end --sk dot for arabic sk_dot_arabic = si.new_softkey() sk_dot_arabic.main_title = "." sk_dot_arabic.on_click = sk_dot_eng.on_click sk_dot_arabic.on_long_press_once = function() local s = si.get_current_surface() symbols = {"!","،",".","؟"} show_expand_symbols(symbols,3) end sk_dot_urdu = si.new_softkey() sk_dot_urdu.main_title = "۔" sk_dot_urdu.on_click = sk_dot_eng.on_click sk_dot_urdu.on_long_press_once = function() local s = si.get_current_surface() symbols = {"!","،","۔","؟"} show_expand_symbols(symbols,3) end --sk dot for spanish sk_dot_spanish = si.new_softkey() sk_dot_spanish.main_title = "." sk_dot_spanish.on_click = sk_dot_eng.on_click sk_dot_spanish.on_long_press_once = function() local s = si.get_current_surface() local key1 if s.surface_subtype == si.surface_subtype.KEYBOARD_FULL then key1 = s.softkeys["sk_3_5"] elseif s.surface_subtype == si.surface_subtype.KEYBOARD_TPLUS then key1 = s.softkeys["sk_3_2"] else key1 = nil end local symbols symbols = {"!","¡",",",".","¿","?"} show_expand_symbols(symbols,4) end --sk dot for international english sk_dot_eng_inter = si.new_softkey() sk_dot_eng_inter.main_title = sk_dot_eng.main_title sk_dot_eng_inter.on_click = sk_dot_eng.on_click sk_dot_eng_inter.on_long_press_once = function() show_expand_symbols({'!', ',', '.', '?'}, 3) end --sk dot for oriya sk_dot_oriya = si.new_softkey() sk_dot_oriya.main_title = "।" sk_dot_oriya.on_click = function() end_transaction() clear_default_nextword() si.input_precise("।", "", "", false) end sk_dot_oriya.on_long_press_once = function() show_expand_symbols({'.', '?', '!'}, 1) end --sk dot for armenian sk_dot_armenian = si.new_softkey() sk_dot_armenian.main_title = "։" sk_dot_armenian.on_click = function() end_transaction() clear_default_nextword() si.input_precise("։", "", "", false) end sk_dot_armenian.on_long_press_once = function() show_expand_symbols({':', ';', '՟', '«', '»', '֊', '՝', '՛', '!', '?', 'ՙ', '՚', '.', '՜', ',', '՞'}, 15) end --sk dot for nepali sk_dot_nepali = si.new_softkey() sk_dot_nepali.main_title = "।" sk_dot_nepali.on_click = function() end_transaction() clear_default_nextword() si.input_precise("।", "", "", false) end sk_dot_nepali.on_long_press_once = function() show_expand_symbols({'!', ',', '.', '?'}, 3) end --sk dot for Gujarati sk_dot_gu = si.new_softkey() sk_dot_gu.main_title = "." sk_dot_gu.on_click = function() end_transaction() clear_default_nextword() si.input_precise(".", "", "", false) end sk_dot_gu.on_long_press_once = function() show_expand_symbols({'.', '?', '!', 'ૐ', '૱',}, 3) end --sk dot for punjabi sk_dot_pa = si.new_softkey() sk_dot_pa.main_title = sk_dot_eng.main_title sk_dot_pa.on_click = sk_dot_eng.on_click sk_dot_pa.on_long_press_once = function() show_expand_symbols({'!', ',', '.', '?', "ੴ"}, 3) end --sk dot for burmese layout unicode sk_dot_my = si.new_softkey() sk_dot_my.main_title = "။" sk_dot_my.on_click = function() end_transaction() clear_default_nextword() si.input_precise(sk_dot_my.main_title, "", "", false) end sk_dot_my.on_long_press_once = function() show_expand_symbols({'!', ',', '.', '?',}, 3) end --sk dot for khmer sk_dot_kh = si.new_softkey() sk_dot_kh.main_title = sk_dot_eng.main_title sk_dot_kh.on_click = sk_dot_eng.on_click sk_dot_kh.on_long_press_once = function() show_expand_symbols({'ៗ', '៙', '៚', 'ៜ', '!', ',', '?', '.',}, 8) end --sk dot for santhali sk_dot_sa = si.new_softkey() sk_dot_sa.main_title = "᱿" sk_dot_sa.on_click = function() end_transaction() clear_default_nextword() si.input_precise("᱿", "", "", false) end sk_dot_sa.on_long_press_once = function() show_expand_symbols({'ᱼ', 'ᱺ', 'ᱸ', 'ᱹ', 'ᱻ',}, 1) end --sk dot for Tibet sk_dot_bo = si.new_softkey() sk_dot_bo.main_title = "།" sk_dot_bo.on_click = function() end_transaction() clear_default_nextword() si.input_precise(sk_dot_bo.main_title, "", "", false) end sk_dot_bo.on_long_press_once = function() show_expand_symbols({'༎', '༏', '༐', '༑', '༒', '༓', '༔',}, 7) end function show_expand_symbols(symbols, default_index) local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local key for i = 1, _G.table.getn(symbols) do key = si.new_softkey() if _G.type(symbols[i]) == "table" then key.main_title = symbols[i][1] key.main_input = symbols[i][1] key.input_emotion = symbols[i][2] else key.main_title = symbols[i] key.main_input = symbols[i] key.input_emotion = false end key.on_click = function(sk) si.input_string(sk.main_input, sk.input_emotion) end sur.softkeys[i] = key end si.popup_surface(sur) si.set_default_key(default_index) end --sk dot for chinese sk_dot_chs = si.new_softkey() sk_dot_chs.main_title = "。" sk_dot_chs.on_click = function() end_transaction() if si.handwrite_mask_visible() and fi.size() > 0 then fi.clear() end commit_chs() si.input_string(sk_dot_chs.main_title, false) end sk_dot_chs.on_long_press_once = function() symbols = {"!",",","。","?"} show_expand_symbols(symbols,3) end --sk dot for cht sk_dot_cht = si.new_softkey() sk_dot_cht.main_title = "。" sk_dot_cht.on_click = function() end_transaction() if si.handwrite_mask_visible() and fi.size() > 0 then fi.clear() end commit_chs() si.input_string(sk_dot_cht.main_title, false) end sk_dot_cht.on_long_press_once = function() local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end sur.softkeys[1] = si.new_expandkey(si.u16code(",", 1)) sur.softkeys[2] = si.new_expandkey(si.u16code("?", 1)) sur.softkeys[3] = si.new_expandkey(si.u16code("!", 1)) sur.softkeys[4] = si.new_expandkey(si.u16code("@", 1)) si.popup_surface(sur) end --sk dot for handwrite full screen sk_dot_hw = si.new_softkey() sk_dot_hw.main_title = "。" sk_dot_hw.on_click = function() end_transaction() if fi.size() > 0 then fi.clear() end if not ca.empty() then local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) else ca.clear() end end commit_chs() si.input_string(sk_dot_hw.main_title, false) end --sk dot for changeable hindi sk_dot_changeable_hindi = si.new_softkey() sk_dot_changeable_hindi.main_title = "।" sk_dot_changeable_hindi.on_click = function() end_transaction() clear_default_nextword() si.input_precise("।", "", "", false) end sk_dot_changeable_hindi.on_long_press_once = function() local sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND sur.softkeys[1] = si.new_expandkey(si.u16code(".", 1)) sur.softkeys[2] = si.new_expandkey(si.u16code("॥", 1)) sur.softkeys[3] = si.new_expandkey(si.u16code("ॱ", 1)) sur.softkeys[4] = si.new_expandkey(si.u16code("‍", 1)) sur.softkeys[4].keyIcon = "@drawable/key_icon_zwj" sur.softkeys[5] = si.new_expandkey(si.u16code("‌", 1)) sur.softkeys[5].keyIcon = "@drawable/key_icon_zwnj" si.popup_surface(sur) end --sk dot for hindi sk_dot_hindi = si.new_softkey() sk_dot_hindi.main_title = "।" sk_dot_hindi.on_click = function() end_transaction() clear_default_nextword() si.input_precise("।", "", "", false) end sk_dot_hindi.on_long_press_once = function() local sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND sur.softkeys[1] = si.new_expandkey(si.u16code("॥", 1)) sur.softkeys[2] = si.new_expandkey(si.u16code("ॐ", 1)) sur.softkeys[3] = si.new_expandkey(si.u16code("‍", 1)) sur.softkeys[3].keyIcon = "@drawable/key_icon_zwj" sur.softkeys[4] = si.new_expandkey(si.u16code("‌", 1)) sur.softkeys[4].keyIcon = "@drawable/key_icon_zwnj" si.popup_surface(sur) end --sk dot for changeable punjabi sk_dot_changeable_punjabi = si.new_softkey() sk_dot_changeable_punjabi.main_title = "।" sk_dot_changeable_punjabi.on_click = function() end_transaction() clear_default_nextword() si.input_precise("।", "", "", false) end sk_dot_changeable_punjabi.on_long_press_once = function() symbols = {"॥","!",",",".","?"} show_expand_symbols(symbols,4) end --sk dot for changeable gujarati sk_dot_changeable_gujarati = si.new_softkey() sk_dot_changeable_gujarati.main_title = "।" sk_dot_changeable_gujarati.on_click = function() end_transaction() clear_default_nextword() si.input_precise("।", "", "", false) end sk_dot_changeable_gujarati.on_long_press_once = function() symbols = {"॥","!",",",".","?"} show_expand_symbols(symbols,4) end --sk dot for changeable marathi sk_dot_changeable_marathi = si.new_softkey() sk_dot_changeable_marathi.main_title = "।" sk_dot_changeable_marathi.on_click = function() end_transaction() clear_default_nextword() si.input_precise("।", "", "", false) end sk_dot_changeable_marathi.on_long_press_once = function() symbols = {"?",",",".","!","॰"} show_expand_symbols(symbols,3) end --sk dot for changeable bengali sk_dot_changeable_bengali = si.new_softkey() sk_dot_changeable_bengali.main_title = "।" sk_dot_changeable_bengali.on_click = function() end_transaction() clear_default_nextword() si.input_precise("।", "", "", false) end sk_dot_changeable_bengali.on_long_press_once = function() symbols = {"ঽ","ʼ","?",",",".","!"} show_expand_symbols(symbols,5) end --sk dot for changeable tamil sk_dot_changeable_tamil = si.new_softkey() sk_dot_changeable_tamil.main_title = "." sk_dot_changeable_tamil.on_click = function() end_transaction() clear_default_nextword() si.input_precise(".", "", "", false) end sk_dot_changeable_tamil.on_long_press_once = function() symbols = {".", ",", "!", "?", "।", "॥",} show_expand_symbols(symbols,5) end --sk comma for english sk_comma_eng = si.new_softkey() sk_comma_eng.main_title = "," sk_comma_eng.on_click = function() end_transaction() clear_default_nextword() si.input_precise(",", "", "", false) end sk_comma_eng.on_long_press_once = function() --enable comma's long press and open prediction preview in ui end sk_comma_eng.on_slide_left = function() --disable predict end sk_comma_eng.on_slide_right = function() --enable predict end -- sk comma for burmese sk_comma_my = si.new_softkey() sk_comma_my.main_title = "၊" sk_comma_my.on_click = function() end_transaction() clear_default_nextword() si.input_precise(sk_comma_my.main_title, "", "", false) end sk_comma_my.on_long_press_once = sk_comma_eng.on_long_press_once sk_comma_my.on_slide_left = sk_comma_eng.on_slide_left sk_comma_my.on_slide_right = sk_comma_eng.on_slide_right -- sk comma for pashto sk_comma_ps = si.new_softkey() sk_comma_ps.main_title = "،" sk_comma_ps.on_click = function() end_transaction() clear_default_nextword() si.input_precise(sk_comma_ps.main_title, "", "", false) end sk_comma_ps.on_long_press_once = sk_comma_eng.on_long_press_once sk_comma_ps.on_slide_left = sk_comma_eng.on_slide_left sk_comma_ps.on_slide_right = sk_comma_eng.on_slide_right -- sk comma for Tibet sk_comma_bo = si.new_softkey() sk_comma_bo.main_title = "་" sk_comma_bo.on_click = function() end_transaction() clear_default_nextword() si.input_precise(sk_comma_bo.main_title, "", "", false) end sk_comma_bo.on_long_press_once = function() end sk_comma_bo.on_slide_left = sk_comma_eng.on_slide_left sk_comma_bo.on_slide_right = sk_comma_eng.on_slide_right --sk comma for japanese sk_comma_jap = si.new_softkey() sk_comma_jap.main_title = "、" sk_comma_jap.on_click = function() end_transaction() clear_default_nextword() si.input_precise("、", "", "", false) end sk_comma_jap.on_long_press_once = function() local s = si.get_current_surface() symbols = {'、', ',', ','} show_expand_symbols(symbols,3) end sk_comma_jap.on_slide_left = function() --disable predict end sk_comma_jap.on_slide_right = function() --enable predict end -- sk comma for santhali sk_comma_sa = si.new_softkey() sk_comma_sa.main_title = "᱾" sk_comma_sa.on_click = function() end_transaction() clear_default_nextword() si.input_precise(sk_comma_sa.main_title, "", "", false) end sk_comma_sa.on_long_press_once = sk_comma_eng.on_long_press_once sk_comma_sa.on_slide_left = sk_comma_eng.on_slide_left sk_comma_sa.on_slide_right = sk_comma_eng.on_slide_right --sk dot for japanese sk_dot_jap = si.new_softkey() sk_dot_jap.main_title = "。" sk_dot_jap.on_click = function() end_transaction() clear_default_nextword() si.input_precise("。", "", "", false) end sk_dot_jap.on_long_press_once = function() local s = si.get_current_surface() symbols = {'~', '…', '。', '.', '.', '・'} show_expand_symbols(symbols,4) end --sk sep-abc japanese sk_sep_abc_jap = si.new_softkey() sk_sep_abc_jap.main_title = "abc" sk_sep_abc_jap.alt_title = "abc" sk_sep_abc_jap.on_click = function() si.change_surface_by_id("jap_soft_abc.sur.png") end sk_sep_abc_jap.on_long_press_once = nil --sk sym for japanese sk_sym_jap = si.new_softkey() sk_sym_jap.main_title = "12#" sk_sym_jap.on_click = function() sk_sym_jap_on_click("jap_sym_grid.sur.png", commit_chs) end --[[ sk_ent for japanese ]]-- sk_ent_jap = si.new_softkey() sk_ent_jap.on_click = function () si.set_accessibility_string("@string/accessibility_enter") if not pi.empty() then local default = ca.get_default_index() local input_mode = pi.get_current_pending_mode() if input_mode == si.pending_input_mode.SENTENCE and default ~= 0 then ca.confirm_item_2(default) elseif default ~= 0 then pi.commit_input() else pi.commit_input() si.input_keycode(_G.config.L_KEYCODE_ENTER) end else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_keycode(_G.config.L_KEYCODE_ENTER) end end --[[ sk_bk for japanese ]]-- sk_bk_jap = si.new_softkey() sk_bk_jap.on_click = function () local cur = si.get_current_language() local separator = "" if cur then separator = cur.get_traits().separator end si.set_accessibility_string("@string/accessibility_delete") if pi.range_exist(pi.L_RANGE_CURVE) then pi.delete_range() elseif pi.range_exist(pi.L_RANGE_PENDING) then pi.delete_character() elseif not ca.empty() then ca.clear() clear_wave_hints() if not pi.context_empty() or si.is_international_version() then if separator == " " then si.input_keycode(_G.config.L_KEYCODE_BACKSPACE) end end else clear_wave_hints() si.input_keycode(_G.config.L_KEYCODE_BACKSPACE) end end sk_bk_jap.on_slide_left = function () local cur = si.get_current_language() local separator = "" if cur then separator = cur.get_traits().separator end if pi.range_exist(pi.L_RANGE_PENDING + pi.L_RANGE_CURVE) then pi.delete_range() elseif not ca.empty() then ca.clear() clear_wave_hints() if not pi.context_empty() then pi.finish_composing() si.input_keycode(_G.config.L_KEYCODE_FUN_DEL_AROUND_WORD) elseif si.is_international_version() then si.input_keycode(_G.config.L_KEYCODE_FUN_DEL_AROUND_WORD) end else clear_wave_hints() si.input_keycode(_G.config.L_KEYCODE_FUN_DELWORD) end end sk_bk_jap.on_long_press_begin = function () sk_bk_on_long_press_begin(sk_bk_jap) end sk_bk_jap.on_long_press_multi = function () sk_bk_on_long_press_multi(sk_bk_jap) end sk_bk_jap.on_long_press_end = function() sk_bk_on_long_press_end(sk_bk_jap) end --sk sym for jap phonepad sk_sym_jap_phonepad = si.new_softkey() sk_sym_jap_phonepad.main_title = "12#" sk_sym_jap_phonepad.on_click = function() if not pi.empty() then pi.convert_input_kata_type() else sk_sym_jap_on_click("jap_sym_grid.sur.png", commit_chs) end end -- language key for jap phonepad sk_lng_jap_phonepad = si.new_softkey() sk_lng_jap_phonepad.main_title = "" sk_lng_jap_phonepad.on_click = function() if not pi.empty() then pi.switch_input_voiced_sound() else commit_eng_no_space() click_lng_key() end end sk_lng_jap_phonepad.on_long_press_once = function() if pi.empty() then commit_eng_no_space() si.input_keycode(_G.config.L_KEYCODE_LANGUAGE) end end --sk revert for jap phonepad sk_revert_jap_phonepad = si.new_softkey() sk_revert_jap_phonepad.main_title = "" sk_revert_jap_phonepad.on_click = function() local input_mode = pi.get_current_pending_mode() if not pi.empty() then if input_mode == si.pending_input_mode.SENTENCE then pi.pending_sentence_revert() else pi.multitap_toggle_input() end end end --sk comma for western language without dictionary sk_comma_eng_without_dict = si.new_softkey() sk_comma_eng_without_dict.main_title = sk_comma_eng.main_title sk_comma_eng_without_dict.on_click = sk_comma_eng.on_click --sk comma for chinese sk_comma_chs = si.new_softkey() sk_comma_chs.main_title = "," sk_comma_chs.on_click = function() end_transaction() if si.handwrite_mask_visible() and fi.size() > 0 then fi.clear() end commit_chs() si.input_string(sk_comma_chs.main_title, false) end --sk comma for arabic sk_comma_arabic = si.new_softkey() sk_comma_arabic.main_title = "،" sk_comma_arabic.on_click = function() end_transaction() clear_default_nextword() si.input_precise("،", "", "", false) end sk_comma_arabic.on_long_press_once = function() -- enable commas's long press and open prediction preview in ui end --sk comma for handwrite full screen sk_comma_hw = si.new_softkey() sk_comma_hw.main_title = "," sk_comma_hw.on_click = function() end_transaction() if fi.size() > 0 then fi.clear() end if not ca.empty() then local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) else ca.clear() end end commit_chs() si.input_string(sk_comma_hw.main_title, false) end --sk_comma for armenian sk_comma_armenian = si.new_softkey() sk_comma_armenian.main_title = "՝" sk_comma_armenian.on_click = function() end_transaction() clear_default_nextword() si.input_string(sk_comma_armenian.main_title, false) end --sk_comma for changeable tamil sk_comma_tamil = si.new_softkey() sk_comma_tamil.main_title = "ஃ" sk_comma_tamil.on_click = function() si.input_precise(sk_comma_tamil.main_title, "", "", false) end sk_comma_tamil.on_long_press_once = sk_comma_eng.on_long_press_once sk_comma_tamil.on_slide_left = sk_comma_eng.on_slide_left sk_comma_tamil.on_slide_right = sk_comma_eng.on_slide_right sk_exclamation_mark_hw = si.new_softkey() sk_exclamation_mark_hw.main_title = "!" sk_exclamation_mark_hw.on_click = function() if fi.size() > 0 then fi.clear() end if not ca.empty() then ca.clear() end commit_chs() si.input_string(sk_exclamation_mark_hw.main_title) end sk_question_mark_hw = si.new_softkey() sk_question_mark_hw.main_title = "?" sk_question_mark_hw.on_click = function() if fi.size() > 0 then fi.clear() end if not ca.empty() then ca.clear() end commit_chs() si.input_string(sk_question_mark_hw.main_title) end --sk sep-abc for chs phonepad sk_sep_abc = si.new_softkey() sk_sep_abc.main_title = "@string/chs_key_sep_title" sk_sep_abc.alt_title = "abc" sk_sep_abc.on_click = function() if ts.get_tri_status(ts.SEPERATOR) == ts.NORMAL and pi.range_exist(pi.L_RANGE_PENDING) then si.input_precise("`", "", "", false) elseif pi.empty() then commit_chs() si.change_surface_by_id("chs_soft_abc.sur.png") end end sk_sep_abc.on_long_press_once = nil --sk sep-sft for chs tplus & qwerty sk_sep_sft = si.new_softkey() sk_sep_sft.main_title = "@string/chs_key_sep_title" sk_sep_sft.on_click = function() if ts.get_tri_status(ts.SEPERATOR) == ts.NORMAL and pi.range_exist(pi.L_RANGE_PENDING) and si.get_setting_value(si.settings.WORD_PREDICTION) == true then si.input_precise("`", "", "", false) elseif pi.empty() then local status = ts.get_tri_status(ts.CAPSLOCK) if status == si.tri_status.NORMAL then ts.set_tri_status(ts.CAPSLOCK, ts.LOCKED) si.set_setting_value(si.settings.WORD_PREDICTION, false, si.settings_type.SETTING_BOOL) si.set_accessibility_string("@string/accessibility_shift_locked") elseif status == si.tri_status.LOCKED then ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) si.set_setting_value(si.settings.WORD_PREDICTION, true, si.settings_type.SETTING_BOOL) si.set_accessibility_string("@string/accessibility_shift_normal") end end end sk_sep_sft.on_long_press_once = nil --sk @-or-word for chs phonepad sk_word = si.new_softkey() sk_word.main_title = "@" function sk_word.on_click() if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end if pi.empty() then local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end si.input_string(sk_word.main_title, false) else local word_filter = si.pending_input.get_word_filter() if word_filter == si.word_filter.ALL then if ca.has_multi_word(8) then word_filter = si.word_filter.SINGLE else word_filter = si.word_filter.MULTI end elseif word_filter == si.word_filter.SINGLE then word_filter = si.word_filter.MULTI else word_filter = si.word_filter.SINGLE end si.pending_input.set_word_filter(word_filter) end end --sk @ for chs soft abc sk_at_abc = si.new_softkey() sk_at_abc.main_title = "@" sk_at_abc.on_click = function() si.input_precise("@", "", "", false) end sk_at_abc.on_long_press_once = function() local sur = _G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end sur.softkeys[1] = si.new_expandkey(si.u16code("'", 1)) sur.softkeys[2] = si.new_expandkey(si.u16code("/", 1)) sur.softkeys[3] = si.new_expandkey(si.u16code("_",1)) sur.softkeys[4] = si.new_expandkey(si.u16code("@",1)) si.popup_surface(sur) end --sk crt for wubi sk_crt = si.new_softkey() sk_crt.main_title = "@string/chs_wubi_crt" sk_crt.on_click = function () if si.is_userword_mode() then si.userword_end() else si.userword_begin() end end --sk que for cangjie sk_que = si.new_softkey() sk_que.main_title = "?" sk_que.on_click = function() si.input_precise("?", "", "", false) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end end --sk email for mainland version sk_email_mainland = si.new_softkey() sk_email_mainland.main_title = "@" sk_email_mainland.on_click = function() si.input_string(sk_email_mainland.main_title, false) end --sk email uri for full western sk_email_uri = si.new_softkey() sk_email_uri.main_title = "" sk_email_uri.on_click = function() local input local is_editor_url_cursor_begin = false if si.input_type() == si.context.URI then local n, str = si.get_text_before_cursor(10) n = _G.string.len(str) if n == 0 or str == "http://" or str == "https://" then input = "www." is_editor_url_cursor_begin = true else local arr = si.utf8_to_utf16(str) if arr[n] == _G.string.byte(" ") then si.input_keycode(_G.config.L_KEYCODE_BACKSPACE) end input = ".com" end elseif si.input_type() == si.context.EMAIL then local n, str = si.get_text_before_cursor(1024) n = _G.string.len(str) if n == 0 or _G.string.find(str, "@") == nil then input = "@" else input = ".com" end end if is_editor_url_cursor_begin then si.input_series_precise(input, "", "", si.is_shift_pressed(), 0) else si.input_string(input, false) end end sk_email_uri.on_long_press_once = function() if si.input_type() == si.context.URI then show_expand_symbols({".net", ".org", ".edu", ".com"}, 1) elseif si.input_type() == si.context.EMAIL then show_expand_symbols({".cn", ".net", ".org", ".edu"}, 1) end end --sk half for handwrite full sk_half_hw = si.new_softkey() sk_half_hw.main_title = "@string/chs_hw_half" sk_half_hw.on_click = function() clear_hw() si.change_surface_by_subtype(si.surface_subtype.KEYBOARD_PHONEPAD) end --sk full for handwrite half sk_full_hw = si.new_softkey() sk_full_hw.main_title = "@string/chs_hw_full" sk_full_hw.on_click = function() clear_hw() si.change_surface_by_subtype(si.surface_subtype.KEYBOARD_FULL) end --sk paopao for handwrite full sk_paopao_hw = si.new_softkey() sk_paopao_hw.on_click = function() si.input_keycode(_G.config.L_KEYCODE_FUN_HANDWRITE_PAOPAO) end --sk zh for handwrite sk_zh_hw = si.new_softkey() sk_zh_hw.main_title = "@string/chs_hw_zh" sk_zh_hw.on_click = function() si.set_setting_value(si.settings.HANDWRITE_RECOG_RANGE, si.handwrite_recog.RECOG_RANGE_ALL, si.language.category.RECOGRANGE, "chinese_handwrite") end --sk en for handwrite sk_en_hw = si.new_softkey() sk_en_hw.main_title = "@string/chs_hw_en_num" sk_en_hw.on_click = function() si.set_setting_value(si.settings.HANDWRITE_RECOG_RANGE, si.handwrite_recog.RECOG_RANGE_ALL - si.handwrite_recog.RECOG_RANGE_ZH, si.language.category.RECOGRANGE, "chinese_handwrite") end --sk close for handwrite sk_close_hw = si.new_softkey() sk_close_hw.main_title = "@string/chs_hw_close" sk_close_hw.on_click = function () si.input_keycode(_G.config.L_KEYCODE_CLOSE) end function show_voice_input_view(commit_function) if commit_function then commit_function() end clear_hw() if not ca.empty() or not pi.empty() then ca.clear() while not pi.empty() do pi.delete_range() end end si.input_keycode(_G.config.L_KEYCODE_FUN_SHOW_VOICE_MASK) end sk_smiley_open = si.new_softkey() sk_smiley_open.on_click = function() local changed = false local sym_setting = si.get_setting_value(si.settings.AUTO_SPACE, si.settings_type.SETTING_BOOL); if sym_setting then si.set_setting_value(si.settings.AUTO_SPACE, false, si.settings_type.SETTING_BOOL) changed = true end if not pi.context_empty() then pi.finish_composing() end local default = ca.get_default_index() if default ~= 0 and not pi.empty() and ca.get_item_source(ca.get_item(default)) ~= ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end if not ca.empty() or not pi.empty() then ca.clear() while not pi.empty() do pi.delete_range() end end si.input_keycode(_G.config.L_KEYCODE_FUN_OPEN_SMILEY_PANEL) if changed then si.set_setting_value(si.settings.AUTO_SPACE, true, si.settings_type.SETTING_BOOL) end end sk_smiley_close = si.new_softkey() sk_smiley_close.on_click = function() si.input_keycode(_G.config.L_KEYCODE_FUN_CLOSE_SMILEY_PANEL) end --softkey to really change the surface to smiley sur sk_sur_change_to_smiley = si.new_softkey() sk_sur_change_to_smiley.on_click = function() si.change_surface_by_id("smiley.sur.png") end --softkey to change the surface back from smiley sk_sur_change_from_smiley = si.new_softkey() sk_sur_change_from_smiley.on_click = function() si.back_to_previous() end --[[ sk_sp for english ]]-- sk_sp_eng = si.new_softkey() sk_sp_eng.main_title = " " sk_sp_eng.mistyping_tolerant = true sk_sp_eng.on_click = function () end_transaction() local default = ca.get_default_index() if not pi.empty() then if not ca.empty() then if not si.get_setting_value(si.settings.AUTO_SPACE) then si.set_setting_value(si.settings.AUTO_SPACE, true, si.settings_type.SETTING_BOOL) ca.confirm_item_2(default) si.set_setting_value(si.settings.AUTO_SPACE, false, si.settings_type.SETTING_BOOL) else ca.confirm_item_2(default) end else if pi.range_exist(pi.L_RANGE_PENDING) then pi.commit_input() elseif pi.range_exist(pi.L_RANGE_CURVE) then pi.delete_range() end si.input_keycode(_G.config.L_KEYCODE_SPACE) end elseif default ~= 0 and not si.userword_list_visible() then local commit_space = false if ca.get_item_source(ca.get_item(default)) == ca.SOURCE_TOUCHCORRECTCAND then commit_space = true end ca.confirm_item_2(default) if commit_space then si.input_keycode(_G.config.L_KEYCODE_SPACE) end else ca.clear() si.input_keycode(_G.config.L_KEYCODE_SPACE) end end function move_cursor_to_left() if not ca.empty() then ca.clear() end si.input_keycode(_G.config.L_KEYCODE_EDIT_LEFT) end function move_cursor_to_right() if not ca.empty() then ca.clear() end si.input_keycode(_G.config.L_KEYCODE_EDIT_RIGHT) end sk_sp_eng.on_long_press_slide_left = switch_to_last_lang_from_eng sk_sp_eng.on_long_press_slide_right = switch_to_next_lang_from_eng sk_sp_eng.on_slide_left = switch_to_last_lang_from_eng sk_sp_eng.on_slide_right = switch_to_next_lang_from_eng sk_sp_eng.on_double_click = function() if not (si.input_type() == si.context.PASSWORD or (si.get_setting_value(si.settings.SPACE_GET_NEXTWORD, si.language.category.SPGETNEXTWORD, "western", si.settings_type.SETTING_BOOL) and si.get_current_surface().default_nextword)) and support_auto_append_dot() then auto_append_dot() else sk_sp_eng.on_click() end end sk_sp_eng.on_long_press_once = function() show_voice_input_view(commit_eng) end sk_sp_bn = si.new_softkey() sk_sp_bn.main_title = " " sk_sp_bn.mistyping_tolerant = true sk_sp_bn.on_click = sk_sp_eng.on_click sk_sp_bn.on_long_press_slide_left = switch_to_last_lang_from_eng sk_sp_bn.on_long_press_slide_right = switch_to_next_lang_from_eng sk_sp_bn.on_slide_left = switch_to_last_lang_from_eng sk_sp_bn.on_slide_right = switch_to_next_lang_from_eng sk_sp_bn.on_double_click = function() if not (si.get_setting_value(si.settings.SPACE_GET_NEXTWORD, si.language.category.SPGETNEXTWORD, "western", si.settings_type.SETTING_BOOL) and si.get_current_surface().default_nextword) and support_auto_append_dot() then auto_append_bn_dot() else sk_sp_bn.on_click() end end sk_sp_bn.on_long_press_once = sk_sp_eng.on_long_press_once --[[sk_sp for armenian]]-- sk_sp_am = si.new_softkey() sk_sp_am.main_title = " " sk_sp_am.mistyping_tolerant = true sk_sp_am.on_click = sk_sp_eng.on_click sk_sp_am.on_long_press_slide_left = switch_to_last_lang_from_eng sk_sp_am.on_long_press_slide_right = switch_to_next_lang_from_eng sk_sp_am.on_slide_left = switch_to_last_lang_from_eng sk_sp_am.on_slide_right = switch_to_next_lang_from_eng sk_sp_am.on_double_click = function() if not (si.get_setting_value(si.settings.SPACE_GET_NEXTWORD, si.language.category.SPGETNEXTWORD, "western", si.settings_type.SETTING_BOOL) and si.get_current_surface().default_nextword) then auto_append_am_dot() else sk_sp_am.on_click() end end sk_sp_am.on_long_press_once = sk_sp_eng.on_long_press_once --[[sk_sp for santhali]]-- sk_sp_sa = si.new_softkey() sk_sp_sa.main_title = " " sk_sp_sa.mistyping_tolerant = true sk_sp_sa.on_click = sk_sp_eng.on_click sk_sp_sa.on_long_press_slide_left = switch_to_last_lang_from_eng sk_sp_sa.on_long_press_slide_right = switch_to_next_lang_from_eng sk_sp_sa.on_slide_left = switch_to_last_lang_from_eng sk_sp_sa.on_slide_right = switch_to_next_lang_from_eng sk_sp_sa.on_double_click = function() if not (si.get_setting_value(si.settings.SPACE_GET_NEXTWORD, si.language.category.SPGETNEXTWORD, "western", si.settings_type.SETTING_BOOL) and si.get_current_surface().default_nextword) then auto_append_sa_dot() else sk_sp_sa.on_click() end end sk_sp_sa.on_long_press_once = sk_sp_eng.on_long_press_once sk_sp_bn.on_long_press_once = sk_sp_eng.on_long_press_once --[[sk_sp for hindi changeable keyboard]]-- sk_sp_changeable_hi = si.new_softkey() sk_sp_changeable_hi.main_title = " " sk_sp_changeable_hi.mistyping_tolerant = true sk_sp_changeable_hi.on_click = sk_sp_eng.on_click sk_sp_changeable_hi.on_long_press_slide_left = switch_to_last_lang_from_eng sk_sp_changeable_hi.on_long_press_slide_right = switch_to_next_lang_from_eng sk_sp_changeable_hi.on_slide_left = switch_to_last_lang_from_eng sk_sp_changeable_hi.on_slide_right = switch_to_next_lang_from_eng sk_sp_changeable_hi.on_double_click = function() if not (si.get_setting_value(si.settings.SPACE_GET_NEXTWORD, si.language.category.SPGETNEXTWORD, "western", si.settings_type.SETTING_BOOL) and si.get_current_surface().default_nextword) then auto_append_changeable_hi_dot() else sk_sp_changeable_hi.on_click() end end sk_sp_changeable_hi.on_long_press_once = sk_sp_eng.on_long_press_once --[[sk_sp for nepali keyboard]]-- sk_sp_nepali = si.new_softkey() sk_sp_nepali.main_title = " " sk_sp_nepali.mistyping_tolerant = true sk_sp_nepali.on_click = sk_sp_eng.on_click sk_sp_nepali.on_long_press_slide_left = switch_to_last_lang_from_eng sk_sp_nepali.on_long_press_slide_right = switch_to_next_lang_from_eng sk_sp_nepali.on_slide_left = switch_to_last_lang_from_eng sk_sp_nepali.on_slide_right = switch_to_next_lang_from_eng sk_sp_nepali.on_double_click = function() if not (si.get_setting_value(si.settings.SPACE_GET_NEXTWORD, si.language.category.SPGETNEXTWORD, "western", si.settings_type.SETTING_BOOL) and si.get_current_surface().default_nextword) and support_auto_append_dot() then auto_append_nepali_dot() else sk_sp_nepali.on_click() end end sk_sp_nepali.on_long_press_once = sk_sp_eng.on_long_press_once --[[sk_sp for zawgyi keyboard]]-- sk_sp_zawgyi = si.new_softkey() sk_sp_zawgyi.main_title = " " sk_sp_zawgyi.mistyping_tolerant = true sk_sp_zawgyi.on_click = sk_sp_eng.on_click sk_sp_zawgyi.on_long_press_slide_left = switch_to_last_lang_from_eng sk_sp_zawgyi.on_long_press_slide_right = switch_to_next_lang_from_eng sk_sp_zawgyi.on_slide_left = switch_to_last_lang_from_eng sk_sp_zawgyi.on_slide_right = switch_to_next_lang_from_eng sk_sp_zawgyi.on_double_click = function() if not (si.get_setting_value(si.settings.SPACE_GET_NEXTWORD, si.language.category.SPGETNEXTWORD, "western", si.settings_type.SETTING_BOOL) and si.get_current_surface().default_nextword) then auto_append_zawgyi_dot() else sk_sp_zawgyi.on_click() end end sk_sp_zawgyi.on_long_press_once = sk_sp_eng.on_long_press_once --[[ sk_sp for vietnam ]]-- sk_sp_vietnam = si.new_softkey() sk_sp_vietnam.main_title = " " sk_sp_vietnam.mistyping_tolerant = true sk_sp_vietnam.on_click = function () end_transaction() local default = ca.get_default_index() if not pi.empty() then if not ca.empty() then if pi.range_exist(pi.L_RANGE_CURVE) or si.get_setting_value(si.settings.WORD_PREDICTION) then if not si.get_setting_value(si.settings.AUTO_SPACE) then si.set_setting_value(si.settings.AUTO_SPACE, true, si.settings_type.SETTING_BOOL) ca.confirm_item_2(default) si.set_setting_value(si.settings.AUTO_SPACE, false, si.settings_type.SETTING_BOOL) else ca.confirm_item_2(default) end else if pi.range_exist(pi.L_RANGE_PENDING) then pi.commit_input() elseif pi.range_exist(pi.L_RANGE_CURVE) then pi.delete_range() end si.input_keycode(_G.config.L_KEYCODE_SPACE) end else if pi.range_exist(pi.L_RANGE_PENDING) then pi.commit_input() elseif pi.range_exist(pi.L_RANGE_CURVE) then pi.delete_range() end si.input_keycode(_G.config.L_KEYCODE_SPACE) end elseif default ~= 0 and not si.userword_list_visible() then local commit_space = false if ca.get_item_source(ca.get_item(default)) == ca.SOURCE_TOUCHCORRECTCAND then commit_space = true end ca.confirm_item_2(default) if commit_space then si.input_keycode(_G.config.L_KEYCODE_SPACE) end else ca.clear() si.input_keycode(_G.config.L_KEYCODE_SPACE) end end sk_sp_vietnam.on_long_press_slide_left = switch_to_last_lang_from_eng sk_sp_vietnam.on_long_press_slide_right = switch_to_next_lang_from_eng sk_sp_vietnam.on_slide_left = switch_to_last_lang_from_eng sk_sp_vietnam.on_slide_right = switch_to_next_lang_from_eng sk_sp_vietnam.on_double_click = function() if not (si.get_setting_value(si.settings.SPACE_GET_NEXTWORD, si.language.category.SPGETNEXTWORD, "western", si.settings_type.SETTING_BOOL) and si.get_current_surface().default_nextword) and support_auto_append_dot() then auto_append_dot() else sk_sp_vietnam.on_click() end end sk_sp_vietnam.on_long_press_once = function() show_voice_input_view(commit_eng) end --[[sk_sp for chs]]-- sk_sp_chs = si.new_softkey() sk_sp_chs.mistyping_tolerant = true sk_sp_chs.on_click = function () end_transaction() local default = ca.get_default_index() if default ~= 0 and not si.dialect_list_visible() then ca.confirm_item_2(default) elseif not pi.empty() then pi.commit_input() else if pi.get_signal_code() ~= 0 then pi.delete_character() end if fi.size() > 0 then --handwrite mask candidates fi.clear() end ca.clear() si.input_keycode(_G.config.L_KEYCODE_SPACE) end end sk_sp_chs.on_long_press_once = function() show_voice_input_view(commit_chs) end sk_sp_chs.on_long_press_slide_left = switch_to_last_lang_from_chs sk_sp_chs.on_long_press_slide_right = switch_to_next_lang_from_chs sk_sp_chs.on_slide_left = switch_to_last_lang_from_chs sk_sp_chs.on_slide_right = switch_to_next_lang_from_chs --sk sk_sp_jap_pad for jap phonepad sk_sp_jap_pad = si.new_softkey() sk_sp_jap_pad.mistyping_tolerant = true sk_sp_jap_pad.on_click = function () if not pi.empty() then pi.pending_sentence_mode() else ca.clear() si.input_keycode(_G.config.L_KEYCODE_SPACE) end end sk_sp_jap_pad.on_long_press_once = nil --[[sk_sp for japanese]]-- sk_sp_jap = si.new_softkey() sk_sp_jap.mistyping_tolerant = true sk_sp_jap.on_click = function () if not pi.empty() then pi.pending_sentence_mode() else ca.clear() si.input_keycode(_G.config.L_KEYCODE_SPACE) end end sk_sp_jap.on_long_press_once = function() show_voice_input_view(commit_chs) end sk_sp_jap.on_long_press_slide_left = switch_to_last_lang_from_chs sk_sp_jap.on_long_press_slide_right = switch_to_next_lang_from_chs sk_sp_jap.on_slide_left = switch_to_last_lang_from_chs sk_sp_jap.on_slide_right = switch_to_next_lang_from_chs --[[sk_sp for stroke]]-- sk_sp_stroke = si.new_softkey() sk_sp_stroke.mistyping_tolerant = true sk_sp_stroke.on_click = function () end_transaction() local default = ca.get_default_index() if default ~= 0 then ca.confirm_item_2(default) elseif not pi.empty() then if pi.range_exist(pi.L_RANGE_PENDING) then pi.delete_range() end pi.commit_input() else if fi.size() > 0 then --handwrite mask candidates fi.clear() end ca.clear() si.input_keycode(_G.config.L_KEYCODE_SPACE) end end sk_sp_stroke.on_long_press_once = function() show_voice_input_view(commit_chs) end sk_sp_stroke.on_long_press_slide_left = sk_sp_chs.on_long_press_slide_left sk_sp_stroke.on_long_press_slide_right = sk_sp_chs.on_long_press_slide_right sk_sp_stroke.on_slide_left = sk_sp_chs.on_slide_left sk_sp_stroke.on_slide_right = sk_sp_chs.on_slide_right --[[sk_sp for handwrite]]-- sk_sp_hw = si.new_softkey() sk_sp_hw.mistyping_tolerant = true sk_sp_hw.on_click = function () end_transaction() local default = ca.get_default_index() if default ~= 0 and fi.size() <= 0 then ca.confirm_item_2(default) else clear_hw() si.input_keycode(_G.config.L_KEYCODE_SPACE) end end sk_sp_hw.on_long_press_once = function() clear_hw() show_voice_input_view(commit_chs) end sk_sp_hw.on_long_press_slide_left = sk_sp_chs.on_long_press_slide_left sk_sp_hw.on_long_press_slide_right = sk_sp_chs.on_long_press_slide_right sk_sp_hw.on_slide_left = sk_sp_chs.on_slide_left sk_sp_hw.on_slide_right = sk_sp_chs.on_slide_right --[[sk_sp for cangjie]]-- sk_sp_cangjie = si.new_softkey() sk_sp_cangjie.mistyping_tolerant = true sk_sp_cangjie.on_click = function () end_transaction() local default = ca.get_default_index() if default ~= 0 and not si.dialect_list_visible() then ca.confirm_item_2(default) elseif not pi.empty() then --do nothing else if fi.size() > 0 then --handwrite mask candidates fi.clear() end ca.clear() si.input_keycode(_G.config.L_KEYCODE_SPACE) end end sk_sp_cangjie.on_long_press_once = sk_sp_chs.on_long_press_once sk_sp_cangjie.on_long_press_slide_left = sk_sp_chs.on_long_press_slide_left sk_sp_cangjie.on_long_press_slide_right = sk_sp_chs.on_long_press_slide_right sk_sp_cangjie.on_slide_left = sk_sp_chs.on_slide_left sk_sp_cangjie.on_slide_right = sk_sp_chs.on_slide_right --[[sk_sp for chs soft abc]]-- sk_sp_abc = si.new_softkey() sk_sp_abc.on_click = function () si.input_keycode(_G.config.L_KEYCODE_SPACE) end --[[ sk_ent for english ]]-- sk_ent_eng = si.new_softkey() sk_ent_eng.on_click = function () si.set_accessibility_string("@string/accessibility_enter") if not pi.empty() then pi.commit_input() si.input_keycode(_G.config.L_KEYCODE_ENTER) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_keycode(_G.config.L_KEYCODE_ENTER) end end --[[ sk_ent for chinese simplified]]-- sk_ent_chs = si.new_softkey() sk_ent_chs.main_title = "@string/chs_key_ent_title" sk_ent_chs.on_click = function () if not pi.empty() then pi.commit_input() else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end if pi.get_signal_code() ~= 0 then pi.delete_character() end if fi.size() > 0 then fi.clear() end ca.clear() si.input_keycode(_G.config.L_KEYCODE_ENTER) end end --[[ sk_ent for chinese traditional]]-- sk_ent_cht = si.new_softkey() sk_ent_cht.on_click = sk_ent_chs.on_click --[[ sk_ent for stroke]]-- sk_ent_stroke = si.new_softkey() sk_ent_stroke.main_title = "@string/chs_key_ent_title" sk_ent_stroke.on_click = function () if not pi.empty() then local default = ca.get_default_index() if default ~= 0 then ca.confirm_item_2(default) end if pi.range_exist(pi.L_RANGE_PENDING) then pi.delete_range() pi.commit_input() end else ca.clear() si.input_keycode(_G.config.L_KEYCODE_ENTER) end end --[[ sk_ent for handwrite]]-- sk_ent_hw = si.new_softkey() sk_ent_hw.main_title = "@string/chs_key_ent_title" sk_ent_hw.on_click = function () local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) else clear_hw() si.input_keycode(_G.config.L_KEYCODE_ENTER) end end --[[ sk_bk for english ]]-- sk_bk_eng = si.new_softkey() sk_bk_eng.on_click = function () local cur = si.get_current_language() local separator = "" if cur then separator = cur.get_traits().separator end si.set_accessibility_string("@string/accessibility_delete") if pi.range_exist(pi.L_RANGE_CURVE) then pi.delete_range() elseif pi.range_exist(pi.L_RANGE_PENDING) then pi.delete_character() elseif not ca.empty() then ca.clear() clear_wave_hints() if not pi.context_empty() or si.is_international_version() then if separator == " " then si.input_keycode(_G.config.L_KEYCODE_BACKSPACE) end end else clear_wave_hints() si.input_keycode(_G.config.L_KEYCODE_BACKSPACE) end end sk_bk_eng.on_slide_left = function () local cur = si.get_current_language() local separator = "" if cur then separator = cur.get_traits().separator end if pi.range_exist(pi.L_RANGE_PENDING + pi.L_RANGE_CURVE) then pi.delete_range() elseif not ca.empty() then ca.clear() clear_wave_hints() if not pi.context_empty() then pi.finish_composing() if separator == " " then si.input_keycode(_G.config.L_KEYCODE_FUN_DEL_AROUND_WORD) end elseif si.is_international_version() then if separator == " " then si.input_keycode(_G.config.L_KEYCODE_FUN_DEL_AROUND_WORD) end end else clear_wave_hints() if separator == " " then si.input_keycode(_G.config.L_KEYCODE_FUN_DELWORD) else si.input_keycode(_G.config.L_KEYCODE_BACKSPACE) end end end sk_bk_eng.on_long_press_begin = function () sk_bk_on_long_press_begin(sk_bk_eng) end sk_bk_eng.on_long_press_multi = function () sk_bk_on_long_press_multi(sk_bk_eng) end sk_bk_eng.on_long_press_end = function() sk_bk_on_long_press_end(sk_bk_eng) end --[[ sk_bk for chinese]]-- sk_bk_chs = si.new_softkey() sk_bk_chs.on_click = function () if not pi.stroke_filter_empty() then pi.delete_stroke() elseif pi.range_exist(pi.L_RANGE_PENDING) then pi.delete_character() elseif pi.range_exist(pi.L_RANGE_CONFIRM + pi.L_RANGE_CURVE) then pi.delete_range() elseif pi.get_signal_code() ~= 0 then pi.delete_character() elseif si.handwrite_mask_visible() and fi.size() > 0 then fi.clear() si.input_keycode(_G.config.L_KEYCODE_BACKSPACE) elseif not ca.empty() then ca.clear() else si.input_keycode(_G.config.L_KEYCODE_BACKSPACE) end end sk_bk_chs.on_slide_left = function () if not pi.empty() then while not pi.stroke_filter_empty() do pi.delete_stroke() end if pi.range_exist(pi.L_RANGE_PENDING + pi.L_RANGE_CURVE) then pi.delete_range() else while not pi.empty() do pi.delete_range() end end elseif pi.get_signal_code() ~= 0 then pi.delete_character() elseif si.handwrite_mask_visible() and fi.size() > 0 then fi.clear() si.delete_commit() elseif not ca.empty() then ca.clear() else si.input_keycode(_G.config.L_KEYCODE_FUN_DELWORD) end end sk_bk_chs.on_long_press_begin = function () sk_bk_on_long_press_begin(sk_bk_chs) end sk_bk_chs.on_long_press_multi = function () sk_bk_on_long_press_multi(sk_bk_chs) end sk_bk_chs.on_long_press_end = function() sk_bk_on_long_press_end(sk_bk_chs) end --[[ sk_bk for handwrite]]-- sk_bk_hw = si.new_softkey() sk_bk_hw.on_click = function () if clear_hw() then si.input_keycode(_G.config.L_KEYCODE_BACKSPACE) end end sk_bk_hw.on_slide_left = function () local has_filter = fi.size() > 0 if clear_hw() then if has_filter then si.delete_commit() else si.input_keycode(_G.config.L_KEYCODE_FUN_DELWORD) end end end sk_bk_hw.on_long_press_begin = function () sk_bk_on_long_press_begin(sk_bk_hw) end sk_bk_hw.on_long_press_multi = function () sk_bk_on_long_press_multi(sk_bk_hw) end sk_bk_hw.on_long_press_end = function() sk_bk_on_long_press_end(sk_bk_hw) end --[[ sk_bk for chs soft abc]]-- sk_bk_abc = si.new_softkey() sk_bk_abc.on_click = function () si.input_keycode(_G.config.L_KEYCODE_BACKSPACE) end sk_bk_abc.on_slide_left = function () si.input_keycode(_G.config.L_KEYCODE_FUN_DELWORD) end sk_bk_abc.on_long_press_begin = function () sk_bk_on_long_press_begin(sk_bk_abc) end sk_bk_abc.on_long_press_multi = function () sk_bk_on_long_press_multi(sk_bk_abc) end sk_bk_abc.on_long_press_end = function() sk_bk_on_long_press_end(sk_bk_abc) end --sk sym for english sk_sym_eng = si.new_softkey() if si.is_international_version() then sk_sym_eng.main_title = "12#" else sk_sym_eng.main_title = "@string/chs_key_sym_title" end sk_sym_eng.on_click = function() sk_sym_on_click("eng_sym_grid.sur.png", "eng_sym_keyboard1.sur.png", commit_eng_no_space) end --sk sym for spanish sk_sym_spanish = si.new_softkey() sk_sym_spanish.main_title = "12#" sk_sym_spanish.on_click = function() sk_sym_on_click("spanish_sym_grid.sur.png", "spanish_sym_keyboard1.sur.png", commit_eng_no_space) end --sk sym for custom currency sk_sym_custom_currency = si.new_softkey() sk_sym_custom_currency.main_title = "12#" sk_sym_custom_currency.on_click = function() sk_sym_on_click("eng_sym_grid.sur.png", "custom_currency_sym_keyboard1.sur.png", commit_eng_no_space) end --sk sym for hindi sk_sym_hindi = si.new_softkey() sk_sym_hindi.main_title = "12#" sk_sym_hindi.on_click = function() local cur_sym_keyboard = si.get_cur_sym_keyboard(si.get_current_language().statistic_alias) if (cur_sym_keyboard == si.SYM_KEYBOARD.DEFAULT) then sk_sym_on_click("eng_sym_grid.sur.png", "hindi_sym_keyboard1.sur.png", commit_eng_no_space) else sk_sym_on_click("eng_sym_grid.sur.png", "hindi_sp_sym_keyboard1.sur.png", commit_eng_no_space) end end --sk sym for hindi normal number sk_sym_hindi_normal = si.new_softkey() sk_sym_hindi_normal.main_title = "१२३" sk_sym_hindi_normal.on_click = function() si.set_cur_sym_keyboard(si.get_current_language().statistic_alias, si.SYM_KEYBOARD.SPECIAL) sk_sym_on_click("eng_sym_grid.sur.png", "hindi_sp_sym_keyboard1.sur.png", commit_eng_no_space) end --sk sym for hindi local number sk_sym_hindi_local = si.new_softkey() sk_sym_hindi_local.main_title = "123" sk_sym_hindi_local.on_click = function() si.set_cur_sym_keyboard(si.get_current_language().statistic_alias, si.SYM_KEYBOARD.DEFAULT) sk_sym_on_click("eng_sym_grid.sur.png", "hindi_sym_keyboard1.sur.png", commit_eng_no_space) end --sk sym for chinese simplified sk_sym_chs = si.new_softkey() sk_sym_chs.main_title = "@string/chs_key_sym_title" sk_sym_chs.on_click = function() sk_sym_chs_on_click("chs_sym_grid.sur.png", "chs_sym_keyboard1.sur.png", commit_chs) end --sk sym for chinese traditional sk_sym_cht = si.new_softkey() sk_sym_cht.main_title = "12#" sk_sym_cht.on_click = sk_sym_chs.on_click sk_sym_cht.on_long_press_once = sk_sym_chs.on_long_press_once sk_quick_switcher = si.new_softkey() sk_quick_switcher.on_click = function() if not pi.empty() then pi.delete_range() end local quick_switcher_language = si.get_setting_value(si.settings.QUICK_SWITCHER_LANGUAGE, si.settings_type.SETTING_STRING) local quick_switcher_layout = si.get_setting_value(si.settings.QUICK_SWITCHER_LAYOUT, si.settings_type.SETTING_INT) local quick_switcher_dict = si.get_setting_value(si.settings.QUICK_SWITCHER_DICT, si.settings_type.SETTING_BOOL) if quick_switcher_language == "" or si.get_language(quick_switcher_language) == nil then si.input_keycode(_G.config.L_KEYCODE_FUN_QUICK_SWITCHER_NO_SETTING_PROMPT) return end local screen_orientation = si.get_setting_value(si.settings.SCREEN_ORIENTATION, si.settings_type.SETTING_INT) local is_portrait = not (screen_orientation == si.screen_orientation.LANDSCAPE) local cur = si.get_setting_value(si.settings.CURRENT_LANGUAGE) local prediction = si.get_setting_value(si.settings.WORD_PREDICTION) local current_subtype = si.get_current_surface().surface_subtype local language_diff = (quick_switcher_language ~= cur) local layout_diff = (quick_switcher_layout ~= -1 and quick_switcher_layout ~= current_subtype) local dict_diff = false --(quick_switcher_dict ~= prediction) if language_diff or layout_diff or dict_diff then if language_diff and si.get_language(quick_switcher_language) ~= nil then local language_history = si.get_setting_value(si.settings.SAVED_LANGUAGE_HISTORY, si.settings_type.SETTING_STRING) if language_history == "" then local preused_language = si.get_setting_value(si.settings.PREUSED_LANGUAGE) language_history = preused_language .. "," .. cur end si.set_current_language(quick_switcher_language) si.set_setting_value(si.settings.SAVED_LANGUAGE_HISTORY, language_history, si.settings_type.SETTING_STRING) end if quick_switcher_layout ~= -1 and quick_switcher_layout ~= si.get_current_surface().surface_subtype then si.change_surface_by_subtype(quick_switcher_layout) end if dict_diff then --si.set_setting_value(si.settings.WORD_PREDICTION, quick_switcher_dict) end si.set_setting_value(si.settings.QUICK_SWITCHER_PREV_LANGUAGE, cur, si.settings_type.SETTING_STRING) si.set_setting_value((is_portrait and si.settings.QUICK_SWITCHER_PREV_LAYOUT_P) or si.settings.QUICK_SWITCHER_PREV_LAYOUT_L, current_subtype, si.settings_type.SETTING_INT) --si.set_setting_value(si.settings.QUICK_SWITCHER_PREV_DICT_P, prediction, si.settings_type.SETTING_BOOL) else local prev_language = si.get_setting_value(si.settings.QUICK_SWITCHER_PREV_LANGUAGE, si.settings_type.SETTING_STRING) local prev_subtype_p = si.get_setting_value(si.settings.QUICK_SWITCHER_PREV_LAYOUT_P, si.settings_type.SETTING_INT) local prev_subtype_l = si.get_setting_value(si.settings.QUICK_SWITCHER_PREV_LAYOUT_L, si.settings_type.SETTING_INT) if prev_subtype_p == 0 then prev_subtype_p = prev_subtype_l end if prev_subtype_l == 0 then prev_subtype_l = prev_subtype_p end local prev_subtype = (is_portrait and prev_subtype_p) or prev_subtype_l --local prev_dict = si.get_setting_value(si.settings.QUICK_SWITCHER_PREV_DICT_P, si.settings_type.SETTING_BOOL) if prev_language ~= nil and prev_language ~= "" and prev_language ~= cur and si.get_language(prev_language) ~= nil then local language_history = si.get_setting_value(si.settings.SAVED_LANGUAGE_HISTORY, si.settings_type.SETTING_STRING) si.set_current_language(prev_language) si.set_setting_value(si.settings.SAVED_LANGUAGE_HISTORY, language_history, si.settings_type.SETTING_STRING) end if prev_subtype ~= nil and prev_subtype ~= 0 then si.change_surface_by_subtype(prev_subtype) end if prev_dict ~= nil then --si.set_setting_value(si.settings.WORD_PREDICTION, prev_dict) end end end -- sk smile for full sym keyboard sk_smile = si.new_softkey() sk_smile.main_title = ":-)" sk_smile.on_click = function() si.input_string(sk_smile.main_title, true) end -- sk locale for full sym keyboard sk_locale = si.new_softkey() local locale = _G.dofile("locale.lua") if not locale then locale = ".cn" end sk_locale.main_title = locale sk_locale.on_click = function() si.input_string(sk_locale.main_title, false) end sk_locale.case_sensitive = false -- sk_chs_eng change sym from english to chinese sk_chs_eng = si.new_softkey() sk_chs_eng.on_click = function() local current_surface = si.get_current_surface() local number = get_current_page(current_surface) if number == nil then return end local new_keyboard_type local chs = _G.string.find(current_surface.template, "chs") if chs == nil then new_keyboard_type = "chs_sym_keyboard" else new_keyboard_type = "eng_sym_keyboard" end local new_surface = new_keyboard_type .. number .. ".sur.png" si.change_surface_by_id(new_surface) end sk_hide = si.new_softkey() sk_hide.on_click = function() si.set_accessibility_string("@string/accessibility_close_keyboard") si.input_keycode(_G.config.L_KEYCODE_CLOSE) end -- sk ZWNJ sk_zwnj = si.new_softkey() sk_zwnj.main_title = "‌" sk_zwnj.alt_title = "" sk_zwnj.on_click = function () si.input_precise("‌", "", "", false) end -- sk ZWNJ & pop zwj sk_zwnj_zwj = si.new_softkey() sk_zwnj_zwj.main_title = "‌" sk_zwnj_zwj.alt_title = "‍" sk_zwnj_zwj.supportPreviewPopup = "true" sk_zwnj_zwj.on_click = function () si.input_precise(sk_zwnj_zwj.main_title, "", "", false) end sk_zwnj_zwj.on_long_press_once = function () local sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND sur.softkeys[1] = si.new_expandkey(si.u16code(sk_zwnj_zwj.alt_title, 1)) sur.softkeys[1].keyIcon = "@drawable/key_icon_zwj" si.popup_surface(sur) end -- sk ZWJ & pop zwnj sk_zwj_zwnj = si.new_softkey() sk_zwj_zwnj.main_title = "‍" sk_zwj_zwnj.alt_title = "‌" sk_zwj_zwnj.supportPreviewPopup = "true" sk_zwj_zwnj.on_click = function () si.input_precise(sk_zwj_zwnj.main_title, "", "", false) end sk_zwj_zwnj.on_long_press_once = function () local sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND sur.softkeys[1] = si.new_expandkey(si.u16code(sk_zwj_zwnj.alt_title, 1)) sur.softkeys[1].keyIcon = "@drawable/key_icon_zwnj" si.popup_surface(sur) end -- sk ZWNJ for Bengali sk_zwnj_bengali = si.new_softkey() sk_zwnj_bengali.main_title = "‌" sk_zwnj_bengali.alt_title = "‍" sk_zwnj_bengali.supportPreviewPopup = "true" sk_zwnj_bengali.on_click = function () si.input_precise(sk_zwnj_bengali.main_title, "", "", false) end sk_zwnj_bengali.on_long_press_once = function () local sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND sur.softkeys[1] = si.new_expandkey(si.u16code(sk_zwnj_bengali.alt_title, 1)) sur.softkeys[1].keyIcon = "@drawable/key_icon_zwj" si.popup_surface(sur) end -- Bengali probhat dot input key sk_bn_probhat_dot = si.new_softkey() sk_bn_probhat_dot.main_title = "।" sk_bn_probhat_dot.alt_title = ";" sk_bn_probhat_dot.supportPreviewPopup = "true" sk_bn_probhat_dot.on_click = function () end_transaction() clear_default_nextword() si.input_precise(sk_bn_probhat_dot.main_title, "", "", false) end sk_bn_probhat_dot.on_long_press_once = function () symbols = {"ৃ",";"} show_expand_symbols(symbols,2) end sk_bn_probhat_dot.on_slide_down = function () si.input_precise(sk_bn_probhat_dot.alt_title, "", "", false) end sk_bn_probhat_dot_sp = si.new_softkey() sk_bn_probhat_dot_sp.main_title = "ৃ" sk_bn_probhat_dot_sp.alt_title = ";" sk_bn_probhat_dot_sp.supportPreviewPopup = "true" sk_bn_probhat_dot_sp.on_click = function () end_transaction() clear_default_nextword() si.input_precise(sk_bn_probhat_dot_sp.main_title, "", "", false) end sk_bn_probhat_dot_sp.on_long_press_once = function () show_expand_symbols({";"}, 1) end sk_bn_probhat_dot_sp.on_slide_down = function () si.input_precise(sk_bn_probhat_dot_sp.alt_title, "", "", false) end return P PK n5:QQX]5assets/common_traits.lua.pngUT n_n_n_ WГWГWГrequire "smartinput" --[[ this file is used to specify the characters used in a kind of languages be aware of that it should only include the characters in a real word without neither numbers nor symbols ]] local P = {} P._G = _G if _REQUIREDNAME == nil then common_traits = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local string = _G.string local si = _G.smartinput latin_extra_character_list = { "ӓ", "ѐ", "ё", "Ӓ", "Ѐ", "Ё" } greek_character_list = { "ά", "έ", "ή", "ί", "ό", "ύ", "ώ", "ΐ", "α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ρ", "σ", "τ", "υ", "φ", "χ", "ψ", "ω", "ϊ", "ϋ", "ΰ", "ς", "Ά", "Έ", "Ή", "Ί", "Ό", "Ύ", "Ώ", "ΐ", "Α", "Β", "Γ", "Δ", "Ε", "Ζ", "Η", "Θ", "Ι", "Κ", "Λ", "Μ", "Ν", "Ξ", "Ο", "Π", "Ρ", "Σ", "Τ", "Υ", "Φ", "Χ", "Ψ", "Ω", "Ϊ", "Ϋ", "ΰ", "ς", } arabic_character_list = { "ء", "آ", "أ", "ؤ", "إ", "ئ", "ا", "ب", "ة", "ت", "ث", "ج", "ح", "خ", "د", "ذ", "ر", "ز", "س", "ش", "ص", "ض", "ط", "ظ", "ع", "غ", "ف", "ق", "ك", "ل", "م", "ن", "ه", "و", "ى", "ي", "گ", "إ", "أ" } --[[ -- Croation, Czech, Danish, Dutch, English, Finnish, French, German, -- Hungarian, Indonesian, Italian, Malay, Norwegian, Polish, Portuguese, -- Romanian, Slovak, Slovenian, Spanish, Swedish, Turkish, Catalonian, Estonian -- Latvian, Lithuanian, Vietnam, Serbian(Latin), Icelandic, Albanian, Tagalog, -- Basque, Galician, Malagasy, --]] function is_latin_character(c) if c == string.byte(" ") or c == string.byte("\n") then return false end local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") if (c >= a_code and c <= z_code) or (c >= A_code and c <= Z_code) then return true else --special characters in other languages like Cyrillic for i, v in _G.ipairs(latin_extra_character_list) do if c == si.u16code(v, 1) then return true end end --the extended latin characters --C1 Controls and Latin-1 Supplement, Latin Extended-A, Latin Extended-B, Latin Extended Additional if c >= 0x00c0 and c <= 0x024f then return true elseif c >= 0x1e00 and c <= 0x1eff then return true end end return false end -- Bulgarian, Russian, Ukrainian, Serbian, Macedonian, Kazakh function is_cyrillic_character(c) local a_code = 0x0400 local r_code = 0x04ff if c >= a_code and c <= r_code then return true end return false end -- Greek function is_greek_character(c) for i, v in _G.ipairs(greek_character_list) do if c == si.u16code(v, 1) then return true end end return false end -- Arabic, Urdu, Persian, Uyghur function is_arabic_character(c) if c >= 0x600 and c <= 0x6ff then return true end return false end -- Thai function is_thai_character(c) if c >= 0x0E00 and c <= 0x0E7F then return true end return false end -- Hindi function is_hindi_character(c) if c >= 0x0900 and c <= 0x097f then return true end return false end -- India function is_india_character(c) if c >= 0x0900 and c <= 0x097f then return true end return false end -- Hebrew function is_hebrew_character(c) if c >= 0x05d0 and c <= 0x05ea then return true end return false end -- Bengali function is_bengali_character(c) if c >= 0x0981 and c <= 0x09fb then return true end return false end -- Laotian function is_laotian_character(c) if c >= 0x0e81 and c <= 0x0edf then return true end return false end -- Burmese function is_burmese_character(c) if c >= 0x1000 and c <= 0x109f then return true end return false end -- Khmer function is_khmer_character(c) if c >= 0x1780 and c <= 0x17ff then return true end return false end -- Tamil function is_tamil_character(c) if c >= 0x0b80 and c <= 0x0bff then return true end return false end -- Telugu function is_telugu_character(c) if c >= 0x0c00 and c <= 0x0c7f then return true end return false end -- Tibetan function is_tibetan_character(c) if c >= 0x0f00 and c <= 0x0fff then return true end return false end -- Marathi function is_marathi_character(c) if c >= 0x0900 and c <= 0x097f then return true end return false end -- Punjabi function is_punjabi_character(c) if c >= 0x0a01 and c <= 0x0a75 then return true end return false end -- Kannada function is_kannada_character(c) if c >= 0x0c82 and c <= 0x0cf2 then return true end return false end -- Malayalam function is_malayalam_character(c) if c >= 0x0d02 and c <= 0x0d7f then return true end return false end -- Gujarati function is_gujarati_character(c) if c >= 0x0a81 and c <= 0x0af1 then return true end return false end -- Assamese function is_assamese_character(c) if c >= 0x0981 and c <= 0x09fb then return true end return false end -- Armenian function is_armenian_character(c) if c >= 0x0531 and c <= 0xfb17 then return true end return false end -- Japan function is_japanese_character(c) if c >= 0x3040 and c <= 0x30FF then return true end return false end -- Sinhala function is_sinhala_character(c) if c >= 0x0d82 and c <= 0x0df4 then return true end return false end -- Oriya function is_oriya_character(c) if c >= 0x0b01 and c <= 0x0b71 then return true end return false end -- Manipuri function is_manipuri_character(c) if c >= 0x0900 and c <= 0x09ff then return true end return false end -- Tifinagh function is_tifinagh_character(c) if c >= 0x2D30 and c <= 0x2D7F then return true end return false end -- Santhali function is_santhali_character(c) if c >= 0x1C50 and c <= 0x1C7F then return true end return false end return P PKk5:Q5assets/config_compact.xmlUT  n_ n_ n_ w@TГw@TГw@TГUMo0dΠEyx;R;лpPz􉢭 쒎Fd֕soD>,=d\ ~p>ӉB~)7<*a-) ["B1Yqlҳ= fE:26ֲq#08?g+7CoaF+7jx=B!]0H-CKd/b r^ OȊQd~!p&^@G2x}r]@3k~Pl AUVM5,XJQbn~PEhS:}gοZ: EkڀdIG >\_\Xo|fu=>PK[\PKk5:Q5assets/config_compact_ui.xmlUT  n_ n_ n_ w@TГw@TГw@TГSj0 }^{S{fm| w{9Gґ5JP :R>FIBrOւ]t@uo`?x>w ABU5⵬F) /jA,%5hkb!c߰\h;ڻxqk؎v;L('g {q!R ,3GT,Vyᵨ UVewmVJp"x̳0T<+eQ'} ;ei{CPK^-PKk5:Q5assets/config_economic.xmlUT  n_ n_ n_ w@TГw@TГw@TГUn0]_醙EvFrX!Y12Ch2ẙ+{ahYĕ*ɳrt  @gJ|b `0nS4p=4&eR6wqS5Ň(yZ'CJ@}^y*xf܏Yz cWAΡC>[ԇZfV= j[ 3nlY4JS|3Y3|r=}%XDRf]itt;CEa3D("Vq;]xۛqЧ7 U<+ dEűć0q}zt ?\)?lxm:ˉk5^E^TEzc:@d ?AOg"-ʑtl+CAc-rm"3@KP绮i:/̩v1pv2ه{PK-5PKk5:Q5assets/config_install_info.xmlUT  n_ n_ n_ w@TГw@TГw@TГn0 #XV2$"=Z)JYTFJim8>ɖ=z3֏byp*|)i* *o+{ۇ UQ8Tބx^n*{]9x7:cTLۍ֣5 "k:}zSPJ m0> XxK5U >9XhՆ11EIP ݡd\6+1{K-R͖PK̳X {PKk5:Q5assets/config_online_only.xmlUT  n_ n_ n_ w@TГw@TГw@TГqKL/-J,+RE]]ԢbKfZZjQj^rj^Nf^DBpjIIf^z.<̼tW_2Q : ,VH,NLIg.PKDGqPKk5:Q5assets/config_temp_forbid.xmlUT  n_ n_ n_ w@TГw@TГw@TГs@ǟۿ"Hbd̜xQ*Y8/7' rΤ_CUAagv0&L"N>rtE5P$Z:( O۴{tYM.P'),d˚|R_4z0&NyK!5=c9 uh1L`ă{삭taM݄^^x.+ׂs4syiYd^)j\@z;n;uPBP4G*0o9#GL9^QqU10. ͉vy~a[dHH{ QɄǃ Yd<ߜ .Aꪴ-JGVVjl+}[u]xyXXYIy!:XL{feǼ6u57͉^^,#5bzN+ǪD̳J8;?5PoYB]|,YVSҽ.m]_ZmwdLfYյ;p!o lSF>iĒm{ ~Nݮ9QӇGaq8dw95 /PKkp PK n5:Q25assets/cootek.smartinput.android.language.english/UT n_n_n_ WГWГWГPK n5:QlN,&LcLcA5assets/cootek.smartinput.android.language.english/english.rom.pngUT n_n_n_ WГWГWГw_en.rom s=5.004 d=20150412 ,c`p0p0 1!KLK@@MKNc: c: \,SH,WI,[J,_Kno N?|   !"#$%&'()*+,-./0123456789:;<=>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????  !"#$%&'()*+,-./0123456789:;<=============================================================================================================================================================================================  OW?a ! | f"o-Kllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll [gPW\.z?G{KSM%NxNNNNNNNNNNNNNND#&'+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@0@P@`@P@  @0@@@P`@ @ 4@ @0@@ @P`` pp   @  @ @      @ @ $0$@ P$@pp$0<@ 4!@<"@0&@@(@@)L3@T7p`8xJN Y p@ @x0p @4@0@0@0@`@ @`@ 0@ 0@ @ @ @@@     $ <@00@00 08@@@@@@ @@(PP PPP$P,P8@``@`` @`(`8@pp@pp @p(p0@p8pL@@ @(0@ @  @  @( 0 D P @X @  @  @( 0 <    $ , @8 `   $ , 4 P @  @ $ , @8 @ L @@$,@@H@ 8DL@ @(4@L $@@T @  ( < X0 0@0(04@0T0@@@(@@@t@PP$P4PH@P`Pl```$`<@pp@(@Td0`@ 0DP(<@0@@ @( 0t ( @@ !@H!" 8" p#0(#0P#0l$@4$P$%P,%@P8%`L&`& `'@p,'ph'p|'@ 0(D( ,)`*(+L, -@- D.@. /80|2 D204303@ @04P<7@p<8@?  @@ A DPE`G@N Q@ Vdd\nu@ `}X | @ p @ Hp 0ŀ( @1p`@H "5E1с?hA_p!Z21e6 94`? BXꄩ^L p_͒!  00 00@@@ @@@(@PP@P`` ``@pp pp p0@@  @    @  ,   $ ,   ( @  $ @@ @4 @(  @,4@ $ ,0@08@@@8@T@P@P4@``$pp@8@P8@P @D"@0$#@0H&@`,'pT(8)4.@/`1@l5tB 0PLhO VT` q G    @00@00$@@@@@@$@PP PP`` ```(`0@pp@pp @p(p0@ (@   $ ,   @  @( 0 @8   $ 0 L   @( 0 @8   @ 0 @8 $,8 (4<,8@@(0@<@P @  @0 @004@@,@4@H@XP P<PT@``@pp(pT@44H@h@D @L\H@X@4@|8h!x" T"0 #0h$P %@P&@pH'@p\'@ph' )T* @+ ,, D./802P:A PDE PEJM O xW`[ b@0i o w } $"0 @8@45-AU0]:h @  @ 00 00@@ @@@PP@PP @``@`` @`,@pp@pp @p,@@ @  @ @(   $   (  @   0@4 @,@P8@,@ @   8 `@@,@@@@PP$P,P8@``@p<X,@8$`8!  "0T$@@$P(%PD&`D&`'p0'4*h+4-@H4P7x>@|A0LE@ L@ Ppb@ l|53]    00 000$@@@@@@ @@(@PP@PP @P(@`` ```$pp ppp$p, $, @  @  @( 4   @  @( 0 < @H   @( 0 @8 @  @  @( 0 @<   $ , 4 @ @ $,4<@H@ @(0@<DP(0@DT $,<D\     @ ( 4 D \@00 0,0<0H@@@$@0@@8@\PPP$@Pd@``$`8`D`Lp$p0p<pl@@4<Tx,4@@Hl@$8P@\x,@(@8\@| 8` @l@  x $ 0 D ` @!$!P!"@ 4" H"@ #0T#0x#@0$@@L%@P0%@Pl% `(&`'pX'@ph' p' d()@@)8*T*@* H+(,8, --X/01 d2 04@X4@ P85P|5 P9 @;@|=l>H? @B C @F`I K@xK M@QP Y \@ ^@d`Dg (i mp@ P @ h @$ %I$aAR6B@ `#N#,~B:(L04C@,Ec|Lʐ"   @00 00 @@@ @@PP PP @`` ```$@pp@pp @pL@@ 0   (   @  @(   $   @ 8  @( 0 @  @8  @@<  $0 P0`,`H@p8pd@0tH!@%P&@p\-,3F S@ h)d@  @  @00@0@@@@@@,PP PPP0@``@`` pp ppp$p4@@ @0 @  , @8 @  $ ,   @  D   @( @8 D  $  $,4@ H$@8H@ @(@ @ @0004@@@(@8@`@`0p@HT@$,D(LT0 @ <!@`#@@D$@P(&T*@.@16H>E@Q@X \ `@ 0(g @ H,@  @00 00@@ @PP PP(@``@`@pp pp @   $ @  @      0 @    L$ $ @8  00<@PP(@`@`,p,@8P P@D  #0$#0%`$'`)2 3P7; pBRPXV\el AU<ÃX !    $ , 400 000$0,0D@@@@@@ @@(@0@@@PP PPP$P,P4`` ```$`,`4`@@`Hpp ppp$p0pD@@ @(0@<H   $ , 4 D   $ , 4 < D   @  @( 0 @ @H @  @  @( 0 @8 D P @`   $ , 4 D T $,8@L`x@@(4<L$0@8T@0@@@P@Xl@   @ (@ 8 @@ \0@00 @0(000l@@@@(@0@@<@@L@@tPP$P0PHPXPl``(`Tpp@p(p4p<pD@pX@pt4<@LT@ (P\@p4< H\(@8@$\x@ (0<Tl$ 0 !,!8!@H!! ("@ H" l" " 0$#0,#@0H#0$@0$@@`%P8%Px%@`,&`x'px' (@)@,)@\) @*@L* +D,H,t-@@-P-- @/@x0`0|0@ L2 D2 `2@ 303 @X4 P`5`47pd8@ @9<p<=@L?@ @@LB C`FpXG TKLXN R 0U@Yle@ `hp wy {x (@"  @ "  ۀ- A20$FA,6p @@%lQW@&p0,g`2\Cw7Ĩi\F 00 0@@@@P``pp    @ \L< p#   @00@0@@@PP @P`` ` @pp pp @  @     (  @ @0 @4@@H`@p$ (@ @D! 0#@@8)@L,,0@`D0    00 00@@@ @@PP PPP(`` ```$`0@pp ppp$p,pL@@ @(@   ( 0 < @   $ 4    @0 D   , @@    @( D  $8,D@@ @8@0L  $ ,@ l0@0$0T@@@$@h PP$P8```@@`Xp@p@@@,<,@tDd,D@  \\$, P @0!X! "@ (" X#@,$PP&`D&`T)@ *<+@h,0.(0,1@ 42@ T4@5@`@6@p7:h; ?@pB @F@ `I lPS @dV pp[\@ h^`@d pg@l@ m no 000   `@ h@ @!P8# .9A#0\mC0HB6@,Š4<a@  @00 00@@@@@@$@PP@PP$@`` ```$`,pp ppp$p,@@ @(8 @  @ (      $ 4 @ @, @8  @ ( @ $<\$0@ @,@@8  D00 000H@@0@@TPP8@PH@Ph`4pp\@ @L@X Th@  <"0H$@P%`|'pd'@$+,H0@p12@L4 <:<@HA tD@ PI X \ ]@i@ {, 'PAk!@  @ 00 00@@ @@ @PP PP@P(@``@`` @`(@pp@pp @p, $,   $ 0 @ @ $ 8   @  , D   @( 8 @   $ 0   0@@ $4<P @(8@$8DP   $ 0 < L@00(040H@ @@@4@<PP(P8@`` @`4`Pp@ppH@pd@h` T@@(@H X X(0@$ D T `" \#04#0`$@0$P\%`,&p@(`(0)) 8*T+.P./80x6 p|9l9@: D;@@<@PBPF xIO xW]@b @e`ot}Tp  @ 8  p @0  @T  A6P) !_!  00 00$@@@@@PP PP@P4@``@``$`,pp ppp$p0@ @(< @  @  @( 0 @   $ , 4   $ 0  @  @, D  @  @0 @<  @(0@@L@ @(0@8\@4@ @(0@<D`  ( 0@ <@ H h0 0000@@@(@4@PP @PP@```$`8p,@p8@p`@Pp@`@ @`,T4p4@PpHl,l ,!@p! L#0p#@ @L%@ `d'p@'p' T) *+D,x, 4@ P<99@ C@ @L O XQ U `lW@ L\a @gpl0p{p| }#$P ` 4 p lp @H'%`W ,]C> rDĠI` ӄ0T @ -@  @  @00 0@@ @@ @PP PP@``@`` pp pp @p( $  @     @,   @8  @ ,   4 L $, @@0@@  @@P ( 0@ @00$0D0\@@@@@(@@8PPL``HpT,H(@,h0 @T"@ \" #D* -d/4; I TU0\@ \ '@ ߀+hH`8 @ @0@@ PP P`pp @p    @@ ($0DT(-`?@@  @  (@00@0@@ @@@$PP PPP(`` ```$`0@pp@pp$p<@@ @(8   $ , H   $ ,   $ , 8 H   , @   @, 8 T@@(T$8P@x @0@8H   4000$@0@@0H@@@L@PP P,PDP```Pp4pDph$4@T@$@8 X(`@<DL@4P$0Dl x  !D"0H#@8$@h$P4%`('pH'H(@( 0*@ ,<-. / 304 @5PT5 `l6 p<7:<;@P>@ L@xC0C@G I@I\JLLxMP R PR0T@ `XW@ |[^@\a0d @ e Peq r@v 0!0 P @ P  p l T \@  P  PpcAA<4B7DA,oCh _, l!    $ , 4@00@00$@@@@@@ @@(@4@PP@PP @P(@``@`` @`(`0@pp pp @p(p0 $   @, 4   @ @( < @ $ 0 @   $ <    @( 4 $0@@,4 @(<T < @ 8 @00(000D0T@@ @@4@P P4``0@pp@@0@\@d(8@4h, d!D" #@04#@PP&`D&`l'(@ ,)@d),+@\,X,-@</0<1@ d30T4`8`9 |;=@B B @XDpGdN@ Z@ _@ e@ph@k (m  @ @P ,<<"X&LHCP0P @  @ @00@0@@ @@@PP@PP @`` ``pp pp @ ,  @ $ @  @  @, @<  @   <  8@0$8 @@(4@$0L@\@ @00$0,0D@(@D@T@PP,PT`` @`,``pD8@t@,,D@<@L,8!@ 0#@0`%`$&@pd(T(* H3@6@pH7p8@E@ pJ@|V@ t]@ta c Pf@z'p P x @ 0 @3@'S! 00 0@@ @PP PP$@``@``$`,@pp@pp$ @, @   $ , @8  @(  $ 0   8  T 04D$,@@8  <0,@0L@@$@`pDX(@@`P@0@l@t! @#P'p('@`, .\2@@5 P7@p9 > dDpxHLU d `k@4mXq@@|w@|~t@ KApA7 \dUB= B<@$d@?    @00@0@@@PP @``@` @pp@p  @ $    ,    P(44 D@p\PD$$|`@<  !@#@@<$@@L%pD(1@ `303@ pD9 >AD @<I0b0`x@ ` +@$@  00 @@@@@PP PP`` `p p     @ $  `@L@0@T&T6@p4? P@7D 0@P@`p  $ @0,@P@P&`TB 00 @P`` @p  @@0,0$$H/P8B@pI@`@@@@@@@@@@@@@@  0 00@ @@ PP@P0`p @p  @$   @  @ < @8  TD@@4@TP` 8 T\#P4+D< M ^ @!Hj$  0 @0@@P @`$@p(  @$ (@4@4@ ( hP04@Lt<! <$@L9 [ a@ d$ @ 00@@@` `p p    $ @ H0(0\`<L@\$@p@< pMjl@0 8̀q' @  0 @@@@@$PPP`@`pp@pp (  (   @,  0  $ 0   @(   <@@0@@,  ,@ T@0X@$@0@@<PD`,p(@pP@phT@0tLd 4! x"0\#0%PT%P`')@H-@h.h/l5@`d6`t7p7 h9@|K NO@ 0,T@p\ @f pkw @  < J   0 00@ @@PP@PP `@`p ppp$ $,   $ 4  @  @( 0    $ ,  @  @( 0 <   $ , 8 (0@$,@<L$,@8@(0@@@L  $ 0 @ L@0(040<0`@(P(P@PX`$`4`<`Pp4pH(H0@@@P@X@<(0@DL D0h@ h!@H"@ `#0l# @`$PT%`)`* 8,p.@0@ P2 4@P<5Pt7D9@ ;; d?@ G@pHL pY  `v `P @ Pp[)p1DW 2@S# @ 0@PP8`@`,@p@( @$  ,X"@\ \ A*D16   0 @@@@@$PP@P` `pp   <  , , 8$,<0(@0@DP,p8T@T@@X@L%Pd&@ p`'d)@L)T+@,@. 2l;V TwCu,  0@@@ P @`` p @p( @  (     @@4(4L0@ `0`TP@dTL @8$Pd'/X1 PH@tn # 0P p @8 @ 0t@pI @(@rT! @  0@@@@@ @P P@P(```$p @pp($ $  ,  @(  ( 0 @ 0(8$ 0<0 0 `@00@08P @p@@0@PPd#0p%@pH'p|)H,L0p> XB`G X   0@ @@@,@@8PP@PP @` ```$`0pp@p0@ @(<  @( H @  @, <   $ 4 H  @0 L @ @ 8 P @(8 ,@(<@L(0X 4 D L080D@@8@P$P4`(p<\@4@,H@<X@!T#@0T$PP%@Px(T,@16pL9 dB 0pD@ pIL@S X h@0 A`T" @  0 @ @P@PP$` @`@`(`Lp@pp4(< @ 4 8 $ @ 8  <@0 40,@@(PD@``@@pD`(lDx!|"@0<#@`0&H- 01S pkq@ 0@%|d$ @ 00@0@@@@@ @PPP` `p@pp @@   $ @ $ ,  h  ,8( 0@0@P4P@@PHp(pL $@``TT@` D!p"@ |"0@#@@\%@P&`T'ph+l-@x-d2 @|7 ;>?pH@K@0T@ `Z _ f@prpT|d@PX0   8 |DA0@A?pd 7Ⱥ!x 0@ @P P` @p p8  @0  $   @0$@0L 0@@L`D P@Hph*@3 P7L |V Z0'++ BY1ÎC@ TD   @@@@(PP ``@p@( ( @ @, 4 $ , @ 0 @(@@@(< <@,@T@PDp8pXhL4h@XH@T ` 0l%@pX,@h-2@h4A B 0H@ \P ` >05lBY  @ 00@ @@@4P P` `` @`4p ppp$@@0 @ 4   $ 4  $   , 0 @4,h4<@<   @@0H@8P0`4`D@pL@D@HXD@T#@T'pD-@ 4@P7 l< R @U }@@@ \D#0R 828؁$ @ 0 00$@ @@P PP``@`pp@pp$(   , @ @   @ @,   @( D   @( @8 0@D,<0080D@@0@P0PL`p@<@L@Hx $" 0t$@`h'@h+5@ p:;MOd q@@ xPA@(@2( @ @00@@@ @P PP @``` `8p@pp$p, @ $  0  @ 8  $ @< 4<0@@ D0D@(P Pl`8pDpT@0d,`@H@8,D@PX" D#@0|*+l-.p1P7p7;p= > A0pD PE@ `G@ |J@ K@OR@`X@b$rL @0 "B-A/ AD/@hE8 !  Pp @@@$@`p  , $04@ @p8@"@04*h0@ @K $ @P( (  P@"t, `9 0@`   `$D@+|9\BP@NPtP Tdes!4$T '` , / @1 2L@ @5@<A ,@DL@@E`F"K/L4@OA`@SSh \{bD d`h @o r40uhwPy|p P!p!$"@>`$I8 @%@[ &t '@~ `(( (P P)p ) + ,0 -@ P.@ p/ 0p 1' 22 p3@< 3@F p5\ 7} `8h::;`<x>@0?p@ 8A@ &B 6CFES|F@nGupG@z H!H#|J+ @L@3T`M8O=XRH#RK1SO@TSSlUYeV@[sPW@^zW@a<Y@eZl@[@n[q4P]ut]x^|_aha@"b3 dUdftghpikPm0o@(qr?0tQTu@``vzpy@P{|~< @* `@I,!Ph!q!P "@@!`","P@.#2|#P9#@B H$`F $pJ) $O@ %`QM H%[s %ph &@m &o ('@u '@| (` X(p@( (Т@4 (W `)g )z )@ * X*p *  *@@ * +p ,` @,p$ ,@F (-U |-`@q -  ,. h. .0 . / /p@ 0pJ P1p 1Ȁ  20ɀ% 2 - 43̀6 3΀< 3> 4 @ 04рJ0 40ӀNM 85@TT x5X} 6 ـf 6Pn D7v 7 ~ \8`<,9@X|90: 逦$;0;0@<< /<J8=u<>0>`?`@AT@A$@ 6@@ASA@A,BP %B` A2pCp>DAEtD K1DOD4EWbE`$FfFPq TT`QAG TSRN@UpUZtU0XclVZmVP\q!(TX!P\x!_! Be!l!0w! BB"(P%B["p&o"'"(("*B",µ".»#001Bd#6B#tp:#<#>B#@ B$, E d$`H# $hKB- $ N> %H0QJ 1%̔SP O%ؕ0Xb % ` &c <&Pd G&D@eB Z&f &,i© &Pk &`mB &n 'Pp ' r ;'v f'ԝ| '~ ( L(P ]( g(̡pB (0& ( . (1 (8B5 (Ў= )8PBG $)T Z)`g )|l )ԦPq )Tx )৐ $*0 O*X` p*` *0B *𫐱 :+P N+< f+P +Hp +0 +P +d +B &, @,0B V, ,+ , ΂; ,W d-PBb -00قe -pk -B .L@‹ 2.Ը゜ .Tꂮ .0 .d r/ /@ / P /T` /ȿC %0 0 ' 0 6 0 > 18@F 1CW a1pCg 1n 1PCr 1p| 1  20$ R2Xɐ% m2' 2hʰ*ë 2+ô 2ː/ 3@2C 034 s3̀8 3: 3Ϡ> 4D AC 4CC G40FC m4H# 4$L7 4@O> 4D0QE -5PVY u5PXe 5ְ[o 5<א]y 5؀`C 6x`bÊ B6D0e ~6mC 6ۀn 680q 07t 7PހyC 7h߀~*8᠄k8@C8ppC38`<8A 9,CG!9pO\90^90m9{:`CQ:T:Xp:P:@@: '; >;0퐵Co; ;P;T`C;;C@Å>ノA>CR>|`惜>,>HP탸>C ?< *?pC_??(???a@P@@Di@01 5@qDBADL7A\xAdAoA`qzA|B<!D/Ba#DTB 'ĞBh Q*B *B .B 0Ct 2JC :DC<C?C?DDaCRD\FD~DqID&DaK.D!M8DhARO[E|V\ELZiE ]vE4aSF!iĥFqlFp#GauDjG$yG(Q}DHd  NH!aH|#?I$$D"I$L7I$TQIP%_I&kI&DtI'}J8(čOJD)aJ`*DJd+ѭDJ+qDK,KKT-aKp.ѹK/KX/ L0PLH1DhL1L 3D6L4QPM,6qM7N8D9N9Q䄖bN9ĞNl:ħN:QN<CO=mO=ADO?O@E)P@PBQ 9PxDH$Q8E1VzQ@F1eQFAEnQG'RH"Ō?R0I&RdK!0 S8L1:SM7ESN;StOA?ETuRN9uQTGU{uց\ruD!]G}uQ`G6vQdSvjvamGw0q7wvGqwl{Gw!w߱G-xᑇxG5x㡐Dy|䡒O@y4aGnylyyQAz!ǔ\z遧z<ǭzGV{|큶{tQL|`Gy|,1|4!8|χB"}Vu}8Qf}laG~\aǏC~AG~~AG~ǯ~d퇹1 Jh" \ 6 tHZ ~Dbf ́r~ 2P % 2,H ߂ 21 = 4H : #Ϗt?b $_AR$BI&$B 5$ߐD2E$'DL$7E"T$UxE^$FBr$G$THb!Ʌ$H# $@LI2)$J+ $ܒK0 $L3I$SpM6I$Nb< $ʓHO>$PB%PQJ/%”$SNG%J&hd Z&lfIk&,gs&gҡɌ&Ftib&kB&)l&s n &Ho2I&p 'WqI4's G'*u U'q vIx'xI'zI'̞l{I'|' D}R'`~'l"(J, (< +(؂ 0((D(hH(%JN(DJZ(xLbp(P2"J(>"( (b,(6(8(2>J(C)eF)t8IJ&)RK 3)ҤrUe)٥|2^|)0dʖ)bh )rnʿ)rJ)PpRw)l *Zl*cࡒ *|J4*tJQ*Zx [*pҙJj*ҤJ*ҫJ*ƪ@J*p"*oԭ2*ǫTb *İRÊ+J7+XrҊN+<8r֊[+qJj+XJ~+"ʢ+"J+ڮr+xRJ+Z"J+ J+篴J ,2 ,‚ -,ȰH 8,2E,I2l,ȱTb~,dȒ#ˎ,<13&3̌3 @353L3G 9̚3; 3Ϥ<3p>33@ÑL>>壗Oe>sp>0O>Ws>Ӫ>꣬O>O>J0s>>C?fc3?8lCOl?sݏx?$䏚?xO?#?:TcO?]?TP@&tT@a!P@% .@h$<@mK;AS\AE]ADinPA\t!BU#BB i&$vB y(dB *дB I3DGC% 4|C8C;tCEA &DETD I$QDLt3Dy]N9DPdCERMFEmU4VQZE]9ZmQE[pEA_~EAakF)h$FjQF4l4F{IndG<UrQ6GtQPG[uqG9xѶG{G QGI I4 R7H ̈́RH"Ո$'ҝHx"ՊT/HP#t?H$ATFRI$)I;I% QKIz%E_RI&&ŘjI_'dRJ+(.J(VJ)EҕJu*J,ВDK"-RWKb-4bK-AK.Q4K/QRLU0d2L19`L1Ȅ Lj2-L4ӤaM6iTvSM7QS&N8SYN :SN\:ħN:YԳN^;OeP@ =P@ ԇP a0G.a˄a&TXUa^fba4&bՈi%sb9(&Xb,b2Ec34vZc^U:똳cU<cG=>&dCfY>d Eqd2UIf0dM%Nf9d^MRVIVes)V6Ywe\ye`6]uXm]%vciwݹ{]wʼnW'޿x&5)yɖމzoʹ8_|=|&i7G!}:g\}s5j}G>~~}~4ꧯ G_ `#z}Sa b:!ք2O@ Wphq@| ,$\ ( + @2L 70@ ,DLLDPUW@\v_a,c`hn( vp0@{P d!  #L@ %_ &o '@ (T 0* *@ ,@, -@ / 0@p 2& 04G8 4TT p5d p6o 7@9x:;<@>@ xB *4EkFupH$J@,PK.$L4PFRJ-RL8S@O>TQWVZmX@a0XdTYl\sXp]@|`$` d@jgj0n@tr#sE0Pu@jw@p z@{|@ P@W!"P@$"@2#p> $p@L2 $@N; $0QK d%@Zr %_} x&h &@m 't T'v '@ (@> T)p[ x)P @* *@@ *Ы +@ <+Э t,pN T-w . . `/ ,0, 0ƀx 2 ɀ) 25 3@: 3@OM 85 Xe 5ր[ 06c 6n 87 8Pi9怛:H;0`<o=p@8?,@.A`aBAFD(EASQHEYfEptGI)AK2GXM5AdM;O 4G" 4|ҰJ+ 4T0O= 5xUCY 5@\C =6e d6ِgè 6m c7@@38(CD%9@a9Xp{9ÑU:Xpó:+;;xp;(S<6<P=@C^>|@C>B?Hu?`@t `@$! .@H1 52jH- 2̬0e3ͼ8c 3X@O4ѸH)ͩ4M NUM{5]6ٜdӕY6oeMf65TjsMR7Ptuc7߬ -81苓Ub9_9L':,sNw:*:ȎC;d;.,S;~︾;xkS[>SO>lǏ*?0SЏE?Ts?3@ J;AM_ІA+#DB 8CBA1DG4.QD%NAQ EXDjѮEq[dq*Fmg:GXH!LR=I%t_J*$K.ݤ>N8)N.:NM<$O@5!QDuPEQE aQFm zRK0UƔ/SN:SO @jTNUAXdVXb?W]9xUW_}UX`UVJXa5XceEGYeaEdVYgѢ5VaZi5֣Zma$\pA%U]~wץ^P{V`axu!Xb1ɘBcV8VdUJ:eamƾ/g -f:hFk-[[2nQF_oFpy')pÑwV܇q'E"saiE'[lu|A^ׁvةc]iwYLy q8|&|)̷J_<}M1zOY7꟮ H^Á[&7(->WX\xXgab_x2dؓq[ia92O@0\t@n@r  , * + 7 @> `@M<HPUW@\r@^z@`bnpr{p!  #44 %` &( p)@ @*@ +$ - 1) 4TT `5e 08@48H09p;@;@>@*DlPJ)K,K/$L3xM9 hQ@GRK<pU@W_W@`XbPY@k\rT_@` ha)0c;,`flg|8`k@0m <r'r1s=0v@jyd |T} 8 8 @RP!#D" @)"2#p>0$L8 $@@QK 0%p@Vd % ^{ \&l &@u h'x '` T(`( (A )U \)^ )w ) X* *@ <+p@ +Ю (,@+ -p . .  / L/` t/ / /` @00@# 0 6 0P@N l1ƀp 1  X2ɀ* 3@6 t37 3 @E& 4@T^ 5Zn 5P؀a 46ـe 6`m 7`܀s @7w 7`80p8 59@T|9:耤:@:H;0퀵;;T>`? <@L8A`]AprATBP 5C`ADdDH$DOD(ESPDE`AXgEgG0AqPGyG`A 4H 'H`#RI'{I'TJ)AJ*A4K-AKP/$L0; Mp4ZM`7(N9O <O> P`@PC<0Q`E`QG SL>4TPQFCUVZDVZjV[AnpW0^zW_XbA*Xpc]Y@g{YhZlx[p!\r5\ta,^y_ `p_aІ}0b%b0A1TcA9cCxdPAM=eRLe`agtg,hХsiPjpA\jk0 0lllA;mH@mPimnno.p`q  rPȁ!rˁ.Xsp6|sI,tQJujvm\w`9xごfy}zT{pA{P|P |9|0L}P}~A ` ,& ph $ 1 d B7 H@BE&!L=!(@Vm!0^!TBk! Br! Š?" $P"l%e"&Ÿ"`,µ"0"#3I#04Q#dp6#Pp9#;B# P@ $ BB d$`HB% $x J4 $RL H%4TS Z%|`VY k%V\ u%XBc %ԗ` Q&pg &ԚkB &,mB &Лpo 'Hq E'tB ^'xB 'pz 'L}B '@B (tpB .(ܠB o(X7 (B= (0E ")X ~)$Bm )pz *pТ D*( _*B *4@ *B *pB *0 +8@B ++ଐ H+Pൂ l+0 + !,0 1, E,l , B% ,/ ,D 4 ,tB; -\ ҂O J-u -ނ{ -,B -.ȸP N.4ѰDC c4ѠH( 4K. 4pM< 95@TCQ H58 UCV c5@XCa 5\0Zn 5`b <6c G60٠e u6ِg 6jC 6tpC F7x 7ް| 7l *8 j8᠉&898B&9䠓UU9\堕W9`z:0Р:@M:`頥k:C:`;CE>@烢>p냲>0 ?d@DO@q)P|AP@B! 'P CA 8PHDLHQ0EE\}QFgQF"EzRI'ER Kq-ż SLA6ESN;SOaATPBRTQG!TRK2T\SOEA+UTS]{UUZaVYj WX\rEjW]!wW^|WH`aVXb-XxcOWYteQ`Y,favYha-Zh1EZLjZjQZ8kE[mr[mQ[ToA[$p @\qE\Lrʅ(\r˅0\t҅KD]uE`]wE7^xE^|;_}AG_l}El_~!`t >`LAFW`Q`#,4]#t7~#t8#p<;2#;R#n4>"H#& drY&heRI&#iɢ&jɯ&ۚk &"lr &Ym"&$oI&"p"É'Cq 1's O'PDu X'Dvl'Pw ''\y '{yɢ'zI'x|BI'P}r '@J( -(נ|J9(䃢 ?(P(h܅Ji(á(J(* (0 (yb8J(@ )<D)sIJ.)bP B) SV)`2_ )prk)ܦo),H{ )է0 *P*g8Jn*ԩRJ*Q4bJ*ު"J*!R *BRJ+lr "+4 I+2Lيk+ضR +4Ը"ʚ+0R+L$b,P ,Db;,$bG,$Ē T,tj,b ˁ,0?1CHL)1L ?1@<CVLY1iW_13\q1Ŭ_̅1)de̚1Ƽk 18p1np3{1 !L2f4" 62 %SL]2@&s 2O) 2x, 200 3Ň1ƌ3|2#͌A3"4Lc3(73̃38s 3H;3>c4|@c 4fМAM/4ьD S4YhECf48G{4H#͔4uI)M40KS/Ϳ4.0M64/PD5b$SRQ5L8Vc 5<[#n 5ִ[o5?`]u5^}5ب`Â6cPbI6`ff6Pgw6hM6:hC͜6ڼj#61ls 6n 6۴osM 7D,q$7|s <72\u ]7ݠvۍp7tx 7D } 7l~M7ߌs 8,s$8,NL8t,Se88Ј#Ε8┊+8&T58vS=9'F9ؒNJ9~$SZu9嘗`9Q0CiN9樛#r9(x9稞{N9簟9NLS&: c6:輣NA:dl:ԧc:=ӦΞ:3:@sN:> #:ups;[lNJ;*퀵];`cq;H;Tܽ;X<0=x@J,=\3OOR=Xx`=>CgϤ=p=uO >=|sE>0蓤ϲ> `3?s3?tCϏE?<<֏e?ڏu?d?g?O?VO?O??4P@T &@4A@d\@zM"Ѝ@9T%@l% +@) 0@Q T5@u9@Yt=@0iTG,ADOPWAy\qA5dAmkAxA!d5B$D{B, (B I*B *䪐B M+TB +B ,Bz .B /5C 5fC I74zC 7TᐇCDM9C:4C?$C"@DUAdD!B +DCIDe=FQhDGђD[I4(QDL2DYM8DNt;D%QG)ESNN84\N}9ԚSnN9礠N:Y脡N.:tNM:SN1;-SN;Tɓ2O< TZOz=$sO>}4SO>4O?)P@@PA15oPBu e.PCB/QDeaQLF5%hQ6GxTRNH!%Օ`RI(R/K-%TSjL2ДLS;M5TS|N:SP5@U T'P@%TXPA5"TPB 2TPDUlTQ]GUTRMK-TRL0T:S%N9TSPG(UTSUOUQUOUU5YUnVYqUW^zUUW_%&VXb8VXqdNVYEhUV [lUV9\q0WE]yvUUoW]UwޕyW]wՁW^xuWr^|W\_u}W_~UX` CXaVUXnaufXaAEvXaI$VXbA55XdAK8Yd XeYe%eVYfzYguwZiݧ5ZsjѩVZjVZkZl.[lqV[n%V[ p-u+\pYÅ 7\q5es\*rU/\bs5KY]&v)ufW]vڵl]w1%^#x╍WC^Wy奞^z^s{W _|]W<_|W[_}U׷_~-_yU`hO`L%` V=%axmha=#eb9'֩رbҊe+b i-Xc )4KcV5ccӍu7Vᘅc/9昡c:옴c֎;Vc_m>c? dfuB EdDYdQI2e!QGHeǕ5Z&me ffci֧YfF%m洙fVmfnfUp.gŜusYOg^uY}g#xFٙg=|Vg q KhR%hDэv8hv@Z!iTmi\si`ڒi{ vjڳi֦yoiќvi "jqftj@jV6j$k9Ukuv|kVIlV [;lĖl, ͦ4lfPCm$Z[lm\bnUnǻoVzoUoUQfpe\_p '-\p<qG_qtq%\rʵ0tsT9\t9DRtZѹE]tIKG2]tӽOCdu5Xe]u|i[ru~a'%vb]Dv٭dWQvQe]evfG]vCڭiݫv=ۑm']w܅r̝2wut]RwUu]w! xj1 Ix/^x0ŒGOjy6l^yxynjXz ǥz%wS{yg{iﭽ M|> |tw(ߤ|/|B@}mԟU_1 mr!9v 'VQ 8,4hA`Wo)pǁ(:u ׁpxz h " MF 2'` +`݂v b2 E) 4`r 8x`DᇄJ-!τ\OYrWx`Ꮕ|ZiᨅZxkᰅj[o῅ ]tօ`a{Rba5daOLe(eBga bha_j8aJlxӆL<@n  @+|>PL4@P[o`@^kp0%n8 `)@h 2NT 08< 9;@FF K/(M7lR@VX@c[@l(`@ lPbxg m(pcvT} : h@"0#FW %@w ' X(p@: )e )@ X+@ (,p -p .` $/` / ,0@ * L10@ X2) 30C X4Nh 5ր[o 5c X6n <7p@z 7X8@3(9䀙h90耡D:@:8;p;@?4=n=p>`@]A! CAD@ETaE^F`AoG A tp샲>06?M? ?0h@!@` D.@hOAA]AADmAD1uAq~ BA#B\ 07C A7CO?aP@E 3PAE!PHB1 1PPC >PCD1QDT_QEQcQ|F|RIa$zRdJ*ūR@Kq2SN:ESO>ESO?TPB pTQH&T(SLE<TSPC(UTqTEStUU!ZiUWa?VYdE}V(ZlV[qEHWP]urW^KXa X b1-X0c!K.YdAaYgចZhkZpjѩZjQZkaE[,m[lnaG\q"\hr!(\r1΅9](tqK-]huqE^]vEo]wE~ ^|x⅊h^yŴ"_|!i_}_( A`8Qv` F5`Aa1I5aqVkaeaqFQbd'b܊+Fb !7c(a=dTaCod!JF)dXaNFG\e(XdeQZie`9fPiƨfpF(gzg`ih!ha43i(QFljƘj쪱Fj41AkkPkԯA ;l8!FVlqFzl8C3mдaYnm1dmFum@gn̹Fn컁F8ot1o"p@qđ^qnqX"NJbrX.1s!;sDWtԡPN]uձXeu֑[qu^ǃ/vgvdjv\AxwဇQxda5x$偕dyqfz鑬 {LGK{|!{QG|&|q;}\ǩ~K HM 9$V hb BHm ā8y 停 >x (H *Ȯ  -ȷ ` 22 Q| "6 x9H <BC!]G)!BPA!,U`!`[l!,a!F`bhH!Ro!9tH!o |!' "z!#"$$D"d%a"'򞈄""("[*"P,r"ZD."Ƌ/bH# 0b#29#3ψB# 44ӈX#h 6r}#+:bȱ#ʎ;H#x<#>#ӏX?I $ϐEi$J,$,P2BI%|QH%%dTQII%^UY l%ו|W^%Xeɟ%ZBqI%28]x%x_I*&(dBJ )MRI1)ʤؓOB) XUV)ʥdbʭ)Ӧlm )\2r),2zJ)ܢJ6*ꨄ \*l2ʊ*0Ҭʵ*Ы*_̭ *J*䯒 += +i ʊ-+¬8RJ6+RъM+Bla+L +J+v0J+Z$" ,ib 8, LH,$BKN,r ,L'˝,r.˼,/6 ,ȳdЂD-TѲP F-R[-vZr-b˨-pRv -PK.\₉'.4TbKx.?钨 . .1K.XNj)/ɼ\BKe/勖/qrK/J,/p0W`0( 40#Ln0 + 0H 50ôSA 1ELLS1TŐVL]1vXLe1ŔZn1aL1WⳐE>泝O>,#>+$?4SX?ۏr?#?+?ϲ?@?HLO??? @XP%@5 9@S@fd@)d|@Y$@q )P@ $1@. D5@w=9P@)EAaTGAOPHA*uWdAdZpA daЅA!dAjAdtAq{PAe  Bu#:B#TEBI %$pB (TB *$PB !+кB A,ԱB3 -DBm .B /C' 04Cs u3:C 3ѐMCP Q6tfC M74C%8PCDm9PCz!:ЧC:мC=<CHq=C@DwB$ 5D5DLDZFuDEH&D)K0QDdN:DNDEPQG ER$KQ/ESPHE9U$UVE[UYtEAYthQE1[mѺEY\tqEd]wE1^zEi_~E`QFNa4Q1Fmcd:Fc@F=eTYFuifDmFhѐFIk$FlF@ymtFMpdG"!q0GsFG  wޑ|G-xG#yQG5{QGq|tGw!~4G iRH{ 0H لtcH!d"RHi" D,H"6H#ِH!I$qRRHI$%UYRfI%M]xI &YbRIG&lRI&rRI'ٞR#J(q=J )MTTJt)$RjJ]*ԫJ*eTJ+=$RJ+J+UdK&,Kp,R#K,Ѳ̒AK-qDRSKZ-ѵRbK-=ޒxK-DRK .5$K!.K.eK/RKy/ K60qS!L0}t +L0DTLb1)ƄL<2%&ӛL2A)LO3ED9M4DM4EQLM15ԔViM5m$`ӏMP6hSM7ߤ}M8!>N8%SJN[9ęmN9i$N:YSN:ꄬN;ķN;e4N;﴾SN;q41OO>uOM?I$O?%O?TTPX@IPoAETP)B /P Cy%:P:D5D-QDYlQEYbԋQ0FyepTQGesQ=GuQGmzTQH1  RH#WRaI%՗mRI}'URJ*RKm,RL12SPM5TfS N8㔕S]N :uԧSN;uSO? T-P@TyPAU(TPC 3TPCDT4Q]EYT|QGTRJU/TSML1UTTP%CUTSeOUEU;UUUW]UUAYeUiVYiUUVa[qUvW^u{V(X`U.VX}d5JV,Yqe^VY}guUVFZiiEհV2[lEVJ[amV[uUzW^uxUW]^y5UWf_~!X`Q 9X`eVHXxa-u~Xb1VXc 5AYdAXVYghZiy~ZjZjZkiUZkZk%VZl5˖4[l5c[mֆ[+nE%֪[3o!5[o]u\Qpu WA\ q1ŅWo\q)ɵ(ת\rE0\us58\t5F&]tXk]u]^]1v %iW]wt]0xEᕉW)^x2^x=eV^y=W^xz}^T{UW^|v_}מ_~_lW`sIF :`S`We`uF&`LHX&aՄ[Xa6"b5*Xb-b-0X!ci4fXRcV96XcF!9瘝c:c֎y;c#=cQB 0dEV لdIF*dSvQYMeE%UTYde9W]|e=]z`fji6fnf5pFgbqFY,g蜡tvיhgawYgy虣gzfٶg|FYgy~Vg h& 9hFZ]hy݆h7щ+hE}F=h MD$i)SZWi[qiϥa^{i!aڞiuoi sZid靶wZi}i5j8FZ0jͤ&RjJ6ZhjEjfڏjEj k]˚;k9aZ|kkɸꚰkɮfkQ[l|A=l!6ElaƆ²!ˆ.[l,}68[lEm!&Rkm!6^[m*iۥmƶ)qmwݶzmѷƃnϸfۆn9ꆯn%ƳnI&o]Boa[o/V[o}f Ap\5p\!<pL\6q aqsj\qHǁgz\ r,1%w܍r:(r>-׹ sPa1"sQ275sE5qs~u;sϩ@ Gt9J(tӵLW4]tӍO>tP'EGu5Xhݣuֱ[nu%a(vb:vYdWQvTueevمg]vVڱi]vjǭ]vjmvn'wT%sW]TwYݽuGjw-wݍwH޹zwEߝ}wxm݁#xEGQxE^[x'(ޣxW@yK7K;yՔW^dy字lyIgv^y}yu^Dz鹦ބz\ꉩ{xȞ&{F{Nѵ'^q{(A^{5^{)'{ |Ǘ%| ̗T}Q_Ta!ݟ{Yퟷm<)7|m/W~.v8"`V 83ӀR X;BHE"^UafǁNz 8} `tj#؎ J+`݂ z/ 0 n3 < 4ՠr ^:(؃?8 ? A!oB8 5DXa[FaxBKX.aM7(*WX]fZja\xrЅ`hcHK>"eahg!l>jHÆ\t B[ 'FpQ@VX@kPbHo@@@"= |'0, H) f *  ,@ /` 0@@Y <70u 8:$9P怜z:@4<`>$=@\=p@P?AJDE@]F AK/tN<`QPF(XgAZpn4]tRT]vr_pA#`AkcALS|etw\llohr>wxyP|{~% $ @ B8 D!Tg!""#p4`#8#ԕYf %dbB &؛tB l' xB '`} (? )8 5*Ъ`B *+د ,B7 -8B_ -p _. ¨ .x 7/༰ /\B I0(# 0p 3 0ĐP Y1@Ú 2Pʀ, 3d̠4 i3@9 3πSCQ q5XPZk 5؀`Ì Q6i 6`o o7,P}8P8 C=49`_90Æ:p;ƒ><0U]=Cb=4É>S?p :@DYsADC;C1OAEV`EDbDFqnFHQueGq} H 4I$eI'qďFJ0)ѤJ+1D K,ADL,41ӄSnM\6ĞNp +J*!RRHJ!xkH!yR ".T!‡H!"#rHB"g&R" ("/H.#4H#?(:Ȥ#T:b#>#x@I&$E$pJ*$bQ"H D%fV"_Ʌ%xXj %(\pI%\cɥ&ʛpI)'ǜPx"ɜ'C}B'g 4(؄J`(ԡ$ʜ(͢0J(Ačr;J )NNJ@)SJU)Zb)| -*`r [*rJw*ȧҟ*Ⰺ*J*+رʊ:+Utr؊+ƮRKL,bˁ,*@'˼,{RCK-V^-@"b-5Lۢx.DtbKi.ܹ .c .뻸 X/Hˣ/ʾ8 0t# 20t `0! 37L1z#Z 1 ƈbL18pL1p#L*2ɐ(#̫2`+C20, 37̔1C,3̠3L?34̞3(=L 4}PB >4JьFM4J+4hPE 5PSOM@5`VY h5dXnM5,\ss 5S<^}M5`CN6ِgSM{6:|iñ 6iۼnM6یp#47tb7ݜvߍ7MxycM7L{S8 ༁cNd8,'8⤊6N8=9L䘑cHN49蓓PH9唗`N9hCn9# u9d":萢SQ:S逦:īN;a촵CN; S#6?X?ώ?\#? @-P@z! 4@ E_@mPq@U &@ d1P@$ 2@=9@AAApG)ADL9AyU\AAbA9TmApAHwAdB D7B$`B !(4КB +PB u,ԳBe -B 1.B m/ԿPC 0P CI y1C~ 3CC 4TC u8T␎C:PCqDDiDH*DPtD-ETRMEW_ѕE\Y$rE^{E_Q7FcQYFhFci$F(mG"p.G9s\GwGT}yџG|dGHH RhH!'H#EFJI%^I&$wI'Ji(ݣ4JJR)AħҥJ*)J+RJ+ǒK},Ͳ2KP-ŵRxK-K4.yTRK/KJ/Lo0TS%L0„ S/L1Q4RL2#Lo21(ӪL2d/L25Lk3QUTPB U7TQD5wTQYH/T;SPC!UTSPUiU VYhUV}ZkUW^eYVY)fVZ=lVd[enVWo]vޕW_}KXa݆E$Xc 5H!YdѓeYfYg=UxZkZk%V=[Dm5ږ[oͼU[\o}[oٿ0\pWm\qE \re2W]RtI-]t95NW_]uֵe]vUn ^xaUW^G{Q֗Z_|}㗭_yUS`% X`V'b8}'bۋ/VX(cI=5ucU8cv:Vشc<cn@XduHFB+eEWV_e6\xYeXAl&f pg`yYgizꙭg䞩{6g~ h6"hQZht6ahh1!ז]xm㵝צbۋm4em6tm]&[n֌=nnp.o¼5&oֿ)\pJ9\\qpWkqǍGKr:)ܮr-ws12?su8s)BtQY]u}[Wz2vJEeGivhݓvyjvo'ŝAwdݑyw]wCߝ}xz! ^)xa9xDxY+^x @ y7Ly浛Gpza9z魩{t{E{, |7<|q_=t e> C0A|1DtAa( DDaPMqE0QbFuDH#AD=I,anM8OH@"QHDpQG EDR(I%ŠRJ.tT$RIeUVZoUDW^EVtZajW\]!~E3X`!ERYkaE_[xrEUf]up]y腥^pzA^{N_~`"ƑcAA{dXfFfogLqkQF4m pXq#s3t ԱRXouPq^GDvfvkSw<ћ|\! p|x @ -H B8,!`"7-b'#4؈#x:2H#4(Db. $Y@TVw%S[bI&`mһ H'_0x'֠tb (4(ȓbQ)( <*שt* ^,Ǣ4,Xy-$؂y!.λp2/. $0 >0Cc0c$L0TM d1 ƼeL1pC̊2ʄ+C̾2p,ó 2B̈23L{3|; 34шJ+5,UCY͘5)_~M6dӞͷ67qcM;7zͲ7|Nt8+s28u 98䬑sl9蘢B:5CR:<뤹,iz뙮gI|6gY~F)hńZ^h{chh8PEi̥FeڰijqjvYkk诽6[mֆbmOA6E![F$рDH`"QqJ0}RXPCE_UWbEV]X|YlQL^<سi><@@Ds@ D2@1BtA_yToA!}#T`B &PSCf 8tC;=C+JLaEV4pEcQFCEkTGxx呶Gd ՁkH! 4&Hw$%MRI'RJ?,űUK!.ɹ!L0!SLz2t*ӭL2D1L3dGSQMk5DsM7SON<5TGPAqZQ*Gu R[I&S:PB 9TCQG3UTTnUUaՇLYAfyE<[m%V[pU\vEnW_ʁA#cI}5Xf>rZhQyi:!օ?jkVZOkVfm޷n.p)ǭr4DŽv1v7w|W^x!oޚz|&-~Wn h7`쀻>Z 2`F]6Rpy(, D)@Z`w b@gz(lB 1Lϐ}V8 C ?qXD3FuDH!:TRRMeHPmU`V[ŹVa݇eHָZo8W]vEەn]KwIէZ_;~MQi| qUAGhv݂x3H&O(DD)M8Tf0t 4(xBL z.xzH,, SuadtH?h2GowHSHr"xt)9Ĥ"`-*-R:Dꔬ3 O<؃ϯ? yjEdYO@G<UY݇V]uzVH` vJ[SO QGEW%dȐQCq$sDt&$ AWN9YlQO=LE2T[0`㫑v~yJanNS &XDaF#E"1-ELCʅhm"a }ilJOd lpE-?)r @sl1$xMG!S0"D Gp9BΠ3$ Z 8^ 3& 8vΠ@$hA$@%`(A/gLdpA;g4H%hA 3& 0n 3' D6@ XT=3Xc-0[3 <&@ @Z+nkoLW(: @mPH n=' `@ql@ ``)J6C` l37&L@}"J-kPX(k0H [(LkMP8dpf-F@{h&5n-2@3PLm/N KmO ٫G&7``p'Pp8oй' hp @t%CA@ p]80=Q)6PxfB-}DB@ Bp$Dhk(@3` @ Ku p |AB7fa EJL`P LעAB @iHkoG k2Pwp-0,`&8(3F°utW$ @ `g!xE"G@0Cܓ_p@00r @\p-r @p V0--@`3 = 37@$|j@[l1!>Q FѠ h@Q텄J$Z7Gb0$8U$lNC  lj^()h8H">1POؚn f{=Z{+PlbB P0> D  @Jn$jZu8`{57 i  @/A  7d~}$+3Sh[,`3l[3 9 7F@ !4 e@q M!Ga Pt[R@H! Bt3U$hflzP @ L`:LBH%dĀ0  xB@ 0X8l @IHB!Hl#PO,lz:@`Lh%f0`{93\b   9!Yq@] -`<=t:@ `߁儺?U(z7G j:@ @(xk=vM8>%7@GPP'ZP P->&`pЭ?C 3@4cE !D Z)ہM xM:f'@y)tf*F  xfB bKRs؇#PO009E;pk8 !q@`xB< P = ! @7: 1@ H(  OCd2؈ (Q(:3e yHQOob  #nj )qP!l@0h/$$$@%hB7A@{!!dp>C2?P%^(D)Ѓ> x(P` ! | up`,`$!:JhrpB-B   JB9V13p9@ +9r03Q;[PPh64/ 8@@NPpM (d!qhM ,`%)mFV%  d-60P @ >ok&3fah|@9aQe4L2F nm_ p^IͻGP+p2b ABA>8 Ճ!0v@pe20 @0R#6f9 0;^_F>0!8rOڔmpfWIC节pb  FCtTI;82 hB- 0Y;^Bt$7p.0tiۂ4.ly!G@vM(Od3N@SXk:H0Y ?  &x|5@pk)@Vaz0h  RV`F ^(h%|'b߁$g ۆDЭAB@xfB `! v(>q8l:E "~RBǒ pJIE 8V !rBȒtfrlBP8r*3}7dH$ 7lPl9z!}32/0Bm6.[@\ XԞĈZpkMÖP4l cXF sXvmdS8 r 2Ch:@`{t4l21TJBL>(?a₤Ko ]} z  հx097# hk6 8 ey@clf' w('`ZcDFe4&)@#@(`R0,`:3t:J : K-"$!`b  p~*Pf1pqϺ0Xf'6HV! k51@ =={ @S` &}`2Ƈ%8 ?qkޠIdMt#0$(CO~Pj".,`>:@%thhA\U&`#Jt@iAd(hr\CN/NMf[ӰO( m=1+pб%< '@(h A `h+!|B-@w3SO\fCU( ؇ N";H;h1fkl |55{i w ο/0B63S(R;bD@?34 M#'FCVk0O4:E(7Ƞ:r``pBP}R nC3@ * I<(022h ]6 7@MM@mg ߟ X' p`lf[h ?mk-:y DW"k `'$2f,O3@B>J w3~dp:@dӠھlb1  3y!*HJCK4 @~Vk ƀ% $BDWkޠ˜i4M"$`K(}l"< 0j`6H[yTuZfa|xt``H(-0O {$G + :Z>q҂Z @d,` 9F@Ny8&`g؞AOE4C||O:@$qC O` q߄ 13@B@f9F^Odi Fԙ ф2pBlX!:Ԣ|*gX:}1!1p#tp CyLN( 'A3F}&Ak=1T4hC3))@jh=U} [H?#BN򙆶6:Od= D !`+pfk6` X[h tB$fJ1` ]kT(: pȭ4  O4{5 (d:9@,kS?Z  }kE !liG@ :)qF&pR`n+5t2fXVkC>FZ21` H}rx E <fc쩅w j`[h kVrmb+bg  ngjO&b~tLBX)ږk%9{mX0_6ӧfh}<6o`1@f^k6rA(Pp(;(L-V`Xi67h/\m@7l%2gOvRHKůnpZ@ F{,a X@z2L&X<~u-RIyrOێsx- KM&2`D~)3  kf"fO r0{ ?=@ S$! L`\:^K UIXN~KApk $dp!3R,6 4B~M"V p`kfhJ`Dt|5;uT3  A&P,Nnʵ9@ +H h"0 +q95 ` ޠ\l2%@ @u=᚟vDN@SHBl'#-HL @k,:BFJJh"8{a` j!A ^P *  xz>h&rc86`G!fM!= O\@"tě9"` 8@ rUZs ܄&@ @PX@H8Z^mh UNiFyl!B50Jך~M p!@=@a XH0@k\&B|3@gP ĢWmôV.ȋa+9‘ X`/؍&L?7܆dk& M\ꞇGQ/wm!A +lߛ P~󝃾2L@ԯתAM0Q`@a{}b3 (a Jsok,я"y-/@A5Fphb @ >^ `/(TP)(V{ȒQDn/1) \x{,`]h{~s"f 07`}@a3>B%LoVX.Ѧ!hp܃d8 Fw/@kfDku%@L J@k6oh})dWHmLE ذA3K&~A GS` :&OEO[O\Bqch o_ZVϱD7} @lq%h m' p&6e벵6'  Xr:j݇ek4%R1THФeBlW@% \Agb  @A .UYhM W& 0nh \CQZh w p;":@z` B," BK_\a{Y2Fy{|j[ p RܼA Ξ &)&N0?XBMP"_{6´WL{n `x @Rӽs_`8Q=h AD`ls$6͵&L@P`/   Al5(X `4Ơ'' 0@KqAlMȍpŦ] F<K@/p AL@ $ Fg\ƠiPP ; @AKCM4)Q WPpI$a0x)5@ U4D!G'P D+|LM ">P?"AU 6 [+`8_2X[J2?8 0`2 ` l[m(`֠61 6 @mO:@@S0 ^40f@omG x 4Ao2XYaB KM JC@%5x 4נ~ @H%4"(%@:@+o /O dAKC[dR@ EpK(X}pЍO @J0< H0؄V#:mMh AD)KԉyT,?:c:+6o]` N6o#D` ض5oP` f#U\n{a?=|  先/p<0}bGqw^(!t&9:F@,05E(ڛA&HA[Ut8:@"A~_P(sC,\ϣ)-tmH b;v5@GXrslC} kmJ Ux 5=O`&4a 8qN^ vx 0Yɣ@ .-$mq 0 %j7V ٶz.,?5P~`A !>Dm6dB_PОb !2K!>.mVlr[5CA"؆AYL~p(ʛeDb(Xv(-P-#4 z!4?x w4Xt%ZD+ٶG׎%68:@lޠG Cl)4qD{N=MZ{ <`*Zm}PjVx]7!Hg@}4%UL&ʡAG`ۚ(  YJf Dt exd=F!h `BDM!0&% @lN |+6 bwf#ԏY4v,&%F R`%5q}Am>1#8`c "@&TbLB2}T(J3 Pb߁CfCtD|[0"mHζ*q`qi7`"l9Y&Ky@ 0qjz: `$9D7HJT 0 :C` lbE0m4:0`A)=/zF06Kpt A_ "iYGtFWM @_"_P`"C` @ ,[{`Zn6&lCQ dӑh O_ D"(P4[mM CZ&V=9~G[MQt8 Xbx[](  @dJmz_gx(P{)p %-%"6_w @0> ʠG=)dL A,rP(h|@oL6{J({}"# 500( Ey6: @lBPMA .!KD>Q?-N@**\BҌARn Mh.5 c#pP (;zC8}BssSȥZ,j@_p!|BgPх.;k@(`ɰ wБ㽧 m :.]Kf{.[&>\ |B R{ho  / BbC%;ޓ`ľ)>AK RwAB{b@ %*HoO(` w n{Ttp*}h\^Pjt[`* ԁc?ƑO7~dNU}P#Ad07D T0XPn\(WbRs;XDܖ,&:+ED b,$Bm(dIm=Ppz>+Dq)H0:0tQf!xM񽡃L+-/V@d  !|;Wh{(ԡ|К-\Klp @(@0&h"85j;P!T!RB>,L 3DA>8 4C!p2B(*,Vl@o6XR6f[ @rB`SZo%6@嗑 c$vq:0 ? X207 Iit`A3 ``ąE8.t <3 !;(.ćij^|Pk"#@`'&:qKlzt HA>7T 4=FP> I(h:U( FC>_Gf4C*GM_㾉l` @]r`T(0 CWl>5 & .Qpk@ i$aM&(`~Oh﹗+j1B.F4^<3 !;@壆 I m=qbP ۷oF0 wP4it6}k6࣑̌42_O 0 EEJOk4o3`P]3HMn* {d`x7@ݓ&3>ewTP, U@6T,xTsCelCSbRQ`OD(n:}4"P"V ҊUlb pNb7(MA/ K6T . D*7@@)R0>P5-|FUȲF\` R!0ȉ A4)8@ `@`3Z(T kKp/`@e-Yl7 `)!zkbу%@F0X€!ƀ% &Bkޠ%lXoB4R*14L4& Qot :|K+IyPlF^p`/-XpR;st?b` \Z}`9n?( }ق1` +ښiȓ0 `S7 =dFښx H% 7[hPkNn~7 >pQ<>ϡ{mD%K@fd %|K:T, mc61DDQ_p꒞[L0 `pA8 H6ĀPVm0Э&ڂ4)zPdЂ _P$!mgM, Xo{"T0ݻ%.ʐ%1X``BQK P X[ ~- Ot[ p8t)&ab5  6]zh1@ `Ɩ !O F[=* G * 63׍ŭd39,P7qpChxp;Dc6"h=(0;XfR@6$D 3ZZ4/fwK\mp h/ ` ޒf_@$@(z I.,}@5`@0XY(0t<3 EED1 H: `D#l6&C*5=ғEpM#B>Z  F 'jB4Qzתl%@誃'd(0JI_ROsKT*&@gk3zx6Q ¡@őV|(^kA@  C2}kPU>h x ZLB># m6^mA!_6:) a n0[&Էhc谙R r-{04f4@& ^ӳ3 0`h' H 9h @(`X!HDcQ0NI X#dO`< 0XЁ `BA>M6ҭ unف9J3>}"@˦pQn5ըB zn- J"U(f  &T X"$^,Qa[:~  ]4^1M`(o!o~4tc[tOƒXvp|wHߍXzR@!!bvbi(`m8%gZpV@ V(h/ԄTE@0N$38FMQCry#?3]*cvCm-7zKPod7 aI"3 R{ћBWyRm?L[ LD-qH%ne+^0$D$LɃ&Sb<{tobB<@pB(@EO 4&Z:$HgCD% W2B;(A_RlcLj,?)N[$Ct6nVDo{61@`4rm'FJM 3K4PdD3o !*0:3OB!=:bv#xzi -B?%I ɧ \IC[SHJI6Ep, D9 Pb%`m򈪱Er dؖmb: /X`DﶛPa H~ I dLrҪg(`? D @ AB?P@B`X>Ie1`'`;WBsp-"{!%(4||JacB!,%(aZ ^l|q#G%J𯁐00:e8XX G9Ƞ:  P{!!T0^!OH!p0MK``F* '4 BSHdpZ%ifCRU\X!$h}fLH ! Lc.0FXpsRGt$`B0L{ٖkޠNjP>B Jri6t^k7%;0 ː.@YR{ :SWibV[ pR(Q*D-?Љ*A1;طGE+Q͞o%j8XYvX X൶Z4{h3 JW,@) W,`Ћ]lfJ<ܫO4Pd 4QoC~hDU"_O bO48"}^vIޑojcx%Z[ʃf_}/0`pDOM{0 hu8< 1m`kI6K=44evG B p0` %@H`b6Ȯ@_Э^47WP `ԆJFK@AЅ ؊008 @N,7Z(` `;8LHgۂ>E3~7}8R[+o# @0P`4qtB6s߁ 2gz w Ewkz; p`~K@AMDm?'A:o1` 0k@ 3H`x|*D2KDpG_!EP4u4(rO-`k%:#P1Jn6z` GATEޗͽ&Ihl6̀&o5GQ64>mhPM` qhNuX7M@FжV僽'%ζ rXt=@2#yfB wP#s ׀Bt|0:W|63kgk/0:@MA\eWz`O 0~?eF2@1Iaѳ`4,"PS+J4`}0 !F `p@5~o48 J==;a3'DS|@€L>$&@$hӮɄ`7pCD~0:`  o%LH(8+"%mw\R @&d,&7[`wQ`د o[2 +EAmOh! kbÄ`%EGKY pf)KYdpM0HK)* h @hK Az@ 4BX`28&&[+ ,hPPtG8>BSP^p<07lc 2fe#f=@B^lE9F&&i}ByFEWUcil6^x&/A`[\PElfc%(0BAP[(s]>oqQ  )@? DA x]7 @(@ YGR+@ \tEn;4D;[a 0đ BSlT+Y=p"°E#;*4Z pl(m!L7J~P#&` @@XkJ%=04 2?xDaks!aL$5 `nz6Q `{R a v vGË/Vbh 2E9@ +u,Q=XrA D-@gf;'xC9!_jt 4:}*~6:/ʗb,6K@Td.q 3Ȋ{+ r9a q7[tXhdCp O#/>A=pGgo68 Blc7:6aِȐd僫P+B Q%8@ Z( },u: P2@ )* 6 ]RD4oϵh&@ \8ROkoS {58 x T\-Rg J cFC8J!:AE&sVpSx1d{|h_I'ܫ@WSעon_@q۫yszC=ς5obug` b %0A=K`T0; >_'x󯙆 ![I @CWPAHtқw[ElIT[@`XnqS@j yX܂R3Ʀl"BSqw fwg@x#X 0x/C(q @1 |R*ug#E_PfBgh X NS,X#x-]|T3(JnQO4 UH0[`"(C}RWa XBlѬ`7io ؼof4 0 GuH~Dvt`C nPه4C $PGP^($(x!: ^H'Al*4)pH P8Zq8 B-e  Q`l"ۘ8 c"@pADA!~%dp820 1$ 0}fG* G2K@44tE2YyA  r  `Dقԓ\DC>Csp!l텄}=$X(sIpyIѓ% 0(:Fq /FIp2zI`a %22$e!EIC(@ E@4 =9 ^(!=@zضm9c0Ze-=+(u3ks(:Rn)~7:ʑ(MHD8ClͶV!R4~`p h LM b/F0B>+k6e%m0([ a3kOF׏@+1I|1[O7fc,\dΛ4cj'')c07`$ch5ꞠG}3YrRx,Qj4J8c<% H<3&2Hd5Fu<Ƒ` f8B_}H Xx%/` ƍ2šGQ `~Ԍ2Ba:@#`܄Hl \AM ipR6  De`9X ] IADtPxCR,ոQ@J4  +q 1A9 b"H"m!LB9dp/8B&DP>`824%SBT3CyX+-BH"oۮ 6PMStpxB]2*ƌΞfLt+$p9@g7Đ1CtTo| @hq@ښ @l :D:ppA2~bZ?P> Y/ШMF|5=>Q.00ո[(#,p'п%wa!H?[fb/Tn@kTAh= H cxn{@}7H`7} 'T1,8Q3];.,A5@* kxv0 @PaAB~QK FJ `h2BBD@ܺBrF}d+ NӠXhZA,Q3@űmޠlgxWhor+= K@: ^9%B h# Bp %N49T}d+808E31`  tAF2K5pa̱Aa(F rl8s$"VP?,9O0tX肓yo&j~ Mh+a FZM@6Ap𼯊j3)3zH %6hGFk.Ayxl5xN'Rcîplh0`؋60÷PF~o@nq@ߚ4tV MCĊ%]:FU#%@m{M{MX,)5 }l ԍ+XѦ!;6䖍FEػ#vŀll9Ћh PB(w(D bhZg& C " `&2Xq}ch~EASpk6  #tѱ[`e<ܚB6jiFp)|NuFD&0 (b1 d <1I8g&!th-I'An eЉk U3@ >A؂Dp 9@" @HI6M `wq:{x7#Q-g`ho,b{KZ'[R14 m@<3}6jPA!ȼ<}2TBlۀP`\%6!}UL_tncK?HnG0 d;r(Q:k^|R@& Qt@@^Dhv>pM%OnbycXKMc}4l2 /ttM* dV#s&@X3^k6V1 2{z} tm&`h4 %V!z J/%` 3:{50tM 0JR{=T!a6V|Q=gk: Z"4}ʣf1O<*, 0h7}HC- 9ЀiO `0\CMB\kZ @ كL6:@1rKo{Gd z'Aow &`@N\ -~Ay dz o6>fr:ǀB`p3r&6@v `ܜA{-=@ wA\m`خs{! ; tpޣ! LE>xKR0:>7ڂ0r(Q:@xt&:@STT7L@}VYѤ!%m E @(Ph8mJȢpf0 r6z&E pcF%n' *,%ܭhK0 p ּAE# @qrk PX͐*8:4@,}Q؜AhPm8Z@A#YҤЇ 4%E3@/dUx ?AZm^pZp 1h Ah8Z0%80h 'M @ :D*pX1P%C{ `pB3!rJTrȞ!H|J(:8G8U"A,0V#@AqA[7ř+M w0t,/:@M n% % OZIxk#NH", ns %)_+B{Ah gdÏ ΦG <37:!x`Vc ;B UHچkm+aUGC_!7U @?:q;RL-P)e+~ ^ UvKPRf.0&{A-%4l׵ ! i! L2S78tFp 1&"G{m"% ';c"aiZ\Ïjݔko:¥ t@\  ؇ I% DH%:G~!:@ \:}&rf53Du J6Lx6 KL hPC 0XƒfCX r 'nBR[z@:!eAZ- @ Go  8@ȗ\sU=NY A*! oB B3>|:blB` "0iE -CH a`D/06Kut zAAo:@Bc pOa^a/~ްH KP P +dMj@xo42L O2Ic pBt\z B(d V`.AX\!!Ԟ8h40,`J=G=4f;""B2~DG_ JMFB>,R=MPbA}IhVw Q[T 0D G/"-M L`@p8Z6 AZb~7~< :r#")it8`0<*0):B3 @^Cӝ&$` rJ@1@?h0fczCxG(_XvePc@ 02A(`() }ne>L[m0 PP8V !cˆ9>t%"8)m 3ec f ÷#| '}Ș0,  (}Aj Hk#4@  fk@-(: Ho," M>T0nn>BBH.O blA)l0RM\@c jP>D>PB w0Q] P> u!6TX1,`8atpzQ}0mH &HJr)G}]k |oMJV D rt qv~1 A ` 0v j|IP L dhN`  rjDHR>: gۓA'&"Z{P lauoJx-h{ /` p \PoP"z&$!) ! e4Qe[d"e Z }@ -` PQCIM;UF KT HAt*pS 2f x%RDXeHqb $<n7Mh["\#%5<&yd0@ @30%X2 `< j!@|&J6j e;2d ^ ^.yCZ =@L 4Yo B dp-4R=L2G Bt{AL Fh+)ɑO7`C%\P:@0%>@Po+1>DI0aGhӐC*L{_`` Jh) B 5>8 URxR%GD\ RaƑA"%`JX/PučVKnص؍Fj ')@!e,SBt:FuS}44 `Sa/RN-+ B5KԖdBuYXj 1`IA ;t%@+L'B8 i9m҂F=KTP PG;B4R Xu/F9xA~҄%`J /P|tPF$F@$ 9.[@ HGum堨0oʲ[B=KPPcepSB% Hzp)3@V`IiOH'1Z4,w{A-t%bB7@ @wMQBB0]O588ʢ) "bE􅰰c ƄBt@ct`tLt a-1]%2(aM^H?p'%G7!^  bXtSX r/\(?T#29,6B2fB@31-`+-@W04t>p f$r.n m%nn8:}$6iAӒȠ)4)}d|RZ n&ht[mHLA|HORٟ pp $A;` @YO7R0qX6a 1 ep 3  }zPI( sw^G 4xf>5b7}HJ*!=@k2O0j/ HlsD%.>𰡃P+dJ:o"K  KC2K;4 /=R@mpp @:k =p-2`Y K6t A b rUR'  wMdG6L6 wHG{*[~th m"(p(p xIjzr>  p0Z_RpZRV ptZo P0%m0 @[vQ}R{!!D}`:I%me;3bd e;ȜT Q2!:7:(@Lc BK@ 2( e Eg`A!UH2@X*sP@(`ɰ w-#-o[U k*?=@{!4wEj`xG:@"-3@~@XP)$ه |A 飑qhK|[sMe{/a`N@ Q}dk* (0kR('RYzoG!pscxb @@e"fȐ  XʁR۔v wk#%TpR[b 8JBo ,rЍ{ hI=ln %@NJA]` 4H @"nS4"D̄ی)7 rj#Tg0pI%f,DC@=H8D}a6R,BR7:-|ô冚a'AdVp%  Fʙ\n2{D`f6-+tL(@ M:•lFZRc Xʙ`_ɛ00J:n? W ֠ l#A `T_0aJ JD`@ Ug'AA['P`f<,&e`pu˓"rn[QpD&f:&`)s-)t@H-!p( o{|t( g`Wqr(@ e J` =/tH8< )B u]7$XC7 e4y'3S-xfB-}` v@: ! t E- pX%A 2N^-0-:~ ̀@vS"eԃ7U[p·#fƑm X1TBqaBq߱1µIkF `;1m @ ,:KRLT 撌3O_G |I~t>p 6Z=hL^;(Js$mRmjN SmolChGm@_թ2c(6M x^ ]mT APO$z1 c$DN1) oP 9 %P`A*)%`)(pIAE[BLAWs[ DB w1c-|9A,}Ƚ$zQ;`Vy 8 R]ۮZ'&0\y~AH,) -G @%sJ (DV چM DP p 2}93>}[b ªZ9H0;& \\kD(2EB5_HHKB5@VV0"ED@NH)=a0'7BbpRq  ]j/i( p ŀ iku°Oa 蔪RN?(. ,R=!!'ɔb(5K@>&@Zpd̸G `>i) *X…{6$;+RH@pq(p+0K9cKj,Yx pu w} $G%`]hKȍI1%`]85(:;0Xf7HH)ν vTzڐmj+J*6=@դ) * )0B ` BKT ʡKP 0 R,V6p7׆/` XzAo6B KT 0aJAl-2$2,a j Jmu쩶&%2\ 'A@$)4R+Ї W A&0_"r4եa/2@ $D0¢4H%`rR=@\xXO܄ .6!=@,PHrC- `/w/IMK{[ >r/Prq0r8̀  ᔑD` JÍPeB `1<>SCXs2B.°Dk4g,9) ?(yS-Z䃌 @dL(t17_ l & @(`5FVȂN0Yf N 1Eh];s6=qa 2Ikҋb߁U>3BtF̀@`S"1<(h`( 11XS٦%t<B_L]s hB4$n2Yz(!49k95cd.Q0X?5Xso@"c_`؊&(a=h]c ̹<3 !8G8[{$GSf`/!2DAtR} 2BthDC6\a° Cf{᝔}'c `WyB6P 6S:WňBzP@-);BD쑭,O`L1_n0a8 7=@ @p6*X0`_$~(?i 2B]@vCjp>5 N")Jf;ȗAr3},R:@P@ȱ 5 ( '_ 3$5Ic;KfA_$l0DZP NOhoIɖpB ` 4lz~{ `pI8A\oW25YRNE`s?=6eިBb #POxL{QopbXQ6 ` @̡`05iA2gX1&jTĥ+6; \$Z<}=d(00?^x2EZ`ْb9Ň 8`\"O[ xQbN=ec: u!7I7Cap0B>p*!:C` `\q^; mx PImva`O܄&@:!Fޠ( b\Cra"`Qj0,`t:]!eRB@.=ku7\?Q\pihyHEdDil)3%=8i-;nKCm36!v(sIDWJPt'֛up4<5l@ $lG 4yH !%]:8ޠ0i( !K԰_T6tF(`Z2KQ@ c }_{Qm(` P B*! J ȴI0M^-U]`CgۊT3j3PK<3 !;HN(  8%O#$O :":g($J|B !oqiR›%b|͐}]}Aa^ N7&i}"'4 C ? -B@n/h`eiF@ crn}[݄^* 4%D6ZDz@gۆ p !#F*04#>PZ"@`/oM!-|20zvͼ&7䲍 @>j|,RrX FD;aB`B^d g1M?PP@ Kf-x<7H6r,8*<3`M Ʉ'"϶ JM?8qDևW DN }t-I8PG\2@ROb8LAE6HA0G!\bh` pCP 1B4꫒ZD9[lS8!@b.4}1!|B@Vaf0mh8 a1|j/$PNb LBtZ 4`("jEEt2Xts)*>h *DC”09`C:xy\ 6h0 `/NGB>e ># /Cd ) KCKB4D^ 03w#>3+D0n6Da73&p !^P&QBx!ߌ\Q  @_ hzF7!8%7\XҦim. $F 9\ *tqX Sv.C80hK j p @ 7 Y,:@-@b/3B}'>`%B>tPjN=[sM^p'M JݰB""%@7жvwp&nRdns8 owp|Kodf]E+$\^^I8 A@ \IM)K@T x Stb ҙ#J)"#Fj68!&@`/lB { @P0xz=S O"!:VbP 'A}He*J?'0߁&b`ts8ېmXtCPtfg'(GbrX% ' 0CK˔P_X@Fp8#u[Shn3RСL&8 :)UȰaXB[D v,7Oa@>FK@'nBtO 惆J5:}B$Hk'JbkۈJ,f4C&n/DПwXJ~0pCp{0 e;(1<͑ `;sxNSBH`ts64@7oD(Ґ3C<:I"t#:VM1blrF%NXHa#\K И kc\[Z2D&! `lP"L75Ke~7\  CɐΆfy$0ic ;4 mA4D [m;J˶^ϧDV\l!#h #R@zIdSh "-W]>pVs96 fB>eW6Ѹ w>A F: 00u *\A ?)), Q( ʤl`$33K w-CD*D" @pnI,nTȀ!S@E}=;""0]krl\! xL =7>!XzlS\7!P0GYtsxB#73DF6n$mX\p1Ln AG"2X|mkQ:B" @gp9K4yvDEH)t Kn. n7P`$`XP`4H!ofs#Jt;H_PHT &Z+0ppSH:7QA@x(}C}_Dl=1Q`@<4|%GHbS`44B:@ ( 0)65`/M J1&xxu<,aӐq8?Ji+M )dȑ'rd-C&Y`E2}BdH G~s@&j^(N!.@(,`Q*#odc^o)dA:@- *6XaL8TM=,Q)} _eU9VJ&6x`c %,PBh߁"B,a8 .Qo# [h}L,a=i Xm %iZd%Z/)ӳa/B hCjZ% :¾h ӯb00_=`6R soP hY2GjObŔ _«n[9d (JaPWY$BB>ȧ (Fp#0IAn‘; y0/`ZIPZP#M›-i 6ЉP ?pZu;ȖQ |U9? /#oDh @ B>Px.(}h aME `PHYF;C~F%b)5Px?036c,b>@0 dB0@ f4C w.Cj1PEz%VBi+l((/mX|,C3 FDŽX`PY a4!(K p0%@{I:,MqkG"%:l*wMAK pMD2Kt4$Vzomh^,\:@)@#M:M7| 4MȔCq?+a&I%lo0thB3cjFF%@{/jE wn$P vmNe yKv4MCiMDaI .` 7ܓ")i)%3(,`M*!g.#t,CG: 2XƦlA{^('AȌ@ɻN!vk}Ѝ> }hQ9t4},fӛP ǏlzKٔ`iJ#npۈ[b ۆ8` HN!A H/8K$LDd7i#a, 4.4A2ʽ@O< CK6D߄`6Bg` ۊս?[9H `a@:XЇ' P Ճ ;21kRA D` 0$:` X(5oC:-5r8E @P> 9j):dMDrP:Bx$h MDFZb3?cƁ &?ōTPIxR;nfHMAB*(3<3 !z(6*O@o> ,CB` z8+Qo B6;})&r) >)%ncdB"MA` Ji~7%,aPN'Y}Bv8eLrl=K@wXdI <ڦO(`,88 ȃ¹P2@!* C!-C`փi!T"GO}e[aP(ZS9[S` D7oP^ABlӔg8@C(BPQ Vr,CȒXg1"^ C QW !9,C7@ ?1cÍ@PQEQkCJ$==<V COY"H#q/8٦ q)d+X0%`o Y:,MmR2}paַ7Hg};9+p"Df7M AC`8LfMNJlzF% M <kF @(xئAq0.Ev,C)@<\{),~Sl%6,D)ES'3Ch5;B[ S#0U:NBn' ,`z=:@-@GZTBuK΀Xh< KvNTyrR.-)t`NQ}mNC$\5iꭵ耜BG&`H[Sx,ҔaH8gn|Shmp8U<<49MnS3<  R7\ P8`m !;H.) eD=r0:0@X3 >.& A ;/=oUx((M{uB @d om ߇%h $ND2K@1H7R)6B|FA7@0qZ M orSM !,+J &x.Ձf<*7 Y!Dt {(91Er U`t<Т#E!C8R7Y½ЋR5텄о ߻̥ !'C&b{#)PD%4%D0C&iw3LBtǑb|݁(ܛ8 t hkfdGJ((){IPG=1RJcH@@6)` 8B&8@Q&p@X)&,j]J Đq (FSdp2Ct#hnb5o ND>ɹ` K ԔNAtI%u| eINlmޚ B 9. q@8t g& /2J'U lI#B^lE!7u:blA V݄gBȐa ! SR"W:чDzK q$> )!يK qpT ?,$𘭵& L 3|84drK 1{ 'Jn C%@BR A{  Cl0s#3؂- ^Hm,yt*sZ50`HRF~Cщ)@)$@ bEyaNjk^C22w ` !ڌBt\dD1b/l$( 8"+)Lh{ITHЧZy@M)轀PA\bV4 D}GZ_ `K@^ؔX&:90 ! #MQ tNZI p@@1{!Ĕ}H;4L1_H@O|29|0JXl Y@QPpJ _I PDE_ n.+ALJip8 )!;h a(\hh( 1z/h!HB ?B hb m .0Jx$: H iMJ 8F$P@`RS W\Ƅ8K!g+tf5LWN)K:a  H#H`tA%}DaH{ JI#`2o":cD ] "B?Qv*l}9@p 4:"PapX8J&v!eB !-}`skA> 2S֍kDZZ k42 B8Y41G0PdK@`mCD:P p3=L~})r4X ta"%@#*4GB4D )! G)+FޛUɅApg:mKԡ0Pyhl&" Db!(D{P3Bc43jo2@ qk#r3hc+Ok>'I_h0L &Ю~{_p@Wes$!%(A+i:CXp$^4sC0p+/ ElXRsPo@4 #F74qoJƘ̈́ZSdJq @ Տ DZ3StJh |*D2 ~b`Lh<4C҈l>1@fA`P?L/KX,D.oVI94<=uBq*b ` ǵ$&zg# ֎ܦ̛_ Z^!~R&@ fƵ%fjIsB` Ox^XjU@A{A6@IYD>dkTDQ==(o%L@,Hban6 7H` @xIDnpX[S#| @( 4&M= O #Fd RD\FnV A58@%MI##ԇa׺%{0Xt@A 2ߡ6ƒ & .lFdi$Bx E/Xs&Q7@n &0: 0W*q#5K <շd6UwHEGf0q"@h,Q)@lCr :  '[MK#7E;X1Ͷ[J+lfA}POH "(&@w}NS H` dc>]]Oo7j ϙB~TAf H#1$ƒc H#FBtFS }JHaا(C1 <= %'(Z0Xاp: #@K3%}JI7A7KLY:H qS0#.Zz4@H* 4i3 @ H#1iߣ(` I !8N L@1(AS@PJF% 4@" @`1 4btLNߧ6{IT}`@!NM QBp{ Dh0N^$5,YV&XF8ٍK#;sT`@ kZ !oMODڑ#h rwp."CH 7c_`ՈB J6РQ=5  րa/ fP$t0BtY@/%u Ft|>gtOHOfc 6!g/Ola"P!6$4ĩ{fh!Fu '7 7 #T+ˎ&էb̈́S$Eq'=1ImF*p _P iQF A ` C}f PN(  tNt:Lf0&[c p#rѐ eFAP0 >Rhl =˧ j Inj Vp#*b JnDr߾+()\uXC2zz,9+I M2) ʲs#*@#@O^FKy0=kAVCT[/( ZZt@(O܄ =@Ps2-`#>=^% ZpWR[)OeA8 xq3O#P'j!L1P|z :@AWe;Di d.j &k#$'AŶ \8i OB-K1t `A' ?*R0 d` e3 ? 8TWJL @(0I+?b80~oP| a) !Q"$ mAA=6PiZn|orfKR2FK@N,T `Fd%gJXltCSșK$7!?FB:e3 O5! $-&3,I*XlM![㨯3 JA 9 l9&1P+JH$} ']A7(7C G1bH,À@S"14l m܋AS P)sP:3tC-x`"JL<,(7QXP!BZsF-<n,WA܇o"A&`h e ž PyZ%K*OeHLD{xzoFU`$,sTBH%T9E]P/0CN SHT,D!Q`&hPk!mF.҂BtBw-`,!,T3gzX4ouLD_Jq̛%@:MG?> *KE7,6@)D X`"t.iaxPFS7ߎ(B\LxDN KU @_@yG&QDnftO xPC4QE|/4QnO I,<2q#.Olq xPC"vM2ҡ K@"1+S qL4MR6E|@ p%@FJAB} 2@xLЈA1$DHJK 9]2LPkqP!}l#)N^X\gP!:O}u=@bH$`|9D*@ XL`"%Flb cM{K p 0A g+d)fpM.t)}սwG ؈FSvD_PJCJ]7Fq#~U@eP = ܍# H$胦!qS]4iXH`*8BJjtq p|PWpbtA N)SHL;$2pz D t)TI K U XG +`!g GhA?4IҰPP0K|$F!ۼA[$ @#@^ d̦?qQ,Pr@BѪas({,)DL,. 6QX&AS xz؈nH)]80 ^92cDW'l)F9ӡMcJRe uZ&<68Ʌ6؊% h $M E4ªrR銭>e`2B/(;w71 R@ 4S3M$C`Penc,`o[FoI ^vr~RpJ l%  ܨD_`Ů\7@rbzF􅨴m)14 T,D:YN*S8H({*S_@obp*iPPTں0Xj 4v $$|z6C|CBlǹG.Si=pJ|o#RGTkƖ1 )'6Đ1CG"=P`-NmI~ h R>haR (~9(`H}r%C-CH elBi K@p. 3z7QM 0yzD(~D1B_^('Ak&@ ,CD`O p(%8 ]8kህ:. ܉lޑ EaqQYŊ3z-:1@@ &$ N轠AQ? )@ Qz% h("Z7LB>Bڈ `KQ> 21әIp/8MX"{$\~R1(82:A>q*#|L2U$*^5fp0 |z8,DIΆX#[ $R d"@ (q/ KU P3DA`,DԷTbSeC"1e.PkC*.iQlPKT~ '`=1Rٌ p=N<H= P#I;P+bc& %BGE#jW\CR}Odʂlzt AGb=|) 9HqR@5B*d;Sh : 6p! 6@q0ĥVEe `}a3 ) ssDLLUh#@m<l@atLX0D^80JQJFXBapi2xB tI{RdR&@G|Ƀ b[ I {!?[%% 6$?F,`&vJ`8I$} l7;@  hL0-(% ` Q>4$0&捞0K21&D_@[DP ED#Ӱ)}To;X"穟 S,8P ࣐x47%@l }bx&~UI'B3m',, %$-P!= p1&D)L4Q+hhkQAB-%+]j1UjX,PVz3("B$h TW  w/PqdYDю(82 NZ(M87L1Ď#ŗN)7@{*t nF6'uSI Xf0DZ`I3RQe9TCrg`挭 & 6"":"`vcAtLhCȒkX^`/L4   wP#@GoE%́83Z*90WB:`/XrtuHaJJ$B\h Q3I+J, ظisa0GeنAg, _tB+g~ 9` |\∐XǴQq@o,c$-`) GlG X'P}4M,!PQ;1P K(6K>D i`9j@Z ʄ O 2XΌǧpq9=1 ɮŐ$=Vm @G)r8 p0[`@ǭfBtWAőtBG5>u84Rd1`{V6PKa`*_~;Fq[Bl72@'@ p)F#ȣ.H}4T:3C0¯ >a1&5#eTBk N#`N !:+&L8.L7*X"BQ8%LL #qdK Lě;*s̀:#S@5KS2b 0KNUb7g 0K v7;%Sb0&`Z":c,M BA%`L 4%`-R:u{ &;VHJ|CԒ B d2L uKAl$U\17 `&> ,miwPNH-&B,T81Cv;Ad  9}-IQĘA:@d0 AQD`Nf,DPE@|/"h(flzP 6P21L9Vh|?knhN8KQ=lA7-b5{c?7š,{*6,`.8tF`^('A A8ȥ}1t0~s4ot~P6O00"TkT!O ߒGv`N}67!zCy _B2P0P BUOp!~E81!<\ 029q[T^3Ag SpdOKmfdqb/de-CmxBp0]RI =C.f,'r vZќCDh #z-h3tR t_e(0BRKGo1|ovbޭ$4YT&ڼAgTI B1Hhz L-kt[5fL:L&H\ C7 ߤ蛶KC P 0: =KCQI",T4x}Ce"#8 04:`=g-`=:`MōTBKCq@_xb&ymbg` Q>o1zz t pbm 'N=|TgtmS = riMi\RO7I%@NP7o-XhY @p ,T= pI=ղlޠ^VD|8foNxRxCl:&@-Ցr<06KCpt pBA]mNL#7jrCY_lEeGjb x(?RmIp=[m `RA$t@Gj,T=-!r/8R=  x("*E7q)$! KN y"։>4HWKFlpAU&PDŽ PRRfʛs-sq̥ssoHp0vS_IN '@ H+6*b:{ `pGfy:@bNGRϝNwQӉzl `KJ%i% C@%Hs  [cJ:nn) 0CGa 1n ~t%. vuaD>Q%! J&BЌ«-/Dp #@ @%d5Ļ>oPJ5Ī% JETqc `Lti%M(^HCEnBtI^P  CjJնiS#ؙLc'Lm:}4HAىntg*f)Lf( A6@`HQ0!3 @as%Thoj7QS`& MBQ 3c+ U,7FXa 0:# @"&:6>@!4C*m US.h3[:ƅ*yjbi. gf3Do4%bG_ &`8{ {ItP:x%mT=X)9q d# YJ4A{ITPlEt E %$<҂*)z^i"}I?+A0TA@qH3**4iXvj:RrPAgT`b @1˾a nt6K |vҟx Hw. Poe#B}.=>4 GSM` r QڦĽܥ'UܥwGM_h6,(lN6ɳD?zw YBDjB F8w}AmX~o%$zOR* rf|ٵ5RpܥltS;Ͷs/oB”[XJ4d?TQVa Kע}H_mC,K@0QX J6K6v}"^6oX0: 6] E !(v*~S2!͐Jh%F6Dds 2Z2"-!2f襕l)AIЖ|#A^0#TnT &eR^A> K PFm=(2@x$fB`1}̕5P(6ӶN|iXM'TLH8M/: RBu",EEwP8 'U"rJqKXP@CJ_&P)SO5H+Rp,<3 ue:(ĉުO7O[`߁:UPA4 d_A *"vDb HRBM,TE=@( A $[H^ ,t1tC& LjktDP!$C3}U>@I5j݄ IR\ Kī_Mk$y $BB,&&pQ%rJIABg#t DPtp̛D!B>KbT7B+Dz}MЗ9l .'q/8-z` ;H*Fe XDZBjؓ'KWQ,T `GRM5$=iKH3R:P^Xj^k $PJH{!PåE,fR3G iA`:{t Xj}4"=%Me %@ Y"fKP`ZQ,֪21&@H UA۩-^Sll t\SAHl$$bA#rĽ$r?%9όDWQ 5UfF~1!POZ%%:n#8%BPPO00;d$Š33@ hA*Ecy}wrݩ5~Ћ/PdS{tǜ;i"=avpOL:VP[nA:+[`ߑڂh<=tO-"M'M?F;iH%f[) O|. 7UB``*~!Pe( Xy` b/([FZVDSڪ:@8C2mg:j`^2}D-L.0(P%ļM(:-#'E8(J3 r}4nK`1D֪J, p>p jsП+P+0k:@AF]6Vpxj}r.RbnFX HAT0m$((0(<h_YA fi=H6udTbVe : \Jэ A@(6 4qc9"`ȇB>hb.L6\[$ AvM!փoC 0f0BJ rD02MbnS,;@ f^("%O.4ͨD?ʼnP] &i{ӄ6q1Q0X8Xk Hq8vP POnM!~ 7-ꕈ,s7!ৄ2Bz%:0t~  [:E`+t`!}fC_P,ؠ㈎-xJ4TPj @_st!Q*(8@0YQ<~Pvt$yX"8ld iGՒs߁ \2B<7Y y؁صB@m`tC3@(@>hU9%|Nm DpAn}AP⾁!S@:VQJ" }*ej% ׀Р TBXīi( P,j%G*l۴ o" ը ea qڇE[ ٱLBQH,`,僦#@4DP KI?u8\`pB6:ȍ! K !Pc Ӂ,':ހP|{uP$Eŗ2bД8JJj/(C{Kg @_Ώ7Lg8LA %bd, /Tf,%`J +8bH BL,tbO ><0&RDN>3FxX>t*|sLgA FVCLKґ@; :N:8 YI!CV`IOPY F4O@Zxq3OZD_=@(= 2Kgq~t x"*TDt~v*&aep:tP% ՔBX&e%Ul:$G [a pJs *vN熄rЍ!! P   7 QNHJ^Cصr8'|tY(`>Ґ 6 /|oDq/4QCI^QǡL J.F0KPeY br0.X,4Pu dRz D3hDwZ(T!-#-?QxТ5͐pZON*qHirl6o{Ex *W9C@C R <ޠP8dT f1W# (@,Ead,1 >Tf:@ 8xS00bi0R}ɒ⧠)  [!}&38~53EuV|Z(JN1GP@^((:y!:{ID JB)R(ݡ}#Q9@JLeY@9hdp+H) !L !KhARՌa7d>NxC, ̌ N{0UcBtYCKL}oc AByac_`RB w3䋢3@3jP@(P P"G@( p؄p40-!GqD L!آ3C xMe.t @Z8#@m  TBhBg0ЂjBϨ,o5OP =#-aA-}0Ej! hѕbn{S * Cѐg&!p D2+*yh߁ȃ$)6`OBzpP 2epC%b H-<(U ۽(.("8 eEȖwxLB{ c$(4 -jAV+@ J5&@H!A 2I( !@  pT`M*:^H9!n JDL a F'0Qzpҙ ~Й؄2Ct Ort E3c(P$%nH I'}tM8Db\Y2H!$  t$- 8C(p @9Tw|n%w'4AS;8 @`K?]!X)DX MF  D2! ^HɆ}\ SX9 Tc m(͸|9!=P@d  D@We(b(ơ7Ns "Vq Qx1̧@` B _ct&Ѓ` D bNQ/BtP` ylGFB@l4#>"u ʘ b:tBKxv {BH"&_%SG+ 'F@&!m@O @(Tl"`ΊtzB @P( R@ "k#nZ,3QV? BO(b:)+ŕr#9p$h ,K JphC݅}%&Zr$8C=yr%)ӖcI+43h(!'@fGޜ Dw 6C99>rVB2b߁󙌞DѢ,@!tEh` q@ 7;Pm$#@D*(s Ce`/d' &HXTBxD( )BBD `!WRby3 G)0PK9!:J(HH!vHWp^e B g(NԡlFh dBPIPQ;.oлIE:GS@,  - SmDZfHsĊpEt 3C?j;C %& Eǣ0h#uFCh0 A3.rP1_9b -N`▟d`%0 <3 nPi`~@:@*@Wty Q#p#)0 +l/[P(^p 'xC"#.&Y}A c pLq{ I"J<ʣF}JtP'$EBݰS(aJ Lmgj/H2&1m9DU/dZ3,SQ1J,0!L,9)@W,$%TV#KOpWXj %`zfkhHIH X "/  ,4`=LPunxf BKxpDb(28TnsPIpa/ T! YL&j@ʵg[sғV)mWI @)[P^('At!V2u.:@:T)M!G}B4`DX(ndh` ъCoB @XpOPWH/,` # İ06̐}|" 3j&twPUX2@H @d m 1b) nMܠHP@/TG,!=#)&+Ґ `[ Rolf1:4 yB8 ]P06!@B~C A!Y'^(ப'G{ 0qrSG{ Pw dQg#`Mdd(n 8OD]S ;WP `(Щ2,`=:, St(  w.  XGP>4D8؜sYZ}cXLYVʽ0R;3d(Ī+p``r%CO{@HbPzu@ӕlBP`s ]<3 !Gi B*B%BA 6O6 'F/DB?₤mB `/ !wR\p16zbae#`-D/R =~XxP}J1K$B4aȯAS rY* J0!f6eP>Dq7 P`4tLBY  ]0 3R agfD/tsB Gb !@?Q [of(4t4%6TT('D`.83 I!p/8($ؕ;<(my"}`-2xXF7!o(R>(!91A UJm1 wৃ9`d"2XSEUt ي#Di a 9ByaP Րp.ֲSe'о8  F& {с9I(h*d}>dA]p+):d]xfBvg1(>w`$<DS` f) -çJ0~M".HY3 ?]ﭾ*JDўUUpU}Ll'@4 Ŋ5 :⽠ev{"yU\I ǁz.a`??rSltAEa`*vE"!QvjH(fwUe|VD͈z66&Pa\sD-A@#2htudI `m$GI'  rB#&%O'*PTL!`^9) EE?Ȁ >h^\"U e#Åny 3!}+o2D_bVA|j( (lie̠3itB5Ly7z``,ҵEY"!c}R2y4 pSu 8A/COt`^T4sW X̋c"4/-9`Mt(` cܖ"6%@[ b@Ә6x^tB`b0\h2Ƚ-Ǖ0EںZ\_4 W s3@`^9aCf @XC Q2BB31#S\ /} :&,C`.b!9HDj/pH:tPJac,E=g!0~w Ts(˶[&U^6!}'[@h4A?,%'I3K}QqQ(`Ap AG&pb`e\l7&E3ll*ǔXx%ii DW_AX⪻ӴF.sdX 1qU MG'M CUhK b菡Yai A4lE(r,D/&\ ֆEr)RXxfR*! W^(D8P,Xlw!ǡ++"@H*[D_ zFt8M   %3} #0H=B  0.:.v%@mAATJ ^('A B@.z9 `UqE):@aUB\\q.( C(t@qd18kȀp *Jy% a) L!pP+F%X~RZ_|d(@ ٨BhP(ZRkτ )InpiftwP:Z>!\e&! `EXF[hI:ҡۚB+%[Vb  0:5i'P(g40 ||?aR:gD- *X+)#pW 3%0 g10Z! !S焟L2=&ஊ1ׁ6)W Vb6Q"ğH #YG3xЎ.v`ui5VB(G-㏄`a`?2}y@u8[bcO CWB>!1LA/!pX{!d]3'ATBBu@%PA :@4&UבHu.JMD=6ZBxTbCB^6ᅮ,S?G0 ?pJ(J`€ hHeJE`%@ j.q8%F wP73O<L. RM!!~bUE9q8xn pD(%5s=`XT[hSgx\G8@@Jt{&} { `p@/6[K o}&LB(F!h; &@f`/ꨘRp Soԕ3CpD Qn6O!V^5y6T.ClfӡO BhaH 1}y 8'}BY b`*70!DxfB U,= N7y,%^`'Q bI*h2H"`u?aET"w`@pJ4p?=@Y  *o9S(\A2 9jShP>^('A[|n!p`% h(UK: A4E-~n~ $;Gp>.tfKl}BJh vD^Jzjb9"% xeª8ZuM~\S( 0m;td8 #X;o C@~>4CN ~:\b,O>DUKb#x !,) N<+ &S%AT%ƹ!=^`)Rhb (1aDT.@O<"{%h/(d meUK@cP?@ñB%jzx*f Be6}\eYXj /x7f%`\|8 XZMnftRAb`5m7B  FCY/Jh&dpiCt;bh (1-F݄\rsuXE Xd״iȯt^Br3\%t,a-%n!=Xb  7R0k#ATUQb8VMa`b8)6w7(љH(|UsAjb,bҚ-0ް1g^\,:;EtDIcIFQt?ɯn+T VmF%Ĩz `sTPFPM!hx~;ZT ʗۑM(2져/&h 3k`A7 q EAђˍ + A1oT8 !P$ ±#`n)A-H U1w}Oa/ ]FMV T!0p/LQ 70~tPg`  @ıcY9;UPKUV% ƸFUP eP~ 'MhF Cq'In[;p%Lnb(8XP3Z3@ 8P$%pK\^q_x%f3`+lq}K+F;` NODl7HP E2I oI)1B6h߁hBZ}@Ƙ2B">pUxfBA1@PHO :N @xЛc{ Vn6)|+62@')=ACyScȯaVn74_h& i8q-):2ۨB Eho6h3R U-?) IQ,rF23#SB)m"`A_@}U60M L: SS P  6M };K "x1oK-029OՇ҈ Ġ `HP"Pa,pF,NzVII(hPUF1,촀kfC n XVn#3hfHw;-P` VBuqUQ Y0,`<=tQ|@Jeيx9 ` M$ 5@:0s)Q `+FtI% h5JL|޶"% X8`Vumޠ@ @]9)n$T ]27@Ϥ Dtg&!4h/(|;HRaK'L_=Cp}f4P9K/z&>ښ .UX֌j%`Xڭ|U0UC3pktt4 ؏ ez980kԧ@` fnfnwQaf X3b0$jNc h׹BvĐ)e0AuP: /*l،%h+2Kqw/ Uڎ 2.p߁u#Oz{yz!'Xo(`Xt4NհZ`8TRtPЮ{,&Q):)rKf Bm gd eTBe-$4O܄Z%9"=@ g43`9 _\ZWSJo 'kF:sװ1Gn2.It%@Ψ X䌥!Zr5#A |b|q` H`jD)/ fFS &JXex1  Y֪P ˨M(K@r5]tz)\m(,rFR88W'g|oJ gѦlޠwq ʲ^[엦r5N\o79c !K0=6(^g sR)e 0:` 3Ɨň8+!_?I 3?` n'Q$H |t>BSe(W MKqGt65,U:%3w KQ KCU_@/wD3Ku P gCKupy{%z R] K X`TA{X@*Ae>eid.` 3nӹ$(}!` Kt A0K|tvzd}SnU P0~3TgvdTjhWeOl]Ug2eDj)H*]u'AaDkxz { Y􌬣S j\ƈ ]ncT)]3,zFS)`O#mJ֦)e\T lN)R p(jI SN ^~NܙP@dТZ3M͐TYOܲDǖ= 0XC RTcڮنhB>܀oX@֮ûp BZyL4u#kVlzԅiPh1@xiD_Mt2LxUV~OKx q<,7@kCQM1p٭: c=XTB*Ű~v{%@ |kobTX*YuzP@2ͭ)UQ6gX4\~+n3h/&}lSo,s}*O@JP jM OkvȊa\:3e; |ܜP 8 p@ QP j2L rqD@{!FDt!,` 3h/@qT+(p qbi-,d夼[8l6iӂ &sih|ތ0>o_hlVa|ozn3 ,U3ha Xj=)3AtuO(`_L7![`ߑ|Uz ht 2QUln>a|!(R=zbC ),:OT ^9s{ %(g; 80iT\Ҍ7( ԅ"ZȾ#kDgLHl0 0 X&bt^Xen>\kV}'r)(XudRu$+`*Bt~f De Yhi$ Mt "dpP#-AҔ3YW)n5,PN@A ϐc}.t`F7.T@W!@lzk -\ Kh}5# m.L pr"ԓ#eGo}+˃$j9BT$) )Olf:Xc<`@.u+("X`9(ꋐ.I _F`TktBiN` bO({^b|FI*n2Qn6MѮg)0V҂SUQo b EIgƫs텄P  (& w (W-,a" `+2>9g&!dp9 e odTOBK? "`XWf:@$ M=,Q il9ǂ ;9ࣀFr? PddXҡ\DCʖwԫ7:#ijn8IMp3R 88+k(@C"p@4 EPB΄ \B,&q't̐Z"^0XI8>CV/D[.C1z0ABh$dP*^H2D2}33Ej;8 ^pVJhHB$n#B}D ϛd^ "`(Pb/%:@D+ d f7NT 9Yp&Is#q>}@  n.S (@&B E]3{տVf0@!D~4.E 4K,Fo ,ozt4ز@3r%8P>  =#-\l9VE#0(>B%@ &bX8ܠsq[\< ;%u+iH00DqI` M'QƱpK@Lě%VzKf` (5:~㻜`fL}"}k0 A4vBƸ}HNJEP4ljA HؠXch) 8&(J 2 -tRz`H)CF8nwpl==3`/ .Hz0`}% H[BPA8^eh x Rt י OMtvi(VBtjT!K"țs,r!O(`iJP `>P> 9M%ȐCtE[oZ8k ^'Ez;hx8JBP lL(d] 7,5p6$ERo 3Sh(`ŚawsD`],LNx􌃴TL%_$*W'E 5Xp Rd% @?u2)TnByܭ8&%֨ dBX{5;hx/hE,hb 5*R daL BZ pk|)`iL4),FR}d z 7P(9$m5B? US9-LC B7+dIjQJ(c/Pf}14 h0ESQw1;AUwh] ;:\ҙ)hG{ XqA PtG&_j#^cakN:oh?( ԅG  0'B ~Gtw=!:h S i6UF9P'ԙ)'"Sz xLq`/[J;$HŃUK΅Ս )Lp;ja 5ާ_SFXt^^#W7NCP3'@tҨrXucIQCPޫ 夿glާJBC&cԫU_5 !%dPV ('xeЁT^쩪b ;P'd&0u1d>iwą^!Xbz2l-POfCG׏_Gx;FL\]HA[x~zlhD}0)Bt sQ?8AC/[-JdHBWhlTثص՚@*!: 0Xiuh8S=$A YDBB~(P4!w 0cc/!ЈK%k8LNhrX B`%tƑ[4ŦWGn>3@M` 94Sl4 *lFrbU #yfB ~Gt4*3fJ>pDt%@٨8W[mޠ@J8BPPOKUP E8A즵%( AM똈:4pAVE/Đc' O0$(A(BA˱",ϒ)n e b[Sh(uLI @/&k4 = Pt%` XM٪ȥʎ&  X|o%$bgOR ⏼D,@# _[lb&0 ›qX?zuKX1 J Q,F:mĎT:A"t4 t6d# 8FIpLo+uUP\hqa/M` xA B7=N?@ S˅7k3O,fDFhdxDc=I˨Ib Dlp %dw:]KT@ d<&5Pd;Z pk5iɎF"fmdeo5%>D  p͉6x%_?㭳hI^jՃK 0K6D(rp'cj&M*J#̰BE C儼Br ,>qe2PDe/B+# ^(X(F!^4!>A e(`()>tpC>Mh`$R7F{ 0h `?*b LBHln#@(w[`Zު XPhh، M2S&dp3Rs @܄00@:>*؄E\(`pa`*}d-FqB,F8@)@g9¼Q{ B x4F:SvRh M"T}MA9mj Z> ^.,hxH"n6Bt@`fmC(.-CH aC:@-` 7[I@eAtP"שbXԍlS@u  )vB \B8I0??;W0LR %Iv(p>C*!w Tj12}pJT"Lg  3 RTVFi<3 !רÇ`ڄ83UP$0#f[gT0 { `_ BA7 yvl(" 08B E@ ^('A L 'pnq\@<($ "sRߦ)n##CV{k/-`00+8>  `3#ufv:l6br*)9ǒ*1Poڐ@s!̀Z W Cm(OhUyB|gI*+qVRw" 0/r6yP # `h@!M{D@i(^@ $R0Td*xpS!7+(4uCK34X%=rrs&rRNA `Y| ɏ&8{ Dm1 s<p-1&)`Kx&C®p'.!T*z"&T$nPjءI&8eto7LB hFx#gfd02n)?нdQDK!:ae1:ڪ^XaxB/H  ~W:"(P7@ V^C9@LMA  @(@OԃbOÆh {u!G $UJH6"P(qL( nj߁L! mDC6+rBLg NNq>@ enwԍ!cA,O`@p+H+D  ^hgG{+Afu"ى`@h/ Eاˮ>tE AIU(h.Џ%zo@Ή3C0mC_ ps¡vsP%4A)}v4Pb7ɿ`p5%Fv 4ftt%jG 74Y0,`<=t}˨X>h,f˲)n>: aX4RP)0p wШS-m7V>j4rU ( 춺B{%/pD%jZ@s!D*Z5Az%3 ;%.-&P!-P4b]VY*P@5# -:D(]@Ry ^(;iAAϢD>e2` @#C |DCrth pAj217De؄M A0)pD֖}ʱ@G:\` 9*AҘJ9 ) 3?,E8KU p숬!ѳ*q$ ^Ɓ1B BTc(jDO G?cĬl]R#L8(fA9D40=<3 E^(>k Go)fm ~ W&$(,u 6 Yq&Ew fV K-HCHUh N4q?o\Jf A,P7@(`)@D` 2ɱFh2jXڬm%.:Y+ޠqGVf0 kTEPAy )qT)Y1fܟѮxchknM!:)f- Ȭ,FLTH$ /` 096~@oPg5,`|tFe:TXj %gkA=KUP p':0_ȧT\`LF7twY9ݛuF8XvpBV@CH3M&$2FiTB[~.d R =KʑJ4n9=9 )M :M+GM6r:@-آD1OtX(*#>8tH0`+Oh.!w ES%j'bGdW4AP㓑M{#T%hH1,.Gt xYeXeV rT,.Ґ @g5 MIR` q5(R5,t:@SjL "K!V d  ]3iA"Ct%R W:ް45zP0:%-B:%5^"!R[ΊgPODZP;J:kmg $DKN2z'ABrLv/2IƅjgfOn>I\9^(),P;WR4Ȍ==1` :eDz(Z`G+?T T`/,'Q4QnpsXhJb>E6#ZY1f:}!T'Qܴ!d3(E)!2IXhhS DlW}#M`|g;4LŘ)bhA:u:G Y{U$~ SlVuHK P} NSiPܑ4)M򻛦P:`-SQPoaC@s:@>8b(-A_:qX! ϪfJV fdB7|PD(`j!FfJT H)A ܨB ` P#}UQxpko $Ա 2l P@bTJlB3Qw(HMX2R qhc@(@_A #<&@% V?kyiJ% znKR_1'A3KuyӾÖ `x7@(biIDP`^p'A{`Xx%:F {l?3%Q$ҙ h0u3^l :#ChOG3 Y%TB-CHDkY:bT9P`"vbl%H0cJ$3 4V|6 HI28]!dJ3Wo{4R Y` ڵf22@dp2Rt~Èѱ B)QUȽ$OBh{A-D&}P euX0,=Ja EC"ӡ\QڦD{C` F~"3Ha Kp5yz7/zF^ L̬W?8 N3cb = :P>^9<BEh4錌U:%Hc ɬ"=} wAqi;pxz#Pt"r\F rDhOlm j@ A28]E) (o`XpJ2H[ nfxlt= d\M;NOЖ> E pSXtfF*!~, c`/:g5O9)UȖq8pPRDCP@b`ItHSoJ D.1nG^'Ao`fX g@>Yl6P f 0e`L bjFle)L'H#&lwo|dmMN Z2*ґg&<$0T[`StM~c 0۽BtPOn' L%npH(lfw9ʬT!DDƌ:JDq ee^@ j#EXv:"* :YcԹ*f$0\ (QXeBd,f;* }Bi:@k0alf:@ tIJ"!1q_g : wвJ2:َ1&RŌ lQeRA 4 :*&lw}iYcz6HHH uw,Jӄ6R1M88F>eZ>$=@ D,oc:*0ڪmoDCddjh !RF)(h4~XGr q PBPSD߰n%vBl6!akq=[5m`D+b`A4Hh@XWN(RбyP#Lg8HpMj'Au@;5Q PK p @A3Kx,("@` x΃挒VQIf5f j HmB05Zw%xwB w5u̻wӞq̦HPR }(:Kמ°t)l6T xp0F#{I[ƎBS BD8LCӐ*@id a` 0bWCk4h:Rvhni ЉvO?ť,(l#^N %ƚ3NA16^a/ A#KXȎ*RTbh/`oT`T1`,h;Qذ pS=Kt ,RS@]Xʎ׸I4gaP@66@vfcpz,l;`p3QV{pFónPH"3A5@P@bԔ(NG"|0pPXB:BK!h+u:q#DHɗ#*Y8̥W`v+#9drbԕ + g6h ]f `@>HX~a_``Kێ \Rפ,m'XvsԇYxygGK۱ =BP j5|D!p8` VBa2V$( (dm*:^°px!p/v.%pJteU~4%Bt8e` x;:Btճ2" DC ?ae$R's¼A 6 @C QʦRY\p!Īd x=N5#AHdPZ5,V-&ձ|PxF%u8{V$Fj-P܎%H4@j2EI@- @CN~C+O!2K6!tF P% uBB<n,7=0  ahU}U8;6% yPk@J3dktZ;/A5X |q]WepAPDApcH pBa}&D(KJ7 Cf[m8ppkE(~nm>("N텄}ˠB}"T0Bą@r3?ܱpXtl:Vp#X ܁"M=f1]KK94ɕPYt4D;LB ^- @pKAKw;jm2D|- 68Xeasp;`Xa ۝V ?Pw%LҮV$Px4 E}4*gt8Ju>MG ր {\|V:c 0<0::Q2 A|@/AEM 1Pd`MS^Qkc};{r,G}P@KXdit)FqXZ{Bt# @o|4'+E px 6H1 ,|ت3AHpn ` Hrخr ʠgb/d#;H1@ B,ɒ9Xp(O(?бNm/( `(Pt ͧT_#ӥ%)>}TBPz4&`pꎘ87(HqZoGl‘6Np&T&(u6j@Q X^qe ?jw|͢p 910\`&q`8lt#Q3fC(PPI 6*?'Bå}G5H ҡ48hitlԪ3A6Gךnj%|G > Lw>,ۅwu)9w3ϥ8uB]6` >apN ;PO,xLr@XXr+B K ,pTJN UnGa@60􅶱 #u'eT f/WEFUBHP#tL:zZn܃ `$`|,T@Q-s!]>Vаml[MGP>^()h8H"P|p!''(OV S!ص P!f7@pfJaU9H)PE8b։cDg+5:# ?@fXDGF~@SmcXDːB(@ P ` XFM"SkvQD_Pbpc5A*9rP>;~? $B6H RM$ `?(N[b@/qw_4 B *y|C!}jCdEg D[0zkӣ~- 6fv8UUQCf 0=¯(ܐ&` 0=䎵5Z@#GГX[uՔeKٳ'(%j(AB~G_  (ލ 럵5{Yi P[ D:iE4|Jc7FyP,L5 :ыݠRkm m5 oG}jh7mK"6XVf%`#Ox%ǰ`,DMWFQAn2,G=ݱu4> 4}ޠAXZpS@U N sCtGS$z[Hf}r*X *n-RN26= +n']j%V;ҷ/P0vb0,X{3}qL(`qAMۊ~UXdj %@*OkHV BnG4XPX9Yw 1 )r?h`(B"P9l e< t@SZxXwb Vb ,V:) X/Mok @AneA lG S/q{ǧ ` HmJVZ')wki܊3 R"O ޡ#08938҈q8Z4p!#o2t8f`"4x@N&}E^tcc {:C؄kJ?,3`A琧@Z Nk=hփR&PB^HAC݌+aPU!n8 F!䃣P mA=E@(X#: U<85\ V ܥW]U 0jD'K@Q,_T7:.8ixWu:J>p ZߨI%ު0RBl"a XBfކ%r*[JKQ&w|'.{`@` Jl.Op{7,}c8XD9Xz~C0r`~57z$ z6{D}&~epR܎%%r78*[H BAcy<v '1iHob$%`ZX! 䦰#0JFS@qX[mtZ =$Zо ` I 9SNzPp,?p)i^^>!!88Tn3ȝw @ FC.ΆSL!O7 NtF@( d{`Rt;t>dvͱ\%0"@ǝ 堁a  s!4s.>2ߺ3`Ax'f`2}ˈRyfz扠 p,KđXm0S _puE} pK 3*I :qj"bWmjf D-I$OHh")wĢ u+@Ҿ R9,Jk/Tp!}BĢk )[@`p3 V0*P 8~V@pu50ɖ` U0Ƒ aZ >D)DwD M~qd̒ 6"z=QNB8sr $" & sfa/lCFb(!U>\YLqt`#@F`HZV2 8y턄D7$@%4 . 7xPƨtM! Ih2B6@mF(`Z̊TBt4@ к L@.šy8?)dP`_Qpʁ%X_:eޠ`Ԇu`\'o#e ppE#-ʀ:=z㤪 i++@!;}~,$ў?# x <;@@<b"t') YVYY9)JaRh>V1>@Ƀf $`(0Fj0y1kGʮh3  gAj"Xwu^(jnu}OX U<  2?!\zqNvnծ`!4"(V 1 [/pp L8hJ2k_B S5 (d)&OΪ@h)3J:SbxfB w)R@PA2 ;tpw2@JHc3pLk;J-D{IDMK NW(db vnP .p-wPB}HBlz>qe`5K2Il'DW,"k,`/K:c^(kn>(ZGo7 u$ \ŭp-lӐYr+T-] YB_͔Z -܈R  7ڄ*@|``VwG0&-wh `[& 6\}Ve4V#PH2Z/. i>!A@HL7ğۭBv1{>JrqJ{ wh(A-  DGFU,$.ՙW,] @#ڠaBt,n"$ە?BhF3dp8 vN8΄{wD:0q2 HpQ [j 5hEDbS_c]!x\Eu:T"l_,;Q) Xď"S+0a Jn'dX.lR{:\\G풛7h ׇܿ%7~| C%@(@N%Kqw1>,7@)r|j `\D2K1$9N4P0t  ~ U?ԑ.` "jP)~ln؝|J1G~1IA:7("w4=$'mH14u=Q,{O(ׁɌ'<P `$){ `p-CGZߡb@E uC_S".ֻrdXGwV܃JniӈXu*S- ' o'd(,`:3twЋ0dCؕ 2!&(psk50ݣ?{ }\:1@G`د9p_\ k.uK :ph`J|s7Ljـ%]=RiwD僦P!34Nu!=\5HXޏ qJ}j,XF1 7^ބ9R+կ0XK#DqH?b0K|OṞLr\  !L,#9Y'r%Y tk 1X.1"QJ"l`sT2K|49NL.+H/\D*4bGB%mB֠nslX[&@1r`^"* 6P`4DBO,dE p ;JAO6aa ?FN7HkAhxrMI+x1"!#disr}=F~(5`J2åsJ ˨%zKQYrS; 6H Yzi bw! Mr <dk r (Ǜ?^^8ߊ,ˡ@ `)z?7:H2q0pFIhfLm(LV}~U.:Ύ6,;Sn,.E_h3W$Q bj4`pv'T:58yD(N(@P-a$atb&  'Cu ž@hڝݰ4dw,Z 9Q ȅE9@c ?p$WM JqCww:v1X)KBiw:y܄T$-<F#4@B{$%]=@,;P}avH`-0 ȉ`1mxfB wjtEl]+9RZ#3;/ԩ#=4b+*|uv#]\r e `lz}GZSrՇs}"Le+0}Bm$8JDxOQϪ jwhPM9t2 Ac"- ]_Nkp 4:&~ 5[ @tLspcrΫpHuv4  ])&ܳ0>pZ,-L6BSr8%2BЙ ՈEcrJt+: ;\%!B>tB *콱 2Մӹ28M%GGf(Щb/ p V 1t2wO[kOOH CG@  դ`vE"i^t* + 2 QuxH1dp<l@!($ ZECL(xWGP'bxfB !/Z]N ;KR|^H*D2}`O@Q4&[?5E9[*cm>P`shrlNczcTVQ@&tVZ-zA6lháa&t k2dyo @@0*v! ^("  lMJC}Zm7!#9L(ۦH@2@m  0eBv0}"7ZOP=V0vaEEz|"|C 3jPZD5!.$A,ж(Rx 9T-*eHJg8:O+d0tt(Θ066KzS44j-m`!'AQxc|,CGS'A &^hs1tG'`/TB2g*f{'E[tj H<7Z+ aZo6@ rN7nHl 6L 8X  "5Q#bo@` @N9HMвm] SĤ!ֵVE= CPpc 8X"@'eZ/Eߚ`/(3   ) ² =t(ʷ: 2yެhDsB" 4QZt @@w`()/Q: }|zPbi% ^ t3Pw(:}\bۚB T_6\;޹AK{ `/x@  ".$ ;fݎw``~^X qj+6{ px42>-NS9&r(QM hJ";J/,U<] G@"BIx'\\[T):DiB^9 ]Ax\@:iFvS3N)-CP.L) tB(`;1jBصا#ܟL+H'3S\X6 #`CC1 C7I&xNgj%"Ê@HP *3f f$B(`/`&s qJ)u { P` 4d> e7% IjB0XЮ :;h` @P{hW&R@\*D Kс0Np(b z P[`:>`}з ԇ3$*!%x')i==VZKb>Xif}h"?pL{e@DוP0hyFN@Ŏ|!N(%hhD{Iԕ X|N w-$󑿕NK ZA֬T'>K R,DԮP@ۑT"?b\Fٮ:oPv 0,,lW;~u'"H%Gi`h75@MvrU+S)!:0tb{IrM1;`9(@ eET @$ PmfJsG50` B5mlaFEq]/ EHB U~ Mf h%<4!BB&ՄrB"hp8 DK} (MA{ Д'A 4fp" aob}GZ.P )/,Tv#nKcH4ǻ+q;2}t/ي: d-E䬂Ed-(,h B:֮( k@Pb>@)z @`@>X f_-7$` et>eHm)}9*78B>e00y x3pk4@(iXtc}B&8ht6 :yBD@@ ̳*pB/3 1('<&`N1(n+[T j]wwW]r? @Ay<P#pYVd( J6OCkHA{L4gh戾;6؊ ;.Ȫ7t:QNq?ZU]p$ 1NCQ BB(w]" h 2@da *zmOf{)  ~"S1p~x6@?3 uALtJ ?s<3 !#^BG cŽpRe o?3R B5%`N7  e :D_,s:= :뺱r7!` @@(`Q1@#0%j` )Dj)áiߢBj 7]QgBtA}9zUWo Dˠ3D(BDׄn@`K0`*5ǟ@ň兼+-mH" `U( ʘV *l:Tf>8H Bo7ɩ TȠOj$ՀNtfꭃ*x^˒ uW+$ E(*5jr ( d>sl,@WpXc#AV)`AVQI^! g(x'a@ kr?Б )`cjfBtSlDѣ|-Kql!wGHdȼa С ` ޽zPt&60:9 k!h |>P,]Q Y[s2fëPxBZ@_C1 ߡ6t8 ]HHc B e;ÑTA0|]ȕṠSwq(Ȗ ^l*=NUXwM: c BfBt،%*(f(~ 2 FCG*$^(o/'@Lz/1A [`ߑ.P"`P\Q%$2PKG-0[ G:!|ۈY1 mԾ 02H*P+` ,_RuYa B #& I4 hR r:{ @}'^>{ 5 GD8(2+L6:Pd3h !DoOs Чf@4VO! U^%r-uCGA@- j/$e"g C@ b!HQI# h/$Z$ݐ;|E0Vs]!;WL' #>^(07CT`;BckrX [ۈ.ۥ7!=~-h~!Q(00sHB@oKf$N*R7-L#PyPCU t:3tnfEP e e:>f:@p=kd`s lB8݈P?XXDAKR,$Qx<&:y5>)K5cvUA viȫ1Gcv0ȉb `:GT܅% X<$pwi XFS Rh8M8/p^Sr@IR2I􅅶p8T!^ JbB F@{!!/p^O )" (p# Yhjx>ZIK}Pr=2~!e+ZE>8a e;ȖؕlE wi ye`@w&?BLj/'D? e= 0,( 1_4Cb/Hu/!EH\07blXzb3O\& H4 0 ]d|aD2@ > )!;ȖQy,;Uvڂ(#%ۈmCֆ*P@^;K ^#j NWnġ B6Ty' ^HuXBSi&׸XB  LՊ#Q+4 y1ۻm!q/8 -9+EL(#p&@ЌW'[zJ٭)$7j(.tbH$ySH'}ė g9Pþ`b 3MHM,` eIe.&H r(zHw7!J2d0T|?zQF,;8I&@dM!\@SXwKPJ F J /tE5,ȮԔ-pEa>!mC#@(@02`P UoCH NΩ+q@(  GH Q!otw | mrI8PGI<2@2LUBGD(*.]}M!-Hn(j< ^ =~sA#N>-<% 9 eFP`%@Rkt0H4jpZXK:uHh B % Y0HF]!OS0NL8-0s/8"Z܌ 3Sl]B'܍^%'[ZIݟ;R3wՕ XFc@"  2hBpi5 XY Fڨ@:`B7{ JyPEZr-XtzD/R @P>K@oFcOn)G%  2B< }P= MȾ 5%E%.@X9a^6{a4<, R-G{  $A! % I0ZzjEG@ʮ C*!CCm ؇Z38fH%`/}a/%;2L9!N-6c:rL |9UsG <3 !;0T# 9!Ђa5 @{QR #nJ/7/Ik``r0>%Z^b'9cN/*b:ߵ9Z8^ӒJ 28*‘%6@ @@d`/_"%U81@gYL}*^7UPE"1r(eB8@U~J`DJKBF*,WRz`.\A  8`&>B )KN-D_CZE'D+Z PPӶ!}W:bltX8H-#˽@">R2P( On'#`+ؔ;gz}GԇRSbd53RB3BT.zq(p"Oa9"amCf =*#ЋP@^ORpAυʥx*hj$G[vO h/dr/ Qs+>zݝm ^HQ(L|H-!IB*!;\_fy=@.dAj$A(@ B$N@ P%lխG+*BwV) Jl,:^ԄjL:X tL\ >W£=, @,P{ H*n5- j =Vx5K` sRw ] VoAXp' =~ړMІ!2f% cX` oṗ ý: gG=6&A=f|,XaxA 7hA>P]W49@6>MO}GZ(0!yz@\jP*1&mpyOQv9@`-JP bxBߣhIe h"rzV%i@ȴ|IPS{c{!F 0 7L#2fRP7"wH;Đ8`L e E{A^0LBH]Aܫ8"Dc7(_V)Kyz@7X( +){I%Di)ț y<m\9&f(jg%j/P785 3c 88m :Ls9@*hpd'Kd_U:RK#o[1d u}Z{U mkV!0]H(Jn# >1r~^ZlP)tXJPTJhHS ؇f3K_=h3R`F# pI'0` pDҚNà7%`BBPQh==%"zC@ٽ,%9>\&h/0N"@m,t5ePD,lGԇ@X(0tXLj([`Qt2H[k^Ap#E&(8o8R(Xz%'P׼A KN P Ƚ*"h0ȡv[A3>~z!$!:eIdh`#8QliHD:?%` ٫ Oq:W *WM 2K8 VJ"ndw8" @6c D&B*4Np%G3@4(,V' { p6CǕA%@7PݼAb%`|PGUE@ h/$[OHXYMC+|0ׄsu+'_HQRln<T"A4sFpY[R !B ]x|F.J7&T` D>fKyR7U&"KPx DC7@e}0v !W G%|׳* et)F^;M ׅcx^P`` 0߹J״W>H%@0uZ ` _@y@,%@( Z#&Xne &A&)gT ~Wx>q"J5%]L B%}{:| lJ&ʬ y /Ld `(P 5B1 # 8r&-{7.O 3XF{"K8hpA!#bC@hpjpQ F[X4 %c=h|A(0.KB? ȄY#K>Fč0i4j P  ?Y9=}GZ(Gh?J`zWpRUB,b[!q8h}|%QD`'WEP FP 2F" 1D@ s^()4 @ _L_A[He"*$_T2pL;A| (06n0Q . !!*RZh RM lS©TBԇPYnjLCS@JXw! Y[#T_ktC 3($t0])z*: Y}o!M!:@낽gXw1R@0rx,H)JH0: 0DVùd*lHB: D-sBt5%`~&"KZz P9)V_'E:fr`_lb$%}\zmE<۪% T! pZdoіXjf%#8Uf@ E*LCc򫻨Qlj8o$|SB! mO҈2mb|@ )K.b/n>3*%L(@E5K@D@.a(@LIJ՜% ~ )^0ui(WzmHg &:ඐ#]7JB|)n(K0ԡ {n*Bkm.Gh(%M0'fr L4XYۄ?`А ,qI?aadtad)"G9#8#lu%~PJACíʕb A+r "A=K@U`va`0+|  tuO)K0@_׳>˸U dJXzCh'~,;:1P>v-K`[r\)Db*r/#2F'Ĝ 1@#!#Sms Q< ^6Л+`p@f   B!Fme  MX4h(@ Pnj);bxtH*棊97o}dУ.#Ynk؆ XFjTt D(&%`Q+*;l`HI[, (pXrDǴH0(H_ze0<f7P` hFrXeE,@8lFlp f$0׋TB` ߙ6$-HJ)F6/M1ksQ7٬A:@0sM)|MU*` pFʄN7g, j!33~h "Ghsyz8[nX o[d0eAQ8ʀ~*(30,&h` XF(.}luP>:ݼ|>M VE )`~D}& ~@idhIT[VA Eġoa_ -8Y["Fi?i3 @%D)&j$5 GbZ^Ŋr!M,}`M8Y6'ӫDY"B# j0h0=@" @ i ˧ JAp^S8@pi9nf2P~DtF%\Lz b , Z pC 8h/䃢L5\8 ݄ T8)+a#i =N(E9ZX4h.%@K0AL- 2\L ,P*Ka{zdi*M Xqi./`7KI}E'ElRV|nES4 , ;Q` FvN XE_(BqW,X8cvp`A_Dlmi*L p}AK -SD|zSXjP:/ T"B3 ?~:[? yQe00;u}/ u0xN#U# @,7@S~7Zz >+ `h D;Au Ԡ|L0P0zZ:d$0?Ҷ& Gm=ũ8>TV)LR]GqFo]zMVB,;_I_rX̑uP@8ý.(i YlBt>AI%~{~!IJEDGz (:@{kV@8L7н,)`'pBt\{,f 2Ma \ΑaMh."]% "ݧo5pY"_6"z@N)-,2X5rÁ@dH*-f, d3-|BEx, ա *m_U9r+Y.#-]T!H"Gjp[iqȵJ"W.` 5ȓ"1㺷,-mÑCJ#Gl$2a =64%B +ș`+`,jh7ȉ1Y2~ K:D_& Xn6XtzuB b XGN+؟7'j`  uu+R Da;j`=FWpV *gBw$ ]'\&Q  ªqV&79ri߭A,g[# `h1lmPjJ TGەwdr0Xy_0ڧh`Wp#P @_hQ`M5( 9eB d",HH*1M?Mp$KhfSÑFH,a@ .@jh, G"RSH6C'@S =pPz ,[C_8L@We,2N!:3tREV@'hA`: i$T2ч4<$,݈3('`ODq>@ c=#:@eR/$#~!_DJ0ŝa+iZ ~;BP R>t>';(0Ulka%lo4Ky0JX[牁 ÷,G1I^|2 tQd`}7c -BtwT"`|ґ=oZ` GfJG؏ 6jfݐNǡ-a p¾J.sU~k /F[QDZaB$KCQk4$I%RtC8S M*V ¡b p f qh8hVi(n% PA(^<̥ @(li3);r"*5'Z9B!يz* @[-΍oև%4r)"F(X򑱦lrX"T} m o!POlE.fz/V q<¥8n8M@#TaH*SG @A lD7VDEp>`S` 1]H, Sth A1OPC<|uT|Ɛ M!{ vP e;^rn;oER E(w65@2@rK5"&" 9̀`+tCV]7pXB2` p'JCDj{ l?=Z~5@E?ph/$ Ĵ±mA :@pըOJA[P֏ $ut6ETR p9$vh= knQ%D#oBp7Y {J"f {atDW7aMI%%WyD`x8soj{)D&H _&1 ,hX$j daD` `&㒞!` NUX94J!@{l([D-Hƨ[=& 2M%4 ,ZXGU b\8k #ưy HC_iĊX5,Y" 1RaGozC1berB.Ci` x=6dkI 7Wԡ( C4QLA''yfA:@f!l,` > DG"CB7y<pȈ 0}lCt%@!Y pkΠ}G $*$|mA@YԔ8J'P =@ d! <"^ɑ [^Z6 eMI@|ΉPOHqȀ`hXL1*ћtsXA{z %TBL@ pH"3o0ۀWwxOsO;-hڻDXXOQ y!y`4`Qƙ# #ھ @&,` ":\T` xH2Ds Q 2f$h/(n*wP 924ϲPzxF;72g1< ;q," ĮP_#  c$a*Ja164g`s]TlɻS"f%p7E(2)Pa!NvEC(.B` xW2@X_x+?2 @CPBw  X 01";H %ۏ $ڈG"5#@è .+?/N 4HDV5'"5Z àc2Hl3Z@?xŭ" & @%4f ad Ͱ2xP X̰!+zdlA EWE/QV( d&};f)pA` HhjCfO#s3 65#$O ʊ( ,ɻS~6({5K`/ ´ vL&@#p@=Xh@Xְ$5!}G@C5즎pw.[_HgBX4 f#uarB&@(@:@]caD:8?6:nKHa̘A7d9<07:y #5q3A]T4'ۇʆ^(2M" c9:N&4@-N!=d HBt^N$4 $%>j`߆!!*AfA*E7|:@9l #vA#̥:Tن=ې:P]X@•` t$\ Ƞ)EP_~r:̲oC!` Ij8ȋ?=Fiưaeأ!R;< @CQ QfM\,KAEz DQ7h[>H-1p4ڍtD颡YD%} F;BKQd J JAlT*G{猊0"Unz".Ouip`EfMI 8yDEK,x9G{F$,#I4@) |\j | AKHr U6yu>,Kq@nSP!yF m Cajk?.(6( ^JqQ{!$ !aQF.HiPf LQ:|,pKH@To2K66흃: ?)<ܰ\&QYFM <=f` ILH{C'ZMU#0}m>đ)_D5jpQHj%&9`(`?"x*L@vWu0X =}dt8@VBR^(!V 7s aDkA8MHm!  t4-pl̗^pM%fjģɖwh>M " 0 9vBP( Di i -I: 16,,ɠ >%Dm\, ;hb鐦k #(u$=t!dآVArcpU:J!s thZ'.M"ȇK U (Uq,'B2h:%G7u7b!;nʋg։b `J؝潠7MR ۢE >D-G@@$jž3W=bKw:(i;W${ b l9v ,IQ.kB7b2B8ZJ`0tL6'}dM@V|/@S&b.~ֱ|,[ S% *"Qy ܁;l"u5h ~įE P5E(Z+Y.xOB !!=A, 81`  >b  0XT(t1!Eҳ(p`,yn#F}&dqL0kAxu!E@#xt# n<&@`r;b , p96` HJچ^ 9}@ZZXP|Ȅ  HW4Edcdp/8[FSh`8xS=:\k+Ra@>`֖Bpm)yg"h} C;Z\R; 98ŝ"nL7zb~~  bYg"B' )b^ X8/>;}TB &$sqO[ L+dp)8xH#+D}!vP%`*2,` HI` JRt&;Ýw4&_h£7DUG߷& j8ÛW@+p Ys: ݡ ҷWSPOԫP a%;Hё@{7FK8 28@,SI)y,H]4(. OvPPج,,6,' Z%YK @ e0CR5*/ BXf@ |4~0}Iၔ,\@D!ĕ`/TT`ɢ $[ߡm}1oNl4C*$G `޵Bt5H*4 a=Ub> #%BTt]މ |F"\>4 *a\ȋmI@-R0^:&_,I_ A46+'M*7aYdv4t+RU,1)l\XPd})‰E%,$*b[,K44.zi g@ƶ T9t !PDcaQ@IL@YW8Rܪ%,I ʒ42@}',ѐ]5,rI{{x\81@ͼV|ę$[4'tΨ/rBZ}HbHG%4M0\`wrEqI*SE`H*Yࡨ{ JbNH3 `2Kz,XQW(8HO'B*3d!2x 3B=RAap.JDNb6}ʡGPʷvuS9hk(G3@4hg?JS 4iIqUhQeR~=B+KCn ]>HH =Q5R["xѝP/Xp=d  hMJՖdg,rI3Ƞ񵀁IV.\|`WrnB  L51Kņ5ֿnU @Xz#4Ma ƪ QP+&MH7nH" eCG>eH"2K\Rt pžEA/5ZXRƠ`l9!:` "'[R %dqtjR%KFj̡7ͳbY,#5$/@cvRy uP.ih^Xji` 0:`E%Q>5"GA؊r<)U7K3ZL5KdFnV!.$``"%K `eWXzR@! .M3 K\ "ZF_g^6*S.<59A ܈[U> +֑&@*,~IT`5 !w[{zx-}a # D?G#XnUGƱG8 D]6,%=(`8xD1+J`!%x)M(P 8K|؈U0tV $%^&-&7aT\F%E1E2}&:{I8y`kU4yO.@X;D@!AQc! p@\:9a XǾN &+p&oBL7>*g^+>=@!0χP5vW%rA ` $z|&-,~Ƌc @LFPX7ߡa8*l^)RK` PL8JUƖ$ &3:/yr&\@ J[ T@A HE3pRhʈ N"p4~u%t8j~m H8F'ZDA.I35V)@iOPBDlj&(IOJT`ƵfT{*ԔX I4Q|%*k7+UA%lh"=@ǽ$O008A, cD>YKJOWⳀi/(ƨ#tf^3 :0VR+,m^6yK %CWHt 2s~!Cz`I'XʌIjT+i|>7TeV /M(T0YuP@-I2 Zصi3h0crB%1 rX; p:tF%lBŮwHƒ[Oj'AgdtE|4R7.?I dӗID =$ QoX(.` Pчʑ @,L 4%5jJ!ut9_:eL lTxu?3&@`f^!i0ph1,I*-myBT&(Eg0N lmDP ("g.H _RNI?a/QM g{SU8C ]gr*dD a PzȨ>`ґ9P-$,*<4$" NPڭηjXj.r_Hj{/0.erWyK?R $6,菥=ŒFdl B*Y/ `pi/Ĉn&: L:Խ, *4߸ "~̳A` PJ?\pmu ])K  u"2RTi[8m`0&82|Prh5`DQe|/:#B2@ rBt<|lr9 $G׏B9-Jh = @, L*dZGdAv?l"$)ePlAB+B2Xp:@N Ϲ/,`E,T3ysA">䤋*q/8ӥģI^͑"*:OYlȪZ:Y5 ƀ)V$=VCL [H"CB7r̸OȒF5$b㯽#Sr+|DFYEv}"O{&]ÝP`0 :I[2\kd>EVEn'%!Ժrt,Fd"JMƌ_,nJt|' 8"(-Nfd@FUu,PI*"[J{I=KEVP R;XBneHN5Kg>=eI| 3Hh^^@+Mft[s-}Ȧ:nsrc PXp2`* dL洼ό에X2"B>ab7b,1]|˚CxE/r( I.gPI%En/@[&I7@ `6hdRMS ӄdkgl 5H@~P"7 KD6ix%Z6䯨c'Z *T7Rʼn dB"m{@a MJhz3#`,iRtMc\~9@!>ͦ{sH#?C8Hܦc M dF6ykgdhj^(v1¢+0d K6E !H XHs4r Sn YMdp ؄A( ` M^ZmZ`8O,K@H6 0fhdm& ${[t]p5Pu)%~hd mJcbJyrIXHA!6r=a 78,^J*3GXu+q*>2Pcǡ38tHB9I}3 : 6K@k6EU(ȉ^^ ]3'@cKr0(!;,2° cu/E@83c@ȴ d0BdeW=zA@B1!s񠆍 Bb>A#(! 9icd >ts: 8> 4'2 s،@[bhKUJ}B%ʖpZ)7 @`%0.<i)E" A`H R Nd!At"̩ԖL'2H@ڋ],4)>5 \ 9H mTBӆLѤ,`8G3B4pp!*ߚc$PDX?]xFw "?h ֔HB U 5yC0)]A![F_!>OS Hd=^Xv";)0H# :J( L P |P&M;ȿ0hӷ l 68,A& Ea7}6T5 7V>-=48=tζ5`FaB `h` PiV7(*P%A[QhxH JLS,}dNG1@`FI1.I @R_MAzL  Xz;{U ɼUk.` MGD%&k:$brD7K0E6H7ВEMkF}&O *hc pf2Aiߑ(QӅԡN|엯sǞBm7YR񆒋M~怨1'#<\V,`n':}t H`p7Pdb%ɧX?![ p)K-Y? $Ҿ|BIBX$24P62P!T ^DJPֳH*~Hq6 ["L,@8u5NhAhۭ S$D VR M%p}MZ:ToPP_k/䃸)Lrh$oBL`@ ʼn^bZX$pZ+ `C4=oXpӢUX MMhB^Pr J/pH`$C=@( Cߖa@LhCwBt,ho9Ydp)<~@(f-eAK /;8~C:@qL;-N!:j棐?re!*p2LsRBBQ>9h$2K AU [pb*E!ܛdKE D qJ>'e(6-ʔ$rg W {~ ?\df,3<Ȓ!;MJnf֛ 8" P@*#0L H1,9@?>h,RK@u >{XEb0 T')`:{ `pY8":ۯ1|I ~01$9716K@u4|?L?Y 9%z|%`)P1XRZKDX t-[6 \ԫ{ @XzS@[}`QlHKm} 29EٲihKS B"NUZvӌP|2KS6UH^NJK@uhAHY=!y HvИ PE:/\Ĩx3M(>0s>#.bd'_atHQ0!ؑ >AP:nD.%A{,P9@(^((I': ?N%tQF$R8C b*&P@bJLL..Xgfp˰ 0 4`a@nK,"HQk/T:ߑ!Žf#,hX"_0$ ޠ[ ?Y`i0# 5 F{[Q!t-u|m%]1 gEXh ;O^WlFT,Em56]qeCu'Q0;G+02 _%(U@9Iz, UBD :@ L0 &`* U g ]58;@c|Xfx"B?Qve ۑ^j4N웡@h` OBPB w&6һD@ˣbHYȓ,Ar+qdp2tVhB_vt6Ly8jQI FQN䃼B:@M@-rrJz,380s2cs !5*iP! KyR bБl{"5X]9P0rvaFxa$ 7 $R@ V w9 `IbDH "q몲=_h&rw/ % = ZH!VT eht(ŦI8=z[& QA2XcrB* .F2Z0IQӄWQ*e,`0B&Ԕ2B8qĖ1>2HJ"ͭ)UI]r|o=T* :<d7BUVj`'Ib1 O9֊u-~)I7@Lک8s c0óxG6R( =;Ha}Ω$-ASPȄ:,+CO &bEH`Md˰ @^ 2hXU>8<aDC%`9 $:!ԕp/bGی 3D8AP~Ėa(k*4qJؕhZS>" Dn)`gxT5"X\!fO(P 9/ Rc OJBtd(@@6B R|0>kc~e؄:Bk 5 xA1OV}MDaԆC;"܈E Vq86@|>rMك!/O<: gh ʂE8s0 P?'.A:U`k nuP X3Xfx,y 0Cdݥtٔp)xWܛOVm/c(ZJab d 5`O{\QLN6 @![t<JG 3,ߢPxP%h[IA%XojWL( 8 Lc MȘ ʄ,cg62,8%))y%LED,PꗑG> U .]c~pSb}2|.B4Z!T:tYK~|8*g ORD PQ4 ʩA;lEP4bDK0_YaP/ ݠY,x0'7ئc[a:$sj*jt`.HT p [4D%B fv@}'XȲ b28f2H Q1OQ1 [`ߑ0R e8K@2ouLj 9ћ T7V;-П4V ̈sXDl6Q7p/8&7H cBDlI:PO\liQQ  w0#WPyTDn{ ' Byec}63 D0 ƞBK@ @}P.i(6f FPQez$AF%`9j iAfS6U'P"G%8X0,M}Z̲1uO- 2fbTVIZ @ͲV Iu!2,`<=tI%7%z$_Bg 2 $Y&?96R#P,kbrՇsbjr0GV @pM2khS HB@F؊J)C|!Bqmɬ!&OԲv^,W ^MAWHnճlq)DkOcY] DCʒpktka@!jl p-  ck! O%&.? c PtbU3VA݀ESx/\A9P><}w螡)z(J)AL%o/#`Ɛ5dEP0Pec`&j/V-4!MM䔪J B"NrYD|`y~ͪ@-rR<ԣ=^We'0 JGueQ ><]`jYZ/;X맰D񆃓:+H (l%4Q @#CC@XU#8"%\l((h؄BK3>008{ h lAVK-dbRX(t @?lB@ $Rdލ TB`0(3kP<A.BBm@jM ,$"B6p"((2yXxo^dq|EtXĻr @uMd0$,R<;@)0,O~3 }R<"RAphIy(c(=)^*Q%4Z 唍dlpAR%`zG A(_}K P `BcϣJhkP_ yZ!.T>-`% 0{"ʟ7`?L(oT>8:F&۽'^V`Y3Jl83@ЪO &)EP<\mz7@ `J` V3L8D(]#%.jiΣJa #YT R$LB>"!S!:hDCP> 1$uO&Ite |`p#=DwM]Y'@ Π,`i)r\P)'^/{~Y ` 0 @ \DN~m"6;ĵDD(*F3d4ϐ08#C' . O#K7"*PZ` \78{BD2>De1teXD9~XB8p^ `B d M U=j%O1B9 )\05-^ %bִxdA*` փ4{d@~PHCRM⸚[ʡA8d-GAM %(ΰ0 5!P `d`jC A}q Y8!/SIneChARqB& ̬Q 5Z<2b,U 15Y!-`P Cz0%9Ei `(G{YP0 J[ x(82@E";c fX]/{T"PD -$0'84bj:= mK g@80rB N(`+d$` X =%!ww<> *!>t"N'/A `8F?h PN(^8`x?R~bDM-hq CoUEA֕$0}1dA8d)0*RxC@ʚxlTd$WyX{ab> +PsB{!@H1+a9Cw_ƕ ڇ &@3r/8=353P;C%(J f2 s-H>7$V] YBg:\n=! s| lp*@eLi TBB@ABm$ԝWBALDA pOY,66;v  kB:Lv@٫KO1Cu2p[;^D[M˂; @ x &S48@(0oqc9);e#ׯ*)( (0 J :q4A ЪCtJPz_y%\pcE8tc:VITnx2<Gg&'pjB/ähB?:@dhUQQ9[ި{B9*@Օ$0J$1e1 yQ$D( j,Р<#(X&+.O%`.:fVcLv uJBȠ:tnEzg@;QxUC:jzz I' FxB7Jȋ`W!x0gaPDDO *hT l;UpHD3S(URLQG JPL9bH!>pmy}E2 1*!#5L LpB,`FOGzm$P9H"A/TH=8[gah"S q؃Ui]A64wN( BG Gqa_b(B_!Pz-tvgl^@At !!**vk/[;: q&x- Lfar/ : "W_`J/FZ/{!neC{ Ђh d 5^}&sBЌ*;rx_OHrz8%!B>qڰ2$ }f+G,@g2dhUQ&WѽWE2.$@(b/eiązdǬi5` $7J/Is!t6J{h1f,Y31{>cC #E2r#+ hBpzUEy` ( PBō@_ڇsGl ^DPznxiAC72Rh*W dqZ@  ,)(CP D }k!%F 0߼=MBKd'R1oVe<"ʇ- F`N]$PMCowQ`82+9h(CbgK9F"fC w#@(r/|Zf `7)xFsBt Dl? @ @PM,0P-`P` Q޲7!e@}_5P`b84hw'iav_@nBV#>Q IJrCM(` KC*Q)1M~PӍ(Mj.ŵE(gb4HR Cv, Bg#HZ  @ce~1lXB8E;47L$# v{fMѨ[{M8Lp H(h,ЫJEPzB Va`/(ޓ`B+E. E>5x-.R &:%}rOC(TB׌ NW(:{pp3 = 7B$B@0 Y XhBy׆|I'A 6^( 0T}!T;!Tl  @a$3Vp@Ap>@ }U@J#҄‘aM  w@fW޽E$0 (eB,&/WDS>( JAJ7@kn''/b/Ih++bn)B'`Q 1(gW)9_JDsoŠawt=Jpzά-UHs2O,Y(kS@ k%GO8)P>+7/# Z ,Q$tI2V3 ؏W @ u2C9@ Й }%`h2B?o8hv82bxfB56@KEĘ/rպ3Pa*=@)t e;aKe00y;@OeIW@8% >jXxo%`$jHCF@-2rM(j: !Β@B+yoG@99^hC6 4*Dt;AxQW>M!F)4|@GA62$n+ыa mNY 7e88w%C2g AZ+ n, "Y=+JZ (4bUlB+Gv |&:B A{H,nBAhn7CHK($Z3DWBH%d C?FCyQ@Rl@k )\^97RdkqR,cdv.H cY8l tID@R!B ueyh@>3=2~ba'B8h"(y"g2dr(R'p+LqwR3OTIܐ3 oH (46 NDx`dEi BEZrQ@tEA )?Qb `RGw`pҾ[uhp2 Fy\ȩ(f#Ua)ċ8" M`P 0oOC)@@ Pe:Dkp*#&`z"Io 4 EjK @`ZQC S62rdI.Z*9p,n!IcE(*-@@Mx,zPjJY42&k8dX0m" @ hxϤ`dPkKtT Pʸ8(%MM8XrS* PR9}H@kg@,}W[}O< }l`9.` Wn  <4F%(b/X)ekDfCwXA 沭 POX>Ģd#íǑo3x)` V$Hc+XHPPbDC% Y]ܮl=⭒\'큔[.VqAKn7`2 8l:3M'ڇ @*#UczmuXdƸw˼W!p 5^y̗9x YPn.+2(c$0m @/PBEX[Y\#, 6e6Fv@2 %FMݫdOcK)Xuu-}<*idNɍ ]ּAT-%`w ڴ3B; Jn"V *ă%RWrN(έZJ-$` ^t8:aǠ4ɭ Ûnw;JG.e/"ĂR%"s%KAyM *ّ*? Kyn<j!ݬ*uTG$@FKc,3PMQYrРPQ2M֤-cF\{}7`!`&+@@(/j!mZx|Xr_J a_!ڋ(l4 >&&%&ZtbJП0K,,qѥDHt*ف%:fޠRzQXƔj얩"X f P*!ixf}@6@SENR"ܺ,@kEv@ HwGWퟜ7%%8xJB'^p]4@B('C:'@O#y,[P^E0 +|mQ3AV<-oI*mCaơ.&`w{"DoBIN 'l*,rHXy :AD}l4Eq`P6wG7!V[j_b8P3 \<W*%͏3v[Y' _#-gٔjDuM)R98T{8 |5%' oYChtS H ,15BK%t`Q{-HPQp KN %ĭdkoJ*+4mϒ7XޔlS@pMpuPM,pd *ܶPrb[-DgK@tڳ%AZ $ '$ψP֢Ƨ_.i+JoL7f ևJsSWF"m9% :i; \g xS.L) D IП`)*A%FB xSO)KD%[pPQq?:FN={jXzjZ/ĭc)jBSMi$XyaP@OZD Qg nRot1tX y9"3OHj ); 9: A^薌 %@O/)A=U= ȝ bRH 0Xy[֝D3Hp 6d:A`P"2k4[FXxguI>$MC.owQ9mܒޠwvi d [`` SJd/M¥X7R@ztAI(_> LV2A,}P)@O Zgm}oLw}h^.*j >%0 L3zA =ЭOIXXyoRtDbppSDYACA,J3@)  LgozG`*np$%<Xʳ棦xeBd7HQL,QisP!@S<{JXʳ)%6KʘCMli*H}фp5ABJ@2IgA9mKQ%LЃ0w.@~hXbF%f `TևԿ' U(ϨkT(:@{!!T"`sPC:0V!>*go O4hg ,vgoI,KM1agA :)۫ h50X 6_T6< C^p-q5CwMhX(jiTe@=]!Kϐ*K!OGt NܼA @ODPR\lJ#>t TNAPM7` T*SPO|5 j O[0QD ~ʜj۩,S' X:oR}t*Dd󖇡VҟM  )%%?XhY*KT Tk%,i#wH26j˽&=s,J:ЩL%U~@ huGA"I*koJz"bpn2 gT^AEK /hea d5rR/[̰Y` &ɠJгTJ& |XoP Q j!HQR,JM8yS 'C("IQ"@@i͹׵Or)@_'%I=Ma TF Z5׈ ɡVho2*EY>':@fv`>3Fء$@>6:`#T,<)>d,1:]J"dʟkݥ{,Z3@)Q /H*f,ca @Ъ:%KV$M>ٝ& s zfHnbD)pReʜl!STN@:@-&/gkCZ ˸%X>d!{ P`/P&=@`9C ^@ E4, Z3 TB>,HV-YJhr:(*F!A_ F~!jdM{ ep<S| K"|t SA KrX #l O)-5)UEd%@(RFORLh= 0 f5*Ha `(53-Ce*CџӦ&&@R0J:BE,)BP !GK@ ^b9[F3 [/PhOIR #@Ta `䝭J$Y  `=KRv,<3@)B ZkXyR;#*GMU%!)` ʄE{X&&WNv5vj @Sk@2:@{P 0EK@6֤D mQ4,6K&jS(qW"|5 *!v2Pn){5xKPPhfU@U k(Rmr0 ГYXcB)c !2K>D= -dR m)^`!/NS s"Gi L( 6 K#j, Zl;9*KtLْI>l@CF^6;B!Se*2OB=KR *Fd {,;_[K6 lPa2KN'kFu9=23vE @ g)7!0%V(L#C[ްBd@(TT m *oqANЪ^2K#v RWAWU%uU YH$O7n(Շ#0E d~*"` UAoЋPTPhS_:>YT!'Z`L Z*_qbvr . UXlj HXlHȗ^JQ,J:EqC{8}UpSD2 Hh%~OU} fuke4&.4$ 0<{h6&b2! \\ʹTA&P08ߥ ? rM,<=@S@U'ZPhHK#5U>L [FZHqU& :KBNM)ɁPx8<ODK,9tvto?0D T&z\eH:L|9 -+ڿQt>A kHPc ;L$iR ]eI>(3Ҁ<2_`HEap,2@)`\4©: ]N`#3]%h DٰTLZY NNjD/hAp7KPv*0AX *jЁ+L`BaZf'tT >s5Dizk ,<}AWI5*oB KR )*KC-$hMC9)0-f%kj $D)KPZ.`aHb8KAp((s8R@SJJo#F;@ƒXhpv(břf*jQvrf,EQPBA.1.ZX y#.^DGTD wPxX yo O0~RK$44U^%yH]gPTg#)`- f<#Ы\`ݛ̿‹BT*;| ?G` yP@FCrJ!v P(4 tJp#3VT-H>YRqX y @qa@Xj%:B1#qCKB P PڸʳWP/ krxwԦ+ g8B.%ӗ3v4${Rj N%@ *8`У dk[hX>e FC \ȘZ$/̦P֐ Q@#"y#%# GZQb.fZܟ!)FkҪeKQGxÊM&ښ7@e3,ʘDYi$h DD(HdmC"L@!QVhEꞴ4$ҚMgpP Fb1kh[ke11k 1,Jy |eajQ^b Ƃf`~<+ DQQZQPj=44-E|]@% )Zc#h74R ³fg80J!PJ8}mMx+Kr$tl piT8k\4@qVVn!K=Bo%T{T%[b)/oRv5q"HZID ќDdm,$ hSt߸2z) k:Z۝O bSFnJ5|i~Rv & Hkk,J0Ѩ:eiK@viԶ/h;b-e>\H2XHX^A߳2] iQooaBHV8G Px i ee2( 7JޛHR4l91@oiw?X(y4'4- 0/וTU@]HkZ=]1 + E19(` `ӚI#{!%t2=< 57YC0Z3,]cJJ1@g hW.b>GЮtO 2BX^{)0<,Mk*UvyҕU+1Uzw%(L t*,sZ5) M2,sT[K1͔oh oNeXzR!cJRJ` xWN0*%SN?uwy0 l<@+4WFK% P HӞf &gl,6eQL,wZPT;ʴrܔRVà*\9)@,7_ lE+oVT` RB7wAS" :z<@``$,yePS&(JP_`"iAjRRx0{ʩiHUSv,Tm=T4,8Q)xXH#S=,|rP:b |)Rye nDzd88&$8rjZ$=qf(y9@{0fi}b fˍƢR:%BV$};ʄJ^UQVٕ8G F0JZ $Q<,7ciB,%ڜlJT0@*,S)L/iS;QVNWvr) BDS0( >JށO @~ V@9RUBPui iodM!PK4 N{C2f않;]RI h)eKɫ&J @X  Q_^(8%xK wՃpP>b_[4Q>|%@+Spdk qT J!- r'Qݍ%X~YO Jp]WZ.I^ pcU:~, z/v◁D Ul7(knJid̘+U>64 QGPk-ɳ𥞶%BR֪YW\ `}eM&8`maTJCJ@eTE>-C, MJ҉π(PS N";h X4y=&@-c BtZ@UXhTee^p'Rޝ~á4SE˪v:04,@&HV 5Y|>>DD-,ABW`7H` (X\:oP ˪=1 tܷ䆗@7?6b&/+F@ L^)"|U8MȤ^PBGS#E(`tO(02!I 3ULx8G,E,KKOl9 %:sKX:ɻJ6K6H1॑V P=L@P9ئ8cB.i[Ԋc%-+ ,SQ8*k@72Zf0YHp D{!%D=G)|nɄB(~UR`gY7%ŭHQP8(ec PXl@R!6 PXBBdD8jST#4%Dƌ5ߣ줓3yX SjT7/GSQ$Y:XM_PfP-!,wkI!'%a~Bj[x)N%ag@,"6Z4r #Tn8R d:p+|w H1,K.D rSXjVT.z4".CMc4 ,U~w- CP 02YɫpX)D@(@a ,;I!n3Cx'A2˜`aX$Btԛs%!,4 Pjޠ֋X7*M@  P*Rt(n J] L,RIׯ_+{b%uH0,xK'oic`*<@ߏVy8)dHH{;2@2ŲT+*3 %b'_ Y|Fs3`7|Z+:>@0DtqD_CaF\"CTфɀ)qaHd_僾>t LgcX~bmIx)g` hnT:&Yt:0RVfjR> ,G%@c.  e BHa00c%Č Zt9!`P @ &> s$ӳ(Dŋ^tiJ` q&I/)q2Z)Brhp "YVELK<K@2XrN9 9|j O~rG*N@] dTِU66a*P~ BS{HYjZ0V:I 0|,DOmBN P},uXtP;)z=E8d HQ(ӠZձ{Dyc85V mJ!9]XГ% 'e|,mS2K@4W)K ` Ye+T~U,ZV]l YI3D8R:%PFt% d8*)0 ݛ!7ScIh5Qx"Y3 he-d(Oֶ/ҵSMZ=6 QFҵHJB- Paɑ(o!+oE1d2e9oIH!aRv5?3b jʪZ6TdWRBOf8 'KYJTi|%+߁#- `,c2%@(:jm Մ NjY7vUցjȱ\*D(XY3:PX^R@rdh@ ` p*|ꈐ T1ef"ą%(dLMh` p*DZ"% W(ApK@I,[m3$]s%(dBZKd}p "oQ޹qT>7*Ej#joR, )<;V"Zy{8Kl{k, L4 BGΊ00y~Qx!ĐT2/jA MSF۬/ w3k^ZҟWwRX >ApY\rfI% gU; ;tp#:}B@ iBSޟ&00KR  #S̰O@nf;qY*@Eֵv;UdxŪ2^ 0Q10Sr5F D $F~!Gɔق4t7:@$_YLP%ptwDl }:j1gZKTOyPڢ Cd8X _hY|<Ϟ #(x6yU<F72x4Sd)@>0@yԠmQ+N,4nY d"PtFg_RY S(%78X=#2$RP,Q(^C QaSbYj G%hmZajhoP˶Ng Y2Z0p(d& E p:-Nfqoh,2G](nD*qVCt)Hcpkt"5@4!=pKtRS Ы Q%Yk@ ݞ 1U.g-0c 0ZBt\@tD  ڌ6;@{d~ \M \}T j8DdG9I3d##BLhm9W}EJܒ%Zk5j>bvVhFH)4h,FK3@(al$ڴVP-4Kђ`u|Qk"yU_H/e׀ 'Z{ $D[!8:[|'W `䄲H9'`Tpɥ7v:>ID+$-)G5Z޼ +D%h鹢_P.d% CYދd iB@tm0-_Z~ K) 6l}IwX TX: a;YWBև9e(dZ(V #r\8 :@D6?֞2VӪ宯>d9js[W!URBΗɋ0OB K)O dF@RJ)'A%'*ACX 9bTtJ H @ RM600eȊ4,<{Sg-4Ap2I'X f- 0 @*Auk*Ra}; E-Y`B^d@tdxhAtD#0i#t  # @eJ^!` { `pE3R,:@eVau;>3@?-a ZzIoPf( !/1+Sig7*0j)s/P%^8,۫ %^$VRP QOpB w9jmb ZJn ih:?` ո*lfӔP.n6O!Ol \Y6kR3  ;_l6C'Az@p`}ݤ%\j+gG *_#h@u7@&ahx ^@ļ R 1e,2@Sji$0Jo6ߞ`-Gt:`3 !u`z<)dR+KH7tc(x̕Du*p ʒ![ B8Btb_ ZmAU iI lN QPS`P~ 2`'ApN iC` k*; ,EZnܚP} nh x:uf$rb@rL,-[FZb Z~VIA di7$>xQh3@ 0m%kBj+GA %^W2}-A@&k`7Kג֍&u&)L.t|-me7|-KWO U>.%KLt At叐s>R }(H lgv`쵹%`lj+t>1@C3 ^-73֙@0`D-0$O C{)@ ,([Q\#[: }m˲4D,&Q)^;)r֎A00By^` 'Q6Ip/ĭdpWPM"WKg J!)@m((Z`lm#=\^9lgmI`ʙż4v$diX>7!G@f|'BH1b |ڛ `+,h&Q)^YRZ5Fm۫` @ؚv6` @ |2Yj3`h!6K–E+ۑܐi9 $s咯 p +/FEK"P++h"I{!4//Xn  E: `B:hhR떄oֹgYҖ2SMe(e 'BqC`3;U~!7%aHXH^ vH<~j [ {F(٧@NtlemXM 7l?O[h  4"3qHk-F_]W9lSb0`ai 8l DF@(02FKN }$a֖>R[ّZP K@V @_+MAސDŽ1"~<7~(^m@O85tf:)QqVzPjy%%.,:1Y)^+r B텄<,[lP[y(B ĖJ(HlZz0֞5 -CH%tzZzyRۗ&^P쵝7oA(!.}jRxۖMQW/>{*1ML  g0=K+])e{ @PU` H1 3S` vWYW[e[1>,p7@S7Z/ 2`IԳ$-a!P$7/$-7z%牲zPOT/e?GGD! \Lj*ȐQQ-!H2K@4tpCnBX ˼!o"pQ$A` [J(dD)nB"6 @W'Aputv(XqRa9&hlMClmw4?#0((.&mBrO^h Tï8)>Q8h{,LS@ni$(ԃ%K+5$X#zli!_&@|`kRh$~AAy.ym#H- F8:-mGE}Q B3܆f=M%Iunu'Z2@E[`N}p/(o{aj<=t;S@U\vx#J APy=U'p|p2}O8,';Ȗw$p>ɔ|}lB͗y s Ȋ4cP#>`h/(^0y.0Y.Pzk0!%&*E:TBnZVKݲ4$lMCMhb;53ق e3@p,1dH2M,e3@$ IaV:r־6` %n xXo ۞b&@Q M,wK=@)",pK+op$X~ b4>L@޲bVlA?-#-TNXцf(Z2Fђ% o|.>]@8%C<Dm|}wԃ;_HP-0$~)/,`hR CpHJ8 b xJsPckˏ"Q)A0{fy䁚 e.` [d1Al-D %dؖŖbtz- kz5M(0 L,{V)$pߥApp:tO`*HkQJ ^('bt M(h;8D0pMP`( !18d~{KU `(d lqt|rK? ih,e` [,??c \U#557B`mI fɡlAg)2n[F{KYOİc x啃BtC9| GޠQS(՟0- LX  2k`=H e2צ(qX_yYUv˧`W*@H `uW|?T`PP0H!: Y[A%=*`lG0u+хRfيǤ ^[n+: " %I%vw#[ r4Ӥ%pf n$hX(u!# 8Uh,K3#`6@>`p CLN$':3shr e*ن.!!%m>Ĥ"$ + CtЫDYD`y/L!gxN H ]`X(ug4x-kO BQ> phQC  Pol@(`ǔJ22)1 iAAM{dNH:'B%='BhB@qW^"P %XV{W嗭lh ^ {*r2W+N..c*^ u.sT[`9` xuJGY=7NH`rmb|N%p(,WjA=K@V0v0$ӽ&6 6 \R@Yw)G}P ЫU$We 32̶f`Y.Rț|k @nN^E AsPK b <3 1; 2~I6 &c/Vg&!DbHF@], )Ng2Fs':3:PVRl ˧j,p$0<pL5˚iȺ՗ f:K47O@P-iюVi3[ z\r:@ˇ**,f4sjHl(6c e4C'mb:3&6~p>6%*l`?Qՙd" 9W pWC8:@AP`"rZɫ `+2L4lޢ dFk+Y |K-OQT ق$˒XT` ezDo*.` 偉&˹6G :\ h{ 0`/hyH qRm /OGbѠ %@Z},ldIː,g*J4M"@3Th%:u3ť EF&M3K  4%B @(Pփ mas%J ²4h \@a4+ $$R|_ PVCփ'S@ Wb;+ `(@0QۿRpH (0bK`sh0LPVP:"V4HYHv͏:~^@eOjK,7^6ukȍ=[5 )гm),KRS 0M}O7: /a\.scfy8v`a`,e@5%r) 3),J[5@ M5bin O6|`P:ɴI =@-NQ(-/&CK4Y9zn-.` Xfڣ %`lHu%`҂E+bp&"?` j'@P@yَ CRlyzQ"R1oȉf] tQ)?| K1)vLdyCHD0J erʍ# F"G!s2Y-1f-sO-8q"ܱ e;("^.H6 ph5A4{T}h hKd`s ѩDrI!q >b.oF9F\S9b`W|V1<@gTWT2Q RY*D2Kmni~{+\V|Tsdf,K3@B>HBQ%-aYS<fKL,w?3@s$X5C` J  5 ]2>U1@ђ(| @` 3Ybf ʫzEG7A_-˄nmM <&OjIloQ@t^o eĪʖx@&~C<*PhvޠP]T1ZX~zmC踠U#boo>Qj{K?3҄ d3DLQR\%`s) -/KL C.$=rm3`Ze.j\BԱE0 l,K:@) j *k d.%]T[m#*-Rd0Z @Lq lB2}ĴYշyV` e;(qD+Kׁx3dC>S{5`Aa" @>*-` KFɒM߀%$*Dm'E=.DDH Q, $^H) wPTxxfBi+#2XoNR@Ԗe<.C&E" @&M̥X|$z!ES@k[ASZTk;R₏r|ٴ\`mok+pXBuppnO졒%kdZBd+2tf7%>*Dm^C6K@itH⵷WwQ%jX_ ;yS#Ŷa1]B+cz `h@`<@-hp/<A`/H+zM,W @pb_`V,oͫ`١ Ƅ˓ j`IK>ڲ: ]ȴZB6 |OT4K. @Xty&o.` (]Ld1(%kkXe)Mml[&o`0ږDkGK@ԭ&=?,7@)f)j .M)K@T VVc9yK kn'k[4Hb!ՌHFh&O7xg `[&طvu .GA%J Plz8}/82,(8) &]P2!pLS Xq DB $Ig]'!JL C7\CKiK@R[%T-p#Aa"A!|Z;ۂ@`/u9eK\ OmxIc H]27L@Yդ!%`mۆ٬"X ]@i/ܤP\/JK=H1( AgBt^B"e3e88Oh-wdKy-u9W42,K6@)p2$=w)L@,(CABL%f`~P-堐nn[pf$k˶_t}[K]SMxGٶZސuM"E`&Z,aN!Г92TBK &D9Nq԰If۽q`.k~M_li (hP@Unk0m:إ騜LTXj %nz-gA%n;k?A=K@Vvj5dE(>jpm\w[đKcЖfrL+Wc2KmpAn2@[~;T`hN5%bGN D#&vY{ HٌBܶH8PG +2/ 4%vIz^T7 vZ >\ >mB( Pn[ T]b5إ@p- cQt/D sn l$%,(84S`[ ,,F#nN Wӥ=W3 V &@(}ڔx !_- KU p#H "ے+˾-q PKq4 (:t 'F= pnnu{5!e1@2` 76v|h֠CiDk ] b{Lȡx@(C R!mAY`-:ۢfq_ ]nFM' "Vlڥ201 8Įi@,"~e1EPm\N?1pCb@ܠ}- ob!-=Z+R.VxD l2=b j4)>ۥh<.se6lدh[z a @Jc[%SStYjXPpP`Ȑ.MG[ 8(Dhүt@N.ܛ hi{Itx42B#{ `pAlaQe7vD`Xto5%@w *-E6K6׆ul&tPdG(pCr TVmZ,/rv!@="` ]n^=RdqqE'a f@ܰfĭo]XnR}&$ȫ%r[F4 ElzdǑp).ݲePp$H']1K `uy,6H8X,z%r'rf4A7@6KhXt8%LE: 0pf|@73TZxVR -(D\^ބ8uM82[8&@?4S҂Hz%k7iVh \nFY i1 r!>1̠Cu,(8TQxiK"PmQ%x98 08j-}& Dנ9t=0z; @\^.?}`vK#3CYfJB":}5q˦Y8Ճ#~G节gcײi[SH2m\cpZlr ^d0ba04".m Zn!% yi$g,o0^=>p\%n)g&!$=`Wӥ3V :c;uQ%tPH?(I(qmAavpeD MtCS@VK@ C00eӭ-)c dE&d fLʈ5!NtR$]Vk | @t``T)<]>bk6$/`Ë91e8($%`0ifATTvC{ `p21-ӘXP`"x5Xg .G  Ph$@I!cAj=C(eR$L$/*ORzk1 e 2H&/a0nuJ,[=:3t6 >. }f"U'$w% yI DF3w57'B_q-Oݕ -]Q҄–&2pLZyBA`c\y˓C - Y8 X bhvWo;/<$ @P.ljF"@t {t0(8c`l {4,uyP6 i/&rϲv|cL1-`VML(W` Jc(B( lK @`9 )b XMg@QV@0e * `™~ETB K p .AXfV,6@)^ nbQ ڃ4m0}!mĺ{rgtm,4@)^ 1,``ii3$ ,,[5@)^dj XbRbQtخ: g ᫑DK@P Wg۹$IMX,[t)^cmwp% vHl;  (3:%n%TtD,#N 8L@햂X nh2 . JۿvJ0^0}߈] .B>c ݚJXSnH K@V anAjH88(0,s:lB,[8@)_9W%?9K@v[ /kEPqxY R KP P .+0l) \=bGh K@<NY8\t0% XM"MuɻLZXpYn(gX|5 Z=ά` JjP69KK%yٛ%y"xh-\D`aA]<%ciT#"y,怳CRmԅ1~Xo%% $ D VVXfwM%CuH` Js˝b xh=bGgZzy yGnul,PQ"n[6ٟz{fqi6狇Ɖ?)ອ ),@ޓwig 548p,@6Hq<=tG@(@ `]0@UHV`XA ;7‚h%˛}D nAm`\> @w ,@0:6P,bu" K@vi^)=eT ^AY=K@{Y@vE* P"л= :>лp<,rd{{e0@l{-:x5Xe8fKB G 1>&фuL-KV ]N.EB$ ?`O@`GSIE tfKu9b*HqK>?`-F^ e_@D RF("ªl߁x,eE[8bWI[$j?? @,\[ ųOIe\0?to2f*H` NJG!PO2ةPQ:-t/hX.` ՗#/u9JX;":Z) _y-F KV $,QvYE_/F;0>,&dTc,ͻ C7: xvY kGP&(00=KVP .#`=],;@Su75XAC@(^('A Ke&~Ña:ʾXyRu9w ;o@uy 0e a XzRu!"D2%y;}:(ˉޠ*.`VmF/7W9 @m63p{]o f @֗J k_Wo9;/,F2" /x%E2Z f\ [@q27 `tqꇸꍢD%|YzRc>2x9] b7-JrXIʉk'A .q0ܮm/ @d@ DbX``,ȦޖF@\C1aXR}DA 6U΋P> [ !a FT,x)vQbBT) R`r庐(@ fCe`0`x3-8^H'AЄi0ge iT=%P8c|A"BGtBY\jVҼu!0(&`q_+c[*@h 䗁Vh[`M+<h D3@ãB0e 稲 { B6~^L5DFHea`@e_&Ui0 Ⰶ{Bta @@P42C2X_[$6Bta` pַlwoe@Va pު ӄ5b-HU#z.,6Oh6eD-"C,(8}t "PmCVƧ@ģ|yz"P\`̏݀1\B-1/|`j6H# ڔXtl`Ƕ#20oAC`0`K*Z`E\]|F]ޏ 02Atyc@` (`>޶"HQ{8PPMC!Ƭ|k 8;1F 2JљևRȖwb>[w}wQeP IetvC1mfcH iTBYkdsOԫ @3 82S يN 僎 @> hb:Wxq3OzJ~ϴW&:/|84i)K@0͘ E*!U],Y(7  ^N0acF!2bX0mP+IasCy$%T|Q\La Xi*,6+mBrmP>@g([H"Fe8Hr 0܈1kڣkvc ݧ.MAp`F9ω@JXxhS ZXxe}Td1L ſ4@S"0PؒG3Gq!q<, LqJtZ< %Va B0?"?Hvb&la&EZn] `<`ԥ6t]xOZ o#H' 4~bZ%&pT >3z haU\ ^P a1 7dAվoAS~980 YHcMa qn- " }׾JL @ Q2ߵ%U(VPz4c"f% zX ,R \`iG7K9{fJ Jm0, L0Q~{^ct+,[5}~+n>*D7:{N(! s9(^.&9kEJHk` 0R@U"@N.n9$^}9ֲM2}I:oDg, ̜Z, X4o\9n^<o# @h4dl%\`Sh5Lz/^fdO&~}‡dNyC% #PI%ì܀[+c Btećx$m>fx@|f fV7݂H3-3iAATfa `BƏ@9mX=|P>riB(s/Qv@Uc]Ct>6aQ&B6c U͐K$ aEa"`"ˇ8<{۟ p!_4SR ^Ux. HD_ (-PM('l2x0IP&{[W  h%AanD 'Ion**@] BV) Xxt (8\m/ޞq$Å9QJXDsSvϸC&%J2+.D pMsi@>n)F 0h'2BKh`^&t),Xh``̤HSO$.~ -f+/ /X/{E40;F :Q E\0EJ#`b/<Md)x K 0a\0eBkՒB` (J#㓉)!pAo|knA . ȚuQ`ʞ*=K@R 3xߚtdRn6O!4G ` P~Z   8!g`0 @dlMYo m.KȢiJSIfOQ f0F2q# Bچt%0PNEַ$nPRA[^P pXxJ0_G,_:E3@ @#C2xfB,JS8>8L 51!^()q/U`Y?.ª^lA X0[$|m @Op#Fa/Z/Mļa3 E#?14&% |A'$w(rtU[Q> Je0 |0}oժT4Aޏ' ̕{ ?B'E*R:eM<3 @(`),L8ҾX/J[MCtJX0 LML&TE>)Y4}_ᅽPi_mgFS0_jt% `003G%7mZvrB"[SVy0F%3v 0]BAK0O P 0]V-L0x-LdHi'` ["euiRL0`p 0̋}NاG*˫˒5H;N`s@u9B )0K@wlbz`s@we> bMbuh` @Yl >Y] Kʺ eB6oDDàS^] PN$9flmX_\) dXC TR&:@Umf%@8Y7JBf @?Qx :3tے6FBN ‘< : kf`l Z"tD{!6qh&l+֙*dbDW*6  ;8a[ua@e%藇 m0FtBjF(`J@S404bs|!9f Rײ1w8bhE 4Z%U(' }AV"}UegPk>1Xye23D\  F;攼,d@d`p>& &`mƜJ !Y>c@% I0&A`0=% Y_]Zdt țl%H:'@J|L 58U E(@5AJ7K@ m6XX֞ƭu ־6|B]%1pBKӾCPz,.(eӈ_җ9q* j/hpI241QS =8R\=D->hsa.Ƽ#'A iG$m.94c _6s3~>ј%N91j5,`*LĤomCUD.,[5Ƞ?ݘu % |jY/,VZnfH3UýB|BO/(&T9p#h*W6[j.@q!%0c"\b (,A%Y.p*f&@aGLj -HɈP F>ph0oIK  @ )Y&q@:@*1MdnPwˎ `l8 3ChP4W+P`T"(9 hbw f`/بZ80asPPOp6@IcT\knK 6*b3 s!2fw'؜c1R:f$MCowpU,'Pܵ̚pQsƀ U阗t@DrfnQ|61g`2c/b48?簢PF"Ɗ% [mXeLSư0qN}1@ @NOc '!(C ^9 1!ƂL :f530J*T!e!^@]x3O@ o=:50z&ofߑ.o m7!=}&t˰ي X b*5( <3"h0` aN33QXU %>0C9 ^x0ql!/ YmI4$>(A@B&BܒoPY E(RLz ?2ٍA~OkP!J&W.)u7n0:P+^Hm%x)낾22B4+$ < O4Nli$GhhjIZ dl+`ǔ6Czϟ*oo'A-=,*@me6R hZ :'QBxxк"T% 70L@6Xn2!:@ bAPZ>$.6rh9T 2HSԈ572QdrOUbp,%H/{Idp13 (Cp(   `LMj8=̑ Ȗ˥ SA>m8c(W%5ju0,NEԙ4d x ,Q%@a0vK^}b0 /7D#hh F;L@6[YFۤ#7.x0Ef1(xXxh5_05f 㟑(ސɣ)m7cIS +2: l6ɇh%~>?3# 0wm 4 y2bk6/X/TB #f ⮨\C>? M!Ā8 s75 ъJ fåf `I` (J>\@FPYn~8h` (R+9-Xj¼#\ ČN~=La ^yA7Es9ej+1Bt @pb)6:{}=ٛ J` 5J>I[XKNDVk/m!oÍV,A۶~qşo'BV b f֊%[ -=;94 x"Ҋ3 ȽU2/㟚pX( )ɱ1G%CXHۦ#spDi,;XMpDQB4B %M 8NI% K*mΎa3Ma` bƶG&.U‽qwi!, MbsK '܆d})rms$~!:_ˉzJg(6@ *~ԃQ^;/'vI1M4%f3@p C 24yJVX`>AMV)ɮ3C3)Yfv"bc2H1`53@ Y/\ K@ hqp'{D]z>s. Pa`X~ @(PhB"% Y`0"If" D<,U6K@t 82SbAC[^z ~nƃ%k(ABRS BѳVː@|)^_]AX&U JaubT_ pQ/jˁa>dN|m +`F1@κFa|#8M7F!M(@ e a(j>k0 Ց{Yw0MqYH1,L\Ri{/GUDMzXXXzӶCBXyp%@Bca2OR;:@`!1,`zlJ,'A Z`@a%e!* !4 @%Cqм` 0bNԐߡ6MqQi[m[Q<y VdpEG JpAIXyb,i*nB< bA8#iH,b*=)Q%f ▹PӐ@e.Ô k \p3M-89ϲOV8#fD`h 0%T@]@ 2#x2KAR<}A,|"J ,#fij vF*(5vV11:I9k#^:M*n?hE,GL8"`,`R9.Xpu3sd QX&2@ >  GSHv!I(d 4U & B:u1H5K>ΈɬfY%) ,G:lc 8b`XZ[D_2Cl%lf1ZTBtp4n : D` ▃0$ ʉé BD'& ($N%@ig@~D+ʡ0_JM4(%TBĈpU~P"*3QH=RTKP 2:YğPPzf.8tkFf;p~ K@6}d 0₽jNQă lNa/:UCe `2$dl)dmx@:gfp.IpY 8R%BF@P4W` 7f:?J Rvmut,1P 2(Ʉ A!.يO =+dpaOLtqS:} ҂~>Զ%]s ΁=+^(): +?ȇK{ =͒D{Iӊhg,LLP(dZ wE(8j UJ0<@@J۰Շݒ}!Sa`/% GJ_0oP>4̄-jf/:{^p)"P7 @U|y/Mfn @ @qdޗ`7.Y_{Ie8Kwvd"Q'fw [HHX.W.O8<1,K`]z$`eS2 `x5\uV.Xc`/J@C(o[d N6%0;.(mz. :[@E4o e;UR0AX(!t:)cTODr!Mro23l;,ؾpB,I,D_ { HX0w&6+B˓Us40# N! zzFS®$ǥ vJ5&s5aEr6XaHޠM1C'o8Jr|r)4n 3H07seaݨޠh%@<uB qD c NKYh-!D0HeK*Q2Apg;4_4<­URHWR**2BD `}p+D8Y0zP^Xv q2#{542P!G"@4r3o_ CUQ$94fqJ|! @Ʃu&*PbT5F::@3`j,sRɤː"4q78Ɯz/19 {{Ft Ha^H'Km)¬2Q *RZ (fv0 hB݇~c$t]JݼN&s'.n_p0;BbLH$OEŴb`(q m 4X10 R:}4*i%θ4l6zVt` 0;zȶ2*T+Dr'haz%XZlt& ` b̰e7bX(\㞌tJ-a,0C>NL- R&72AJm8|UD9f/!'~3{A3DJdn(=@*`e1XW( p2FgC@g:PTa\Zd08`~>("8 ,* 6-Gx} }t.!Z5  73,Cp?`>Mwt`>4 ^'B2T;#B՝baPI^ST/0MZ7Tdi|M4nPB0m ]Au)sf &@Զ^fVgTceQD6>hH@D=` 牅Jq(VbCLk?$!R1ted ]D`kU,XLv)&** B#6GXYBe,gЂZcmKR j.] `Q2B::I@@CܝW ]8 `L;^(b 0 C]8@Yb^OrAn1%w:k =%H 79o7 QbA.|0 s|_, "G p-E?7Nt1.fЀwHXLkԨ3H9'2` Ř?2Sr\L  b#mB2@S BC${2Xy $ukdD3xN A1CƌS LŷΠM(P 1B-CYF-K-di(vn |K1Ip;cf K%Z.+A.qEP/VDVz3f4hmߚrv La 8cRA?0  r AC"2MA-*m%(3f* @_کHH3jԖ Qay)65m b,< <3C8L5Ẍ́"5ff,ka֘-rPڦ,#'^##]cjfIS))n7&)H3Z$ĐgF`PER;] 2E Pr=@#5ƴ >6&igbDMl̏rƲ "$ j*L981vC~2 z{\tT(yz;k5a 楋,y[ 8 hcrN`\,r@1gPg4Yj &=@@̫!Z%G *Xޘ%+^ % \3ӒA)K p b\ ]TޠBtM4& 7h N- [R3Q2K @3-5s|-" q} %%i+:ZՆޠ_7nIu` xczKU# 5%@E1FnaoMH3JYx\lJ^K 4p:5041qCFxǷ5î+Y^@ f ږ5 %K]` -1FXa,.*, \L`n(i]u|fN Wr$ όlh[qxU&4 1 [PS'Zտ|* ΠA.jXy4Sf5h f:u X0J90)·J \ ذ2B3&t0a 6fnAr|Z{tlX;& ncTuDgKݫc>LZ 2(Q wP`z9 8z2"Xyc xPRS$(X`ۦ(A8'*)z0*D? H( t `Wل714e_H)dP74G'6F&3DG9ǘH#vL#IAVC,+^(P:B uK< (dB ۈS*lg K ɝ/-NP@K1E5M">$Z4!Zo4 l :zDŽ# Vś5юiU&0Pc^LA\J I x3jO(8V'A   eı>Bf'*Wz:@W(a `J\RS4b>GLdRcobP3 !*%W&1K)K&ǕzL XtB$WY~) ][n?:@x\rD[&/}٬32>7@swy2)0D } p#uusr"S?dHfɰ$4%_:@rޠ/k3,qf5l[QD_PH@?@aǜie`P 2l 83R9ǼvL9UZ̫TA,L8@$d 2!N: /Ub5;Y͒V\U?P¥1¬OS9M"PșL\#)%ż‘}$̈D `L$ ?;&hAxb^ 3srsG~/3훾}"ľ3e{^2~N&JS`K r/8B&^@gK@'W&Dv;C@(0 Ju-^4d*)tQN62Z<A%RDIน0̬Lμ3fe 2֖bWM"SFIru6> D6H Gz~Dfhi}~,L:SHD@K>nq~i>Ġmp0$#T@QUK Cc Bie^ BCQ.ѐ `\Df @$,L*`!FpL;KF`Z tKyU#H2BjAJK.>0 ʼ/_Č$6@*a{L0Ñ"1x6⒌^̋avnj[l'f0#/1)bjcM02K4d4)]E59 glzG ,.0,:@M:љ(v}T HdW;3MaeBx\ojɘ3˄n5״5p,L6@)p4,`8J Ld :@ɛϬxRXRj)7mf\}\HYSC Ah\ !E,L8@΀l,j =7EڰrK*Lt 3 An:@g6h 2G_>( Q@*ȍ9̬(e<` `jTagSdrXf=,#}@r%3A6K@+wP (rVPۮ,OkP]p rBA{af!PmЂr}JQ_Q(d;6cBA}0@/]K Cµ:nĮ XR_@(p~U%x|FvB2& vd),rSXj%7ZS,=&MզhXS@)7,dBB23gFґ)Tp<,7z{gq& vLX"t=T 13e0A ;oܸ8roz%@y @v^(<)Du. 00>jJ`4_J{usUPMI 6>Ȭ\}2gϖxa,aHq"  LLYnˣ q/8[FS ɾtV GLGRᕋgS, 05 ˠ \#/G9B+4RbH|3 O̭! a [E61%B%U@gr/RBB(DA_PdFA5K;Ϙgn0yQ51ػQ D9Hx(}:B*J%mC E@SMFA3KK`0477 cB41/>gf$/ "S|lP PU`/[FSHЙ`C(΋EoUe,6Uǡ,\ٛcNStkM*!Ԕ8-+.07!^pKUc$,< lP,<0Q)Y=X6R@t]B"i$H7:QC%.89!g&!0H@Z2L;$#ˬFxQ>!:5[}.Huf>A`/ƢuI"?>}!tsKg82ZJ[5r]WQ|>}aSW A*/ jf u$ɋ}fp+ !jvD2ԺJ6h x]PB*I~p&`|tP7`7,1I 6- X 8~7/#b"J| Qq'QMR-ȀLCjG %·ckq|2JS`f/@,UVȥ$MH;` x5JI"`;QBePQMu!>&*QW / W ڠX%$P|Z4~ a;2mwp(,̩bL Y.!P``Q? La d nuXǽd ~y`) >I2Hz4,&Q)<)3m/!)cY^)LCy}!6J`U pm`QbUErhOe ȸX-cD&iʇq \y![Ƃ1CG)X` o"%u2ΥqnE+Q 72 ) L-3BD&[9HB_` lKP) ԺڃpH7庱OlESh04Q<6b,WXClEsHln6O:귒^6O ̨X!@ @=ou>Z2LB6{COySGc x jHPK@e U [ :R>XSթ!fc$Z*!>*^p{7Dre `<8i-V;5-5ϴ?/S#b(@J6MfO ӡJ':λ@a,<&Ļ%>F3ۏ@6qBtICACpynU\h &\ *2PD3N @eRG\TTL*srWk6#Y(Ԕxx'$Cu}B$x c>\.{!9EtA|9P[BP@fphL`)b0MC2!: u` 7d-H U̬ш (&(bhqP`V!:_̍/H`( E~4eHE-}G_&}uYx^|mYW  pL`!FT59y28L2gil$ ~09UN+ vtHJ&-L{Ad:nA:(($A!aGŜTV9dX(s@ `RPz h4f#67t`)9hcEJ~Lc^L_`eviG4}ti7*@aҽll `tèXkQMX\5"bߐN.)词kLH3@^֕73i ϠNmIX8MyސeTR` D[fXylYyE&^ֺhnL:dBA'N'Zl`V2@M$x p\h;{ 58Gten@) )1C KaK?z- @斃Z(&#a-'TyZ䏞WnSy9}&M f"B S}@[;bDH 8B\@ X@ PXFdh(0c@SA\uJ p)/pL*Dd@d whp>%h/$Z4dO f7 K@p F TP 2PC6B88 ež c@ *9B:P B9!*a=*8M@˭y[4#R Er G@=w\W <s,/zC*!:ǁLC:,E}`:(̭ a )-zp !& s7l͞{ݼAK=&C$033CxV00PcXLٔ#JkE`b~&@`WCiZ%` R( C:{P!j5I3 KWH^h<%f[Pn>&b87e(( Fx=$j @HnG@3nh9=@7ѫym3Jkdϊ& ifLoU}EP"p DG k@'^(TV Kud+xnB8萦/MraHbQ n#jIXp(Bi÷O/)ϻJRL87lm8Kn-Mqýay=i0nRj,<0 < HfGYfi@"b1 u  \ $܀2If@` Xfև2%WB!JkW,Pm2!`}:!~^jʤL"?&Akfie:<9 ް{f|R.\tf N?)!7Y 9lu"J~^lFj^4v\ b7OlE3õ_v-%9#)xs:%XйJtY]I-%[mW õKmҠ/<3eBA%'n4/"-ǁk~׵i}aXyJ3f fۣ7hF &ȉ hi}kJd`.:XdcIE;Z^fm4dXH-K54,lk`*C'YH$:DHQv57 ]U 9Dj8OzB` h _BǐC5y66@t J6ṲP-4%rR,/ PrBs8n > f[E@-E @1w2jIM%  ,A@;H|e}ah]-P@--6 ;(66  2ÿ2p>AkePAiAtD>7Is9JS `/f&JSHa\@8E(`/ܧG,s@E\yD1@5Q`yI1#-*|jd8Li^f@4}!ͰO` 3=-A%`FV@?YFUB@?bSY:@SBr$(D (([ 1Pϋ|r/8G)ͬ* dBg&!tP;[ِ72J]44 V\YJcb,\P>t$tU@I :D°%`9H-.d<f&t@~=3#a4 R17e.YzU/M3{`mG2@tx`FC\ 1P8"ibc9 zKؚs#:@q{|,,`fQ9 0 t, 'B CK7  X YH(&wM4ʆs`$䃌V7(SQ#`(8,ĈpW=iPX X!F{ px4!3,=Ra;zCӒ {<&A1jK/AC>B((Yh S4S4bp[ 3a.FXF ];W `P]DsbB( W)ol&>=nm:@sCy,^P; dp`X",:@|ܴl# rh ,r4R b/\ҙӬzx1ީ<pObLyQ8Y69/aǙ%`8[;v3[_hʫj>"2S@ 6MXҐ[_Z1yH@SM__f6-7suDȡlC:7WFbN 3L$6!FuN)@ `R$%u͔'`lAH%,y!rNK%2[KwG£Jk 1fLY87:802=: ["3P܈UTaWifop`l7  ̮S bjЋ{&< M2p@ Q˙A:1C v:G}BJQxP3ۉ "Պՠw PHf}e" ,G 9Y<`N * C _9Ie؆%^@ ?֏H zplsri) % M4y=3㓘X>!Z³ę58b9UpoS 0 ݼAF%i,L8u޲`52Dn2(i>͊Яn!~GobcFP}'4P(  fʠK)D H:Gl_!0 cpRQ[ )4 #࣠AѠ瘫(POW8a(0e̺ &}&YFOt=hA(P$O<:}0^} GJD ,#VaXK3T:JHFz9»~3H}Dц!_N } <o+ uH B b0Daҙ@6 = < \=h蚰ZK2@GZp!DE3J䃌mKB %OU;S܄0`͈TBi"RI+:?ilH;TBtO`'R03^:@W?A2(T Pq7pTCr[FVҏd :J׵K p/:V1 lkFUۥ x C WgP80![/]B@@qJƇN(P Si@aFXDPmC=N31\B/DOVr2:DS薁pq+DW z+ ;}B@dA .H* Otl%6? p#B@zA%6[Ȍ}/4 P:}T+х:L/x `+ `(w t;ha$9LP$ `p2&eh:h!ԕC jq/PK˲(:8E@>s=63Sm(BC%@! 4 x9H$P}Şa.GֲH3 4(PK&  + J:ǫD+)x|g%aANC]C:Q'2@*!.!Eо Q6ICË% '-s(QࢃFZr Da>x A3BP ހA= Tm4 %/d-Q> ;I &2C܏P ih3 wf3tˀ? hy= .4+_S>fB8~IBCzNT9"HXziilz:UU`AK/fDA[<$t3  )ChD~Äog%io"EZA3sd%m.exB&9$&sEK< C\{L>`` AL8D'egA:@/#:)kh{ p.2.I[$C TYl2O;pgr%WʤStt:a(+)k8?~dF½*bH5RH= '84\@Sy3l(%`GA z Ld(A:F)F@( eK@h k,B>e00_R@3`|qFE)F"[#hx3$gph MHE eO ȁ]*!㊳>O i$,fm` ϰ-CWi!KJ4AW(8Tt~z^oI6 3P 8TQDf!(O~GtUa4o?WJ0P dɩ@G,%u|*@ϼ f Mq<Ѫm"I{*/ }H8I0.H:\O1Y(pG]LF(0 Y3l"T⇸R)FR5SW#( @Ű90p. b5:Sw؆k-9jBV`ah@h4C0EwÇP,xZ>ȳ3A>BZZ@g15HJQ4`T骡M(@q-]op*X l  ` 0hBum.!)dD%۸mKAT#m`!a`.$=Vc+` ɏ zE JSf:@@4@iȼZy,f-:vjaCHA$txdwh5X sB F^HA .uh` TB 0ETX X/У9lH8&D [?V FC7. zggh&/rC}E׳|̭4A EQLTH3OTx#h @d`%d"b؄H!P{!!PP:t "hWȖyBt4[ "5`NҖ-]GKHWR]Gj`x6)`+P3pJt !]81Х d?W`d`Q ZTzDzלw!@z4#Gd3E" /`xCo@5@ $On%P=2y,{lb xD,\h^*[ (+YcyB# DO U ?@Mt>aBt hD LRhc$t xpX"M'a}XӍ`T4eBejrDOf%ɱT4`:ҕ ^P$/Ah[f pև푯j4?zSkE2դ C 8 %έk{^=)8EcʯJ L۽sVArɌ#)d,%!Op,f=@POn~ >A`7Y^ r Bֹ@"@?Ӣl*VZa( tI?/0\8~r$roN'0,=ٯy څi0 wF(` qpQ8:'@p/8% J֭4@r  00el5B@dբC R BIa hz MϘ;` ~F7Dgh# љ|)qޭ1:lηIjVэ 0aXdB-]Q@ak3O71{a[[,D8lIA|جȚ?]!uȑ3tJ@ XD11TB6-iJZB>b?e*t5g75}Ԃ@L.` h~V7 }q|e:DL+aєiaxn||`p(J+:he$%@ X4M"}g 6)c%@0Xh :-#-g5gKߔ- rTKV~,oӐ] tCȣxT Y%>kbWB{h^>bQFSw3jAB3`7h4EoS@y J-"!ʁ8{lLo=ܱ9pk=06݋3(g Xv"i@wLn}9%|NYnn* "c!G# Պ$0 *W 2E !$ԢG@z M'ӽ`ѣL%9ݿQ=30K@G S2}$bAdңONG>-K@Gu xLoJ @v4F[<"B> "#*  :0'FtB12 mmEsϸVB*2<*q,ҷ$*b4!7`,z!,C'8¢Xzt` ~Coppt`J~E*P(DQ D>0 :@-uE`1FJs^!@q#D;н|4@PJDhVCsTW2B" Gm!(!(0zApltg`=貱DDMB>(l*) R*.‹ =0l_ { @BɏVҰ|4M.l6tmtYU0 \AuVTV\NWо PGԉ dBbDUAx"Vf(\+@BE6UX>ѧ% gpmC=f36` ָJ!~ (kMe<Ȫ6_Z`HɢlƳFBbH+GJRKP4$wPKE%O[t]b(ӅdQ<3x! *Xb>kLz 23tGĖ#'"QXK - p"!KE@D82@3g2Athmu4.8+rb iچ e;` ‹`>Xi3) ܭwDfrf [|#L:3tD:4K@HS,hUbuD3PC@b`|i00B@FQ>pA٦I% *DOأn6eX.L& .n&QvBDf0Z@0#$d pv5.$q0m%*,uJX4]8L|EBnc6P(`Bz >H ?n  G 1 Vf:@{aՔm!ik@ :XC ^ x'c:@ @`/Zw…n`/Pm4A{%4ȐA";1ou'`^%fZ: #;}UE=>'Ox Bl"2i"Aj s?2P:.& HKfԱ@j`7RI0f@xC$0FP %1EV(' R=S˰@&4ϑ`& ?@lgEPl%=`7 @Rp f c0QNfH9a6z?פ8~(M@OaZO(\fCaCa/"ݙJh/XReui^ 4  `jB (Fꆛ)`=R 6!&` pi=9b^3:,@}懳TB4B!k{Fl" 7 ,`"cJ sNmi"OA wPѳ Ud3*!Bt,UPy riBK@UՇ00KK_gmCܒU U|‘7g!q}X6:D AT kh/$bf4&jX`%PS65%*N?$( qn#;"UR q1@3)r7ЀaXo*jy9hόZE !O<fo !^C'4PO\B!qD ($E阦h65: 86pQ.ZNo0;(!,w|ՇgC 4{*78Ih/䃜6L[*՝B;LFOyI1\ D=F  25A"+ԕh/xK0d,̩ 3UiԾ#-T<HR"]$fp`gL{u@;2Q㠜OsNc M4%`Y vu}h)_TmwA9z!1L3-(}B %:?[]$-cl>X X>/OD$M&ΈPQ$,4Mr4~~DI`(aB N=ѷSN5:jKi*f3(R dAƌn 0o+/D?Mf뮋~=n&S8Ԓ >\p 'PGx I`0 2HRޫD>j6z)P>^HUM-HC`lB{ `pu8,xE P4 .` v㗲-h5BLY蠇 GoD} `u7osVl[tX‘|>LF,'Ds{tP4O8=aK JD&M(02-`* gt6C yLNѴsF)J6%4AB\mN @CNe-CH |JP;C vBt`~Ф3:CυC>`OZ7rPͣyB  8BtYV70ДvY:}!d}$DPF14"ijyg[eLKׇT Q <0R"RENLz_Y8͚3yYW:V,e:P9TB-rl2M4D"%5 4d@z/%P}6wFN }tː I8 T[n0*6i}6%,0+f˖pJGE` iv/LC\O\}Llۄ<3 {C)b>3!,P@D`@LB,>YRkZWom{ L:_P!OR J7(,Y@ Pn@YrBYdFաy{FY8t]X%aӣ DŽNtNJ)sbȬ?6jTe0 e;hQtRߵE~"PO"K@ w /Ԕ2'BtP`ćjyfB wpxftJ6C\M_ ^[QPfEc 衃f&`^pbim7Xz}SYz :n\}Th2{( `_i~U rT UN NgM4,`EQ^(P:B wFO.Fn64mkp}f8F˰0t_B>[1[}<ֺ{ Q bɽ\,x%lgX(zG@(^P )CѐZhr<0Psxi/ ޗ|0Zҡ8=`LnVA8w=3@LW$2\bC aj+ pR#[ $ڒB/3SO!p>hKݚa <W13 JWt(uZoћRp/sOE(] nfU! F%;XRLQ,l%qX6]CXͱ$q,IXfhሴ":@" 0SQvJ8 Z4@Ӆ &DE[lei~ PTLcQOTrb|Q7!=@@dj:c j6@*@  #(+B^oPs&j,{>}h N=K@[WP 7oʉMj9Q ߱5$ hrSˊXGe ɷ$)%I3 `h䓘{3!aDY p yl6!p)Ϡl+`e?* `6 "d1 ˃80d5Wtq9U+ѳŇKJ$Z"+($a, II eOH)?[3!p*\` p{|`$þp5 F[I̓( E4=svS4z4By%Blud "zE`/^gt ZO+_4oBP %\#@Ѐ>J`nE丆$u6c}KF2&OjXvWSZ* 'AUP` PjʄQ4íqtn=eRS"v8zBtYS|ЄbXvN&j A{oi/dP t8ڂ(L$W~aQ Ua:$ @ ||@M*H +'J'*O ܄ ,3?|b q'AB>cQ`'qͩ-:"0k?Z GbvIRٮ rD*qM[,SSNԬwA dtAA 9RK]6 9EpSd XD>rCO&_`?g ֗۾.=f 벐kS%]a>7\eV} kAd!pF>. 0.c"dpsvjH Ȅ(js4/`z'P(5i'@ XN,^(P -A#us|d} >}j MM`/JL5kC:>!\ʡuMEzb>Уjf:=p!Q|F]!POWjGą 9keT 9uԡPfF#םAQhd b/&>e(#SS&֝G%ȕq] I,.IslV(5A dB1w腂 |K@yͨz @nIC0#E=1/4qtZaQ X?*Ґt(͔;J*[ CpyH!I 4ѸeD&%#V5b* $ jv\B}ku3A(5ϔ:';f NL{AHdqU5uF"K"+d|^ECg.@hmy@#pa D kh- ^5)PE~KȄEA+osM `3`Źuxw$?ڵf-$(hd+k2+ Q2M`2[:~NC̪eD`˨ՆEZh34OpRA^<3XIa%$ (Ɖe41& qKf#X!6,d[Nꕴ@fbPoT? B}X?5%NFʥ}O vG  $z\w{4",` !pq-p7Hfc"J`Z,:Hv=:1DGGBw܉ "H |(BOF*ѕC 9C0-> d0o%!]=z8.L+}"2J)zHmF}~P+q'P"D2! g@ X[Ih&xB3@ͮ >3&$Q\c49ocKVB*!/dS+IփyP}1c aELv$`/trD M ǒ`bP5eB@usj@"@3m!.h C1 D@g(Ȟ@.P+|w><! #3:$X6B1Y4D-ce>ޫ JA]+̴f3B0( #k3"z} .! 2'CSѼP4Ma  텆|,ǰ^(ӫ@aklל  AA'ZDYQPև^9"[ch}#]t y{PO-鉔w͂Bf*bsj KS% K9-D5bo ,pRc2K9J>hpVSa/p T,NM:@) Q1NMXJ \YEy<3 !;(i ؠ Rح"]=5^Z[ωP(R0BI 8v>%)ZpsrBT# . IS 2To\*9HdpDXldI@=%Ԓ00< *= tyb*lP`dt@j-POKE BtYVP S2B4$0 qˈ/"54Rnf=5 |CD) Ɣa3<:uy'AX Y mtPq{r$LB>H;hA+3ݵ?gG@{tx4sGg&/ta/M(:+$P fJ@wЕ!]2 wшUTzpQDXؠJ g1'Qi#pA :C&BQ190B?_:]J J!lCU$ Kl[ w)=" BP o? AˤFz jgH#d(]Z xB&P TC`/>8mdR h~ `hJЙ (I @`/-H>&#bL_J2%R-AãsKV`bXo+#P8R;cDTCJ6y8@8ݭd:0D( D w^D\ & Co4ep8ɽ%dh{ 0XBN:aԢi/((]yP Y~%%ts v L4 P`%A H4)!.p%a•Wt^=yt1P^.K& L?hh A7n(0 f( ]k/LZQ Đ- BI(ː@ |h/"=GTwS3d6x cw/X5 M w\ ,` ]&!i3jF)GML@ݭ8*Xצn= &n lՌ*Vc͙H5ЍA+`x~)X`ƪ)O P|\ _\R}LD@R@nZ4^́L2  CQU\#A*R&QX!rd)TQY8*#Hxm` hA"K"{` %)EO|#:|. }t* /co} hd4z| +8Z%Z%!c<>A]k1:VC( i(b(F%XN0 ؇ _t3 Ke0gfԥ 3ģ 7%6 `WQ p: >!ԟ4r "029D%2)$k c@*1/(T$DcxfBR1tC,8%2O'Guf!"yˊB> #-4528B0:@O7KY,֣ 1:PXȚqB>AQ:A1d` >pLNY,`_xlRt;qc6u{":m ۸X"҂aylJ[I `pK!]JPnCz_HX$Cjٙt7LIO8gJk6%vMQ2a1<:CO`#Lj? u%b:Hқݶy7OA( MÙM*qZq}"(n#!rڇ;RcYasP<&QSȅ"t0("Ϭ7CB>҂TO\l,qE^|ƭ,`%dF{!Y@=]!Pgfdp.!Ќf`#d:$tu\37@y0m(d_96#M HP^ 'M^I,x8ڂ(p#n)=@) D} tZP>6*!9ި4039)dHI<#` a TB Vi E p! cMAG9DŽ&Z =H;0:(o,^hiӡoe0X<0q\ @lnq-ZS9q Dހ ,H< h] _"9ȄCk&,8&kxLIc,PooP [P d4l/Z_GSIH,&@S ٍ>͊umX(4 @lpQmB^HRy2B`}^ AN 9L*"/ 3B G !vAѺSh^@J3L:J}7QSU`p,Lfc1jS 4`pk&ZetTZ 5n4a?cf&R(%!E8 bA ؇b44P+MJ; ]:Ąp`/ ]IHbr=:@.>AkT 0^P>)B w-&4 uw='e(7[Lh`\V$ =R[Ӕl5.I1õ -9. n6xa52@_ޜeS pMة@BtY@E_ `͖2̕e^P&=s }@X#%+4*\oEAKi5텀,I0-^() C1{I!`\`f'63UR qmw&8%B_ j  C(>:f'PEz}GZȌ"(s.7N1tQC %/"[`ߑ"}tNi±2GtG@( ժlb3$V&OC3CO`ԽnIڍ5a`pn/` ~҇B]uEn-|8,rPsD LE]* sʖtfWb0` ݾQ RHc, ]qD ̪!wPCj̋(< "@q5ylI#@#2 <3 L ࣰ;b/̃AґE7@x Ⱥq0~u{w,ls:WH&$aO:@ 0TcrBչȠP>ȣ%i,)=P(0 J}TBsp܄<=t Ye 9 $U'4h7L@]3@=B%:vϷޠB`,2Y2!7LssAvg\EYp( ʤ}[ BT7& 5  /W!C . Axk-dǚz d߁  tF  % $ j?P 1>(i e>ԍ1҅G:f.Z(l` H !0% wXRz%@:vq.ZLD_k>!MD64GPxfB}R 'CPø H}G3r a`*B4@h^WZJF_7G}͎bZ>D2}є+9t%I& \ $" N(P 1v1mT>prMK_TچCR4H0z%g;(QТd>0G Q LI K@Jo 0*CiÁTtYcf0 &bea5R ?K@JᄂovvMݙ.4t6E=7hc H0} IJ,Fp6 1b_?n0Tv>I5&[v~ 7 b\ e'[?g^ld }$d803= p!uK`T 8oJnHlA5H1 PQ#*_l˂ 9K` 0*M&i 5Dԃ) >Qxz*D)% YPXF"%X#}3@_힒];`UF%@oi\ gpΆmї@'WI%n; =c Hl0gE%39IX(,M5j4q/P2K@b3_j#\ P87)D Zt$Bɰ3 fBk0Q@aRzj7 &JVldjE3}7dw]l ~l*D"q0,`28M}1)F!<(3f.ylzT 0MIle#&%GL@J/7cgA"E}( 2ئH`vh{a3561me\k]PO00P]3>)4%sc= !Bt@52 ;q!8vC%m9A55+h+~HQ :3t %x8 uΌ̣]S#B }pS?n%zR>x"e3,)Eo\|a].ƅ^(,bOeK@J" zaP  T4<:3tQ =ھɮ A`/@5+^³U{AԔ@c3|)4V^d Hv8@,@Ҕ?KvM{mn `8vKG~0٬j雹2v%3&vp_0lz1#m z!3`oEt;tf w' ȡLz[Ћ&WMG 0}XT*_ȥ$DX xA >0 @+gBNJ[CvsvPe0Lh b\=蘀+=JrO(eXp I2b߁$}&:(@2q2 P@VQ_Yitp/LF*ȮdhP"W-( `N*! `@ؘ%*5flÙ!h r,6@.@bI ?D"D) 2co*+^%3 '=4H Gt(H& l% g$H08<<Fo"q/8 ɂ'X ur.-1eӴE>d=PC ld- C2r49T!P@.0Fs3jW (i^g @o(Buɮ  ؏XFg#3̂SZ(M 0t,,Q)K%oRmVw:X0f,UKqǺS\I,1㈰}4wUcC%@`f/:@b(F~.uU]EKDq(s\M%>F0yW@ JB;nHk'g$$7K?epw!^;^ @P=%!wPLAVl/Zu @h xbWB _^$O:ݧBqcؘpU]]pǫd! @ lM˃P>;C1ky)!h&@,!iABI7֨#k WP.fV>l:wbҴX8pucmPDv,Pi1 tCKK 2F`&ӖT_xϕ-S`Z]2FZCZh$Hձ9^X q[`S_B(R r8lP OP~0B?_$(`%GqW-`%_'D9)*Wh \ rauxP i@ 9B2e%=_f3[x P@Ol} `e("wY6RO[*ђAh+H'Mmqs]Xϴ `U]Z-> jV2f @O00@Ub2t8_, `h@AeңZms9&G]lULs\0chDV> EpKx6KgS2y÷AXE\& Y2J22O–zC@ʄm(ZόWIp>@ 0 &G@X2 Ƃљ)Z|5$YH8>CZPz -v #PO8B`Y:Eວ./d/,B{Bs3"/O V]{I,MB@^('VŐ=  !Ob]D0 L `CE|fD>^@ p-KX d>,;cȇI(ueXXz§M(0jl[QB3@"` m~ lyA>@c99:P'>@>%> ]ߞ`m(q|wGfIH" @x bat%@KD6*lBd(B3QW#pn H~E  Oi@Q#70QQPCd!{6œt޿n" 8bF~! Μ <*,R0OnqCb3ax^KQ!Ckh#kڠϠ-d c%w;vޠlfWCeWD"P@PxCt,aSvo*g,a0nBv6D~PCS3N 5vh3Y'l98 P'/06-ԅH1ٻP+;S+p&CN,a-ZŁu;9ph8 %Ĉ/T zp>@ %U9DȊ!aq7($˓} $IWV3@AB6ZI~,:)*Q5 yGCL0Bjn[.$ݐKHCH2,`j5^ @\HN .£]<05j^pORz8CpmA^!%fb;3"R0)uy q}KP7-B(@0 1^((Yڠ9ֈ:rM58eb(@ 1lu 'u,S Jڔ-N, vm ؏B"~F,BR2Bc `*K(CGHleVeVenNO\Wh .I- 킻$ k~"Bf3wF(T8.@@ JβJSL /D `R8C`8KtqA(ClA `` (mJgЄP\IKr3SXBB %`k>""DVW@q-<RCPڄ*Ιes:C J+6ERӟVHp8>W$kQ @pBDv<'_vN' 'Pb1!+! d,:Xepy MDO@+ ؇ .1P'a_ȯQTBt#`( K 8ǕN>5 ۄm\*!_Cp'_i Xɏ (K@ dB^1 w_C3G@(  19}inЄ"n QR⅐IxrgJqC7Cn+fB46}ĖpdܸB* 00k/$&@>hN ;LB>Q2 5"2qkH r00hKj(91H 8u,``'DX&G|Kq0vn%n8c(@B F%9J`@nY vK=̠K&@Ѕ}Ry~1H 1A۪dnM:a,@XC~G_B$j!}/dR^(OȽf sІCly,`2@ܔ'"%! &5${PiEB 1dT*}袳ПY8=+G%i? ZEt;(0 5 @IȔRr:~6#(Pr/8WS+,rXN! ؇H@CU FxBd8f0@%d&13DW{T}87'8Ct2ŷ,OTf/c;&2  *4 :3t@ɠ8FcZ փ@ X uhbЕPisy4W2a$w*fR+(ː5B&QtIX( A(Ϧڂr"b$7Cݮklh8f"<8<3 ,O(8S#AM<1۱C*&Ill]h"#D ~3Zf(B8a̤P`Tː<yW^),(z^s~^p :3e uR63Cd!2$P*yNމqI'A}Z^1t1^!m`ZS#V `3ۦ-x49a ,0@!*qɈC^@"@(`1]xR=k(38da?DI`Xz7Vi`*ݶP0c4TmZ]/]@ Pw>Q& JB}ˈRVf>"JZtf(1t?Qv B&ՑAu"DYd"Kx R>3S cQ*#=( B 3k <eDP18,X@"`(gO- 3C8>ً]XB I~.LפicBF8/^ $T/m1~L^,&Q)`<)2f\a@#߮CIdwKk)^C]GplB 0@`(0b`$cKLD/@U. 0 VoPkwZ~,Ml1c}q:N" @f2":H.,3 4Xf%`{JY:T&3Ķ; Q4b))$hyc6Az KX{4M"B `$QbxMzb~al3IP g F% >>{J# j GBVA#ҝ20(мD(,4u#LYt"æ)7htB(Xt" Xtf&@,Ļ +,kISkw),}9S=mrR,Pi%evx>Kx%ݶj;BlCx6t|8&\j]|ha/6͂"9XVr(,]5^Xuwb7XĻzul` mNtd7|L=eM#QSA(b/!'@P +@%J):LBH.*6UBtc[^k"@6/#*qXiz 7 6Ea ְ wP.1T+Q tL %^/w{]lI'(@4րfAˀ^Пjn*!G)a,pI,46`XpAVEʤù ?qYe"Q}GZ1: M#?}7p+eB吜a3)k En3,aƙ T@ӣ}Y wPc3`: gm&,!`:-#-< |KMI4q1t\7I[˗il N":D>h,'UiED8MKzqNzX>h5 $IKMp/8^g{Z@ %NGLdAiNaq/8d,|m9Oi 6G R2P$BF[@}Hڂ$@S@=dUXZ@޽ht @ֻ63@gPV9,%C^(|H!%]Ȉ^('A ۭP`=m*LN8&pQNK@{^Ɗi@p$K @ eX!Uzkƻf9PC$h#݂ `c2:U0jJĎM!'ơ)ArX>N}b9OvCNtC(Ms4NqU@w5/fa/,ygXLKn p k~ڼAK Fd'nBJrӒ8;@+,MX v! !%@,]=) 6#o=rDiwC8Krr Dk3G7K@p\dC?S# rY"-ݍa PXP)*&Fr4ݕSnB!PBH1u}HBXz%@4\w '&rfl#%`h $7T)KrӠҀXv%s-\%UKA)˹p $8& @\6`XX,=\˧v/'lX͚69jHc{ `pkf*00 $Rxw fO)B;:&`s0[#9f,2@(Hn ]J!>lY;zϵ= uwDKsp\)Ks`dwmC]) Ha `n7Ck`1iB`&P&&-˹8w{p,yNΗ>f*W4!t5ҴHnj6:nJD`8cKNy‹:@@54ބH hӯM_Q,wW?I~whΙ\:KJk:7Sy%yxKs 0 L]i`a p(Cr3G TPSe ܚd(\c 9%+b UK@|t ʜr仦sn.-]_ZC[` >^2KpdHTa:a6c зH*` '{T,4Ґ 6 wˤG% l~nwJ  i(b(/@,G3@) :X~d` ‘NVoPh! R _Q01f5`"mbR?4`b ܽJsz`k,)wFq%i$:9/_A KtS PnMfMa nR?HtMޠl /ոD w-#-Dղu6!A'@p/8! EgfmpxlE&%rw:9W:)@%taF8g^.z#(Fɏ!܌j@rS,XO]%'nX=KtSprUYU]6: }O$D,M^i` nN ^ ` (]C L{l(휟FF3H9+[Z*xZJιI$h DJ @B9'&`e3l L%`iS%`I, x۫b?k r:΋i9E,EwD[ f4~+%uum'skn$m}  ^)R pD4@L? M)rԡ"Dxy5@,\tR1XfR@YK4D?/ȗ^JA˶%50ݤr;tYU,^5zZ4RB> "= pRu=|\@On gk皆 %@ie ra nd!,`a J;̀ @};sPS`$OSx\$Ddͳh7Ŧ!4ݍ}9Bcх% ק/0QM 4RX"z p.%K+:7ni=KwSP ͩ{հ@CDIӂ6tP&f`)y ^h@JP6g P'^(8`^gͩq`=bx[N0#. hR!KgЁ( @ m q"Lzlȧ[d  e;b<3!$o\<:6Sompm{}KN`e c4Z%EHԙ1QNU4V3C / LVt&:A!CgP*HEgA>=2J2BE @mc 饋J^,R`r D͐}X8s WNzMb9<6*& Ӱ|7I#GEéG*(X6Rz$ MCnw \3GB@R1S M x4U%ë]pqc2"o^ssPmn‹ft1sZ ;S,^3#7MK K@W txAEg H!5:lֵ> W_X풋TB!ؕ,Jg]].dy@J 6d6 J88id7:`S  M@Gx`:= ^b <{5oGփ@x3r68%0~ڞ3(&U b @<5Bc%`ċ B-ABP0l/KyS,DXJf~PPͮdzVwg!Re;o ̀e)SZDJĻ[ o:)Br4N0HP(8xݞ.:{a0t?LCѐ;q4q܄o=@$PsR":`/` xnOqc1<\LW(0fFd'J` xN"7:M)& ?v%2<ǬBk#3Do[B j:$T+A*b3?DN5Elz}GZU8Ff(SeT '%VFbfK{4t~3:(!jb ."^m) T悋L:&6|xosA.0-@ $\{ @}@#'MOLJ#ޜ2@STt˰ X"g(C,`m:]` oNJ.^: TxDp"`(!Ȅ!LË}A›HB81ZY:DϔCy:(~7K C;K|tzx%Do> g,[iʍ8SyKS=H{0`>EGHc&9 J)Ƌ /T0%ƫHXhdxKJKW :M3 Dg oJL /ު&$!;‹Xt: |380Z(%`Y %)E{A$ 4h0ɱ3 -"2P=3{wں4 < :L|9"b ,Qǻ)/P\h{wt`$M̩3OȠjufvE;,~77@)@Ļ$ <ϳt:?l)09)ҐvǛ}LkXi_`d1> #<[`Yhy E `Fᮅd=KWvD&`uydih.jt.=#\ vũ}3ەLy,Ptlǭ,@^z֦&t`c MzTorM ݚDȗ+%%<&R >K@~xtn̎N4pL !P`(grPf.B;A \k BU]sߪL$ވ` o:s m` :ËΪ$|% ȫ@0X9#7:?, /xsP4 ᕄ7snP8nT,A^PuV|tr3 R/ ,Y @x M,A^=@w!eIh~t/G&UoNV ZodpxB bh8azM t$.`8x1~B›=f oևfyS3B` oJ\ˑɣ` 8tד+_y!Hm ( p}6 pKăGء`w}/7K. px 2OW(6!›X 𻑝t~AXI^ Sȝ(KM,T FN:6Ls]k+:MBKXiͅq oDp2 LeivΛyVf5oQ `SGQ%aPw$k `TUQ@nҐZVa/,yF_?GJ!?.y p%I0::yAMg@rc o8M%h;7FN =@#o5~Hϙ(\@ ЎpyKo a!@ wtzz;&@2` oNJ"ߙ&Ȱ7u6<븶ԦMHQb7ƦF_1K7񂻣BB?:4Ǐ =wD! w2Α onmCKW:EoX!@f4lmW):(@b/~:=3ChbDCE @+SÁ"-HU"EqmpD $,7H` @;NgB7H,pE;3Cՠ[ mK66C(B wSexUt&YfXm3KсH OC'K Ţl%ĺe( !x! PO^+ x]ZP=w L- b:AthF3tx4›7$ c pA%eia2@½m,Wh-Yz(A"KG^(8%fi wcEjsۖ6 h8wHt 4fJJ@1)dkt6VG%6mvZɌ y*3$f0͛7VI TD&!Ȅ.07=+`1Ѿ @O @ UY0,`.8t|WHpϑpz<?@kTT|Zjv?^K` P{ʛ?za]F9y5Q6P@4ܢ B3P{g8jA+!%QIԇ!^y-j[zHx ):/!܄ D lVF F@ʀ[j4ћ+>3=-0 s9 @ :o A J!awIK Po9Ľmm-{43X^W.I%nc U;l>k*@ PRӻ=yj ɕg @@ez%=(t7KF⭐wH[mPDD2jHi` s#BqrJ ' QhZ($PNRwn%No&3BLxMl]WӲf`EpsW۶o%˫> ۴7@EF- kghfmful&)*As  Y .ڙ5,!{;Y)d@&`o5\pC I䝎;,x9Â;8mABΑcs  eĜ9~JB& 4BD w-*EfcMKEQã|j ]B`Yu[|)BCFCA:329P ',eptJ[!@*S"p:t*o^^\u:Lhh;3sd!K@`>УE(̛Ґ<g pɆ9ڢ(@ߣLGe=p2o0w),d^T!i35h&J,O5ȝLͱi/!#D wи*`pb H-k U͹pI<<`9ͣ2(z@3!D-px4G NIY q$+'A@^H]vP:0@,4A@{!!Do2}ad>67OU> #@tRKMt P p2`fyfBWV+RCOxBU&69##FLJjɄJ1ele0r$TB*3oϫ@jr*a }XrbP` @( A k!RԈ@<lX%[J *b:# *xI ἏxE=o+䔘p$;vR X}t/|ȏ1"%Ky3T=,7@) |j Dc@ " ,uՂ^,B>o)ĕh/ $G" ! /&mFV!R  Vb2}$0Pen g @zv[FUR؆u0! }&@)ۻᝍ 3o# ,TiR"v Vi0B !%T(\EdLRY"eR b.=SmmKS V"  eDN>b`MR=#P4yl&4 :<3 Ăɖ_a`?CQDGZ%F@ bR\I<~1! Q`d dل+zP q҄2 XV@_aP ",A_8 c}} d(`K(aé(:=!^\hl/Wfd]0:6=D @(pp!_F)G9v[hεo@!5˃nc=hvg *: u0)yBP|dR_8h i *ʡtJ(d?4pG/H+;jusN/8y" @I\h궳jMZ%n` 0gZn(Z|gT)-d O!@>]C5`q4cj?z7iZhŸQ%4h A[SPΑX$B\[yG a_g1q=D& L e;>J6Ѣ݄= 'G3/dRYzЅx4W\՞PA VP][| Gڪe@pDܧ*7`]S5/tMTzze{4_A(`XB DfE( >ӂ,_ }0L'#OX%X `ZP OdM ːe=we;dMsh\ Za%386CL9VS &J0X22|}1P8&:@C[|U\&$Cf8lvGg1TʀN e@!5(0~fS/dAK"BYcď9B6@R5e0s:A+|D$0 P!t/1J9 x mA@D;lXY<^h,p9E(l^65H 2@\2N@!rUKRN(XF"%@lbEk:F8=R3GKuRŸ:39Iwq¹ ^DQXF  DoM Ho uލf H"Ωѯ-pP C7 UCCtTE4tbŭBlJ PeN%`)Zx0+s[?PEC 3 _O(` IlEt=c qhhH ܦ[Ɉߡ6fDD V@8J>Ujd \ҝFG(%@) ; MK^1(oq,|Ru)$q.{Q)'I`.lGa|}8ۈIU&N8=}p^s=` _''*,` [L8tEZIz2zI @2 iR0ׄ#:^H) $[K"e Y@ȷ"D%@)7;cA:cՐE)Zl[[˙;R\jqE.SDÀi` )=^('A ٌ1skp\LBB^P&!4POn>:sIА(mk&:L2@wLTd'b`MFHKQQ` #Oc Hqzz-&p ʛ)3H(ǻ6 a(9Jɢb  g@DVZ7@@H)2zFo40& rrf~p @E禨}Dai\% s{ Zgx7KoBSћIO܄x%:XHaDz$^7H(0`Ta 6}71UK$XM?HoI%ϋ5@,rx;i^pM3𼮓'nBQa7HM, .@,S -`nb/:@ c޴T ̀% ) *K<i(O .kI+,^5 P-  ^z}pnBtE) y g g;x8f%[*(AӝP\R$K@a1)U)[`ߑl'Iv_B[<67@G+{ R"ъcy++ w`"8%RųT\zD딠7HrYЎȮ T{8+CXRFRdzDۣ38y^M,)N=@(`` XRR*ߘpY(O#32h 4zYg T3 9,@VR)jzXLwA@g ) g$< %@Ii%@ X4MqQ lA$H|‹+fCsJG/G{ `pK^ PXT:" %7UoT7oдt0,*NQ),J8Ӈ :d8g.` Pq)5AkxS,R+,^%[[2o0A%[2oWV9Oo @D`Y? /_ 9zzD4ғyV.&wTyhf 0Ð`|,,*& pA_͆ [;7okK(,%@` ,*WYX4J3_f *^WZpXTs9ZR )KHTz|PPyUBV}K>`PoLȗq62K)cFy۟&pYHƑI0P P5TXBѧRVhAtI%@ު2/ p4n JmP b]-*6YL0 MO0r0,`r\!l^.'PD † klU$ix<IQRjGD֢%`{E{< AQ/ /L2D |&;MQoHdp ) @3!;n*?:a7' Vz=O( 3`+ic( A 5*c40^l,d<8KS,:+ְz) %K5rfz@*`J^hBta/dp2mM! )Д=Mt3Df,p^('A #O蜸CZjB^tH}GZHsz.g-\PR7hʪ8# %"wtG:  DV,G,`2bLg06B:9TBK@3O*!x1Rp7vz:{ `p|J(=!>!j:'h" JhǢlA_ȑD*6|”JHpO6 vnȈQt5&ecM!j!\:q8xWqᕠ8As:!0ȌF^3 MF8lW(pLz:@ e}URؖIj@`ZJ3eLzKJ~_E<ڐ#nb/ ` ꑋFz'B^rB^!*k|0J&e}Tpz7`cO`Pv,Lʕ ,/7@S@7Zj0%Q nhXzŘ[EZAKwy$lMCMm}B9͠/|D5R% ){zDX Kq#Vo]R7)a锓I.uw3+:x0׍v EbDM( /TF) \4|  7|uZ<1R "bL+AI8PGRdl%i 0NZ%PAK!bd`. Bt#}є@ %@J"zt |0}@C%[^ Pa/ #pO@Po`aH}`x/M(؜ O(@(%9h*,3NI4QތV 8e2۸B KPOOH8mnVoލp=8mnz̑)7,Tk`aXz,o$i89%` qƒ CY/+S݊'f q?QSzhU3 '^^FUwpQ7YH}2K@3_t*K@oT =dZi*Л5r"@zmCJ{ @}@#'A%2F~0.p Xh5D_(=H%G0(8@}:kg";}GZUBy$E}X#Iz3-ەCr0% 0*!{c Z^@Unq&+iPz!ࠚRɛSdgMj|DlEևR&K 2 2[4[ @|V/Y!6O4HHK7 0z>2zƝ&@)[ 2BPN jY2# \Fz6o0yu@%L/%@7@3y,!%@}Z!8HZCH OK#:EE(() ^ŚXrzoPmfO2qbq,3 u P0࣐?OHSB9@T'Ap\Jߨx7oW%@Ga|D}.5%K Zu*=Q;q{>ʻ_:m$cp/6c`C}ep pqc1iTBmBZ18pU6DO4 P BsBWl0< !Ī6b4D /&@ǀ ky! ѲO Շs!`r/dZ 5^((h=@ F[F# 2BY}`xY;$7'6*Xxq%lj{/vƻ^Rx B8͐J:1L ~"DoQ1D(p)73pF"Nt0-:@Dä|nB M,F==@( @2B.D_q Fof%l޿q0/73"b$K:,>N'@ \z!! $FmYw]ԃHC@-=[h0,`r:~!5ˤPuEkP75d0 s0A ĩbˎ2)`z~"9jtYpK,?C@%OKaI͂N Wb q3:)XCNJ AճЬ h`&(`)9`G(HuX8%zdtp4yBtZ4^Y( @N-CQTa`/Rխ#MŻbPx@ m`dyihF3dp i(E63 LLOF*!Hν@8t,H?>q eT*e΃\328BJ+S'y`Bɐ0Gj>ћ|>MP; HD% iٵ[Ta ,H=_wIi@ y)`~=!J:3tn Q@ڂ<}a/*=li!+ @3e]/K@}(XVϾ#W5t d (X%%m_E9H8`}7-!^&W'Ճ@ &%>ei!܈vPm9)B y(B( r/8"x!:w O 6ScazT̥Q9  JMt @kIIA.! ps|n@SFp줄()lj/('5DhߑVM"zG@-@F`0,`r:"e}Bd;Bz)Zh* ,Bt,cD %_kץ(Rgp eD*V9{M"N^|O0 @: ,`Tq^ӈ(nB"gOG6"3Pz YS:}&qarGF"xH@^x8Ǎ!@)y2N4}$Z4%bGЧ!@bzJHCp:0PRzUDu*B5{(;x%b€IvtͧSȩشV5)o rp9!gz74ovfTq@t~>|N(ԁKcDgBtyjc AM~Y@9h}al6M@cJdp8$'Q0eZMƌ&Ʋ|R&&P/dpnlEuYE3DH.Ա `p/8TUPO9 8a.2 - `\{IdpjCMЌf>R2g&:d;4hOBF р`5Oth *'"@1LJdKR^p'A8K@DU(B[pb 'Ac ^{ztr")kv U(` 8rBta )@H,lZAs@.NOHfG`ON2b(PO|p%D* 10:ETv$gdIFP VF=L|? eI ^.C\KRz>:T<0xǭL7]%`^('A,>.vrsA!N/a`quQ^ t{B heޠrd>;(j(1JS(?Z1m/p&Y&ې ˈr#3w`X^!7X7ɩ ͏M΋t`@,|s'DĐ&gs(^(!kH@`/̦(Y@  Xz3oQT߬\Ȁ@SeYaS-+BTrV|֔8J'nB =#-xy ߐi"=b`7zKAtz3D[S/EC`28]! c{d7~3.d``j `(K"(@JL ~"# 4UY2-D⚖w3B 0(  wĞHGt2Pp^ng =#-dfuH 8tK3P"Qe8W PPO\5L0xEdo9 5,=E(`,`ס͐J9a&{os4jހ%\Xצ!c/*]! `;2W6pћdS('-L6BS %KNjxp( o[)ᙚ$Pp{of%rmr;:,)@u `dhSY2BP`epwqQR3pZr*18{{'\, SdF  k G{*89IM $x?!eb0oX6(8_|Rlbsi89coB` prƉs'r:(G4O0o/=9A4fZpK4z΢M,g3$4;P( A^fql,0H9a/R(JԳ|'JUe|bT {S A}PhF6؊y1~M B^ K m!  (mZƽ$:Pyt9%!k ,9Gp d7[2 b`anuP|ӥFV"G)?2|H-^HC'MȌCLH !Gp3Va!Mb裐Bj/&[`ߑHM%6,Kt 0AJ-So^Yk )A08LlzD&{ |A@٫;FRA% HnٮsI0`u hi^`./9YpeəR D1kv GɦލnܬI0/%, DG,SY|)[Pcm|m(miq^K~ʄ K3LDh;y=l/oN %@y8"AN 35(j0LB(BqRU  ʛ-pȞ#Bt%@."\FY};4(:7Ht{|^('A k'ڻ8[( : r4NP`Zmj/0%AK44{.E>ޜ0D0M 3}B4ܟ*i|Ɛh}`0ϛPI&F{ P}A%Y wP#1L !KD! \Waљi֙ ˘-#'TA텘CTHucWh[FS h A$I4ʕ(е$+-`h,A{`g2^),@^p'VUa ?O /CJTy1Q=*(blX"බFeb ?B @\ ,g)@ V IUaYC w.E굗q8,^'XCL9WM PE8KSNvE4N atf XU,IV>'Q ;S$DH =hfg r~Bt]su8r9Wh: 2ؠ rj8\gD&:]!T9!K !zSTcC4,9PO )Q3 `ai6NЙЛV39!6YP=S rD1̧)2`{ey=<`_Y 4PO]]ڿ` rڣBtB>eo%C@~{XpA+ERDPlE.WG tN6Tepa`+2}d,18}{HQ ,QG!4Qkvd-+C{!$@'E3O_J8 :%Gg/䥼BY)HpATVaĢ4#'p P8F'}iWst4$LFg0Q g=W!zECéEDT5]!Ս+ZX堑pz@R3j:{ Ph/((МPP( r`Oq jG!_ =-IǍCrV_Klx(~uH~RO0h J2HBP{!nIᘬ⚩nDȀl,Q=7T(0 X fC8`%4-*u62HP~K ӱaTQO=԰o: h{DtJJR>X=k9 J}9Y!wRD `t S$1=ζM40'*D:/tr!cyֽ*')$ @Cǿ*L 1%*a2@"pTR"әtwMV4nonhZ2w$2Xv"t "QC"&qw^p'R" II;!H>}5#2VMTB0AD@dzN i>+B:/9&]DTF  !TdXa Ddb,UϷwr75C:b  B{3h3  ADo3E%`/K%"~{B K@W p (o6LMsi(` Z"MW` !B 3γ4ft&D @p/8 M Ӝ fע bAmN)q[P_\9>hx!@ai w3ުA27 ٢SATB `Z2B G~,/XvƧRo):Fq e ?:Xz :@ *h/4ag}>$pܟkPA 僜2T#)6KN P =: $Dk  @mCDqȋ62 dL6$7}*9!P0!GN&TxP}&X!&`y\-E#-"0sG%o*+^j9(yd^M7bfi|,;9@( XxC7 NY% " cBH^ Z7@I33E2?'t^)BD  lO7 pBK7&p/Zs05>KwP X_ e; iJ,*MP`s/8 ]荥OQn6O!EOc @Btp@td8A\EJv8=$:e @ R 2Niϐ y>M>&Zp=aѾ ITh:Pj^`A|y-?@j(x'fX>$n) 6V>KURgPNIQy;M"` ke|pb1}DVAM M)MB܏Фxu]L7X}@^p'RY.֯Dw;=:%,^ gD%'A08|< ̾LO"@ 1"+T0[C|z3*M]6?9| M.g { _")HX#A कj6Av=-HzMZml_ Bq//`Y+99ǖp"-'C`XB(ؼ XuP ` |P½m62I&>gU | h5 Jv$yFX qs@LɡFi&Ff}Bքr/PGIB{w9mC'G{ pYct/G {I.۶ A_rV5.;OX\%$[fdwj/,GV@ꎴ,O}c ݩlgUY^pFt%ilr/TBU( 2 B0`^(&uo*QJI*6u-[%`/셔h*OB"5S I*PS(|_ $ FC! F~9 2&j{Um̊xM1  1-'E,`  fM'1TJc PbBtY+n!C(3 /O*!="dCh ]pb:O-@H 4[k "pD2!:DSEQf4+Ⲍ4R(P 0ě>)szb@\%&%&'d:C`u2`N!,3t|v/& @ [F5I~X`edEs3` Pf^!f "ܔvmr_GD3$7-,G@.Q  Gf~ɭfBo=OpuB{Iz 9c;B~3HAY4%K!Q+3 (2Bר+V 5","FHİPbDC#=@Vh ΘyDBi֯q " )*gn9耦dY%Qtwȅ  ƌ#: Hݠ5,r/8\F`n{KK N @ mŢ9`1mb|>QB 88K?ڰp[MR(c^HQ:B* ` -0n>tp, zH{ `pyЮD!9Ӊ%G@{AdDF2zL%D}01Z3[ f(P)4M7 wAV/g7ep2TBr4tiI%QlK3@1HB8^M `YV ,Kd0j/(c*[@txr#&:@P(rAlEZbXC09mĖDwO'N*ppΎ,1oB>e\ ;P?(ԛr_(4Pb9QC9 PBt^@SXs %텄" @,Qf"[@@BtB?aE2F'G78`"0dvNH|&32^P&XDj^(AĜC:h_`M1vmF:@ Qu~uK@!.'ބ.7 ]squI$l6x!; _K% GG/!0a/`f-+%[@϶<1+d,PP3 hl+ Mt¸vod Bmie,"0 e&v(8U@A[Qx|PSV  @  Cԇz/OĔ#P j!{ ߽9w`p G@ (PR;DC!XGg'`̜Plfh`C nX "s@N% 2p sWVvaWJ E̲C؝ .I4Gv%!? /3d+=B gj嫈 xK=@wh(AmO(KǑ _1=M‡hTuJB A(A }\ñ3\$i24C=Ap#!"Z [2رY"( $!:㢰㡴@X!J` $g\ՇsS@Ai A.0_T*02!2 E1ʗЦ0G9p7D_h1-/9lf7QXzS@yx <{I(^9/|7#W=@Fc0fsz@3 g N ``VBߨIJ*B]3ˉlJ@<3ܦ\_7KSQ唵ɌRCF@(0 XZ ڈPOli%`+Z2Bd Z0>(ƪ0thGQ`U>HFyfB+NXW: ΨEa ek \z. nh,W=0 3I:  2㏅ԀaD15^0{"`/R64|F&@%T"a"i\?hf  s_ 0H`"rf:襃P F^㽋Ά B̀o9!H2K4wɍ@e~CzWg hs~PPhJĎ ]Y1 %@kCƛzK U`n<t !w,W7@(@ (ԨW#}z(v JHCZ2F`'aUwa/eS3CyꛡؕzM 9t&g0 PO &Akr^N`hX%FfwT都PSXޜ&IG-5M"s ,Oq:^J^ %![gؕ4RhKH䕺$F%"hsHҩըsQM$Ɩ D9@p`ȴqsĻ$P2C㞗O;+Iɒ Ba>.a~9Պ!vj PHdX(rn#~ةQZd}|^ŠnBlc x>l4Ɏ7H1)84DM;9JPtdBI#1.?B@^piA(K8 `- ^mB Y`+ 3O,m%Δ}&/׌h wZ(NR8>|O +RApz!GbC%}AvЏ༾ko7'B lHg;7R1 st9AfO9ySK$;T¸&!mgܐG˖wgŚP/pXF !`X' P1B8^%#:@ p|Ŵ[Hȑ$qu)  RD2Z(#r3>0l4}UE= )įZ:@&+ns9cܒ | &:bt>hԔP),qN5@ 鯵D& t&ǰnI(G Ebe&iT A0,`@cTbo}a-/Jް%`Ω,9Kտ~)/9U9udCڏ4R  Hʛ>oP09_z8HխCg N?:'0]4vy0wNUK4Iy {S9,:, 52 <PTB+IOlz LJ -T4~! pC #ՃBtU s*V J4MSlIՙ wP>+A JjRM B`(0e(R^(%ω|R7(@ Dl@N+ e&6"qj,0oG&p,wPΉ. U?3@'fzK2! S%fPKoX&Zz35/&mxX ]@!peD8\O 705:jj,[(o9A8DE5bfBnPE!`G PNW):@#D0 XC҃"}IP%\l:0 ĝC  It\aQGB`jcX[?DO 4p@8d @S3S"DCwh4V|IRnA YJǑ` `n&9 %VɐC` -NȨ7h~Ӌdi.Dr[ ){ P`-0Ȑ_-P;,Jb6) [gs!4 (s$QUzZ:غw8:0]h 6e f1I3Dy:ph׳;92紁!,A$Xm_=` sچ8x/`P{GQbCфCT൵eܖ>E[aDxlAFtQ*,"c -[ap:-Wb7#J}_iy^.'QKc Btl-Йݢ8& /&5TݚgEdL >nD0,`mN|@~`/.ͬWRİ ,-R4hM 7ϫ3xQ ėb )Խ`iY/Q@O4rdC5|b/ݵK}̸Bp!LWe8ft^` X>!(qȭ: E/6:#kۡУ|UBKZ;t L/C6Kt v"AsF}r8t6\hM( (䏚"PDtb(0__fݐ^O HX3mrt`ڤiet&GՐF(`g/{!CÁe'[Q*-аM|RA+p2:D%J)<@K7@hߑ҂CR&y+İ-HCB1:D<9 )t%;XJbS7 "kgnP}+MH\H4LcZs2מ'pfTb3`4:i0NɴlNT6pmR ac@_ktgU,)PJe|s{% o; Z/` htRp*}|EǪtBiHc Bt%$PTN8[=^(+- {/|A!K@ (EV쾴p<+cSHPQ2H0@ID%2Cߝ2'DH.` tȩb>t>Q(Q!!ZH: r 4RD:Dg tdil}CrK^c@p:of8K3řytlBШž Yt#([ 90D0 ,^=P)@eJ:^%O VJm &`dSU(>oP%-V hTHvI!Rԡ!EAdpAtC.6Y'aG ";uS |LIXhQJ|^WGoPX|mh.L:Mp>ei! kK;Hh tAoK1xUߙY(6T$,+^('A@1dP:YHI6K4(J'[g0Շs-Cr퀴(¡X*=#$`T:  ``+6~40tV \*!?"P錚JH2Y=2}=tRAtۈ\Ҁx2K}?K)>w;v1\o Gj$/|\V=@g-N rlQ}at9B VZ텄P&@(N { `p;i"lj(0:@xIz@fxss)qR1RKDKtbL78 8'zb|$@:ȀTH l6BЍף ;$:DZ|eB:DtP`=De e;HajEg @ &BpnC2:P|Bwf0}=dVs'PEtdRWW`6]]ި Ą=pM' HkO4U BQ`)tX KKQt>8-3ywK5t*1&_NәrK P s2 ]] La tR?0 |_CHa t ")QDйѢiBtY@YmcpIsBKnG ,& ` PB *,~zF%Y l^C3Pd{!K a `@Eսb"S|bāA[˾ۥ#'VLc յT*6r`tu?ߑK5>?5Cu_钺C  e@Ÿ%>E)<YU8 .#S G-L@}\2GZQpr OC'gN̯^X?5%A2S+R)XyYt E5',-=@j;lIA/<` Eԙ0 #` 0?N&W!Otr^sSZ,B_8lIs;$!AbMWovtmo)̀ 4*reFT  6 !:M7 8:@>6r8 f04 - bKZK/_8!D5:W(!B*錾W8 28oH{)ޞUǀ%@W'̬{#'Xo|4@3YbN͉ A G~{LK?쑛 TrsLh!:_P) GX 9` 0b.`  tGޑR9 <`2>\KS,T P?G}!d }MC삫7r̮dK Pΰ }#BzHX1BK KW P @`+H%ibZN(mP4KW` : BQ]FB ;V L@X0n=7XXFt%`ԙ=R`k VЋU}O, D2!{0Rf(\A>2]TL =@6 `nBz~ڈ٤ي+B@%x/ꅺ: #uz._5H*L,,?CMW,|t%@WL8@ۼr?: 7o;'G@.1} U2r߆!@sisE&MD8y. !|,2@)ɧ=Ll>tн`T3 Se'_=v(i]s~(Hl N3a]4;/6:h ]7}S  et>b+^qE, %7S 0ĶyS`_ȟ]Ht+5uB@5KYT xpCF% +: ;c ?Bt>D/%D^Xt9Hp):okF :/EtEST:qby["PI)OT'qMp:~:dX` b~ _oL 3[Fab RNTۉLѹLqݚm*Jg4*CH2i0@s/H}4 P}F fEA?s0Sm?Xx#f@ >U_N# HF.Cm 2 10>؂)Ms6} `ɲe_pHRp1D$C32jsOG^34 tZ=f @u P >xH :n4}|CqYSzM-` ؇ ;9Su:dt[_TBt׉L%> HUbbA~(OĹ& 6>̹ -6Rع4_2"}teQ(;p:UooT?#_@6 ?$&*wׇj%`9(wHHY\uA)%Kz?j] )c}^_Ka`+5Kߎz\D=@.$ Ji2\}f|חB1U 4#@1p (j ( } ˅:ohI( ټPHFd0r/8 [ V/Ksi P40Ђց{6\ Qfנ/#qK@"5%X $4I^ {!"'vV@(0`/Cu@{:*ZTpփ_R#| 9b\C. ${ 3˭P[*,aP:.: +$VmYV-6b;㙱"P428BAG4q&E܄0@ҹ@ֳ<naQLǀ5De\}f~J { `p;V˧lC@ )F%iR({l`4(e@774{ 'A[R)+lA&_3=8rb hu`綠mq@tJYHVo`  7Kط~+2<hRD4J/%iݵ\8ytWə*f=4k4)jt z KIOt pof ^HAV yN4Ófͮa8BtB>rqHfam`p3 ѭH eA2 0 EJ@{!4 0f3 [u+x/F!+.࣐?K =&jد\mڎPxNz [=pқdz` x`0hP"D!Hc_=IG ܄#@}Y91rV^S|ae;B `}}tթ{-91BS2g,'=c uچt;# D`SZ7/}M #  "Bub!y%(}D6#Pgd_4d T ƾ5% ?Q*dX f~6XL){ `/Jm[R)*zf,"L$5 G,;\H[*| l t"p CXlz/GFx lEݾƿ|`6x'` JnߢPYTt>qe`E5 M(!?93ir>wZ%.%:V^h VCC/^BB7 &K_W| _r#UBp'AW;J,:a<:spRU[rf09 D۫uVPe:'{axZ;8Zk9m,`3.pmX!/gֹCWYqfK+A$PC^OZnq_[eD51K P p.V?) ˡ:U8E@(0 J uś"&bLR-A)6c u܇)Ha upNT?f u)6^}(:S?` зBb9AΑҨܗ'f:qNR6S 4C&},v_ӐWRK;g g P,$TB KS P H@+NҐ.@_P@:7o;! ̠/<"?IO0:ݪuwM,N=@) *Xvq qfC|4POGmp/86Z3h(0k eDNȖ88nM! XOr p2&=?^QI%$z_Ƌ pŘPSLlC\ڒhB=@@5a`x7!9 X DN-#-Z;bFt>\#'(  'CZmp4$D)JSI*" ,u^H9EK PA+,N5@)K0XxMI{l8+Nn.u 0NO!ÀG (ES>Q`QJp GjZ'^*uՌ `1?6VBAZޗ@MˡL h ՛b3a}Al[UzuD}  6(eԽ W$dBQ١›&J5H[R 4jYKXxz C"C(Xx/g`s)U,m,4@)5 !j8s}`]f.=6$ wPfRcXl<dw 'R }[ C `1 ؇@ &LB>eT#% ]3nXD#^.(=)b _B'Nh!gF%tk FHK@r^()h ,=lPc(j/ZBi\NQ7(  H ({dfp3Ԩ#:#ǻ|"D @(Ph 'Ajh|ܾXE:SX|%:@#Ȱ}7}et >,ʜmǎֿҗ@jcY$ ^2}$n^K{t,Ni:X(JTl  0'h,WP>/| fO*g 0VPZ"ЁiH ?I KW p saAK=7:Π@>` Nq #'AyF@-|*z 60Wc;XNGP`bhiQ {Q ݥd)B@D29h sR , >L1,Xä~@D !%0ݵt12$.We(S94rfJ>e( !?5Ks6uDE%M(Hq~ElM( NᣨXz:\mh= T *tOpy' ǀ$ Ҏ6c 8]4Cz)GP>^p( t`SH1 8XfP`Z2fVIXl7ɥAt`ɮP8)daJ 4͟ nK2c0 ;iMBy#^('j3"VI~t\~AHh98R RQq74$٣\b vh YjsmC?Mn~YDf7(BXzSEh`Huy `a69)e4g&J}1عda`Ct0@Yf - }&@&Wz  R,Nzi/$\bH5Ym^vx#gȰw؟H=_p0>6\-R\ 3^v70O%hpN=1Bn KdD}@ LH3yj`JGTfE,&{RD+t0ߏ_#h p ; !0 PyC Ch1ݡ$zBtO@ĀqQ#?<(;W  PLU =͙# K$R a`*-[nVk Sbg` hN0ؿ3o%,h{ !~n Fe!ZbAV"cu&*P^ r0E 8t, Ixbg Ha vZ~†TŒcLG ?dp0]Fz 5 O 9(/#RЙ.Y*K[ @z+=gW0-bPWE0x`:K"=~fcH {2PHWB:C 7]{sd ,Eɯ Շ NNiȥ`Q2 h` ݄m=K}j2Ԯ!vM-`NiHPfc3PtA6@I&X :qbs%g>b@:f7,'9l6#o@аcGV}40   7;CF> :H<%YP:B 񒧇JװP O#oq3g Rdi(K#= HB>eD'@@H\JK2D;XBhŎ/kPړ(B!yɒ; ~qQn#\#sq%$SP'6% :G ' @<}6 R%024Q̴i` @N.Ir~HlQ0pEzN.@d ::eDȠ,V>pYVs`RDwFN ~Wv!A|,M!lSH>^4(_rU(AؚBfXP 3w(X:@He!f"/P@a 0tn`oMxs`ȷU~3: @30;яe t'hTns%-Sb~JgF{ 0 `AtO3٨w#dq3";vI@ .,\z]p0vP<l, @D<M0BGw`Pt 뉧[Jd+0Rq A}pj[WEDIZ0 F *yKjdF/~K@f3Ja+W!VtU)<:L@ZOD.K   LBOz7 ~DIw`mu]!EqX } Q3xugg(@`/ ϵ;ua*!K4tvn#K@ZPh) @c/LX;E]J(Nr5I_C]ՠP w$N)qDzOhlz)On#q#P`^+[ H$.\jpJX_ãW!.R{R*W o|v. ZGGOM!F @jTeP6Kw]<'`q@t,Z[e4p9;mE'L)0ՇZЇ| Hv8g&SKAe:FQ> YL%E@(Ax_&Dd-$) eEBKZ/7 @":{ǘvJ>{_lB4Zz!iT g@/|]c뉞õ_Iu $ j`Br(k=uu"93dk@&kcu )hn=;ԁ_!XMh},=Ud)"A lb>>#) ~,7]4?XE$ŗVH(6nXDʰ|kg4R  `8&7F Bm)e @ĵ^˨v|9ФA|*]5opvVG5/dIR v&,o J( :39!vv&[!R--Pi4Ⱦqtz8YYmr*G=[%֓+Yk'x$037*P7V6 1e8h}@הԄseAp,o[_06 Po"- .,^ }G7#Ճl!;@SXփhm8Z\斦zP}K1R y:L%:l%'F=8ه$s}K,(ҭo>^8o=h†/|"sɅ, ȊTBFM2,= 81A,VpdvNl2 ` sBZ J5`tC1V > #hF z:[ @ Mfl2 L7@evA(NX}ECP4eB'X}pC Jdl e 238n}G*P_8ts*Ė>et^A'A(`*&XN]Ӧ6'cE"{vHRJ8zPnwNlŚ`>L3@( Q^:E0@ke_j P$qF&h-c68;DCϏOĶ 'w/(D/,qA P$j Z3)#Ci' k*B @(0xn %P ~h;A}F-Pbq՚)*/@BAlt5_@߹^o߀0Zg8#P0.P0,`"|Jha| 8P@͔5Ⲥz7)bS0$Gjh6BauI3m5tlЎP8h<y[I^(2|VZP p D>Chx@~"|hd<S`=!):3tg&!bO!:5`/b.'Id>QwZ%""h?r.0Ϡ%DT %D\.Hèlf}XTB\A )4a!0n nԇ{0#p!-H(\g⭠^);BZ6 BY0[$B X( B9}]4J&ZM kB S |f6Cm?yzc%P>0"/Mua/_h^o5B dcaЇZ%kJ@!2(bC=tYiz׷ -(xz{`pu8V2 ऻA%BXA([JM 5^] (pĞbeɾֻ8P0%@J*H("ў4p -H@C-uRkn/xbd$W#}(S IV-I'dZsB  V.iw2L5A 4ͭĮ]F/DC 2c(pXIiACڭРH|TBS[FӃB }ՅDLL%c$ؖY&"\%d$ h 0s}fؚ\%5Gj=N`7-O/Ċjit ۈm쫢ΎljIW|.fcBuNބ|P0RBQ_7D:I%dpԃjmFbMf"-R>ӄxmA6`sQx~6mjK&C: 2M 2PapcM5@wPp>aU6Th (2<e`e_=8BPZJrKwl`^(ߔVS\-H^Y2hZ @pj3Gd}jAnv)bEuf( QIh R)Z0{4&d3;XLjIPWksg,^(C!] %]Ux/`lglV`4) {`N]V>QsG+I^(N4o`yBZ~e=I  ؇0 {Cx8DpپB)e`fcϐW|l҂HtBP{!YB'jzrG`pb:MT}zz K) {߫PM4^CS`[(p,o@XCtpY`T!u(,W>TVDhBT̖L+8D@DU>@am91+`Ab}5Zs {(^P`T$׃pBZUR6?HY"h9^ )A6>DDXê8I|lQ,`E"/\i4h+Krڬ*[^<r(6F0֙eF_|Pw&2 x)`b r('a(v&A<3IzB DvGx/~%cZpo ZY3/d%OE` [`P}evRQqM43q'n^6zlt a@S@X1;Hd8 `(0F]'lI)JWRr2#z8-! { `HtdDJ0DZ(5_MᷮJvV!}",t-" BBS}"SI%ڱ PH` {P@V42Jr8x5B?( Jl@ B$4 k{3˃/AeWrկk R!@j`Y2 N<^Q+<ֲ*zB= P}P'"ƒ|*9V`GVܪa\š=LKh 4DZ۫}5p&hՓ}²zBzPDCqFيPO"970#׏ZxmG@m5`l$[ }ȱv] t2@(LA}( "kP>Ř # 4⍞`"$@&O  $YHi"Q`16MIn(0S@J7F H(um2@c04'ONѱG5 b @&d  b+j "`^ Cz;(@>`-d:JE z v֪sGM(pm2/Ww#zhX0`hB2T1PteW+QW%@_hΏ 㜅 JR, D"͖A"pԃu}SX62zjðO+l![j `(0F *@ v#LBH/JTB!- `dq) M`f y8l0£WgIAVbޘ[z|LG{2@C Ijl(K$,T-^Ɗ~`YfCEѐs }j+`O/g=w%l@BoUGAS z\ZQQ@*T%Y+ T7=0xXz#]X E=T  C&N -Eip (PAk/w|\%T! @:6Y`^PD_$%  .z< $Td sI@> n$l%`vd/Z6X=,A ` ɻNl7WZ6կ|r)P;kv7&Q_ؠ]FA"N3 ޗJ^qvR s+"y|08m- (gX> k'@w {NiFD(i>;o_@ĝ߰. *Nխb- ɶ&Gy,!Rw^xS },Y=$)ډ C䇵. @h =>7`ܙ|߲z 'T[T;;$@F(`ZXK iX;{BtpI<(ƨO9*I;Ot:^0 z"P)0JN@ a‚(?wP`4d`/"K@b|Ʉ%:\; 6,$H;B&Œ0a|%l:{RT(Db2لS-#;]KPz#\P~^('A =RR^ R/Lw`~]h p)A&\d z'%'Tce ȔK1phRᚼ3)| |hB! )<Ɯpϼ#DUzrM pC=DJ(%Q乓7p@p+@K!"otDD@ {yzMϸ;,`h`7 `xe" ܉HAzsyg PSȺ[P 38loY<{+,<#CK똹;i~tc|dIlc^IklJ R{gQ@d+ F2/mP'fwPe-K b 60cDAay;kg+H YeH:V@R> }hX$ L_A dLV`/=%$༈xBQODAIIXr@y,+AL@hG>` (nN)l7H` XwED @(Z*mS|j`b,/F>0Yr<&5H4牄2]);op |3M;+O˫'lr.@K@ EZ,(!K1O,T F<nK%bl|Y'1pO C67{IdeAZ(&#@ ̫!%@y*Pj9 Z"0Xf# \A1l5LZƌ/ѭ JYd^ =@YUc$HO wA_V_$(X`"fT80(9@^p>mY`XoS YVص7*D;9/` w6Y65;j/k 8o9HNw:XDGK h $#No 0 dUPv/VyLS0 D/wN'5J fސg&!j1 ЕC``-Q`8tZ'Zp@R ^t}~  yDS{!xw'a-/` wkߌ{ Hs3@BpI8>C>Mo@BtA` $Ǽ)<@C<X)Ԕ8d00#8@ |@(mx^^9%m{=;dRwn#$g&!) P@)B/ O$:>ò#@`nP.#H<{=ԧURz%z(kMR;^D\UсOxJeXlRs;3O)` bTP%$,2,_=!`Q BtXK` wJK zyt AA2K4vũlEtvl*k:,+?-6  B>Гl4` `z>1 :; b⠻Iwu)XuO_t,T) , Eu1X3@$CZvx4FPU3>}s%#S3Cd牤:b,{=Q `QcwW.+库=\R&N F%`wkru/E|dpK^Ld%fuoKQV HE=U nF4VC3dmI:@v*$9h3@Bz#> !m('a/;Sf&`:lCбOKXtoP`,` A7 % ]*HS2K4v^%`` `Duk )'ԙ( TeܞMR 8ER0t`_ !-Q`Q:3t',H!Eăẅ́;sDPrd{ Zۂ*2M^&J5 `(P"A@,KK^@Ā\(b(!dHuF_w BB")6  </ :t1L ""(h q'pŠ-&r9'F]0ۂxCΌ[hi_G s?fC` xdi)-&wc @` >{S g@ D- &WIW$w'@gx0|=YzS ," K_/ YClcH I8Vt=+@ta (X2`.% a٤Mj?^`Zb&A3CE\z{H1@f = ό {1j 8I=>u3RΩ+D~FOg`$U0>oP)AZD2!i8A >pq@bjs2}"UD*D"OF m5?\ =@d4|'B T#t|=#jB82 BP5H#@{U ѷ,;a^ uXK>2:@Ƚ@; +LM%POb l\ (΅ι ɰaAa@>MQl(h(APN{e\<41OoCbOJb`  bx`.DmO5@#p1*斖K, evZm fM%3/Vx>l||}f)J:5;H{sS@pMCʅҰwG]WvlpKL-}=ކM nx:A T dx.:3O`;|u>0qs-Q#R@¥,,OJ>r:˖&)tg0j#7at:]!:I?1<%|؂%.J1t8~OZnPXʿpSW xkK>/\ qF%KG  .P{s}D4}РDCH |e՜%)m)34A^Yz9ga9F6k ISJ R`GVOz*2 5\e#yPK0깃cc>!*ӂhJ} 5lBKQZ`+Jq %<Iնjjzp-'A$ Z@n q/F( ( LCSrd6Xe},Mh:Se4L}Hڄ^I]^_Id1=Q hh|G(@0"o:M5-p)]4 CJxFn{ `pe3 [@TNA}DxO_,2xb&Z'- C qd N"; 2 tfN(hD/l4vѨف;X *!2.g /R!2}FMb(Q44l=H`c>T(<ACk PQk3jƚ#XړHŚP@JrKBjkxӂkRsoL!>\osէ`/иO T ZߧE{` P@_IHXj&h{}*B}8'O6I4 F`e3@> E㰐 ` eiNX{$ -lYC Aw p٨ 5+p GVJͶ ODX2e-AXsp:}",Y@.)Р,?&X_cʖ n%kBUA_RS"$\s:D%+[pALOzV 0LQ贠iH X^[+Taz H# Xy$bpY3 o/$r Ms4 ͦz 뵊p>:K_3uqn)>@3!QmfcpmTBTCŤh2S/s1¨BG1c),_5 Üm:@^(H(s,wnOEEzNt~XH *9`ٙY@[l<3et:JH d XyBtt) N==06$P@  ) A(ATn? b`hֆXhrS(6!*# CqFA*R2dDI+]`X>ujRp0jC$[GnjJ؆&_FJP*XH1%`cB*lRh{n0o:̂/hw"_ 7E  @<eZ%f:sRhQR lCjߑD`{)~r\is ) $^ yH3HĿД T&\;@ GH<bЯ% FMP\pҀ4/齽j%Yw˖xtP6ê!HH@(^p}F]Xdm ,O`SLft3B@la^(" e ECXT!G;i y0A=4%` e#=$&9d OG@:30ջPey:A,_kf Hc"F"̲2g`j (D`ӛ  sS!zGy= -WvD;f' Fzo&i pyӬ%/YLR (KxMl{\}1v`\vI7@A'A dq򌐖˻` xkv}H>!s,.6@( OTtN3Zxw̕KSzr}y܈Gލ{Idp& `,` xy6CRK 48)jik=8@Jh]a  aaH$;U70"$£@?xZLo6O!_d |4f) "@UmFfpnz;c+rGm(+P(C`|)mm ,  `t_[#Ќ+^5)-xy@E5XwRx ^`=#tlv#&@}>eǜsЉ|@*|2?&( ,z&.3` P+81rB@l3xfB0y_o!B*ϥ&``@sg @|s43471tc%;  @~y@.݇hJD1?+B$B@qIicm&;eA0t;%`OP["|6G:K` 4%@E 7VɉQz bT!ptzLlN(@Z50,=G~8և}t˸-"J%@jJ7"g{Hf,PU   [ȋ-HèUQ9J siKH~m}` yzPd` Bf$G\ ` A;"H{uLt0%LhJԃ$#Д^47K T&HA StUrL,$`=@b/X5,&;^hqFE8j RfD6! wP$vyB"kC FB]3e\&@p=9L(@0/f(!^2GR34$#ȄahYM$VڍAz*APL0>rJN3`QR PB@nȖq2R3Wi j!:- uBt|hG0FXP`g-^#mAFz[E(`r8QMsp ‹@mD2ʽZau)2F aea/%;H% C5 ONL c3XDԇ}9 0bf yf#ieB G1+$CP`bXB"SDq/I8A\ `/ ,/FU4]h 0Sпi#ZNQø(m ?sCeG!dxhAtDT1Px 8Aѯb[=)^˽@>'ڑYA@w$ 'Dxv_HxV-Z hlp;fچAůz!&` %9K@`0Pk^<`_ ]ƌ/" )> !J%C^!ԳUF0`8ƞpWz: 6K@S$F%E(fwI3( ЀAMo%Ď `4ɅUS 00@thX{ 3a E̅J=o7) xp; ;P|,=R(^P&'EJ-[Izh,3g Ě'4>P=AB\0Ta=fT *U"noP `C iG{^PcdH $fd\gT=]w$%]2zл#9tgtlF ؓ ū9W^M 0DI2?E . ,uhP8zIM֭)R=cAK P [~|\O4}dq=-MpyHvN z,[Gӑ@آlMǞX2I%U/|܃|^P4=b! SM" ً>\%G5d3]EV80\}LDٻ"z*y!tAВdFmR#` AvBoHå [챻"߷p1>_&Q l(AҐ3H6Ho gLA=F]";E@(0 (B49laO"*JǨg 졃''s1 10111213141516 17 18 19 1s 2202122232425262728292n330313r4 404t 5!#50!"5t##6$&60$%6t&&7')70'(7t))8*,80*+8t,,9-/90-.9t//a0a-15aa6>ab?]ac^adEaeF|af}agahai aj!$ak%/al0`ama_ an` ao  ap ! aq" 9 ar: asHatI auavVawWaxayazb%b-babbbcbdbebhbibjblbmbo6 bp7 7 br8 B#bsC#C#btD#E#buF#%bx%%by%%c% Dc-%%ca%+cb++cc++cd++ce+,cf,,ch,?1ci@11cl124cm3444cn5474co84?cp??cr?\Bcs]B]Bct^BcBcudBCcvCCcwCCcyCDczD Dd DVd' D Dd-DDdaDEdbEEdcEEddEEdeELdhLLdiLQdjQQdmQQdnQQdoQSdrSkUdslUlUdumUpVdvqVsVdwtVVdyVVdzVVeV&ce'VVe-VVeaVoWebpWWecWWedW:Xee;XCXefDXtXeguXXehXXeiXXejXXekXXelXZemZN[enO[]eo]]ep]]eq]/^er0^^es^@_etA__eu__ev_q`ewr`y`exz`beyb$cez%c&cf'cpf-(c(cfa)crefbsetefcueuefdvevefeweffffffifhfjhhflh%kfm&k'kfo(kmfpmmfrmoftoofuopfwppfyppgp{g-ppgaprgbrrgdrrgersghstgittglt vgm vvgnv&vgo'vwgpwwgrwhzgsizizgtjzkzgulz{gw{{gy{{h{Rha{hdhe!hf""hg##hi$shmtuhovWhpXXhrY[hs\\ht]`huahyRiSqi'UXi-YYiaZ`ibaoicpidieifig"ih##ii$%ik&)il*{im|(in)io7ip8DiqEHirIĒisŒitTivUeixffiyggizhqjrߗjatjcjejiוjkؕؕjoٕjpjrjuޗjyߗߗk5k-kakekfkgkhԙkiՙklkmkn kokr›ksku%kv&'kw(*ky+5l6Bl'88la9ޞlbߞlcldlelglh li ljlllmlolplsltlulvlxlyBmC/m9DDmaEmbmc׭mdح٭meڭհmfְذmiٰmkmlmnmoBmpCEmrFImsJOmtPSmuTmvmwmy/n0 n'11na2nbncndneZnf[\ng]^nh__ni`bnjccnkddnleenofrnsssntttnuunvny oo'oa5ob6oc#od$RoeSbofcogohoiojokolGomHponqoooporlosmotouovIowJ^ox_oyozppapcpdpeEpfFGphHVpiWpkplpmpnpoppprpsptpuypyzqq&qaqeqiqoquqvqwr rasrcttreurfrhricrmddroerprsrtrurwry s s3 s6 sa sc!sdsesfsgshsiYskZslsmZsn[osopsp sq  sr  st QsuRsvswsysztD't't-ta4tb58tc99te:tgthtiKtlLMtmNNtnOQtoR!tq!!tr!/%ts0%7%tt8%9%tu:%>&tv?&?&tw@&&tx&&ty&D'uE'\.u-F'G'uaH'H'ubI'O'ucP'R'udS'V'ueW'W'ufX'['ug\'e'uhf'f'uig'g'ukh'o'ulp''um''un'$-up%--ur--us--.ut..X.uvY.Y.uzZ.\.v].83v-^.`.vaa./vc//vd//ve/0vh00vi0r2vls2x2voy23vp33vt33vu373vy8383w93_<wa;3|5wc}5}5we~5*7wh+78wi8\:wk]:]:wo^:;wp;;wr;C<wsD<D<wtE<F<wuG<M<wvN<N<wwO<P<wyQ<_<x`<<x-b<h<xai<l<xbm<m<xen<{<xh|<|<xi}<<xm<<xo<<xp<<xu<<xx<<xy<<y<=y'<<y-<<ya<<yb<<ye<5=yg6=6=yi7=D=ylE=E=ymF=H=yoI==yp==yr==yt==yu==yv==z=>za==ze=/>zh0>3>zi4>g>zlh>i>zoj>>zt>>zu>>zw>>zy>> @!mq@l@*l@s@@tP.n/X b$@ @3 'l 0 :P1k0 '!6#8 1D 67 "zl $~P @4D :60@$q@ 5@  % 6p8@ @< 7@0 1@4@4` 6 "P 4` &qh : @< +2  @< 5 /@ 510 .x *x` !$7D0 7 p +l2@@ 4+@?x@:  @?t@ 4(` 5L)o 54 @3l @?|p@<  6, 8|0 -D ( 0 :(2p 5`3 @-#ct0'H( : 1`6]"0 :0@< #Z@7@ 8l 2d *`0( 0P)ODp5q@h`@?D h @<k` @? @<P8rp 60 8:7 *v @$uX`'@ @<r 3i0 "v#`@` 2 @<D@/@cx@?@?x (l3@ 8@<P (X 2`\ :@056< 6 6c :p p+@$p @< 8 @4 @~@4*{D @<L .xx0 + @< @4::L+0 :+ 6 @-X 8  50 7NH .l2d`7l!Zp +j  @?@? 4X x : 5 @4! @<4 ( l@2` @ 2 @? 3 @+:6s@@h \P@  0Cx@5@ -~`@+P 4L 3@ & 5~<P ! @0 @!' +X@<0 %0 75 6 6  3s@) @)p %L@< 0%, @)  @!i ( @< yx 0@ :P @" , 82h  @gpp,4 @)0@-` 4< .D 4 @+@ @&0 " :g|@<` @?l@4x2iDP @!p ,+@<[ *0 3 @<@ * "t4 @'` @<@ @ @t@ "!$z@% 1X 83P 4@<8 @<, 87 83d1` 6` @<&P !aP w'5x @#'`@ ' 6 1]7p` @&D )U@% /  @0@@ 6D @*x @<`)b#!7#L0 3 4P 8%O' @/ \4 DX )| /X @< 7x` 6pt@?P f%`U0 :@?:x- 'P 1 @ 4 #$`0lp +8 :@<( 5` 4x@1  @<L@1 @<DH6XP#tX #$]9 7@ @4@/0p0`0 &#x&@( 7D : : .0 @}@,P@ 3  2 @<+@` 8t @<82<@ 3 : *:0 506XW@2, 1p @T``@$P : 6,# e@$,0# $5j 0 84 5L 4D  @2p/X8@/@ % @?X0 + 8x 8L@ 7P 2D :5)@2Xh @1Xz@ - )XP . @< @4|@' /h@` @+ '0 @3`@<Dt08 -(  5 @@ 8t4@3 5,` @*a\` 2 40 :n @` ,$ " @7 "x@$  @@ '8 5d- @?:: 5 1,0 21(P , 6X $02x63 @<H 1 ,0` 6 @3 6+ 24 @ - P t @< 7 'x @$0 2l@+R @&M@' @(P 0: /xP@6 6x4 @<x 6 @<D ":0@#|`  $L`@P @?@?@?x` 8 *D#l @&* @4( .P 7 *p "p$, +( @" @$r$P2. 8@4` 2P ( @3'( @0 @'l)@@0 5@-p@<00 #( .` @<P :@@&e(@M  @ !h 8X &D $4"y` * 7X 3x` 2x 6@+D@<@/H@ @`\` @<0 y4 @?@< @<@ D($ .` @"0 " @ p (0 5, @<L0 7+X` 8@<@? 74 D 784@ @2 @? @3 2D @<L @) 1@8 6  @20 x @+t0 76 @?  @?@?:@< @? "x@ : 0 %@?@ @<  t0 : @+k 0lY9}p 8 3D : #@?L0 7 2@?@W1l) @%`P $ 1h @< 6D 0  @1 24`4X  , 0p@)X 4Z@ @)dp @<$P%` 670p5P`7, #0@ *l@1@%pp@&  ,ip -x` $@?.D@ 6l 64:4p S  $ @< )l@<XP(xX ,tt @-h:p 5 @k 320,%Y$&,`  1  :D 4e\7( / &0 8`%5@&V,0 1L .j@ @iP Ld @l@,@ 6@4L@?4l & 3 &u 88 @  3X@ *0 0Xl hP @4@?,@*$ 8, -Pp3 46P7p @, 5 @,x` @<@?"_d @/  3( 0 .@<p*@p:P0 3L 7` 'l @<8 4L 3` 5X @- 3X6 @<P 4p 4@0 2# @<4":``2 @'5@1\ 61 @4x cp 4 $l@P $M 3X < P @4f@3d` P 0X1 6 *0 8` 5@<0@ 6dP 0 rdP@` 1`@?` @$P * 6K3X#4@4 7\@?/ ( @<4 :L4 @4!5 @?n@# ` . @@0p4@ l@k0 s 5LP@%z` /J 5l7 @  +P 6El@!ll6` 00 3x0X@4 4`  @ 0 b8 5v<` @` 6c D @-x(d`/ $\ 80 @4`` @<` :u 5 $ "` 5  $D 4 5x 8X@<T @- @?P_ 3``* @)L 7@ :x @#@@" 0 26Hp3tX@< !L` @<` : @b 0@<@ @4($@T-0o` @*@  *` 7x7(u@. !DP@< ,\@:t0$}p'@ .` @'6@ 8@@<4x 35$0 5~ 6S0 :@ :LP $4 6  3sX (, 0 :` 4t@<P  @?@?@"` 0U& ': (L@ #(@ *$ 7P 8[ x@2h@3eD`l`# 5P 6x 4P 4(@3 00Y8:6 2P4i`)8 + @)  %dp @1q @Xl 8 ( (,`@3( 4 *X 2 @ 8@<$ 6x 8P1f0 *8 6$@2 @<407Y , 8%j 7|(0@45=L@ 6@ /i1H@< :@ 506$ !"@ 5 , x0 *L "r< *6XW@:~`4<V2 8@ @*d %0 @ @ lx` l@/4dl@ p 0rPV6P7X :` "`@<V@y @+|@ 1 : 6   @<8@ 5 @/ "P / & " - @%  @<L@< 8` :3PP , 4X@?  2 +x @ @'0!x 5zl@W@6@<@'X5 %@ %@<@?` 7P@.L@1 2< 'L10 Xp(@i h(@ &4dlT6d`.l   @+ :l 2l , L @? 3oDp @<P@ !! /`p @<+@+@ lPP @1 @.< 6v40 :( 0@ :X-X@* %~T07p &X@*$ 4h / 20 6, 6p0 3L 1 @|0 j *x/D 48X @<&h7x@ @ @< , 8<! @4@0*@ 5x 6 0 @2l` X( @? $@6,6 75`@ "p6@?2H @$ '@ &p )` w@D` @%@ 7*PZ8 : W@)8X %l 8 1p :o! @$@<~p 1 @'$T &s@ @ @<P8 p@#8 0 @&{pV*W  @<1,p@,RP '8@4 p6x 8x '|0 "0` 3 2` @?` 6 :x@ @34 :P @<p 73` 0@( ,@4X :0@,p@107@1p1 0 @<P @$h@4 %L` @<#7|8D 5` :D 8l` ::  - / P:p @<@ 8l@P 0L0 ` $l6 @)06( @<48P dY60 74 :lt @ 1@.Z  3yD4'P` "0` .D (, : @< 6( & @35&x@< @2 @1 :< @? x %,` !@ .`+ P+ ![ @$q`@  @<x s0xP (5x 86W4D 6`1sxP /p 1XRL&p &` @$(p (P @4( 2@!4P #` 1`06 8 . /0 (sP@<l3s5@ 1*,U2 0L 2 @/,* 62 @%$@ 0 %Z @}P  @# & @$` @3` :  R 5` #pl@ .@" 5` :o  8tl 5P@ @4L$ / @4 4@?@'p@2L 'P xw` : 50 @?@3` @4 0t@ 5D!yX (x vP: 7(p50 : +` :<: "@ 5s @<4 0 "0rH ( 70 6 8 / / $ :84 ) (8: +x 7" 8 @/ 0xp@$l 80 2@ 1x \ (X 5P@  ,] @x / 1` :`` @2 2L@4  7`  @ @0x4rP`%4H 0 @U X ,@`V@1 7p 5 @<@?@? #p +`)0 @ D )8 @p 2@ @< t @ P /0 X5*h )0 6p @+T` 3(p@ @L 6l :rx 0 )DP 1@? +l` @3l@34U@#xP 6x 6X\8l@ 4| 83x 6g\`7f @6 0 6P@! @4h@ @0 4W84@Y 6|h8W @3QX !e$ 5@ ,u0p  u` ` 4P 74H` @+b@@*L @44 6},p :1D+U)X l-H04 X2 5H  , @@3@ 6 5$@%@:5( : 5 & @<TP!P @*@-b @"L$ @0, .p 2  ,p)l@(I 5m@'$ 8`@. @3-&(/T0 .p@<0R !M@ 66 52j` uH0x 50@?@?+` @< 0AP1 6@@?@]0P5'P'XsH 5@?p 6$ 7p @@p2xl :D` c j`4` @<@ @j$` 8x` 7< 64 @+ @'`` @17XP @4 @< @<f`0 |3d@.@ : 05  @* @% /7@<4@0(/8+|0 '^ 5@ 8h.X 7 p @( *0 $(5{L :D.,@<xp 1 6 .0 1 '`[>x@/x07X @+x 4:, @<4 @0P  @< @<p 6P l@< . @\X ' 7L' ,/`@ 7h: 8 :x @+ +*0 @1(8 8k ` & 2P @1@< :e\ 0 "X@<@@2y8 '@ /y2td@6 .` P@) /0 @?@  4P :' 8 ,oD @)P *X @<y @4v :6lP 543 @&` @$0: 2h '3PP @'l 8@* 0 6 6-5 44 @ $P 7 &x 2( %,Pl$0 @+ )x 7,%x @<<@0L #x 40 +X d$P 6 4U@/ @2XU2dP)`! p @ 8 @3D @4x @< : 7  -  @ :x 8@$` @-` 8 @<q @!`:+x @)*l@<Z @4 :x@ @4ql /t  0 5 @<4 30`@< 1`@,, @2Xp @/4 T 2f 4]`5l :360-d @++ 7<0 @<x 4X1 $L 74 5 :0@4 @(P@ 80p 7 !x 6X ,s @3x @4X0 @  @0gP  @<:4 ,d @<0 6 5h 3g 5X 2$\@<P 8 ,L)%$p0 @<`&wH @5 6@0P @22@) ,V@6y@ R$0 #Xp 4a *l` @<4 7^ @+h 7@ @" + :r4 5 8$0$\@! 0@1( 7L@+*L:@2O 8 /@'X` 6l` 6Al i@^4 v<p.5x 3I` @1T :l @4x 50 + 7 6PU4 @&P X@  - (` : 2 7xp0U@5`-X 5x@#`@? @0  @/` 8L @<D, 6@ 5 1P*P :l 4t :x'  ) 7X Y4@<l q, !0  @2p@.03lP "tL@/@4|L  D % @<&L 3@ @<@ 3` 4 #$p @%x 6x0x *}(7@< & @.4l` x*0@? % 1` @<l.` @,X3@ 10 0P @t 7P` -o @< :d*k 8+X @4 @1@ 4xP 84 5l 1DPW5H !~ :]5 6 d0* 58 +4 2 !X(l @!up0@<pl0@< i0` 4 @ "Pp +p 6p)` xP @% $ @0 @3`3 @3 @!@+~7p 1` 6E @/P /@ @+ 6c/p @<)D 6 @)P @?iX)t @"x`@ P 5L 3` @<l`  7`2 )` p $p8n @ 8 4@4$SH0 "L @1U` +{l 2x%L0 '| z @ @X0 @`D 1l8l @)@p Kix@ @+8@1` 0p /@ +8@++h0 # : cP@*` @<`p @&@&4 @+d 0v` 5, /p @<@?#HP 5D /8 TD@ @<@ @<t0X  Q,@ 3pZ( @N " "x#o @<8S(P @4d@*i 50 @</0!sP'@)l ' @<X@ @3 (`   :@$0 . 2 @)83 0@P T 6L 605l` :!q`@# 'P@* -w8 @<1k@% ,`D@ 60@ )p 6@ 88@ @3<P 5D 6 @<`2u ,\+8` 5x -  1 @3X 6'u,@6@PU@/TP @<[ p 4/ /@74P@.@? @<\4x 0-, xx0 @p! '@2 8lp/,2l@*T "   40W5p @&0 : %W 4tp @+P& 68V2P 6p@2 @<j0 2 `  V @(`p@X '1` 8l` 5P x 706\6S0p#  @"u` ,4 ):X`:3P @+d @14`@"P 35zl@<x @<D 4@ p 8 @)]`@1(0  @,0 @<~0 @? 6 @<` 0 (0 "l:` 2` @@<n0  @ 1 6@PT3Ll @<@+D &p 5` :@$uP` 7`` $H 3 84  @< "z @.` @ H @<P 5`  @<<$ :0| +p 1 @<@) @4P @t `$0 #7@<t s 6 5 @@<% :d 3 4| $< 107  'lL` @ 68 @< :  @%@ 6x @+l1*,Y0X$@#I` "@/X.%wP8 "P @D *` @<t`6X 6 6 %4 *g 5( XP T-@)\0 55t`@< (< 1` 0 00*U/p&4@ 3` 5@3 @<`@  @<x @'48 4x 6x 8@8Pqp 8@ 5tf0 @< 5:n`,t/H@3 5l @<4@* ( 0wP1m@ 7(@ @<0 20` @<x p@/@0 '@?@?8@<U.@ @,` 4@? 8 @4p  1  @3 $@ &X` @6yt *^X@ 2` 3n@6 )2q` @2 00l 3i@!  @2 "0 *1u @1`:@<x @1{x(B0 @< %x :02p :x@/`Y 5@P & 7P 8  %0 +0!L@ ! <01#l # @3p0U2P /@4X@?0 M$ 8m0@xYP @0 P @   -4 @2L0 7 /@ 6D  @.L 7m@?-l@&0 26p:WP+@` , +,)0 4 4`0 @+ .8 3x@ D % @< @-L8 @?U)0P@4  pV4 5x` /x Pp @)l` 7uP:83X@5| @* @1` 8P6<p  @<@ 4 60 .x @< @x07 #` 5 @?t+Z@ . 6 @*@ : 3 40 @ + :t0&L6 5X@3  rP @~l04p670 .P 2 3@ +:l 4@@432 24 5@P #*` x @<  4|   8` @! UP 40 @%  @4d @?" x 4` @?@?X` 2 f8` @"\@"{|p@?$TP@%  @4x , 21rP @1 $L`- @. tL70 $ + 3t4` @<h @?@? 7 @< @<X @5*`/@?@? /P 14 5(:x0 # 8@ @<\@#L 0Xp 2x$ @<@ @]0 @@l *0@\@, '  @4|p6 5x 60P @0 1`X@1`` 6@8l 64@ *@ @"1@ 6n` @4 :("@?|@V)  6 @3 2-8@ o@4 2:2 @+` @4| 1 +08/@?7l8 3$@O4 @?0  8x@?@x @"  ,@ , v 4  8008x@* (X: @$T0 @<3P6w @<l0 @< 4 .ZH 4  @) / @)$0 7h4p 'lPx0 1` @<@)q @2 4H8 .P @3o 1 !2" @<DP@ @?6 4l 5l@!X@)@2D (@<@< &h7  7l_5 @3p 20 :Qx :0 5PP @<q  -zP + 8X@< :`$m +$}7 t )0 " @' % @<> @?` 1L 0 6  &t@@200 @%~P !@+( 3 L8 @" / @4x @<p@ 2 1P% 60 @ @<  @< 8 @24@rl @#$ 40X@  @ D@?0 2@? @3@< 08 .0 0`@2@<  ` )tx0 V @.@?-3@?P @?4)x @@ 0(@<l @< :P ' @4q @?@<0 -D @ 2 0P 7l 1 @' @8 :l 8l  @<x0 1, @<0 X 6P @+p @2x 8\P`@$ @<@?6@-` @ e #(  @0x / g@?@?0`78@<P & 74}   3PZ6@+P 08 2< :@< 4Q_:V4x @<w 8@ 7( +@ @ Q@1X 1`"8p*mP 1\ }p*0` @]`6l @<d 68q$@ 8`@<\U"p4 (xP@? 4 2^X@?L@?:l + Yx@?@?(6 4 7$"mP 7c400@< @ & @)8 8@R,@@3} 64` '0  )l :P @<2  4w 2` .4 .X@2@` 5 $`X9  3 6@rx ! @4P 0T$p\ fX@  @<( (@ ox @, 00 @\<0 sS/0 @<x3^D@ 5  ) 3H :0 !xP8  3!<3l &@?3 @30& @< ! )P-LPW18 @?0 :P 68'x ![X:x 65"0 @3Tp 5\ + $4 @Xb :@ $ p @<`@ @48!@ l\ ^5P(D @P$L0k80 8yT0 @< ,i\ @5l0 @0sX $_  @$ 50 @- 2, @<B @< '0 $oP ! ' @<l0 @3x@ 48 :4 @<N8` 7d@&P 4^@#^ @41d @%0` @% @$K 1 $.vP44 6Dk\ :X 0 8x+0:[@4 @[@ +D 2P.~P`, @)x &0 +x("c#~8p 4 @f@?@?@4! @!06,  8@ 2{6 *L :@ @&T`@4L @0 @+ $< 2@ @# @|D 70 }L m@ 5@ @l0 :l1x@ 3T  0 @'%PV40 : 3` ZL-0 6P 6P #7 3@(x 5@V*z0 &x Yx&E 4 2@ i8@# @<-` .@`*P ` 7x@ 8P @4L07( W28 6,@ $(p@% @dP : : -`@?@ 2 6 2 )X` @ @4@ 1 @?, @*l :I` .p[p6 *)x&X ' `[3$@ -v  / ! : 3$"g0 #@ 8 /V *@@" (|H 5 @+ 0( :l5ld 2 @<0  1P 6L /o  @<vD :,@ @-xY@5`%0& @<p @4P` %P@ [@X$xP@&*,54@ 4$p '` " 8@@<?l" 10 &T @%H 20 p @/8@ 5o h 5 @<( 7 23`'x # :@ 6g@@0P3p@,p88 $}@?x2 @& 4 8 :5 e0l@<q( @2$ 7` @?` )0 @?g %t8 @,  D :D @<wV@+ @*P@) x8$P @<@0d3:q4e< 48( :D 1@<5H )XPp 7x @<: @<:t`$@$Lp@" 8x :}@.n8@ @$D@? $ @oP2P+@ -PS) ]P 6@+d  %X0 ,x@@00#`1 (P70 & |L@,{  @PP @<W'J0 +@( l2 :e :ox 0 @. @0 7 (T @(` @< ' . 2p 28@ (@ @3P @<` 8x@ @?@ ,0 -@,DP 8@ \ @p 2 @# /  P 'c@ 0 :( 6} 4 ^lP)`)x @<0 $fD 2@$0 - %P#L 04 @<X5@' 3d@&0 47 %%x (9l:D@< @ @@ 1Z@@' A 6@<`# @Y &` -6, "'m( 6zp 8K0P @3a` ` 6UPx 2 6% 5L@)| $r @$x/ @<s0 : @<@3`` 5 4WnX75yL 5 @<( @< 8 @  6 5h@  7p @+L %`72 7  . :0%z 6l 80@<@ &l :7 5 %Dp lr0 4r`&@ 1D W5P 2L0 6Pp @1P 6P 5 2x  #` 4$@? +L 2 @3P41P " P :+@? "x 8 6 / @<h 4@ 5X@ 8 )q3)|@+d@1q@` 8 1$$ 'S/8s, '@+(2T%( m0 '` )4 6 $ H`$ 0 - @#80 @?l@1k\0 @? +iX w4` @?@?P @<@ LPT%X @* * , 6 @1v00 1x 4l 6@ @` 3 5 8l @% 6@?xp @06X $Lx04 :`` @<D / @<P @? @?: @<68@? 3  @@rl@( 01 pD 7@1Xp:\ x @<7s$L$ @< p /p @O! 7$ ) 55P 7~l %0 @2 1 6` % @% 8X` 2K @,4@Q 8` @? 7 @8@ @* 5L @< @! #f&4l/ # 8P 1@(( 3D :l0 8@:d 0 `P )(6`& T @<0. "K@x :  pX` @<(4 ` (#@<:P @) |DP PP 17@ 0 D @< @( !` @+``!<1L 5` 8W4  o  'Kl@@.0P *@ )`@&t0 * 14  L!85@ @&P @& @+< @<| 'y$ 4( % @2,@ #!L%| $! @1PP 2G 5@?@<8 7@"0L$Lp 2P@ 3@< "`  p@%:6@` 6t@h@` 8 @?:`"@<x 1@<XP 3x ~< y @18@ .X@ $., :il @<`:L "L ,` 7 :$p 6$ . ! @2x6` 'Xh0 : @c @<+@ 3p 6P @P2L6 4x@ @ : 1  5x @<U(|@<$ @ 40@ 1`` +^X!P3l+2 @ @<@ :@4`` 8`@"P @<x (` @< 2  5`@)@ +l L`p0 $X 3 3 @<  041L 3<p/PP @287xl )@4lp @<x :P (p : @<, 8` 5`- @+0P 00 @Wp @<) 4` @4 -L: ,  @< @<!P @+ 7 @<vp 5@ 5, @<@.-@0!` 5@ @!l :P 6H@ ~%Z``14 #@y l:s` @<s@ ' %P 8 2 /@ .zx 8P 3 7$:`0 0W  +`@<P .L $p@< 5 6( 1P: @!}` @< p 4@ -(p 1| :wl@  60 1@@ 3|P -  p/t@h@?@<t @40 @%8 4@ @xp @<l@*r( 3HP %P @ 6X +(P@LP* )@?66x07 2T7H`0_$y@ @3L @2L ' @#p @0Y$ k !x %x(:8d0 :@<u @#:l @<m@ @t@ @% 6` @<  @s ~l  5 42x @`4 @@?6 @<x@ 4J 6( @%x   $` 2w 5 8h/D@ @a0+8@< 5 6x# Q, @ @u 4ZL  @#jP @0 #xP82p *`50 @1p%,d :x , 6@ +84 4f`$P 's 7 3 6| @<` 5`6@)@<u| .x 7 @<y@ @, *: : 6 @,4:@(8 @+l@<x4m (P0 3H` - @< 4x @+0 3l 5@<7 5 @)l& 3 2  8` 2P ( @<X :`P2` 8 +p.X@ @<0)` ! 3 @ !X7p@27sP- ,` # @/@@ 2D : "P 5P8P 8@ @*p6 @< 0P8$ 8x ' ( @%`p  7P @40 , :P4&l@41 :0: 4@1  7|D0 5| @<x @-x 6p d 2c` *`*l$0X @^p 5 2 3 ) 8 @? $80 \$*3x 60 @<0 @<L @) @<` 8P@<x` $ @<@<@'@ @<8@apL @XPX@?('0@ L 4g@ @8`04 T&0T 5X `@ (0 @& @<  @xX %l@?  (4p6 6HP,@%D '0 4&` L -@]40 4| 4\0 @4` :q06 @<n@< 7%P 1lp )l" 8` .@6@ -g@0 @0 2 !$  :p @4 1 p@<@86$p p 38X 0   . 6 @&\ d @<40 4` -t0P "Dp@@ 40 @<j -6@   ` +P -GLp P 6 0 @-PLf 3p\ @$ @[:@ 5 @!P8 1@<P@ 5l/h |4 '0[ :h ) @?@?@<P# 70 , @4@0 : 1Pp +[0 @4X !\ 0, 7j @3P+ L@Z@? @ 7l p +(@ #0 1 1 : P @"( :P o@ /L 0 @0 5l ( 4,@ @3P`\<  (@?@&4 $| @'P ! 6l)` '8 !@]6 " @<@<@pY7x 7` 6D :x 6 6n 2l@-,TP) : 8 8,@. )D7  :)D 0D 4xP % @4 4|6@/t  + 5j @%($:u : 6P 6 1: 10 @<5 & 4@'3P 00 @x6X  @, @3 @3oX :8@ 0 @@ `+l@ 54@?`@?P :tP @?60 8 @(-` @,2l0 4vfx` y@? 7z4 #x  $-l*  /  2@3+ 3l )+l\1 @) x@ (y`0@(t 8l #l (@ 60 @<D@5+,@< @2 /u @ ,4 2 0 # 6XP &0 TL@ @<0)@ @<@ q 5 *xD'.@V2L@xLp&0 $$0 1@4` :$ @<oP@4 v @ @<o L` /,@5\ @?\40 )$-w:0 8 ,t0 @& ,T@ @<p /X ("`1 @< 1 , : 7X* @ -p # @< @<l@  @+ xp @<t @< ! 5v 4 .x@< @$` 5 6 8P 5 6L 4Mu|P!pztl : @0 @_x: 4@<L @-@p 03PP 2 @<X 60@1&p0 *l  X 8@ @<D0 tU3[@ p ,~ ` 8`@  :vp6@ 3L 3p 6, 6R +G0 5: 3g8"t :`5p %@"ti@&L @@)#D 1 0@3X :@<L @11` )`P 7l .od 5@ x   :4 ' {8 @*g0 50 @<NX0^X ' ! @2l @!5X! @ 22(@*L @4x7P@ 8b@ 7lP@<NP 4D :0P @< @<,p~ $M .X #7 %x@4pV' &~d@1@ 8 @30 2s@ %,!X (l5x[@ z @ 4`!@ x @.` 5D @4x 5@<l0qX0 @( @O`3w @l $p 6 ,@ +m dP $K 6 d @<X 767p2@< H :h@ @<h@<n@ 2@3l @<L@ -x 1( 4o4@'5nX %p 6P#l 6 3 3@"0 3Dp7 )l $4 @4l @<L "Sl @<@?l30 '( @<J/0) +X @? :@l0 @0| 8P 7P@< @<0 @<v#@8s` #$` 7@?@?3 8 8 6 0@<|x /4 *:@ X % @,@ @<@?x7$ 48@T3`@ .lp$  #0 7u` `  '( @0 5 +@bL[;c4 &l@ 3D 4l  3: #` 6  4< 5@?@?'`  @<a @4o @&l@ : 2X  $0 ,0 6x` 3k@ @<e *d @1X 05X 6@<@3P 8 4x@ : @+x : ` @<H 0 3 * *@4Z@<6l3x` @ @,l @+`@<P7 8 e u~ #@<\X 7P 1X@ XL @X @,ll%  @(x 'st5H@ %m `4`@<@ 8`: $ 8\p @x~\   ' @<l 5/l@3<3`@&@! /@?:l }: @<X@ # @&  4(@<@+k$ @<@?@18lL @?@? @ 1@?@ : @<@$ 20 -l4@?$@? :x04"3p @?` @? @1, -` 1` & 7 :0 (@? 60 (` /n8 @#l5 "n` @/|x :` @ @)l- @36+ @4'@4[ #<@ .@?l5` @v @?@?8P @@1@?! @,$x$xP/]@@?%L` ,` 8`@ 0@ 80 1@?@?@<l@ -d4L :[ +x` 3 1D ,l 7X 5 $'eV@3x7@?8 @*@x,@? * 4D '8p @< @, 7$7P :P * 2 :`` 7t @'84 .l ^5@ uL@?@? @+0 @?0 + 7\ e:D@ 5l @<D@?@?x /P5 @4X@|@<` @<O5p f0c0@0[4mp .P@0 @<p @6P 8`L@< @<4P@ v885i(  ,(+`  56 @@h @.!8 %wt(x00 *8 @+X0 !0@ + 4` @< 4 2 @<04(@4 @3.` @< %` + 0X % P6| 8P@ !x 8L -, 1g#p 7:| sT` :l 0@?, @0`@/x @< /  @"hP '1@ 8L .0,,P (4 @|k  *x@< -sL@. ! %1, 7` $@$@ * 5 Y 6sL@) 3`5d@ @<{ l 8L4 { 6P )L60 7T 6p & @# 20@4 @ 8( 6LpW6  :e @< @sP@<\0 #` 3`0+`4@ L0$@ X6` * 3|),P % @"!b :x@<@ @4xp :x P3` @< $27 - l$0 4p D @<d` 1@4iX@ $ @.8` : 7 #70 6L )   7( 8L ,@<@2 0x3t@ @? 7`@  88-X :x@< @,4 @-`* !X7pd`U% 3c  8` & 8 $P0 @<`@ 24 2M$0 . ,x 7g@ 'l 4x @<g` @}n#P *4 68p @1x /D 7x!D :1P@<@ 7D@3 8"@ 2x 8w @+ 2x" @<,#P0 !,@/ @?`@?@<5` @(@@<2x 3x "$6@3 @<] /y$) @#l :@@ 70 ).` +@4P @#ht@@%@ @<(x$@2 6@<L 0 @1 @1 @<@?7X6X 8xP @w@)p 0` '`P 47 @<x587L` 5n  20x:` @< 2@/L@ 1@< )@5HP# #P@ 76@P 5|* 5x `/@ .` mh ( @@: @?,` 8x @'L 00 :*@3)  +P@ 5 7@/ +l 4`0 % 3^h@ wD 6@.x 'X # 7 /0 5* ' 5L2x0 4L` @ @#P 8tp @%p@ @?y 8 +l :@ @3 : 43p 1@<@ 2X 7X@ 7$*@3L: @  @<` : @< 'l *@@18"8p +, &@ 4` 8 &w 7| Yp&8 :e@ .@4 wp1 5xx @0@` @0 ( @0 @130 $ X@ ,< 6l@| )8 @: : @< 5@l %X` 34 :X`3u :@[ @` 6 : 6l v4 U` 6@'@ 5( 3P ZP @x` @.X`8 8e,@ 50% %50 5x@*1X7]18:w .p 4 3  5 $@ /, @<$ \ 6T0` & 4 @ 4 &@y6utp:4 + 60 @3@< 7|@ "@ 5x0` 5``7$x|@` @2 -2@8 6,:tD ,gx 'x @3` @#4 .p0\'P _,P 7<P 5 65 6> @ @  @) 6   8@<a 8t@-lP @ 0`` :4 6:l@f` &0 $`4x0*x1, @< @'p`1eP l :0 5 L` +x @$ "| ,xl 6X @4,.6 6 :$5 ` 6hh@4(@-` +0 $p 3` 7P ) 5$, @?<X:$0. 0 #P @m` ,0 @#x@3k 6 * 8h )D ` 5p ) 4 7@ph` 5~@@'` ( @X8x` @1ah0V* 803p6/~@0@<7X@4 8t % 3@ +~ 7@?5@?@? r\@l 0c0 @) _'@ 3@T*" 3 @3p  :`P@, @1   tx $ 2 (H 7  X 1s0 @4{Xp @ 7P 8p(sP $ 1$ *@?`b  4 7P :X .|+40 50 2 @< 1O  7 x  @, @<@ 37p /`'` 1{|p, *@<X6 @'o@ @.P80@ 8$@ @i @< 6oD0 %7|8T 4 @084@&%5@?5@?*\28 1l 6@4X54 4 8 2  4@ p 50 8 : @m0 * 7 ' 0d:|| (| /0 3`5` : '@ 68  @.L /  @%xp "4 4l@<P 5 @/b 6 8@  @ /` 8|@<8 5  @<@  @  @  4x7 @<bh@ c8 @$P2\:x 40 # 72@m@?L@ @<@2/@<@@<, @<` (n 7u 7Sd 6 +6 6?: @4p0 2`#*x @ i`` :R8 5x@ 3L` 5 #:4 $D 6e(2 j@ #Y  .Q \x@3 100 /XP+$ ,l@< @4  @% .p @< @<02` + 0W@2P@&@ .$8| 5@<4 7p#0 @<@? '0 '("|L1 @$,@ 2 @<l@#,-0`p #`4` "@$` ' 50 @.ul5c @PY4. @?@< @ P 5x8,` 40 @#3h0@4  %@-. @4 7l 7`@&d@x$ 1@ 3@+P @`@ ,@48@1 0 1U @< + L@ @)j@p @<P @<P$` @) 3$/zP 7 5!x62 #x:@< 48 * D 5 ) 5DP @10.P 1 * @< @<{8@<P 8x:L @4x@+@3n@ 4P :L6t8w4 7@ 7@?q @-j 0XP :8 @<D /` @< ,o 6@` @3mw-L2#  x @0 8 P2 2) @)0` 50 5X$@ 6` 5sX (@`  /~P +`X  @$id  3(@!} .D1\ .{ ) @1l 3 6 1T 1@@ x:8`[9l`5: .@ ! !+wl @/ 1l1 0X@rh 2  :Lp @<'` 6` : @+7| @b@*{l` 00d8D& 4 .( ((l @<$*}@&p @  //` 6h :0_@84 0+ @ \ :@ 1@p :l &t @?L @ 4 P 6L70* 68 0` @"p # 2} @<p @< 5gX@? h ':l64 . 10`%0 * @*4` :  1p2@'o:@$D .@2!S$`P 3L 8-@@<{` 24 (,60 7@<P @< @?` .(0 @1` /4`1@ @<P 4 0P *@6LP /: 0@3n c@3 3 3 +@<`5`P 4` 6@, 4$4 P`(` ,Jp @,!  @<` #( 4 6@3 24 xl@: @ep@1l` @<64Z;5 :X :  $| 3@gl0 X 10 @4`4 hz` 6$ @<(:P:40 :$ $ 10'  'p 85` gPw`:4 7P !D4D@-4 4x @<8l0 6 4p@?x@ 6 % ` & @*~ @ ` @? @?+@< :P 6L :0 ( %0 :,` *D` 7` @Z707d0@ @<L :@<` ( @%wX :0 8< `.m@ 1 0 @< @%$0*D @* @ @<X 6 @&x@ @<*.T 6^`` (l @<@ :` 6 +j@0* @v0 /, 1# , @%p @< @?0 6 : 8|,-L` 68 8D @4w:l%0 @<8l 4L@ 8 @1`p 8 @4 6X@ 2 6(L @0d0 @<L 0@<z 3@<0` z4 @. #D 8` * %b0 7 @2` @<l@<|0 @) 2@` |4 / 2 5P 2 7 @<H0 6 5Y)!d @+ ` , @<D @)P @!x0 @+0 *(8 @P 2P @* : 40 5` ( +l +0 !P 3+`3@ $ 8L @08 5*` :%L ( @10 3`@<  @4P` 2^x 0@ :jPL@?v @"~xpfx @x @< &X@@ 7mP@)0 : +| * 6D0  *(P2q:P @<p@& , @( 8` @< 5x` 6p @<@&p 0@< - @3 :$ 3$ 5@?:@ "D@) @<` @<$ /\rX*h@p6+ &@ @&@ @)3 4 6i @%@.@< 1 @ $,` 6 @<]  ,4` @-p yl 6K0:T6H :+ @1| 0 .8 K45+1  @"3@U @<, @#l 6 -0 : @/tP 5) , : +` :P @-L  X ", #P 1P0 ` p @)D@@< 2  @2X !t@ @&x` @ @`.P  !@ @ @ "xP 4 @<x0 x 50 *0 !  58 2L8 :X8 @"0@&8`@ *2P 5 @1, 2- #l .\5@& 5.x @3 .p@m 60 @&m` :(` @!$ /@ @3L:0 8DP @1p, 3 lp@"8@<x 3+(` 8X 8  2r1{h @2{7d8$ @<$ 'SX @ 0\ @4xp 8 2 *, +n dP 7@}`:(fP 2x@ : !7  @< @~ z ! @?|, @& *@ &( @< -L W@<u` 5(P@"`P 2x:6+ @<@?@ 4 x (2( 0`@?@?: @#x -4 54@ 2, 6,@<DL 6p$8P :P +X 8D` ' 5X` :w 4@3x0 ' 60 : :` @<` @+ 5l:)4p@<@3qx 0 ` @ @& 7P@0 /h  8, : /U0 ( P 4 UL04` 0 @+\ -} 8 & 0(` /t008@ :20 ,0p @?@?@V@- @`P-,+ . 8` ,` 'X h a 4r0 .` :7l ) @#@*p! YP !lT@(@  &#4 @<< @2?,0 36@@ @<X&( @Wp 2l @< 2X0 @<Lp @/4` @<`@?L -X 5WP@@ 5@@+W\. @1P @<$:HP /$p $ 88 L@# 7|0 : -h' 2h0S/  @<| #2l@ 03` 0 nx$P @4wL3`:(P @4x@ -lP @<X5,`)m`@6 @0Y`  )l ` @3 @) @1x` t` 8` @.G@1}X4 6j @< R $ 60@!X7 3 @  @3):m`` 2 @*  4@ x 50 7` :{P@Q8 !` @?D 1V@3D &` 1i` ) @+ 68 !e,p jP7} : 2k ! &p@&@450 @m 0 @% 6Z`V-@?0 58]/'D@? a#\<` :u -@3G80I0 0@ @<! *x@@<@ @+lP /x @<x4Pw 4@5l @+@T @ @?@  @<, 7b4 5p",p .% 4$ @40 : .L& 5|X @&` @<$ @4D6x + 71$@?X @?  $ 8 ' 2X8l 6]X@ sX x :#c< 05@@&l 7` :Pp "L 5 P U $@@ @3 @!P @3@`4x \` @)P@?@? 4 0(56h@?:3 @<0.8 6P '@ @.@ 4` 8< +l/0 )tD 3@'p 8d @<p @P :80 Pl`8P+0 :\ 5H8 h@" 1D8\7s0`  @< @< .0 !<@ 6L$P*Mp@lp 3al @+ &z 4@., 6I @[@?`,\0 1&9'ut2 @-+L S ` 4` ! 6@5`P@@ @( 2< !P` @+@L VT @$4 6Dp7x& @/  4(P :4@<p 81xp @#T4( %r-X0'P @< "l #x`@3b /x  @ @?%8 0 @< 4 'x# @)L8 6D$x @$P @1`@ ,x 8@ @2 :P !`)@3f @ P %@? :8:, @<p60 @2@ *@@?|` @^ @!d 6P 5L @4) j0@<% @< 6lL :4 -` "$x506`02 `%@ & 3 @<7 7@ 1XY3 @% p@<P` 4@<t#D :L @< @2l %$06@@ /6 @&8 v 85@ 5+b@ (0@<w 2 :X r` P 50:  @< @(X0@L 6X @L[4x 545x @2'@*60 @&P "w (0P/@ 5 0z` 4@ 5@2`:P+@.} 6@"e4@/ [+*@^ & /` @< 7 4l@  2L@($L4` 0 x 7 /@ 5W@/` 66@ 4~8` 3, @0( 4x 6P 6bL@"` +` 6], @#Z0 )0 8QL{@8` @< 0( @) 7}p @4 k @4t0` 82P 7 @<l7 @<l :t  @*P  6D '0 %@@ :` 4X @48 5 7 @ 7` )4`6<  @+0 @4 @?@2@4Xp : ) 3X`e7 0 x 5T-X06HI$0(` @2l@ @%p 68` @#@ 0@?\&3( @#x @0W@  sx@@/p$ *O3hp ' )D@ / @!  : 5+(% @< @< @<0@3` @ 7 @< @2@ } Ul% @ZL o +x " 8X + ,L` 3 @<@ $@?p @#0  0 :6@<D)p 6( & @4` @3P @% @4. @+L 5 @ + @' 5X@68 @<D@! 0 @s @< 6@@m @<D L6g @? @?l '@ @4 yPP #L@  @<X @hT /0 : 3L @<P $X 6@1g @ l`/ (8 )@ 5p5L3 ,m& @-x 6`@ {` @5~0 $@?@<l\0 2e@ 8@ 0d@p~x#x8, @(p:@3lp 4` :8l :P :,@)/a 1d5j| 6l0 6@<$P "` @4@2x0 ` @(s 4 $ "H@4d@0@1 @% 50 (r0P @4j 0 @!8 3@lP "( 7 -x0@,@'@ <p !@?@?4 6 8 5 5 $` @(P@ 7` -@ 6i 6  @<x 5X P @3@3@ 7h "#` @2 3@ *4 @.x@<H :, !:P@+` :gX +p @0 @<( 4 3X` :l01+ 3,` @Sl 5@ @& @$0` (4 8D ,L6 1 @#0W. K @+ @pU4s :, @<0&~ @+4 6P@<` & /48~X1 " . &x 0` 7x` @<D .nX 8@* @< -=@ :L .X( @ @<D @!`W@3 n,*`!`08@ 4V( 6 4xp @%`@   .HP @bp @?t Y 8x , *H @, @4l@ *P :0P 68@'r!49x 2D: @(L 7 :p 8( %s8-T :x :L0 . "` @4` @.a@< 7@@zp .`P d,"4p @<| 64@ X` 6@!@:X` 36Dp6tL 7P -l|`6l4L @<  5Z8P` ,D2 0 :}H 2:3q` 5 @?x !P @2 %` 70 6 :oP x7p 0 @P' 10 28 %}@ : 0 ` +` @1x 5pt @dp*\0 @@ 4[ 64 @1p4@ 4a,W@4P 2P (i 3\` 0x)$&0 5,@3xp !hL @4@:t ~ * 4 :L@<86l-L@ 6D @<{p @.@<& 80#BT` 8 [h0 +@ &x@@35D /D ux 8 @`@ @'X@04`-x Th 6P 8 6P@ 7  4 5r` "0 :L @< 60 2xP%0% @+X "8 0x * -`]9x3H` !` 3@ +G @<D @3D 2`@" `]6(@#@ @1H #,0 30 6lU@/X : & @<q2h@ 5dP 37p7` 4*w@/7 @3@@ $p 0m6 4` 7x@p @2@` *@$\0 5p 1$\&p@WP`  ' 5s "x @ -p +j\p 2X 5 @%n  /@?  6l 5$ T@@4` 4` 8` 02^l~d05|p5p x,4zL 8 @, 88 )d8 @2` 6P4@ 10 7d0 *0@0 @<p6@@<l @<@%Y@4  /P` 7, 8{x8l-W$@ @p :( 80 & p 7 ) ,x0 /x 5@ 3L`  @"P0 6` - @*p\5 7X ( @< @!4@. @.:&* +0 4h@?XL &ql80 @< $$0 7[8 l@ &D0 7 @2 5` @# Qx7h0%S 5  @<| 77r  @10 . 1 ! ($p4` @30 '< . @<f 8 8(  l P 4$ 4( : :@ $8 0@1`0 4T` 3|X 8x 4P @-X@<*@ PS$a]6x1@ 7@(x 1 `T@7 @AxP &D 0:Tp @ P:` &: @0 #@?68 H0 @&  |@1 :Q 2U4l +L.P+ @*x0 +3 {P ) 1P 8t 8 6@ @% #$2p6` 5 &` & &t* 67 74\@)` 1 @<< 8l6P4 #4 @8x @/:%u0 7fl* @<w :0@ 7l  : 5 @? P @< @3x`@) 8X* 2D (@<xp0 40 X0 8P`*D0 6x @ 6m 7:(0 @<` 7` +L@ ( @c@ 2`0 % < 1  * +0 2+P -|X 7 @<l 6x,`#8@?( @4 W` @1 @4@&, 7H 6@ -Y (s850 $6| 7 7v8 @?DP ,p D 2d P1H @) *1` 0V@5R0 @< "2l3` 2x @<p@ 6! * @< P` @<@?0 8@ 6 4j Z  6` `D! @ K0 +DP -`(P@ P $,%T,:@ /u @!` K 5h @h@'6P@$|0*P@ @ @0@  @b\ 4`Z3 @ /@ ( 4L  @ @ @? @<P` 7w|` 80 &(@U$y !s4 ( fL@-t& @<x0@4Nl@<@' $P 8@< "}\@ : 7 ,$ @0*+XZ4s $h @48 6 @# & -D14 : #n (7 @<,-P@/ @ x 6 5D m5x 4 @/t %l4D @!$ :l@1v@R x 6 @?X`PL` @1 @0 4o)F0 5x 0lP@#@< @<` '4l" < &P+$a<@ " 28` *< 74 88 +`4 @1d@< 54 3`c /6` @*` @<.|  @$L@XX2zT,P '1X 8"h ` # 6D !P /P:,`-0 @<6 @<4 % +c6@ a, @+ +x  x:p .@@ : P +x @0x @< :@<:4 %`@ 8n @<X +?@ .T @%U@768 t @? (*4p#$ $Q @a@?5 '@4X @&# 6P @<d 580 5P@1\@*< % @%0*d` %0 +/ @4_@ @" ~p "x@@@. 2 % +p @4- 1p. 2\@ +$ 7cD /l 6 @:@-qD@< 6 )x :lW7@12Z8P-x @,L 3 @'6P 5 +`@* : 3XW1 @x ' *x@(l@ 1: 4P @. 7 : : 'l @+t` $L0 2 @<`@ @4d 7` @%l 1` @<`0 +@+l 1 @2 74l(l  @1 6x@<x` 6P @4@?@ 3 .t@?$@< +P 6 @ x 6 8| 7 521 @)j @< :q%|l c4@&h -` @"T8 @?@?@?@?7@<, @4 ,p @<@ $+ & @%@ 2 :50 @0 @(|@% " ` @'@ 2L 1:~L0 6n0 @# @0[4x@2p 4 60 $0 24 08 2 4X 6l: :L 7`  P8h @, U  04 @<X` *M[4wP 6| )x @<@,q 8(5 , 8a #D @3q&h @o@2n 7\@ @4  #@,6~@&` @< @ :l @? :)$@ @4l6` #ax 3jd / !50p 3@ p %@l@<H:` 0 3x ,0@ 1l 0L$e0 6(x`+@ 8WW?g,030p #l` :p jpp2 %x4 p 0P@&P @<@ I00^0"0 80 8@"  6vP - @?@ .. @?P6 6@ :8 6D @PX@6` -Sx0 : 5@ &$8U| @!0 p1  a @( p  0X * @+ 4X0 @<P@- @ @3 :@ '4@?@? 50 7` @` < @#|` :X1 @.(p 0` 1l4P @<sT`- : @<`xp@<f %6  :x` 3` 0 @# 5@ +o5 8$!nX *@ 5p:P @4 8P 605\ 5 [@'b @* @ @'L 3x` @ 5@,,0 @< X` ~ 10 @3 7`` mL  7V *x0 XP6X $ & ` &~D@ 0 -`: @"h8 N0&@0{$ :( ,8` 5 5J @0p 3`+P 54 @!- @3 4`` 2  1T P 6~` :`0 ' :| 4 P 6 @+8@+ @,'` 6q 8@ @!8+p00 x0 5 :lp8`4&T(@?m0" 20@ [0@2 ,WdW'u47 &l0 ` * 6<0 @3SLP @3X @0@7@#x :( 4 1 2/ 2@ 6r :_@ /x ! #`  7bp 5p @44 8| /H ' 4D&D 8x@<@#P :x0 )7 4x@25 4l@ O # !x @/l@p @,$  @<< 4@ 44 3( *p *lP :x 40 @< @? .0  2x8 8 + @< 0 5(@ %@<8 7lh @3 p@%x@2X 40 @4P :DP4 (@J 't @*3  )0 @/ : @  8T` 6l @! 31+xP (`!@+l & 3t 0P @0p /  @3:0-m@P @) /t@ 1 @,:@ 4x 6l 5` 2L ) @<$@X @<@ @08 @1 &P & (X 3t`&$4@XP , @l 62 @30 &;@ 8 @?` 6D :`3$` 50 @4 6 @2X@<@ 5Vx6: 3l $f .@?pi8 @4 88 @%0P :@+P:D 5  5X 5x U-(/` :e0XY94 @+, 6 ,]@ @)0`@ P 5T -D  6PW 6$0 @4~<!D :@%@| 0x(L . 8 $!X` @P @ 7 $  64 )+x'Wx  @<j(Z(` 4@ @*`0 : 4 @<@ 6pV0( 4 @<L 70 (| @1#  wX .t 4@ #P 170 @< @,X % 75,V5*x` :_ T@ @ / ` # 5nX@@` -$` 2)P 0np 'Lp/0 @<d @<P 3d 2L`@S5xG 3t@(f@ (P (b 00 4<!x 8< +a :` 4 ),` 6x % 5 80@?@?@ @<x @(x X@ 6 8 3`A4` 2 . 5X` *  @"` 6 :pp@2`5 @<p@?P@?$@?@?d :| %jH 1( '8 %x@ @3W :a "w @& -0L@*y- 6 .  , @P @40 (^  @+s 0 @ @<@ @< P , @(4TP@( 6x@5  @X`@(08 @4 -  8 70@0p @p@ @<p +L@37 0 @?@<@@ "ut @<* 18` :p 6Q@ 8k` 68 @4"P @< @ i@uD0 )P %9 *PJ~ 6x7 @< @.i( #X #0 @<$4h @<L@@`3P + @3`-H @p$ 7 @!P2 @< `@# ` 74 1U  2x@ +z@ 4 )L0 r 80 $D @<\0 /  P *l @0TL @!0  @4T@, b@?@?@? 5 %l5 )X . @/g0 !p 8  @<@% (l @<`@* %&bp 5@@36l@?p @<` ( /D :| 3_x`+P 3lPV@)X ` :F - &x0 !dtx@ 3h0 #x @<` )l0 (p 'PW2@ @+O8 @X` .H@ @ (X 8 ( (@ :@ l 2` @b@ 'l` 8P 3(@?@?x8! *4'D & !L 50 2l@?@< 7l 5@0 +0 @<` /` 5(o @< 8` 3@3`P 5 5X(8@ 75 3` 3x @1p 8 6 #~L6 6D /@?X@ @<< 6X@%p @0 0 :@ p 7(@ 4845w 6 @2q #P 6  @)` @4: :`0P@<X7  d@?l@? @< @0!K`3 X @0  p 6p: / /\06h48 4lVj 55@< 4P @ 'D , $p !X6@X@ .@ @ :0 /D 6 4D 2x 8l%e` "$7 )8, h )XP !0 7 @ 1 @%@0 (0 #l U2 @V,p@  jl`3P @/( @< @3 .xP #.h@1` $ @, @% T4@x6P ` @( @*8@? 1 : :x +6 5 .qx:@?< ,D : 1X0 2x 3< 45' 6P 0` :h  1@/X 3 1L0 : @<@ 5x 1 0l :@<@ @3x(`,@ 5X@04*P6 2@< #  ! /l 0 ` 14 3 @<|   @3d @< *Xx @+X1- (` :5` -`7mp @'e@ 1x8 /H@ '8L@&` j!o 5P :6 :(@ 5 2 @<P: @4 @ 5 @P 4X @< 1@ 6D 1 8@( 3D :` 5)X $ @x @< @4x @<L @ 7 @< @<` 4$08h @#p[9Z` 6p 1h @4`0 :45`#  40 4 $81T@O, Lp 58@<h@< @< 6 X@(l` 85x 7 ,$ @-@ @< 2/85x @#p"(@4_Pu (0@& @<8 @<@ 5L :p 3@<@ @4 3x0 +  4PP @#L @<p 1(7 \!@@ *@  @0d mX`x"| ! @<p 4p 1TP6@ 'D 4< ! 7l @3 4L@3@@?, @& i 4|l 4x 63@4 :0 $@ 6x1@% 7@P 6@4,/x@-V43`5P 1X6@ 1 6@< 6L @4@ 6&x 8 @2 @3D@<x @< @0 @,0 @1 4  :l` & t@"$ @-P+P 5` ),P 5l1@ + 4 +` 1`@" @4 @48P 8p@<00 @*X @  @.x @? #X 7P0~t @)+|P7 3K@ `, `P 1  ,4 6 @+X *P 1@ '\@ 6 * 8 5P 'L 6 `xP @  5l #@ @<p%p '@<,  2 18 : '( @1p : @?@?l : P @(`$ # ,L@2p 8x0 ( 'HP @<x0 'p 2o+01  x@ :`3x0 &7 :04 &5$!X/(@/\ 78tt5@)( @< 5 2@ @<P $&P@*P2P l@! 5$@ (X ol @4 20 4L`'` 8  *h0#lh 8P@qpP%@'@1:fP@ 5>@0 ,` .PP 7 @<y`  @*87@?67{`@   !07 ,05@@ 7<0 0p 8 6~ 8< # 3 . 3`  1$5@ (@ 5u@?X@<L  57l$^ ) 2@2pt# '@8 :l 70 *x 5P 7l0 %| 6 : @,x 8@44 8E @1z@*x 8 @/` 7l0 87X-6D @<  :LP "4 /` @<H % @<y@?@? @<0 @@? 82:J@ @'p @"lT @<XP 0 @<Pp@&d @/@<: 8t 7X`@ $lP @4 3x@ @< @&P 0` 8*p8 r @#`8` @/ "xX` 6x  @(( % 3x :l`: : +` :xp 5 30 (`@'` 6 @<L .( -tP 3 :(+@< 6`" @#  6:8 @$ $(p @<h / 1 :X 6d 5p@"0 @,0 8D 6 )D@< 00   ' +@|x4*( @)@?x(`P @?@?x :l@  +` 5,P ' l6P)@1P  @<@]7 -b` 5p 2t6^4 @4| @@<,p 5v @4x@2 @<x` :x "L 8  @40@<' 8P :P .D &  1` k82!x`@  2P .`` 6h`@4h/pW0|t@ 7d ~P $y8p @ X` @<P7@0 $8@ @<P @p 5IPP X0 [0@ @?@? ._ @8@@<@45x 0t 2zd@. @ :4.x` @ P4( 2p 5 k@ * @/4` , 5@<`` 7 @! @1L` :wx:}` @<x50]-L"0$H @!zP4 *`6lp 5XL(p 6X :DL@$(@U-P7~P5 *lp 6< #7_0 (| ) @_P0 `4_L@1 :@ @+m( 8L ( *L0 %8l:4 ` |:xiX @<P @(L 0 tD .U @ ,.\ %x2 2` 7DV@5` :l @<@&:x ' `0@ 7]8 @)@ ,0 *q4 5X 6p44@ @0V4@1   @4@ @X  6 7yt0 8P 1L` 6v0 @X $l@+PP +`0 (` &40  d0 ! :` @40z @4P1 @| $|@< :} "6~ P 6 0 @y @0t 'X@D@ "\4@)<)D,p54 7@ .@ 5 < +p 50  6 : @<P`Y@:L8d 1` %x 0@1 xZ@3@@% -X 6 @0` ` 5PP @'X6` 5 : @(z \1 7  @8 : 3P @<` 3l@<`1 0Q' 8' + -6`Z5T<"6h@ l { @% [ 2\0,P4P %[`" 4 ` 4@< 8 2$ p @<rp $X@@2P ]@xL 6d % 1,  6 804p * p-43@ @'X - 8D Y+02` 8 3@o:` @<P `@'x 2@P @< l` 4  % 0$W18 %L 8` T:@<f`@<d @< 1L +l @< !0 @44 @L` @4` @%n 6`@/(  @@ 5 L1h` 7}  @<X@1T 7`U2@t@&L@6{ 8N 2P,0V@* @D8&( :l &P 7d 0` @- BV+ !0 4*0 4X 6X 6@ /X 5@3(` / '.x @?P +(]"D1`6P`+` (P@5P 2/ *0 $4 :x @<a 3` ! $ 7|4 /|0 @(+0 @3nl%uX P @-]8p @2t /@  @& t 2( 2g /pp :  /$P + 6(pY:`@ &L 5p tp2}@ * +`0` 6}$@+ :gt2 @P 6h 7 )`7Lp  +,0%P (h3P 13 r 2,` 7L ` 1D 65(@'@'L@! @3@' @  +lp@<p (< 6h 6bP  ! ! (w@@<f|P)q @*  %  8x @4lp @` @? :P 28@< % $@@ 8t 8( /uP/P  6`T/ 2x 8t` %H@ Ut 6L0 @%jl6\@ e7, / @(  54  44 5@ #Y @xV7D T@,u38!}  @0Y7w /@P @< 3 $@ /D @Qx &X0#0 8 .@,@( @< "P h @43p .%  40~ @1P i40 < 6@ 7U @4l 'X 8V)t68 3L$q` 70 +P#4p 6 54  ` :d` L ,D2 0Cl @| :X$U,JL 08 ,P @p 7 t x *:, :0@  2p @<5@3r, 085< 6`3(0 @4 0 5@._8p 0:@@ :@  * 4 : 5fL&lP/x` 2d :0 3@,4P  @1@ 10p @<X8("@ 0  @4- .XP @-0 @3`` 00 0x @tX 8 @,P@ 8g P%( . @&p+$ #`z 8t 8L @r 1@ 4 @4 *0 p 'P`., 6P . 8D@<`]70X6` @&|@ 0@`]0wL0 @/X0 @2@ +\!+/! $m@d5W|P4xD /p 8\ @# )4 @\` 2 0X0 h 5h(P : 30 @p 4o  5 P )0 @<@ @2p b3`@ 8 @P 46 @3`c0 @< !, :!W #f $ 4 @UP :t# \@ 2 8L 0!H!`P8 @3X +P 7@ :X /X [X 6` 0 @ 58@ %  7(U*l@3a '*x @H:X @<80* & @" @<` 6wD @%T @?l` @288 @< 0 2p @#4&` 5\D,x 4l )+P@1@3P1 @'J 6 $h 0T @4DLp 6P @+ @35L@< 5P@$\6 1 7@ 'h`  -x@< @R  *-T 6Pp@3P @4@<) @1@ .Pp @-xx1X @)(x 2 +L` @(xPg/` 20 @,l6Ox#X@<$ 8PP._p 5X+ c @.  v8 @/ 68< @*x7`` 2 @153P (aP@)4 @<ML 6X | @3` )d0X @2 @)4 6%0 1^  @*4 @P 5 @`@@| '@$[t kl& ~\p4 @+ & @ +t2P " @<B0038 j @?f0 )u P @< 5l 0-P 6 0<2 u(3@ 4dt5$]P` @< 4d)+ @& 6lp %0 ).P@/@ 8@ m  @<@1sp 6P @?p 2 ( 4 @ZP`+m0 7x`7 +P0 @p @(,(x@@?@?@? 6x`  3( &P @< //$ 4   (d 2l` 0 @2`  @+ 2r @p%^ /l ' 4P +( x @/@ v @'0 66L 1 2/x3 0 :zu 04 m,6 .v 5YPL 6$*l`8@ :,` :Nl 6 8p @,Z @ #X$ @,( 6x0 /0^(1 :x@%p 3H` 2 @4p @/X 7 3j 5  X0! )L 5^D' s, 1X @@?@?l4sx@?@?` @< !T $P (l /X \x:6t S @<4`$5 4@%m (@P @< .d #(2W('p7 7 2D 5:  50 %,` 7gX@5@k@ @P ' 7 @3` @?`` $||  ':` tx0 6< 8L@?Ex #8P *LP 2`@Ve`3 6PP 6 @+ %l@<@*t @<0 7 . 8'P0 :p U@3( @!@<|D @<X+l6D q@4l+p 0x 6p 2 @?x` 6  64p+Tp 7 p $ 4 4L @( ,v@3 .052P ,dp.`* 6@?@< 8]l @1 7& 6 6f  5 6@?* @0@` @-` @,(8|4CP0 +m 6$4d, @!@<u@ 7oP@ 8X:l@(8' 0  I(` @<|,` 8%02xP @ (D _t 58 86 #@4 ( l#@0}P  .0  0 /kX 7P /8 V8 6 "0 1 2DpV@1 @!@?8W10` @-4 @,xP @<vp\ P 8 @ 4`p"p 0yl :p 63 -p / @< %` @$8 @3zX : @/d "l 6p @<n 6@q, @<l *  @<xX @<X@) @<x @<},pT@<\@  #` ,l 0P`@ -v< /z\.pR&0` :D@ @2` 5L 8@ ` 30 @3c\ 6xp 6 @/@38P: " @4@` .`4 +H0@( @ 0 t0 +  5o 7\ *$6@ 5X 5 8o0 4 #0 7H 30 "@ 5l 6x5@0( P0 + @ovrH < @<lX) 4nX` 6~@xl@ @< @3/_H @ h 4 &  :` (PQ@ @*@ @  6@x0 @0s4 @T. 5 ,lP 67X6@?0 D`@<p@<@? 3@ 6 4 +nD )*TP@-'8.X @45`` 'P @0L 8 %P 4@ 0@'zt@4` PP 6 @$x %@ . @4 / @ 2x 3kL` 5pp'\P #( @< ` @'2@ 8H @.l @3@4@<p $wp !@&@< -sD (T:3$@4@4 @ 2t@ .& @/| 1x P 6@( 5| @? +2l @ 8` 6l !- @<8( 54@ @4@4(6, @<@4@(x@ 64` 02 @)H 0", 6a 8@ 5+ @?/:lp &0 '} "0 6  88` @2 @x1 0,@5@1~0 -@,` @! 3 8Mt#`!0 _ 4 $x @$ @ l 8H` @<  $ @+gV@2 @.0 @4P @3` 5@@X@4X_`(0  8 @, 1\ @y(@ *, 6  .`p :x %y` @?: @<0 /  @< ) @+  #0 ' @*P6`\4 @4xZ@: :  @3D@|| Z0X58 "8x(n @L@ 7| 4T@-i86P-@<l/ 6e7  3l82@P 8< +D $! ,h  \ @<4@)l#( /x @<@< *`*@ 7 830 @/@ -P 8P @+5 & 1L 0p /0 3N@ - ), 2*P @48 # 8x: 30W@8l 6D ]  5@` @%`@ @$, @")p5d8U^l` oD L @1hX 8 5w @32l 3s< @x +5D:p Yl 0H@ 7+l2@10 @<`4 10 x 6P5 2`: 3 0 * ' 6lP @?#Xp1 $1 3 ql & @4xP1 @< 4` @ 'w 5 @,` 5L 5 @!X!%~D @$ $8 3V4q%8 6n\ @w8 52X X(0 @"8 @?X7 8` 6$ 0p3 2 @%$0 @4l ,6`6 0q@<<'X0 @)` 3  @<57 6`0 - @p0 \p@cD !D 8P) 5p @<w 4t @<7` 6$ # \  @$` (@ &w @0<0 *` @*$` 3` @,-s2@ 6p70@# h @4^ ` 7x2X@ @-0` ! /.$ -0 'x2  6 L -\` ,) 0p Tx@X `7U Ps10 "p 7sp@4@ 8p 506L /n`  2P+4 : !@ 1 @2w ' %l60 @2@` @<@.,@h 8 @/ @<` 6 2 /s`,7@0 : "cD@ @#x@ 02 'p5@2z0 1T `0  8X@3Z @? V@ @.0 /` 5D&ml0 7L : + @<p0ax x4 5 h , 3F"Y1x)48 -` ,@4R< ,$P ! 30 @#P@ #/03+lW$\8.\  .< ,#  @.2@ ,0 1l& ` @< ),0 @1 6 @'wx @?_@`@10 @- @+  3 @<P #X 4p0 5p@@20  6x@g(D 60 6 :L 6@ 8, *:P/p $40 2 o @#` rp )0 0l 3 :l *4 !L ' 8X0 @# .4  '` @< ' @` 4)p *l0 2`1S@ 8}0 S4@$ ):~Sx- x  8@% 2u (@?| 7 *`@/#` 0,0 (<` V 2p)`T  )0 p@.D@+P@ #x05l aD1@/:xi @Z 8x@< 4@#l` 1X8 -0 @3828 41@<`0.1@2$ 1D :03 @8sx@ 6p X :| @& 0 @(p6p &hP ,vl 6X L @h` `@<( &n8 Z@?0` @< :` @? @@U@2@@Q 6t / (Pp7 5 @< 2 8 6 4 @1 -H 2 0 c` :M<0s#^P! @%x @( @%@?8x +X` 4, @2,  l :$$0 @%x 7X 1` 4L/x4xW1Hp 6 @*4`@4` 7l ,xP .` &0l@0 :p @?@18 &X 7t`0@ @*t+l @< @<T.@ @<@?x8: @<}4 :0 8 60 @38 ) -D@?5$ @<0 5P /8@ @ @. @4DP @ @"@07P @(x` %@ 6@? 1 .P 0 :L /p \ &%@s2@<@@#P@z$@ 68`-l` *0 @)$xP080@4l @/6` /` @+X@ 5 :0 :@ 788@? 7`3~ @<X @*l :r$@ @` @1t 8l :` 8, 4D @)@ @<G :P -p 24 ' 2}\@@- )V8 @1` @<` -t  !*` ,(` 0x0 (/@ 3l ` ~0 $` @!00 @,\D8* X(4L@3D 7 7Y(@7@ 2OP|p @<x -0@?@? 5t @< 1M @<x7@+y@@ @< /X0 -@ 5 &2|` @0 @?p 1 5 @ Yp 6,  @#P 60 2~6P@<x@&@ @3 @'H @<P@ l31 . :k 50 ! @/^P/|p  6X@<T P  'l (`\?w(@?@?8 :/ @?`5p 2 *4 \@ .$ 5 @#x@ -0 @8 1x$` /_@8 @+H@?l / 8 @2i* " 8i @Q8 3` $0 @&L@<rL5x0$ 6-28 2h` -v@<D0 3X4 8 8 0 'x$ : @) 5T` 0(5( @'@ , 5 60 :P 6 1]0  7s  6 $ @<@@< 5p ,, 8@,x 3@ : 8@@?X084 @'l 0 +:20 5X @<0 7@<4P 6@ :*l@ 4:%D`` t` 6  @<< @3X :1 .L$Zx@  , 7P / 5 :@!8 #x|@  1gx,P.(x@* /8 :76 ' *D 3`  " 7 lV;xX5qT /TP &@4@?x0@1p :x 2@  77 7p]*x 3@ S$l@+ !@P #P(tp 6x` @?:6 @1` #w @&X 881P)P@(`7 8 0 @, % @<D1L` @<, 6@ @<0 @8` @? @-L 5@(P @<x@< 7\@'h 64 @+P ) @,@5 36.l @4H @(D`:-@/= "\@U@L@4v00 &` :| $l79 @0 @? 6/(5@ :,8 2$ %P@<0 @  `@"yW@3q<" +8P + @28 $:x @<@<@?6 @4L*D5D@* :` ` @+0:t 1l @*L @# @ "0 @<4 @ @/x ;0 0` ( @!8@Y)d` 5X l/t /X @4  7D`@<x[@7@<p :$s : @3 /wp 5@@+$ @,@@<0@3'@?@? :6 5 @40 + :00 3$ $~0@0 : .X  #P7x @! & x . @!@< &{x24:$@?` 8 $ 6Pp @-   :t@ 6 @< @,@48@@*D@? P\ 3|` 2l"  @<@#p%@   8L 2@?@@?0 : "|0 8v@?@?@?0 +4:p6TV+h 5, @*b 6P DP8 8 @ 5 3 #:p&( + @< 7 0F  DP@,P+ )l+, w @Pz`1 +uTl @<P @< + 6@*x @4 @2l 5 5kdl@ @2X @</4@ :x "~ @4X 744p @<)0` @' ', 3x @<:X X1l0 , @47l @<X+8( '2 @00 3d!l@.0H:L` &t @2@%@)@@<x%@<$p +`0 @<LP tp :X! 7X 6\@& /wd@+4 *a.` 0@4 :c` 6@ @4qx @{XS% @$@ 8 @)@ (D @< 7@` :``8 %yX @ 7L @&X@b` +L ,x :, ,X 8 @< @&x` .6P4P` @<` @H@<* !8@?L` @444" '  8@? n@ , - 80 H 3@?`" '@ 44@<x`*X0 @<2PP 60 3Y 1 * ,P@4t@6D $  61 @` @ x(` @<v @-Pp 4ft X` 3|  5 8`/FP !@<@#x ,p 6,P 1p 44 3 @?@?, @3Xp4l +LP&(@ $@ 4 )X @?@? 0w6 ' @4Rp % .X' @16 /@ %c` Wx@?l@? 1  8` !@ !k` # 4 @,R4@?@?@ @4 `U+ @<' ,p L+ 0  %0 +x :X,L@2P : 7i 6 60:p :@4 4   P  :5 -(0 @l3x 6d\ 08PX.P y0 L 70 @<(@ @# 4p` 0a0 6+4` r[@5D 1$ @<V @!@ r 1 :(@%( @!@P /H *]L@@#`@<@? 6 5@ @3D@ .4 @ !tL 8 Y+xP6@ 8 8D @< 1 @<d 8@< /P@ @+~ 6l` 0p4`@ $Yt2 + 8L 23 L @$l@4$ ) 2x & @4XP @<r6@? :86 6 {`@3t0@ @$D :p6! $ (Xl:n " OD 3$ 6L 5 50 :z :@ 6( /p@ 7 1X 4 8 @<(  440 ,t @<4@0 5p@4\ \, @" +2 @0p  @1~$$@ $$16p ` @0@2x4 @ 0l@< 5}P 3@ 2x /00 :@$p@<@ 2'~0 6gp +Xp " 2` 2P` :k@ :]6L ( :,@<@2i8P8 @1t x@#D@/,6L 2 @?4 :`6 *@` + @<x@2 1 * :-0 @l3(3$`/@4 #y 1 1 !l @#\ :P2:p ! 3X @,P @-$p @$p &R`@?l@<8 @?l0 : 7l@?05`@<56@?7@? @?p` @<l0 @<4 &@ @< @< /806 6@ 0P5 @<@<` 7 :$:x@<ix6 7l)y@?P @< @0` 8n 2@ 5R82xS @2 3$@4 0:' :P0 x : @ TXp 5$ 1p 4L +l@-P 4 *L5@(P +@t4 7L64 #0@4 @?@? $l+@ @(  u@p 1T shyd@ y @|p @P5(` P@ x @< 7 * "a@|@ l@<@?p @.\ 0% @#X 3P &g p : 1 *l` 3 .r0 70 @-` 4"X@ -T 3  8  @x ,3 @2D@2i @< 1 .@-l @,h@ 3$$c` )X @4 )@@" $p  @,0 *@ %^( @10 +2,`l@?@@. @<` 1l &m  (!18@4`@1p 5^8| 6 @0P' 80 + 5L @2 @3@ #up+x:D8@#  .@ 5 @4<4p*( : @2),` :x0 +, @0~ v4 )~<3& 8D0 w` @2@ 0P 078 7v$P@ @<X@<`6@6 5x 8 4#pP)U) 3@4|@ : @?a 8 24@ 75 1pU5 4 ,v`  ,k0 8 *L @<0 @"8 -8P` ) @?x@ @?@<@ :5x` 58 2 @, 5 .@?P# @  8$p0 -x2  Up @< . 4!@ 5h@@3`0:x@2,5h @ 8 7ML4 7 @<t@<3x`8#l` '6 @!` @3/( 8@P 8X 5J %@ 5l78+@ 148 2 @.c(z`%  @.L @4D @<@ 2 @1Pp . $: 1D /4`p 4X0 5L@1D 5 6L lP 4lPQ@ax 5D @,( @1$P 5x 6 40 20 @+8 *P 4 *p B8 @<"L5@, @"@<1p@@3 @2l 0L @)@ 32S( 6D@4  U@2w@ 3@#p@# /}< :8 @0(` 5D@$e -L.0 0 P+d#ux 5@ @2` 6  X0 00 / #P46P01 -x &l0@ p)  1P T $@  1T :xp@/`0 :@ 7@+` /P(zp 1Xp 2(p 2l 0@x %]P @* @ 4(` 5 @4@? 70 q|' 'p@.`@d@-o ,  @) : @4 #v@ ,DP 6  2, 7 P 60)P@%P 8 } ! , :@p7 8 8@?@` %l '@ $X @% 6 5L5 &+P 4 2x@ @) 3x:@?7@%x ([ @ ,(`6 #@@<l@%u@P0 @+L0/5x645  !@< #l %L :x 5L ! 5V90 @@<0 h` iP :( @<0 *0 @2 *0) :X 4 v#` 8 1@?@< & 6P 5X 8` 84 ( :H@)0 6 !`@<P@ ` @?@7@ @/` P 0l .x6@&@ : @& @(x7T8 @4 : ) 6x8,8X $H0  & , @<@<l@ 70 @<8$` 8 0l 8 @4\@?@ 4l 0 #@ :  @+x 1 6|P( 6 @.P : @,@?:` : @< @<@ @< 5",l@?1T 4 %@ @0 &` 6 # *` .p` .yP 6@ p X&@ 3` 78@ *x3 @< @<t 45X @* 6tP .l 2 6` @&m| @2L 78 .P @<2@ 6 @/p @?@3@@ @3,48 @<` : 6` 6H @)80 0` *` @+@ (xP (P 6`@%X 6h 2@ @< @<` ( t @42'fx 4P 7` 57@?` @1 *,@0n5  (p  lP @<` 7D 8, 8 + @!0 .l 5T0U@<l @WX2L` @P @#w0 2(P /D @<` 3 #kD3:0` 'l +EL@3p @&X @( 4(P   @([@# 2h@ z0 2Y 0H` w 6{$ @` : @0v *X@<: 8@?2$ 4j$ 3( @4 + " 4@4@@<P *` 5 `@,x0 7 @?81 8 +`p 2x 7 8l@ -~4@<8 4#U-0 @2l@2`:fd` @-l@+ 7l@/ 3, 6@<0@%k@ /l@ @} , 3P` 50)$7 @<# @#:`P KL -8D @#3A56, 2T 7`( @+ @&H+$8 56D8` @<4 @1 8 / 6n* )Pp4` @< : 3@ @/h%0 @<P@ @<$` 3 2@2`8h @. @4l 5P @?P @< 6y@ 6 v( @ 0 @?5  < @<p @?x +|`  -@ P| 0b @ 8m @4 :07|@ "X5p@4` :`7P6: 5 *@ ( ( 5$8,- @k@ L @4P8@2s46rP*o @< :@? 5t0 4!x @3L 0q\ @&h  8P M `!` @<@)01`  .b`@ y$ @<  %b :!|880 @?@?@? @2L :t &f@ 6@ : @0 %@ @2@ - 6h @)d +L` @4 6 &@&\X @?o @? @1 @30 ,L l@<Y/X` @ X04{@ ) @ ` 5@?` 4@<y ' 8T`  "@ !L z @2Q+ 6| @0$ @?@<%@! 4 0 &P @.X@2: @<@p6H0@1l0 1r (O 7HL 6$ @@q@068 500x` @4, 2P@!8 @&~( 1  5 7x0 @<` P @` ) 5 @ !  6 @+4 !P 8 @<1x 8` 8 3, @<< #@?T 4 #t6@?"`@2k `+0 '`7 3T0:y0 8`  p*x ( 3 @1w- 6` 4L(x @< : 34 @<^ @<x0 @?  :* @'g0 1P2~L@ @< 86<p @0<6W@84 4P 5 :7` @-4  @8 u: 0 . @&X0x: 8 -x 7 6p 3U@48@< @2x` 1x 6@ 4|,4kL @<p  2P 8 /_ @!L @<u<p @< # / 8 4( 3, /@& @<x), 7p #(p2x 8 6p8 `` 52&l @<@+5L% :x7l :X.5@< @. @8`#p @<}D 5e7 @-` 2(4 50 5$@+L @< @+d @/ 3P ,P@i(0  @<@ 8 60 *0 * @. ( 1@0 6X@3 @Y 000 @<P0 8}@!@<4@3~ 4<0 %p )( p :,87d@ @<T@ 40 ( 3@ 5y '@/8@< @$L%< .@<  L"H`#`4 @"  p @<4@2` @)07H:D 8&`@($ .| vx : + ) 0l0L7 @3@< 0 @)p '+ -l` 8c\ ! 7 @% $w` 4}6P P  4  / @<L@  #i< @4XP3 @< 6P0@?@<X@?p 1/h :. !,` :xp@  5T 2@? @<$0 84 0x8X0B @11P| X0b 3 /@?5+` @<" !x x H @/f:0 6T@ 0P 6`$|@<@?0 %4x@* @<  6P 8, 0@ D@ @hp eX180 5t (x0/@$P 5$ 2P 7G`@2Op)"} 0oP@ LY7 . : _P @< f @l : %TP )l30p @ X - -| 5XY5@ !10@<X2  @<'@p 20 70*L`:D@ @2 6o ( )x4mD " p` +p 8 @Sx 2 % 5 $p6P 6XP @3x 8n @2pL ,- 0@/D 'p "0 5` 8 P 64 @.(@ 4L ) 7 [8 $ @3(8@0'8 (@' yP@",: ) @/p 5$ ( 2t`0  'P @3P0 `0 @RP1 /P .`4`1 @"X` 8J ( :@? 8X 6~D - 4` $7X` 2x 5 5X % `5@ @SP   @++kL x`( 0 7@?4L D4L,`Pp, 0 :@` 1   ,@ 4P` @L8`  :P :PpX`$8)4 78 @%((@ @20 @2o` !@ @"D #c [ `@3P. &|P 4` 8x@1}l` @+x08Pl@"4 40 6P #x` 7 3x 1 7L 10@!` @ P @/63%%,0 &@@ +v + (zl 8P . 5$ @3x@+ @<l 6p 2@#@? 8(@< ` 7( 38 6 3@"  @< %@ &L@< 00 6& :@ @"P@3ox`/@ 2 @ x @34 *p @?`08p@2D@<@ 7o, @3@j4P&sP5x`W@3@< 74 - @ @0g$:X6 6@ @'X8` @.c :, @}@<D @< @? 4@ 2f &{ L /`@3P 8X3 5 'X -X@2 5.  $l 6 2Xp 7@?@?0 )D 1P 6P @< @<` 7 @<x00 @?l @+` , @)` 1 +l @<8@%ox 6x@ 6 @<D 6m0 :!`,@ 54@ p 'uP m` @@. %X` 6@5 6| %eH4@)Y@<l0 87$/@* !L71( 78,` .@` }L@4 (x 7 4l0 8 (,/e4 @k0\60@ @ !0&P@8 @p580@14@2D@yX6@2@@  @<A@# 0, @.4@ |( x 6H :X@0 3xP@!@ 2D` : 7P@ 80 &T +L` 8`P@<@1`@202[1 -@+| @1 (d@2P 7Xp@ * (p L 8L @<P 2 "phg @!&rXzl *~PT( @<zx &x1|0 4@ $X3 @vP' 2P  @<` 6` :d00] @2 " 5 @<uD 5 @*x 12l0 :@2UX +O8@?P:l@<` 0@?@4@ :@? 8x@ ,H @4L 3X 6@?D 7 70 : 7q2P+ : :\ #\ & 0l 7(`5@3 @)` @w00@,@<x0 5 *@` 2@$`&L / 64 @0`/xp#| @/ 8@< 6X@ :)l @<`:L 614 &x @< 8O4}@<mt@<+P@ @.@<p!88L :7 4 5p 7P'4 8P@*0 +5` 3@-<78 @. 5x @?|p4 1@ 8@&0 2L @< +7@<L: @)x @<@23| 0i< @<v@1@3d+x@ / V@"l"@V*`$oX  @? @?@< #,0@< 2` @4 8 @4 0l#  2` @< 6  :4@  7 "x` +:fP @  !n  @!U  'PT* @hP/@+` 5L @%|p '@.`02l0@<80PV+ 2@:`@-X *x@Y 0 T4!o  6h #` "jP0 @':c @ @ @<` 1@5x0  :` 3c  :@6 ( @?l @? 3l~ @< V@/@<V@!  0$ @"@ 73@8@ +j4@0 $@& @4`) & 5 *D @< : (` 0x h@ @|`4`</p @1 3@?@?@ 7` @1` @&< @ @<P5@ 68@ P < *,@ 2x 'X8$ (@ *`@0  @< @/@ 4  0 @34 '  @/X@2l6@ @<p : @4@([8 4@#4@ @DP @ 7 p 6@<~(` .0$p@/@ 8L@ @?` 1,0 : 6P 4*V\[l` @"@ 5z %`@6`@<x0 *|t 2@ @<0mD& 48 @<8 :@ 6@<y8` 7P @<X @&7@?@<0 8u !X @2@44 #< 7x @<( 7[ ` D7  :@ @  @<d t6 *.D @<,4`` 5x` @.V@0&`U| $@ @ @|P # l 60 @<` ,@ #)( &@. 5( %$ + 2P @2: 6 :0 )]` @$xP 8X` 8 &t4@4`0 @% 8 1ol@?` 6P8x@< @<6 -@,P @<  8l 8@4_P$L @X $ @?  uD XP ` @2  @!P 0P@ @4 5L @4p 38 8 %m 7 @)J@04` @4'( ` 5$P : *l2|@?@?4@"$ @0 :_20P ad7k 6y@* .p 80 *P0 4 @< @'P X $l @#(p @-  @<Lp@X "g`  ` @qL0 P@'@5h@< @4 @+8 @0: 25 5xp&0p 1 @7h@ :@D $ 6|1o(0 4&@2( 6N@1x @-p 1t4x:|6 7 4@ @<@< 48<+P4 6 @* 3P 68P &' @<( 40@l@?$ '  :  #lp 0w 5L :` :@ : :6l @<\ @! "D @- @ # ,p-50 8( 7@,  t( @+ 4@ :6l 3 @"+(` :%d %X3P @37 @" 50 6o( 6 @ 7 @4 0` :l /.m@ ~X`2 @<P@% -8` 0`1A ,,  @.0 .0  00 @< .@ @1 8 p P @2( !X 6 @10 ( &x :P @<D * @0<@<8@($` 0ot (0 4b@<  +@ 3 :  .u\08 @/} @+1, %x x/ 58p@'N` 7 68`  @p3X` @ 80@fppV5h0@<` * ( @*l /p:~p@<@?0 @<P` 6T` @4L @<x` @< &@ .p "0 q`8 .z44L '@+x @0 #h 'lp@3L@<0$0 @$q(0 !@ @<_@ @x ~tp 1+0 0`06 3`@"e @Y9h .X &n@  #3 " @0{L@ (4 x)p +P6888 5p !@#j'4p@*@?P @-( 1L@<0@?@?x LXPVT @|P@ /o :# @L0 5 @< 8P " @<ep 6`@ 8xL H @<P'  @3 ~x8 @<L 63X:0 @0@ @$d` @)olp @$@/`7 '.`` s :f2 8qP'y\ :0 8 5 1 :| +h  @/Pp 3 @$ :@:l * ,@< }P7`p0l@+0 # @,p 5( @<Y2( ) 6@<D 0@ p 5 40 8l @<` 5@? 10 @/!Q4x@<f {p +t @<X 5@ 4p :d$'4~`@,` 5 3 P @0 2x@4 @4@1l @< `X#P3P 80 @M6@ @z` /` 078@ @0 +@2(: 8P 7:}(0 :$@+`4cXp8`` 8@<` 6 08`@3( P 7@<`@ @<xp@<( ,k`0 "0 , "x:`p % @' @3! .0/p 43x @<b  #P @?@<XP ,D6l+ @32HxU/|1D6- 8+@ &D` 8P 4@< 27w` 6( @<`+ *H -$6 8 'p :! L @<`p 8 6P@ @#@?@?X@<8@4` r#0 7:,p#x: 3x 2L @<p (x@?@<  0 @4P ,T` 1, @<@ 1DP! +L` @<   )80 8#@ @? < (3` @/  :x :2-D 5 {,P` :X 4@ 5x 7l @< 88 5` $ 0x 5p @"X0 *P 5x@.`6@ 6X/D0D@?\` @08 ' @1 /, '~l 0 !x5@ 8@ @4L 6z4 l !50 ( .X0 86 8 @- @*@  @/@ 7@<@? 2D: @2x@3@#P @< 5X 0 :@<P :Pp!0 0 8l 6@5PP #D @&0 7l 5 ,@ 8i-@($ / @<l:@+ @4 P . :: 7@*L @<v0 40 (D`@%@- @4 @<\ 5 @"` @$:Pr @<@ 4` 2 6P @#pZ 6 +X )p` !y(@<{4P 5,2p3`  3pL 58`@+ : 8| 1W @( @<:<@?@? :" @!~ @+@ 2@0 4` @2P@ 8l+0 :f$' 3 8 @4 |P @3 $X` @<` 5L@!L ( @2(&` @4X0 @?T : (@ @46X5 1L0 @) @<4 8L0 :0 7h 3l #*D 5@ 4 . 8@?<p @3p8 +u@1l@,D6O@ @%PP( 5`u $X @/xP@&l2kP @ '8U0D`P @$5}0$ @0  : 2  5$Z@88`@#T@ (|(x@<0@~ 3X:@# @& 6# 8x @, @<3`p( \pD 2` X* 4` 'x"  7:/ @xp4h0 @?5$u@8@ @<0 68 @4H -p +$ .1P3  *P` 7x8%yP#X @.z @- ( . 6@< 6&P 3 @?P @? @,x @<@ @3 ` *p :c5,@ 6t 20 6@ 6 'D 0@3q 5q 1 2@ +D@ %` #4 3 6(`@ @%rP 4w` @) @1@8< @4 7`@ @<<@ 3h<5`: 0X@@!w / @* @< 4dP 2D` .x -@<L 6l'x @#L @?X 5' `p 6 4l0 6` 8$ 5@ @< $p +D@8y` 0bh0f 6@<&l @< 4x$lPd 3`@ %4` @<T $P@4'@ ` @ + @!@h   " &X0 :@. 8x ! 3 5~@%L` @4w0 @d@ @'<`7@8$0 7 +( 8@-@*\ 5d @'D 8gX (8@ @'`07$P5L(6tL $P@ @ 80Q *o@2p8 15QV9  :P 5u4 % P @#H05,p(D  @<P050 2@@?@x 43` @0Pp %0 : 84$ (}8)x6 28 @< @< 8@ 5L @/`4|p 5 :@0 8f( @31 ( 6l .4 2 20 -4 :0 0 7@ )l:@%, *y$ @3x @< " 7 6J0:P b@@<l0 @#@XX 2P)0 8p @<h +@{@  @-51 @4%@` 3` @( @<`p 8l :4  ' +PP x` @bPP 7o 5s 240(D@?l: :84p$ 70 &8 2  7@<6 '0 '` @.@s 8  6@2D &6 'c, "l @4l@<`p 8@?oD0x@< 445 $l+t 5 @< @%D@#`@ 5P0 @<1xX7 6T3@7 @(b y @ U+ @<P p6~@6 @f p 5P @(5 p 2l$T8p @0 (0@4@ q ( @2T T$1'p @3`7 5D @# 1( 4Q% @<+ 4/~x@% :0P *^ "$5p @%$@ @?\P (x @x @2 6P @'vH` (4)~P 8j86 @ @%  pY%wP.$!bP :y 4X 6 4gp  @.@2<W3` @2Pu8)l'4 p@<7p1p 5 #@2W8/$3pW1}x @,\p 74D0 eX6( 6P # -x@(  @-$ 0@ `0 @&`6* Xp@ @ 60@, p3 2]T 3P @g 6</ $@?p(` -{ 3 @<X@<L0 8x -q'@0@<H` $h@LV@. 7 )x, : @<`P80 @<`@3r :  :4+l@*V  S`` 26p@0 U2p +x 80@-0f @< !0p 6^p8 @<5L2 6P*t@ @'l /P Xu\ @dl %8 l @0[0 .P 7 22P 80@4t+mh` @ & @/3ulk\ 6}5 ` 2z@. ( 6X@ @2` %\ e@ 6 -X5L @27 8`V1 @+6o @4[@8g %@@*l "`8$`2*D @1p 6W8l` 8 2@<0p @<< 7:6 8 @ %p:8.x ' $8 l@< 4 :*s@?6@ @<T :X@ #4 :` @a 8p 0  7P/85d@  @ZD %|@"l@4d @<y8[ i@?L @<  @<H` @2P@1l @3P *0` 4 u0 '0 7` ' 6 H @,` @,P, 4 6x$P 7L  7 |  @)@?y@{+( /82@@&x0 @-vt!@?&( :, 19 185X 1, @<1/@ 7>`8`@)x/ "(P0 @U@.`  @ /6o 8i`!x$8 2` (0P"@ :t(x @<0 5 . 3l 8S @&m@ )` @#y :pP (lp 74 7` @1 @-0/ 5 *P *  4 -rp  4 @< @448 !@ wx@ +*X 8 (@ 7t8@ D 1,6sp3]l4_ @+ `6L . @#d .5&x @<l@8~D #r 5 \ @ @*   .4@<,@/( 5yL @83l 0 @< @'P 4L@4)0@ 4 30<#` 5P@<$p ` 8P@ 8@ 1@?6 8xp @/@:0 @'$W2|` +@n 't ' $ 88*`@ @48@ "),`4r0 @#80 D5 68 :` @&,1]h0@/ @1l 8` $8 1 1H # :D * @<`p p)x @tp@4s@   $_6];l @<@-82s(06@*l@X 6lp\2 ,Xp @1x 7 6` 0@<bT 5L1h : 8: / 6| :u @< +x 68p -4p0x 8 @&` @<l 4U '` 2`P (l@ 3yP :8Pp@2H 6@? ::ql` #e`@3X "L  @ 6@ 8U57X0 @|@2x 2 6@34, 8 5P@vl6Z @(p @< 8`(4723!4x` +P .  %`@ 6l 0\` 31p294%p 4@), @& 5 @2@?@ #@  68 @/sp 1 6l @u@? @<l +`@) ( 4`x"x*\T p* @#x@ 4t@ @<M 8@#$P*$ 14@3@@o :$ @? @?X@?@,p7.@?0 5 q + 480 (xP 6`` 4`@ 58@< 7 '8P&P,R!P 5l 6 ` "8 @<w@6P 4[0 #  5@ ( .D , :@ "pU(,&{l`* @*P@ xL0@/ :@2v `3 /  T@!&@ , +0  6d 1L t @4` @! 5L0 H :X %q81 :x 8lW/l"* "8 . @p #@@(t 0 - X4tP6`@<v< / l @ ) @4#u0 0u @, @?4@#x`@ @' *Xp 738 7x0@ @-` 8q`f @< 7 @"L@@/yp@<P@4:l )0 18 4X62``4-X @<` 2X7P%@/ !@)0 6 5 2x :P -8l`U@(l@ 6, u0 @4` :l %(* 7@ 1d D 5^8 2X0@U3pP `| :& 6 0@8 -}0 @Pv( c 6x6`p2@4 @3p :X: 60 7 :P  @XP @T  +r` 0l 3 @<l`!@  5oP .@?/D 7@%< V @#@ 8 2 8D 4l l2x " @$` 7@ @- @ @HpA8@`% @,4 @ 60 @8# *` :` @4T / %@<! p `-P 8 4+$` 5` @?x8l 3 @2 7 (X @2 64` ,D 20 @1P 1 4 :x 42 4L @+ @08 50 :@ @4 @?:P 7 * @15  6 5 @?(-P @2 4L5@<L@ +@ @4@ @up ! 3@ @< 6DR . *`@4 6l,8X 3 :l 8@- @2<P)x :L @< 5`5l '0(P#, @ 8 4ZP  ( )@?40 7 %B050 (u@?@? :@@<l@ +@<8P z@?: @ 8 - 8\@6p@3@0 @30 @<@ D@?86@?xtp@4 @/L 1X ,L 7 @< $ @'z( + *$ l @*L 2X@ @@?@?@3D S @<?@?D+l0 1 @?# Wx05`:o@ @? #@<P@ @3: 4}(f @<h't'pP zx0 @$l:Yx@<@[7P 0 :@<6$0 @*i`8L 4!` @'x "t 85 ,` 4x@1 &lz, 2` :P@$d` @<(  @&p8 5oP `p @ `0 @)@3@'o)0 2 0 'q 7 $} @4( :D ! 8. @'P 'X,P H0@< @$| 5 @ @<-P5k  ~Z@6T@<p@+l0 6ml@0D +Q 6w@ 6`p( 8@ ) %8 @<H 0 @<` @/` 80 !@%@ @X-~`@'@ `:l %T0 20 6P @<X0 @< 8c/4 "p-l@< @<o 7 1Y` +^8 "| tX '@ 3e x ) @ *s@ @$ ` @, 7  "`$ ' @# * @4x0@ $` 6l@<,@<` +P :L @<wl *88` 0P 6!l 'l*8@ @? 5at 6z ! 6h @<0 3j\` 6P@<D0@&(p :$` @<` @) 6l :X 6r 5@ 58H` '4 #4, /| 0 808t 5` 0   @-X@?@ 4#Z\P 2s  +l0 1l 5x"~D0T1|@Zx 7`@@3 7 4HX @4`2P @'$# , @< @*X X 8 P @1D 6L0X  Fd  q@%  )@@L0 6x| $x Z  4x@<MP 20P6@4@* s & @&7 *@ @4 @<:50 -z " 6 / @4 7,~0 0@ @ +y0 7 3p 38@ 6u 1 p68 2~p7p 65(P @1W`@ 10 8P @x3x (` @ 8  0  *l .8 5@ (` : 3x 5 , @<v8P :8p "x@ 8P7` 6 64 8s, 8ulP4L 8@%@ 'T wP #t 600 @3 :^0 [X "x@ @%P @x@4|0 @*@? @?@<w(@  @8` d 0 .cD` @4p 6L30 7, $ 8a` 6U3zl @"0L @#l@< @<@< @)T4` : : 0 5lU*X` @<@ : " @? 5H$} 6 #0 @?H@0`: @ P 0 2P 7N@8 @4L @&L:5P o (| @ x 3L08 @0x # -e p: A@@?L @?,8( -0 @0 "  8p 6l PP5%q` :0@1X&p  @3@`@ $ 50 2`! /X 1l 3- kPp  L+c, 3N 6L 6$` :@4` 4| p 8@ 78P @ @0 @0D  @4 @#`6d /0 )}< *|P +e $`7!` %$ &,4 ) \8n4@ @`2h 5` :` '4` @&P 4 *, 7l `U@4 @<@ @"@3x0@X 5` @x 0x 4l 6 @<qx!PU@)x +x @#`0 0+ @  1 @,@< '@ `4x@@1 6, ]P 6PP 3  7x 3 @`!'X0 + @% +P @*0@$X 5 /l 5|P %X6,p $x@+@<P8) @3  @<8` @2 OP @ @< @<4 7 6hP X @"@?` 3@@<g 7oH.P 8lp @?\0 @&k@`8TP#5` 4 @#| * 0X  @0l 0s8l@-0 5 $ *` @4X 2X 5@)4/@ 64 5tP @,@" D 3p +x 0L8(4Gx@3l` 8uQ :0 : /7T0 @<74 @<&` * 2P` 40 *L @4@<V4z`0 @!5@ -X@< 1@4 @<n 3%(V5 8`*,0 +x4q5`:rL`6, #@d8 8X 74p@*0 486 @4|Ppl  P0" @<3 P @,0 $pP 7 @?}L -L`( 8 #lp @)_`@x 68P +#fD` 2 0`8ZX 6h|P 7*@%X 5,@ .0  @+$ $uX @,@ 0 @<@'w % 8x 1vX 7 @% 6 @"P (@ (8 )4@? / *0 5x 7p 2p 4 4@,(- @" "x ,~4@!xT@)@@ !P 34 #8` ` 7 P@$ 0 rD@' @? 7-Tp 0 .lp@'l :P` 8D4f` # m)b5@ % @/@ @c@%` #8@U2l0 :8 @?L)0@ @-D !`pVP .$  @@ 4h ( " 5@<8`.l0@<` @'R2g4 3P @4@'%bx8 (P 5 8x@(rP` 88@2 5o @3l 4wT@?@?$0 @< 80 5'l 4 @< ), @< @?3 'P.Z` 24@3( %` 4x4d @+0 #|p @'0 @4x/(l` }p0@ ^ 0 );\ @E:p(L@ @2 14 :L2Y2x $@ 40`5P $` @(20P V` )P 40 6 ` @<'` @X` 8d@ )L&X` 2 *P@48\@6 6+x@Hx @< @P 6x` @(p 7D @X@ 3]@ 6l@ 8, :@*S0 :@@ % 88` @/ @4L5 0 #V@' :` 2*,6@, : @n/ 5h(p @?0 ,7%l8$!X7@| /gT +`" @0 kP`8l` @+ @?Y 0 @#" -0 @*h`Y@3P 5:T @+ ' @)  :`P 3` "$ - 3l@8p 1jD8` 8  :0Y2 @?P 1#-X@%*|4cl 1` < 4 6,@*t0`  @<l @0P @0 @<p @+`/ 1t@<p @<V$48 8P*` 8@<]9YD 3@- }L +802 @v6 $0 @1,p /0V0` 5 e(p\1n 2L @) 2,&# (s6v  $`(` 4 80 @! @<@?| ) * UP: 5p@?  $ 8@  : 7``@28 @)$ :@( &x @? 60 5X` %P@ :@< 7`2,0 6  3xp5cX Qx $X 7](&6v$@!P@#P 5\ 6$ @ )dd :0 * $H.x * 8PU,x+ @<@<p @, @<` @34p ` 2 0p 4x 5^ 4Dp1` p:@2@358@<xV(P )q`#}, % , 6Pp 4X#h@#l@ d @&@$#L@1  88`W-` @'( 0( 7$%1p@'\ /L0 2 3`U&` @|0 @/X @%` .H 2@ *0` 8T :(3d6 5X 4 @/P @< &` *@ %06x@?}` $$2p _ `mp@2 8( 6`6w  @*8@ @/gX @<T : 4r@ 6D0 y`V.T "@#D@ ":t388, : /s` @`0@ d 4@0+ ! : @<x 4 !n8@4X -} 5`10 XP 7D p  :P2t:6 4`@<y@ 7X @4 0 @<& 7}P &P @( ' T 5#.P @<X@ :|X3x1` 6DP 6` @#0%`@ ./x0 @ o +0 2I48@ 0v( # @3xp1L +Z` @0U!4 /p8` / :d @41t 0 6\y @) @3` 1 &0 7BtP @$  @<@ @<@tp 7upp  @<L 6 6$0 +h @4xP @< @00 5X @x ]@5| /@@ - @4x @3rP75( @1x 8P 1@- 6, 6 :fp 6 @@ :` ( ` 6m0 7 #H @?P 680@ @ %X+ ,@< @<8Td 1 &0 5( @h0 30-@` @<l / 4 3Dp +/X` @<@<8 '6 0p @3L 3 8$'8@<8  :8p @/ 5  6@ @)0@ @10 : 4`@@1 1pPV@1qp @X "@( 4 @0u+D 88 (D0 @<, l +P`7MD` 8x@#8@-\ Z 63P @p" 1/70 8 8Hh ^U@5? *s @1x@.pP *   UD7S%P ) @/:  6P @.(P 6 8` 5 0 |L @! @ @ 5`@!`@ %t 5` @ wD@x,f@(` 50 L@(yP 8%} ` 6 + 5oP60 , @4+fX 0 *(X@6G` @* 2x@<`@$L0 @.Tc   # @%x6*` 8p 8 ` @ P@'p @<g$@+ @&o@ { . 71P 60 3p%zp$lX, -h@) :8l .g14nt @4l`  )@*h0 h !@?@@ TD :OY W@.80 F4  4q8} @!, 'h@&{p @+D$L8X*l0  8X/T 7p *T,0 @<|4 @< -` :`7 $ 15h7X @<0 :l:D 4 @<  @-@ @<`:L@. @0kP 8P 6 8` "p 8 : @< 5X @.j6 5@ @/` 5"4 )(0 X +P 78 *@? @? @< @3@ 07`$0 @2:` :t` * 6 4 74 + @" 8 :@?p + 4l` +$ @<0 4(@$Tp@nD(p0 @, 7@? @< &8@@4"P 52H @3< ,[X` 8 ,` ' @ *`x 0 @ %D 0 7@ @<P @ 0l0 5 h:t@' 8xP $U&p@ @+_l %@P 5l 60 :@% , ! :@< @?`:h 1X  7, ) 5@p /0 .,S@#@4W7PW1  @2 @<p @( @<sp 40 :p 0 @% @<@ @<` @<04 @<P 00  (8P0t0 + @ %@ P @ 5 6X O 5` @ 87`@<l0@44+@ @<`p :x` \T /6@ 6, @< 7: . 3P  -l 4` @$X@<lX@ 1` 5\ 4D@< ,  @< 4p`@@:m`il @3  @$P 4 3 1W-P0 6@<D2 .p0: @ @) $ p $}8 + @2\ 0` @<`0 @)4M4@gP 1`$ @ 0 3v  2D45xP'x & &`$zp7zP#m, @-P  @ @ +D@%~ @@' @(5x 5x @/ @1 !~l@3l` % 1 (.0 7 2x@P0 @<x@ |` ,@ @<(L "` 8P ,L 8 $H 5(3 8 @% /( @ x @ 6j@@ ` 3  -uh @@@<,4X 80 $@ 5y&IP` @!s<6(*`W*@ "  :D :X6D $}\P 38 7l6X@ @)s$x @)8 @' @/rT2D1dD l(X: 5dH0 *P @+ @< 747x 3$0@"@) 6 )4 (7 @<t2 2@!@?l 6 .3`@', ,8@ 3D 3p !/(8p 6vt` /5@37 6P @(P X5` 6h 5X :(@?$ 4lP@<!8 @$P +0 /, %@?@< `o@?6 @%dXP -,` 6x $ P 7X 4FL@ 60 @<`7( @11 7` 7,0 @4x0'` 6`7H`*~|0 1,@1@)430 @? .L@84`7* : ` @4 1 64 /@@ / 4@)l@3x 5!x 2 6A $@ }`0 3jt@sP@#` z`:p @./` 8  0 /` 3P @. 5  3 +p / @<X  ` 0 @< @<l@ *s$ @/4 ,pU)< :H 4 @` :40 @/!8 : /rL 5 $D @ '  48 @2@?@?` 8 @<  @&x3@#\@ )/0 P X5 d@<P 2+(3Y@5 @2 4Pp @" *1 6 @<P@@) @<, @<48 l l 6 @( 8` @hh &x @ @0 @0 @T |D @/ @+ 7` -| @2P V`` $ @* (64 :(`4L,@x@48 # 6 &D X @P R@ /l+KpL& @ !x#0@`$|7&P@3@ }5c@h`@/jP@ `\@0@ 6 /'@" 6$ `7 #P @ 4@/` : @?0P @2 7e0 .jP  }@-x@485 7@?@ @4_2l8@P 6@<@ 6l @<@ @< 0`+4@4p @3X @<@ 8 :h x 3$0@+` x@W=h 3d< `` @<  t( @+l @0 _`` P @3`@?@? } 1@2L 6X@ 70 @`"x 4@?6P&x # ( W7` , @ Xx 6h :8 @<`$ 7 @<`2 8 8 @< l #p0 @<0 @ "6 @1l+@p @< @ -}8 @# 5h $4 L@ @ +t  3X&r 440~ 6p`@t 8 X 4{@ 7 3A `X .`-0 #ot0 6l ) @0 1@ 4p $\ @ !W0R /j0|` @?40p @4|:(P$tD0%oPU~x [d@ 6 6 '" 7V'@?H 5 4W6p3@P 7`*\<, @<8@4X :@0P 3@p @<@< +8 @4a 8@:x4x,x @*\xP @# @< @.@+P l7xP@< ,, `@* 8X;`0 @2`U7`0 @<|p+Dp l @< i 8\ @$(06P 6$P ,p&y /TT1 4H8x2@+(0@?@ 6P 4(, @$] @<  @1 6H z@` 414 :jP@4, *4 p` 4(0 0 :@?@ *l @'c 4h@nx< 75780 @?D5 @<5 @<D,@ @<w3x4 @$rx &w)xp xP` ' *@X .0 3.\ @?:@/(`@l00 : 4{& 'D 3g ' X@ %\ @Y 61.8@ 54`:@< 7 `6{l @# 8L '( 5` @ P7 }@3`" ' % :qP$@` 6X0 @4  @<0/@6'  *i MX` 6}4 +y' @1@`Y@6 :rtp8 8p 70 Zz ^2@ @.$@"8 5`6P 0P@: 0|@ 3 @M,` $ -x0 @( P 1h @<p@)` #x 4`@@ P ( +H +T2X5@<DP 4 7 6 @?+ 1, 7P,,p 4L 4 3@ @P $@0 }4 @" 2T :h 6 6U`@@<p87@ @< 8x-x 8D %` @l@4$ 60 2@ 6p "lp *(p 4 8`6`& @ 0(80,( 6z10X@)D @$p @'P6$145  kx6+0"0 "r, '54 400 7X" @"d8 X #XP @'` ` * / / @0|`+L 3w @. L @  )@ lX #+P 4T@ 20 7x *@?XW80 @$zX( 6@ # N  6 :l , 8' L` 5@L`  0dL @<` 5  @]/4p  +T "@ 55p @,,: @ :p (@$p , 1( ! )#` -@P @. @<`P @<D r@ )yx@? @<t  &(*_2x : 00 %tX0 #x 64 (l 2x 1D @!x 70 3a-`8` - @]4 5@?i` 1p @<:>h "4@4tl 20/@@? @<U@)P@\0 ,02l "xp :, &(  @8d #, :(L 6`@"0 @  @3  qx`  @3 %r :x0 4U5~ 2e8 @%i0 3#55 &`, @3\8 &x@ 5@<@?@<` p : @+@< /@< 5X8@8~@5@- @@&x .`5 - 5l @?5v @ #( :p"0 a7l @<p (`` @*:` @<( :,3 0@ ) :gX@!X@ )074l` ,45/` 5|h` 3~$ 580 2 2N"@`  21` @4x  0X -0 @_X -0(  @(D`V@3h @d` *h 5Z%@ @<( +D` 2V@P 7 *X $4` 5 "v` @-`X@8@ 7`P@+ :j 6P+P 3P 4| @0 !P @`@0 5D l 6P!@<x 2 @4{l:P ) 4 (t l @+(&P @*j` @?0 8;@0 /_8 6X@ @"@.4@4D` @! 5 e5uX @ H3D!zx + ` @<m4 .< 5x@232@<w @)v ) 4 /l 4L @<5@ 8x 4 8 8d -L@ @<|@ 8P @<D4vH0  PW@5& @3` 'x6{` @@ ! 6x0 4LP @ *@ @? @<l /4@( @1d #0:  + 4P@S@'` 6P 6H 30 @D` $ 4 )P 1 @<84k40@(i 4l3~p~ -d,@<0@00 3^| 5|p 4 :2 @ @3|@PA @02 @$ . !+@(p /40@@<l@3wH @?X *n, :^@ 6lp D@ @<1 @@@?@? rL` 2p *wP` 3`0x Px@ : 'd @ @ &:D 7 @<B@6H 'L 8D @'@ @3 3`:` @ZX@<40W3 :2 0 6 7 @<P xP %P03}( 7<0 />P@ @$ :@"P'x 3 0x 334@& 7t` 3 1 @2 @<L $ 7U/ 40$ &~4 & )_@ -` @- @@@,$ -$@,@ 7@ )*@ 8 6 6 6` 7P 64 :` @<L @<P 2 .l@ 8` @1P : + @2qd08Lp @4 @ :m `@<p 1l0 !xX @7` 4 x@?6| @!` p3v:P @+@?p @|X  +`$T/P0 @ @<T @,L@/X0 *%4@<,@/ @<40 6 2` 4k( @<l@-P @, 2_4xp 5 @<@2x) 3 6, 5l @+D24` 5x` :0 1P0 ) $: P0 $ 47 ) 4 : 4 40 1"@ 30 @(06`*  <3 @4 7p % 4x* 66O@'  @3@ 0 6x' 6 @+ .-{ :` :'(x 2( 6 8&` 7 @<`@<<@@,L 5P7 8#8@ @#3 -` %l:` 5 @<8 :` 6` 7` +X : 4 66X 4@#8 #H  0X @+$ @4 %  7:L 1 @< 8@ - 3@+@ 54 @<`T@,h`  0 @& @4$ @- 3P @0 b0 @<5PP 2` + 5 / @P @3 1 .` 8 @<P:46l 8 @< 2 / /` :p # p( 8` 5l 4 5 :01@ 8( |% 6x 2it $x5 6 /X@0 8 @." @<` ) 6` $5 3h8 66  @<8%8@ ) 3lP 3 5 : :z (x@< 7D@*x80"8 )` 2@< @,D 34 :` @ 2` @%0 / - @00P @<x@ @" 5*  @?8` @.l@- @<l@&H` @4dh@?@?L 7,@?h& 6` Z :@?p\@?p 6c0 *|`@. 5 @-X` 1P`)@<0 5 1P @?@p @-1 7  6w3n *6D l.) 5x*x 2D 7 4 6L @3 :, @#m 1x 2l6( 2*D $vx`,@ 6X 3@ @24:4 " 3\ 8 @<` @< 8`@<@"@ 3H0 ,(` 3l 5\ +$ (`  @4.L ,@ 7 @1l*x "6 2@+L &`@ @/l @1 50 :`%# .` 0DP' 2+L 3 5 4@ 80@)X 68 7 1`/@,X @</ ( 7,'x 4( :5l@+ @<D@ @< 3 5,X@ (3 $0 6 @1 2 @< 0 6 *0 7 @'(P 5: 3P #8 4` 8D*P8` :\ 2P@D @)p @'0 @0 5 *$ 24@<L % @<  *DP@"`6@<x @< 4K` @l8 @<7d0@ 0P <-X 6`0 'L @)@@vh` 0 :l 20 (7D @1| 6 @<Z p {  @4@.l'@ . # 5 @ @? :` @[X 8@? 60 & 8 7h4@x  @, @0h 2  @,p 8X2 7( @< @?t8  @1 2 @? @?lt@+@-| A@2  : :a_@y7 @? / 5|` @ @ 0 6/DP @ 32x& (` @S@20 @'P  7P5@< 0 @< @1f(1@ ~$5 64p @3  @<, `.p)@ @2y  .x 6t p0 -x 7@ .@ X` / "4@2k @2WP@?~X :h@$ #V. @p8$kD 3L8L 4 @& @) , +) 2x`%@!@@?@?@?`0 ) 8P @? 60 @10(P0 @ 5@V  u @4P@x @ #` +`p 8 'P @< @# p 8,0 6P 480 @?p )8 3 @1n\(XP @g @'x $@@l *^0@0}D@ 5 6yt 6L*@ +H @-0# 5X@ @< vLP@< @*,:P 6 7 @P /@3el0 @1l` 7y` 2D20}H @<e8u / 8@?@? 4 1 @4p0vD 5H\8y0:P 1 @0 @( @@2lP ,{l7X +p @<x5 @< 00$ @3P0 3uD 6P D` 70@<8 @4!o '$ 1` 1D1b  (|0 +X+X6l@ /@.P (lp x,4 +x 6L` @( @2P /0+L@)w2 @<3 |@#y "p6  @?@ @<S@ 6X6(P $ K @~2`@& 8@ - 3 (\@ @?l0 !h)` 43@ 8_D #` 04 f0 @< @) Dp : 'x' |`@0^D8$ @#@ @ ` l " p 3w@ @+%x8$ 6 6P0X0 $ 3 @# 8 @0 6P 2l@ @h 4}t@`$P :kD:x@?0 +8@ 80#  @? . & 5P8 14@<7 2, "0 @<5P 8~ @2l 4X 4t@?@?D 7$ @<pd 4P$P6@ 8, @1e&u +` @?+ (L@ @,D .` $cl 7 P@.~` #(`vL@,"tp ." @<0 8\"y-8L:z)@ x` :@ @3l:` *@?!@?@?@ @< 1o? 5l 5   (4 |D 2-P +0W50@. 2f %8 `` 8l @$@4\ @2@` @. -P @0 .e\` -l` 0+Lp &` 7-L )X @SX @2 "x @@4: 68 ,r@P@-`` @4t*K 2 8 X4` 8X 8 0 8P :D 6rD hl@!P!d0 #@ @ @$l @<X` @<W@9$  0P @)$4 @0 x 64` J` @< S :4b @0 :4@( # &,p 5` . .3t#p $ 7}8 ` 3z6 /H5 2@ h|0 2X 6t @#( P @<6P @<d ( /@1P @ @2 @@& 4 %^2 @<p@& 82l+ 6 @?6` @<x P. 0~D"p@<`@ /'x 8V@3x@ :D 0` D$ ! @ @< -0`@40` @ l@< 5 : (` '@ @T Vp@ +./` @( @<@%` @4$ lpV9yl 6: 80 *@? 5+[@" "L 400:P 18 @)  8s I u +``5bh (@<, 4: ' 6` @?+pI @$ .,m 0  @@! @ :#u0 @$ 0sl 7 8@!L 5l@2 2 1$ 4X 6` @<,0 4@ 58 : 44@ 7X4:4 @2l3 7P 5X 4( 40 0 8 #62t! 8P kh )P @3 3pp)|!` 2yp @<`U 00eD @?@?0 8 0p :];,0 @/x -P 8L @<xL` :  4 6 ' ((P):P7P  @<x @? 1u@lP 2p 6 8 +l ]@!8@ #x:4lP 8t(\` @<,@ @  0\ @(`6tp$@ *` :8p@.`@(l ` 7`4X4 @*l x7  % 680@?`)0 *`# 8lS X 60 4X @2L 6l 0 $ (1l ( .P  :0 @0( ,` +lP y D @# 7 @!`6d p 6p. 1\@ !( 1@ @ 5]@.`8` 'P5, :xT :P @(~4` /l`  5| @#P@4@2r` 1` 6L0 %!t P  4 @*T@ 53 @4 /h` ` & 6 8P@?X 1p 6@ @* # + e4 N@  6X `  3x 0$@ T0 @)x 4 (6` 6A , 6 8T 8x0 : @$X / @4 8l *M`1p 4& :~ : 1@ @0 7@ @4+ @DP -`U@/x 6x$2< @<Xp @ `$7 5a 2z@ Sh @1@?8 4` @. o`}t 8}  \ :l 86 :d$ x@3 , @00  @< @ 8 %Hp + @'0 @  1 6X0 @2 6x0 5 @<]*xL18 4 @< @3p @*` 6@ )P@3$ ( 8P .X "T@+p@?@?@4  8V.(@Qq`$ 30 1X@3@: 4l 5&gh @2 @!6 *D` {00 8 8Xp 5!8 0lp 4D l0 7@/0 ,n)0 X 6  @0 8 @%dp 0$T d08@0D@ Dp@3P )@ q .@@$d*X` 4p @<56 5 &/l 1G@0 5DllP(0 0 3t` @?H @ @?@ :X @+m0@7 { S* @4$3p0 2,Y @82ol5@ 2u 6 (0%0H 38$x @D 5 :0 #|L 1P 2P $ $hh x8B 5D l  7` @ D0  2-x @2l #$p@0l @0D` z@?D +d 84@@?  @ 1: 1 @2L7  6x68 7X :L0@?@ -8 @'  8 :v @3@ 2 4q@ {8@ 3@0 @<01 @<a @24(p 6(*@V@'  5 ,4 @L@ , *X2aUX /0 )0 !. '0 @<t` @3$0 3 *50$ 5 3 @ 6rx!L8P .@ 1@?lV`@#P*} 5L -l@ @#H&y +`(dP @ @+\` @<@?@@ P4P@P+ l` "H`6x 4D @4 .D 6,00 &+#0 #|l_& 3 3o . 6( 2,/X @<P @<0 :  @+iX@3  5X@)Dp :2$ l@ @<p @4 @& @?  ' :` !P 4 @2Lp 6P $H 78 'Xp & 7D  @ $x @), 6 7 !P@' @YP @1pp|t( 6 d @) @<+\5 @<@` 8P)ޤ>B %-5=EMU]emu}  !-; N al z  * A Zdl}      *;M \hx  +8FTco      2 H \ kz   -A Q` x       .=K^ o     + >O _ p       . 7 E W a m z           0 G \ l v      " 7 N c v   6 N f ~  " B Y r     2 I ^ s      ( 8M c x      &4BN g |      .=Oaiq|    & 7ET\o   +7I ^r       - GT fq~   (4P ar     3K _ u     ':J Zf u    )9GPWcp|   '2D V i w (2BSbr     />P g ~       7 Pl   #2 I \ k{     $/<JXfv   #1 DQ_o~   ! 5 I Z g z   ! ! '! 2E2O2Z2j2 }22222 222222 33%333B3R3[3g3v3 3 333 3 3333 44"4/4 A4W4h4 y4 444 4444455"5,595D5K5W5a5l5z55 5555555 566 6*656 G6 ]6 s6~66666666666 7 7(7 ;7 O7 a7h7t77777777 7 7 888,8=8 M8Y8 k8w888888888889 9 '9 99 K9 Y9a9 v9 9 9 9 9 9 9 : : 1: F:W: h: ::::::: ::; ; *; B; T;b;o;|;;;; ; ; ; ; < <%<3< F<R< `<l< <<< < < < < < = =*= :=H= [=j=u====== ====>> >*>:>D>S>_>n>z>> >>>>> >> >>> ?? /?L?m? ? ? ? ? ? ? @@&@1@9@G@U@a@l@u@@@@ @ @ @@ @ A +A CA YA jAxA A AA AAAAAA BB(B4B@BMBZBgBrB{BBBBB BBB B CCC.C;CKCYC gCuCC C CCCCCCC DD 4DGDSDcDrD DD D DD D DD EE)E :E LE ^E rE}EE EEE E EEEF F)F 9FDF UF mFF F F FF G GG /G=GLGXGfGpG{GGGGGGGG GGHHH&H2HAHQH hHHH H H HHHHH II /I DI XI qI I II I II IJJ (J :JJJ ^JjJyJJJ JJJJJ JJ K #K4KDKVK hK KKKK KL 5L PL jL ~LLL LLL L L M M'M 7M HMXM kM|MMM M MMMMNN &N 7NGN[N uNNNN N N N NOO ,O:O LO ^O pOO OOO O OOOO PP"P,P9PIPVPbPpP~PPPP PP PPP P QQ-Q GQfQ {Q Q Q QQQQQQRR R0R DRTRfRwRRRRRRRR RRS SS 0S CS XS iS|S S SSSSSSSS T"T+T 8TCTNT\TjT|TT TTTT TTTUUU*U5U?UJUWU_UiU zU U U U UUU U U VV )V:VHV VV gVvVVV V V VV V W W 1WBW [W nW WW WWW WW WWX X)X6XFX WX gXuX X XXX XXX XX YY Y+Y=YNY `YhYwYY Y Y Y Y Y Z Z /Z;Z NZ bZ xZ Z ZZ ZZZZZ[[[ 3[ K[ c[ x[[ [[[ [\ \ 7\ L\`\ w\ \\\ \ \ \ ] ] 5]I]f]w]] ]]] ] ] ] ^^ 0^ B^ Y^p^ ^ ^ ^ ^^ ^ ^ _ _ -_?_ T_ f_ y_______ _ _``"`1`=`H`U`a`l` |`` `````` `aaa&a3a Da Va ka aaa a a aaaa b bb+b7bGb \b pb b bb b b b b c c 1c CcRcbcsc c cc c c c ddd ,d:d Nd^dpd dd dd d dd de "e 2eAe Teee xe e e e e e e e f 'f =fNf af rf fff f fff f g g 0g Fg Xggg {g gg g g gg g h!h2h Dh Vh jh h h h h h h i i 9i Si gi }ii ii i i i j2j Ljbj rjj jj j j jk kk)k5kBkIkVk dkok kk k kkkk klll )l5lFl Vlelsl~lll llllll m m -m @mJm[mkmymmmmmmm m m n n 4n GnVn fntnnn n nnn n o o 8o Mo\olo ~o oooooooooopp!p -p5p@pKpVpbplp{p p p pp ppppqq ,q :qFqPq]qkqyqqqqqqqq q q r r 4r ErPr ar pr{r r r rrrrrr rrss $s 6sGsTs cstsssss ssss sttt-t9tGtWt jt |tt ttt ttttttu u (u3uIuVudutu u uu uuuuu vv 'v :vIvVvev vv v vv v vvv vvw w &w 9wHw`wlwzw w w w ww wwx x 2x Jx \xkx |x x x xxxxxy yy*y6yByKyVy`ygy uyyy yyyy y y zz z/z@z Qzbz qzyzzzzzzzzzzz {{%{0{;{I{U{b{q{ {{{{{{{{{{{{ ||$| 5| F|X| o| ||| | | |||}} } 2} B}O}^} u} }}} }}} }~ ~ ,~ @~P~ f~t~ ~~ ~ ~ ~~~ ~  / @ U i |        / C X p  ƀ׀   +;JY iv   ҁ߁ * = Q] lx Â܂   1 Gd y ԃ   0?O\lu ф  , <JT er~ ƅօ  *5 CR_it  ˆԆ   ) ;H Z m   ԇ 2 F \ qňֈ #3 L \ o É ؉  $3;IY l | Š ׊  ,> L c v  ̋ ܋  &1<DOZm ŒΌ݌ %1@JR^ lv Ǎ ܍  ! 1C X m Ȏ $5 G cz ď  " 7HV^ x ϐ   1 F Xi { ґ  ! 5 G Wbr  ϒ ߒ#2AQ]h|ēՓ.>IS_kt ƔԔ 3@L^my Εڕ   #,7BJRZcr| ĖҖ ߖ (5 J ]gny×ї &2 ?M[k  ʘט  " 8 IXbx  Й  , ;H Y k  Кߚ 3 I [ r  ˛ ܛ   + B Wh | Μۜ  "3=K\ qw  ѝߝ )5?L ]hvƞҞ'8DMWeq ş ԟߟ#4?M]h {  ɠ ٠ +3@M [gq ǡ ء  #2CTd u ˢ ޢ * 8EQ _m | ǣУܣ  '3BQYds ̤ݤ  /;JT\lx ˥֥  %0:HXds Ϧ  *6GX fu ʧ֧ %4C Udt ¨ ը  ! 4 DQ c s Щ۩  % 9IS\i z Ϊ٪  , :H Wan|ɫث !.> Vao Ȭڬ  $8BN_ r  ɭ ܭ  * =KXdt| ʮٮ *< N ]j{ ȯد  & 7BMW h }İѰ 9R h ñѱ߱"-:I Ziw ²ϲܲ  -; KY kyϳ #4 GP]kwĴδڴ-:HWcq} µȵӵߵ  (5?LYcpzȶն ):IVeq˷  $4BKW i x  Ÿ ׸  ' 7@NZhp{  Ϲٹ  # 6C Wcn| ǺӺ  -<GUf x û һ    / <FS_ku Ǽؼ# 7H ] jt ƽ ٽ  ' : JYj z ľ ھ   5 O ft  Ϳ ݿ %5AM ` pw    .=MZer   &2 C S]jx  , B Ves   )7 JYa s   , B Yl  !/=HVajw (7DWeo| &4=L Yd w   .8EQ]hs   *;M ]m|   &4EQ f t (6 HR^hz  &5 DPZ i{   .8EPZg| "1B U`lz ( =C U gu &3:K \ nz   $2@Pb v  )1<GR`kx   2 FX m ~   +:KXgu    /= R hq   . ?N bo~ % 7IU fu    , B V k      &7 J a r  "1<FU^iv   )4C W ew  ! 7 EScq|    $3CQ apz ! 3DPYdt    & 5@L\lz  $5AP_jw   (2 BR gz  ' <L]m   , <K ] w   %- AN] n ~   '/? S e y  ) ; PZf t  /=GVao~   -6BQc w   %2AKYfq   %4 K ` r %.=NVb y   &6E Rao ~    2 G [kw  !1:L ]hw +9EOZep|   1>LZgv   + ?P b t      )4@O]gt  )2=J[gx $-7 ETbs  (2 FWbp|    -<Qdp   , @O` q   4M c t .7? O[er}    2;AL]jx  %7HVfp}   / C Y n ~  $4 FTcs  !/> Q aoz &0=GSet      0 ?Q b t       ,> Rd t        # < U n}    '5AO `p| $3;G Wet 2 HW fw      ,= P^k{    & 6FWi ~      +  @ J X e  s            $ 3 D R  _ k  {            ) 0 ; K  Y  r            +  ?  Q  b r               .  D  V  f t          ,>O _ju   & 7NZiu      6AO et  +< N\ft        5 JWdo|  2D Wco    .;L ^jp~ + =IZgu   -9DQ\eq   " 1=IWcq     ( < T g z    &5ET_jy  "0>G Zgv   +7CMWfq  5Y t    4 GUdq   (5CRb u *9FP\k x     # 4  J  b m y        !!+!8!D!S!]!j! w!!!!!!!!!!" ""#" 6"F"S"a"l"u"" " " " " " " # $# 5# H#U#d#s## # # # # # ## $ $$'$3$@$H$S$a$n${$$$ $$$$$$$$$ %% +%3%=%M% [%e%q% % % %% %%%%%%& &&2& C&N&Y&f&w&&&&&&&&&&& ''"' 4'A'N'W'f'r''''''' ' ' ''' ( ( 2(?(G(Q(\(i(w((((((((((()))()6)F) Z)l) ))) ) ) ) ) **$*3*B*O*_* q** * ****** * +&+4+?+ U+ l+{++ + +++++++ , ,%,0,>, W, n,},, ,, , ,,,,--!-.-<-M-\- l-x---- - --- -.. &.5.E. X.f.o.{.... ... . . / / &/2/@/ P/ _/p/{// / /// / / 0 0&050 H0 Z0i0t000000000 00 1 "181 J1 Z1g1t111 111 1 1 1 2232@2P2 e2q2 22 2 2 22 2233 &383 N3\3l3w33333333333 4#4?4 W4 o4 4 4 444 44455 &515?5 V5q55 5 5 555555 6 %636B6R6c6r6 6 666 666667 7 $7 77 G7V7`7 v7 77 7 7777778 8 )898W8 l8 8 8 8 8 8 899 &9 ;9 S9`9i9t999 9999 9 9: :': 7:G:V:g: {: :: : :: :: ; ;); 8;F;V; g;q; ;;;;; ; ; ; <<.<=<K<Y<m< << < << < < = ='= := L=\= r= = == ===== >>%>4>E>S> f>s> > >>> >>>>?-? ?? P?_? s? ?? ??????? @@$@1@:@ M@Z@ o@ @ @@@@@ @@ @AA$A1AG UG iGtGGGGG GGGGG H H #H0H>H OH ]HoH HHHHHH HHHHIII)I5IAILI `I qII I IIIII IIJ J $J 2J CJPJ cJ xJJJJ JJJJJ KKK1KBKMKYK nKKKK KK K K L L$L 6L ILZL kL ~L LL LLL L M M*M9M LMYMhM yMM MM M MM M N N .N ENcN|N N NN N NN OO+O BOQO dO vO O OO O OO O P !P,P;PKP aP rP~PPPPPPPPPPPQQ'Q7QDQ VQcQnQzQ QQQQQ QQQ R R ,RARMR[R kR}R R R R R RR S S 6S GSYS iS }SSSS SSSSSS T T%T1TBTMTWT`TlTzTTTTTT TT TTTTUUU%U/U;UGUUUfUoU U U U U U U U VV'V5V FV XV fVuVVVVVVVV V V WW "W 2WdQd[d pddd dde'e @e [e ree e e e eeeeff#f 7fFf Zf jf yf fff f f ff gg'g ;gWgdguggggg ggggghh #h 7hGhYhdh qh{hhhhhhhh hh i (i8iIiTihixi ii iii i i j j +j9jIj ]j sjj j jjjj jjk k ,k8kGkUkdkqk k k k k kk kl l 'l6lFlTl elvlllllll llmm%m :mFmTm km m m mm mmmmn nn*n:n Mn_n on~n nnnnnnn n oo 3o Io [o loxoooooo o o o o pp/p:pJpXpcpuppppp p pppqqq 0q=qHqTqbq rq|qq qqqqq q qqrr(r4r Gr Wr ir }rrrr rrrrrrsss 1s?sNs as ps|s s s s ss s t t 6t Kt _titwtttttttttt u u (u6u EuRuduquuu uuuu u uuvvv+v6v EvSv]v ovv vvvvvv vvw )w ;wJwXwew sww w w wwwww x x,x7x ExSxfx zx x xxx xx x y y#y-y{L{\{ k{{{{{{{{{{{{{ |!| 5|H| ]| r| || | | || } },} @} U} i} } } } } }}} ~~#~6~ K~]~ o~ ~ ~ ~ ~~ ~  &8DU epz  0 ?K\ l|   Հ  ,<DMWd t  ȁԁ  (3?IX pł΂ڂ  4 EX p    à ڃ    ;Xx   Ä ބ  )7FQ^ju ȅ؅    '/? Q\gq  Ɔ ن  #/=I W h x‡ ه "3 CS fs  ̈ۈ "2? P_l{ ͉ډ  ( < V jy ̊ۊ/ D Yi    Ջ   - @N_o~Ԍ+4B Weu  Ǎ؍  )<Q a p  Ŏώڎ"3 G \jw  Ǐ ֏ *9 J[mx ϐ ߐ  -= X iy  ͑ޑ(4BT gv Ēϒ  *:CN] l| œ ؓ &5@LXfr~  ʔ ߔ    -<KZir  ϕݕ &7 I Xfp| ϖז &2@IVap|ŗ՗ "5 HU kr  ͘ߘ !-;K ] q   ͙  '5G Y lv  ˚ؚ  2<FR cn{ÛΛ   '6FSap  Ɯќ  &2<O _jv  ˝ݝ  ( <IXhu    Ϟ  += M\ p    ˟   , BLWf s  ֠   .8BKV^o{   ʡء %0;HQ]l~  ˢ   / ? Tct    ѣ    & : Q g  Ԥ    4C Tb v   ¥ѥ *: M _ r  æ Ѧܦ  ) ? Tc }   ǧ ܧ   (4AS e w  Ĩ֨   " 1BT du   © ܩ  9 Qi    ժ  !-=J ] o}  ūԫ   * =M\ ju  Ȭ٬    5@ Ra {    ˭խ   0 C \ p   Ѯ    / E V l   ү    (8 Ssɰ    3 L g z    ױ    5 FX l   ɲ ޲   .@Oc z   ų ޳    / C X l ôԴߴ   $5 I c z    ̵    / Ntݶ   : Q f w  · ط   (: Q d w    Ը     . D Zm     ӹ   + = Q c u    Ⱥ ݺ   0 G ` q  ӻ    $ 5 HYhz   ׼$ 9 P ev    ֽ    2 Jetž   , = M`ht    ѿ   +> Q c x    =Yy    # 9 Rcu     *: L ` u       , B U j }       * ? Q gx        ( > V es      4 H Zix       /> R i |        *9 N c      "5 N as        0B Y o       ) > N`q       ! <J^ x    '7 K c |    + >N a w      -= U l    %4 H \ l~    +> S o      * =M _ v    )C W i {        ' 8 L d z    ' 8 K \ n       0 BS g        # 9 Qp       . E X o     $8 M d }       0 G Y m    % 9 L c z      )H \ t       *9 N b t  + ? S j       ' = M ` w     0 G [ r     $ < P hx        ( ? S h |        $ 7 L e {     A^ q    * = P eu    / DT f |      ) ;DNXh v %2<HV h |      '0:GO[ nw      2 CQaju     3E Ubl{  &5B PYfr|     '4AM `mx    0 GT g z    $.@ Q_n       ,7FWgv       $ : Q g      5 IY k ~    #0<M\o   $ :Sct      " /FQ dq   ) 9ET e t     "-=IWg }         1> P cu    *I e|   "= T m     #3D Xh     )6B Xm     # 7 K] p      #0 CQ]m ~ % 6DSap{  +:DR^ks   / BQa t   $ 5?IZdr  !/ ?NXcq   $0=LWgy *6BQ]o}   /A V gw     % 6 Fbl ~    %  :  H X  n            '  : J W b  r              ( 2 = H U c v          # 0 > L [ k  {            !  3 C O ^  w           ! 5 L a t     , > R_m}  *6 I [ jv  2P j    ) < Sbp        +; JZ hv$0@Q cu    % 5BQ`o{   ' 7F W ep~   '4D Se w    . CHSYakv  #2 CO b t|    3B Udo~     ) < P_n|     !-8EP^jw   +6A Uc w    . A R`jy  .> Q\i|     * D  U  p         !!-!2O2 a2m2}222 22222222 33!303=3J3U3_3s33 33 3 333334 4+4:4I4 \4g4t44 44 4 444455 "5,545A5K5[5 j5{555 5555 5 55 6 6(666G6 Z6 p6 6 66666667 7)797 J7 ^7 s7 77777 78 38J8 ]8 o888 888 8 88 9 9 /9 D9X9 m9 ~999 9 99999 : ': >: T:c:s: : :::::: ;; 1; K; e;}; ; ; ; ; ; <&<C< ^<r<< < < < <<< == '=5= G= W=g=v= ===== >+>:> H>Y> l> > >>>> > > >? ??$?.?:?C?N? a?t? ? ?? ??????@@ $@ 8@E@T@ f@ z@@@ @ @@ @@ @ A#A1A BA ZAzAAA AA AAA B B 0B DB WBhByBBB B B BBBCC"C/C=CMC cC xC CCC CC C C DD /D CDXD hD DD DD DDD DEEE,E8EDE XE nE E E EEEEE F #F =F RF iF F F F FFF FFGGG'G4G@GLG _GfG vG GGGGG GG G HH-HNPN hNN N NN N NO &OAO ROdO yO OOO O OO P P *P e Pe be ueee ee e e e f +fFf Yf of f f f f ff fgg )g:g Mg bg ugg ggg g gg g h!h 6hEh Shbh uhh hh h h h h i i -i Bi Wi si iiiiii iii j j-j =jHjUjbj vjjj j jjjjj k k&k 6kEkUk jk ykkkkkkkkkkk lll&l+l;l Jl\l nl ll l l ll l m m%m3mCm Xmfmsmm mm mmm m m n #n/n;nGnSnanon}n n n nnn nnoo"o,o7oCoMo]o qo~ooo oooo oo p p 0p Ip\p lpwpppppppppppqqq'qDqOqZqfqsqqq qqq q q r(rBr Rr gr |r r rrrr rr s s (s5sCsPs`s uss s s sss s tt#t 7t LtXtatktwtt tttttt tuu*u 9uFuUubuquuuu uuu u uvvv(v6vCvQv_vivyvvvvvvvvvvvvwww&w4w Dw Xwdwnwwwwwwwww wwxxx 0x>x Oxaxxxxxxxxxx xx y y 2y Ey Wy iy y y y y yyy zzz z.z=zKz\ziz zzzz zz z{ ${ ={ N{ c{ z{ {{ { { {| '| <| R| l|}|| || | |}} (}8} K}Z} m} } } } } }} } ~~ /~?~ T~ g~ z~ ~~ ~~ ~  ( ; M a q   7 N d }  Ā   ) C ] t   ҁ    2 Ke z    ΂    2 J\ s  Ã҃߃    * @Ofw   ׄ *L _ v  Ӆ    (AR d x   ˆ ܆   % 9 R^ s    ć ه    1?P b w   ҈    1 K e }  ˉ   #/ =L] p   Ҋ   ( ? S f x    ċ ڋ   # ;W o   Ԍ   3 I ] t   ō ؍  * = P a s   Ǝ َ    5 J[jz    ُ   4CTp    Đ ؐ    /K ]n~   Α   - B Y s    ֒    0@ T j     ѓ    *: L ] n    ʔ     2A X p  ו    7 N as    ̖   -? P e y   ɗٗ -9DM^is| ̘    # 7E\hv ř ՙ& 7 J^m|ɚך # 1;KTep țٛ%2BO`jt  Ȝ ٜ  0 DR blv˝֝&7BP bo} Ξݞ$4?GSan} ̟ٟ(7CP` w    ˠ ܠ   ' 8HW j| ǡҡݡ )3ALYcqȢԢ )5DRar  ͣף    -< J[l{ ˤ֤   *6@MXen} ƥ֥ "*4>HUdo |æϦڦ  5 N e }   Χ   , @L `oy  ʨը  (2<MXh   ĩѩ    -< R f x    ªЪ     . A T et ëΫث -9 I Wcr  ˬج # 1@O` pz  ѭ   '> R eoy̮ܮ   5U m  ůӯ  -5>M _ t   Ұ    !/AM[jvͱݱ  (8 I Wbmy ²Ͳٲ  $/<I^ n    г߳  $/<HVbpz ȴִ  %0? N\ nxĵҵ  '4 GT d xʶն  (3@M]k x ηܷ(2?FP^m}  ø˸׸'1<JVeq~ȹ ߹  "/;FR`q~ ȺѺ!-7CPYcp ̻    $2?L]hs˼ڼ)5?O\ i zͽڽ *9I Xalx ƾ־ & > Rcq   ɿտ  - > Wf v *4AM\l{      +:FYcp      #/=FQbmz    .8ER^it}    ( : U k{   %6HW m        . @ N ^r   "-:GU` o{   .F _ z   ' 7G Y q    (9 M a u      &4 J_ m ~   ' 4EM dp     *7 JV f y     +7 J Z j }      1 CMV`lz    #.8K \ht      8 N e y     # : R n    "2 DPZi{      "-; KV` s~     -8CQ_k{    )5 B R[dq{      $-:DU^jw    )4?HS_m|      ); R dt      ( 8 FWf |    " 3 D Y j y      &6D Z ju  ) : M ]gr} ,;HRap~     7 N ar        , AU dq     . @ Zw    ) ;L ` s     + ? Q ap      -; M c z      &5E Y p}        * @P dt        ) >L ` u     ( <[ r        ,; JXhp}      5L _m~        *< P^m      %4E Xh x      , >M `l{      # 5ERcm}   % 8E Sa t     * = M] kw     - C U i       )8J _ {     %7 P c u      0 I d       , ? T fw   "2 D V k y     +8 L [ k |     -> Se w      0 D X l |    -= Q c v     "0 > Qbq       + AIVbo}   *4@LWdt   $ 1?L _lx   )4@JTe x   ! 2@ P _p}     + =IXiz    ( < S n{    + @ Sb r  $1=LY kw      %4 AL]enw    (5F Z m     (4 AKYjw        2  F  [ j             * <  O  d  y             ) 5 G U j              - = G U  h x             ,  ? G S  b o |          / ?M[dlu~      . = R j     $ 9 Q i z      , ; J[ o       /C Vc v      - E Z u     - @ O]i w        5 I [l      % :GVf z        7H \ l |    .8EPYh {      $ 4DT ds       ' >O ar       - DRc x       -; N[jw         -<M_ w     # ; IU m |      $3C W k        $  5 F  Z  m        ! ! 0! C! T!f!w! ! ! !!! " )" @" W" g" |" " " " """# # /#;# P# i#y# # # ## # # $ %$A$ X$ q$ $$$ $ $ %%*% =% Q% d% z% % % %% % % %&&%&4&A&L&U&c& z&& &&&& &&&'' "' 4' A' T'c't'' ''''''''' ( !( 8( M([(m(z((( ((((( (()) .) F) ]) o)|) )) ) )) ))* * ** =* R* f*t* *** ******* ++ +-+ =+G+Q+_+j+ y+++++++ +++ , , 5,B,R, g,u,,,,,, ,,, , - - 2-?-H-S-^-i-z---- -----..!.-.7. J.Z.k.}. . . ... ..././ F/ ^/x/ / /// //000'070 L0Z0j0x000 0 000000111*161E1T1e1 w1 1 1 1 1 1 1122 202 @2L2X2f2o2|2 2222222 2 333 1393C3R3a3o3 3333333 334 4 14 H4V4 g4u4 4 4 44 4 4 45 5+5<5 O5\5r5 5555 555 56 66)676E6Z6l6 6 66 6 666 6677 $717?7P7\7h7t77 77 7777777 88"808 @8P8 c8 s88 88 8 8 8889 999*949=9G9Q9Y9_9g9u99 99 99 999:: &:;:H:]:s: : :: :::::: ; ; 6; J; ^;n; ; ;;;;;;;;; <<"<1<><N<^<g<p<<<<< <<<< < = #=5=B=P=]=i=r=~==== == == => >>*>9> M>^> q>> > >>>> >>>>??%?/?:?D? R?`? v?? ???? ???? @&@ 6@C@T@a@o@|@@@ @@ @ @ @ A %A ;A OA dA wAAAAAAAA AA BB +B ;B NB[BdBpB~BBBBB B BBBC CC+C8CBCNC]C mCuC~CCCC CCCCCCCDD )D8DDD ZD nD DDDDDDDDD E*E CE ^E wE E EEEEEEEFF#F0F7FFFPF^FnF}FF FF FFFFFFF GG$G1G FG ZG nG G GGGGGGGG HH&H 8HIHUHbHmH }HHH HHHH H H I I%I3I @INIZIgIxIIIIIII I III JJ(J9J IJ[JfJwJJJJ JJ JJJK "K/K>KOK cK vKKKKKK K KKKLL L-LGLXL lL L L L L LLLL MM /M >MJMVMfMtM~MMMMMMMMMN N ,N  Vfu ˀ؀   3 G Ym}  Á ց  ' 9 M\l{  ĂԂ ) : M[hs   ȃ ܃   )7FT i    Ą΄ۄ ".?MYg z  Džօ $ 3 FW`ku    Æ ӆ     .8 K ]kvŇӇ   &8H \hs    ˆˈֈ#/:N\is~̉ ۉ   0 CS g y   ͊    !2>N\i|  ʋ֋ / I b z   Ҍ   !+:JYdu  Ǎ؍ %2;KUcs   ǎ Վ%7 J ]l y ďяۏ )6BP_q  Đ̐Րސ#,7BQa s ‘ʑՑޑ "-7BPZgxŒ͒ܒ  &.9F Vcp  ēՓ -:KZf yΔ    %2AN[jy ŕӕޕ )3>KYhr ÖՖ  (4;EO\g y Ɨܗ   0? N[m   ۘ͘  &3@N ` u   Й $/5 J [ir~њ ޚ' ?Z v   ě ۛ   +9J ]jvĜ Ҝݜ +7@JVdnxНڝ ' 9 IS\bm | Ğ֞͞#-<HS\ku  ͟ ܟ  0=Mj   ʠ   ) : M _ s   šס (6 FQ bmy ˢܢ'8E Y m ~  ģ գ    1<KWd y   ͤ    -@ V my    ͥߥ %4 CR`mv Ҧ   * :H Zep §ѧܧ + B ]l|  ɨب #,5DS g y  ̩ ݩ &2@J \hv  ªͪت  ".> Pd sīԫ) :FVbpʬڬ #1DTe wʭխ &6 EUdq{Ȯ ߮ &2?OW^gs  ůүۯ &2= NZi  ɰڰ   / CSao| ϱ߱  % 4 I \frŲ Բ߲ ,8EQ[ht  ijճ   0 @ S er  Ӵ    $ 7B [ m| ʵյ   ) 8ETcrɶӶ #.8E V ht  ͷ׷  %4=GS`kx  ø͸ٸ   0 > S hrԹ  ( 6FTg y   źӺ  2=JXhs|»ͻ ܻ *7 GU j }  ϼܼ   $0=ISbn{  ʽ  " 8F W hv ;־'6DMV` v ÿѿۿ +8 HVds    1 AKXdpz   ! 7Xx    . D V gu    ( ;L _ t #/ DW ky      :GVf ~      ) <L d x    !0?M` u     & 3AP[ k}     * @M[ i }    $ 4BS g }  , >M^ p|   )8HS` q~  '9 P c x      $2B Q[ jw   $/;FNZfv    &4CS bp    %4AKWgw*; MZj |   '7F Uct  ) :HTf x      - B Wcq    #1;IUdr~  $ 6 LX hx     !( < P ^ n}      ' : I [ n ~     - E [gx      # 6BNZi x      "1 BMY lz  -9GVclx   $0A N]l -:FOZ iw,2=JT`n}   ) ;Kf   ! .< GQ^ u     '5ER\hs    3 M e ~    %.8AKWft       0 E Ud u      %.9DP_jw      1 D X n        ,8DQ ^hw     3 N g   &,6D Wal~     & 4B R fq     $ 6 IY j {     *: K a y      %7 KZk ~         5 HY o/:GS]k z  4DP^ q  / BN_m}       % < Par      0 CQ e v  )6 H Xeq    5 Q d z       %3AO^ q~  '5 EWap|    *8BPZgt ".9 L]l{    /:IT hs %/;JU`p ~  -:FU es  1BS h |        2ARct        + C W hu      $0>Ia u    &1= X k ~     ! 4 H ap   %3 DQ`o  , <IVdn{   &7DPb qy    # 0 > L  a  q ~            $ . < M  d  z            % 5 A L W c r             4  B  V  k  }           /  ; E  T a r          , < Oagq    + ;K[gs "0 BS d s    ,= KTdp    "/;K]hr     %1@ W k     &/?OY^fs      "/ ?IR ` u    ! 6AQ c~       - E ^u       $ ;Ie x       + :L ^ r  #/> MYdv  &4B R_ t     +8ER^ t   !2 @LW j }       (4 DR e z .?N\ ku     ) 5 = I X d  r            !! +!8!D!R!Z!g!s!!!!!!!!!!!""$"4" G" \"r""""" """""##'# 8#B#P# c# w## ## # ## # ##$$$($3$=$ Q$ c$r$ $$$ $ $ $$ $ % '% =% Q% c% q%}%%% %% % % % & #& 6& G& X& m&x& & &&&&&& '' 3' J'b' y' '' ' ' '''(((&(5(A(R( f( x(( ( (( ( (() ))&)5)B) T) f)t)) ))) )) )* * ,* <*F*O*Y*f*t************ ++)+ =+G+U+b+m+|+++++++ ++++ , ,*, @,M,W,d,q,|, ,,,,,, ,, ---'- 6-B-Q-`-m-z- -- - --- - . .+.7. K.Y. m.~. . . . . . ../ /9/V/d/p//////// / /0-0 E0 ]0|0 0 000000 01 1*101?1L1Y1g1s1111111111222+282E2T2`2n2x2 2 222 2 2 2 3 3(383 L3 b3 y3 3 33 33 33 4 '4 :4I4W4 d4o4~4 44 44444444 55$5 2585B5I5P5W5d5 s5{555555555 5 66%626=6G6O6Y6f6w66666666666 66 77 "7+757I7U7c7 y77 7 7 77 7 8 808 D8 V8 i8 {8 8 88888889 99+9 ?9 R9b9 v9 9 9999 99:: #:5:A:Q: d:::: ::::: : ;;!;2; @; S;c;o;;;;;;; ;;;;<< &<5<B<T<a<p<<<<<<<< < < <=== .=;=J=U=e= y= == ========>>">0>?>M>U> f> t>~>>>> >>> > ? !? 3?@?J? ]?l?y?? ? ? ? ? ? @@ 0@ C@ X@ l@ @ @ @ @ @ @@A A%A/AJHJNJWJdJpJJJJJJJ J J K K K,K9K?KFKPKVKhKsK|KKK K K K K K L L3L FLWL lL L L LL L L L M M +M CM XM jMwM M MM M M M N N'N.N:NDN UNbNrN N N NNN NNN OO .O^ N^\^ l^{^ ^^^ ^^ ^ __ -_ C_ W_ o_ _ __ __ _` `)` C` U` h` ~` ` ` ```` `aa .a Ha _a ta a a a a a b b 'b ;bJb[b pb b b bbbb b bb c 'c >c Uc jcwcc ccc cc c cd d.d @d Sd kd d dddd d ee 3e Ke ae {eee e e f !f>f Zfxf ff ff f g,g Ggdg ~g g g g g gh!h 4h Mh ah wh h h h h hh i i 0i@i Ui ji }ii iii i iij &j9j Pj fj xj j jj j jj k k6k Ok jkk k kkkkk kl l ,l ?l Pl`lql llll l l l m m )m7m Lm em {m mm m m mnn ;n[nwnn nnno o 1oBo Wo rooo o ooo op p$p3pCpSp ep xp pp p pppq #q@q Zqyq qq q qq rr*r4r IrZr nr r rr r r r s"s2s Hs ]sqs sss ss s ss t +t Ct \tnt t t t tt t u u!u4u Eu [uiu }u uu u u uu uv "v1vBvQv bv yvvv vv v vvw w 0w GwYw uww w ww www x x 0x BxRx dx wx x x x xx xyy #y 8y LyZyiy {yy y y y yy z z/z Bz_zyz zz z z z z {{${5{={N{ `{ r{}{{ { { {{{{{ | &| 7|D|U|d|v| | || ||||| }} 4} G} Y}i} }} } }}} } }} ~~ 6~ K~ b~z~ ~ ~ ~~ ~ ~   (9 L]n   (3@FQ_n }    Ԁ    . ? S f {    Ӂ   !1 B Tf }   ̂ڂ   % <I[ r   ƒ ؃    -> Q]jz ΄  * ? Vcu   Dž څ  " 6 J `s Ά     1 HZ q    Ƈ ׇ   0 AT gv   ƈ ۈ  :\ĉ Չ   + B U pŊ ݊  *? Q c w   ҋ   ' : Lf y  ͌    * = Xx֍   "= Tb r  ǎ ێ    + =I[ q    ˏ ޏ    7 M f } А   ,Ml  Ñڑ   ! 3 G \ o   ǒ ْ    1 E Z n    Ǔ ݓ   ! 9 O e |   Ɣܔ  6 Oi   Е4Yv  – Ֆ    1 B Y o   З    ' @_|  ɘ    & 6 J b y    ֙    -> Q f   ̚    " 8 K ^p    Л  & : KYk    ՜    . FY m    ̝ ߝ   0 J f {  Ԟ    1@Q ep} Ÿ ڟ   $ 5 DU h |    ̠ ܠ   '8EX p   ԡ     0 H _ t    ΢   )6ET h z  ѣ #1=IVery Ǥդ#/>NYfo{ ƥѥ '2=GQYi x ǦԦ    )D \ r   ̧    & @ [ s   ب   - A V g x    éϩ۩ *6FS_m|Ѫߪ/ A Yeu  ǫӫ+8?HS ex   ɬլ߬ $ 8H Xiu    ˭ԭ  ".6>GQ_hpw{ ˮٮ & 9HTc x ¯ ׯ  "/<JZ m   °аܰ  * :G Wanw ϱ߱  $.8F T^jyDzҲܲ*8 FSbmz  ͳ۳   (1<HWd t  ʴִ  &4>L[jx Ƶε׵ !0 C T^jw  ƶӶ  /9AMWblx ķѷ  .9CQ d x Ÿи۸ 0=ITb w   ʹֹ   ,9 FSbpz˺׺ '8ER]m{ ̻ڻ  '/9G Xfx   ʼּ $1?MWclwʽս !*6CR` mwþϾھ   &3 AO^ ow   Ŀѿۿ%/7CQ _jz   + :CO]iu *5?KT]gt   '2<GQYdo~   %/9FU`n     -7AGPYg w   ,:GT]i v      )7AKX mz !,5BQ_o ~ -9GT bk|!->HSct  . > N]m |    %0:EO`n{  0 J\fp|  +6@MYco} !/9CMZhu$-7CO\j w    .@Q` q}  "-7FR\hs !/:HV_m{  '6@MXeq}    '3;ERd w  ,6DR\kv + A O^j z +8BQ `lv  %/;HVboz   #/ >JVet     #8 GS_gs  &B ]o{  ' 8 M\ku  *:DQ]ep &3?OUe y    -:FP]h v    '6DN ` t   -;M ap|  ):EP[hw     2 BNYblz  ".7CMYfoy  !-9DO\ q~  '6@MXgt .;ER_n{  )3 IWg {     & 9 N[g v     ".?LZcmy   ,;H Wcu !.9BNXev    " 2=HUf y      . >JWer    ( =N`q      $09HWg    />IR^lx "1 C R_nz *; U^is  .< O _lz "/>IUc u    .<J[l |     -:GVer  ' 7>F X m     %3B P]cp    +7BLXes|     09FU gq}!1;ES jv  2L\gu   ' 8 LR_jw  /=L\ j{   " 5BP\m }    ' ? T kz     ' < S^ku& 3?LYcp}   / @ Q` n~+=HVcp   0=KVcpz  )6DM[ o     $ / : H [ k }             1  E  T _ g t ~               . = G P [ e o           )  >  U  i            +  < L  _ l x          (9J ^q~   '6 EY p    ,; O` s    % =Y k{     ( ; R boz     "08BMWbp|    '3 CTcm z    +7BO blx (6BP _ p " : N\gt #,6DT j ~   %. CTcr       !)1?NXdmz  % 7AHV`ix       .?P d w    ' 9 J [j{    ,; OZis    "-6=KXdnz  '  4 >  R  h           ! ! *!>!J!X!h!!!!!!!!!!!"" " 2"@"N" c"m"x"""" """""""###$#0# C# X#g#p#|# ####### #$$#$+$9$F$ U$^$i$w$ $$$$$$$ $$$ % %$%2%C%K%\% l%w%%%% %% % & & '& ?&V& j& }& &&&& && & ' '"' 8'M'^' v' ' ''''''' '(((%(1(<(F(P(a(m(v(( ((( ((((() ))!)-)8)J)T)a)o)w)))))))))) ) ***+*9*D*N*Z*g* v*************+ ++$+0+ ?+I+V+ j+ |+ ++++++ ++,, ,,,9,D,O,^,j,y,,,,,, , ,,, - -.- =-J-W-g-s------ - - - . !. 7.G. Z.t..... .....//#///8/I/Y/f/p//////////// / 0 !0 60?0I0U0a0n0z0000 0000001 11)151 C1T1^1m1~1 111111 111222)232<2J2R2 b2o2y22222 2 2 223 3#313=3M3Y3d3n3y333 33 33 33444(4 74D4Q4Z4f4u4~444444444 44 55#5/5?5M5[5 m5w5555 5 5 5 55 66"6*646A6J6U6_6i6r6|66 66 66666677"707 =7H7T7b7l7v7~777 77777777788 ,8 B8 S8b8s88 8888 888 8 9 9 )949G9 _9 r9 9 9 9 9 9999 ::):::D:P: d: :::::: :::: : ; ;-;9;G;T;a;l;;; ; ;; ; ;; <<"<0<=<K<W<g< t<<< <<<<<< <= = =-=8=F=T=`=i=u= = === === >>!>/> G> c> v> > > > > > > ? "? 5? E? X? j? y??????? ?? ? @@!@.@;@H@V@c@k@s@}@@ @@ @@ @@@AA#A,A9A HAPA\AiA |AA AAA A A A B B 6B JBSB`BnB~BBB BBB BB C C C.C8C QCbCnCyC CCCCCC C CCDD /D>DLD]DhD xDD DD DD DD D EE .E EE ^E rE E EEEE E E F F F,F AFMFUFbFvF FFFFF FFF G GG ,G=G NGXGcGoGzGGGGGGGG GGH HH H .H>HQH bH xH H HHHHHH H I I,I8IGIWIhIwII I II II I I JJ!J*J5JBJ]J rJ JJJJJ JJJJK K $K 8K MK\KjKwKKKKK KK K K L *L ?L RL eLvLLLLL L L L M M -M?MOM[MhMwM MMM MM MMMMN,N @N TN kNuNNNNN NNNNN OO$O2O?OLO[OiO{O OO O OOO PPP)P4P:PEPSP`PtP|PPPP PPPPP P Q Q,Q @Q UQcQoQ|QQQQQQQQQR RR.RTMT \TjTwTTTTTTTTTU U U+U;UJUUUcUtU UUU U UUUUUV V.V^N^ d^ w^^ ^ ^ ^^ ^^^__(_8_ G_ ]_i_w_ _ _ _ _ _ _ `` 3`B`Q` f` x```` ````` a a"a 5a Ka `aiasaaa a a a b %b eIeSe`ele {ee eee e eee ff f .f8f?fGfQf]fffvfff f ff f f g g#g1goQo_o uoo o o o o o o pp$p,p6pCpRp]ppp pppp p p p p q q$q 7q JqYqiq wqqqqqqqqqq q rr!r0r ?r Mr artr~rrrrr rr rrr ss$s4s GsSsas sss s sssssst t!t+t=tKtWtft |t t ttttt t t u "u :u Ru hu|uu u uu uuuv vv%v 5v FvTvbvpv vvvvvvvvv ww %w 8w HwWwbwqw w ww w ww wx x(x 8xBxNxYxfxyxx xx x xx x y #y  M\i z   ԋ    , >O ajv  Ҍی  )5DO ao    Ս    6 J[ n   ̎ ێ   #/9F Vbov ɏ ߏ #3 EW jt  Ɛא -8@ T f y  ɑ   $5 J _p    ȒՒ   / C \ n  ʓ ړ -?U`m zȔԔߔ$ 6DS_lw  Ǖԕ'8DUe |   Ė ݖ * ? Vh  Ɨ ؗ   ' ?^ w   Θ ޘ 2 J ^ o  řՙ   / DR gt  Ě ܚ 1 Fa v  ›Л    "2 H [l     Ϝ   /@S k ǝӝ   0 F X n   Ԟ   4 HVbm ǟ۟   '9 O ]gu ǠԠ)6 I [ o  Сء+6CPY_p {ǢҢߢ    5 H\ q   ǣ֣   % 4< NZeq  Ƥ ۤ   - =Ph |    ϥ   $3AR k{  Ǧ ڦ    %/;IY nyʧڧ   ! 9 P f |  ȨԨ ,=J[k }ʩک'3?MS_m ʪԪ   /B R`r   ˫ ޫ  # 9 O[ kw   ͬ۬ $ 6@N_my   ӭ   3E W j }  ٮ    5 N c z   ̯ ߯  ,<HYix  ưѰ  ! 3 G [ n    ̱ܱ   / E QZhwͲ ܲ  #2@ S f y  ϳ '3@KVcp   ´ Դ   $4CN _n}ʵص  %1 BK\lwԶ  %0< MZ mz   ʷ )6BPZir~ Ÿϸڸ  -;Pj ~  ʹع   4 K ^ku     ͺ    &7 J[ n| ȻԻ  ) 8CQ_ky   ּ    *9JUcs  ɽ׽  (: K _ r~ þ;   +: O]nsx  ҿܿ ) 8FSbr %.:JYep} +:L ao~     *G ^ t    !>X l       +9H Zh ~   $ 9JTao|     .<M ^lz   ( 7DQ as     " 9EP\ o~   $ 6DSa q   ( = L\jt  ".7AIUa q 1? Rf x       +6DO^jx+8DO\jv   $2=ITbo| "/>P _lz     ) = MUas      "19D ^o    "2BP ^iw    + D Z s     %-9JXbu      )5DSd s     &4=HWh {     &0; Q i w   % =J] q       $ ; P i {    ,8AL ^kz       1 D Y p    ! 7 Sm ,; KVf   #2@O \ku  !/@KUc r    '4 N e t      *?Y o       #1? O[fqy     $1 @N [h y        5FW j|   '3AP\k   3 ES cn{   %4=IVb qz   3 GW j }        ( = S dv ' <H Zg y     &2@MXclv $/ AMU_jv     (5 DR^ o { ! 5 JWf v    0?N f     / F ^ z      : T m   " 0B Y o       . LY m       ' = P e }     + ? U gy   ,6@K[fpw ! 5 I _ s     1 BT k}     %3@ O`lz  "1EV i }     ' 8 LZ n      'ER`mv   ! 4E Xf v   (5BNYcy    # 3 DMYj {     (5AKZ jv     /<J \ p     %-9DO hu )5=LV_jw      -7@ R[r      $4 F Z o|        ( 9DT h          2 B  S  b r           (  :  Q c  y         #  3  G V  l              1 @ M  b  q {            # 0 ? N Y l           '2<FPYe x  "/7EY m    )9 KYj        *= P b v    )5 GR[jt{  %/6AM ao{    %2>KYhw     '5>IUamy "2CL[f z       ,7R gw}    "3 ET f y  !/ AQ et  "+6AI Xhs{   -:GTdu     %1=I[iu     ( ; Q hx       * ?U g z     * ?K[afq~     + 7 F U _ n        !!"! 4! F!S! f! z! !! ! !!! !!" ""," =" P" j"" " " " """ #1# F# X# k# {### #### # # $ $ 2$@$O$]$ r$ $ $ $ $$$$$% % %'%3%E% \% k%}%% % % %%%%&& (& A&T& g& ~& &&& & &&' ''('5'B'R' f' |' ' ''''''''( ( -( D(`( t( ( (( ( ( ( ( )))&) 5) J)R)`)j)t)) ))))))))) ) * /* G* `* z* *** *** * * ++ 2+ D+T+f+ z++++++ ++ ++ , ,., A, U,g, y,,, ,,, , , , - - 1-?-P-]-j-x-- -- --- - .#. 5. I. _.n.. . . . . ../ /*/9/ O/`/m/ ~// / / / ///0 0 %030 F0U0g0 x00 0 0 0 0 00 1 1 61 H1 ]1p1 111111 112 2 '222A2M2Y2e2q22 22 2 2 2 3 3 )3 ;3J3Y3 q33 33 3 3 3 34 !4?4W4 l4 4 4 4 4 44 5'595 M5 d5 x55 55 5 55 5 6 6 ,6;6 K6 ^6 w6 66 66 77 07 F7 ]7 s7 77 7 77 7 7 8)8H8 ]8n8 88 8 8 8 8 8 9 9 &9 =9X9 n9999 9 9 99 9 : : 1: @: Q: d:t: : : : :: :; ; /; F;_; z; ;; ; ; ; ; < < 1<A<R< e<w<<<< <<< < < = ,= A= S= f==== = ==>8>Q> f> z> > >> >> >? %? =? V? e?v? ?? ? ? ? ?? @@(@ <@K@\@ o@@ @ @ @ @ @A A +A ?A UAbAnAA AAAAAAAAAAAAA BB %B6BAB YBhBzB B BBB BBBB C C+C7CBC QC\C_ChCuCCC CCC CC CC DD /D?D RDaDmDuDDDDDDDDDDDEEE+E:EIESEdErE EEEEE EE E FF)F3FCFRF\FgF wFFFFFFFFFF F GG(G :G KG aGoG GG GGGGGGGHH &H.H8HEHTH lHHHH HH I I(I8IDIMI ^I wII III I IIJJ &J3JDJ QJbJ wJJJJJJJJJJK KK'K6K GKVKgK yK K KKKKKKKK LLL 5L ELRLbL vLLL LLL LL LMMM,M =M QM dM yMMMM M MMM MM NN .N9NCNMN ]N oN N NNNN N NNN O O(O2O:OFOTO bOoO{O O O O OO O O PP *P6PDPMPZPePuP P P P P PPPQ Q)Q:QJQ bQuQQ Q Q Q Q QQ R $R 5R GR ]R oRR R R R R R R SS +S >S OSdS yS S S SSS S T!T;T RTbTlT}T TTTT TTTTUU +U>U UU oUUU UUUUUU VV$V4V KV\VfVoVzVVV VVVVVVV W3W DWRW cWoWW W WWWWWW XXX+X9XGX WXaXmXyXXXX XXX XXX YY+Y9YHYYY jY Y Y Y Y Y Y Z(Z ;Z_Z zZZZZ Z Z[[ )[ =[ S[`[ r[ [ [[ [[[[[\\\%\1\ E\T\f\ y\\\ \\\\\ \ ])] =] S]c]t]] ]]] ]]]]^^ 3^ L^ c^{^ ^ ^^ ^^^^^__&_7_?_M_ \_j_{_ _____ ___ ` `'`;` P``` s` ` ` ```` ` aa$a4a DaOa ca waaa a aa aaa bb+b >b Pb]b ob b b b b b bb cc!c/c ?c Qc ccsc ccccccccccddd'd4dCd Wd kdwddddd dd ddddeee /e@eMeTe\e ueeeeeeeee ef ff'f5f EfQf`fhfnfvfff ff f f f g g'g6gCgNg[gegng{ggggggggggh hh%h0h=hLhWhihthhhhhh h h hh i %i1iAi Pi\iliyiiii i iijj 3jNj _joj j j jjjj j jkkk(k5k>kJkXkeknkxkkk kkk kkkklll&l5l@lMlYlcl ylllllllllllmm!m(m9mOm am sm m mmmmm m mnnn 0n>nOnan tn n n n nn n n oo /o?oOoXogosooo o oooop p p 1p DpSp `pop pp p p p p p q q/q=qHqTq_qoqqqqqqqqq qq r %r3rArMrVrcrpr}rr rrr rr r s "s 7s Msesrs s ss s s s stt .t @t St htxttt t t t tt u%u5u Ju aupu uu u uuu vv ,v;vFv Yvjvwv v v v vv v v ww 5w Kw ]wmw ww w w w w ww xx+x5x>xHxVx jx ~x x x x xx xy y*y =yMy ay qy{yyy y y y z z .z DzTz gz }z zzzz z z z { {/{ B{ W{e{t{{ {{ { {{{| | +|>| V| p| | | | | || } )} 9} P}d} {} } }} } } } ~~ &~3~D~ X~k~ ~ ~~~~~ ~~ ~ % ; P` r}    3>FOZiw  ̀ ۀ   2;IY i z   Ёځ  '9GV bkw Ђނ+ ?Pm  ƃ ؃ 1@ Vs   „Ԅ  8 M ^l ~   Ʌ ۅ 2 D \ s   ކ   $ 5BKZ i yȇ ݇  &4H Wfs   ň ׈  * @ W l  lj   ,BOg y֊  1 BO`m |   Ƌ ً 1 H^{  ŌҌ * ;G Wes  ύݍ '6 JU`n  Ў ".=LWemy ̏֏ /<JXdp    ̐ڐ  -< IS_p~ Αܑ  &6 IU cq ƒӒے#1@P ak ~ ˓ړ $2AKX hu  Ŕ֔ )7 FRb t~ ʕؕ"-:G Xft  ȖҖޖ  #-6C Uet ͗ڗ  %3 I Vclz͘ޘ "1B W i {ę ڙ    3 JWfq|    К   #0=I\ l{› Лڛ   $2B Q^iw   œ ؜    ,: K Zh }  ʝ ڝ .B T_i zΞڞ  ! 4 GV g w  ɟ ۟  2=O d |  Ӡ  *7 DQ`s    ǡԡ (5BM\ftТޢ   + =HUa oyţѣߣ  $ 7EQ` o{  ˤפ   $ 9 K _ r} ե  ,;MWh ~   Ʀ Ԧ  ,:ENXblyѧ  .=P c w ͨ $2DNaw  © թ  (6F Zl   ªЪ #2 F \ u   ԫ  $.9GUd y   ͬ  , 9CR^p     ѭ   $B W n    ͮ    0 G _ t  ˯ گ   2;FS_iz ̰ܰ  ,4ARZhu~ͱڱ !)7?JXerŲӲ߲ + A Wo    س  ( 6@MXbp|  ôӴ   )9 HYf y ɵ ۵  *<I Yh |    Ӷ ,7FX m ~   ɷԷ   "; N fwݸ!4@ S gz  ¹ѹ   ! ;S i{   ɺ ݺ   '8 I V`o}  ûһ  #4 EUbq~ üӼ  #-6GTbo~Žܽ 4 GV j }  Ǿվ    ' : L ^ t   ʿ ޿  -<HSap}   *6@N bp|      $B Z p     * A T h     #6F Z p~       1@ S e u      1> R c u       %5 GX h ~     4 J ] r       ' > W k~     0 BQ fv     ! 3B Ve x     + =LZ n     #3 G [ k{       #2 FWg     6 N ^iy        1 H a r        6 K ] p     #1@O`p       $ 5F Wg {     '7 J \m    1 C V f v      %5 GYcp|   *5C S_iw     %4 H X o{    .? Sao     # 8 O]gv    0 C _v      !2 JT]n }     3 Kb u      " 7 L e x    1CR e r     3MY k~    5P d {       0 DU k        ' 9 Rp       ) @ \ p        + > P a o      %1 D Y m        - BPa s      + >Qd{      # 8 M _o       *8 K cw       5 H Xh y    ' 5 IX kv        - D ^ w       $4 H Zk         )9 M g |      . A Udq        0 BQ`n~     , ?Pb u       / CS ep|   )4BO^m z    ,> W h |  *E [ u      ,K a x      " 6 J ] p     (6CMYg v   ) CLZgu    %2AR ep}       .: M[ ly     2C Vds   #/6?IT` s     "0; O ]i|    *7F Z l     %2AP_m ~   #2DN^ p   %1;LZkw    ! 6 M^ ow    0 F ] r      ,9Ne x      + BZi ~    ". C Zt       +  =  L ] h s            ' 5 E  S c q            /  @ N [ h y            "  / >  L Z  m |             + 8 E Q [ i            *5AKWft  $ 7BM ^jtz   -9D We t    ,8 K]fu  + AY m~    0BP\emt ,:GU_my  /;K \ jv     *5>HTc p~!8EP iv+;JVeu}    & 8 IS_hs   +<GSanv  &3BP gv  (2?K\k z   "2ANYj      8 P gx  # 5BP\fu    !  / < G T ^ e r }           !!"! 0!>! S! g! z! ! !! ! ! ! "!"/"="O" h" {"" "" " " " ##"#,# @#Q#]#n# ##### # # $$$ 1$A$ X$ l$z$ $$$ $$ $ $ % %(% 8%H% ]% m% % % %% % %%% &&'&3&?& R& f& z& &&&& & & &' ' 3'<'N']'i'x' ' ' ' ''' ( (+( ;( P( f(x( ( ( ( (( ( )) 1) E) Z) q) )) )))))))** %* 9* S*^*k*y**** * ** *+++,+9+D+U+f+ + + ++ ++ +, ,>, W,m, |, , ,,,,,,, -- /-@-N-`- t- - - ---- - .&. 8. I. \. q. ... . . . . / '/ @/O/ d/ t//// /// //0 '070 H0 X0i0 0 0 0 0 0 0 1 1 01>1 N1 b1 z1 11 1 11 1 2 &2 <2 P2 d2 22 22 2 2 3 3 3 43Q3 e3 }33 3 3 33 4 4 54 M4 d4t44 4 44 45-5 B5 V5 g5~555 5 55 55 66 ,6 @6P6a6 t6 6 666 6 67 757F7 [7 q7 77 7777 7 7 8 828 F8 U8 g8 |8 88 88 88 8 8 9 !929A9R9a9s9 9999 9 9 9 : : ):::I: [: q: : :: :: : : ;$;4;B; U;b; w; ; ; ; ; ;<!< 1<@<K<X<f<w< < << < << <<==!= 2= G= Z= p= ==========> >>> 2> E>R>_> s> > > >> > >>? !? 4?C? Q?]? u??? ? ??? ? @@ .@ D@ V@b@t@@ @ @ @@ @ @AA!A.A @A PA cA tAA A AAA AAA B B 2B GB YBgB yB BB B BB BB C C.C @C SCeC ~C C C C CC CCD "D 5D LD cD zD D DDD D DDEE %E 5E IE bE{EEEE EEEE EFFF)F7F JFYFhFvFF F F FFFFF GG 5G EGSGbGnG~G GGG G G G H H'H 7H IH ]H rHH H H HH HHH I(I =I TI jII II I I I I J J 5J GJXJ qJ JJJ JJ J J K K ,K=KHKUKfKuKKK KKK K KKK L *L ?LHL[L tLL LL LL L LM M2M FM YM pM M M M MM N !N :NPN eN |N N N N NNNO O ,O:O LO ]OjOyOOO O O O O O P P 5PBPRP aPsPPP P P P P P Q"Q 7QDQ WQ iQxQQQQQ QQQQ R R*R @RUR gRyR RRRRRRRRRS!S 5S IS \S rS SS SS SSSS TT 2T FT ZTeTqT T T TTTTTT U U %U 5U GU \U lU ~U U U UU UU U VV0V @V RV hV V VV VV V VVWW #W 8WFWWW oWW W WWWWW XX +XZLZ ^Z pZ Z Z Z ZZZZZZ[ [ 0[ C[Q[ a[q[ [[[ [ [ [ \ *\ ;\ N\ a\ p\\ \\\ \ \\ \ ] ] 6]C]P]a] q]] ]]]] ]] ] ^^ "^ 2^ K^ `^ s^ ^ ^^ ^^^^ _ _ 2_@_ P_ d_ {_ ___ _ _ _ ``` 3` E`V`h`z` ` ``` ` ` ` a$a ;aZawa a a a a aa a b %b 8bHb Xbhb yb b b b b b b c #c l Tlblull l ll ll m m.m9m Lm[mnmm m m mm mm n n-n @n Snfn }nnnnn n nn o &o 7o Jo ^o vo oooo oo o pp,p>p Pp cp xp p p p p p p qq.q >qLq]q mqzqq q q q q q qrr+r:r Jr Zr lr rrr r rr rrr ss's9s KsYsesvss ss ssss s t t 3tDtSt ftvt tt tt tt t uu 1u Hu ]u wuu uu uuuv v $v2vAvNv\v rvvvvv vvvvw w w-w>wKw\wkwzw www w w wwxx!x 8x Qx lxyx xxx xxxxxy &y 5yFySyaysy yyyyyy y yz z7z Lz cz{z z z z zzzz {{${2{ F{W{s{ {{ { {{ | | 1| >|I| X|e|v||| | |||| || }}*} :}D}L} Z}i}w}}}}} } } } }~~ ~/~=~ S~ c~q~ ~~~~ ~ ~~ ~'8E ^kw  ' 5>KX`kv Ȁր  *7BR_ mx  ́ہ  &7 J `t~  ΂ނ'2?KUg    ǃ ݃   ( :K[ jv   Ą Ԅ '1:GOZgq~  υۅ !.< JXgp̆ن )6A Tar~Ƈч &/>O _js}   ĈЈ ވ +6?IWaq  ‰ Ӊ   #/;ER\isɊՊ  0 @ T` p|‹ҋ    &2;GY jr  Όی  $2AL\fsy̍׍  +7BL[gq}Ŏ ֎ߎ # =Q ao~ ˏ׏ (5I ` y    ΐؐ*8DKTbnzǑԑ #-9GT dv  Βؒ  #08FPZiw  ēӓߓ &6 IXf w   ŔӔ )4>KYfs~ʕ ڕ %1 A Qb sȖז  . = N`p ˗ ݗ   (4CR]hu   ˘Ԙݘ. <EO`kwǙҙۙ +6<DKR]ix    ̚ښ   *3?JVc r~Û қޛ, ;KU`nvĜ̜ל &/;IS^ks ӝ    #/? TozŞڞ *3<HV f wʟ֟ !0=JWdnwˠՠ , :DS anx ġ ա %,/5AL[ p{  Т ޢ " 1 @LYb q  ͣ     5G W^gu  Ϥޤ ,8L hr   ˥٥%2?KU dn{ǦѦݦ  &0> R_js} Ƨ֧ )5A T g{  ȨӨ   1 ?JWdp| ĩѩݩ ( 8G [ix Ϫ    - ;FT\ny ˫٫ %3BQ`p} լ  % 9L \fw  ϭ   - ;HYgu  ŮӮ   )4?LVb t     ̯ ޯ  #0<L ]o|İ԰   %4 BQ^m{  ıԱ !,7ER] n  ʲ ߲   '/7CRbs  ̳ݳ  &7 J[l   Ĵմ  ( : J\ mx ȵص  />KZ iv ö̶׶ '6DP` r   ŷҷܷ*9BM\ q ¸Ѹ޸ "3?MZkx  ŹԹ )5>O e {   Ժ  * @O \i z ˻ػ )8D Sbnw  ¼ ռ   , :HT`q~  ǽ ؽ    ( 7H \ r  ƾ ؾ   +@ [j  ˿ ܿ  #1 BRe {       4 K ^ t     &6HSe~     " 4@P fw (8CO\l }      ->N`jz   ,6DT en}     .= N _p     ( : LX j |    ! 6 IWdu     "3D W p ~     ( ; M[f ~      & =IRakz   ) 8G Vb s   #3CS et , BMWbq    (7 IY k    $ 8 K \e t      ' > T hz       1 IZer      5N[jy   *;FTct      !,7DPZju}    ' < Uiw   %2> P b u   7 Rt    + C`   &D a  % ? [z    %B^{     *Ge |     = Xx  # 7Ut       7 GU i{  ,@ Rcp        2 IW l ~     )3?MYf z    "@^z     6 J ^ v       - @Q n (7H ^ q      3B U j       $3>L[et}   &2@ \s       5 GXe w  0N a u     $3=FP]k }    -< N au     +9BNXfpw !/9DT dp   $0:FU_ny   !+:J ] p{     %2B Ue s $ 3@P^ s  *9DQ]ix  -< K dr #/=HR_nz&3>LXi ~   #0>LVamy   , ?N ]kw     (5DQ bo  *5FR]ix  *:H W`m|  7HYj }    !-=MYft & 8 HT^l     .?IY m     ! 4AK d y        !2@ Sbs       ! 0@ Q\ q~     ,9DObs    ' 9EV iz    2>O\iw       , > L  \ l  |            "  0 ; H T b n }            1 B J V b p |             * ;  M Z g u             1 @ M  _  q           # 9J[mz)7DNZf y    % 9 M a u      ,=LYi{ +< R ds   %1> LYgs       3 BS bs  +H \o        2:CO_p     $2?IWe }       * ?OZj    *3DQ^jqy !/ @KWcpz   )9 L] o     ( <GT^jx    !.<MZ n      $08CPZeo|    #1:H Xix    !  6  K W e m y          !!!'!4!:!G!V!f! x!!!!! !!! ! " "'"2"<" N"^" o"""""""""""" # # 1#;#J#T#c#r## ######## # $$ .$K$ a$j$w$ $ $$$$$$$$$% % /%:%I%W% p%%%%%%%% % % & #& 3& G& ^& t& & &&&& &&& ' ' ''6'A'N'Y'f's''''''''''' ( (((5( F(T(d(t(~(( (( ((((( ))')7)E)R) c)n) )))))))) )* ** * 3*B*L*V*a*n*}* * ******** ++)+:+G+X+f+w+ ++ + +++++,,#,/,=,M,_, p,},,, ,,,,,,,--!-0-;-F-W-b-m-y----- - - -- . *. ;.G.U.c. t.... ...... / /,/8/D/U/c/n/|/////////// 00"0 50C0 [0h0u00000 0 000 0 11*1:1 L1\1j1{111 1 1111 12 "2 62?2M2[2f2v2 2 22222222233 3,3 ?3N3]3i3t33 33333333 44%414=4K4W4g4 x4 4 4444 4 444 55'545@5 S5a5m5y55555 55555566%636D6S6 e6 z6 66 666666677"7.7;7G7T7c7n7{777 7 77777 888'8 ;8 P8 a8 r8 8 8 8 8 888 9 9 -9<9L9]9 s9 9 999 9 9 9 :::&:5:D:U:b:m:|:::::: :::: ; ; ;%;1;9;F;R;b;r;; ;;;;; ; ; < !< 6< I< _< s< << << << = =%=1=?=K=Z=e=n=z==== === ===>>!> 6>G>X>f>w> >> >>>>>>>?? ?0? C? U?b?l? ???? ?? ???@ @ 0@ E@ Y@ o@ @@@ @ @ @ @ @ A A8A JA ]AmAzA A A A AA AA BB%B4B>BJB ]BjByB BBBBBBBBB C C.C BC OC aC rCC C C C CC C DD %D 8DADPD[DjDtDD D DD D D DDD EE#E/E>E ME[EgE xEEEEEEEEE E EFF%F >F YF jF |F F FFFFFFF GGG&G1G>G PG]GkG|G GGGGGGGGGGH H H%H9HIH ZHgHuH HHHH HH H I I%I2IzQzaznzxzzz zz z zz z{{ ${ 6{E{T{ c{p{{ {{{{ { { | $|/|@|O| d| t||| | ||| | | } },}6}B}S} e}v}}} }} }}}}}~ ~ ,~ C~Q~a~o~~ ~~~~~~ ~~   5HYj }   &:GS^iu   πۀ  %4 K ^ rʁف   -=KYcv   Ƃ ւ "/?MYct    Ãσރ +9 K an~   ̄    - B \  Ʌ م ,: N` r    ӆ ' ? S f  Çч #/? Q_|   ʈ׈   1 J ]o     ۉ # 7 K ^ r  ŠԊ   (7C Vet    ΋܋ ' 9IUcr ̌ ܌    & 9 K Yjw   ƍ ۍ  ,8CT do~ ŎԎ (6DRdo{ ȏ׏ $4 CO_m   ː ܐ ( : N_ pz ӑ   )7EU dnz  ǒ ڒ  ' > Y t    ʓ ړ  . > U h |   Д   ) < Q c x    • ֕   $ 7 I ` y    і   / C X p  ˗ ݗ   " 7 O b w  ̘ ߘ   (D \ q    ə ߙ  & 9I [ kz   šԚ    '5 L ]n   ěқ    2 G Y o~ œ ՜ " 2?NXf y ʝӝޝ  +9I ^ p   ў  ) @O a q~    ՟0;HUajxȠ֠  (: K ^n   ʡס   - A U gv  Ţ ٢ "2 AIW oy  £ ֣  $4ERco~ʤڤ -8FU` p   ҥ  * B]q   ɦ ߦ + A W i }    ٧   4 HZ o  ب    *C V k ~   © ۩    . D Z nz  Ϊ   - B X q  ū ٫    9 L c w    ʬ ߬  1 >P^iw  ȭխ   *<K Yhy   Ӯ   , @ W k   ѯ   +<O ds ˰ڰ# 6E W k{    ϱٱ  $6D UcpŲӲݲ ):EU gt  ó̳׳   %4@P\ku  Ŵ Ҵ".<HVap   ѵ   *5GSa o~ ٶ   "1 FUd w  ÷̷ٷ )6BN^n }и۸*8CQ`k    ͹ ۹  '3BM\hx   ǺϺۺ  ( 9GSc t  Ļһ   8 K ` v   Ƽ ؼ    5 L a x   Ž׽ %7Wr    ־   3 F X lx ȿ ۿ    . E \ r   #? W o     )3 HXco~     *5@Q e z ,> Q_ pw"2@ R e v      )6?M ]jt    $-9I V fx  $/:GRbq  ,7CTboy  ' : KZgv'4AMV r       $1@ S_lt}   + ? R_ox     (5BO]jt ( 8F Sa t    +:GTbs   & ;HT_p    & 9 ESYd rz    % 8G Uft  ,<O doy       0 Hc |    +6=KU_ks~    2 H ak }  % 8I ] t        2 F Wk       " 2;HV du     +: L[r~       / AP cpx   # 9 L b w     $/:GX l }    5FQ]mz  #-=K ^ q    #,:J ]lz     1 A Wex       + ;GT_ir   0 G We v  +8GS ds   . DUg x  & : Se ~   /9 H[ n        2C Vgx       - B Sb t    # ;K a r  !,< O ap   ' > Uc r   +9 L `n     )2@ P amw  / ES]gy    "4AO`q     2 I _ u       ) > S i      &1BP^o   !2 EV j     $. <KTdnz      - C Z n     ) 9G W]hw  +8FUer   *8J Y fs|   ,< KZgnx ( <IXb x        0=N ]hv     '6FS_ft     0=LZiv     ' 2 A L \ i v           # 2 > L X c o |            - 9 B M X b g n z            ( 2 ; F P c p              ! + 5 A I R f r               # 0 < D S e w            " 0 D P ] m {             ) 4 B M V a o z            ' 4 < G Q Y h x           $ 3 @ N [ i t         , ; S h v             - ; D N Y e x       - > L X f q |        % 7 D N \ d o {        " , 9 D L [ i y          ! , : M \ k {           ' 2 = J S Z g q              , 9 F Y j }              " . ; H V e u           # 1 = F S f u         + ; N c v           - ; J [ l           ! 0 A V h t         / J d w        = S m         - D \ s        2 E \ s        0 J Z n         - J b {        ! 5 M \ v        - F ] s        ' 7 I ^ l |         " 8 O ^ r  ! ! +! =! Q! _! o! ~! ! ! ! ! ! ! ! ! " " #" /" D" T" f" y" " " " " " " " " # # "# ,# ;# K# W# f# r# }# # # # # # # # # $ $ -$ 9$ J$ [$ l$ x$ $ $ $ $ $ $ $ $ % %% :% E% S% _% n% {% % % % % % % % % % & & 4& I& ^& q& & & & & & & & & ' ' "' /' >' O' a' p' ' ' ' ' ' ' ' ' '  ( ( &( 1( G( Y( r( ( ( ( ( ( ( ( ( ) ) %) 3) C) Q) ]) p) ) ) ) ) ) ) ) ) ) ) * * +* 8* F* V* c* t* * * * * * * * * + + *+ 9+ F+ [+ u+ + + + + + + ,  , , +, 7, C, Q, c, r, , , , , , , , , , ,  - - *- :- K- T- `- n- ~- - - - - - . .  . 1. >. M. \. j. u. . . . . . . . . . . / / #/ 2/ >/ K/ Z/ e/ q/ y/ / / / / / / / / / /  0 0 -0 ?0 M0 ^0 r0 0 0 0 0 0 0 0 0 0 1 1 .1 ;1 Q1 Z1 f1 r1 |1 1 1 1 1 1 1 1 1 1 1 2  2 2 $2 /2 92 E2 U2 d2 p2 {2 2 2 2 2 2 2 2 2 2 2 3 3 3 (3 53 B3 S3 b3 w3 3 3 3 3 3 3 3 3 3 4  4 4 %4 44 ?4 I4 Y4 d4 o4 ~4 4 4 4 4 4 4 4 4  5 5 %5 45 C5 M5 e5 5 5 5 5 5 5 5 5 5 5 5  6 6 -6 <6 J6 Z6 o6 6 6 6 6 6 6 6 6 6 7 7 (7 ;7 K7 Y7 l7 z7 7 7 7 7 7 7 7 7 8 8 8 +8 :8 I8 W8 d8 s8 8 8 8 8 8 8 8 8 8 8 8 8 9 9  9 )9 =9 I9 S9 a9 q9 ~9 9 9 9 9 9 9 : !: 8: N: d: t: : : : : : : : : : : ; ; ; ); 8; E; T; e; r; ; ; ; ; ; ; ; ; ; ; < < < -< =< P< e< u< < < < < < < < <  = = ,= ?= P= b= r= = = = = = = = > > (> <> I> T> [> f> q> }> > > > > > > > > > ? ? +? @? V? d? r? ? ? ? ? ? ? ? ? @ @ +@ @@ X@ e@ p@ z@ @ @ @ @ @ @ @ @ @ @ @ A A A A )A 8A CA LA [A eA mA xA A A A A A A A A A B B $B 4B JB _B pB B B B B B B B B C C C +C 7C GC [C nC ~C C C C C C D %D ?D UD iD {D D D D D D D E !E 8E PE kE E E E E E E E F "F W XW lW W W W W W W W X  X 5X EX WX lX yX X X X X X X X Y Y "Y 8Y JY bY xY Y Y Y Y Y Y Z "Z 2Z CZ WZ eZ yZ Z Z Z Z Z Z [ %[ 9[ G[ [[ t[ [ [ [ [ [ [ \ \ 0\ F\ \\ n\ }\ \ \ \ \ \ \ ] ]  ] 4] J] [] r] ] ] ] ] ] ] ^ ^ 2^ A^ V^ e^ s^ ^ ^ ^ ^ ^ ^ ^ _ )_ A_ R_ c_ w_ _ _ _ _ _ _ _ `  ` 5` M` \` l` ` ` ` ` ` ` ` ` a a 1a Ca Qa da ua a a a a a a b #b ;b Qb hb b b b b b b c c 5c Pc jc }c c c c c c c c d d +d 5d ?d Nd dd qd |d d d d d d d d e e /e ?e Re he ~e e e e e e e e  f f )f :f Jf \f nf ~f f f f f f f f g !g 0g >g Lg \g jg zg g g g g g g g g h h -h =h Qh ih h h h h h h h i i .i >i Vi ii xi i i i i i i j 'j 8j Nj bj pj j j j j j j j k k )k :k Nk hk xk k k k k k k l .l Fl cl |l l l l l l m !m 6m Km em m m m m m m m n n $n s Ms `s ps s s s s s s s  t t 4t Et Wt kt t t t t t t t u *u Au Ru du |u u u u u u v v *v =v Mv `v tv v v v v v v v v w w +w ?w Yw ow w w w w w w w w x x +x >x Rx `x px x x x x x x x x y $y 3y @y Qy fy uy y y y y y y y y z z -z =z Mz bz rz z z z z z z z z z  { { +{ <{ H{ U{ f{ v{ { { { { { { { { |  | #| 9| N| `| l| z| | | | | | | | | } } } *} 9} J} \} k} z} } } } } } } } } } } ~ ~ "~ -~ 9~ K~ a~ s~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~    ' 8 G X f m u              ' . 5 @ N _ s }  ŀ Ҁ ۀ     ! / < M \ j q {      с    , < K X f t    ɂ ς ݂     ! 3 H \ o  ΃ ߃     # / B S a q      ń Ԅ     & 8 H U e w   Ņ х ߅   5 D P ` p ~      Ά ߆   * 7 D O ` k x     ȇ Ӈ " 3 > J W h t     ƈ ۈ      2 D Y l Ɖ ԉ     ! 1 A R h v   Ɋ ؊     , @ M Z g t ~     ŋ ҋ ߋ      * 0 : L ] h t ~       Ռ   " / ? Q a r z      ͍ ֍     + 4 D N \ l z     Ȏ ڎ   % 1 > H U e o  ̏   , > I V ` q    ɐ ސ  ' 6 G S ] l {      Ƒ ڑ    , : I ^ m }   ’ В ޒ     ( 4 G W c w    Ɠ ԓ    ! 0 ? L U a t     ǔ Ӕ    & 0 ? Q [ d p |       ԕ     * ; H \ f    ǖ ז    - B Z n  ɗ ܗ   & 2 < N f x   ɘ ј     ( = L _ m {  ™ љ      & 0 > R ` n z    ͚ ݚ     , : N d x    ƛ ћ ڛ      % 2 B T f w      Ҝ ޜ      $ 2 A S f w     ǝ ԝ   ) 6 C O a q     ž ֞     ' 8 C N [ n  ɟ  ! 0 8 B \ m     Š Ԡ    ( 1 ; Q ` m |      ѡ ڡ      , F [ m  ̢ ڢ    ( 4 ? K d s     ţ ۣ   " 1 ; L ` r     Τ ܤ    # 7 O c n z     ҥ       ( 7 F Y ` j v     Ц Ԧ ڦ    + ; W j ҧ     + 2 A O Z d q        ˨ ֨       & 5 @ M Z i u      Ʃ ҩ ܩ     # 6 I Y b n }   ª ͪ ֪    ( 6 @ M X c m {    ̫ ޫ     , : J X g o     ˬ ڬ    & 6 D T h ~     έ ٭      * 6 E M Y g x    Ʈ Ү ޮ     ! . @ L U ] j y      ï ԯ      . = K Z h v     Ѱ ް     ( 7 @ O \ m y   DZ ձ     " . 5 @ Q d w    Dz    % 0 ; G U a x  ̳ ݳ     $ 3 G Y l ~ Ѵ    - @ V o  ҵ  1 F W n Ķ ж  / ? J T a m x    · Ϸ ڷ      " ) 8 J W d o z      ͸ ڸ    " 3 = I Y h t     ɹ ֹ    . G Z o  ̺ ׺     $ 2 E Q \ m w     ˻ ڻ    " , 6 @ P _ o    ȼ ּ       % . < M Z l z  Ƚ    & / > L [ j t     ľ Ͼ ھ    5 I \ u   ȿ   + D a t    1 J a v    ! 8 R n     . D ^ r           1 = I T ` l x              5 I [ k     * 7 H S b o z            + 7 B W f z         . < L ^ m {            , = K \ l }             2 ? S a l y          $ 3 D W ` l }         . < N b u        ' ; L _ q        , < J X f t           # 7 Q c r      * 7 E U d s               0 G R ` p {            + 7 @ M Z h w             $ 3 D T g x          + 8 L T _ p }        ' 5 ? Q ] i {             # 2 C V a n      # 7 E X m {    ! 7 F S \ j ~          # - : G S \ i x          " 0 C U i }           ( ? R ^ k             + 9 C T e t        # 8 K Y k y        * : H P ] n |               / C Y i s      % 3 ? J Y j        4 F X g |         ' 4 D S e v            ) 8 C M [ h z      / A S h |       ' 8 H ^ o }      & 0 E ^ w          ' : E V d v      2 H X c p ~             - > I Z i z             ( 2 A P a r           ( 9 I W g }            , A O _ t              & 1 : J R Y e q ~           ! ' 3 < F P ^ i t               ' 4 < H V b k v             & / 7 C T f w            # 5 J ^ p              * 9 H ] j s {              ) ; E O Z d q z              & 4 A Q Y e x          & 3 = I T ` j w               * 3 B R b l u               ) 9 A N ] m            - < H T ` i r {        ( 6 C O ] g r              % 0 = F O Y e m {        " - 9 C P \ i &'+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ()*+,-./0123456789:;<=>?@A()*+,-./0123456789:;<=>?@A]@ ^a*vBa*va* vBb*(vb*0vBc*va2v/CA3j+!2 v/Cb2(v/b20v/Cc2Va:vCA;VaBv/ vaJ^ aRv/ vaZ^ abv/ vaj^(ǠCX `5c8ˁRX5@`@ˁW@@`9*r2*r2СR( Bx:T 9R( 6CP3[Jj+[ BVkJj+[ VsRVj;T U[j:T cR(kJt,CP*ҽX+T cRkJv,CP;B`5*l*lΑJtT PˑJPKCR,#bQ СR)PH`T BR#PmsRΑJvJPTCR9VڱPTՃv*ʱz0ԎCR9Vj.T*c`VCR9Vl5#:R)`@x@kJ`*ԎJ`*ԎBV0jҡR+ \ B`*X5Tjej:Tjej*vԊڱVԊj.TjS`*v0[MJx-Jx-CV[njX9-ҡ\(X BjÅh5[BP(BP9 .N :\ BX(j9\ pv/ʅP.BXn햃v,5plf+5ȱfkrV( Vs\,XС\,XͥCX0 bt;5ct(t(\ С\ rj+bv( P.VmCX:s\0c\ʡv0[ rPLB\9TmӱV(+`:Uۡ\X4VmС\X:˕CV0B\9Tm P.WU[,C\9Tm j.˕CP;ʡzkrrjҡ\j.˕CP;rrjt(+rv,˕cP; rX.ԎC\9 \(+rv0[ rX.fP.Wl5˕ct0[Mrr,c\KX3 ʱt:XUct(+l9˕ctr`krr6D^(X(lQ.Xͅrv P; P;P;XͅrvVC`;fP.P.t(lwn(sj,UcXWC9\5PMPM`:Uv0岡\6eX:VX(ӱV(ӱt(j.V`5 rj `A `A`AXͅrj Q.[ rr˖P.[u{R0ÕC\9T\9Tt4+b\9 PJX5NrX,TjDr, ʱX ʱX4VmrX,ӡ\9Kr`)VctWP(Wvjr`*lˡf3 ʕx/rr pl5+gh0j6xCTU۱t(p`3Tfjp`vxR*9^zP+ԋEshEC:NjZREC`5V rhEc:Njڡ^6㕃P5[9`+BС`+ bPK`5 9`2V 9`36c`3X،Ū9`39`3VX9[ r `5 6j;lFcv:lsf Fsh,Z9`4X F\(mP0ڌ̀(mj,PZ`PXM7cn:`5 rj<,P@e`V[v0[  T j ll`5 lk ZٌBrmP\ Br)KR( ˥X+,bt(X.eX(X.^(X.^ KxKR9\CrCr P*`UvCrcP3cP3˱t(XʱP\ cP\ ƚP\ ƚt(X5P\`VEc`Vsv(XūP܋Z` ҡ`9+`3 X: \(XVsP܌ӡ`Cr3XkZ`\(XnP Vct(Xnr(Xnr:,7X:,7X:,7d(XP UCr4V f fKn3lr;,wv r; ӡ`9 vCrCr͇t/Ot0 n( n, v9tLҡ`9.`9.PzPFc`9ҡ`9 |(P@ rPϖ۽(X0 f,L7cPڠX5CP1TC1ЁAPY s^4C9dlgC` %2z(LZ9d9[͑qPE7CP9f(cJh( BPcJh0TMR(ݎCP*jR`;cZ`5 Zjc3rP4 嘡h6 El1C3T-sP5c: UC3T嘡j5c9fLr4 V*G\*G\3 j`j`5Ch: sP sP:1Cd1CdcP5cPcXY1KPJe˱C9f)T 9f)T DR]Φӡf).gX:,bf)l瘥Xcbv(,Pcbvcbv1Kr;X嘥X1Kr;[@瘥`5j`:jlY VVsR9CR:,ţ9f) 5Khj`5,ţcpl6\j6`׎Cfo7kflj+l6x+: VsfnʡfnP@cflXlcv/V5 6@ Xc6C9f31^c6CP)1j U P P@ 5 5:lbP˅l5lrv0[MX.j6cX+lrV3 j6cX:lrX5KXDf, USPCT,j6c`5j6cl9 5Cf,-Sf3 j6cl9KX.[X 5\9j6cXٌ5cPkƃX1j+c6cXٌU|5lʹX5lʹX5 5r.VMX9LX9Cf ۡf3VtٌsQCXٌՃvj6c`KX=jPC`j6c XvCf,5>5>P^9f3j6j*j6j*1X Zf3K`.ΖCf0jg`5c6Lg9f3V LCf3؎C`j6X9fPlʡv 5T 5Tkl*ԎCf6jPMl5lfSv0[Ml;lfXj6hNl;j6vj6v 5zj6P͇JXCT,lfj*5|j6`5j6tDf6 kl@j6`*c6P;j6XٌbPoҡf3 Vsf3^x9 5r,CfKx9Xͅx9X5f3ff3fPOPCP1Q0sf1U,l\ Xsf@c6l5ljcFC9f4T@P5 5j(1v@njZ3+Cf4:f4XljFV:Ԍfr͖C`+ԌfP35^6Cl,ҡf5PBl5jft1t6V P3lKClcf`<jvsn(RPJ9f7Vn^(BX;BX; 5P)BP b`*lDn/TP;^kӡv0[-Cn/TP;Cn/TXJv0k^kӱrJv0+Сf*t5P)cP b`:Xͅ^k P b`A 5P)\Jv:Bx4Vrn/Tn^(cv{j:cv{j:cvP Vcf7Xsn6sn:,BYz3Jrt UCt6LgP5Lg9fPsv(X1ۡh 5ۡrX*jCtَCv*5cf;VjَC`5۱r*ff;VNl5jcX+lj.lP;jcjkXjǚQ+WCX:lP;XͅXjP+WC`5۱r5cf;Vz5۱r5cP+WCl9lP;[NX9c{Pe^FcX9lV,lV,cjlb^cV:lg9f;[-Cv6j`:j`j`Lr0sЀ0Cр39j궃v*Ś9jk6C9jk6cj(+gt4T zl5CPWVv0RrLPUCl UClJX4 UCh0T@X4 UCh0j6j(VΖbP5+gKT۽X: UCtKCt۽X:mfst;T ^,6`]@X݋f6Lӡj(nb`DP,l3 Сj(nb`*T ^LСj(nb`*bv/C`bv/C`Z@X݋X۽X;BP,t,bv/\۽X;nX݋vbv/P5+j(WE9j FsP0X: UC\,Lf.9jc9jLBPUCl.T 5`* UCl.Kf6LBP3 cP5X:T 5`:Xͅf6CP3̀jfsP5P5tjfsQ5 Cf,T 5XjԱVjԱrjԱruUC̀:UC̀:Xͅf@Lf@UC̀UC̀; UC̀; 5CP3Bf@T 5`*w0UC̀AUC̀AUC̀AX娡j+P:T S`*T S`:ʩ^0UCT/nSjt*z59j(P5ŢP5Ţv0 UC^,jӱVjbP;CPtQCl3f0f0TQCl3 h0h0jv6L̀jgX:T `:h0kv6Lҡjj.T `h@G рrrbvUStjX]^zr(QSl9^ҡj-Zj-P5˖jeP5˖hzz0USl= j;TMcv3 j;fCT j+Gmt0Bx:樭P4T U[j;bjڊrVQ[r:VQ[r:V-sVVsV,9j+Q[r9ʡU娭rQ[X(Gmc:Gmcj(Gmct*b9j 樭rʱt*`*9j9j˧sV9Q[`*CjŪjx:Tm5 `+GmV*gt*gV(GmUsV +樭 Сj,ʶCP5je۱P5je۱tCj,Lh6kʡj,BX4[CX݋P5nb`P5nb`tK{t0j,TK{v0Ucv/ۡj,t;^,BX݋Y+T۽X;XVs9j5nBXPGCXPGӡj,BPX3GŚ9j. 娹X3T@稹X3bX:TŚ`b`(TŚT5P5P5P3TŚT 訹X3樹X3 娹X3X 娹X3X 9j. Vc9j. 5kۡ5k6c9j.樹X3[@稹X3Usf:Tʡj.VB\B\QsX P5B\0m퀨 fX9Qsl9T5cjkf暱r:T5c5 r\3樹f0樹f05 BtkSt,T5`: Us`*C\3 \kSj.G59jm࠱r0樹f5v{f,T5^Qsl:Ge5mj.[娹l9P:Tex9X9T͕t;T͕̀+t\9 56P5{j.LbP5{j.Tśr7C`;5U{W9OP,9j0QP5 Vcj0jhY@hUP;vv hKhB`4fj0jtrr:T Fcj0LGC`4nh0B`4tfv@T FP5l5ӱP5Z9j0t;[QPl 5.rb(G-v;cPZsd UP5ٌf,&vlV Q:GhP9QRVCXQRQR P)lrjk6ctZ 5cjcXZ 5PZ 5XZ 59j5 c9j5Qh P4Trjm9j5ԍQ:TBP 5cP 5\Z5t,Gƚt,GƢr0Vcv(GXZ۱:Tj5jZcPҡj5Vs9j5VXZ rj0V@`/ cj5 6CX+T{fK`/ \Z P;`/ LCj5Xӡr0Uz:j5Xӡr@GFC`,Tfۡv,TfۡvVP;Xͅl;fj5j:TfT,TfTVj*Uۡj5bXUx5+lӡj5bPWSj.Tfj5USP X:TfVZ\Z\3 VuZj5jӱVZVf3 Vf:Tƃ`,Vv@Tƛj5 CjٌBjUۡj5Lx5 jZ V,TͶbP5 cjLZjLҡjLP5 dP5 \mP5ClڎBlVsj6XmCl4 ҡj6jfP5 5jfP5[ H퀨x:TVl< r(fˡd:T͖c`(T͖c`*T͖c`*f۽X9Gƃ^5stQӱf4GMǚl96 VCt>VUXUX9TjBt>VBt>VVsj:+w{j,TMctUtPJ[ӡj;VX`: Uۡ\Lҡj;V`5Cl5P.[ Pet;Tmrj0Bv(t`ACl5XBv( t`AXͅP9rvjS9j;TNPcP U۱P;VU۱P;VNX)lƣ9j;V5hڎbXcX+VmCv, EKrڎzh)VNX+TmZf UCvrvBvҡj;V CPVCj;Vbj;Vҡj;Vfˡj;Vfj;Q۽XBj^,{h:TmbP݋ӡjl6Cv/lCv/悱te\0 U۽l3 cP6`:U۽l3 \e\0U۽l3 dP6eVtC`;{P?Tmn6Tl3 BP+gf6LCvf\0N^96l4[P+ghP U(BvT Pj;VkP4jgQlh6݀>T`ꇪ`(XNCvBv 5Cv̶P,`*l+K`) `*GmSPLX9GmSr0UTjBv0ڱVP;UTjPLv0[ UTjtP;[`R`*TmS`4UT3JX\Cv0 PUT:Tm[n9NPlźX:ӡj;ʶcj;ʶcCPҩ`r,V`.V U\Q\Q\<X9`PP4XCv*el6cPX9TmT9[ j;V:j;XQl~Cv0Bv:GmtvCv0Tmt;PUnˡj;Tmr,tv{jv{j:TmVl+`7ۊsvmҡj;P5TmP; Up<xx,x Up<ҡj;QL`: PLǢv0 UtBv0붃tzUt6 5Cv&Cv݋Plb`* Uv`OCv,j;XCtփx:Tm7cP݌cP݌9j;[ Bv(GmgXv;9j;[l5lrvQj0`Qj0`l5XQjQjOl5Qj0[@l5Ol5ՀՀ4Tmgi:TmCv:j5^ sx9 UX:Tj=L`C~0`6Ul< `6P5DjmcP5`ʶjm P5CՀ4[m5XP*ܽ`5ܽ`5W@w/XͥCՀ;}( :T {r,G-Rl e`* b9n(Ջ帡T/qCPLeP7Tnr BPUۡn܎ƪ: XuC^Lv/Bf@ {Q7cn,ԍrXҡnlknlkP7Vn˱P7Vn˱tK~ Pl`+`:`:u{r0B^9 T+g[t0J總rlr`( Q7 5C`, u\یUQBl* xӱ7 5t,ͦB̀7KT𶃩7*PM^fsXmTf`5,rlqf UCl3P7b`*lDl3tmfsPmfsX:6`:f\0kf6Lҡnj.6`f\0Nf6,Bl3 dP7Y:6`AXͅf6ut6cv0fX? fP: fP;fP;uvLBljӱVMC`:uvLP7n7cn6nҡn6nҽ`7ͦf0fl3 uv9Bl]v{tmbP9Kv/ n݋etqn7qf( rnJj 5C^0TMPvCfvCf uf3X5n7lsnͦCn7LP9Nt Cx:ʡv<KP9qrvCXkP9lP*ǚP*ǪP*Ǫf@v0[ urVӡn7jXkXBn, Vs̀ۍP Cn,TUSP CT,vcrvcr uP9vct,BX+BX4VmX(+X(KX(Bn Uۡn7ltۍ5v,ƚP;XjtۍU[n7VmrPBX:ƪXDnڊBn bP`;uj+XͅX쇺Xҡn7VmCnj.tvc`:V.CnLPkj.tkDnlBnlҡn7dPk r: uPvx+ uPBn3oCn3OBn3vPیCdmҡnKXmұX+6cیPی9n+4Bn3bn UStmSRlDn3 P BvmSju`*TmCn3 jmSv0[Mf0jgˡnLr:6VmcP P VmX u`8Kf@6j.fvX+fv,vj;KlVsn7j;fv4VmCn6Xmsn6jP-j͖l5 ur;P-j4Vml:vX+fv,Ctvˡ`:Lr(r(Bn9Lʡn ct-`5v˱T0TjBn9 J̀-RP;v˱T0ԎBn9 ڱt-RP;Xͅr, j-RP;Cn9 z,c`ǚQ[vv˱T0ΖӡnŪP[bVv˱^ VsnŪt-zj:rj:cX5Bn9֋UzuXLrn9VmSP[UTv˱j;Cn9VmSt/ uXLҽ`7v˱j; VsnLBn9Bn9JBn9JBf,햳T/ ul(ՋCn9J\-gKv0[ ul cn햃vvn9jǚQ[vP;Vӡn햃v,vn9jP[vP;r[l5vzvzul=vzvz,vz ul=X5n퇺rڱP[P; ul? c̀-ghKrj.햳`4fnv0[Mt Xۍ۱jsr[.Cr0m`*N`3-t[VCrun6cn;mʡn;؎bn;؎bP j,P8Jśx9Cr, f hBx(*t(h(h:x:ҡp<BxLCxCxlX+jX+jCx,O`-VZ΁f(j,tV9p<GrP)lrP)lBP)crKt*C9r 9r UsP)sP) Cf,G9rБCX3*Rj*RjC^5eKP9r#9r( rP4͑CP/#ʡvʇr)؎CR+CR]br).f@T.P9Xӡr).QlCX\ ˡv0[ Kv9ΖCR]t\ j\ʖsR*X*X; Kr:T.e`; Kx9T.e:T.et\P9*BX br*ԊsT ȩP+ʩP5*bP9 SP,悩P3TNBl3 ۡre\0Nʩ^(mfsQ9 SrbP9 Usf:TNJt/ SR0vӡr׊Rj굂T,ʩ^+MұP9kœP9ՋBT/VEr69r+ʩ^\@ʩ^SX9 *zto*zv SX;sT/X 5[9rȩ^0V@ȩ^0kҡrBT/؍5Cl۱T;TNX]@ʩ^K`*TNXS`;jˡf۱T;^5Q9 cv S`;j˱tP=*zv9TCT/X5CT/Xʩ^kʩ^Kʩ^BT/Xۡrt5:rʩ^>S|(ΑS Vs9r**ҡrLȩv0*T:GNx:GnrVˑ[f3#bBV[jБ[tʖCV6^[x[x9*x:Tnųt3 *BX(GBXcf CXcP9r,vCr,#9r ʹX#bvʑsj;X 9r.Vm9X#bv Us\Vj:GeC\#P#PΑsj5#P9MD\*R3*R3 *P9B\<s`5*X*XjP9ƪP;Xʹx4Vms\<*X 8c9r.lP 9r0Ԫr`ʑj0͑j5#Cj,Tҡr*[v@Gr`#cP59k6c9r0^;Tcr0t,*j.GV,*lJD`MCP9ngSP; v6U9r0v{j,#l; 9r0ζ9ngX*۽hLv/kSfs`AGP,h:GP5GP5#P̑j:T͑j:TMP5J^5P9Αr0kP5#7cUsf#7cP܌Uc9r3V9r3XˑX Vc9r3X͵͑P9Z@P+*GCP:TZf3*GC`MP.je9r4Rr4Uۡr4U9rhP-Ch v vKR P^(X^(XNX+GZ9r4V rh Ush UӡroZl3*G{f,*Gt Vs9r4X ӡr4nSP9̆Zr 9r4[ml9Tf˱V͖cP9-cP9-P9-Chx9GfP9 P9cP9cP9c:TfX9*Gr0x9Xͅlx9 *Gr`;Tvt-P9ZP9Αv9[t P9БQ90sj,Gbl\6[9r5lesjYˆh(TFCP9 {rP; P;JjСr6 j+TƫkT2Tӡfcr6Bl<Kx:XͅX.̆X.̦Cr(Zr9Uj;T.j4VmCrP5kP5ƪPbXˡj.Vˡj.VNP5KP5Brˡt\Dr( kP@*cr:T.PKcPK\\܋Ut\ܽh0*P3T.f:T.PZr9XCrBr6br9 Uۡr9 Ù\BX\BX+G.g9r9[-Cr6*^, |/jCr6_fۡr9Ol@*m:TNZr:V 5CtjСr:V 5ӡr:V Bt jVvVv:TnP?Vҡr;V ڡr;V t܎Bv:GnǢt܎f܎t܎t+gt܎:r;nZ*kf3 *kf5N^*{`; ۽rL^9ͶBvf[P+gөl7ʑ۽x9Gn:Gn`*^6 T/Cv0Ռ`+Cv0ՌCv0oʡr;7CXP; TjǚQLśv,*x3Vsr;7C`*x3f`Z(Z(N`-`-CvLCPSP3`- ̀6r@TnӡjCtۡr;nBv0ݎCv0Bv0Bf@Tnr@TntP݌ӡrKQ逎܎sv l9*r2*:r x3*ǣ9r=X͑j+G9r@TMk(J7PAZVBP7.l:NŪP:BT,NŪP5Sj+TmҩXkҩXBTJҩX5VCTSj;Jbv(X Sr;Zt*Vn`5Jb`*NT0 Sv0X,(ʶsTJt(*KP:UbP:UbP:U\(*`JǺ`*f(C`; JPСsr+ҽ:V( Ecf@`+D^*T͡{rΡ{PkнX3 Jb+ҽX:ղV˅Jv &CP( Vs9t/нd*9tB^3TΡ{X,5c:5c\/5c׌t^30s^3CXkt^3` {P݋fP5e˱PWEC^9MнvJP@ˡ:˥P5 5C^@r`Ρj U :s`LV,b:C`5XP:bt2 |( Vst2J7cn Ct6 5sl2JwCnӡt7TnāXJwcv:ƪt7VMX9VӡtjCn/lZtmŚtCtCX(P; ?jP v0[ T( Cv( Cv:ˡv,ˡvJwP;rBnjP,l5JwP;[r,˱V( cP,t7XVst7XV9t8lrtCC:NP: 6Cv(j;JCfJCf ӡ`3CC:ұ:bt:Nt:Nv,N`5ԎBt(VC`5JCtjP:JP;Ct(Vӡt:oCt(lZt:o\(śt(Dt( kP@XͅP@JcR3X bP::P:V(EKX9NǢfӱhKX ҡt:-5\(EK̀EK̀(EK̀4T ӱhƪt:VmXkXBtNXJcvJcv ӱr;XVӡt:VnP:+X3 JcvP:+ӡt:NX:kX:KX:Bt,ƪP:Kj;JctJctӱv(ӡt:؊gP:lųt3 Jj(檡R3JjVCt0W j:NsX+Ns`5Jj4Vm`UP:Uӡt: 6CX(FP; hjҡt: 6C`5J`3f9t:`Jv`Ct0Ut(ۡj;JvJv t;Jt: T0Ԏl*j P:MCX+NgSP; T0ԎCt6 \(Φv0[ T0ft(Φv0[Ml*jP:X(Ζۡt:[nZt:[nGcv(ΖXP:bt:Zt:ҡt:P:Bt<kx4h hVCtTn`5c't#qfP*sfrfCf(c7CPJ9BGH9v4T t+Bh6ʱtͦX9 t+SP;lf3jgv6Lh0j6v6LBl4Bl4Cl4 P; ctӱtj.FY+FY9FY9jgP;[ 5Cl5 v X+VcXjgtP;ͱ˱x:.Cv9j`<j`6T0O7v9 t]Φ퀨]v{X+.g`,j^@.g n˱ӡv;P*5cv;Bv(ՋBv(ՋCv( Vsv;EcvzXۡT2nRX+nRX9nRX9jCd ۡT2jCjR3jCjjCj ۡ`5Cv(XƪtP*X۱hkXVsv;ӡv;VmXbv;VmX:nǪPjcVNXkXXCvڊCvڊӡv;VmPҡv;VmPjk\ݎUl5jcv ۱j;X5v;Vmj,۱j<ԎX5jZv;Vl5nPKC`jcvjcv ۱t;jLBv0αf(n˱P,Zv;XCvoBvoҡv;؎P3nVLBvotjx+X cPl[j0rv3 ] r5бr5r50Cv\f0Vml Cv9jr(UۡvJcP]j.nCv0[ PVӡvJX.R`= r(cX:jˡT;[P`)P]X.KvjRKroP]`jRVӡvlO%ӡv;^x5 j v;Vαl+g:xP3xPKr.XX99x)Vnr,ʱ^*c9xKr5O%j+OjjP<fV(jXl5+CT;P<fPJt( x[T[jފU [:oKX( t( ``Сx+bP̆`P6`[l3 ` 6cx+X:oP̶CX( ft< [v( cPlPlPlX+ol5Xͅ`;CV-`;[ƣx+Ζh:or:or@oUr[X*:x 9xr@oKj P<+X9zPlP>lCP2ʇj(JƪV(Jƪj.%c`5CX5ʇt(JP>Tnr+[ |Z Vs|܊BPBPCV:c|P>( c `5 \(k`h,X3 hKCX]|- kf3 j,{f,Vs|2*Bd>Tnʡ|2*bv(̇ʭf@OCV5NP嫡|5Xͅ`5P>dɠ|9 BXZ9~ҡ~0 f3 P9 P?l4B`67c~3lgv3g~P@DP@Kf(f f3K@VNtKr@pFc@*rs,rykrPAԌrQ3 DX(#P *Ț9, rY CAV.P5#ʥPӡ0oraAGЖcA[q 9;ܱT:Gp7CPA^z "(cКv) Vs=PY =PB^0.JT b=PlKR+JfU JX*t)T*5\)TBX] bkBX*X)T ZP)KB`,Jv*eRV=P)] ^2T ^2.JS0KRͶJR@X͕B0Jgl5Jg U{RCt)T Hj)T CRPۥP)ӥP)۱r)T v\@B:nRP`5Bf [R( 5Cr,ԎBTjBT/T 5KTPJR( B^@^] zf\ zf\@B^-V)ŚrJjJ`) 6t)JBd] Pՠe^)J6`V)J6v)JRX)JRXJ%KjW `;V `;X͕Bd)*JT [R(,eR(,et)JʱP2X͕BdjBd*-Bd*-ZP*FKjJ%[vJ%[vU P;X͕Bd+-BdBdKT2*RXJ%ct)JւfJ%krJ%krU `9.RZJT2FR(̕jJ%slڊKT2Wƫt)JBV)JBVU P+Bd/TmR(셪t)JR(ecR( VsP*ҥP* {P*ٌӥP*JTbR(lfsR(RR(RXJ%T2V.Rn(ӥP* jJ%T2] X+,RnjZP*ٍB`5W X+lZP*ٍBf+Rr,.Rr6-Rr6MBdJ%ӱPJ%ӱP;] `+V `+.Rt3BdlBdlJT2 bR(L7X9] fJT2 bP*RV)JT+Rt7X-Rt;T*ʥP*nJX9] vT VsP*nrR(LR(L)JXv9kBd]R(L˱vW v9Bd;LBdJ%KT]V)JˡT2X͕BdJ%ӥP*BdRxJ%rJ%rKKT2*ҥP*{P*cR(̇ڱrJ%l+] QU Q.RjVKTZ@@l.RX9*RX9jBv6)jxj@RU@BP)jʥPKKV++Z`,] b=P+VZjjŪP++ZXjbXjb`5W rrjbR U[R BhZ j)ԊljEvjEv/*Zl VsPK{VbX({XՂRVkJZkBZ3UۥP֌KZJ\)+K\k6c=PjBXŚR(W7K\-LB\(+rX傱R( ʥP.K\.KK\.XӥP.J\.zPuX)r)ruXʥK\VKj+eR[^)Tm僭v/] U[S R+ZUcb,V UcZB\T͕B\큪P3[B\U Usr)TR VsP5&{j.M@\2,{jjҽkZt/UsP+ӥP5׌B\3l=P5B`)T {P5ZP5ҥP5RLjXX9Ur4VKj1[ UtT-ƛP5UP5櫱V)TMJX)TMBV)TMZP5+Bd\@Bd.`5W Ul;V Ul;.r,rٌJjm6\)TMf&n&n;KjSS,ǻX&n;X͕Bd9mKj2URLcRZzj5Kj5V.X9] UjVv\ UTVӥP5Kj8kRRX)T cv,] UӥP5݋JjKj;-P4] Uۡh>ڥP+BvkBvJj;VN@v끪xTmӥP5 BՂ(X eKRmgP7] ut궃X궃X궃X.`:VNBv0KBv0Jn;Bv0 5Kn;Kn;n@v0`+`+Ln;nKn;XBv kBv +Bv KBv Jr)T.{rT {r(ʡTʡv)T.BRKV0TʥP+ʥP9KrʥP9lJr)TP*Ct)T.T)T.t*B`:*ʥP9Kr)T\)T.t*B`;Kr6BR{r)T@R*bx*bxU KT<.ʥX*Jr)ʥX*bR\5Pk6ӥPkKr)Jr)V.ʥX9X͕BR\BR.ʥX9vKr)VNtT.Kr)ʥ`*t)T.r+ʥ`;^c\=PTBR*P)T.XT.|r*VC=P9kf*TN5C*Jr+*ʭt)TBX)JBX*jTU cl] clkBX/TmZP9֋ZV)T5P9V=P9VmKr\ cRKKr*bR\ VsP BZ*Bj)T΅)Ecv)T΅X*Bj\ s`5X͕B\(XMB\*bRKr.X͕B^ Vs=P9X \)TX)TX*R,X*'cn)TNʥP9+Kr2X@d3f,`@Bd*7c{r3/Kr4lBh(JBhZ j)TLr*WCP*WCTJ*WCf*WCf,r*WCfT=PkKr5X*Wc*WcuTcP.t;[ʥPngX9] v Vs=P@j*Wr*g[Rڱr)TFcX9] XLBl*gP9[ӥP9[Kr 5KrKr.j*gX)Tc=P9X;=P\@@r*Cd)T.R`5W ˡT2] ˡT*P* Kr9Br(kBr(K@rP)T.zr9V ˱V)T.ǚPkZPkR\5V)T.ǚ`5W ˱f*cR\Ut*ctT.ʡR\{r9X˱v.X+XK@r*P+V TkBr0jҥPLZj*R\ʥPӥPzr9X͵R\fKr9M@r0] t;V.`+{r9[l.l6Z |)T.g\@r4[BtTn@vY ۱j+V.X+Kr;V.X9*X9X͕Bv^Tnbeh,X*v*6X*@x>P9UlJ7ȱf0V+ҡf)5ۥP:lSP:V cPY cPY@BX)lKt [P:Vʆʭt)ztY cX:] c`5V c`5.ұfJǢj)EcR(ƪR(ƪt)Uct)Kt,] cv)B^U {t)R(ݫś̀)j,.ҽ`5{( B`JSf3` tJtR(lХP: BP: BR(lR(B`5W t)KtJ'c(f3V v)NڥPY v)lKt2.Lt2NBd+t)c=P:@pNJ(T. P9] f0[- f3K6 Bm6Jx@z<@,]Je V9#ҤX)5X(B^J R,ꥲR\RT6ZӥX(ՋJPKbTVVۥX(BR,R,cr)JeX(KP bR, VsXՌ`V3VZX ҥX0Bf 嚱t)JbdUr)JR,L`f E{P EcR, VsX(.B,T-BR(WP.]V)cXKP5X͕bj7یbj Ur6.BtӥXnR,TBR,T.KP9TjJPUʭX [j [X:]ʭt*X cR,TӥXJP9XͥKP9br ` )JKP]@`t;+Bv3`t)jbvBP)jJX)jǪX+bv.B`-*B`- j)jkX \)jt)jV x+Bf,C=X݌KPLbv5L`v9`v9Br`R,B,e,/f` ţj ˱\*Bt)KPӥX(j)`.Bv0.BvLl Z0*BvKPś=X(R,okf3``-``- JP.Bv S,o ,gR,7@v cR,T\)R+Jn) 5V) EcX*OzT*ԃRKڱf)J`d)J=X*RXK%cK%c,=X*k ,셢=X*R`K%R,VcR,V\)JfR,L`dK%t)FcX*KT6zT8+ǚX*ct)*Zt)jcv+Z+ZkbP VsXϕbR<.Z^(ZKVmbRՊJV+V.Z`5׃bX+JbX*kbX=,ZzkbX=lZX+V6jkbf6_jf3O`ZZl˱RՋZX+-ZPkejƃt)ꆪXMKV7nKV95cRUۥXlbRUΦXm6KV9lKV9br6Mbt)J[RbRKV:[KV[ZX+-Bt)JcV)jRFcR,փzX)VR,ʥX,ՋKXWKXJr.V.bT(+bT(KbZUjV-b`\jjҥXnBR,V b^+b`=.bX+bd,֍ӥX,u\)k,,JR)bn)ZX+bn.b`5WźR,VbR-bt)+LX~)k`v/[U{XǪt)k7cX݌{X;[-br6.br6NbvRj6cRj6\)V 5Rk6KZ]Ղt)V ۱V)V je˱R-zjjj+*j` VsXU[RoRoV)VZX4VmbxՌKZjR,WBR,jbXR,k\)˅ʥX.*ZX.*7X.*K\.Tb\UrjX.XʥX.Xt) Vr`5Wj+K\Z VsR,K\+rj0T`(]R,mcR,WrR,WrV)+[`5WV.X5X.]fŃXŃXŃ`5WfkL\X3 U{f.{f.`\0-{fjzf0T5RJf0V+ŚX-]5t) R3V5z b`+ŚX=*ŚX=V.ŚX=V.Kf0VӥX3ҥX3B=X3Xm lJfnJfnZX3n7cX]5v3.Śvzf +Ś,ŚZ=XP]5VZ `f(Pbf)0ŚXlJf3V@bfU5tlX)lR X)lcR ҥXʱj*V5\Kf3cv3`5\ӥXzf3XB VX UKf3/Śl>*Śl>X͕bf6.Śt)lc^\5 bf.Ś̀(Ջbf@R vZ5SVӥXś=X3{f4 UKf+Śj.*Śj.X͕bl5ҥX3[ͥ{fOj)cRZt)ct){f*DR.Ś;c`5׃5ۡjkcRVsX.Ś|(`5P)֌BO=X*Śa5WEj)͆V)͆jfCt)cR,OZ̀)cX]EXj`6r0[-ŪV9,Ū^)VMbRҥX5 Vs=X5kX5ՋRECdJj+TjJj+*ŪXbt)Vm Kj+]U[S {=X5֊ۡkSkSZT;ԃUc`zjLXZT;bX+jt)VBv\UcP-KjJ˱tjTjTbX-UۥX5V f)VՂ` bX- XjT0TbX-.ŪZkbX-VsX5V ӥX5V ۱VV5k`XbX=یUSRgjfn|j.P3؃UsfzڥX5cRUKj0Wm|jڃUPV =X=X`>XڃUvVZ `j0փUX݃UZ =X5σUjVMgt)Vm`v/f,Uj)VmKj;ͶzjdX)V-,7kX8 {X8 {V)B^+XKbx,.X.ʡv+ڱV)VcRj\{r)VNbXkbXƪR{rLJr݃cRk{rb\V`\ڃsrVtVʡTVEC˖b\+jVzr`d `d =X9ٌLr2݃LXVN{r,݃ V{r3X-{r3X{r3X=X|r3.bh)V{r4 `hJ`h U{r+W \ `jkc=Xj\ U\ [=X*XVʭ`5ۃr+ۃ+WKT+W[=XX9 b=XKzr5nzr*zr*=X`*փT`+W+W`Vۡ\ƛ`V۱`+W>X`V.cXJr9Kbr+X0Kr:VN`vVn=XX3 UX^+{+{RZX VsXK`v+ VC=X]E{rzr;Rp6h)RR,zt)R`5WcR,kKtVsX:؊b`+.X.V\U\+`9+`9ՋJt4XN\)FKtݎJt6Kt7Jbn,Lbn,V)f,X4V`KX݃ۥX`ctU d5bvLZX`fV)n7X:VZ=X݃Lt;*`YP3bv0Tbv0VXK\)n˥X͗bv6jbv6kbv6Jt;ObvKӱf3V.tٌӥX5jkbP)%cRJbT/TckbtkzvڽPڽP5{R݋5{v/nzvŢ=XJv+h,]XkgR]Lv95Kv95ӥX ZX ʥX R]\).R]ζ{XmBR]ζ{V)N`t,=XX)nʥX+7lZ۱rU۱r+X9Kv;VN`vkVCXJv;[.l9݃=Xb|,V-`݃ś^)V5KzkbXkbXJz VsRkKzJz=X=Vn>X=Vn|z ХX=Kbz0.)VbPYCf+rXX9*f+VVsX>lj0f+VƪR,lbt)SR,lzV)S`5׃d,bX@[mbu)V5K.B`*=^jxvۡj,v 5v6PBt&C`Z`(] ұV)Jҥ`(JPVKR)XjzR3,5cR BR fsPLf0+`*,K`6Wu{X,5\9LR3X)Xj^Kt) EcPLʥR0*P;V bv*LTڎUPLź`*Md\ rU r+SX9] nU fLTXLTXLT`5W f0.SU3nKV)jJX)jŪ`+V.[`,] ZjlR VlzVblҥ`+.[vlR,R`jt+ʥ`Z `Z R0VR0VcTӥ`j`kZ+kt)X˦BRMR/BX)XSvU TVK\+s f,J\J\L%cR0`R0R0|\-m\\ rt傱R0 ҥ`.Lz\K^,*sX܎J\/[^EvUct)˶K\kl0sv價R0ҥ`1/xLJd.V)Kd.t) Vs`2X `5L 6C`Y 6CX9,vj6>`ʖR\ҥ`+>`l] 6c`3+XlxY 6\< `3Kfl&cR Vs`6`*5c`Yʆʭ,eCV)lr+] 6V)lڥ`kZ`kRٌӥ`Y6[=`,`*`Jf06X] 6Xl6\)ltlt)lR f`9V 6l5,ҥ`Vӥ`V۽RKf3Jf3Vs`ͧKf3fl6>`0̀6lfR0ZʖR6F`)V۽fR*cR*LjbRڊӥ`+Lj+X͕VKVXzjb`5k\,] Vs hZ Vj)XRX)XZ=``V\XLj6oʥ`57Ct)XFf)XMR0ŢTY fSX4 5S0Ţțzh0.Ll++ZR3V f[\9ԊV05Kl+Xvڽ`*] fkXJ%Klʡn/V.rۋӥ`6Wu{TY fsPKl`S`Sf)mfsT f6LKl3 R0`6JKl4 BR0[ Jl5Jn/BR0TvR0 ҥ`Z`ҥ`t)Mw{r̶c^)mRjLl;*``:T-r;Uӽ`Z`7 5Kn.P5V vj,] vPfr0ˡT0,˩^)XNbRR*˭ JrjJrjҥ`U*RJrRJrt)XnZ`+V.˭^6V/Oҥ`V0V [X,t)XnRjRJV,ұX,ұ,j,v+V>Nbt)Xۡ {r.nzr2VBUl*jh녢tXΖv,{P,{P,{P.^+Pv/*^+^4TNv/*'ӥ`6CX)XnP*.^9Ԏvjҥ`+sv)Xnҥ`KX)Xnl5өPLBkLv)NŃt)ڥ`:jZ`:jR0KR0Kӥ`:֏`:֏vLP3{XL0vKt/-S`햃t)e0 S0 `:oJtZ XǃdN`]Ζv9.ۥ`; VKvlʥ`;VNXlRS uKvlcRݎKv;Vۥ`+7`+WKv;VRݎRݎӥ`+Xl`;UKv<fRjc`=Ԭҥ`=J|,lL)X˱R *c̀X{l9#fR3T*5CRUjJX JrUjJX9X͕R)Vf^*bt*\*KP*cRR3J6`Y hKP*`cf(,R3JBfcRR,TnT+tJ%Kr9cR\T+f(,]jRR*5Cd)XnKP*YʆʭR3Jr+cRR\-5Cd*^.R3JrNT2*5CdZjRX5*5CdJP*KP*+T2nT{P*Yf=f(r x*5Cd/jT ҥf( Vsf( {f(,RR3JCd `]jRf0ݎJP* j `.5Cd3`jRh(,5Cd4lZf(X P+KP* j P.5Cd5NT2oT2o{P*ff(LT2 {f(LG^]jRt4{P*ngR3J{r l XYjZX Zr bfkV,]jrf(JP.JP.]jzf1Cj  =f(X.{P1CXJ 35cS3h,TjJP4*5CX3NhKS3KP4ϖ۽R3fKP5cPBtz=fʭ3TMbfZfҥfR3TMEC\ USR3Tmj+V.5CV,.5CV0݋ƪtS3TmUct&KP5kj2VMR3TMʥfKP5kZf\&ct&\&S3TMVct&=fcf+5CX cR3TVsf\|P cf(ŢR3bX X4V.5Cn/ӥf(ŢX X4X͕tfR3bрJKPkt;V.5Cv.5Cv+5CvV+5Cv KP;TmvnLP+v/VJP+R3Nv Ct2cX*JPA*5CY dt*ҥf JPA[-5Cm5*5[R3JJX(ՋJX(ՋKX(Ջӥf,ҥf,R3JP2V.5cd,.5cd3`jBj,.5cr05crԌ, kPԌڱV \ ӥfUjbR3kʥf,֊ӥf, Vsf,JXԌźVu\uӥf,LJX4Zf,LbR3VmjԌU[VbR3VmR3VmR3Vm{X FKX:]jXnjӱVKcfԌӱV5Nt:.5ct+5ctKtnjՃt\ zf0k\k\+\+K`Vsf0kK`405nvӥf*5VUjX V[r V[t V[lUjZيJ`U6[j V[l.5V+5VkL` jKK`.5V:؊j+lZfJ[tJ`5Xjt&K`5kj2V.5dkj2VNj2X͕j2]j,]jf.5tLK`:]7K`:]7S3Nj,.5v\jX9*5vJ`+f ۱r ۱r {3J`kL`+R3.vA*5,]ja5Wje9˕ATnATnKl]jfCX̆ڱr \ ӥf6·ʱR3[*5RUjfK`5WjfKR31^M%{l*YjfSP+VjfSP+*5dKT2 Vsf6 bf6 bR3Jv\jfSR<ݎӥf6Jl*+T2VNT Jl*ًZR3Jțj̦R3JXcj͕\]jfsP+5\UjfsXrrcfsX*gR3R3R3˦X9VjfslYjfsR3d,]jfR3[mJl+{lkj+lj+V.5V,]jfXcf`V[X]jf`Wjfj,.5VV[S3mlf[ rUjfR+5V*^n5\ͶbR3mjf[lJl+kl++l+Kl+KKllLlJlՌӥf6j`5Wjff+5V3XKl.5Vkl+˶KlnR3mۡ`5*5V Vӥf6JdͶr,-5V:Jʥf6JSX9]jft< Vsf6jt;`jfͶf6 R3l+Jl6kl4V.5h1h-kJl6zl6Zffjj 3vZjftFӥx9`jfR3ʥf6ۍӥf6Mt:-5t6kt: Vsf6Fӥf]jf۩^mzVmztmzS3Nv;*5v\jfX9]jf`5Wjflcf6KlKlA 8HlrcR3ӥf6_kLl*Jl*ҥf66cf66cR3Vsf6_-5l]jfx;]jf`7VjfR3OcR3Ocvͧf6ΖSR3wKl>M|nj7ȡ/bR3^*ʱV/b`5WjKX9cSXԌrlԌrl5*5\,[ VsfeR31R3+KxAjRR3kzn5Pf3T.5, kXWLx+bR3k{vnjJPUjcXYjcX.5R\ҥffLKP9]ʆҥl(.eCvUʆX ۱r ۵x ۵x0eCv-ެR6nR6nKP R6ԎJP;V.eCX9]ʆڽl<+eC^6KP;X͕v3jv3jKP;v4V-eCt)jDV[*eKX-=l,{R)aK`.eK`,]ʖJj)[*RT V=llKR+eKfUʖJX-j->l0eKÖJ-BR ӥl)]ʖX-V+X͕t3JR;l|/؎PJR`M%{TmRl<]ʶbl+*e[\mrt)ۊKV.VʶrV[P9a[`:nCl+`*.e[XmcRlLV+e[`meKVmLV.e[4Xm)lbR0ŃV.e[Sl1T5c6-eRJV)lʥlKKfJJf0ej,.eR+gKfMXmR=l3XKf*=l3Xzf U{f UӥlY6rm6CVm6R cR̦jm6=lgRUC=l3݋Ճdm{z0a^6X6Xm۱rU6X9X͕t;VNvlvjRَJf;XvZ6.HCj)یKf<KR)-ʭR6Z [V)-ʭ`\FKr+X͕R܊ƪR6Z [X.eP.eP]FKt;aPbR6ZKh)VNR+e`5.en9RҽXYFK^LR:؎RjЂX)[ U X[ cv+elt)[MJjJj+VUV[l+Kj+X͕VPXJjUVcXUVcXkX/jKjKKj\Vct)[Kj, %cRZ cl,ҥl5WVsV)[R˖\6]Vs E{j/bRFRRzjav.evt)[MdUVr&\)[M{jVcRZKj5Njl6c=la`VVr[|jf RKj<]VXLl͖R)-ХlkR0.e)m5clՌKlUfsr)R6j)X悱R6 Zl6R6 Ƣj)cR6fKl/ Vsl6X͕d)MJX)MV\f`+Kl\)MBX)MBX&cR6U[l6ҥl6+dfr]fX)McR6 Vsl6ҥl6LJl2ucR6LbX9]fXJlkd3Nd4Kl2JR6j&r&r2*eh Vsl6 R6fKf&P;VffKd&ӥl65r)Mcf.et/֬dkcR6LR6Lt)Mۡf&l9VfvKd>[d>[{l3VfP6cj)h)/eRKhUfrʥl6+R6C\UfrKh.e`5WfR6[aR6[meSt)\3Vfl.׌{l5fVt)Kl͖^)Mtͦ۱V)McR6nR6nR6nKlͶcR6ێJl;KvͶ{R6ҥlJl˕v3Zl݌rr)m7c\.ef, Vsl݌ҥl݌ӥl.etꖲv]ujͶr.e)m R6[قUf r)-R6[KlAX͕ق햲nUvjKrÖ[P_ʖ[f3[ʖ[f3a˭X-bR܊cR܊\)[nPUʖ[r3TmKr+VnR܊j,]ʖ[r-Ra˱P-Zl9FKrmJrmҥl9V.e˱r-=l9Öst[C=l9׌G{r.]ʖ\)[Vs̀[{r-7C\)[j)[zr5-e-[r)[VKr6땲lX͕r6ҥlͧKr:kt;aR\{tæclæ{=l j0T-eh)F=l-=l:t)NZl:Kt0V.e`5Nt+eng=lC6VjMcf).eۡj0UʶC`*,eۡj0j6l;T ۥl;T RLvWʶSXmzt)N\)^\ʶ{rVKv/VJv/VVsl+Kv/VNgRa|a`*lKv+efUʶX5Jv3VRnʥl݌ӥl݌KvJv;-el4*el4X͕v6ڌӥlKvLGKx+,Z-Tm\(XXBj=lBR6땲\/]sv)6R(NJxVKx+f+VNf,]ƛz*eX=Tn{x3V0eTWSV)bR6^MR6^Mҥl ʥl R6^MtWSjWSS6^mj+Tҥl lڊJx+j+X͕jKKxՌ̀)ҥlڎeR6^mcR6^mkf)x0evv)ct)/R6^.e6^ncR6^Ųt)/b`:ajh6v)oX)oXj0VvZ ʱt)oKxAO{z0ejt)a=llzlՌP;V3VC`Z@V3VC`.efLJ|+ӱV)o5c`:.efLR6kXǚ6X.er)=l>VNX9`惱6`5W=lY曱V)orX7ct)oʥl+K|of+e`5.e`5WR6 U{|4TaP.eXͧK|[K|]Vsl>͗_ RjTBR ӥl?*ej)ۏK~\@X9]cRz~+elUl  bl@mKـ*nZl@m\)PetpY t)j XU@[9ҥlͶJـ0+et0etK{؀3V=l@]Աj)V.cR6UKr9`lA.uӥrTbr(kʡTkʡTkKP*VNʡT,]*RjTjJ%cR9JڱVJ%c`5W*RX;]*R`W*RR9jKPGJPCRCV6CXGjrGj5rCt/Ct//{P+.b9 ȡV.CR9Kʡ\zP.W@ʡ\.ʦR9˅R9˅tbR9ʥr(ӥr( Vsr(CXEC=r U{P/{P/PEC9ԋ=r V=rMʡ`T[V \ ҥr(lJPZ*T/lʡ`5*Cj0V.Cj+Cj3Nʡ`ʥr(XMʡ`5Ζr(XMhU*t;[R9r4]*|(+Cj>Zr(X͇ҽXTPJPcr(X͇t Vr(ʡ`:*Ct,]*`5W*R9JP2 UKP2.C`5W*fTEKXGElTUKP5+CT/*CT/.CT/X͕ʡjGU[r*KPՠ9TmJPkȡj+Lȡj+VCVZ@ȡj+V-˹R9Tm=r ȡj+X@ȡj+ȡj++CV0*CV0.CV+CV0+CV0݋JPLbR9Tmӽ`5#l9Tmet=rjʡj+#tt9TmȡjCxTKPW*ҽXT{̀JtG`Tӥr(R9Nҥr(ʥr(ʱR9NcXTj,.CtT{P;nR9Nʡv;`*x9.C|n{PZ*VTcrkʡz0CX5Nʡz\*rTcR9TۥrJP=[*tˡR9oʡ|3*Cf\*X9]*`5W*tWKPCvZ*>r(#t Zr( JP@]* R9TJPAV-CY0CYKKPA+ʡ0VNȡ# f# f0TCa3KPAXȡ6# Q=lzXTRR9JbR9JbR9J\ JXU[ RݎKXU v JPU*BR_*BT9-ʱP+UGKR9jZr,Ԫv \ jTZR9j{r,XTZ`+KX(Y*BʱPʱP2TjJX(*5cR9JrR9Jrt %CPT|(.cd+ʱPWӥr,KX(+KX(Y ۥr,XTPJX(Y R9J9JR9JVcd %v %vTlNʱP2]*Bvzr,lx.cd[*Bx7]*B|+ʱP2jR9ȱP+ctTR+ct;*ctkʱP]Zr,nbV+ctҥr,nGd f+ct cR9Jӥr,nl2V*Bv>[NʱPW*B^ԌʱPjԱR9jB̀:*cv/ cR9jB̀:VNʱPjԱt {f@JX 5YTڽP3`ӥr,JX݋JX݋KX݋ӥr,ҥr,R9jtTڽf,nLXkj,.cv/]*B^; Vsr,C`5 ʱPc^Gj9JXGJX,+cT/.cVbR9kR9kR9k{X*cT VdR9+򡀩r̀\>r,ȱjzXcVcV#ǪPcjVC=rZ U{X=rZ{X+=rcv#ǪlGUl#9cT{XG9nȱv.cXҥrkʱz0Tʱz0c9/cXTcR9tR9r,JX/ʱ|7^Jʱ|GXG|XGz`#CG9 9VC=r0T 9Vcr0T.r]*Ct,J`)*X9`*Kt,R9jr(#S9Хr0쑃dL%KvTVL%\L%\*Sf( +K`* \L%ӥr0gR9JDVlrj{`+ԬǂR9؊VTbtll+XFK`+XTbh(*X: R9؊`+]*[ V.#[XlbR9zPGrn\#[X.\,#[XGrv#[X;V.nV.nz`+kctl\l墡jlcrՌV3*f,]*[X>0f, K`J`Tjr0VKұR9BXTjVbR9R9R9t՚S9K`#cR9+{`,]*sr0jJ`.ԊK`. =r0jeR9 U[r0ҥr0X=r0 E{`Хr0k\݀dR9cR9cXTzX5V.^;V Vsr0kǪR9cR9cv̀̀mf˱VX:#sv#svZ@\`G悭G9 ۡ9 ۱R9KfT6P5+f0TML` Uۥr *.f0Tm7r tl6r0Z*xTFVF\K`4Vc=r*V3V*R9X͕j.V.\.\+\TV=rlr^[*tL`6ՋlKp+Kl>K|:X͕9^=r<X#Sj#cXTrJjT{r<݋JxKt/X͕t/.gR9l2.^>mt/-'Kx:t8k|x:k{xTCR95P;vLl.P3vLZrjӱtot+P3ҥrjS95Q;v,Jx; dR95a5W*ۡf3`*۱R9ގKx;v<#D9 =r@T Q#T9=r#9`k5#XVc9u#da5 E!#DzR)ԃJ/RTjZxԌRTjҥx RTjRTj|R܃R-KR< Ucr)JX9݃zjڃzjZ@^K{T/V͇<ˇRЖR),eRYJZ\܃7sroB`oB`ڃ7sr0TM\obRKf.X͕\oP) FRSR,śXo&{Po&{P+]7Xo&X:]7jo&ӥx30ś,śo6 , +śV6W7l.]7lAV7lA*śV +f+[ӥxdRle jo6cRٌKf3VKf3Vӥxkwlo6ct)lւ^o6k\+f-ct)lւ^;X͕f-ӥxY VSR٬^,]7r6W7r6.ś^,*ś^,ԊJf ҥx˖x˖R ZxKf3X͕f0[-ś`W7tKKf3Jf6,śl*.śnZ7X5]7`5W7Rfo6x0Kf3 Jf9r<݋{f;VKf>TN|LRUKt+RPʥ`+ Kj,*X:*jRr) ʡv, Kf0 Kj*T.e R(kBRjRr)[ cT\VCX:*P;BRLARx:*`: Kj0kBRLҩPj.*`AJʥl5 KrڊGSr)Pʥl@ KT\WSX*T.˱v Kr-Sr*BT(NʩP:KBTŪP9fsj0 Sj6Sr*XFCP9ft*TnAV*TnЩP@倰Kʭ*\*Tnh*Tnh:*Bl5*JP [VTnŪt*TnʩP+SrmbTeX9 [P**X*TncPr+XBV0AV0BV0r+XMʭ`5Lʭ`5,Sr+X 5өPRr+Mʭ`6WESr+mfst;*f6LөP6*Tnx3U ft* r+[ЦBV:*l* cP9JʱX5*bX+*b`5 cj:*bTr0VmZP9+7ȱfkBXkBXRr,VP9+Tv:*bt*TʱX*TTś̀*Tj,Nʱ\+BX.XөP9֌өP9֌̀*T5ct5NAX5*ǪT+BX9 cTKr,AX:Kʱt:Jʱt:Nʱt:XͥBX;*ڡd cP2VNBX>[AX@*BX*TeSr.KB^ {n:*rR,T R)SrA`) P;^B`*ԎcTLr, P;^VsP9 ` P;^ B`, f rKj.*PTӡ:*ۡT\ PJ%cT\ j.*7rPTn ܌łr3Af,Afj,*7c! Af0jTntTn VcAPL7cAPlr3 P+*7V:*7 ̶CAPmCAP.ZAPVr3APVr3 :*7 8cAPAh(*Gc 5CAP9k 5PTƚPTƚXTƚ Ur4V-r4b  VCP9Ƃr4XAh+Sr4Xr4[MP. f*Tv@*WCf@*WCT\ j*Tl5\0 f0T X@*Wt*Tf*Tf:*Wl9 zKBj-g \ͶSr5 P9[JfT6SrY@Al3P5*gj5*g m TmZAP9یRr+Bl3VNAl3X f fKf f AP9 Vj*T6V*T6r*T6r fNf3XͥBl3̀5*gk̀5̀ Bl;VBl;Jx:Lx: t tNx:XͥBn*TAPjjTڽ`NX+*wcT܍U۱r*TƪXNX+Sr7VmP+Bn v)ʩPkB\NX;JX;XͥBnN`*TTfP6cTfj.*wf:*wv*Tft*TSr7 \.r9T-r9V˩PkBrX@*P bP bT\r|( P.APL%r9K` X9*r:*tT.l*T. \ӡ \6r9lAr,Sr9Nl; v@*P0Sr9VSr9 j6Sr9ʶSr9 Rr9Sr9ʩP9 ӱP;*d*TNSj,l5*:*۱j*TnBv(KX+*cT܎5өP+Av۱r ۱r:*c`۽P.۽P.X AP `` f(K`3Sr; l< j.*P+*rۋSr;+X9 \9SP͕C^@*TVөPVSr;ZPV\*Tng` l5nSr;SrlbP]rt*TnSr;ߋŚPbX+*XRr;ߋŚ Η^;*T\Bz r*TT\PKBzK`5UtT8rCf AP3CV9Cl= SV,JBX+JBX:JB`5 Sr(Jǂt,JJRtUvKұR6LұV*P:̆ZP:̆ZT(ƪT(ƪt*St,-'St,-'cT(gX9c!( ЩP{PW@B^ {t*P˧St/+B^0V.St/+ZP\*ct*T(kT(݋ʱ ( X6t*VsP:XͥStMj6T(LX;J'ct*Nt7TX9JwjNAt*t:TmCtNr(ӡv;JCP*Nf,Jcl3NXKXKAt, T(t: At0Xl7 At0Nl*jJl>TAt@Jt;JrۡjJP5NP5NBv( Bv( St; ۱f3ԎRt;VNX9 ۱t*nsv,JP;J`.ԎSt; \nl*nT(VsT(nRt+StkAv3VrT(nAP݌StRt;[BvVKBv r:Jˡv,Jˡv P;XͥBv9fAP]AP]ΦBv:JCT(5U(5t:JCt*`, f; v*u4jR̀:LBPPGөP;FKP;FK jAP; UAP; VCP;RvZP;\*5t*5x,j\PX>PBtKv0 `*lTx;VC` ۱r0j:c`: ۱r0kBvLҩP+j.c`AfP+ T(ގY+c`AXͥBv0[M`*Tx;ZPV\*ot*ot*ot3 l<]өP=LZTjc jcTjcf@X9 Cr@4TMf9 USz,BT өP=Jh cX5Ǫ` cT+WSz\өP=VSzNt*TAP=*B`3X+X9XNf3VNB`Rz VsTRzSzPr;gX+g`5ճr*R|K VS*U ( Aij AP@ Ay:@B#H8T,btұZKBX3NbtKU,SP:Xax:NŃR<+Cl* aX3 R ,la`3`(KU,bP9kʩX+TNbX*֊RVbT悰V9 Z`‚T, zXR`3XͥSf VcAX35cT+Cv*֌ʡj;5crKŚR9ԎRfTcT+C`55crVSfTj:kJP;[NŚR9ΖөX3V*r@kJ`;KbXlfTX3VJaX55c`(5c`;5c*֌ۡ KCAX3nǂf,ݎAX3nCX3nC KP֌j,kCAX3*SfJTfjǂf05P VcX5 R(kbf5r:k6cXkafLŚ`5t;5P;5P;NŚl*lfP55t*lv{j,k6l5NŚt*lƛr*lƛv,k6l5f6 š`<5AXLav0št*U۩X4VmZX4VmT,өX4֎t*cV bl;alALbtUr*VMg˱V*VMgj.`6NŪl9UrbtKŪx9JŪx9NŪx9XͥbtKT/-S` [A^DT/؍ƫT/؍ƫtfv( vP;Nl lKnXjR`+zn7VNyn7zn7Kn0NnKnKzn7 /ۡ /X^f[t; r(R`9-Rl9 r(Ζө^Mn``5t,w^\wS`T/NX3 cX+ c`5ӱf3JX+ztٌ T/5r: cfKX3ӽl3j(۩^ک^`5jl`eT/n`5NPLzzYө^jB^Jzz, cT\PƂf6V@zl9LrKrjZ^3[VC`5`55l-[zl9T-gP5lJө^4˦Rl*eS-lzT2TjfST/JZ^6 Vs^6LzTmS^6eT:˦P;eSfKzTj^6mU/JyT;T/LRl0Kz`*nz`9t Kـ t;VNr:&c^6Kbr0NX+^6kzder:&cT/ Vs^KX9er0et;V6SleX+Frvctv\vA^6Nl5VsA^6eT/MRl6+zl:VNzl:NtKt@vSlcA^ynZ@zn7JneX9e`e`5e݀C^Nt;JznL%ө^jzrKV-BT/[nSl9e˱P-DzrKX6Wu{V-DzrۋSl9͕C^NX6Wu{T-Dzr Vs^ʡn/e˱l^Kzr0ݎSl9nT/[^ Rl݌zrkzrKzrRl9Nx:Jx:NXMǪA^6e^6ߊSl+Sl>J`5e kc Ly`Nt4+ LCA^9NcA^9Nr0t;䕃vt;T5r0bf,+P3+P5+T/^Nr0ݎ5Sr0ݎUr0ݎU[hW۱jꕃvRr0ݎU\:+X5䕃vUr0ݎUӱj䕃v0+`ꕃv0T t;y` UCA^9nCXWP5y` U퀐WP5A^9nC`A䕃v0T d Lj6+`t; t;X t;X y` LXWjtLƂr0ݎA^9nGC:+h(Ky` V,+h(FcA^9ngkA^9ngkrWn䕃v t;łr0v{rWn/V.r0Φr0y`:ꕳP;JhL̀WFC`5+g Rr6kzl4Nh0Mh6^9ͦXWFl4Nj0ꕳ`*lTrL5cA^9[ TSX++gT3VNj0Ռө^9[ tWVfKj6Wu{^9[ʡn/ꕳl3 BTf\0j6^9[6`,ꕳl3 zl5cTPtWC`:NuŢhWCv/GA^9nA^9ΦhWۡf/zR)+zR)KSxT/^*xPtO%x*S:ȋ $ȋұT/JZ^< Vs^jBf(jt f(2Cwdl2cT3P5Ռ TjBǪf,T T3Zf,TSX+SXKSXRXҩf,Tmt:Ռ̀ Ut:ՌT3cf,TMZf,TMʩf,TMT3cT3\ UT3ƻT3*PSX܀dT3*X CT,dBP:L5crjBX9Ռʱt;ՌʽXkP9XͥP9Xt,Ռj.jBf@ՌX:jBt vjBT3jSXRXҩf,TP=J5czjBX9jBX:Ռj.ՌRX-jjT3VkX.dƚj+ȌEXN5cP;2cX5 2cX5 SX4VMX4VMh2cXdƢj;dƢj; 2cXRX4Vm 3Uj,ՌEcvKh4 2cl5dƢl5ՌUST3VMbT3VMbT3VM\ldƲP 2cn]ЩfK倪+f HCT3Vj+SfLfLt4Ռt+'SX9Y@r2J5cdK5cd:Ռ^dl`Pdtǚj+ȌcPU@zjrjr,N5cXP5cXKSX> jLbf0ՋR`KT2 R3jSX+ rL%ctL%\L%өf0VmX@[T3cXUT3XZ- jP5+ZbtղVҩfVkgAfVS`4jSf0jR`4ԎS`4R`46`jvtf6P5P? FCX+ FCX: FC`5jT3-JXbT3-ʩf0Zөf0Z Vsf0ZJh, FcT3XMR`5ՋR`5ՋS`5Ջөfҩf 3XjN5\bT3XT3XՂh悱r\ҩf j0jTjTjT j0 US`5 T3X Af cfL5djX9 Vr: Vj. VT3Xmj; Vt 3Xmgțn6T3-eCV얲r+jX+ vrvctv\v\: vөf0pPeU6k`5fAl6ft*M6Z*Md*Md:&cAl6+Sl2JeX9&ct*MU6eX*Mcl6Sl2Xͥd6NelNet*MCX*mfNeX+6cT6یөlKl3b`+Ke`,6t*mT6lTlKSl3fdfl[@nfrʩl+Щl+rT6ۍCX*ʡvfrKnjT6ۍC`frRl7VX3frҩl+r:vctv6_Met*-P;f˭`5ԎRlڱt*-P;Xͥr+X j*-P;[NeVjg 6[Nt*mB,fX*mcT6NT[@6bTRn(kSl7PeTkX3TmX3TmAl7VrjۍTvcj0OX:cTSn0VN`,vl;Tөl7! U[Al nvrʵ`JeX Rn7VBt*fKeX9vr;[nPe`*vj.vPf:Cl7vӱTSn;VNeX9vT*ۍ7CX*ۍ7C`5vP;݀* Щl7X* 8l;jZl7`fl7 Sn@jSn@Xͥ݀0N݀3Vk݀9SnڱV* ^;Xͥ݀9өl7/۱r* vNeXKeXLRpTn5l>TnS|)lRLRJe`Nel@͗:͗u*|Ler*cT6+T6+S|.Xn\L^Je`+\*of,T27d:7\*oS|4TMer2VNer2V.S|Al+n6Kel2Ne`,͗t*Ot/Jef`7cTK`5PU6`өl@ێm;Ne lAVMe X9-cT ۩lA a5Ny4Le UQtHC 9T*RPkʡR)+ʡR)XөrT VsrT ʡRJSP)*RT9JjJ%[|5*RX+UrJ%cb(LCd\ T9JT9JbVJ%{P+*R`5*Rf,UX+UX:U`5*RfKʡTPCd7NCd7NʡT2*Rx7UT9jZrՌSPRP*jX+Uڱrrt;Uf@Uj,NCvKCv:Uh*jt4TMT9TkjXیʡZ;FCT9TkTP.UrU9Kɡ`.Hst `*Ar(+ʡh4JCh*`5*T9Zr( Vsr(VSPSPNCtRT9T-`,*XPCXZrKʡj0LC`5*x4UUh:UUrLұT9TMZr ʩr T9TMt:UUj.UUT9TM{Z;UU!9TʩrZ ҩrZ ʡnRP7NCn*X9Uur:UuXvrvtvt;Uuj.UuU9Mʡt/U{VJbT9T9NʡtPCt5Nʡv,UcT9ԎSP;VRP;VVsr+SP;NC`5*vT9Tʡz*jǪT9TSP=XͥʡzKʡ|ʷBT9oZT9ӽ 9e˭ 9e˭:U囩r(ߌRP+ʡ|3VNʡ|3Kʡ|3Xͥʡ|3*t7ʡ|3*T9PC[0KCm3$f(UP:UT9Vөr(NCY*Zr Kʡ0VNCa,* X* f@UX:* j.Ur 0SX(*BX+Uj.UT9JTX(*B*̖cT9Zr,SX(+SX(+TX(SX(۩r, Vct E\ Eөr, ʱP:*BX+Uұt \ cr,ԎRXKʱP;XͥʱP;ʱP;T9j`*B`Lөr,fT9j 9jT9jf@UzKSXҩr,փ퀪 T9jgT9j˱T9j˱:Ur,$Bx9Nc^,UztKTX+UbT,Ubv0LcX 5cT9֊UP3XͥʱVT9֊U T9 `;*ZR3*ZR3*Zvk TJc`;TjRX+؎RX+Vsrlg˩rlgT9 өrlv/Xөrlv/*Z 9ʦʱVlTX+Ar,$btRXNcd%өr,LcnucT9T9cT9cvùuX:*b`5*btuBr,c\ʱh(XMʱhKcP;JcP;XͥʱhVSX4fT9 `<*ǢvPcXҩrk6CXƚP;JcXjҩrk6C`5*Ǫf3frk6C`Z@ʱj j:Ue 9mRXKɱl3cj˦XRX7Ncvөx3TNcTʦʱt*Vmeөr,U۩r,U t/ԍRX:өr,NcvKcT9nBf*`5*tkRl<$ڡjk 9֎ʱv*j6Nc`5*t:*t:Nc`**T,*r,_@ʱ|*fT9r,USX>*KrT brTR`R`)$Sv*ST9JZr0S`*kʩr0ctL%c`5*SX;*StR`*ctS`2PXBAr0 US`4N`5 `5L`5 cr0t*jLҩr0tK`5 r0,UFP3XR`4X 5Y:UFP3XVsr0̀f:UFl3 ۩r0f\0NhmfsU9h7JnKn:UFjtbrR`5Kj.XͥjKd3Jd3Nd3XͥjPl3XjAr0lfS`7Nn3*f*f*f,*fKn3X5Br0$өlLҩr0Lt7Ur,Jn*X9Ut;UX9UX$`5Uj,NnKn3*j,Nn:U!9Nt:UΦөr0Nt*T9N 9NcAr0t;$P) v$X5H 9nClL 9nAr0VCAr0VCtLXLP3HU9؎T9؎jlSrLЩrLrL̀lSt,U`:J`*S`; c:U`:VNv0LҩrLj.U`:*T0Mv0,R`; dT9Y:U`AXͥv0N`8K`8kv0S`;T9nArݎS`+Sl(*gCX+UΆj.UΆT9Jl$gC`(HΆP5HΆP5$gCtMRlkT/֎Rlkʩr6ՋctMb`5*gSX;*gST9JZAr6Sl*+l*kSl*Nl+،Tlҩr6OT<KX:NvcT9[kT9[kT9[kSl0U۩r6NtMƂl4k6l4k6 T9[j,*gX:HV 9[M۱ 9[Sl5*ga:*gT9MZr6bv&cf@UfV5Nl2Nd5Jl2*gT9Zr6[Sl+SlRlNT9mT9ZrۍSl+SlRl7*gX;UΆv;*gXKt)*g 9NtAʖ[rM^Z5Sl:@ev9*g*lˡfM`:6P9*gv0[MtEXM*g-^Mj*g3Zr6npv-[t6jVSl:fT9N7t;Jtʱj**g9VcT*g:jT9N7бT;r6nv*gR*gRNt)[Sl:]Sl:]棱jMK|:UΦӥr*gR9ktTZj.UΦө^,Lt*Nt*gX9UΦӱtMkr,UΦӽP;Kt/NbT9NBT/Xͥt:Xͥt:XͥSl: t:[Sl:T9NVMP+*gv6_Mt>Lt:j&өr6T9NV:UΦ`:*g|Jt>[nSl;KT/NT/NT/x*g^*g^,*g^Knwrwr6VSlSl>UKr͗BtͷRlU@|+JVKV:Hcr6k|-m| f, $gXNjWlKj*g`5*gtͧlق0VNa\@ق0VNtOCT9 ̀OKXOKX:U`*SZ0N`-O`-؏Sx*X jOkr4UOka5*[r V,Ub̀oŪt:UbT9ފ۩rlҩrlTx*cX9Uǚt;UǚX9UǚX*cf@UǚX:*cv0Nf;*cT9^kx0T9Lǂx0Kt*ǃX9Uӱr:Uӱt\o6cT9lT9-h)JRKR3*ǣf*ǣf,*ǣfKR3*ǣtr< h7NnNn3*ǣf*ǣf,*ǣfKT/UWSX+UWSX9UWSX:UWS`*ǫ^0njT9^M\zU9br<jʩr<j 9bT9\ORx:N^O T9Zr<݋Sx+SxKt/Xͥt/X5BrX-`.`5A|LGr>X EP9 *gT8 "pƊr {EPjҽR6TnB^)*ҭPkB^ {t+V( VsP#(lP BP+BX+BXjZvnڱR6lڱV+Ԏ5ct+Ԏ5X+Ԏ5XjʭP;VNBXjBP;X͵B`= V(^jXbV(^ӭPZx)]sXp^;Vn^;V.[x׎jʷB\+[x׎ ` 勠x4+BjW۱V+\+\3 ūf,n^ZC"+Ǫl]cn.걀TzU@A`+TՃXTjTj]Ճ"zZՃPT[z]ՃP+TEP=[-W(jZ|kBV3VNBV3XAX't+AjZ|5j`5 "(V[pt+pV(`dX>nv  LV+0ZV(`*BV( cP@* V(*BV(*BX ʱP4Vnr,ӭPUj ʱP4]V( zV( zt+pf"(` Bu+p"(V;[ BY+TZk g*V+T08cV`pV`pҭP VsP Vs̀D jV$Z]ӭX(bTK[P*[ӱt+JeV,jv zkbT;XcV,jvkBvjV,jBjBR,nBR,NbV)lbV)l[P+VmBX5jBX5X͵bVnBX bv+jbV+jbVՊZXZP ҭX ʭX V,jV,jt+j5X:݊Zl*يZl*kbV3J[PpBj,nBnڊZPkbV>mbZ+ŪXZXV,TU\3jj ժt 5P 5r,[P3VnBXnBX9݊rbfV, VsXҭXnBv+aj+EXZ@aj UCtʱ",Tbj0BjVCEXZ EXZbj [PnBX cv+*t+*cV,Tn\PK[P9݊^+*\PWڽV,ЭXkbkB^)jB^)JbvK[P avpB^ {rۊڽv9Mbv/jzX)jZR(Ռ[R܊Bd+V V+V ˱V+V cX)ZR(ƪVJҭX)VsX)VjZRkbP;VnJvnJv,݊B`5׊BT+^ՊBT/VaR+"T "T aRnJj;^bX/EX)Xj+V 6P;֊`;ԎZRlj+vV[Rl\R݊X+V"-Rar+Ct+V*cVTjV+V*c`5׊X-݊t+VJat+Vjbv܊r+ӭX)kJ\.jJ\.VnJ\.X͵bx5يdՊdkJj2]t+ۭX)U۱VoX+۱V+V\+VEXKЭX*ԊbP+V@bP+VMZT[TW,jҭX*TkRZKjXjZX*,Rf6bP3݊Bn+ EV+ UۭX*TmZX*TmʭX*TmV,\+ uP;֊B`;ԎZTlڱt+ uP;X͵bP7j+ uP;[TkfEX*Ԏ[T(BYKjK", aTڊbtKBXKBXnRVnRVNbX݊bv-lR`o6X*lj,nR`;݊bzKłXKłXKłX9݊bz,݊bzkR`=X5X*֌CX+5cP;jRfjV,kʡv0[-Rh)VnRj*bv+U t kbX bX]5P;bX]5P;ЭX*VmC`:֊bv9 cV,ˡf0KbX]5`5׊bv9 D`ڊbv9 dX*VmC`AjRjj jKź`ڊbv0[MbXZTc̀+ bV,,ŚV,lJX+ bX*؊ZTk5X*؊[T+[TKb`+X͵b`+[TlcX* ˱Kv9nRhيP3j+ FCt+ FCX+ FCXKv,݊P;X͵b`4fX*˱V,X݊XKb`+b`+JX+ v{rՊ^ZTۋӭX*fX*f h(+[T0VӭX*cX*c̀+ X5Nbd+Jz`K%SPnRXK%c",[TZT2X͵bd3֊V, X FcV, jK5CP;bf(jgW, C`ڊrVӭX*zK5CP;[bfkRP9jRP9VnRP9nRP9X͵bf(ւV+jƪ`ڊjV[T3XbfkbfKbfZTkRVՊXKe[rKe[t+ʶ\+6v(kRfLlKej0jKej0kRfLZX*VXKej0ZT v0[mRh4NV,Ft0[ZT6 l5X͵blMZT6ͦcV,vXKel:X͵blMlKer,nRhKcV,v˱t:X͵bl[lKeX[Tۡj;݊tO[TnvՊtO\+Vr<fX*[MT;V,xnRj; VCX+VۡhjZX*[mjV[T܊P;֊P;jRrKbl9VsX*[j+ʖC`nRrZTjfKeˡv܊P;[Nbl9Obl9݊xKeP.֊n(kblV,wV,wV+ƻ`5׊W, [T9JZT9JZX cV,UjKcV,UZXV,UҭXۭXVKV+*cV,UFP3j+*jLlnR`4X 5X+*jLZXf0Kbr0tkR`4X 5Q;br0K`5 dV,UFP3XVsXpR倰kR倷݊o;aX+ BX+ BXkSv,݊P;X͵b`*fX+ jkSv0ZP+֊bX+ZV<Kbx*X͵bx݊vՊvԌbx,5cVO\+֊lkS`nZT;Xbx.bj5֊ZXkaV,֊ZV,V \X1Pbh+ZX,ZX4]ŪEX*bP݊źX`ӽV,mXurur@X͵bnͶcV,mcV,mcvՊź |+bnڊźjՊźjkbX5݊źr+V,m\XK[X7]źV,V.bV,V.X9֊dڊv[Z(kjTՊBX4VmbP*X͵bP4fX- +V EcX-ZZ(ZZ(lbPَZZ(lʭX-oct+V ś`5׊Bf;݊bv+VڱV+Vڱr+VjB`:ڊbv0njP;݊bP;֊bP;jjTZZ,jVK[Z,ՎZZ,VsX-jVKjR`=֊bv܊bvnjT;݊bTŪX݊bTՊbTK[Z5ct3bTKtŪX3NWct݊bT,݊bTkjjŪP݊bV.[Z UVbVbVbt+VU[jŪt+VUcv9fX-VMZZ5ct+VUӱt+VUR3֊btkjj:X5X-VMj,njr+VcTʱj;jbX9[ZUV+CV+Ct+V˱V+VjV USV UۭX-W,f-b`l6Cl9݊Ղ` ҭX- ƪ+V jSv+V t+V ZX-Kb`3֊ՂXhnjf܊ՂXjR3֊ՂX+V VcVʭX-X[ZZZlZZlǚW۱j,njjV[Zlt+V V`=֊Ղ`;X5XjZZ3ԎZZ3Ԏ[Z3VsXjV jpjX݊՚T;jjXZZ3jV֌l5݊՚T;[njX-[Z3j[Z3[Z3cVc`5WղVmCX+V6v0[mjr,njr,j+V˖cvՊղh+V˖v0[mjr4fV-GcV-G\+V˖v0njr4bl9njPՊʡx+jjPZZ9pjl*kbr6njlkbr6ݎ[Z9nVVΦVnjftūv+VcX-ZZ<Kbx:X͵b+V ",JbX5VX.VCX+UcP;jrjjҭX.VC`5׊bX9fX.VC`=VEaX9nrP+TjZ\9 j++ZV,WbV,WbV,W\++bXЭX[^<ӡv0[mzhLlnzhLZ^<ӱV+֋GC`:nzhLVV[^< VՊP5X[^< jţV[^<lkX9݊rkzW9ԎZ^UcVpC`5׊rV[^UV,bTՊSj ʱV,X B`ڊkX XVsX0WmłjՊs`5׊stfEX*Z`:ڊV,nSX0Nbv0nłV bXkbXk5X1j"Y5CEX3*g"FX3T "ff(*NJf(*ҭX3pŚՊ5Ca5׊5Cu,VKCfkRPpŚT;fX3 cX3 cV˅ڱt+֌B`5׊5cP;bX.f"V[fkŚvՊ5cX9[fKbX;X͵bX;bX;f]5sVkEX,[fkCEX3*[f+ڱV,ʡvՊ5X9Ԏ5X3XCX5Nb`)VcV,ʡvkŚRjV,ʡv0[Mb`)VX+ B`,݊5P*5P;֊5P; b`*ԎUct+ BX:b`*ԎӱjkSl<݊5`6n\f0X:݊5^ksvՊ5^;j\f0kVڵxpŚ\Zf0kf*šfW5PnŚh݊5`;fX3 cVBX+ VcvՊ5XKb`5jVB`ڊ5XVӭX3X cT0nŚj8X3X cv+ VXnŚr0Ob`9W,VLa`<݊5XkrԌb`=VUSVʱV+ cXkrnŚz[f+VVWiڊ5EXY5" ЭX.š̀֌EX3*CEX3+ahLef*šr,]5`kf`5W5`"Vxkv{j0MbvkCVoZfkbx+nŚVkŚ\ksV+֌bVOVOPkl5݊5`=֊5X+֬Zf=jŚXkcVYVsX4tV[h(WP;ЭX4trX;Zh(WXrX;VsX4悩V,esX+ 岹xpŢ\6[hjŢj+jŢj+X͵bPnŢr*ԎbP9jZX4TNjʩP;bP9jt+X4ZX4V, UV, Ur+xnŢP5݊EcvՊEcv0ԊEc`vf+",kEX4.h]aX,¢v9*¢v9.¢v9Oa`+ 沭V,e[V,,f{t+ 6P9j+ 6P9j݊E`;TcX4 C`:jŢf*ӱt+ 6P9VsX4 C`A*¢jӱV,LZX4[hJcX4ۊEt+͖Zhlӡv0[mŢRLlnŢRLZhlӱV+͖`:nŢRLV,-ՊEr([h6UX4*ڭX4*Tͦʡv0ՊErL̀+ͦʡv0jV,MC`:ft+ͦʡv0kŢT9cV,MC`:nŢT9\+ͦʡv jV,MC`A֊Er,ZX4*kŢT9NallӭX4kblbV,͕C^nŢ\9SX4+`*l\h6Wu{TfsPpŢ`5׊E`׊E`kbl3ҭX4 {jfv0[mŢfVӭX4[mŢj݊EX;j+Vc`:ft+Vc`:֊EX;Zhkӱt+Vc`:X͵bl5Jbl5jŢj0j6X4[ cX4[ cV,ӱt+V`5׊E`A֊E`AjŢj Kbl5XVsX4[6+VӭX4[MˡR3֊Et*5X4[Mˡvfv9ԎZhnCXfv9VsX4[Mˡv0[mŢj]jfv9cX4[Mˡvk\hnClfv9ΖӭX4[5P;bl9 C`Z@bl9 cX4[5Xfˡf0Kbl9 \+͖C`AfX4[5Y+͖C`AjŢr,V,Mal݋UcV,mZhkbl;jŢvkŢv0[mŢvjZhڱV+ͶP;Xan:pŢr+cX4^5X4^.ZX4nkX`-Kbр\h@jaPV EX5 bP;tV[jVC`:֊UC`jӱV+V jLҭX5ff0Zj/Zj/ZXUc"+a\+VcEX5؊UR3֊Uf+V "LZj0jŪXct+V ҭX5+ڱV̕CXsP;nŪ\9VsX5+lX5Ma`ӱ"L V,ȪX5XUEX5*'j4TNEX*ª`VcEXLajVt+VFP;jŪhjVv0[ 5[j6l5݊U`5Ζ[j6rfۡv0[mŪvf۱V+VͶcVmVǢjfTfTՊUj*UۭX5bVWSj[j:֊UӱfcX:݊Uӱr+VMVt+VMWnŪPcVV[j;Xbv+[j;X͵bv0nŪ`]@bv0.\j;n[j;fEXbvX+Vm˱t+VP9bx XSXLҭX5jB`:X͵bx+jŪVkŪj*jVv0[Maz\Ur݊UX5 抰j@]UX+meˡj˶PnŲl9j+metV V,ʖX+metՊe[r0+bVLt+metnŲl9[l+[\+me˶`AVnŲl9XVsEXZet+ ۭX7TnZX7TnV*jh.[n܎ƪPh5P;bPUۡf0jh5X+ XjӱV+ Xjӱt+ XjjhNbPnźr;^bP/ҭX7VmbX*vƪPkźj+Tj\n UۭX7VmƪPnźj+jźj+VMZnڊUSXƪX5pźj+VmbXӭX7VmVҭX7VNgf0kźr:[ 5Xl5 cV+P3VsX7VNgf kb`݊uvՊuvkźT;b`VӭX7j[n3TbfkbfZn3֎bfkbfKbfZn3fX-JX+mf˱V̖cV̖cV̖\+mfX ZX Vj6iNbf6nźfLlfr0jfr0kźfLZX7 Xfr0Zn* v0[mźfLӱVmT0kbl3Xfv0LVƪVƛvՊux3fX7[nbljV-C`nźr;jźr;KblZn܎ƪVMZn6kbl:X͵bl:nźtkbl:VsX7j+ͦ`nźt-bl:ΖӭX7+ͦt+Ͷn݊utan݊uˡzՊuˡzpźX*Ԏbr,jZXKjcP;br, cXKCXc`Kbr, \+-RP;brjV[B`nźX:݊u˱t:Tmbr,UV[ӱV+-XctkźX:W[lct0[mźX:VӭXKX+-`=nźX:-br,ΖӭXK`:fXK`:֊u˱t:^cV[r0Kbr,`5׊uzV[n9Xj떃X+-V+-t+-j떳r(ڊu\9Vbv/݊uP;bx;֊uXXttՊu`:nźv0Zn,ZX7bPيCfՊCfkʡ`[r(lt+VX݊Cf4Vm[r(LbP5kʡj.jʡj.UۭX[r)`K#\ {r+rfkʱ\jZX97C`5׊cx3fEX9,ʱd݊c`݊c`V[rLEX9Ja`*Y@b`+֊X+[t+V\+Vj+VX+VX3l9P;b`=fVz+vKb`=֊X+t+Vփ\VNbhيvLbhmfsTيvV l.n[r46+VӭX9 j+VBl9`V-X+dV.SV\tV.S+d+P+V.cXV.Xb"\VrmV\{XLb"paV,jv0[mҡfLlKj0jKj0kҡfLZX: VXKj0Zt*TmaT܎[t*VmbT UۭX:BvKbVՊSj+VmbTڊUt+NŪXnҩX+bT VsX:ҭX:[t*VmtƚX:UBfKRKRՊS`)nҩrZt춃j+Nv0[MbT9mV,*`= bT9mg˭X:UvrKbl5ԊcrkұT9ԎZt,U\+ʡv0[mұ\9 cV,˕cP;bX3jbX3jZX:VMtV[tP;ЭX:VMtKǪ`;ZtXKǪ`;VsX:VMV[tY+Uv kbX5l jKV,+cV,+cV,+ct+Z0jV,+\+lK`nұr;݊czKXKXpұr=nұr=X͵b`*[t0 cV,LB`ڊX9b`+VV,U[t0W cX:ڱV+檡v,݊jZt0W j+檡v0[Mb`kb`+b`+ЭX:V,U\+V,,JfprԌa`9krK˱Vc",,bt+cV,,V,,gV,L[t0ݎZtK'ӭX:v[tt4[mah*t4^mbl3Ԏbl3ԎZtjV, ˭X cV, jKwCrk\t7,[t7NZt7NbV,ݍCl+ʡV6nX9ԎanjZt7Vc̀+ʡvK[t7Vj+SR3֊T bn0k`:j`:n`:X͵bnklي`3jlZt7[mŪX+fX5pl[t7[mŪfKwV,ͶV,Ͷh+fV,ۭX:+ӭX:+lڊۡRLlKC`3bvlӱV+nJf0KbvljKC`3Xj+nJf kP) dV,`AnP) \+nv0[m`5fV,VcXZXcV,VX V,X+nv0[mr6l@jr6 +bv9ӭX]\+nu+nv+nvՊx,5cX]jKT;bv9jV,.S`= bv9jj,nf;[bP׊C^ԌbPkbPKbPZv(ՋƪVJj;݊Cf+ l9cV 6cV 6\+V V[v(XZv(XZv(XҭX;V Vjkt+֎ڭX;jJX+֎ڱV+֎jkR`ڊcvkڱT;X[v,Ζ[v,ΖӭX;j[vڎbXV[vfV+bX9[vUV+P;֊c`jZX;Vfˡv,݊c`jV+P;bX9V+GPnڱr4X cX;Vv0[mڱr4X jk`5cX;VV+GXk`5j\v VcV+GX9݊chKbX9V+G`:ڊchLV+cV+cTkX݊crNbXZvnڱtkPkڱt;fX;nZX;nVKӭXWVcXWVcV+gjkgvkgvՊP;njZvjVl5݊P;[nj-[v6^nx9jx9X͵bln~+cVҭX;ւP;bl?X ҭX;X;jkgjkCv+.RXkCvkPV[v9jg˭XJt+.Rt+.jkXjbr0ӭXlEX v9lЭX<kXc`֌Zt,Zc`5 cR6k6cV0XZt,ZchnӱjcV0zj;[tZ+^0kӱjzt cZ9TMX4VmXVUS`:X͵X5Zt bV0BX4VmX5ҭ`:VͅrjLǪP5׌X暱V+UۡjZt,6r0mӱt;TjӽXLBlLBl9jӵP=/Z V0] ճr kz6^Vs`gt+srLׂx9jӵ`.^Ecv+sr,ӭ`jL\L\ sr.X͵\9\9ZtJjf+ΕCX-l\tJҭ`:W\+Εv3jӹrnƢjLtLt s`:nӹx0Zt.n\<ݎZt.nZ̀+`5 st;X5`:Oӭ` {r4[ ^mZt/̶{V0݋XLbr;VZt/*c`5 {V+ҭ`ǚV+f3jӽX=lV0 Vs`V0Vcv3 {j,^-^-JX+er ^-Z`fjLl9 {j6^nӽl5/Э`fPkӽl5/J̀+ex9jӽl5/V0VrLj+CV0+rV0kgf+X3 {P9 {P+^>V0ˇڱr+\tٌj+6t0[Ztٌjkf3fX f<Vӭ`:XMŪ`= TcV0jV[tjV+VkTLX[tZڡj; Z,ՎZtZjLXV[tZ˖v0[mj.VgV0bx6n\tڋXLXjZtڎʡv v,WcV0crZtڎʡv0[mj;Vۭ`:Xmʱt;jj;V۱V3 v\ZtZۭ`:XhnlnlڎZt1^Mj+.ƫvkV0۱V0۱t+N[t3f0kf0Kf0Zt3 c`MڱV+nfSv, TZt3 j+nfSv0[MffZt3ҭ`m\+nff+nff; f+̀+fLGCv3jP݌[t4Tm7\+`: Z`: V0EKr+ƢX9jX+V0EKr4Vmh0n`:jh05ӭ`:LcV0 ӱt+`5 t:Xh0c̀+fv+fv xZt4E` j, U[`:[j* X+[t l)Zt V0-V0-bV0-bXLg˭Xpr+VNl9ӡv0[mr.T C`Z@l9ӱV0-B`:jr.T cV0-B`:X͵l9 v0[mr.T dV0-cv+Ζj;ԎZtUۡvkr0VmlLgXkl9\+櫭`:Z`:V0Wӭ`*rV0 CXLwCP.Uۭ`*rt+ʡ\kP9 Vs̀+ʡvLwC`;Knl\t7NV0 l5Ԏn(fvpP;kP;ՋZt7NbV0 SX9 vKnV0ݍ5[t7lZ`k6\+ƚV0ݍUӡR3 j:Tҭ`C+ƪP;njLwctLwct j:VnX5+[t7VMҭ`\+PLwctLwct r:nX9Zt7VNV0 XLw`;X͵n3n3ZtJŢjLwT,ӭ` bV0mRjLw6CW0mV+6Ca5 P@ X(kf,Zt cV0mB`5 X(/Zt7V0ͦCf, t tnl: t t t, tkl:f`Ml5 t:Nn6ӱV+fX:V[tf` l7[nPLwnfvLwnfvprkrkn9[[tV0ݍCfLwP;nkx;jx;nx;X͵p< ւP;p< ւV+C`-Kp< `:5kx0nx0֎Zt8\+ǃ`;r( r,*Zt9 [V+.rr+X͵r,*ҭ`놂V0]uPkX7ގr,ݍڭ`Kwcv ˱t7jV0]To6`KwcvkXKӭ`-Zt9[Zt9[ Vs`[t9mZ`ﶃ\+.ǻ` n;[t9mV0]wV0nP7cV0Z(f`:jӵ` ӡv0] V0ڭ`:KcV0jLcv0[mXVӭ`:Kӭ`:kt,ZjZt:-5cV0EK`5 ӱhjZt: VCXLc`5Vs`:v0[mX5V[t:VMt+NǪV0U۱V+NǪXLcvnXZt:Vm[t:VnlLcvVӭ`:+׃X+N[j* Vn`+Vm[t: 6CV0FP9ҭ`:rp`4 j+NV0vCX+Nv nKtjV0vC` T0Ԏt6 cV0Φvkl*jV0Φvkl3ގtoV06V06V+NgXLzkl5TMZt:[ USt+NgjLVLV P+nxZt;Tv ۡf3 ۡj* ۡj*jP5Kv Vs`[t;Tm7`Jc`JcxLCvo6`vcV0ݎU[`bV0ݎUlLcv0[m`Lf+nP; f3Ԏ[t;llLfVӭ`l6cV06r+nX9Kvٌӭ`l6c+n`5 f3 fLTLT;vjt+nvk`5c̀+nvV0VSfLTK[t;XŃ^+nx0 V0Vs`kvӽXL\<V0Ζۭ`-cV0ΖjLv0[mlVӭ`-ӭ`]ڭ`]ڱV+nCv v9jV0.R` PVӭ`]V0.^L˱tL˱t:jr,[tKkf+nctkr,Vs̀+nx; `)ގZt,۱t+nx;X͵v9Xj+nx;`]`nroV0.Kv `)Ζӭ`]l9 v[tLtL[tL V0.St+nv+nv x]7[tO\+nvLR+n˥P5kxbV0ݎKV+n˥XLRnxZt;^.fLRLǫlLǫv `; X+c"j۩^+NbVҭ`; Vs`+^k^Zv: Xl`Mvl\x9Zx9ҭ`\ 5[z`=nVkXʹX+XsV+Xsj* c\[zUۭ`=Vҭ`=VV+[zX9k\zւP;X9cV++XZ@X͵X9V[zfr`nr:ҭ`=VNW+[z܎Zz`;nr;X͵Xnt+Xۭ`=nZ`=nVKj[VlZ`=؊U[`=؊U[Vlʭ`=؊ӭ`=؊[zZzjVZzk`5 `5Vnjnj, փ\+XV\+XV`, փ`; փ`) `=VLVLPl5 փ`= փ`=Vӭ`=Ζ[z0-[zl9kl9l9[z[z Vs`=nvǛX+X7sV+X7st+X7sj׃V+XcV^z@XP3X"E`?k"l.b1` [AKp a5N,j%l,l=*BrD"5-gv9[O'[Vf[r+m5klnr:֬ʭlm\+`m`r+*5clkRʖJj-t+[j+[j-c"Tζt+*bSlneSjMŪt+ 6cl* l*ʦV+Jʭl*+[T2neSX;ʦjM%j+ʦV6L[V6 ʭV6 ʭtFl*]Ħҭl-vʦrʦrʦrkeSl9Ԏ[T;[ZT;[VsEl-gl-[TX+jPMjMj,ʦr(jeShneSht+GcvpeShj+GcvVӭl*U۱V+GcvkeShNVʶZrʶZrke[X9ʶZXۊ\mbl+k\,ʶrhmbVӭl+K\0Vne[`,ne[`5WĶrlmFl+XĶV-b[hmeEl++kecV6VNt+KW VVkekXՂ\+[[\++[\BXҭlڭlV6W {El.rV+Z̀+ZX:rrrX+cV6 Vsl.Z\.rtcl.Kf,梡V6 [\4Z\4BfEC`:ҭl.]ʶl.݌Z\>m|6JPۋW6 ҭlpe\+Elperpe|(ne倨jeVkeV+ۍ[nnet+ۍ\n0n`5vf.TʭlkB\.bf\ĖCEl9T@T(]ĖSX+X[ŪEl9El9VX-r0TĖj[t[r0ʖt[VcEl9.bv[CEl9Φ[r-'r+[Ncv+[N[r2ʖl9l9[r4VneX9ʖT-Gl9Kh-\r4OZr4]ĖEl9BEl9bEl9r Elr0ʖӡf+[Ǹ[NEl9 v/*b^-j-\t(keӡ\,ʦcEl:ʦcV6K^+Vsl:ʦӱV+Nʭl:+[t:+t0VNtke"6dmmZv(ke۱VkXmҭlʶ\+Ntʶ۱Vnv;ke`5ʶ#P3TCW6^jZxkj ۱V+/5c T/JR3@bdKXՋjL%[xkbdKXۭlԌ5XvZxkX:؊ZxkTKXSXV/5cP^,Ԋ[xKR3BV6^jElԌ˱X+/5ct+/5\+/5jW6^jR;jevKX9KZKZ R;X͵RK[x݌̀+/ӭl<ՋT/V rrzV+ObV6"6+brX+x+l<׫ۭl<׫V6l< \0VsP皡tx9ӱV6Zx:ne`5cEl=cl;VcVKX;lX;lZl=jڡ`3փ^oe\[W6kXkXZ|ner+jTm5v+64VmjmBvWKPWStW[P櫭r([|Usv櫱V+El+j.bXWkfWkf3櫹rke\9ԊZ|5WbV6_͕C`5櫽X܎Z|l6[|l6ӭl|5X͵j3jj3jJX+6VlZ| ҭl v+v+vf( Z| ԭl˭lV6_-X+^WzV6_MBX+{ZWӽ`Z|5 V6_M[V6_M[t+Y+YWket7ojӭlnrV6_MCrWP;v9j:Z|Ɗ|j;jZ|]ζZj+j+jWrWr+`W6_ҭlpeX+OZl>Z~+6+U[ـZg-ZقdV [ق,r+[VslA`$ʡR*Uct*[P ɡTU`Z$RfHP*j"9TkʡZ;jCv,*jX,*jXUڱrUjUV9TkjP5 v[Pƪrʡ\ʵʡ\.jC\kC\U媱veEr(ʡ\Z@ʡ\ZkcV9Vk̀eV9fr(Vӭr(nCt;VnCt;VNʡ`U\UV VcV9V9V9vX Vn,*tJƊP2*tʡhHEC`5*tTT ʡhL[P4C`*v0jUEC`:fV9 Xt*v0KʡhLV9 vt;*v jV9 Q;[P4dr(j V,*v PZP4*"9TͶʡnUucV9ԍP7VnCX9KʡnnCX9*tV9nSr(BfU[PkʡxnC\]@ʡxʭr(뵃tUsvpC\V9j,.[P U[PVNʡ|kC`5 gV9VsV9oʡ|3jCfkCfU嫭r(_m`V9Oʡ|]Vsr(n\U\P@]$NJXUZr,ԊZXU7[XU7W9jV9j5dUZlle>+jf-ZPt5h+j`5`,݊vUcEx+[R^ [R)jKX/bt+^*xZR0O`6nR3X-K`.KlLt^V<jPO"< ExK[T/Nҭx[T/Ex*يt+Jf+JZx*[T2X͵d3X͵d3Xͥ[T2݊XՊWTV>TӽV>TV>T[PK5VćXbV>+[XǚX5r+k6ct+k6\+k6\5V>l\]svfV[XV[XV[`5WDX jUEZ j5 Jd+ kdV@ZY[Y9 ҭ+j U "jh0 XC`*lh0j65 ҭ5 5 cE5 c5 cV۱t+` E5ͦ[k(Zk(ҭ5n\uڎlPT;l5 ~0 ~0 ~0.j+ƺ`Pwcv0 P:jl7v9Y Vɀ,VUc R65Hl2k`5NPkBV:@bd b T0*X BXK`.khlc V0c倬A 6c- Vs5Pb h\Aӱ5O7cvkPct3nXʱ9jʱ9jXΖc;Jڱ;JX]UӵX9XAVcPX(+BXrr5NBf, 5cP+c\3րdX(׌c\3֎rX;%t,TNʱP9br(ՋcrBV9MBX+*$ ۱PPY@'Af l4 *7cIPbr3+Bf0n'Af`5NBfl)t,Tndr4TNBhbr4TNX XjX\X+*WcX\ӱPKcr5n7PKt: *W{r j.*W\:*WIP l5 l5`,`,KBn3f<`5 j. ӱP9˶cr j.*{IP݋^۽P,TnJx ۽X+*{j,Tnb|^0V^Kcrbr VsPkt,TnYd,*{x(KBv/ ۽t/ VsPˇʭXd,Tnr2 ۽|^>[crP?*烹XұP9-Gct,JZP:֌ұf:JǢj;JǢj; cX(ct0nB`3 X: \,n'AvnбP]ƫ$(ݎct;VncX(ݎY(ݎIP+Wct;VX(ݎl۱r: JjngIP|܊|J'Av>m%Av>mбP: vObt@ VsP;jJX,t,ԎUcv c`, ct,ԎP;X%Al5 jgt,NBX,Tcz,*gP=nn cV9ʱP=nntv\ z$BR)֊Jj.V*X5IUc$Ū$ʽP$$) %Ij,$eT:VVtd=l6$R ƪXo6j;JŪr0Kbv9 5Y*TcT.Sv@JŪr0R$*Ռt;RX:JX*Ռt; 5cT6Śj,Ջ5t, VX9z$z:ecXc^6XRl3 j,˦cf(X`9K5CXKXKPT; T3MbfbfcfVsT3mSI Hv,mzT,M[X*悩P36`*ldl3 ۱Tt,mfsY*[Fcr0Keh0Keh0jRj6L̀,fT:V`,Keh0l4bl5 cX*[FXl4ӱTӱt,ftl4nRj6LӱT X*[FT X*۱h,MX4KTJcX*TjSTjSf3DCl9Zr0TMV UӱT<Sf,ƪt4*ȢX+JB$JZ$%Y`ZX+jc$j (Y IV+`@'YXkFCX+ǂtX5ʅIV.Tnec\,b\kbX++c\,kb`:k傱r X+X+b\KZ,v@ X+XjұV0Վv: b`- jSX+X bX+X ZVc`- kka5dIVZs$+X-˹^djLgtl'Yv( Cf, c$+%Yv`5kl5 jltlg˱V-бV-7b`;[V-C`:kr0 cX+Ζf0KZv 5`5kr0 dV-C`A֊l9j j. ` Zv 5ӱV-c`;[NX+N'YldEVdEvdEvZ@'YxdEVdEV:ɪjNPdcX+dCV[$+*tOڱX+ cX+ cX+ \Ol5֊B`jZTVCf@֊B`LӱV<jtOz,֊Bl9֊Bl9kۡ`5|Jr+&YPMr+d$+bf,L'p$X,VXldrKjT,VRVV bXB`5bvVڱVVj.VR`=bvkdZ,cX:bv:VRxbvVNǢr,EX:KǢv0֊E`vX:t;̀,mt:hpBVva5ƛv,7CX+7CX:7C`5ƛv0[EP;[EP;[NǢf:X Zhւr,o`EtEtVshfhfX4`* 8cX5TjbPkŪR3VUCfUCf,J`5RX5jZj(Vsj(ՎƪX5jGcv:V X55cP4֌bP4 Vsj(k6cX55rƚXUCX+cP4lX55j.f:V Ec|UCl9V EX+V ErfX+V ErUClUSh7VMX+VMhڎUSh7ӱj*MǛv,VMx3ԎbT7CX:VMx3Vsj*MǛv0[MRSr;BX cX5JǢj;VMұt \ `*VMźP3cT/ƪ^ڎUSPkŪ^ڎcT/TmX5 UjUSPU۱jj;zjKcT/TmcT/ BjlZt SX SX+VM˩f,cTjұj*XN5\jX5 cX5̦cjMZjMұjMX5̦Xjfr,XʶbX5mʱj*ۊӱj*ۊcTbT6GcT6 ӱj*X+VMeP:KǪlJ\ʖcj*[cT6^mʱj*cX+VMevbT6^mX5CXˡ\r(ƪX5CX4VmcT6^bX5C`5r(Y5UΆRX5UΆRX+VMT/USl( Vsj zXPUX5U۱V*X5Ux۱V*`5o;ƪrNǪx+Ǫx+Zj*-CT,VMţrcT@ BX5P5P3fX5P5X+USU3ۍt nLŪX5j5Z,Vm5ڊU[ x:VU[ x:VNǪP5+ǪP5+Zj+Tj.VmX9cVӱj+*ǪXkŪXbV,TVs̀ڊXbr4VmcV,TNǪX-ǪX-Zj+gj.VmBl9bz6^U[P=/бj+gX+VmBlbV,TXkŪX4JR[rڊ X Ecj+ұj+XŪ`5U[z,VmtjXՌ̀jj,U[T9XŪlf\0ݎU[T9X6`U[T9X6bl<n/XU[r:tt,cVEcv:VmeX9VmeX9t,tU[t*ۍŪl:Sj+NeYmbh0XZj+Vsj+ƪXGcv:VmeXXtJǪxPU[rŪx9X+Vm˱tڊ\ HjUcPұj,cX4 Ƣ:Vsv0ʹX; 5Y5VcX5VӱX5VӱV+X9Vst\@Ǫr.ӱj cX5Vj.Vs,Vsʹ`AVNRc\ +Ǫr.XcX9,X5VdX9pj`*cX9pcP;֊UczkŪr=Vsj-+5cXlZXmbZيbZ Vsj-lcZŪl9 X-bX-bXֲTֲTUkr*Ukr*XŪrӱhڎUs\,VͅrV bXBX4Vmc\(KǪP.XŪP.X5Jj.LRsf)Vn'X3bVbVkŪX+X5bt Vcj.Xбj.Xb\c\ X5bX+VX9XŪ`5+c\K'fJRsPU@'fڊ\3VIjL\35X(\3IjLjkӽht/j.[b\b\Ecv+jc\9TŪrkŪr+Ǫr+c\9TVsjt+gX5WΦӱV+g`5Z7kV7kj.Vśt USXbXbXBT,ӱj/TMʱj/TMXbX\lŪ\4sP:V 梡v0sP; 5Yj;V-fX VcX V\ZX Ȫl@Tjbb6 *5j1bb6 bb6 U۱j1ƪtZIj2؊ǪP9Ur.֊Ur.U۱j3TŢj;6C\6C\,6C\U\ƪ`׎UcXڱjU\Fcv zX56v ۱V ۱X:Vm`56v4VmǪ`Uz6X5֊Uzbfch,݋bhchUR3VfVfU`Mbl9ldl9cl9%5U\/Vs:V ǃX˱V˱r˱tX:V ǃ`5r@V ǃCXZbXұj9 Vsj9m˱XX+I-SXLbr0Ջbr0Ջcr0 Vsj9EcvZIj9ǒr0бj9یUf3V-gX+V-g`5f4VmǪlUXm6ӱj9یƪXmFcvhNǪl3X5Sj*Sj*֊UӱhUӱhKǪ^9XŪ^9XbtƢj;VMj,{`5XŪ^9oZj:ƪ`UP=zz,ct3Tct3TVsj*bt5Tbt5Tct5TVsj:UX+VMcX5Vsj:^Ūx9֊Ur,`5CfVj.VmhڎUۡ`3C\3C\3֊UۡjƪX暱hNǪP5׌cvkXcj;VU۱rc`5c`;U۱rLbv-ӱtڎ`:U۱rLX+cvj;VnX+VmP+ǪX Vctڎۡ`5XŪX V\3 cv(XƪX+Cj4VmcvX+jW5jW5VCfU۽rLǪ^9ԌƪX+X]@Ǫ^9LǪ^9[Ū^9[bvƢj;VmXӱVӱtP:{t0cv/X݋t;U۽x:JPU۽x:JӱjOXLbv0kŪ`*U۱j;Ecv:VmSt\\3 Xc̀c퀬tXl7cXl7cXf,ӱj;nұj;nXldv6Zbv6ZƪXf\0ݎUhtFl. r(Ux9cv9lcv9TMbv9TMZjbX]USj.VmCv.t.jFcv.X+VmCnUP7˱P;Vmcv˱P;KǪr,Vsj ӱj jŪr,UX5ՋUX5Ջbv9VM\.Ǫ^4VmǪrEcv:Vmcrcv9-Ǫx9jƪr[Ucr:Vmcrӽ`7Vmt.gY]۱jOcX]j.Vmv:Vmj0cv9`f..:VmXVtj.VGcP;ƣrkŪhjұj<+j.VGcP;ƪj*jbx5 cX5^MCX:VWSP;XŪj*jXkfj=vcj=vcXkftZ5`5cl7փR3փR3 փVZұj=cz0O7j=XVj;Vj4Vmj=XVj; j=XVj; ۱j=XVj; X,gXj6j=XVj;փl5փP.փP.֊Ut(KǪ`: Vsj=fj=fVZjUt0[MǪl@VgXUa5DjA X bՂ@K'X5#aj: śv: śv;X+cPkc$7mǺXۋj,Ţr(Ţrb`b`Nr{t<ʡ`4C$WE^9[uX7U۱rLŪr, bv9V@ǺT.ұn0NrvOǺTux9&TOǺV,LźV,Lc`+ f\0jƺV,6`[h0v: b`d`+Vn+GX7؊CX7؊Ct5v0sP4 ʡh: ʡn/ ʡn/n: n;uXLc`3b`3ұnj, v{j0u^uTJd`:톚In0vC$7Nef0TMrTjCtLP;V, XV,V0X4悩P3 ۱hd`݌źtKǺt; nb`;c`kCX7Śx4 {vlbtlgX7FXlgth0KǺv6LX7FYlgh KǺv6,X7źT/Ԍu^:Vl<fX+tdt&l4MgIn Vcx CX+j.tVcxLlf0f0kP3cxLt,5X9 C`:f0bxlxldx,l5, C`AVf +cx,ұp< \,5V,5j.̀,5ӱpخX: 0ǒY2k& P@&+7AX۱f *ʹXT MP)MP)R0[ ZԌjR3J`**P;V TkBr0jҵPLj*P;Br0jt-T*Sv\ T-R9Br0Jf6Jf6nlTRV,] bMP*V b lV bl6Y bfݫRV-5ct-5v-uCh-kT] bXJhJjJl<] b`6nlTRPJCfJCt- 6cP* CX- 6P;֪RfjҵP* C`5W `;fP* ClJv-kTlcZ(l[(jTKBt0ljT: 6cZ(ծR)jTA V[jJj-jPJjLGkT;kT;kT;fZ([P ҵP-7Av\ rU r0ԬRl9KBvjT;[C`Z r0Rl9jT;[cZ(Ζ`5W r jZ(ΖӵP-T;[Bv0kT;[8t;lZPmǣPRxY PRf;KBxZ`W Z[ZV-ԊkVkZjjkX*ԬbXbZ(VҵPV jV-T&V k\-ZP.j\.VsP.m\Z Z(mk\ 굚^9VłZ(bPY  tX 6\-lt-l6cPx9V r,] MPv-cZ(XmʵPڎ۵PBvU `5W f VX:] t-,Br cZ(Xn@VU  t2XZP`CX-,7P+7Ar)TMk`9VX˵P kXU ˹r6^mBrW[Z(XҵPj`9Xͥk`j,t-,׃|-,C[(X·Z(X8Ar t-,j P3ӡfLRU ۽&(BvA cZ(Z(f {xKk`W7ӵPkZ(5ct5NBv/] P-T CZ(V-kdt- VsP2XljXjX9] 5Sj9` 5Sj j&j j&j+] 5PY@Bf(kf3 fZ PY PBfl[ Z VsMPjf3[5Af5n0Tl] 5|-lfV-lfjj6t-lf3] 5ӱZV-Lzl+] 5ӱfjcX:] 5ӱv;[ 5ӱv;`,] 5Z0Tjjf:X B`Z 5Z0֪`-KBt`- jf:ҵP3lfjf;VX9֪X9XBvnXY EcP4֪f0Ԭf0Tf0TC`Z E`Llf0TcP4 tU E`LҵP4 tf0TP4 Vkh Y- 6r kB`3* jPf0TNB`3KB`3È- 6t- 6R(kB`3ࠕjf-cvU ÈZP4XB`5tӽXfZ([Z U ZjSP5BZjSf3` UC`*BP;JBR6` UKـR3V USXr-TMct-TMcZ Z Z f̀-TMtP5VsP沵PBZP9Zjj.XnB\LB\ CPڵPk5Aj VZZ ҵPjj5U'Z еP5] UۡRkj;lBv(LBv( Bv( kj;ҵPJӱZXC`:P:VsPJZY-TmU Uۡt KBv(,ZT-Tm`*ԬPL̀-Tm'P jjAX8<-TnʵPAkƫZjPkr\-TncT/X5APTB'BP>ʩX-TNҵP9LP9V cZKBX>lBX>lkr-Nb&B`5T \TnNP еP9Z tTRt;T V-TʵP9+krjrҵP9ӱZeX*G\-T6CV-T6CV*GӵP9nBZMcV*Gr*gr *gcMPP.ˡ\ˡ^T.P *CVT.ǚ&\5t-T.cZ\Z\曠r9l>X5At*^;֪`׎t*kr;֪^\ ۽X] ۽`5W ۽`5`5W Z( jt*JBTjjt*X cZ( VCXJP;XBTjfJP;BTjt-NZ( ۵P:LZ( Z( fMPVkt/еPVCfJj B^0[jt/Z( ft;T {l5ӥX+7At)XmʵP] Z6۪-[·ʭZ(n|4[VsP] P] 5P] 5Z(ݎjt;VX5֪X5VX5VNBvjt;V VsZ(ݎUӵP+Bv,ݮX`5W V0OBv̀-n[l<]ӵPjtKkt;] kvVjvmKXjvY C`:Z C`] C`LBP3ҵP; P;llv)JBX-ԎjvoBX-llv,] {PjbVjb&݋kv/V.v/V.kv/Vn f(_ {rU {r/mB^jv/VnZ݋tjbfjbt-ePJX-eV-ejjf,ڽl4] xjsXjsXjs`5P-ԮZl-NgӵPBvkBvjv;VMBv\ ۱tjr-ncZZVct-nlv;`@Bx6P-·ҵP<kBTnd5Vnd5V.kx] śX7j7X:] śf,nlxvWxWCMPtr6&(nC&(n&(n&(nӵPLGkx{|jz,] ճZ-JX-TϖCfg˱V-Tϖ\-TϖX-TϖX] ճ`;rLGkzxggPx9Tjlz6^jz6^VsP=/۱ZX] ճrKBllZ`:Z@BlnXW|WcZ(_ VsPP?֪t-VsP Țnv;V ̱&(`Bup Z kBY2yX d@& 5[,TB)jP9֪BZYʵxBZYӵXjPKkPK[,Tnj,Bt-*X-JKfB`B`Bv-JcZ,nZ,nkP {r-jbX {rB^܌ӵX݋ӵX݋`׮B^Bt-j˱Z,Ԏc fkjP;^5T2֪Bx9֪Bx9֌ӵX/ҵX/&Tf +r +rRf-kTK%tKX*^mbxllV-jX+V5VjbX9 C`ZbP3j]bP3bX9 cZ+t,]bP3VsX+V5h-֊C`]bP3nkVj6X+V5MX+V5ӵX+VcZ+lkʡv0[M7aX9VnZr0jZr0mZI~ʖCX+[kVb)jXbfKkXbZ,*RZ,*rX+bVb`5WZj.]ZlvҵXYŚt-k6pl5cZ,֌ӵXjX3XеXMXҵXbZ,֮łj-UcZ,Z,`5ݎXڮłvUt-Lr-Lt 'يXMX3 f0kšT0Ԅ5`ŚTjjf0lڱV- P;b`*jkSv6ŚTpšTpšT0kfŚj,݄5X vct {&lf߄5k6kf3T5t-lZX+bfŚ`5ׄ5jk6Z Z棡j-lfXk6t-lf^[5|kf3]5ZcZt-VӵX3[ bv-lZXjf;]ECX- 5ct- 5cX:]ECXjjŢjllhLjhLZX4X cZ,jttt;]E`AVE`A֪Ţj jh4VEP˵X4^NbTbZj-VMʵX5+kj*Ū`5WU[XkbV\U[r\-Vmkj,.l CZZ5kj Zj6aR܄[MX5aVr+stVjVj݄jkX9kr4Vml+GcvUj;XbhN7ah+Wr +WCV +WCV,݄j+VpPr5Tmer5Tme &\bj+WX9 fZMt3``6ZM'\MX* &\MXk6kr9֮X;֪X;Xbr`+V-V.c&\kr9؎br6x3Vf,][\v-V.\-V.j-VnZ6P;bvLl`3bvLZXlӱr-Vnt\@bvLZ6X+`:Xbvllr; D`Zf `3Xjr; dZ6Y9]f Kbv,Z\US[\U۵X[\jr=[l\xZ,jt:`5W۵Xjbv\۱rU۱rX9]zلzYzY@bvjkt;Xbvklt;XUct-nv0`=bv6[lkbv6[ VsXVӵXڡZjbTkzV-NbZҵX; VsX; Vs̀-֎bXkҵX;تtkӽXkӽ`:Z^0ݮt/nSX;t-nfSZ̦Zݎkv;Vjv;VNbv3VT*Xbxkӱt-obVY[f0X\-okz܄cZ+еX=VjzLjzL[+k|-k|,nNX UkAn2`Ղj*V@ׂj*CT,V@ׂj*Kׂj*nCj S&0NekP:kP kPCt-X*Z`+ׂRK`5W b&+ׂX [`)VZ+皡t,&R`-X*jR9V@ׂr [`+eCV] ʱZ٬KX-lе`5Ct-X*rP:]@ׂr,] f3f`ւr6تKl:Kl<] ҵ`) 5@-ŚTSx-J6c`*ٌUct-j&0f`VCZ0ff0jZ0ff0jLjLl5] l5 c`VC`:֪S`jӱt-jP3Vs`VC`AV l5 dZ0ff3` l5] v0Oׂv̀-jZ0OׂV3V ZXlr-j5ct-j5cZj`*[f[f lŚ`+ N`+ `+kׂ\kՂ\jV.Nׂ\p[ZOC-cZ0Vke`Fӵ`cV-kbZ0lʵ`يӵ` Vs`Jׂf+-'kXU ƪ`W ƪ` ؂j+] ʩX-+b̀-+bX:] ʩXSt`,Ղt;nb8Zkr-Xӵ`-nk& kXZ ڱX5] ڱXݫk^-Xk[kZ;Kׂv0ՂvX0kׂvA c`pвr-Xk`5V kǪ`pZ8ؽr,V ;sM`.Tւ^ ڵ`.RZ0kʵ`׎M`׎ӵ`Vs`NׂhڮsXs&0Z0/lˡvsrǚ[0/j\+k\kՂx9֋Z`.^bV˱t-X-Xj ,b0TmP5Ēif(kf(M`+kf)VnkfW 6SXljfA cZk{rV-،kft-،kf0ԬR<ݎkfOcXlKt;VVs`3X۱rlsXlsXU 6r,jlt vfknmnMׂf-l6Zl`kՂf\ 6rl6cZٌcZٌ\-lZ ҵ`jf3Xͥkf3mht-llf lFkf4֪`5W 6P2Vh(+е`3 %ct،f˱ZMׂh]vkf4` 6M`3[ kf;VX9֪X9XՂv^-lr-ltl{j,^lˡvlˡv0[mZ5c`5kZ`5kZj6Pt-X 5cM`5ԌՂP3f0jZjӡv0[-kjLjjLZ`5 cZjjtt;] VC`;` VC`Af`5 d`5 dZj t-X 5a5W VCfZb`5TMZ`5TMҵ`5TMCZf3` VCT0Vj*+kj Vs`5ի^,] V[`+ׂV`5V[j\ҵ`5V Vc \9Z`5`f`5W Vc v;^ Vs`5֪fƪtʵ`5V؂XX-XӱV-XjZkj.V.kj.Vnpj;XՂ\\ʆʭZcZ\-Xj.] Vsr3XՂ\ VsZ`bj(Lׂ\-Z`kՂ\-`5W Vsrӵ`5+kj.Vn`5+t-X `5jkj0jւ`*jӵ`5Ղ`kՂ`+ׂ`+е`5ZLbZL\-X c`5؎5`5Y Vj&M`j3TmM` 8f,`@7j-XZM`˅M`˅tXӽ&ZMׂjl5f VZk˱Z+krA*B^˱9ۡj,X;TnZ `9*Gӵ`9V 5`9V 5Z+eZ+eX,Jh)XՂX)-krׂXjrTU[Z+cd-XT,J\-XʡT2V˱T9JZkՂX-krڱr-XՂ^;VNׂX-뵃\-XՂ^;] cf0˱Z3cl,rPU cl<˱^6krڵ`9 zX9] cP,Ǣj] cX,ǺP*V cf(KׂXՂX7kr[fk`9V˱t-XX-XX ,l5V cv˱t;[kr]ukr]`9.St-XCf-XCf,vc`9V clU cl9Y cl9j,t-Xւh] hڮX,GcZ۵`9jrj,t-XCX-XNׂt ,۵`9nZn7PP:] +vf˵`9nbX9f`9n0X-XNP.V 7VNg`9nCX-XNlڪvւtFc`9ndr-XNKr,ۥlv/TmՂtv,{`:jւT 8T/VӽZ0+kt7kt7ӵ` %c` %cZ0݋jt/VnӽXLbLb`,] {r4TӽX9е`+GcZ0݋ӵ`+lt/ӽ^6ӽ`5Nׂ^ӽhkt/bt-UcZ0ݫZ0fZ0ft-Cf-CfU {Pjt 6ӵ`b`pZ06c`:Vkt:^ՂtKׂv-nׂ^Lk\ZY ۵x3] TVKׂvLP-nǛt-n۩^-خś`o6`X] t lWct-NׂvU ۱r-nZݎ۵`jv;X5`M` X9l57.S&]0g`=V c Tܪ+-mׂXkzz`=րZk@x;V c n(7TnׂX5kzbZkۡr-X5l9` c |,@*ׂXZKׂZ*5c`?ԎՂP;֪v,] C`5W C`Z C`vV-؏j*ՂXr-؏ӵ`?jt-`/j~;^k,dZ`kAXՂ3V  X,t-X08\-X0llU+f˭tLkJfTst Jr.nZfTst;X՚R)`kR` Mf(5Cd jP.ljP.lڱZ35v0[5CX֚\.֪5C\5ChZkrjeZ3fZ3ftʕCvʕCv3`kr&3Kך\֚\kP.jf(ngZ3KX f(،jPjP5Cr ӵf(YkZ3jP25C`\kX]kj,5C`5Wk[3-jP XQ]kl@Tm7f(5CX EcT Ecr6[5CX9]ktڽr6+ךh+gr E\ll ERllP4*5cfd\dX9]kXbZ3TM֚j2֪5Cd\kX9]k`5WktVcZ3Tƚv;VkXk՚j5lZ3TƚZ3TMךnCdCd uVvcZ3Z3Z3lP7]kʱZ3TjP95CX[kj {Mf(ݫ5C^JZf(+RZ3Bd {xTkҽRYJךt/*jP [Z3Zf(݋kP+kPKךt/֚t/+ךt/KkPZ3Z35^ {`Nךt/`kZ3NkP lZfݠeX x T9֚v)֪5CR5CZ0ݫ5CZm2C^,Ԫ5C`9[5C`9[Mךv3Tm՚v3`kP;VkP;5Cj,5CtjkPk՚v;V5Cvk՚v;V VsfݎUӵfݎkP+ZfݎcZ3nʱr ۱r5Cv5Cv5Cv,ݮ5Cv5Cv0ݫ5CvdtjǛj*Vkfڮ5Cx r r r4dX]kvW۱VWj ūtvv]k`n2C` ճZ3TϖcZ3Tϖkfgj ճ`55ClKkP=[NךzFcfkP=/еfcZ3T˵x ճr5Cl Z3Tj.]kxKkP=/kP=/Xך|UkX:]kX: ؚ|3NWctʧkP cZ35CY \ kX֌J\ kX*YkRX֌j֌Z3֪5c\֌rVkj֌r`55cZ3KjX,k0X֌RVbZ3KZ3KlX,X՚X֌ڵf,Vsf,Vs̀Mf,g&3Lzr6hk2c`5n2c`dƢ`5WkҽZ35`v5c^UkҽX֌{j֌{̀KNf5v+7x֌ V kX֌kX?֪5cX֌`3ؚ~Ԍ՚~ ؚ~5dL%cZ3Jʵf0cZ3Jj r j Z3Jk`UkcZ3+k`,]kcvڵf0kZf0k7ctZ3f0ʵf0Z3M` VSZ3XMbZ3XMbZ3XM\j`5j`5n2j`]kf65v VvKךj;`kf۠5Z3mКn7֪5v\6Z3톪vCvvCv3`kX vrvcZ3Z3Z3l`7]kZ3Xnl ۡv0[Mךr;fZ3Xnl< ؚr;fj,5vUk`5Wkt,f]kZ3nZfVsMfеf6Ԯ5vUkfCX̆ڱr̆j̆Z3J6T2TkfSX̦j̦Z35t՚\.֪5\\kfsX9]kfs`5Wkfs`55tͶjlk՚l+jjl cZ3mZ3m5^f[`Nךllךl f66Cjf[Z3mCXf˵f6[n0c\WkfR6Tn՚l [Z3-Zf6[Vsf6[NךlAKךlA`kffۍjlkljl5t-ךr̖Cfj6r՚r(df˱&3[US&3[US̖cT0df˱j;X5rVc&3[kl9NŪZ3[kl9N7r̖&3[fl5rj2`+T@7r6r Ul9 &3[jl9Xm2`5dfj+dfj̖t-ӵfLkl9nl5r̦ӵf6jl:K7t:5tk2t̶C`Zkff3Tkff35t($ @WSZ3bZ3bZ3\WS[3bZ3bXƫX9X՚x+kl\kfXjtt/֪5r0݋klL\ӵf6^ؚx۱V\ך|*kl> Z3jl>V5Xk՚|\ҵf6+Zf6+Z3tcn]kfr7Nך|5X9`kfj櫵f6n2Wٮ5f &cfTkKX֌Jj֌ҵf<ՎڱZ3jCX֌P;5v<Vsf<Վl֌P;kx֌ǪU۵fޭel>MײfmZ6khڎjhVsM8NV[MleP]V[j;]V[r-[mZjjjkղV3efeftZڊMl5]VMl VcMljj;T5ZUcfeP5lҵlnb'Zƚl-mղV]f[ rjZlղV0et-mZͶxe&6۬e6cZ6یl [j,e^ زfe`Wfte`Wӵl-gZ6L7f6өPͦKfͶkl;ղv)lֲv)lеl] 5r-mBfeR Vsl] 5Z6.\ͶK`+KײvUf۱r-mZ6ۮZ6ۮt-mf-mfͶ{fͶ{f+]fX-mZ6VsZ6nZ6nsvͶjͶT2Vef6ղv4TehZfl;Vfl;֪ejKײv7ղv7kl cl-Z6vͶˡTͶ˱tͶ˱t;]fZ6NclҵlΖclnǺlnǺZ6Nf-ml3]fX\fl9Yf[[vtkr-[ղP.V˖CX-rr-[bt-[bZZ زP@֪eˡ-BX-[.BZ\ʡj*V˖KP9XղR,TN7R,]˖KV-[.[X-Ve˥`+]˖S&ղTAjr*֪e˩X-ެe˩X-llr*V7t-bt-[NMl9KײTԌղT زTe˭&ܪe˭- Z܊jr+XղV-jr,TֲXjr,Tkr kr ӵl9Vʶ\-[`5e˱T(ݮe˱T(ݎjr,JcZKX9]˖cPjr,JZKt-[t-Rl:֪e˱T3Vsl9jfr-Rl:^kr,۵l9t-[B^\˖cP+krkrbZX9]˖cl]˖crڮe˱\݋kr,jbX-rv/VVsl9 {r-rZe\-[X-[xU˖cr6^mZl9+gVe˱\9ҵl9 U[l9 U[ZBZBt-[sZ R\e˱`櫱V-[sX-ǂje˱`Zӵl9l9fX+e˱f,W˖cX.]˖c`T˖c`e˱f6e˱hZ˖cX-Ǣt-Ǫh-Ǫl-Ǫ`-Ǫ`*llrҵl9-BjU˖cf(`˖cx+ײX9^ZKײX:e˱t,V˖cX,Tjjr,ZKbZKbZKBl-ҽP+jr, `5W˖c^ͧkr,˖cl9eX5֪e˱t/[nǪj-\]˖cdZ˖cde˱t-ZKCf-[ۡf3֪e˱t;lZKC`Z˖cvU˖cvĖcv\˖cve˱te˱t;]˖cPe˱v٬e˱v Vsl9֎5Zk\]˖clU˖cX-r]˖cX9-jr,*Wkr,*WcZˇ`5W˖cX]˖clU˖cZ\۵l cZ\j-bv-bve˹P=V˖s&ղ\U˖sr-[X-bt-[[kr.֮e˹Xoֲ\]7t-bt-[Pe˹Xjr.Xղ\Kײ\*5cl9jr.XUkr.XUct-[r-[r-X-`5W˖sZҵl9 Vsl9jr.ۮe˹lֲd-[NZl9Y7krokr2Xղd3Xkײd3Xkkr2]˖r-7j3`˖l9ڠ`5W˖f-[X/ղhֲhLl-GC`:ft-[t-GC`:֪eP3kr4 \-[t-GC`]˖fkr4 l9j v0[eP3Xղh,Zl9j j-GCf-GCt-[ڵl9jZ j-GC`=V˖v-GCvU˖v;XղhU˖r-[t-[̀-[Z r4 ղh*5cl9lJ̀-[ZmZmj,nbl:T˖Z7CMl9ojr4 jr4 Sl9oҵl9oڱZ7CX-GP;ex3Vsl9ol-GP;kr5 clLڱV-[Sve`*flLr-[SvnbXĖ˱t;VeP2V˖ӡdZ˖ӡd,]˖ӡdel6Y˖lĖX-P-^0T˖MlĖۡf eX-[nҵlݫe^* Vsl+sv-[n\ زvX:]˖۽|ݫe`,]˖XW˖Z0jZւP;kr;X ZlcZւt-[nk[j-t0e`;ފղv5krt-[nW^ej0kkrKkrKcZNײv<ӵlt3Ėj-P;V˖jklr;^ղvKײvkǚX-lp^-Ze퀃kr;Z8X-[nX=VeײvcZ8l-[GkrTnZ[X:]˖r+]˖jMt:V˦f-NtVkt: C`Z@ײtLjt: cZ66XM`:Xղt,jt: dZ66ӵl+7v\˦۱rU˦۱reX9Sx]sv-oֲf{V-o6Xjx3֪eX7cv-oZ6ެZ6LײjW[v0[eVV Z6^ml5ԬeVVӵlڊjx+ײj+Vjx+Z6^mZ6^mZ6^m5\-j.]ƫr0eV9`ƫt-kx Vkx V{PWۡ`5]˵l@er-/7Pgڊkx lxAf۵leZ6^n^-/7PX.kղrkcZ6^n@x;V hղr*kxͦ۱r-/7VU t;[زr.gZ6^nX-/7-/7X^,֬e5cZ6^n{X3Ve@*ײr fkfr-/kx9ʖclFclFcZ6^Nr۱X۱Xݫev۽@*ײr زre&6ߌk|3Xղf7&Vl?֪et-ۯ˱ZkfZkft-eZ6cZƫZߋWjZ.gMl_l@VerIʡT(]+RPVڡfVlVl5ԬCv0[ 5[9jtJxVrVrU+Rx9CvjPVXvV墱jV墱j;Tʡ\4VmlV墱j;֪ChVsr(U&9VCVʕCTVʡj*CrڮCt 6kP+ʡ`kPʡhVEcZ9kP4VNʡh,]+|CX>[NkP4X5ɡjP5kCTnCTkCT,$X:jCT,ʡjLjP5 cZ9TMXVUS`:KʡjLҵrjIUSjIUStTIUSt*TmCT0 UMr S&9TMөl$dMrMrӱZ9TMel5V+tX悥fVUMrCd]+XIUf&ct;6ɡj-P5Y۵rXIUx+ʡj/ct&&9TMct&Tʡj2X5ɡj25ɡjʡjpCd3`Cd5N7ɡj2$ɀV&9TlPLʡj; 5'9T-ʡn7V+XIcZ9ԮCXjʡv\ C`Z+ڱr5j]+ڱr5ʡv\ cZ9Ԏt\+ڱr5 Z9ԎtCXLҵr+W`5W+ڱr5ҵr+W퀭j`Afr+WYj`AXʡv9 BZ9.SVVӵr8ɡxjPCV+ʡx+ݎӵr(ފ7cTV[fڮCV'9UkP[N6ɱxI[tj 8ɱIDtlt Z9*P9KP9]+C倭LXVB`=V+S`Z+S`jT;`+pP\Vrt`jV$ch$cr0իjIƪZ9 Z9tVƪf0Vjk`jcvU[`5NX X еr0Vmk`J&9ҽ`Vƪt/MXV Z9+ҵr0W+svVBXIrZ9Zr0 Vsr0k\\Zr0kǪjVzX5X5r0kǪZ9kfڵx^;X\`I悭P`+\ \V6rٌj`fVVs&9Xj`5kj.\nk`+`5t*$PVr0j`:Z9NZ9Nl`:6vItlcZ9nʱVlc`5W+X9]+'9.8vl3ҵrm[9X6tgx,dZ9X0ҵr`Vsr`pj`j` p`+TVΦZ9VrjV梡jEcZ9K\Wkl3`*kf0 VsrLkl3JgZ9mhjlvkl݀U[rnB`5W+g7jAWr^,֬v(v(Kj;Ԭv j;jvJj;+j;+klPVVX9UkljlLwTVVZ9[mCVVΦ{r6nvMr,V+gRv)nǪr6ݎjljlvVζ{r݋jljl^VklVCVWklk|5X|5]+g Z9[UkxMjx.ԬP3\ `I۵rVrt)ҩl5 cx:JҹP {V.ҹPrtLl5 J'Cv/J'c\(ӹPڹP:FAl3Jgj,JgjcX+Jgv QP*Bnr.\(MBtӱr.NҹP:rt: j.n\(.t.nj;V\(.gv,VC\(.gh0 l5 B\(.gh0j6P]Vр.nl+Jn΅l9΅ڱ(˅ڱP<jB~.Ԏʡt/jRPkBXJb\KC^΅ڱT9\kBX/Orv,uc\KbX9 cl c(KBX>Ѕڱ|(΅ڽX9jbX+jbX9jbX9 {r˅ڽX9Xͥsv/VNB`5j.jgQP;[bQP;[bt.ΖQP;R@ jK:#v SX.OP<˦sx+ BVKsx+ s\(rx.΅`5s`5 7x3EAf:W۹PnڹPn((NGAt:FAv(` \(^BX.T5zՃ(йP=nǢz9kFAP [P> 哱V.O\(LBd@ws|7ʅ`5 tdP@V΅t; 8CQPXj, XctfQPA dPAVBY)΅ V.T5\ k6c\ +BY9 d\ kcPAnZPAnb( U۱n.T6l5*`΅ j.*xC^6ʃBt2JCXʹX\sPҹXkbrBt.*{Z;K%X*MbVZX,Xbd.Kc\, \,Lbd@X:cQXbY9dtVŪQX/V^9‚X9 {\5C`5kj,kj6Ś\يrf+XbVKbf5r.l\ŢQX4X Fa`5X@Ga`5ŢPrh4X4mfs:f\0Ţf6¢P.Mbt;[bt;[j( (*gsj+Trj+TҹX+bVkbVŪ(Ū:Bl. 5sj,悱t.V\0ŪP3 \ 5.VCX5V5jjbX9,sjj6r7bX9 C`UcP3jUcP3j:ʡf0ŪrLZX5V5X:ʡf0rjj\+t;UcP3ҹX5V5.VC`AfX5V5Q;sjj \+UcP3Xsjj j.ʡf3UcP3UcP3 vsjjrjjZX5Vc\+j.ʡv0[ŪrV \+l5ŪrVӹX5VX.VCl9ʡvŪr0Uc`*ltjLsjM]+g\+gf@ҹX5j,LGaX;T.VPŪv0LsjLt.VtVCQX5V(QX5ŪP3C`;Uf3U\sj0UP3ۡf0UP3U`=Ut.V ӱtVj5UXVkrVj6U`+ŪTŪTKbl4UX:fT.VͶX.V-rj9V@br,UӹXU۱X3j.Vm\6c\6.Vm7cX݌rjX݌EC:h bv3Usj\nʹX݌sjKsjgj.Vm7RXbv9X B`U`-kbv9X bv9X \.tj;Uf,ŪZ3j\5cv0[Ū`5UjŪ`5VӹX5ŲX]rlr@˶bXKbV,LbV,ŲX;²(,[EaZ b\9ʹX6Wu{r:ʡn/²r rlP3ʡn/ 5],+`,esPŲl.Ųl. 5sl3 Bf@6`e\0Nbf6Ų\, 媱v0ev9ŲXLX6kPŲXsl4.tlPSf.`*nbn/ҹXmTefLlEar. ˖s(,[|5 ˖sv;e˹`( ˖sPe˹`e˹`²\0Tl9 UQX Ƣl9l9 (,[tljP9ekWVt.mbhCQX9lEaPU@GaPƢrbP5bP5r܊ʡrʡr+KrV.t.V.Xlr+cQX*r/Tnr0+Cr0v9JGa`;( QX9 VcQX9Fah@wcdP5j0j0P5j@ +GCՀjj`5Ԏrr4X c\ VC`5jVsr4XVVl.VVf6P(\Ƣr9؎V. \\HCViڊc\\HCV械rFat/[^>X(Eav0x+ +V, +X9^mbxP0ۡf;KCln\,cXjZXj\,j.nl5`* cXLśvTj\,P;st;^5st;^bvkbvKbvrtł\l.nX+sv( bP>PGa^: UcX;j. kRXP\.֎ws|.OGax.jԱr.P(/T EyjBP0TBP0TMztB\/NzXsX9zr2XMzv;l0bv6rX c\/ng`5l: bfvMslkzt;Xztv:˦r+zt;_ctM`;Xzt;_۱j7slLrlL]/oP*(0FQ`(0TMlVCQ`Z V`Cv X: tX*傥R JrKX9傥R Jj.X*e\TQ`K\ԌsR3NGrR:[[`,[`3 Zj,[؊EXƚx+ բZ-[n債vXk炵v |9kvc\nˡn7XEv*TnsZ;k`5 \0 \0*۹`.T ӹ`.T c`.T c\0. UT. UT 肹P>ns\.s`5 rX.5c\0kʹ`.׌s\r\s\0mfs\M点t،t ER܎X]@GRFTLsf+ lB`kV 6[j. lB(KG\(Krf3 l6f3TX: l6cn06v;6( Q` Uf3й`Ef0 6X: l6tlsjlsj 6l5l6Q`l96ـ.lv: sP5 Fv.m\0h, FT2Fd9 FT2 FT2 F`knt.j( (k6cQ`5V/rj.VX9b: b:bR9j\k\ \X9] usj.VNWCt.X]녢`5tX͕^X͕^ Vl.XZQ``, VX9V\.Xj5 V: fjr4OtXMb\XM\.XMǪ(Gr+TFr.f˹`( ̖slmQ`VCQ`VQ`VtMtrVP+srVr EPˡx+,rr+˭X9,bt.Xn\jrrkV3˭f˭t.XnFf.Xnй`Y+cV.XnXU@fU[\e\ rr3f0ݫ\LGf:,7`9 (rr;,{`KGX3cX5(0k6cQ`:l (0\C`; c\`X\k;X( X( szJ%szc\sz ct.Xszj.D`A l:,DV.X0ʭtJrP*j暡T0ltP*jZf( jJc(3 ʹf(ӹfeZfՊUsPZfՊUӹfՊsP+kZtjCl9 v 5sP+jg\3 f\3 ftj`jx: \3jtPKsP+eZv2C: EsP4[C`kr0j: E`:kr0k嚡hLҹf(-j. E`Akr k嚡h,\3͖tfx5Clkx95Cl5CT, USVb\3TM\3Tm嚡j+kx3T5Ct*rP95CX: \*f@ c(3eQf( \3f\3N皡tc\3N|5CtkX: ӱtJkfJ{x:k^6sP:rP:cf(Ht;[-)3rP5 \0TM皡x* E~6 df k嚡,k X9 r: \ EsX(k嚱P4X嚱P4kB\3Zf,TsX+sXrXҹf,TMGP:[5c(35c:׌jff@׌UX5׌U (3V-X2cV2cV2cfkGj5ʌUtVCQfZ ƢXL皱j: r`5j,5XlZf+V5X: \Fc\3ʱVFc`5kX9Xͥs`4+s`h7kh7Kh7r`kX+ Vj. V\3NlLc\3nǪVLc`5kX5k۩^lzVlztlzj. ۱rlcP;kX95vr`+s`+t`k E\ slkP;XP;kfKfjRLl5̖B`:ft-t,̖B`:5P3sl) \-t4̖B`kfKf0NR,l5̖B`AkfKf kR,\3[ 5]3[R,kfKv9nʹfkv5Xm\-sl) sl)ތRKRT2VMwfFsl6sl6۹f6 6f6 VctFfkf݀-l92`5`kfX:̖`*ffc\3[ւt-k]3[j.̖x:̖x5倔-tl9 rl:kfP9Kt:Tt:5t,kf`kf`,kf`5Nt:Xt:kfP3St;V5XZQf+Gz\@z,kfj.sl>5X9cX+c`5kfr:\f@ӹf6ϖfW c\5Vsj(Uct:WͦR`rl4U`*WF^M(5nSt4Wt.6@X6Hv> TeX+ \6m CveC\6ԊrP+X岡V: 5sP-cvˆX.jc\6LbX9 5X7VN粡f2\6l\6Ԍf^.jvv.jvv: 5ӹlNe˱r.jSreCvڊsPbt.j粡vˆڱX.jb\6ʭ\6N粡v:沥R˖Jj.-\TjZlԌbl6˖JX+ft.[*5c.M沥R3VeKfeKf,˖J`5Ŗlk粥feK`5-5t.[J粥t4JZl)vr.[Jne[lb[ Z,TVsQl+Tn岭Po沭T/l岭T/lc\ Ev.jX+mBV.j^;Ve[PWU[X:+j0ʡjʕCV7T@ʡj*Ǫ\9TmuCX]@ʡj*ǪttҹrJgrJgtj:WU[vʕCV\PΕCVjrP5C\+v,WU`*WUX:WU)9TtP0sP5 ʡj:WUQrΕCv+X+WU۱Xctc\9Tm\9Tm\9TmsP5 sP5 퀮ƛv+fVsP5ތʡjKGɡj=lrP7+Z9lʡnV\9ԍsP7VVcrtrPkʡn/ʕC^0jʡn/ 5]9S\9\9۱\9e\@Wu{\96crmZrmҹrm(9ΕCnJwCf,WVJw\Jwӹr(ΕCtkʡt:ʕCt,+^ۍsP:vr:Wj.WP+fJʡtͶӹr(ʡv,Wc\9Ԏ\9Ԏf@WcxKsP;VΕCX9+ڱtjCrSv0[͕C`- j:W`+Z0ΕC`-+Z@XʡvVs̀jrrP;XͥsP;ΕC`;ފʡv:Wv0ΕCxsP;lgf@Wv@WcrksX9Wc`.+sP=̕CX3ʕCXkʡz Vsrk6rksP= ʡz+rҹrK[\9T۹rKXl5ΕCX@Tnʡz, *ҹrlʡz0ΕC`5+v(+v˕C`;ԎrP=c\9TC`5+vVsP=j+v@Wr( %r(`@ʡWŪr(X+JT\9rP@VΕCY+j.W^ Xct P@ʡ,Wd\9TsPAVNʡ,% P*\9JrX(kʱP: \9Jʹr,ӹr,sX(sX(۹r,Vct \ Rr,ʱP;Jڹr,nv rJV rJV9V͕cvWU[PԎslg\9xΕn+gX9Wƻr:WƻXwtw\w\:JƻjwQr6Mx:+gX+Wӱt\slkx;Xz,Jcrkzrl=lʹrk6c:WcfΕXl=VXΕX:Wsl>VΕX9+gj.W曹r6ߌrl+|3VN|3X|3+g\9ƻr6_wӹr6Εv/W۽t Xcr6`йr6`lЕ\9^*ZrTsx+sxrxЕtobrsx+rx+]9˕f5\5j.Wǚ`5 XҹrkP>XZ(sX F`ŃP5ŃX.l \<؊d.lJl2[V.lŚj,b`5ŃX7nVMӹx+V,[j. xŃVX96[r:6[Pt.lr`3֌Qx ţ\Ԍsn7Kn@ Cx9׌\3˹f,s`5P.^x sr</Qx: Oйx{V.ʹx+st/ӽ`5{]Vmej,U[fǪv/UQ|Z ƢX(>`{Q|ZX.`й)Lt.` Vs4й4 UCJ\@Z h:VCv. `*VCv0P\l.X*悩P3bl3 ۹5Ke\0.sk(6`X*5Ke\TSf.`l.nX*v:Rf6kt.Mc\Gso: x]Q70ss̡v CX:0j.0l50l5 9t*ۍl:S*(B *x *ʽP)VnҽX*ʭP+R {R -[^lJX/T C^ll*ۡv0[MB`;NB`; x x B`;jzRc^lC` j+ j+R^(zT2VRX9 jJ%^(lҽP*YT Bd5zT {T2 PjUAPjdjeUP+ZX0׫ZXjU *UP+bP;؎Bhl ^( l.bP;悩PECl3 ۽P,jg\0.{X46`bP;P,jg\bl-P,5`bllCP,`bllC^(v{f0*{X4P* ŢrzX4[.BX ŢrZP,-{\, Ţr^(͖˽l Ţr UP-Xj*(VAP ŪUP. B\rPUӽP.LB\3 rX嚱r/5\/ fsP{\0+/KWAxꅪ^ BUP0VP/L{` 6{`3֪X 6c+(، ^( VsPt;[BfҽPng^(Lh 6VPKWAn/[Br/,нP `5 ˥P ˥PRꅂRJBrOz`T{t/,^(XN^(Xne{`MBrKc^(Xnct\@BrKct/,ʱt:XBr{`U^(Xz`9+Br0nBrK{`K{`Lz`z`ҽP\{`k{`bP Rt/,w^(X^(XNBr[|`9-^(XNX/,g, vL{`98v VP`]P j*{b1 %cUP2VA` J&CUP2^ BPjbV/,ʭt/L* UcP3V5cUP3J^kUAX0׫j/Ԍ{f,]5c+ нP 5kt/Ԭ5@VjzfJc^YkBXjlꅚmb^Ykbv++[U{f c^YkЂf 5k ZLb^Ykf/Ԭ5xxjx4T텚BZڽ^Yk0X/Ԭ5rV{ffP֠V/Ԭ5Z/Ԭ5njlꅚLzfAƫ^Ykv 5k t 녚;-ʱV/Ԭ5x@*BZ)JBZ/*c^YBv BZ7V|fzfzfҽP|f-lBZ>NWA`/ *UA`-vjt0 5UPY5hlzf3֌C^ٌ5P/]5lf3XjlcUPнP P V/lFCdj6^{f3f3ŪP^UPͧ{f3]5vx*X cPOv 5TjҽPOv녚x*X j/lSjVӽPOvx*Xb^ٌl.V zf3 VX5JBf<fsjj6/lCul|fjfc^ŪP3UӽP3Xj{f;ꅚXjcXjcj,셚X9 5jj\3 5^YBz 5t/Ԭ^[P VAP ҽP/窠h)^BR{h)^*(kVA` UP4lVA`VA`UP4lgP ӽ^(ڌh3X;]EjVAhUEr:Y6[P4kBh Er Er/jBh܋Z^(\/*(XZEvF\/fS^(ͦ*(V[UP4/J^( Bn Er Er녢X9]E^t/XUPV{h۱r/Mct/Mj`5v9^UAtZUCUP5Tl* U[PU@BV櫽P Ńv/Tm5PfkBVoBV-VkBVXmBV/Tm5lkBVkjxkBVW{jZP`gP U[PJ\JfJf3 U[` U[`R6셪R6LBVJzj+*{j+*ӽP*j^JCv U[rVsP*jt/TmZ/TmZ U[xzj+ҽPkBVUUPkVAVY@BV-셪Z\ U[x5 U[X U[l U[l`*텪`*ZPLXP+{j+ ujP7 U[T9TkBV0U^ ʽP۽Pl|j+XӽPzj+ϖPS` U[X9 j^jzj+ʽPՌBt/Tm5c^jʽPՌӽPՌ{jzj+jzj+ zj+ b^ڊX5 U[Pl U[x; U[z U[zn(XmZP P V/TmCf/TmCfҽPnj/Tmr, U[V녪t( U[XұvҽP2 U[^(KBVJ^Jg^JgfhK{j+ʽPFcv/Tm`5 U[n9Xͥ{j+U[Pnt/Tmd/TmX`;XBVlc^ BV U[_ HC^ Hc* XAZꅪ^ {j.TNB\+녪Xb^ӽP5+j/T^ Vs^P5 U ^^t/Te*۽P5UP5ӽP5ʽP5^KWA\ Usn/TŻ*+^^,{j2VX9ꅪX9XBd0 UX&UP5ɀ/TM *Z UAjP VC VUP,UPUAj fUP5[j+C*PUUӱfTMǪUP5нP5VAtZUj]UPT'^/ rBQ Bf,X: Bf6ꅺ̀/ƪPZP^ۍU\vct/ƪvBn0V`,`3 uj,݀|n7ex*Rʡf *P9TcP9Tc^j *ʱ^J{r(zr({r(ӽP9NҽP9N^Jj *^\ Vsr/T.X9 KrT.e˽P-ZP-^\ʖӽPr)/BR6^.{r)/ZP\/T.etTNev/TnUAV/Tn5H`3ʭ*ۊzrvP`X/Tn5X`=XBVZPՠe^*`*`zrAͦc^jp˱t:ʭk6{r6hj*lkBV \/Tn5j/TnBd/TnBd*Jf*JP [lʭTʭT+BV*[ӽPVAV [j [j [jʭX5 [r/Tn^ڽP ӽPՋZV/Tnbr;ʭ` [X [f *^ VctTn* Vst/Tn5X/Tn5X*jʭf*t*ҩrTjzr+ v{r+ vӽPPv{r+*zr+*P:ʭ|kBV>mBV>m{r+-'\/Tnr+ cUP9 cr(Xzr c^{r,]sXKWA`/T^Le^zr*'c^ VsP9P *7CVTnƢP ǃ*܌j/Tn`5]TntTnr3`*7^̶_̶UPBhTP9kBh-`5 X: X: Bh3NWctTfUP9UP9CP9SP9S^VPl5 {r4[ UP9cP9c^Vx*G`6n|r4[ C` j0j*G`: j0kBhLʽP9ӱr j0+{r4[ c^V`5 j0l5Xj/Tf*G`Al5X{r4[ \/Tf_MBj,X:kBj,{r5N*mr*{r*wc^܍r7VX`,]X*w\/T^ ^fPVc^fj*wj*wӽPzr*wVPk6r9 VZX/T.c^\ʽPӽPr9kWAr0.r9kr9kcUPjT.*\r9.˹*\*\ *tT.g^\{r9zr9VsPͧ{r9zr9b^\XAr *t/T.\/TNzr+Bt/nBt^5NBvTnBv]۱*ܮe˭*nVP VcUP Ur;нP|٬*\[UP* ^\۽PKc^\۱r/TX9 t;XBz,NWAz,`뱀]XTǚ^( XZKl/B^U{XJb*( F{t/XB^0ݫV0ZfJW ^(ݭPJ^(nr, XJt/N7\/NgS^(Φ^(X/nǪPZP^(ݎUӽPl|t;XӽP檠t;Xͥ{t;`_ ^] U[PBTjzP* SR(LBT/ک^{v+|vKBT/ک^ک^ک^>ڱ^kЂf c^śP;V7_śX: cl5+{v cj^KWAZ0lB^/VsPBnXjct/NBv ۱rnʡt/n*VAv0VX j j*B\l|xVct/_(P. śV/oʽP+{x3+Bf0VNBft/zPҽPv ūXW۱rWjWjv wPZӡ^(ގUP=T UAP5r; cP=V@BXmz c*BXjP* c^zz6UC`tjjZP>XBdOBd 哱V/OʽP>+{|2XUAd`5 t'ӽP> ۽lZ۽l^\MB_(ʦUPVAWZ@WAW tpeUP@t \pP5`+ V, ԽP@zJ%{J%UP@*z>XUA}6۪l r *ʭ^ *b^ *t/T[^ V/T5 d *Țt/T5v/T5v*Ț^ +BY*_ ^ 檠3nBH%X/V`bf+{P ^,j`X`gl B^ B^,݋ZPՋZPBR{Pbt/jB\BR6TnbV)*ҽXU۽XU۱V/jvBRNbV*bVcXƫ^,jct/jʱt:BX b^,ԊӽXU ^,B^,ūX zj;VB^ڎӽXՋWj X:݋Zj \ h h7݋ZPՋZPBf,Bf0kbV3ӽX VcX Vc^,jr/j5X9݋Z`5BfzPM%{PM%ӽXVsX U{P+Jc^,ԊX9݋Z`]ӽXe^,X X*֋Z`,KbV7XBnBpTn{P=VBX Ճr/c^,T^,T6X^,TVsXBo|P=X X X0kbz@ ztVUaX]ʡ` +c*TUXlUX*Ԏbd/JнX*ٌbd3Rf܋X9݋XK%jKCX/jʱt/jSXL̀/jgv9֋h]нXXK*,Ζ{T;[.T;[.{T;[VsX-V+ԋr^zV.zV.ҽX++gX++g^{V.XUa`/Vh/Vv/Vv0Ջ`Z` k|Xb^, VsXՌӽXՌ̀/k{X/b^,֌zX3Xbf3Nbf uZ5Vj^֎zZ;+bvj5\ U{\,SX.VVX‚X.+WaVYsUX‚`݋kr/*,X X0kb\b\ZX0kǪj zX5݋sv FT VcUXKƪUXڌX{`5O7VXZzUXZł^,XӽXKc^,Xnf^,Xnft/,`:V-ʹ*,X0łv kP/lUaX kƪt֌UCUX3V UX3VUaX5V@Wa\ kbX3 5{f0KWa`*[ŚTێ{f0cXkSn;VNb`6T ff0]5t/ fl7֋5Pkrk^bf/lнXYU۽X {f3j{f3VʖcUXUXSUXӡv0[šX5UafLGf3V TlʽX6cXV{f3{f3bf0kf3bf k6XMbfŚ^zf4ŚX;ŚX;݋5^MGC*{UX3Lzf݋5t/bnՋ5r/^٭śX[7_٭śX:݋5jkv\kvtkvtŚf,^m^mt/FCX/즫f:XM{h/ X/ l.nbP;X4VE\>¢j. нX4bX/ X9Ţt+SXzh3X{h3Jbf6LbhՋEr/^,5`f`3Ţrzh\rV/͖˽P.ŢrSX4[.B`5׋Er/lbl[^,Ţ^,n۩^/MT/Ţv*,g^/VŪt/VMzj*V˖۽^UaTzPzX btZU[r:[-jL%jL%UXU&jWaf,U^Z j5N|j7JZUXª`]UXV-cv v;VUdV-XV-j9`@War@nzj VMgUX5нX7TV{nLbP;n)^Va^(nUXWB^^{l+Wa*ʡ +RX +R`;ʡd3ʡf +^jb^j^j\/V5[/V5[^\ʥ^\ bx+BX/V.Xj^\ 5v+BtV.^\ X/V.SV,]KX/V.r+l9ʥ`=[ӽXʥVNśj,ʩx3֋Sf,Tʩx3ʭ^܊zr+VʭX9݋[j+ҽXXƪX9֋ct/VJx+BlʱP+bX)c`;TbX+XaX-[nbXڋcj֎{r,[ʱl +^KbX:KbX:c`+Tًc`*݋cl/Vl9֋cj;ۋc`WXvԌb`;b`;r4TPPڋnm۱^ u{l+؎{r4핳`;X+Gc`+Gc`*lr4`5Vl5֋v/Vۡ\ +GP.֋v +G*ͦf +GVXb+\ U[^\ zr5Jbj0Ԏbj0Ԏzr5j^*mUalVObl,݋T/VSf3T+g^ VcX9 ^ Vc^ VӽX9LGrj/VVӽXKbnmfst+wcl3 XarV.ʡ*\Xzr9X͕X/V.tV.GCj/VNWatWө^ًӱf +c+Uat/֬^,`ӽXPVnײV,ǪrVnr=V뱀V.rzgf[X:US^,l/Cv/Cv3P;֋P;vKb`;VsX:\3P;b`;f*,ݍ*,ݍ*,XNC*,ݎt;V.t;lk^+g[~/֎l?cl.V_+gsj,ObX9ڱr6C^+gӱ~< X;VΦcx` kXL^,^TZX>Vv*,l|3nbj/Ob^jRhًClrjًCl5݋Cr(ڋCX;VV/֏{~VX B_, UX@Vnz*,f[UXm6C* KC*kU,/`j`n,XWP ^0Ԏc*0{^J`)Vڱ^+WCX,P;Kr5Vs`)Vl ,` ,` T< RxSxLXL`5 RnL%{T2SX@]P L%^0̖t/Jf_0LWdlVZZXX/؊5@V%{V,|V,Խ`+Vƫ^kX6[l< X6^۽`+ӽ`+V[rlҽ`+XV/+ʩ^0jrSf3 ʡr{X9TN`5^/+gs̀Lr6 x{TfKWrӽ`,]rjz\ 5Xf(s+Vs+V V` z V`׀Uc\`+ `נ^0kКa5 z Z9Ǫ/5pP+ z ^,s/kZ``f/5|/5j+s6Uc`^0kpcZ US^0kpXl>Vz\-x9 z n9z\-`; z r Vs` ҽ` fV{\Ac` ^0krk^.ǫ^0kcl*^mCX/5f<s>Lc^0kCXJfJf3 zl zlJlRP z^(XN^ zrVm^XbsX9 ztbv&\/9Ԏz\jj/5CV5CV/5CV\zP+^3Tm*0kX9 zPsf0k^3c^0ksv z`׎ӽ` z`5 z`N^3 z̀5` z̀jZ`Wӽ`WΆZ`st6{\ zP zPk^;l^0ˇ`j/Ci zP@ C^J%{b(zb({b(ӽ`1J^J%\,Rt/XLʽ`2VNXL**cU`3Tf{fӽ`3Tffll<]ӽ`3TV`3TXP9`@WRܮPl *يUVTU[U`˅ʭXlf-{f l6f3TnUfR ҽ`Y 6+ٌ5f3VXf0Tnf0V`,l* 6T2 6*Lf:؊f:؊{ff;Mf l^ٮllӽ`U`4 DU`4 D*0jt6c^05k`UV[j)^V V[r V[rX9]V[^ڊf^ CvrV9TMҽ`t0kWV t *ڊۡjXmP5XVc^X/XZ`5K\t/Xmv V۱r/XmP V۱r3Tm{j;XUv V^[v{nRl5X: vV/ʽ`K{n7`, vjv`Mx vrKWn6U^Ͷh vr6l7E^vP4{n7݀/ ^v vX9]C^˱V/X5\/X5\,ҽ`9XUlXlXΦ{h ,S^c` LwC` LwC`*]j0 t/NZ`:Kt^0EX/nj, \9l{t;`-C^0ΖjL`L`*l9 5_0Ζ`; r0l9͕C^L/ngLl5r0[ ҽ`lн``: jAW{v[n@tz^UT/M%{vkT/V۩^, S^0۩^/zv &c^X9 S^0zvzv/V۽XX l7c l7ct/Nv ۱rl\n۱*c* c`=t/XVs`@ԋFl5W ^<ˆrX/c^6TeCV/*b^6Tnʽl܊ӽl Vsl Vs^6Tn{PVΦ۽lr: r:VӽleC^6ԏzP?eC`5WŖBv[*ҽl{R)eK`;˖JX/[*5c^Tjҽl VsUleK[*|R)`@R@nR@n{R.[jl)-5t/[^T͖zR5[*Zl-\/[fK^eK-ej/[ʦ{RM%{T2eSXM%cM%\JVc_6Lxͦ^UŶr^u\mb*KUl+V{VV6_ec^6bk*V UZ4TbkhZ@Wt;jUl.TbsjBt ۽^6z\.Xt/KbV/kc*6^6{Ul/Vmf{*f\b{leh/L{`kt;Xt;&cUl2&c+6 [^6Vx:bXZ6Shmzf+lVVZ6[j6[rlʽl+нl+{f+XVKV6elel=Vel=VNVm^يwӽl3V6cl3V^5l3et/ی|f X`+eV(`@`+zf ^lP2VN`+P`6r U^66tmtm^LG{f0zf0Bfm6CVlXm6CVeXm6cXm6c`56rm6c+ Vf0V6X6Xm6* ۱r/lfUl͇lZl^櫱tm6t/lf36m6t/l|Tm6l*b̀>mUf@Ͷ * Uf4eT(nl*OUl3Ucl3+l3+^͕C^/ʡn/e*nWt;Vt;{f+t;Vzf+{fmf6Vl3`6 l4P.erʱt/-˹^6b^6+{hA %c^6kBXJV0eReR6Fcl@Fcl4XX* Vs^6kXW{hhzhҽl4֌ӽl4֌X:Fc`2Fc`5NX3FcP+FcP2Veh(+{h,J^6vC^/ev/el7{h, {_6˦ۡt0Fct;zh,ʽl4WcƲjen(en(KXʽl4V.{hkUX9erer6er6MX9Fc^6Kzlҩ^6 Vsl4l4X:FcnFcv,et;jZl4nBXX+{h,ݎZjXetkzl4櫽l4^6ˇʭ^6ˇʭt/d/dFcl9zh,Fcu/ PSVSV,F^6{h{hejV/ Vt/ Vl4˦ۡt0FlJt/v0FX5l|h6Ʋt/b`:fl4UP;нl4UX/b`:e\Lҽl4U`5FX5Xj/b`AFX5Xzh6 jf\6ej@FՀ4F^ l-Sl4e^6Xfӱ~ U{r:e`5WŖ*܎Uӱ*܎UP/[nSf;^5{r;7rL{r;7r-x/^vLUlVvZ@Wvbt/U^6VC^6bӱP ^6kX7؍XMc^6l:XUjMwX/St/ۡR3˦v˦vY@nj6Ht˦vLlMwP3j˦vLl5˦vLzt75XMwP3{t75`5˦vl|t75Q;nj v0[Mnj ^6 C`Ae`;Lv/nнlzt;{t;eXMcr0eXeX3˦۱tMct,˦۱t:Xve`3e`3ҽll_6Vsl݌{t;˶v/n^@w^]zv)JR˶SdmBXm^ҽl;֬b۱f/ێ5 ^kc^kct/ێ5ӽlͶ{v/j^,Ԋzv/j{v/Ozv3Xfe`5è/ێ^]ӽl cUl V۽lmne^e۽l;˶ӽl;ͶUl;ݍ{v;eXmcv/nclx+X V\jW[V/\/ҽlt//7jsP:˹f({xet/OǪx:ӱclӱR6NtW[l<+el<+cd/OJX(zx:V*gj/ORXzx:ʆڽl<KeCt/OZl<5t/Oj̀/Ojf/Ozfcl+tmbt/Ozf+ӱ^<] U[l<KbXcX+{x:źjcPӱh(Jt,t,Jc^6ECX/OǢv,ӱhӱn3Tmt U^6{x:v{x:vӽl<ˇʱt/Or4Xt,zx:c*6Xcl9j\jO*6ngt/[Xǚ^+X9Uڽl=VNCvʱV/[\/[Ul^6 *6*z|)lV[+6bfǚt/c*6` +` +{|7 ^6ߌz|3VeX9j7Ult6V؀3VU:O%g۽\+Jf u*KxKPՋJX /^TzR)J/B^ uUx)VKr]bv/^*ӽx)]Ux*Y@d3VXO%R\d+d+V+VNׂfo^jZxՌ{VV.VMWtZj݋zX ۡ^X5tZkcT,X5j* VkxZ3\Zkcv0 VkxZf֚~,ֲj-SP3Xer*jZ Vkr4 Vkr4 j-[̀Z˖j;XePRkr4j-[l5XeP;6T2 Vkr4ffZ˖v Vkr4 Vkr4VVkr4VNl9ZMl;FcvZ+Z9j`Vl5ʡrʡtOP3XCv9j˱`Vx/j cT@XcxVkX8aVVs`VVsVZ+X4VmrEcv:X\,j.Xx9jǂZ c`/CX:XP;Xx9jf@Xӱ`OZj-Z<Kx:Xx:x:\(KŲ\-\j.V ff@XŪXUv@XŪllɀ [j3TmP@Xmj.Xm`kX;6X Uh Vv,FvZRYj5VCV:Xڱ`jǚa+X j5Vf`jK`;X&cnVX7VNl*VMłj6j6aMŪtZͦx:XfSl< l=Ԏl=Ԏjjj5[\ZC`VP;jj`rZCl9VYj5]*S`U[`U[tZGcP Vhjǂl* cj6oڱVMśv Vx3fj6ol5fkX5ǂl7V`5ۍC`=flƂlڱ`5[nvV\LP;nU`ox;vvvv VXt;r,X ǃX+X ǃX9X ǃX9r,r0V`9XxV`:fj8Ll5tǂp<X3 tǪt:X ǃ`;[V`:ΖfvβX` r6JP5CX3 C`; C`ԌP;*5j:Ubj:Ub`5*KtN`5S`Vt춃j:XMvԌX(ch:XMR`5K`+ VӱT; bj:jSV,cv:XMRr,XMRrVӱTlc`5Kv@XMǢj VӱhjZj: VC`ct Vӱj:X 6퀰UR3ct X5l`5`= X5lv@XMǺrԌX7Ta5+t܎tVsj:Vn`5+j:XMttVӽl9Xb lX9XM[rX9X:XM[l<`6nt0k`׮śj:j:Cj:kT`Sj;XMs`- ÙVSr,XMX9 `5+a5CXVvxK`5j`5C`xVj: t0Vt; Vt;VMłt0ݎUj:nǪf@XM`5v:XMgkr6cj:یUS`5mƪ`5mj:ی`5mcT@XMgXj0j0 Vh5Jt6Ot6 XSPT;XMwcvT;Xn,fjKj:XMwcvT;[cjKtRtˡv0[ V`9ffˡv0[Mn V`9 V`9V`9Xnlnlt;XMC`3j*v@XMCr(ۡ\9 VPۡf3fjj6C`VPkvٌt;l`55j.XMCf4VmvٌƪtntnXۡf4VmjjFcv:KMCP; VP5 VP5KvVPƲtnP5a5UP;ۡj;jZja5U`5cjjZj t; V`.Ԏv0jZj̅ڱtnsv V`.fj̅rnsvV`3XMfnP;vٌt;l`56`56jjz,XMT;X5j`5VSxvR`;ގvoZjl۱tnv V`;fjllV`;ffnv0[ 5P;voP3jvVC`:vVC`: V`;ff0KvoP3Vsjll5 D`vVC`AvVC`A V`;ff t;؎j votntOtOc`5.S`5xVtOjxVj]z,XMT;[Vr<Ζ `5.Sl9xVr<tƪP3XMh5vnXjtnXja5.ǣj;ltƪP3x4Vml5XMhڎtƪtVjǂt-P;x)UP3XMkX9TjƂtVCf@XMk`*j:^SXZ0Ù7C`5ov@XMǛv,XMǛvP;Vftj`5or7Cl9`5XMǛ`5oc`5o\7jVf;X9TjƂt͖ۡR3P Vrx9TMj:^x9 VrX9X:XM˹X5 Vr.VMc`5/bT@XM˹X\Nx9Xx9WۡR3r,fj:^.R`VۡT;Xmr`6Xm`Jj;TKXUsR3V۱\cX9crcr Xjv,Wcj;+ڱVڎʡv,crv,Wjڎʡv V۱\9Ζv,WZj;R۱fcf,V۱f3jvٌP3XmǚX5Xڎ5T;jӱVڎ5T;jӱtڎ5T;jj.XmǚX5hڎ5T;j `k6cv< d`k6cv< \ڎ5T;j6j;lRxV۱f3US`k6X5KXŪ`k6X XŪt0cf0,v@Xmǚ`.XjƂv 悥f@XmǢX9ԎXcVcV V۱j+ct,XmǪX3 ctLl5XmǪ`-kX5c``,ctV۱j:X ``,ctV۱j:XX5ǚaX:XmǪ`jڎUl5 V۱j;̀ڎUl5 V۱j;vnvNX9XmʡT;XmʡT; V۱r(Vsj;Vl5XmʡT;vJXڎCvkvJ`; cPV۱rkXTZj;V.cV V۱r*֊X9kZj;VNZtڎSV V۱r*mX9c`+bv V۱r*m`+bv0[MX9붳`+bvV۱r*mvl5XmʩX:Vj;VNl9XmʩX:-vr@Xmʩ^X9 UsP) j;VNB\,TjƂvꅪX X9 UsVڎSP5KX9 Usj.Xmʩ`; cTٌ傡v,Xmʩl4Xmʩl4cTZj;VNeXkX9VcvUj;VNeXvVT;X9Vcv0[MX9Vcv:XmʩlƪP3XmʩlX9oP3XmʭX5 VC`jXƪX5 V۱r+֍U[j;Xmʭ`cV0fj;Vnө`a+`+X+Xmʱt;XX9nf@Xmʱt;cZ( V۱r-v\ b`+B`5cZ(X+ǂv\c`+bX5 V۱r-Vv\\ڎkrc\J`+XUۡfڎ`+`+tڎT;XmXkXK\ڎT;XKj:XmXV۱r3XJZj;VnRj.XmXkXƂv Vc`+7`5cf V۱r3XMZj;Vn`5cf6 V۱r3JZj;VnfS`5cf6LXMrڎT-vvc`+7X9cfv܌bj;Vn[tڎr9łv X+XmPV۱r4 X:XmX+*vv,XmX+jj;Vƪ`+Gc6Xm`5TjƂv VCf@Xm`5׌X9暱VڎjKX9j.Xm`:Vv l5chݎUj;VX X9X9Zj;Vj.Xm`+WC`+WC`:fj;VtV `+WC`:cjLZj;Vt,cjL`+WC`Afj;V,XmP3Xv\ 5Y:XmP3XVsj;V̀ڎf:XmP;Yj;Vl5ԌXjP3jڎv0[ 5Xڎv0[ 5X+XmP;t,cjVC`:XXjP3XjP3nXjP3nv\ j,l5XmP;̀ڎv0[ 5j;VRj,XmX+XmX,XmX,cjcj ұVڎv:Xm`5cj0V۱r5nv\ƪ`+Wj;V{nڎ^V۱rV bj;Vƪv9fj;Vl5 V۱rڡr@Xmf(cncnjǂv6CX+Xml3fj;Vfӱ`+wX+Xml:fj;Vc`+w˱vVv-ڡv0[MX[C`=cn9֎v-ڱrڎX;VNX[\ڎX;XX[j;V.RP3XmX+XmXXkڱ`+cP; V۱r9 jڎ˱fVj;V.ǚv0[M`+cP;{n:Xml.ԎXͅڱVڎ\KXͅj.Xml.fj;V.gsv0[MXͅz,Xml.Ζv\Bl9crV۱r9mZj;V.ǻX9Xmxv\wl5XmxVj;V.ǻtڎj;VNR`+cvct,Vsj;VNR`ct,f`+cv:XmX:VvXڎX9kX9ݍӱtڎX9vnڱ`+ۡv,ct;lj;VNX:Xmv 5vB`+j,Xm|kXVc`+j V۱r\ Uv\5v\5j;VǪ`+cX+XmX5V۱r=V Vsj;VǪ`czft4XmXVvڎj;tڎj;v\j;VcX+Xm`,XctڎX>VV۱r=`+׃| V۱r=˧vv`+cz,c|,TVsj;Vgjڎۡv,Xm`5 V۱t;XXYj;X Bj; tFCFCXFCX+XmvVhK`4Vsj; jFC`Vhjǂv0lڱVFP;Vhj`[vkv0ll5Xmgv+JX6cPVfbj;یCvVC`P;v VjX:Xmgj.XmgTV~0j;BXP; V~0jj;B`5`*fj VP*lƛr.RP VP4^5v9SfˡjˡjVP5ŪX.`.VmrX.P;ˡx;VVcjǪx:XmCX5O7j[j[v@XmP*Kr0Jv9 cjLڱf@Xmx,Xmx\<V`.v9f@Xmt0j: 5a]rOłv9ۊb`]ζX:Xmx*XrOj.g[T;v9ۊr@Xmv.gjMwcv.gXv9R`t7j`]ΦT;X5j`zVl=VnZjt.[`]b`]b`]bt.[t.[j.Xm`t0[Mr<ǂv9cX:vڎ۱Vڎl5Xmǃ`V`;XxǚaX5Ng`;K,5lvBXBX+XW[v VVVx9˱VZbj=Ԋz+P+VNP+VV VfC`+ԎP3 c`j[v,C`+Vsj= B`C`+ Vflzlz`*Cf,XPVr0TmP:P:z(ǂz,cj=VmXkXzfj=VmtZUz,XǪ`= XǪt:XǪl9XǪl9kX-c`tZUr@XǪl9 zNgXKzX9kzzfj=VNtZj=VnJP;cvTc`+c`+c`+\Z`Kz,ݎz,BXZ\kX̅ڱtZ\z,B`cv0jtZ\ǂz,Bl9X`.Ζj=nsvVt;XXl˱`Kj;XhNX-X-z,NX;VcYj=jzj= 6CXZP;X`. jZP;[V\jg`eˡv,Xsrk`.[c`eˡv V\j``3`5,5cj=mJfVl3TjƂz0 cj=`; փ` Vt `;fj=j[mzjP3Xۡv0[ 5j=j:X۱`lZj=؎łzzK`;X`;X5j= jZϦB`V`*ֳTֳT,ֳT Vd,XgVZ&c`M`mƫP9 l3^maml5XgXZ6VZ6hVf=U`mc`mփ\Z7rlaoVcP Vr+X͇ʭf@X͇ʭtV f[j,mӱ`LZl+V0V f[Vj(ҩl[ l5 ftVj0j:ӱ`LZl5j0j j`,Zl5Xj j6ʱ`8 Z8 ̶Cl;b,6*|CtZ:vcP*Xe`B`J:/[:/[:/[ul+XǶ ,7zY<jƃ,jf`;ΒC,9T-P5fɡj0TMgɡp Yr( CTԌˡv,K5CVk:KUCYr c`*XbTV,UrG`,KVCr0%r0Kgt/K{ 4VB,9EC,9Ec`9k`5,'r2ƲdNfd,9ʒ:XVl5XVP5XVSP+XVSP+,gVSrLrL̀c`9[ VsrVsr@XVrng`9[g`9[g`9[ hp<LP+jǂr c`jC`5,C`VrVC`jP3P;̀\CV@X.Rj* `KerԌX+JX\bh X+ `kSR3 ,cx;TjƂroJ̀\BV3NX. r,ov0˱\*aśr3 ,cx3TNX3VUS`kj*KX3VUSakj;X.ǚ\0OX4 JX\uCP ˱n*5r9mRP ˱n9NKX\u˱t:Xjr[ΆRP ˱t0`K`˱toǂr,ݍz,X.l5,v@X.l5,5cr9f`˱v9JX\X=Tjr+ǪX\cX,cX9Vm7r9VR3,cX9,5r9VϦBf,X.T `.Ԏ`.Ԏr0j`̅l5X.ۡRlr*5cr9al`lt\CX\CX+X.ۡv,,P;X`;Vs̀\C`,P;rfYr=X͒j,K,9f`P(EB:Yt ųP)̢CX΢CXʢCXˢCX+P+[eѡ`Xt*TfYt- U^f[Yt/5^;T΢^ ,:ʖCYt-Dz` \3Ngt Ef(Z@gP4T f(LeP4fP4nPE7CV0 U[t0 U[r0 U[r:nt U[` t0݌f΢X3`:vP9EgKf0mڱ`: c`: c`: \0ml56C`LGl3ft;6[`:l4VNh]l4[`:NŚt0mg`:vc`:v,5r(,r( fPlDzr( c,5Yt:ʢӡTEC^EYt: P5 X0 `:tkuAd VC]P*j5삪X낪` f]P5vAxP9`@wAx nuC ꆪt ꆪt,] uCt1ԍCX c̀*wAX *Zt1Te]P.ʹb\r9nwAr.r9XCrkr9l..\t4X`5T j JGX1 JGX] j,.(P+wAn\ rrCP1ClW[TW[TU ūb(^mZP6PVsPNCj;C]P=T@wAP5uAPҩr.fZ c`5ՃrTt1b(_VcPPTr1/cd.V1VsPƊ|3X| g]P ]P.( jǺ(*bX10˭.(ź*KwAi Hc.(`uAk..(l  Cd1ЇX Cd.P3溠,VuAiZ  P`@CU  t1T0cb`VsP 0XP3Ocb,̀1jf1vaj1]X2CV UC]XBXBXBX+P5B`B`5օPVc]XZ]XZ۱.,Tc]XZ .,Tb,TMwaj kua kZP kV.bb,-X7]Xkcr+btXj]XV@waZ xaZVZ-VNgtVl5vaZjX9`@waZ0օjX /MB^݅P e^݅X1^cx5’gk6f'ƚXk6V1lcb VsX-ƚlk6Xš̀1lLPk6X.ƚ̀-cfLbb f1lf3݅EP FC., xaPV5.kc]X5؅UPV b.b.ƺj2XMwajV]XªP݅Ur1V]Xkc]Xª`*ԅUXVct1Vc.Z b.Z b VXVt1Vj5`U VtVMwatڅUӱj]er+cn cb, [t,]er+VsX*Y1ʭ`A*ƲP,X*a5Wer+u{^ׅuӱjV5[]X9l.c]X9օcXVE^VE^݅c`ʱh0ʱh0օcрVEtVva`݅^ +Sl]X9kcd0`+'X:]j+'t1VNr2` +GCj +GCk+gKP +gKP +g.ƺr6`V.c]Xƺr9lՅ/\XPX9 xat,`ӱ +ӡf,څP3-r=Nwat݅ӡ.,5.,EXNkNǺt:V@wat,օӱNt: uat0*t:``2ԅc,.XKct1nb,Nwax݅v KXkXAjR.+wa^9[j\j.bEv;*`,]jklkl5*`:[ VsXLgbxab,kvaXǚV15cb,kt15ct5X>lZX>lX>lt15rǚX9`cf0| VsX>,cb,kX>LwaX:݅^{X:݅/ +Ś`kR+KbkX,b.kbV xZbb0\.V\.VN\+sf嚱V15cb0kb0k\̥Cb0`/jlvf6. ]` U . ƺf3` 6۱Vt-eh+x`c]`4]`4рVCbkƊjk\3.f+ftt;*bj2] V]`j V`_ VV1X`v50XlcRvj. 6\v`k%n vr:v\n: ,r) ˥X. 0ZXNrX`)dXN6CVXN6CVPL%r2Ͷr ө^XNc0nǪtXNa`9rt; 5 LP5z2`: t2NJX2NZ`:+'tNX: Ld0Vsa`:bdv&T/V-v`;ՋUcv,lzjݎvvCX2؎%X:lvKdNv: (v ۱j2nǪt2nǪt/lctnv;K`, j.lb`PC`:|0 d0v2A 3CPfafaf 3CtgfX,̌Ū~UcX:̌af,X-XP붳P5Jh; VcafVlLƒx+K6Xox d3.04Tn'T2Y rJ%cX+Y rKVCdNVCd:L ujjd5T%z,Bd5jZj,Ԋj, Vsj,J'Xj,`bd5k^5r2YX5%X*MVcTNVcVd5k&X3JVcfKVcf:YjLVcvKcd5OVdSXM%cd5Jʥl*+`*+`*Rd5J&T2Stcd5X%Zktd5`NV^NV^;JV^Ͷ`etj.Y zf@Y ztL`K'vl`k%v;VNVv\@'v;VN'v;X%v>*'z,fKjTjlPVtM%l*Vl**ed5JjM%[|5fSX+YͦrM%ctM%\M%ZM%Z:Yͦx;Yͦx;fStm6lSZMd5NV^KVtmcd5nd5nl>Yl>Yvl&|Ԍ%|KV`5 (|K'|3Œlkb R(k%|3Bf,Y曱V.*5bj6ߌlf05Szٌ%TKVd3JVd3֋ZjLEc09 09f[rJWQ9LCv:LՃ킘+X4&Ǣ`5Lsd9lj 09.`W t*`W Ev0L19Ncar0t;&P&P3LۡjLcar0ݎ5`t;V-` vv0T v0&`v&`v v*`` 09ngX9L19n 09nar6&gsrtl5,grfarm'09x.n7Le9mgar@u; vY@u v ^]Dax KP0 /d2Ūx+[t2*^5 x4h8jj. jA`: F\P5[axLr+naxt( 0.r;۩^m= χ0< ax>laxkX;KcT/X%a|ƇQ( 0 : pƪa3 Xh0 P5 0j O2'B2j0CP *P)lJf bX*Śj*ŚX*Ś`5 bt3T R0lJf*eeP)[nJr-cf-r*e˱V3Tʖcf-f-f-t3TʖxpJr*e2R6^.R6^R6^R6^ fct3Tj*et3TP=X͕Ar-Ar-R*x*j ` VcP)`V۽t35CX JbP*VcP*Vcf(+jJʡv0[mRrVP*nR|,R f(+t JcP*X5Cd3JZ`: 5T2jRXJ%cu3Jf(lXJ%tkRt3Vf(P*cf(f(UΦӱf(cPjf(j3jSPMǚTjRj( fP*`t3jP+ZP+fՊP5CV0nZ` bP+V-Zj3ԊV0nZjj5cPk5Cf, j jes2VCP+ fP+ t3 V3 VjL\3 t3 ؂\ `5+VLƚVǚV@ vˠX;ʠZ( kceP-nǚ\3ˠ\\5[P.VN7C\jrPnrX\3Cnef(VeP..rP5+rP5 U\ CV0TP˖cP [ R(lV+P3Aj Vcg(XnV3,PntࠅX3l̠`<]f(+f(+dVVeP2LBeP2VN7CXJV Jl JӽP̶CeP2݋h ʠh\ECeP4T5CR3-Pjh)nǚh)nZPJ\3-BP h)jX]EKr\-e˹^,r<6CR`l EcP4jfƪtƪf(CfƪPpj;fP4Vml5 Ecv Ecvkj; Ecf(+h, Ecv3 VCP4X hjǚhjZP4X cf(jv0[mj ff(-P E`nf0kPVh7ZPV\3ft3vv3vvv˱3cu3h7 bPZt3MAPT P5,P,ʠj*neP5JcbeP5kX]USb25fj*VN7CT, USv3TMf VseP5ƚj jn)j VceP7CV U[r3TmBf3TmՂf3TmՂfzf+VN7CVk`5nfpf,nf6j-j- fjf˭t3Tm5R U[x+j+*'j+*'P P ӱt3TmEX3TmEX 2V f櫱r3TmeX9 U[|5X͕AV9`U[ U[2JPNfJBXҩP7Vnt*ԍPNt3TmSnkt3؊5CVlPnP[P5VUcP5V@7CX XT̠j beP5+BtT5CVT5c3KfrfrtTcl`6C\Xͥˠr * 2 VceP9 ƚr)*r*V 8CT*r+jʭX*btTnUcf AX+ sf5*b t k5C\pʹX5N7C\ st3TfӱfP9Lr. stT6C`]PTӡf,f VsP9nt7^.x:+T. 2.X *c *2V f\5Cz( f3TXsP*`;nk *Pnҡ\5 Cj(]SxJ`6nҩ`=g( փxKtJP:VN7CXJt/jҽXJ\3t3VsP:]ӡ2(Ut:n`Jt3NVJP:t:暡t:nf(nTJ`5ގ5Cv jJg(NAPjک^3NbfP; VsP;KP; c hk6CXP;FcfKerjǚ3kv 8CX5N7CX cf+P;V5g+2+P;n7CXjv/ {r3ʱV3jjbt3P.P3VˠvZPVC2fˠvMA`5]^jVjV,]Հ jgf]VcPeP-ŚvjcP+v;VnXnX v;Vnv;n`* T T, T,-'ˠv=*`ZP5 [P*5cPƣPjgg(ފʠx+V.Xjƚx+X5CVzP< f(J̀3bf(f(fzj.ΦP]j3Oǃf(2(V|@VnYnY9 C`= C`=nr3PKpt3v3v 3k5CY9X5CY9 dv 2( AgnP HC Hc2(`5Cm Z hf(P@[+76cP+f(j ˠ;[mn3wePAT. r *2 *PA df K7Ca t3Tf lK+ l3T8C)[@X5K2,@"$dX zX(ՋPK7cT/X5cV3j5HtՌZ ` Z njbf bf,ԊUP+VnBXnBXKP+VN7cVX+{n \3jP bf,T VsX֌X֌Pkf,Tkf,TK7cZ 2,ǚP.+P.Ka^X(ٌ\ %CX %c2,P2X5cd %Xڌ v U[rʡf,TP5VnBX݌j U\ UeXZ-˰P*Bj.Bj U Ut UXnBf,ԍP7VnBZ9kBZ9ZX[+gs`5׌j uX.B2,T.˰Pk7cr V3*Wcf,Tt3*Wct3*W\3*W\ f,T˰P9` P:֌ұV3Jzf cf,5ct/jB^,݌ҽ`5׌j X݋P+7HxՌڽXcX {rݎ5cv/VN7cv/V8cz cf,TUP=VP=V VsX˰P=Vg^3X+P=nB`5׌j.]BX:VBl +j]j 둳f,kRXKbl<݌zrKbf,lf,ՎX/ǚT;^T;^T;^ f,Վct3j˱t3j˱t/mRx9X5c2UBeX+V.ʹf5c\\rr3f˰X+˰XZ-bj5֌Rf,ZX,ՋXʰX+݌ŒX,.bPXcf,VVsXnb3Kat cX,*X>pjf.ZAf۱V3Vk7xjPk5cvbfXLGZ;n7cv0N7cv4n7cv+7cv+Z;݌PՌPnjVk\3 t3 X.lrf,krf0jf,jӡv0[-\Lǚ\LZX. cf,jj˅t˅t;jrf\l\,l˅˅ՌB`Anrf 暱\ 8cP3݌BX3 j3 X.VmaXՌbVl\ X.Vm˰\܌bV, V\.jr`5׌rj.݌r3,˖X.X 63 f,,5X.6c`*cf,VC3 fPkrl cf,VX.nڱf,L7CXP;X5c`jf,L7C`=֌fǚg,L7ClP;[N7c`j˱f,L7Cx9nrv3 P*`4Ԏ5c`; cf,lvprv0jӱf,lv0k5c`; XhLf,ltV\ӡv0[-\ӱf,ltՌ`4\jh jf,lh k5c`; df,lkrX:]eX.[@7cr6mrf,ƚ\<K7c|X.-'˰^0+zP EC ʰ`WK` bv\St;VNXlŪeXVktʰ`*Â^;[-ÂPl 2, ʰ` 5ctLBX0/ǚ`:^`:^5XͶ2*Ú k2 2 aP]aPFCX4+â`F\3thZEf,X4[ bX4[ bf,ʡtff,̰hXM'fX>.2,~0j6c`*+XSj3tʰ~kgX?.t֏˰3TXJe( Ce^f0T 6`, JfpCf ӱf0LZ`(Vs`(VP0P E 20T-CPP*Cj P9]fjfjtX*f`,K` ,`)lKf b`5 bf bf bf\@7X+R Vs`)lffkffkRJŚRj6X9 C` bP3j bP3j,ʡf0kKrLZ`)V5X,ʡf0Rjf+v,ʡf jf+,ʡf k5X9 \3XCf,ʡf,ʡv,ʡv bP;nKrRjf+r3XCl9]b` ,P ,P5 bv URj,`, bvkKr;XRXpKr;`@7`+X 5RffleRMr ,Ct3X*P,C`nKP9{n3X*X,C3X* ,CfTt,cv ,c`+KQX 2UR@TM7X3USf0bt3USt3Uӱf0cf0cf0ct3Uӱt3UjLŪlLŪl9 bv0Ԏ5X`*Vmt5N^Lbf0ՋUe`׎UX f0lSXL%cf0 Vs`*nSr0k[e`+ ZV V0T@7f,n[fM7t3kct+P zX5ݎ` Zr35\ b` ƪf0nc20o7x;V U`,ގUCvŚZnkjbvf0kZ`-֠e˩X3X5pzkk`B^3X5`Ajk:n`5 bf6jkR6nkR6N7X) 8X-[Z,[`-ʭt3X5ct3X5ct3 bX:]`- &c`- Vc`- Vcfkff+7X9 bP=Vnkt+Z,fKwCfKwCt3Xg3nkv0kkv0+Z`-ϖe, `k5v ڱr\3XkgkfN7P4Vm7P4Vm\ksv B` Bx9 Bx9nsv뵛\]@7^AʶV3l3[\ݠX ^(X\@Ǫ`;X5^NX ,TN7^;jsv zX5jsv+7^;V Vs`׎U`׎\+\K\݋ZV3{Pk5^ ۱V3 z^,TnZX: z^65^cf0kf0k7`׮f0kW\3뵫j. zt3 l zt/msv>`ǂ^;]z,Tns`; dlg0*5c`2 &c j, &cRld,T 6 &cR3 &cR3V`2*5cX:]@7XLƚXLƚX &c`/m5X3X`2 8XLƪV3Uct3Uct, &c`5 &ct3d, &c`: &\,t P 6CfJfW6C2 `Z6j lCX3 e`3f l6ce`,`Z6P.` l6 l6xl6x;foC2 v`.` l6f`0f lffǚf6 6`f lfnlh f0Z*P<+P<+h)VnX9jX9X5Rnf,nl3-h)^`4 FcVBXZ`4 z20+Sf0+St3h, 5c`4ngf0 8`5 Ff0llۡv0[M7`;*v FXFc`4؎h+hh݌`4nj,nvVcf0-\, F20f0X3j, F`k5n Fv3f0 h7X5n3`Fnve` e`5TVCt3X b`5e`5mVj*۬{r j+TV[ Jr V[j3XmŪ2 V0VV[P ұXmc 3 8X3X`5e`5jP. Vc\, Vcf3XjBf 3X̀3XBd VcP*+j VcPƢj3XUjnr3X`5nt4Tmt4V-v; Vcn3XŻfkXbXb`b`5 Vsr`5nx Vs`5 Vs` Vs`L5\[nzf+z, cv3XT C`=jjtXVsvZփ\z 3/ f`. 2 *kj r+]Lv ,XX0ce` e` 0 ]&Kbj6CPfm6ClL&| XlUffhfd4 P+TjƚP+jfCX bt3jf6J7Z3Zl+Z̆jr Ղ\3P ElZƆlk5j̆r U\3P̆ڽX3jbf6l VslKgf6TR̖JV3[*cfT lR)`ƖJgT fT fT t3[5X-l)Ft3[ʶ`:̖l4Rӱt3[ʶ`:X5l; dfmggnfKv\ƖX-۱rMl*Ԍ5P3nfSf0jf6jӡv0[-TLǚTLZl* cf6jjMv0nfSfpfSf jf6j f6j V3 5a5̦BfM̀Zl*L7P;̦BXMڱt3 \3 j3 jJZl*ff6jgl*ΖlWƦzj=TnfSf6lfȘR3VƦ26el* UT2jfSXM%ct3Jl*kT*TT2X5d1ofSl̦x;̦f6LG^3Jv/̦v̦nJV36l4fl*ͶX3F`=nfSt3GTVfnfkXr3[kcv3[kgVct3[kfN7v͕Pͅt3 UKr9B`mfsr݋Sl.T{t3+ef6Wff6kfst3Zl.+7\܋Zl.+bVbt3Cl.\0悩PSf3悩`悩`nfsj3 Vl.nSl.nSf3 T 8`L\1mfsf66leo͕fkfsf60c{jۋUs` V`5̶{ljf۽t3`9Vel0]@t cf6؎cf6؎\3l26,cmP el35flʭfٌf3K7fkf`7mf`7M7ff36g Bf B\+cPUFKr+XFKr+X@R X[ VZV[j]V[j\V[jnf2kff0Vnff0n7X3Xl5 8XfKgfKgj,nf2kf\XVs V Zl5׀ۡR3Zl5נe˹l6\-Gj ˱V3[5xjk5\J\3[5\.jf3XjAUsfkfkX=jfFcfkZjl5`XX9Vs |ڊj j l5Wjͧj.jfXb;V6\,nfX=\-lfl5 l5 U[l5˖l5˖feX3[t,Vsj\3Vsj.Vstx+VsvK7\of3[Vj6fl5 Uj.Vs^l5e˱hVsv Vsel5ncv3[͵X[c`򡀺j5TV2Z j5+j5fk^3zf6lf:kfff0kfP3l2jfX&ct3Mf6l6l6nff6l4X5hVl5K7jVlfV3X3Xv\3l7fel6fӱf65hv;X5tjl6k5tpfXͦcXͦcX:fӱjkfX5fӱr3Ml6Kl:X5v3mZl+7vnf`5ffkfV3ۍn`vcfۍn7X5t3M[V3Rl<]ƖCel9T@PZƖCj-X[5f*c˭f܊r+X5V3̖[fJf+c˱X[Ūel9֌rٌX-Ǫ2 2r.X`ƖcՂ-Ǫm[U -P[ۡ-X[`]Ɩ2 U2`.cfZƖV-fL`;̖el*cP]Ɩ2\2\-cel,c`-t3[.r9`ƖflMǚțct3tkff6tm^\ƶ{r0̶j3ff.c2.v;Tƶ۱fݎt3n3v0VƶX̶28xmӱt/e`zf6jfXbv3o5l۽f6ފf^[lK7V5N7V %cf6Jwcd.cf3s26`.ctCel<el<`:V@`:x0 UCtf3ƫX3bf6^llx5x[t3Oǚx:+7t0n7tx;5vcf6^cf6^l^z9XX˱t3[f*5fl=6X[5XԌXԌ5X)Xn5X)Xnz, 6[el=*j2KCvc2kRfkfkcfkcfkcv3[5X:]cf3[5j3[5l= l= %\3[z\@7X9cfKSf 8Xcg zkfj V[X:փ\3|3/|*|M|o7jf Z9Ǫ3oʡV7T6kf `3o cg6`f3o0^7a5l>Vnf n9N˱f6X7l-،58jg6 ڱf6 ӱf6@g[x7XX+r7f;5R9oflZcel>V@7Xǚf6+7X-SV3StʱV3\3t26+|,nft-SV3Vsl>5fjfPnf`,nf`-Z,j,nf̀3f6nff35v35v ̀35X UselUP3[Usf b2.rfUfʄ$P*CjVCx(ތ2۩^܌Jr3^*2Tʦx)Vbx)jKt3^ VsxLfTBv/P;֌Tk5r0jxLj/P;xJex*TB2<+SjOBl OT0T OC2< UCex*fTՌ`;f Ocex*`Z`-V.SZ\@`3Vf OX]P V[2<̖`;Vt3J6dՌXO%tO%̀3JtO%\3J6ctJVfAP>Ӡf(5CQ DP4 jj iP3PCiP3PCt P5 jh4LeX 5Sj;VmӠf+XAVKAV UӠf+X4VCl4ԌECX 5cP-fLECX-UiP3V ECX5NGCX:jfECX=یUP3V6cv3 5kP:TMŢf-[l5jֲhVP-GchYWS` 5kjVchYWS`梡f-^Mj: jӠf05j 4,Ӡf/f0T0OGC`*iLt5NGC` 5j P34 檡j;jsX+js`554Ҡf EC`5+4fd0 jPLf3 j6fP 5r+ 5P) P hٌf3NAfAfPl9`@GCf6 5|:j6P^ 5v9fP3ʖtVciP3[iP3[Ҡfr(bP5ۡhَҠf;Av/N^< Uf;XECv6r,Ԏf j;jPPPԬh(: ڡh(Z ECR( EKh(ZʦӠh, iP4Ph4T@GCh Ef0TP3 Er@Ft4fsP4Fr(lP4FCh݋lр4 h(iP5P \4Tm h UCP5jZP5jP5ECP.*v@rP\ UCX4VmGCP.Ut4T bX\ UCX9NGCP.VP5P5j(Ҡj(AP4 UCP4T UC4JchjbP5ԎiP5Ջ۱rTMbv\@AT/USx9J^ UӠjOATLx5AV(BPTmh 5C4 5Ci Eh h t4Tmڱh ch ch \4Tmr@ bPTmŚrU[h h t4TmKfU[XTml4Tmej4Tmej:ʡd,ʡd, U[X3 ʱf3ʱf:f3 jP0j, Ƣj UcX4TӠj Ucz Ucz*v@X9TjƢj,^chc`5 UczP54Z+ZPo6P5P5EC\,bhj.VNGC\jf UsX9暱t4T5\4Tej.[@GC\6rrKGC\@BV3 U{jkEC^j4 ۡjTPNPj/یEC^KGC^6ۊxUP5Zh EC`( UT UT HC`(P:SP5jbr,cP5 55Lbj4T P5cP5chL˱t4T `5 Ux9nGC`*^hhP;FC`-nl5 UXkEC`-nhf@kt; UXMGC`-njmjmP5 Vj0jJf( :PT 6hl6CtT 6:hƛv,fkEC`7 chƛvnjhƛv0[MGC`7 X4T vP;[njg4LҠj-Ҡj7h V[P5 h VP5PX@6r4Tmcv4Tmh Vct4TmԠj5VCPkECj,Vj5hZj5Vj5VP+t4T̀4T4ZłhZ VsiP梡j5Aj@ Vt4TrliP) t4TrԌECl,^/Ǣj6ct4Tr UxKGCl,^/h`5Nj4T͖j 5jl>Vx, j:TnECt,czNZ0lECt0[`f(c4VӠj:[-j; UۡtTmrP4TmǚPkvT,ct4TmP4TmPLP݌ECv3֊f, UX:ˡh.P5jFCx HCxNX3 c: cP4TBvZ(ՎchRx9VZ(Վc:kT;^P5^ r, UP/h` UX4Tch/P5^VsP5Nv4TS`Nh: DiP6A`ev: ʖiPLGC4 uhیn4n7֊X9v\4t6c^܍ECtMAx;Ӡr( * h*eP9 AP*,er(JAP9*ҩ^MʡvT{4jP9eiP9eP9er4T{jʡv/[MGCP+GCP+r( VsPԌECR3֊ʥf,ECR3LZPԌӱt4T.5ctʥf,XrKAR3ʥfKʩ4*Ӡr*ATSfSf( *b`5Sf3Sf3Sf3Sf3NʩX3 S4ATʩ^SXʩ^ SX9 SX:*zj.*zl5NAT0 *tTNCiP9 iP9 UiP9AT0V@AT0S4iP9Ӡr*Nʩx: *: *XTNԠr*`@AV0 *hʱ: *ǪiP9V ECX: *BiP9*iP9*ڡ4 cXT΅ʱv/srݎEC\Ƣr.TCiP9*ۡh P: *B`;sx?*biP9KʹXsPsr@ *iP9A\0V@GC\ sj sj EC\jӡv0[ʹ`5 cP9t sjLP9tʹ`5 D` sj,Ȣr.X 5Y+*P3Xr.X 5a5 sj HC\jr.XMA\s4iP9mA\9Nʹr݋A\kTZd,*GCP+r(*GX;*GX; v4Tf4\ Aj, *Wc5\ Aj0`; j4TfV4Tf4mƢr8xx, X, X: *t( X: XPxݎAp jbt{P: jV( jV, jhKA`(V( jX4Vchbh梡vNt: ˱t4.CT/jrjFCr0TNP S4.St4.Sf`* ch]P;XECr0ol5jl5jFCr0v9؏l5jf@jt4NGCvnAv ۱hݎҠv;LX6jchݎ hݎZJv;Vn`k Z(nv;VҠv;Vehݎ\4nhݎӠv˧Av/OAv/JAv/Av0 jtnciPP梡v;JFCv6LGCv9NGCv9NPN4ԎC` X4Ԏch/ǚi/P;^v梡vlch/i]FC킶 toAV, h(jiP< EӠx07x3֊X97\4ox+An(UiPJP˱X5 cjT, `6 4(^VciPlҠx9U4(^C`v0TM`;OAr6 jP<+GCtGx:یţh(^ECX5Ǫh+Sh+StTd: P>'^4OGC4 hkECX: ׂf+Ӡ~0 cP?l~ P?Mh4FCP? 5~0j6jP? 6j4FP;FC`4j `: `:֊h0KGC`4VsP? D` `A `A֊h KGC`4XVsP?MGC`4hTMPFEɡ|j˱4* ct^XԨ0(`@QaX, êa, êaNj3Pj30Ө0ZԨ05Ө2(54 UӨ2,T-Ө2,Jx VӨ2QiP/[Mf3TMڠhJڠxVӨ6,Lڰ`Fyr:[MXFXN`&l4FBc v6ZiXZh,棱P+oh,曡r2Z|: B4, U h,P.Vn԰PFc\9XBv0Bv0KGcf@ UӰP5 UnlZXڊP+ZXڊ\4b`5BVBX9 Ucv4cXP5XEcjśXjf3 joVct4f,B`5׌̀4f,h,T Vsh,TmPKP5h,TmGcj;EcjlƢP5ʡh,nX( Hct*5cX(/J̀4J˱h,ch,cX:r,P:^Ecv: X: `5X݀j. Kf3 Kf3X9 t; X:X:llKGcv7Jh,NGcv@KBX*JGc^LEc^LXSf4ꅪT Hc^LT/T C`zj0j:KB`:zj0kEc^LXj.KB`:zj0MGc^Lh, UQ;Fc^,ZiXk6cX+ԌZf0ݎZf0NGcPVV fhj6v4 5tZf3nVNZj4j5cXՌV+GcV3Zf,ƢVҰV,bfh X+Ch 5V0lV0TZP5t4 ڱh ch ch \4 l5kCl9kCl9hL4LhLiX+ 5V0j6X+ 5X+ Ecv4 BX BX4 BX4 BX+kSvZTVV0jt X+ VChLf3 `5`5ZT6kSt4 X+X+t; kh̦ʱh̦v0ZllVjǢVjZX+chlj.kۡv0[ZvVX+X4 C`= a`;V.P5khG`hGc`< ʱhGX Hcf,Zho6CiX+ax:T@GcV4Kad4KX,KXbj,NbvX݀wX;XEcveX4k^6X;XͥX;Ұ\BiX.B`;Bx*rRrRKGcP+j\+ X. {X. {T4 5^:˅h EcP3 UT4 5P5J\ft UӰ\Z@GcPƢ\Vch,f4 uX3BvBl5˅j:˅v;˅v;b4, UӰ\.Kr녪iXiXVH(˥^Ӱ`1`: Ӱ`94,Ұf(kj,k^ EcP56hzf@ kt0Tƚj.5C`( kX U:kj4 UP4 UP: kijgj,Ұf)/WciX: kzl9 kzKFcV4lZX梱f+5chӰfڊ԰fJÚj+5Vƚl9Ԏa`:5P5t( kP5P ۡ4 afLÚ`lcX5x: k6PlPlfXGcf6kEcf6+Gcf6梱f3hiXPÚV,5`*kf[T al+ƚV0ƚV0OGcl+imCP4̶ʡh(5r(jSX3*v0j6X3 al+ 5554cX3[Mal55t,kfWfWXkEcvKÚl5kiXJÚ`KÚ`+Ӱf=XMÚ`NÚ5bh,Z h,ZX+j3 EKrFcRh,Z*h,Z*t4EcXƢj;Ƣtmh,Ƣ`9ft4͖C`3ƢrԌEcl9Tjhh,-C4,-Ch,-C`:E`LZX4[t,E`Lh,-C`AE`,ZX4[,E`,h,-Ct4͖t4͖P;Fcl9jE`:E`:֊Ƣr0KGcl9VsX4[D`E`AE`A֊Ƣr KGcl9XVsX4[al9 EE4,X5 Fc:RhJZX5j(梱j(iŢj(+ciX5TmiX5TnaPU@aT0NêdU[XJt4VmRv@b4ڊ5Ӱj+Lj4VmX+Ӱj+Vƪ`*TmGcVKêl*XͦaV ƪtV5CtV5hZ6XjŪX5jFc`5KGc`5lX5Nj0Ӱj3UjKêl5؎Ӱj6bX5 ӡf4VvCt,fˡ^4V͖CtVͶ4EctUӱt4VMP3xƪv9jhnv0[ƪx9fX5XjFcvLj; h5`,UۡfƪPƪ^U۽l3ԎҰjmh4VmhfV4Vm`5Ul5Ur4Vmg˱V4Vmgj.t4VGcxU`5iX l>ch,VsX6Nú`bX: +iX9jer*Tmh Uf0MʩP;[NʩX+NʩX+n`Ղ4VNŪr0ʩX5TaTSrSr0ʩX9r*Vch`5Sr kEcT/Tmӱhꅪ`:֊ʩ^ chꅪ`:VNGcT/Tmӱt4VNBV0梱rr hꅪtVNӰr*ʩ`,SZSZ HcTKr*،̀VN%r*^X9/԰r*^aT0r*Si X9c`c̀4Vr,ݎʱv9 fh Uӱr4V΅X9shr.VʹX9st4VhlChlCtV^VƚiX9،ҰrFc`5Ec`5rMtVӡhlGc`A chlZX9VsX9ΦʡT@+T9r-t4ViX4܌iXafZ@afKl;+GCVVh [t4Vt4VX9aj( +gj.ar0M`*TN`,+r4V.cvV.iXlbiXl6Ӱr9lXl԰r9 ar0J%r9UX4\XP4V.lW[Xj. +c5VӰr= +׃4VӰrCiX:C`4t*ԌҩP3XEcV(KGc^4ZXKGc^KX9KGc`*KGc`:r0kEchLX:+ӱrr0+t4Vch,`5r X9Xt4Vdh,a5`LEcl5 Kgv( al7EjT4ǃX4NGct(P.֊P.P.XEctӱVލX5+att:Vh,Ӱt:PP/ K^NC:K^: K^:Kj0X9Kt;Kx9f@KX:j.KX,ht;XЦv֎ڡhjf@LGcP) vmSf3 Cl3EcP) ch*et,Cl3VsX;T6h4`:ڡRlǢvm۱t4`ACl3Xvm t4`AXEcP*TX; CX;Ԍڡf3֊ڡf3Jڡf3 aPL hj6\0jFcP/X;LGcP3-'vϖj.krLEcP4[h4En/EcP4[X+krMX;͖l:XEcP4[`: kTC^C^LEcP-Sf4u{r0j6X;eh`*Ԍڡn/Bf@k:JGcPJX;nt4ۡt0ڡt;chJC`:ڡt;\4ۡt ڡt;dhJC`AXEcPjSX;ӡf4CtڱhkEcXcr0crڱl9؎v,[6`*Ԍڱl9v4֎ef6LX;-g\@kDzt4֎vkEcX9XEcX9chKڽh X4^h UcXfX&XmEc^LXmSf3{V0Mڽl+na^LXme\0jFc^mfsT Hc^mfsX:kl3 Hc^ڽlTJX4*gz |KGr6h0[`cj6[[ TV4jК\ P; X5E3V5V{`͖j.l5jU۽hX+l5ȡj. X(F:XV z``+,P: lt4j`FV[f, lhjZ݋5P+lR9[f,FV3UVKV3Vkgi`Ռj4j5cX0kGV3XEV@ lBv4تcV4تcV jX+V.rhV.֎[X; `V3TmEfJfJGf[`׎[`.V7V9XErVKGt,f`+ vj4Jh ,l`+.BhGr4jhՎh`+ H|,[X,N[Xt;V|,ݎr4khbt4kr@l僵X:lv z, P9UX5 j`kE^;z,X9X z`3 z`5NG^Z`G^;j4fv;j5 ʡ`5 ʡ`5sP ʡj; ʡv,̕CX+̕CX:̕C`5 ʡv0[sP;\9Ζj`.kxY@P4 i`2ʦP &ci`2&ct4d &c40 XNP &\KFhjf(WΦf6C: lt,lz` 6[ hZchيf+nGV, 6[| 6[̀4lUctlc4*Zt4،X4،rh b4fMf 6ct4،f,Vc`3ngt،f-[n`)TmE`, 6x:lۡj* 6P 6P H`;Tmf*chlf@lۡr0jhltV hlt,lۡr0kE`;TchltvLGf*hlt;v,l5lۡr kE`;TH`;T`3c`3f EChlCX5lP:l&f2 6VLƪ`3+Gd`5 6P 6Ph 6X5l&`3hLBX:l&X+l&X+ 6iLh bi`*f3PR9X+l6cj0 6j5jFfZ ƣ`Vh:l6c4ٌf3V.f3VNGf6h BtlSj; l64 h ʡh4lsP46d 6f+Gflh 6r,l6`+f3 ˱t4lv 6h+f3˱h Fcr`4.``h Vc4lh f`VCr,l6j(X`VCr, 6l56l5 6l݋`7֊Efk`LRj+l6X*[mff3 6vt;[f3_z4 j, lffNtLEp<Άh4Nl5 lj̇X, lCd,V@GX4h,+h0ʡn/֊t440L:S`4JZ`4Jh0L`4JG`5 FP4ͦChVCi`5TLhr VCX; VShj*`5+GT, VSj.jAjfj.l+ V[ R6khjPRKPXml4Xm\3X5`kEVU`+GVZ V[xZY`jKjKijj,Nl9 V[4JGV:֎tNXm h: RP VchcV4XՂf+ Vch+`5V5jjfsi+h+j\EX:rt>i`5nj.暱hkZ`5׌jj.XE`4X 6h`+.۬E`Jl53`5j˱h X:Cx9j4X r0j:Cx9E`/ӱV4X r0KG`/j.Cx9nG`/t4X r jh `A֊R Vx:Kt, VP)`5 E`4ԌhLGj0jht; VPh0jhӱhӱV4X FX:th jh h V4X FY:h< Vx4 V\4X f`5j0 VTtj0 `5Nt4X ۱rX ۱r4X ۱r VvkE`+ChLc`5 VvtjhLˡv0[MG`]`5n`5nt4X ChhtXj( VcnLj j,mj5ζCtXvVtj5VXXct4Xf`ͧj5VjX͆4ci`5lj V3c`5[jjlch-i-6_jNtXͶjjl`5V4Nj+Gt;VNGtkFtkj; C`Ţj;֊X9ct4XmhNGv@chi`5lGx:өx3 VX:۱4oǢj+jkEx; x; Ujƪ`5ގjKGx;nGx;v0hڏl*Vt@ǚ4Jˡ: ,JP< ,JfXbf( ,Jf3 Cf,,RX:,Rf6ˡTiŢr(KP5 ,P4XEX+ ,ǂf, ,ǚPX5hK`(h \Xr6,h\Ζch\Ζ\4X.ghEvoFvKr@LZX/ǢtUUr, C`kEP3Fcv4U۽rӡjWvch0{l7ӡjWv`:6P;FP Z`:cX5Vt-g`kEP[vP;XEP[vP;FR,mch0]BX4.zz K^KGRh0]B` K^`l\@GT4Nx3ԎET7CX+LBTjh0 5SfV`:j6t*T.CX4N`(KGT\Z`:*t4N4N倰өP S\jh05j,OGT Uj`: ET/ET/g40cl< S`i0cl<]`:F`*f`:bz Sj*mh0VSn;t*[mSh0Vr< Sj]Z`:xөlڎөlڎt U`:Ut4Nc`:t+kEV,JGV, Uh0݊EcjӭX4fh0݊Ecj6^.t+x9 [PMZ` t0 [r,Վӭ`9jZ`,R` ch0+JX4CfKt*5ch0+J̀4t4j,ӱr3 ct4`,Ǣt-Xt-Xt-XVs`lGZӵlƢt-[nǫt4j.L`5ӹxb`:b`:bh0[V3 s`+Xͥ^(LBV3 {jkE^jh0 ut/MG^,TӽX܊ӽXt/Jt` Zj-[l5Ll9kE`-G\4V۱rkG`+w˱vVtڎX;fh0cn9֎tڎX;XE`+w˱v:L\,L\ V.U`obX]@GbEcv:L\x+Ui`:lgt3T5ch0 bf R Vs` t3jEf, Vs` \3 P+ V4\,LGCP.֊P5Ecv4\P;ՋP;Ջt4Nbh0 S`5 h h 5nGl.` T4`\f(f(kEn3Ecv46CX:LwTf( P@֊rڎrڎt`[Vj* l5bh0-gx5KGn9[ƫ`5 l5^MC` l5^MC`xxkEp<ێt8mh0]Z` \4.Bt4.Ǻr;֊X7[nh0]u˱tڎXKǪP;Fr[cvV`cXkEr[cvXKǪt4.Ǜh0Nh0.t:ԌP3 ӱV4N`: uch0jNc`:lƢt:،t:XEt0[`Z@Gt0[ t4NP9 l5T`:Vct4NtNP<J`:vi`:LnN`:vjN` U`:Ǣt:Xt:/t:/ 40P5 Lr0TMGt7JFt7lFt7lZ`:ݍ5j.Lf3Xͥtk6`:ݍU`:&c`:&ch0nڱV4NCX4VmGt;ԎEcv:L۱n4Nct4Ni`:P `JƢt;Ut;Ui0%ch0%\4nZ`+GvN`4nV4nh0nX4ngh0.`]UP;֊r,Ԏr,Ԏt \4ncv4VmGv9jtKtKch0.Ch0.h0.X+LtoFv9nh0.t4nt;50`Ƣt; Vs`:^mvڊj+VNCVj+VNCVKGx+ۡj+ Vngh0OǢt<kEx:tKc i,N۩^N 4Śi`;Ջ5`; ch+Z`;VVs`;VNGX: lײVCi`WBX:lsv,lsv P;\v0jhMV9T/[mf4ΦhmSi`X4. h]v9`5R0 tLt4nv4n`FvNXv;5]Fh_@G Cf,Z`?j`?Vr:`?XEvx9N r4X0Ȫd:llh5Vh5Vtfk, fCh6TP5VfCX9͆j. U\4P; ch6NG4͖JV4[*4lF`3ƖX4[ 6chlӡv0[fKf0j:-tVl) cl) chlӱr4[ 6XfKf0+RLl) \4[ 64[ 6Q;F`3Xj:-,-͖`AfKf R:-۱r4[Jct[l*Jl*Jh6 E^fSh6ll*ـwl*kEdͦr0fSX9ͦr@M%\4JR܊fS`5W [h6 Vs̀4JT2Uۡr@mDhjFP3l+ l+LGVͶZj.mŢVͶb:mŚ R(kEX3֊f[fͶbX9Ͷb`5ͶbfͶbfͶbf\@GX+V Vsl+l:mŚ`5f[f:mŢl+MGX9ԎEX9ԎVjǚi+ڱt4ۊC`5ͶbP;FX9ΖVjgh+WV\f[r5j4ۊtV h+WX4ۊtͶbj0+GXLt4ۊtf[r5V\ \4ۊt4m`Ͷbj0V\ h+W4ۊVV\ dl+V V4ۊf[rf[r5ͶbhKV,EX Xf[t;ƶbv@mSh4 ւR3Ͷ`*fl+X B`f[Z0֊f[Z0Vf[Z0VNG`-KG`- ͶKc[\3V0݋f[hol+ cl+ choڱt4ۊ7C`5ͶP;Fx3fhor4ۊ7cl+ތVf[fEv/Jbh6CX9XEv/ jogl=TjƢz,j4[JX4[z,z, hƪt4[zft4[Ƣz0l=ect4[l=XE`5 Hh6kEX946k|fh6fX4 46 JcP[EKTDR0؂(Z 4 *؂.؂ Ek6Ci:AAhr*HlN4sitф4;M 4<-P>P9LKr(Y@G^45zP.x*kEdSr(T2i] P*{f*8@j(jVCP3j55P;P: cP: cj(jӱt55`5W Cfq|j(UmóA^CmPW66(ݫXӡxNPt;Kt; XCvKt;^nj(ݎx4] 7 6ڡf5۠vkڡf,C` jPC` jXC̀ jҽP{jzmP;Ջܠv j 6 56 56 U۠v/T-۠v/T ŚmPC6 UfXnڽP5] j5ft5f t;ԎUC`jA`jVC`jӡv0[l5 C`Z@WC`jӡv0[MWC`jӱjVC`:֪l5 cjVC`:XUC`jjVC`] jLjVC`l5 t5ffl5 D`Z j,Ȫv0[ 5YjP3XVsP;̀5ffj^6۪l5jj|zj)[VC`= XC`=zvlv#8BXjcXjc`5W ۱rj̀5nܠv;` Pjˡf-Wvjӡv0[rLlrLǪvjӱV5ԎC`:rLj/tjˡf0ݮrLj/t;] P3Xj5ԎC`AV P3Xvj6P;^5tjˡfj˱6/Ǫv+vkUCx9r0r0ݮr0NA\pŪx׮^;+WC\P[NVcV3XUcVbt5kܰX 5nX,VcP9۰ZX.ԎUcP;֪rv,]B`5WB`ZB`rvrvk\Ǫt˅z,]B`=VcP;XnX.VrX]嚱T;֪rX]7\3jj,׌j, bj, bT5X]\n\3 j,mCfeP;V`kUcl;jX.jeP;Vcl;jt5˶v\`-۰\9ۆX˕V+gm$ ŢP X0׫Ƃ^)[Ƃ^)[.`Wʖ{l zlͶ j,땲^6JWc\-j,땲fK`Wʖk,땲t5Jx zl\@Wc\cj,땲r/mUc\{lƂ^)/V zl檱`W`5NWc\j,.`Ẁ5Jx9]sX zj z6,l 6CmX٬Ƃ^܆5CmXjÚPlaf݆56 af0ֆ5X݆57 mX3݆5ӱj5LgmX3VctZ@WctƢvƢvKWcX:Ƣt0݆EmX5TeSP:LX6mfP3VcTvƲl5+C`=Ʋ4Vcf l3 Xt5VcjjVcjƲP;Ʋ^Ʋ^KWcn3Vcn9VaP 놚t 5cX 5mX7 nŪn/ƺXƺX>݆u{j+t5Ͷhmǫ6ێWct5VnUcV0Vʭ`,ݮʭt5Vnܰr +PVζal +[j\UczAj+c |9Jj\r=֌XKWcz6l< Xcz6j\aT6,at0ֆk,nP5nZmX+WcvfKV5n7cj,nj,ntngXXj6۰vaZ3oڵf_@Wc^܆{r3Tmv/VgV5v;VmX; ucmXXkcjݎmXl`k\5n7cmX݌Ucv3n5gjϖt5g)v>[NZX;-'\5gt5/Xj悡j,^j,^VcrSf5/g\0j6Xmfstl.nx9XVcrjVcrl7ܰx9NcTX`x9Vx9sl5]tXmSXmSf3`v0lv;Vlv;VNWcv\۱rU۱rX9]Pˡf0jj,.tV j,.tˡf0kUcv9 cj,.t\@Wcv9 ct5oC`:rLj,.vˡf jj,.ˡf kUcv9 dj,.,]P3XVsX]5k,.j,.j,.t5oj,.g6jV ZX=Vf˱j+{f,6la`kjVVmX=ndX Wc7hxUY܆Cd5/cX|)[VcR\-|)[۰|)^aT(nڰ|*n7ct5Oer5OerǚX>VtB\3jlj6,_ƫfڊ|3XUcf7X7X+݆壡j56,͖mX- j,nj,bv5Orj;]ӥl˧Kـ˧St˧St;VT(ݎX> 6,nX>]kҽj,Εn5Ox7]X+Wct3nj,X>U|X> uc˧n U|j,v5OcV\X+|5|5X>]fX>]fj,NCV5Oۡj+݆X,Yl Xct˷۰|˷ j,V۰|;[lnlnlmXCj,VXnt5oWcv͖~U~UcP;Vcx mX@j3l& ۸x@VmSP*XmCP960RKfU JX,r,t5X*5\5XJP,BP.jSr(UTCtJej0Sf LŪj0j0+WX] b`,] b5ŪT/nS`9VmSl LP LXe Lf LtelL%T L% j0T2֬SXmڱV5JƚV,[mSX3ۊe`*kT2VSX9֪SX9XUdnSX L%m`*UdkSf(SfL%t5JVCX5JVCXL%h,] P4X͵dJWdL%n`*pS60-m`*ۊE60ml3PP Le60m 60mX6m`* VCm`*lT6 Ul;X@D X)+WTbt5Km`nctukcXժZ;b60km`.Vnsrb` Pb`b`sPU rrsf嚱V55cj0kj0׫sX`.\ݠsv5Sn5Snکf݋\jK`N5Rsv/\*j0k`׮j0kj5s|5] z^(sv/O\U^;KW^;Xͅj0kP3sv3XU^`nsv̀5뵣rP9sv4T{`NW^; b`NBX^ܮsvmW^;Ͷ`NCV5PsvL%\Fc`·ک^4Tsv>*W`3V`3nW`3nS`/ 670k LdjvnX L&m`2,d2kf(&60m`2m`36c6nlj0Zjƪtk0Zh]pـ-g[`mj jFln6MWX5X5X5X5xfY\ VcjkbjkbvXXVcvkk`׮vA c`58jvcjk`WŪjp6z`jP5X-`j5V۱j+[ V۽60[UR0`kUn\ vrv\56c`یn7[݀5MWzjӡ60X LCm`:tZ@P`;Vnj5Sj jlwdlCX5.ڱt5.Ǫv9V@Wr0U vlXl`Ū`Ūxlf@+`5X9XUr6 b`5V@Wr6j8p``ltXzZ ~U c6U`56m.YGC6ϣf Vcju`mBfmlͶ/خf`+W jmPtU l5V6нlm{| zmlƆztV6kV`3Xf-5cP-5cX-5cX:]͖r5[jlKR3FCj Xl+KWl+`͖]͖l/WCj6Վj6Վt5۪f[f5jZlVf[f,]ͶZkf[t5JWx3Tf[fmśt5kf5kmlY@flccfk6Cmlٌf3V@h\5l.^6_l0fX cX:]ӱf,n`: %cj6ECX9]ӱt5Lcj6j66l0j6Fcl0pcP 6jcmml3T-fjcXlcl4ԪfV0UFCtUX5 X V`5Ԭfj X`5ԎU`5Ԏhjl4X \5 VC`ZFP;hjj6r5 Vcj6bjZVTSlJX5[mj`3jZlʱt:XU+Sj5[mtUVx:Xl{f0UV@^9nCj@eX;VVl j@eX5jւX 5jcv0[ 5jUjڀ5cv9f X4VŪ5[m f0ݫf $BjڀSx:XUvlP]V~0VslAkPf Zj`5WVh4+jVk`5ƪjVx:XU0Ǫj ꆪt6|0ݫf h(XM˱P6V0jV45jmgUVhxVnjl<]Vr.T j+ײhU7Ve`5WVX9ƪjfv0jV7[l-g`*j/5jC`-kU9X5[mcxjX9֪f rjZlAX 5jK[j;]VX;^JX5[mCPf v,իSf5[mˡj+JX5[mcX;TlA6C`3VV^KP[ l5UC`ZVCTmSlkcXb`+j)Xmj USr6fX5[MBP5f^jjfh l5FvYVSh7X5[Mef0TMŪj*[e`5WVSj-[jVkr4nj*[e`;`V[`9`V[j6l5ԬfX:UvlLtf`:UFP;VX5[UvX 5j,Oj݋5ct5[vUX?nǪjZ j-jjZWS`jV\+Wj;Ԭfx4Tmc6U`JjZrXjVf 5j3XljEKr5[ƢX9]VvncP[ jZ X5[rv0Tjƪj7Tl*ǂt5[`:TfP@j7V{R3VV: 5jOcj-g[T;XUn9[ jj-gZjjZR`=VV˱Z jZ5`6fX5jZX]Vӱj:VVӱj: 5j:VMSf3`Vӱ~<Ԭff[Vl2Vfh6+j:MjRZ0UVP*j*cjnSjngl5/炩Pn cjHv/ jcvj;jjl5Ԭfr 5jVj=V.l6cTփfڮf`k۱jϖjdl5m5clՌlKWV3XUd5Mcl6fɀ5Vj+fvfv0fX5Mml UX5[ncˡ6*p>ƖC6\ml+ml9jV0Ɩ[T-ʽXڀZV]Fr,Vmc˱j-ײd[r6ƪr-GCl9jVh XhLl-GC`:ft5[t-GC`:֪fP3r4 \5[v-GC`Afl9j j 5Y-GC`AfP3XVsl9j6l9jr4TmcPƖj+`͖vkc`-Gml Umlr0Ɩӱ6EC6Ecjv-{tBn;[mc^(mg^f^)r l݋XZ͖۽X-{r3`͖۽XƖ۽XZ͖۽X+Wv/Vjh6nc^4Tmc^9rWvrWwrnc^nv/Kr۱r3`͖۽|,ݎmlvZ@|(ƖƖ\0TmcX.r>굱|6۪fӱj6+5cV5X+]ͦcj6kj6kV5Bk6KWXMbP;^ͦ{lkU^,]ͦ{jMcj6l:Xl:XUv t;Slj悩Ppcrl]6tltVv9MW5ۮf Z`mJffۡR3VͶCf,]ͶCfmPmXmtVvLǪvLZl;Tcj*jmVv,Ȫv,Zl;TXP;VͶCXmjmlml5]ͶSjZl;ՋvvmǪv%\ێv&v&l;֪f۱f]ͶcX;]ͶcPmǺVmǺn\Ͷcjg^m\5m\5NW^KW`*VͶXԌU`**5l;rmSV5bjLjSv0[fZ0jt5ւV5ւr5ւt5l;X jv0[fl5Ԭfl5lv0[MWl9kvl;[ffmcmlv;XB6VsP4 cl;lPx.ԮfP;]sv5t566xWlLx9ZlLbj6^{j^4VmWt6fX[%zz(]cjkl=֌۱jkXǚtVzLlff0jt5[5X5[5Xǚt,]c`:XUX3nWX3nz,lǚP5[5t5[5l=lcjknl=-l=V UX5fj(srUփX5[bjlCX[ϦBj[ϦBjgRNV66_ j6jj6 XP@]{rӱj6߮fl< h bml@f g-tЄ 5bxP5KWRZJj/nx)jKP/jSX\PcXO5cj<ՌSx˶X5jj[t5ފx+[Xobj Vsx+V`]vok<\.NWtUtdOZx2Ɠjo6f3X B`Z7Z0֪ƛ`-KWfƛ`- f3Xfh)֪ƣXbXb`5WGKr3NWRƣ`5WGK̀5-Uct5-h)7xNƛxƣr(ƣrYGcP3]GcP;[ƣr0UGc`*Ԭƣr0j6x4V6`]Gcl3 XX9OWX9O7x4Xx4T^ j fj`WrjAƻ`YwP3݆cRk˱^ӱjx9kUt, r:VX9KWtX9 Ur:`5W`5Wr/X/X/X9]r,]rxoBX5Nұt5NCd\SP*+v/Nv/Nbjӱjv4KWr0TX]X`4VmWrVv9ff5.l5lv9fto`Lxlt5.l< XrǪvo{fo{f3]۱V5nx+v;+Wv0nWvKv;XUv/j`pZxڌ6 UQ:W0ʱrpfՀ3[MWnv{j@ej0^6Ct5 j@=TnՀ?m5c8bl^:v{ql5vqldlAf t6[VslARv@ 5P3 5cTvCt cn(Uct c8 vc87vc87Vvc(XvcvcڊXA bl7Vm@VUnڀf^ƪ n3Tvc:/bn`gn nkejƪr:ۍU{Pkejsc`5ƪj.ƪ̀VctX5-'X9ʡl7Vl7VX9ԎerkerKgrLerX9fnjP3ۍC`j6njt+z,ۍC`=vcP;[vcP;[Ngretۋ58kCt Sx:{f4v{^6`ڽP3mfst;ڽP3mfsm7jDz`Kgj, Vcl7X`5j. VjP;v`v`+ ƣn6Gl:nڋrVcvVcvvXvr;^ell-`vvLl-`L͖̀j0NglX:fx5hl:vX+fӱtͦ\ͦXͦX3v`;vtVn6l:fv0[ 5n6lt-l[ӱV-X:ctvX:Vn9Nt-`=v˱t:X5nKl[r:햳r0sˡ^[ lVvogX+mSn; 5v0j6n; n; lLv0vhPvh0jlӡv0[-v0LDzv0LZn; clӱtF`5`:``Le`4nSf3`vh jl l VFY9m,`AXe`4vh<\fn;n;̀fVfl`XLn;mvX5vXƛjvl9·CqrΖCf,Nl9jr(or'Pj6rCl9TP5˖C\AP5 brUctb倶bl9TۡjP5-ڱl9frVr-gˡvLr-r-P;[ɥ`:[͖Kv\ CllllZr)؎RRΖKl9 [r*rKˡl9ՋP3[Nbv9ΖSX]crKˡv-ztjrKˡv˖SX]jrVrle˩^Ζ[`5[nX+[n`5-Bj:[nBl 5r+VΖ[r-b`5-b`5Ζ[r3Kg˭Xl+7r+VNg˭`5̖[je˭`5TMr+X t VC`3-P9Xr+X r+X cr+X j VC`Ζ[P5[z0 UV˖cP5'rjeteP5N`c89Vcl9cv,-\-BV0-BV0V@g˹PЖsjٌe˹P5lr.T \L̀ Ut UP;f˹P5j-B`:ff UP;̀ UP;\LDz\LZr.T cl9ӱr-B`:VNg˹P5\Ll9l9t Uv Uv:[΅V\,lΖsj jP3[΅VCf@[΅Vr.T dr.T dl9 r UY9-B`AΖsj \ΖsjA-Bh T l9 T r. 'CP5`Ζj;Ԍj; r0Vm89CtUۡv,[ƪP;ʖj;Vsr0Vml5[ƪP;`ڎ`ڎj.[ƪ`5-cv:[ւXSt̅l9 V`.X 5`.X 5퀶f3-sjΖ`5Ԏe\jZr0ڱtv˖`5fr0rvΖ`5'qrMe`˖f,'89r0(NDPrr3Tmefqr3f@Nn l9mhʖhΖh5j(C`-WCXkeP4Vmj˖vЖrKjЖv/悩P3[۽l3 r5e\0Ng`mfsm Un/T brrt텪V텪8ۋqrLX5N.r9j܎Brme`([nlLe^te[j;ng^v:[nl?[nl?Kg^v/VClʡn/ʖ۽lrb`*[nPLv/ ZTΖ۽l7klvCV0.v/ Zt;-{nLe^kSlvc`'9P3NX5qr>lClCXJP4Gbv]ʖqt)[R6^TGbf(NP;Mfkeө`jt*lj.NP;fө`jt6 6vMf-ȚSn,\6ۊ88ʇ^2r0G7qt4Tͦx4fl:Mt4hʦX@cuƲtLl5NkX+nǪ`˦۱j:Xjvj6ݎUۡv0OgXjt3McP+t6ݎev/nDzPLeXjt;ڽ6ݎer6L`ЦX9nC`:MˡT0ker(LtJj.nC`:MˡT ˦P*Xv9 \6.Sl]zt·8jqt>l qv/gbf6v/Vl+^cv/VgV3 gqv0gCPCtݎvmctfl4TͶhCP+ex۱l*gZ۵P۵`۵`يv-kbt6ޮxlv-nZxlcl] ۱r:oׂv۵`v&v&cl]k`5kl>oך|:oײX+ox; Vsx; Vsl+x;Wvl+gl+gl+g^6Εv/sj5۽l<۽l<Kg`5\:o7CV0PLm xJcl j.o7Cv:o7Cl cl \6nl v3Pgfv:o7X6nV6nt6nj.o7X6nV6nt6nj.o7dnflfl l Uczj,^cl UxP5˱V6ގX^v4TrP;P;Ջv4ۊv5-xbX+oWRv5-l bxJZxJxJl j;owC`Ngn\˖x+ײhr-[lݍkr4P*Ux v Zx \6flͦlx\6f`5x;owt6`5ˡ\,oCX+oCX6P.m]bl]\6.x&v9TMZx&xX(X(Ջv9Jbl]R`5VV`.+gr0xxfrZ Vsxv:oSr,oSrөl9XetXv:lv:^^Kgt/X Vsx;Vcx;lŲv:؊v:؊ lbt6N[t6N lNlNt6NGCv6NGCvPv:*x;mv:/bx;SV6NgT,x9vvvMƪx;&cj,n9jet;Tmln`5 ht;fx;j:oۡ6NCY+oX;Ջv]vv]vV6Nn7Xet즳v;ۡd,oCX:o׳X+oCV6·ʭf@oCV:ocr6ǂ^6ǂ^`v>x;lg|`;v;`v>[Nf|v>[NlϖxAz@BX+[5z UP9Kgr@[czVP;X5[U l=VmBX+[UlǪl=Vckj;Vckl=VnX9[Cxbz*ūPʡT/DzX9cX+[C^0VX9cX9ʡT/l=VzJcl=Vj.[CvcPcP.ʡ\,ʡf3[Cf:[CRz*zj.[CX+V+brcR,TVs̀+X+|5[KPʥl6ʥl6ker)Ml=V.e^;[K`ʥxfr)^nŪV+m=VNl=VNTcTlt,[SnjӱV+B`; cl=VNvLl=VNl=VNB\,[SP9ker*bl=VNB\cT3JfrM%cl=VN5dcT6cT6Ngr*er*X9l=VNeX5jDzX9vctker*ƪP;Xer*ƪP;fr*[[j*ʩllŪl=VNel=VNeX+[Sl2XerͷX9U[V+|+Xer+V5X+[[V+zzl=Vnel=Vneӱl=VneӱV+X:[[tcV9Tkgrz*z*l=Vnct+ʱt:cV9Nl=Vncl=VnX+l=VnKX+[[R)Xer+^Jgr+cX(+gr,cXfr,Vszfl5cX l=VEP:er,tʱhJӱt+Ǣ^(Ll=VEP:Xer,ʱjOCv0ʱt; czKP;cXڱt+`4VszKP;fr cl=Vcv+r;frͦczwX+[cn6X9fr,[cvcXbl=V۱j+Xer-cZ,cZ, Vsz\ 6z\ 6V+ׂfcZ3cZ3cZ3X\+ך|5[kl>ʵf@Xer-lfr.VC`:ʹX5V5X+[sjjӱt+bX9 \+ʡc\9X9WX9Wz+g^+BV+B\+B\c^Kgr/ofr/oZz śj.[{x3ʽXʽXc^,Tc^,Tner/*l=VBt+bv+bvʽXX z܋Wsz\,[VX9XmśX5c`obv+x3X Zz 6z bl=Vnl=Vnl=Vnz uV+7Cncfcfer3cf( X X X bl=VnfC`5lcfcf6cf6X&\+7d:[r+[r+̀+7j.[T/[\`Ngr7ler7Ngr7Nz X l=V6Cm=V6CY+[P@Xer Xƛvl7 j+wX9[|ker7\+wX9X5zct+wT,[`*cn9 Vsz-l=VvrOZz-g[T;frmRl=VXkermR`=xcl=V.z\cz\cl=V.j.[˱PX(ՋX zj.[˱PX(ՎX j.[˱PVX l5X(Ngr9jŪz\bz\bl=V.[j.[n,[V,[f,[fx3crXfr9^l=V.ǫl=VNgr:ct,X(X,[ӱXct,Vct,Vct,VNgr:Kgr:lfr:ll=VNǪ`;Xer:֏X9 l=VNBl>ct/\+{V6ct/KgrͶX9fj.[ӽlct/ct0kgr:zF`- j+n3X ZzF`-Kgr:6+n3X l=VN l=VN V+X7[XX9݌uz6[zRP3j+T0 C`Z@grKC`:n, 5X+[X*jӱt+T0 \+j+[XX9ݍUznjX+[P;vkerjǢj;[P;ct;VsznznV+ۡct;Pgrfrvcl=VNcnct;Mgrƛvv0oj.[l*v6X9.ک^+X;ՋX9ݎjV+t,Zzẁ+XJƲXJƪz%cl=Vnj.[ۡ~+CX+[۽r,^9cvl=Vn|5[۽r6cv0cv0Kgr;XX hr;[er;[X&X/DzX/z܎z܎V+jcv\Mgr<cx:cx:cx:Xer=ԌDzXjcl=Vcl=Vct+cjc|,뵳X9ߋ5zŚX+[X3X9ߋ5jc|/֌X9cl=VX9c|ڎ\+d+dl9X9_cz/۱t+vc|9nǪz/g۱l=VΗ\Y`+[vClۏUZ܊kr+ c~`+Tm`+f~X:P;fV0j:XlӱVlӱrlӱr[t`:`:XeV jl? d~,Z~,~,~,8*v(ۡ`3q~@l?U.V`]jDz.V cl?UC`5tjV4[Vu;VX9'8ATNm5'j+J a,N0ct`x8:(TJlTjf nԌGR xJźT bP2VRh(+T bt7T,kcn(KX9 b;(ՋPpn( bhJkT ւ:(Sn(Sf3 `*fP*X ZP*X P*X n(cn(n(n(`Jkt; 7 jJ:(fTJ%T2uCd(kuCd(+wCd(+T2T2 VsuP**T2RXJ%ct7JP*kT2XuCdJeT8 eTJP* VZXjt7jnjƺVkuCV3VZfZf, Z`5 ZTjdjvPZ]bX> A`Zl* T2Zl*ZP0 ʱ:UuCr, P,Tbjv9b`]j7kCr0 U n( `*X+jt7ke`3 Zn/،X+P7k6CP.Trjrj0rjź\rP bjrPrR6 bn(+wCX9 bn(l:( \rV(]Q^3TvCV`.V@wCflvCf V`Aj Vcn(XśPZ7o(XśX: j Vf3VdٌPڌPڌ̀7`5%\7ۡdk` R솂v)vO`]*ӽX V۱V7cn(Xmt7cf V۱r Vj VjvKwCj; |솂n(X.`9ꆂ`5 j. n(Xӱ:(nP0݌uP0ގuCP4 CPJPJPt;T A`PjuP3 5CX bP3fvCP+XMwCP, {T Ų`LuCP,[mg\0X6`]@wCP,[mg\0NwCP,[mg\jbj;t7 U`jڡR3 5CPjڡf0jnjtV njtjڡf0kuCP; cnjt놚vjڱt7 f7 X Żf+wCX7Ԍf,Z UsP3VP3m۽`jƲvnVf6LP3l.`5cق6ꆚrԌnKwCX]5cvt;X uP3nP5]5cv9X uCX놚v;7ԬcovӱtjP3XmX7 V[l4jSP3XuC`5t놚tKA`:Ԋfj6C`j6C`< 5X+wCf)*nٌf3X; 5P;XuCf 5jj6nLwCfjFfjFrf4ԎuChU5rԌv 5v; 5v;`5 5tl3XuChjFvP30fjf:P3 VP3 Vn n o cPjZPjn j7ۡvjvP;XuCnjn C`nZP3r6 55CuP4 uP4lh`cuP4Pvcn(ڍcn(ڍ\7n(5cn(5ct7TuPP6pX9 UjVZP5j(ՋuCP4TUCPT EC`ZUCP5j(SP5Jƺj*j*j j n*B`;PTmj+X4ꆪX4JwCV,nڊj+Vj+VVsP+j+[AV*jƚP5,jkuCX3XuCX3nwCX3njٌj VsP5lƚ`5f3nwCXL nk6vƚnKwC\TͅbnKwC^jƺj/Tm5cn U[X9 U{j溡j0 Ud Ud놪T2 UtTMtVcnZ PP溡j xCl9 uCl9 jSPP5 UXvP5n.j;fnڎj P݋nłv0 U۽X U۽X^ U۽X9 UX7TmcnVsP톪l4uCv6ZPt7Tmgh놪lXoNwCv:lwCv:lj; U_6놪3XjATU rml3 uCuP7 uCt7 P7솺r`vCP9T0hn( uCQ7 Dn+wCXrJZP7Vn{j7ԍKTʥP*r)*n\njP7VN5t7ԍcn+n+7ct7ԍP7Vǂ^X0knϖP7VxC`ꆺf3놺f3TxC` utvP0n9 uCtԍn솺s< CP9TjƺrԌrmrmP9T6nJڡh CX;6P9۱nJX*Rx;ʡT/VsP9t*RX; CXTbP9Ԋr+rKwCP+vCP+T7Th*Zj*Zt*Zt*Zt, Cl*Z~, Cl? 5rSf3 CZ Cf溡r(vCP.[MwCPr(Wu{j*rPʡ\<ʡ\<Ur(r(P9ԌBnjrf*P*X*X3ʡf3 VsP9lƚt*X3+P9lƚ\9MwCPkrPǺrPZP9 cnjj*ukrPP9 nj nj V7T5Y*ʡh,er(kSP9P*V0ʡh+wCP4֎P9T7TE`;TP9 6P9 Clʡh6^ʡh6^NAP5 Cl0 Cl0ʡj6ʡj6JwCP5[uP9T͖f7Tucnnbj uCPWcP9CX*r(KwCPW\7Tu\0 Cf,LuCPSnꖳX:VCnꖳX:VCt7TuU/P9ʡtʡtKwCP:r(lSf7T`: Cl*f*i7T7T{s6ʡv9P9.gX9 K`*fUP9kvCTkuCT溡r*lZP9k6\7TNŚnuCT/֪ʩ^,vCT/ʩ^4VmwCT/PUr+[ʭl5Tjƺr+[r+[ VsPr*ZP9VmwCX]@wCX`B^ cv(ʱj;ʱj;ʱjKP9Vmb`*Ǫ^,LǺrt cv/cn{t0溡rT cv/Bf*Ǫ^6۪ʱjͶrVsP9Vmr, cX*tTP r-lrf7TzP9ꥻr05rj.]:LP9uC`W@wC`KwC`VcnLjt0Tt0TMwC`; uP9 n r2 VTNuP9+P9r2XMguP9*'j*'j7TNr2 xCd>PwCd*7CT*7Co dn \7Tnn܌r3ƪn j;TP Ecv UP Ecv`(P-wCfl xll< :Cn 悡j*WCt<]f*gS` ^0 P9 ZP9 P9 xCl+ 溡rf X*gX*gt7Th7Th :x Xn\r9kuCr0`5Wt*n\ζcn\ζ\7T.gn\Ar*j*r: ӱT*cnr:`TNkf7TNj0OwCt0r:XuCt3j `7 j7TNg\*tTNgn*`4 ۡd*CX*CX*CX9 ۡd, ۡdX*cr*{:Ūj7TnCnv*f3 P3 Tr; vCv TPLv*`7Ԏr; vCX*`7VsPLv0[`* X7TnSn-wCv0r*`7ΖPLX7TnSn3``+eCV7TnSX*x3T`* P;vCv0otV nP9uCv0ot T*ӱt7TnSfLnP9PLśr`* Y*x3Tnr;7Ct7TnSf`* cnZPr;XuCvKwCv0vCv0r;Uӽ`*` v0[r;fj*`f*r7TnWc*r X9XuCv5VNwCv5VNnܮ^l*d7Tn\*V.t7Tnv0[|( ;xCv퀰ҡVҩPJBJBX7Nn(ꅚPҽPJgt8jƺtJ^9t:Tjƺt:Tjt:uCt(KwCt(ˇP:򡀺JKlJcP:kuCt ӱj.VX5+P:bt7NP:+P:+t:VNP:KwCt` l5ԎuCt0[ c̀7NZ3t:6ct7Nt7Nn(c P.WzJX3 zKt:XC` zl=Vl=VnnNwCt>[nuCt>[n5l;jZP:ϖ[n(+P7nPX)*t;XJct7n:(ݎd7nt7nuPt;/ӡv0[XLlXLǺt;/ӱV7n`:VXLt7n`:VNwCv,^cn(ݎtX,lJcr X,ZPLbPLbn(ƺt;KwCvٌuCvٌt;uCv0KwCvlJJPJP; rJˡhJXJo(NwCvx9x9 U[P/P/n(xCn]@AP.[ v(CnuCT/ک^, S`5 Slک^>[NvCT/-'P; xCXԎAXjǚt7Ԏ5nvڎvVsP;Vm7P;Vmv\ E`( cj cjLGv\ 5v0 cjڱr5nuP;VNgP;ڽn݋n݋PڽZڊvbt75ct7esj7esj0 {\ڽl3 Bn6`*lv/悱t7e\0ڽl3 n67ePڽ|( {P@ j* jjcv jU۱r jXjjX7VCnvC`6 tuC`:+c:] uCl0]n]ʩ^7.CT/`ꥻv9*z;]v9 Ar0`*`**v9 PLCt7.SVj`jd.Sjdjn]FՀ7.n]fT7.`*lv9mn]f:]n]6v9lkuCr VsPmFCn]6j7.gn]Vv9[ bPn]VX7.gt j0+wCrLt7.gtl5v9[ \7.gtkv9[ dP V7.gl5XVs̀7.gn]fP; XjvP v;Xjcnݎcnݎ\7nnݎt7nXjcjXX9]۱r:[X9uP`jt7n:VjngPn :( Sv7xPo :(ތAfAfݎAfݎuP`7Po:( VsuPlx3[śo(^Mx5 xCn Żr0X9x7Vcn(ލ`5 Żr0X9 ӱn(x:`5WClnkAXǢjǢj; c: uC`3vC`3zPTofuPPz3[z3[PZP>XuCf7vCjMPZ*grWcn(_Mn(_Mt7Pʧ|A` xC(h \ 8r廡R3 LT Bd zT zT2 \7pn( kuCY P@VNwCa5 P 8V HCv t;VNwCiXX n(պVKwCm3 v7:(`5ƺPm69l n7P7tpgu ȤX uXmP*VRn,5zBXԌucT,TjP*V7P*V7o,j,BX2X(KbX9ݍRd, VsX(r7JŢdBX4 VsX(KwcTƺP׍RX zo,ʦX(M%X7P/VBX5ݍX(kucdBt7JP 5cXkucfBt7XoXoP ^kar*֍:,TnvcrBf V*7:,Tnn,Tnn,TnPBt*:,TNgt*P Cv7Jr Cv P;` r7V*5cXԌRKwcR3XucR3Bn,T* 6XKP7JvcdՍrK%\JPK%^7JT6ݍXvcvjvcvjT T `,ݍ`lT o,CIZ\6LucP. BnesT xcP.ǺV(VٍBXkjkXk`5׍Bl7 5X+TmwcPLucP]xcPZfkV7j5cnjnjX VsX+VX+VoKCnKCt7֊`ڍbv9ӡv0[Zt UX7֊`LZX+nj0KwcX]tZt UX+jn T0TZPLCkCr0 UX+jt7 BnLJnL˱nL˱V7 XkSr0Z\9Z\9kuc`V0V0X*wcf\@wcfZh+wcl4֎X+nXke`3Zl*g nn,֍ZX,Xucd7KJl7KZX,溱X2ݍŚXkucf܍Śr5\7kt7kXUXۍźt7ZX+wcnb^b^Kwcnbt7{|7+wcrcXlX9ucrՍjtX,]ڡn,VuczՍt7n,V{X,uc|,ruX.\)*\.֪r`cX.\.`r˥`9ƊrǺbjfKƺd,]%\ VstKfcX3 fkbX֍5PkSjk6Crk6cnٌcnٌXO[X3kal7[ұnƚXk\7lf=ƚ`dFPaP7V 5jLltV njӱnjӱV7V 5Xtƪf ƪf kucP3Xj,njt7V 5obX5TMuX5TucTzjn 6cn 6\7VMXfƪ`X5ljBv7Vmt7VmŪnڊU:ڊcd\7Vmj+XoƣXoƣ:kf:kfPƪv9ԎucXjZX5.ڱt7Vˡvƪv9fX5.l5ݍUcrǺjU[X5Vj.jSf3Xƪfx3ԍUt*wc`5oX5؎USnlǪnlǪ`ٍUX X5؎Unkn zn Uj4TM:ZêP7VnZ UnZj5êXê`VcXj5،Xj5X͵:ZMP5êtYUVg=T uX8j0TMwcjVvX0j5^êՂ6جêlj:6CX5Vj:JX7VMXj܍Ul5VNwct0[Mwctƪ`= xcv7Vm7nnt7VmrjVmrjVmrjݍUۡ\jvcv(j;+XʕCt7Vmv\Uۡv,ucvkfuXav,Mj;ʦۡfVmRt; uXKeP3ݍU۽l<ƪ^6j;vcxڱnʡn/lVCX7cn,[Mwcjvn,m :,m n,mr0VmZXیlKwcn3Xar0ԍunnZuۡ:lgn7ƺXvcnۍ nۍSrvcT\Mwcnkucn溱n7Vnۍj;ݍurƺX9[ n7VNanƺX9uXv\7n릃uX7,n:Xƺ`붃X7m[t p[NvTc:0֊fn0XX9cTSV7+bn0VNn0VNfSj.]X+ct+n0VNׁrj7Kׁvku`]Ձv9 o0VƚTLuZ3 \ bje`.X7el3slmn0V`.ku\s`,]rX\7ӽn0 ؁\t7LTP*ku\J%\7LT2 zP+sX5ct7ƪn0Uۡv0[sXkuhNwn `. V\sP ڡ`3 &c`2V@wXL`2jlj`3n:jfKwT/TnuT/TnflZ`3xlbnYcnY\7̕:+`3WFCX7̕P.r0jltLv 6`źf3f3 Vs`*wfkufR 6l?Xl6\7ln̦`M%`-cn̖`wf6 c`ͧBXl6Xl6t7lf3]`3v 6Xlfjlfn0`4Vmg`4`4n0Xvcj Fjvn0mZ`یht7XZZKwP; VCPRBf7XM`5+j VS/خ^( VSXzt7XM\XM`5Oj7XMӽ`Pƺj,PیuXm`5t7XVXV7Xjl5 VsV7XnKw^,Xl3 V{f, V\7X f`5j&jX&c:j7XMnd`5ud0`5 Vt&t&`5ɀ7XRX7XRXVCX7XZ`j5XujfS^0[V^ V^3 VnnXvj;Xun6XmjL%jL%`5 Vrv9؍j]vcn:Xj;VX9nwvnNwxƻnbnbt7X u`5 vՀ fXVcr fX9Xuj,VNׁv`6nnZ`7 Vc`7 Vcn+ׁXt7؍`7v; vcv, vcl9 v\7 nP7Z`ցn vjv`7 vx,P5P n0p<`5 CX:bf,P7XU{t7Xcu`9ԎuP;V@wP;ˡv, C`*ˡvl7Xcv,gv;xVs`Lt*TSt7Nwt ӱr7N`:t;`Jt7nǺt;`Lt7ng`mt;[l5 vlu`; `;۩^ `;Ջv+wT/V.v+vKwT-'vW˖nnECn`;o] 5`j6` {o nv0Z xf,j7V`;]`P5PlcnVsu` Uv;]Rt)^v;]slǃP9 `;`@w퀰nmwl;v ֳ`5 ֳt~ ct7~0 tXn`Ձ,Dt7X0` *AVAV` Ln2#o3 [f(*f(jǺP*ԎP*Vsf(6CXmRR bl bn3VmR^يf(ƪn3Ecv bv bvmRj;6CX btJf(luT xT6C`56CdmRX;mrP9u\0Tcn3 tmrP9 n3 t6C`Lf( `5mrP9v\0Tf( v 傡r 6C`,Zf( a5mrXcn3f(Vsf(u` [n3v`5̶{t Vcn3n36f(Xn3PVsf(Xmw`պPjt VZ-mv6Cj;X5f(6Cvm`5mtvjmrf6CXmVf+P56CX Uc UcP9vj*P5Nwj.Vmwj6Cd&cn3TMn3TMP5VPkՙj56CjmX9m`5m`53ClPm U R(kՙj;Ucn3Tmn3TmtCn3Tml Uۡv0[Mwj;6CvmX9m`5m`56Cv n3f(6Ch tJcn3nʥl6Cvkut;VP+n3nj ۱r TJ`:m`*PLӱtJ`:Xut; f(Y T P;mڱP cxmڱPv|ӽP96o3PwTیVO%\O%f< x\bn3n3en3 Vx.XMw\یGx4uhیGKVbn3-tbt\f<6XیGcn3 Vsf<x4kwh4֎x4kn3n3xmƣXیGrv\vtیGn3Mwj+V6Vkuj+Vfڊ\btbfx5+wj.VNwj.6\6d&cn3^Mn3^Mx7VRn3^5x9 C`mˡf0jیC`:mˡf0kurLfjjیC`:mˡf06P3nSfjo3^5Y/mˡfیxی`A6Xی{f<݋x3P9ի3log n3ΦʡTیrmT9x;*n3Vh6j Hv VYFhXVsj, n5fP7JPkuT/VfC^fC^cS^TM%cn6T2nY7J t kud]fl*kdM%cXM%cZͦvfSX;Y bl*kT2Xud4TNZl* n6Lױl5[ǦlmuT(f[Pf[Xm\7V.[Bul-o tmCr0Nw`]x`<ͶhmVccl,Ƣt7X:l]@wv,fc`PPcc`*7kt7k\͕n6WFl0W USo6n6f VSP5X uj:nCn6Xmױj V l5cln n6Xmwj Ulڎ`k5lڎ`+``l6h7f0fvfv3NwjKo6Xm7ct5Nwj;,ulmwt cn6Vsl0vtkut+wt`:[ Vsn6Vt7Lg:6NguldMZul2Vd&ct7d,&\7 رPU6CV]6Ct2X6Ct2X@wPmul3TfLlmtV n*ӱn*ӱV7 Xmtfrflf,lmm6C`Afr f f l3V6cl3 f6c`mƢT6c`*nwX4JwXft7 bl3l3f0l3ECmSh6XmS|6v`*FcnLcnLnLf0eXmS_يl3 HCX96\7 ff06^7 {V7 {r7 {rmӽXmӽ`5W6Rfvm۱fm۱j,fv6X:fv,fv06`*fv0j6l3j7 `Z@w`; nlStVfLӡv0[-fLӱnlSt6`*fLjmT jnlSmT ku`; \7 dfv0fv0Mw`;Jw`;Kw`;`6l3fPmwd(6ul6Tm6CVlʭn [nٌf3Vf`5ԎufjZljm6P;vfjglrm6\7l\m6dlfSnLwf+wf+f3Ulot7l۱nٌcnٌcnٌct7l۱t7ljm6`Z6~lf3`@ױf@Tfmffcmf`:6`<6ulf;Vłv7lʹX0Nẁ7 rmTr6fU3X f@nl3 Kct7 ڽ3Vù. l3 Evmth6f](f]3f]6l5f]f]9ù4ù4VfiLù4VC`6X9j6X9ù4Vcnt,6X9Vsl3 l3 ͖`mt0T6X:ֱ̀5nfPmh0LẁmX4fo/[ fVl3-ggfoml3ṉjmg3T fKT7 c^5Jẁ l3łv7 {`Lù npbX7 ȫP;^cnc^f{pvP+FCXXX9FcrjǺh,WUCXʡj0TFcP5vhFf3fXh4`FP7vnh7Tֱn,cXvn6FlMo6lo6X:Fl5cX7[Ml5vT/f`5VSofXbXb`5V[r6fX9O7l+j+Vcl5fn Vsl5fXc:NBv9ֱv0c`JvvVf`- 5j;X BX7[mkTkuvLڱt7[mkTj;vv6[MwՀ[ xՀVjܡ`ܡ`3flfSXͦzt7m5clՌlfklfvfkX9f{ulWf{t7Zlfj6lcX7mZll3f`+Vfn6fXv\7l͖cn6[lӱn6[nlKlv6t7Mencn+n,]vcYۍdt7ml*n3XfzvX9vn n t7lkunvrvrvcnۍln7Xձnf݀7 n d7Mױt0Ռux3ux3TffLlƛr0jƛr0ffLZl7 Xƛr0n*ooVn* novP9XVsl7 ooڱnoڱV7ۍ7CXƛvffVnj)njt7ۍ7h7ۍ7v7ۍ7vƛx-bP͖Sf(XMwT-zt7[NnwX7[NŻj,͖cl9f˱t[l7[r.͖\7[Nvd͖r-'t7[Nr2`@wj7[fr5+X-Wrۋl͕C^0͖\9r6lr6f^fl0fl0KwrձtcT/V@wv[n7@bl*v-Cf-Cf,͖ۡ\-CX-CX-C`5͖ۡf7[nnNś`-cn܎U[lbn܎U[j-cV-cv7[nǪl<͖۱j;͖۱r[nl+l+t-ct7[nײ`-kf0f^f^Kױv0TǖP͖T-r-\7[nnfV7[n`5͖l5]ǖPUǖPU@wv3`ǖP-j;ױv-t7[nCv7[nCv0fr(Nwv9l˱n.l]Dn.f-ˡ͖P@Xuv9Pwv-lݫcx.Ԭcx.,r;ұn6fӱV[j7tfӱt7l:/tMbn6݋l:Kw`5ͦn6lZl:Vsl:fl:ff7jͦ`tVl:cl:c̀7X5Nw`;Xtn6ltMzfv9[fvMcl:Kwt,fX:kut,t:Nn6lMct0[Mwt,cl:KX3ͦӱt:XUct7N`=fX:-wt,Ζl:,v0f`) l:,5cl:,5cn6o6Gt:Mwvnwvͦ Lt7n7phMv7n7n6npT,VslxVtVfP.ͦۡf7nn6Nʭn6Nʭt7nX7nXM[T7nvjvvͦ۱r7nlMc`fX9xvl n6ݎl+ZP;ͦ۹rcn6X7nl<ͦ۽x4O7luv0f`5ͦj.ͦx+ͦPMrMr2fhLwv4nlUt;fx:fh0.n6ݎf[rMV\ lͶbj0fh+WvMr;fjjvv+zM`Mr;fnfnkuv7[Ecv7nwX4VmtlV\7nwˡj+jvvMөrft,Vt; cloڱV7nǛv,ͦft; j7nˡf7n˱n6ݎcn6ݎcn6ݎ\7nj.ͦPMhͦlmJX7{l;Nnjgv-vv)lcn]5XmbfmfͶK`3VNױX4vX5f۱jmǪP;ͶcvKwX 5vv0f۱j;jof3Ͷcv0LwX x^,f۽Xf۽l+w^يlmƺv/یv/یv0[fl5ͶTm7dmgT7clncV(ͶӽXf^Ͷӽl;Ͷۡ\mcnݎv;VfXfX9fX9Kwvv;VNwvf`,Ͷjml @7OxkuT/fn6^źx-]ƛlblbn6lluj*fT,ƫ`5ƫn6^mrn6^mZl VslJwr7/Zlx9]`x;fX\7ozxXp`*vn6ߊ|+V|+VVsl+|+VرXYcfc:6+wXWs7P*kuX |\ʆn6+Zl>Vśl>Vś̀7{x:c^6||܌l>Vnj,cr|crBPn6ulv:-R`*TjƺPLr(B`;KwˡT; 5퀷JPCv0jPLźPLZr(bn9jSj[T<-R`*MwˡT;uˡT;PLr(\J`+wˡT;frNBur*P+ɡV[r`Z'bl9vˡ\4P.jSf3-rP;Jwˡ\4r( vEC`CxNCr(XƺPP0Ct-X[ӱ|P0P3XuˡfKwˡhP5CT-X[USt\P5P5-t&X[UvCP[cV@GP:^C:9NbvjzvCXjr] 5r] 5n9VsrCvj n9n7crnZrn:9ToP-`5-tr(-V r( +r( +n9kf3-r[\ Xv˱-gfkrku˱\Usn9ӱhku˱)Mv˱)MZrAfj[5H`-P3orZ0jn9t;v˱WP[5fCT6[-Rl.R>(+RJP:*RT6^NʡTUbl9+R^ˡT,KCXJr(KCXJ%ˡT]r(ˇ~P5T/k}PkA^Y@A^RXRX+T/ZJCr( 5h9 tJCfJcr(}P*XC`5Wh9 P*nˡTJ%ˡT`5CdUv9JڱXJ%cXʡT2NCd+Rt9V۱xJeX.Rx]Xj6ˡTjP+TNAT3XʡV0,ZP0ZP3]j*VjjCv3`vjCXjCXjC`5Wv0[-ZP;ˡV0ΖˡV0ΖP+ 5ˡV0jӡv0[-ZTLl.ZTLʡV0jӱV9 B`:.ZTLrLtjSf jrLjSf kC`*l̡V0jˡV0P+,Zl fˡV0[@C`A+X50Zl(cP+ z0Zl*T.eP+ʡV0+Xjr C`6ζXjl. 5ˡV0v9 f\0NC`̡V0 UˡV0T9 fP+mbP7`^9 {t9 ƣP+OCljX+ZT APBfBfZՂrVkʡZkCZ3.jf+jr֎ʡZ;V.jX9]jPʅʡ\(Ղr(k`5]Br(+rV9ˡ\.TrV9Z̀9Zs( VsP.X͕C`5 CfZ嚡jUC>(W r(ˡ\ʵCr(FcP.ʡ\>[nAPŚ}P/,r(؊ʡ`+V.X9][j PYPUV9lr( Vsr(,gCr(,gCX 6P+VNCf9jr(,gCt9lˡ`3 Af>0|(.X]PZ@Cj %c>(X Cj)/R6.T6.T6NCjCj`5VVPZ 5PZ 5r(Xe˱t Vrcr(X r(X VsP %cr(X햳Z9ˡ`5ΖPngt9CX VP0+X cr(P0KCtZj tT샊rAXc^TVˡdJZ}P2,t9 VsP2C` AX0냚`W@AZ9lcr P0̀]5a55>PAP }P4 AP+T탢d9UC}P4T탢jAP@T CR3VEKXr9-5ct9-5cr(Zjr(Zjt-eˡh)^MxT;tƒj9%t9Uh,+X9 ւP;C`- j˱ P4kCh냢jV >(h*h6]EPʡh7ʡh7ˡh7 VsPˡh7Tm7P*ˡh7Tnˡh7]EV9MAt(EӱtM~P4 P4 X9T탪rCT/V.^*^.^,]US`5USl9TM[P5-CTˡj*/CT6^.ˡjj+U[fTm> 5tTmb}Pk6j+U[>6k}Pmv{PCV6Ll`:ft9Tmet`:*l4ˡj+ \9TmeVˡj+ dP V9Tmè9TmeX:]U[h~PUcr+XTʡj.*X-XmP5+C\X9]Ust9T>fP5> Cd9TMZP5+Cd,`&X9TMr VsrlʡjkCd3.tTʡj:JCt(ʡj:JrFj:-l4*l4X͕Ct6.rڎʡj;V.X9]Uj\}P6,P7 frJs+V9ԍˡn.t9ԍcVb> ŚrlC`A cP7 P7j̡nVcrP7XC`5Wuv9 rۍʡn7,XkCn VsPkˡn7V.X.X9]ujvv9fX\ulƪr.T fP]ù9mgP-ˡn;^CvKCvˡn;^̀ԍW fԍW ffǚt9TCX).ʱZ0*ʱf*P9.ʱt*rlcrl̡t*ҩPJBfJBt9C^\{rJb>( ʡt0ҽj,x:Cn9br0.R\CnUjJw}PoPP-TP+Cr]@CP;6r] ʡv)KCT/.ک^kCT/VsP;ՋP;VcrrjP;VNCXjb>˖cP;X B`Z`U`,]9jjrP;-ljPjP3VjKC`jӡv0[-l5 C`Z@C`jӡv0[MC`jӱrVC`:*l5 crVC`:X͕C`jrVC`]jLrVC`.l5 P;Vˡv0[ 5Q;ˡv0[ 5Y9ff kC`j t9ff ʡv0[ 5sVcrV\9fr̦v3XCt9nPkCv\jjrnZP݌ˡv+ˡvKCv3rnP2.f+fjP<ˡx*O7~Pśt9zXWS`,.T/XP̡z(+\UCXrt9T\9TCXǚP=֌ʡzʡzٌʡz VsP=lt9TUzZcǪ ^(Xʡzʡzˡzsˡz\ct9TzrP=X͕C`5.l3XՃf0]Ճ^9T{V9T{jӽ`5 C>(Cn CXr( b}P Cj,.~P TxTX 34[mAi*4^mAiAk XCVƚ>(`5[.j9PCY9Tʡ+ r9TЖ^- rͶ{V9TЖKT*h˥P*. r*̡A* a5W P;T0h:9ZXTU[XTU[V9 CV+l̆ZXV rJXkl+V5`X9,ʱ+Yk`5+c X5bXk`5+rwv9VPʱ9 ۱r9 ǚP:V5ȱf,ʱ9֌jkXmfCrSr,TJg˥r,TJg˥X zX( r,ZX(Ջ˱PʱP*r, Cj;*Bp<\9Jr `9*Bv9JCv9JCv ڱV9J\9Jj9Jj˱PVC9Jj z+BvjZX(CX zʱPl z z0Bv\Rl9]Rt9jcV[m̱P+T 69jJX9jʱt b>,Ԋ˱P+VNcVX+{n V9jcr, XḻP+XXʱP+Xͥ˱PO˱POcr,*`5WZxUXUX.BbU}X)ԇBt9V cX)ԎʱRKaR, aXVB}X)JR, aX2ԇbP+ŒP+Ś}X),Jf3*Jf3X͕cXV˱R frk6x+Ś`6ṉR fj,.Jf+[X)Xmc`+Jr.Jl+eX+e`5Wv+erW[X)brW[j+eV+V*ncr6J`5WZ9VjV9Vjj+kt9Vr6[j+ŃV+Ńv9V'cX)ʱR<Kcx2X͕cx9kcx+X)Ncxjcxj˱RݎʱRVsX*LP5+Rf*.r,jP;VBTjZX*Lśv+Rf* j9 5X*lZX*lr,j6X*TmcPkcPʱT[B`; C`ZB`; cX* C`:*Rnjӱt9 uP3VsX* C`AfX* P;VB`; cr,fV˱TۍʱT VsX*McP/ʱTێcr,XKx9X͕cP]Bv+Rt;]Rr,*RVKZV9br,kr, vX*X*JX9R3.R`=VbzUbz\bz.R`=VNr, cr, փ\9UX*VmX*Vm7X*mRX9uۡT3.Rn;cXVv9ul5n˱Tfr,붃X9uzK˱Tփ9ur9urKr,Kcr,Kcr,Kj9l5,Rt:s,KjK`=Vzr.Vzr.*5cX*br, st9ʹ`5WzTKbdUzT2X͕c^ʱTLcXK[z0-RVLT+RnKKt9 vjKX]@c`7X*-gSf9 vT c`Mr,얳P;Vr6jZX*-gSv,]r6jr,얳P;c`Ms,,P;*Rr* \9 Cr,lr,llKۡv0[Mc`;cX*؎c`;*Rv\XKjK%tK%t0Rf,r,V˱T2[ʱT2[ VsX*˱T3cf(ʱT3r, r, EC`Zt:X B`Zt:X ZXJ9jr, Vcr, Vcr, Vct9jt9jjK5X9jӱt9jzKes`:TjʱT6W CfKes`:TMʱT6W CT.R\5clLZX*ӱr9t,]j0ʱT6W j9v0[Mcl,JX9 cl,X9Kes`A*R\5X˱T6W \9X*lZX*lr, 6X*lRr,m6cvUf,VsX*lR`Zf,fr,m6cvKej0jr,mftV r,mftKej0kcl3[ cr,mft+Rf\l9*RfʱT˱Tcr,mf`5Wl.Rh)X UX*-v0[-Rh)XclZX*ƪX9Fj**Rh4Vmcl4BfKeXjr,FcVVX*ƪXKeXʱT6U[r,Ft0[ʱT6 ˱T6 ۱V9Fv;X͕clcX*ƪXKe`3Vn6+Rh7ʱTڇr,X9VSfUTKcl5lC`ZT jKe`3X͕cllʱT j9V[v0[ʱT j+Rj-C`ZZ0/ʱTZ XKe`9ZZʱTZ jKe`9.Rj5LCTKeX]j,ՎʱTZjKeXV˱TZr,Vv\j6.ʱTZXKel]˱TZ`5WpX͕cr(_-ZX:]ʱt:*ZX:ʱV9/ZrNX+ VX+cx**ZT\X9]XkSR3V`5Wv0[-ZT;rOjkS`=VV X+^m9֊W[jkūP c|6*Zl.ZY9 Z}XMaR6Y@aTX r, ˱X+؎ʱX+]ZTV˱X+`jXkcZ\jrՂ\9˱X%cr, VsX,.br,l r,,bX]ŚT;*bXV˱X3*b`5WŚr,sr,sV9ʹX5+bX9Kch VsX,tEP:ʱX XEP:Vs}X*bP]ŪT;*bPʱX5jGcv9RhNcj(Ncj.cj3ncj3nZX X]ŪXU۱rUŪX9X͕cj;VNcj0bxۍXc}X,+˱X*5^9KCf0݋ʱX*5^+bv {X݇ڡ>,VczcXjCXCxʱX=ԌlcXKaz,]hjr,EX9뇢jUhʱZ(+jTUB`5WB^0[-jt/ZX-`5WB^0[McXV˱Z,ΖX-V.jr,VbXUbX,X͕cX9KcX9VMʱZbr+ǪXʱj*X͕cX9VmʱZr+Ǫx4]bX]bX 5˱ZX-V.X-V.r+cr+cr+\9VXkcZ+jfV9V 6X-lJX9V 6V9V 6jt9V VCTj**jj VsX-Xc`5*jj,˱Zƪt9V VcrXrrt9V V\9V V^9V V^UՂ`ʱZ]Ղt9V ۱V9V j5cv9VkRX5cv+jXV˱Z3jt9VkR`=V՚T;X5XKr֌r5cv5cr֌cr֌j9Vkz5c`= cfmfss֌˱Z6Ocl*ʱZ6OX-\9V6[X-lZX-lr-P;cl9+jrePeP;cl9jgs-GCvUղhVsX-[ZX-[X-[r-G\9V˖te`.jr4]ղhjʱZ7CXex3VsX-[ƛv0[-jP]ʡT;*jPʱZ9jrVzCv0jP.jPZʡ`5*jPʱZ9˱Z9+ʱZ9+rV{XKbrV{r9V+ҽX9]ʱt/.jXʱZ9fc^4Vmcr,݋ƪt9V+sr.j`.VcXʡvU\jrVbP;cr0+r9V+sr-˱Z9[U˱Zcr5cr5\9VǚXcf+jX3]X9Vbrbr}X- f˱Z*jj+TjʱZڊʱZ VsX-^m˱Z\ {X-^.ӽX˥`ʱZ\ {X]R0݋ƪt9Vt/*jtYP3]X9VcrOX-VsX-j9VC`.jv۱V9Vcror, V˱\(Xʱ\(X VsX.˱\YBX9 5cr,jX. ʱ\ʱ\ aP˅ʭr,*br,*\9 [X:]BV˅ڽX˅P9 ۡtU˱\ X.VM̱\+ڱr,ʡvUbX9Ԏ˱\+jŪrV˱\+zŪr,X.a\0ևrX݇rs,L[r,ʱ\0+˱\0c`4VMc`4Vmc`4VmX.Uۡv0[-rhڎʱ\0X.\rjrj(ևPՇX9 fX.X.X.tP0rl5݇r,Lcr,LcXX9X͕c`+˱\0.r,Lˡj;]v9T.rt*˱\0.lrVX.nt9 9r,Wbr,W\9+r,WӱV9+X˕ct+rX:V˱\9Nt9+`=Vʱv9+ڵx˕cZ cr.rX*5cXkCf˕cvUʱv;X͕cr6-rlkcr6 VsXwX͗cr6ʱ\9cr6.rl+rf\P9j97C`:ft97C`:VP9ʱ\*ӱt97C`:X͕cx3Tt97C`;`P9Xj97C`AVP9Xʱ\*7X. X. cX. cr,oڱt97C`5WP;cx3fr,ozśv\P;[Ncx3Ζ~X.ތ˱\ CX9svkcx9lڱt9svʱ\ C`ZBr*br*\9 `;ԎcP) CXJfjX/T 6P;X͕cP) C`ZB`3X9 X/T͕cP5ʱ^(+zt/*zt/.zt/X͕cXʱ^,TNX/*Ct֋P3]br:Vbr:*zP9KcXVsX/jcXkcXʱ^,Nc`9 cX/Xʱ^^5X/Oʱ^6ʱ^+zW9f}X0Â^݇St;Âr,c\5*ǂj+ǂj+ǂjkc\5؎˱`lr,`2ۇ̀l6t9tԌch)^Nʱ`/cr,-X4Vmch)^NǢj;]x9Kch)^Nr,XÂPl9Bj+ǂT\ cr,XMP;cj*Tl5]X\X\@aj Vcr,Xe˩X9ֲTUl9ƪr,Xe˩X4Vm˱`-br,Xe˩`5ׇPՇPÂ^*ǂ`5Wv0 cXlC`:*ǂt9cv9cvUv,ǂt;lZXnڱr,XMCX VP;UXnڱt9ۡv+ǂtbXڎʡv V۱\9Ԏʱ`˕C`5WXjr,Xmr]X[C`ZX[C`.ǂv-ڱV9cn9VsXڎX;]rOʱ`]ζX Vl+˱`]ζ`5WrOj9cv9cvUXʱ`j9cv0[Mcj=Vm˱`K˱`Kcr,X`5WXUXZP;V`.[cr,Xsrʱ`:ct:kct:Kct:H, cP;V۱rkcvjX+j cP;cX]cvUcv+NJT;cXVX1j˱b0W\UT+fX+fX+f`5Wj9VX+fV.NJ`5*NJ`5X͕cl.NJzjʱbڱV9VcP;.NJzjrǪv0[-ǒj+ǒjkc`Ռ˱djr*ŚV9 bfU5CXʱf(*ǚn:V5CtU5Ct,]5Ct+ǚvkڱV9 cj,.ǚv,]5C`5W5C`Z5C`jcP;˱fVӽ`kl5 vX3cX3ct9 X3`5C`=.ǚvLG˱frjt;*ǚvLX3փ9 ū^9 ū^U5CjKcPrcP?TmcP?Tm˱fjrl5]5CXkr9 ct9 crr cP@*ǚ+ǚkBj9֌XkBj+ǚP:Tjʱf,cX(kcX(KcX(ʱf,jʱf,jZX3 cr˅jkrv0[-ǚjkƪXkƪ`5W5cv3NcX݌̀9֌UX:]X3Vm˱fbX3VUSsrfkC`3c`Ԍc` c`c`.ǚT9 X3kc`և5Z9 jr˱f0Vc`kc`+c`+˱f0V˱f0VVsX3˱f0krrksl5]5`6ḻf0X3 ffksl<]X3Xc`5{X3X ǃ^U5pêb}X5+˱j,jʱj,jX5cX.*Ǫ\+Ǫ\ cX5˶vUUcl;jreP;aXهUcfX5rˇX55X5ʱj,ʱj,êX9V}XalV}X5,clclʱj6^MX5\9VCX9VCXfv,]UP;X͕cl=fX5[jfv\UP;[NclZUjՇU˱j9VmcvYUۡfcrڎ˱j;V.˱j;VNcv+Ǫt9VGKr9VGKrUURʱj l˦Rr9Mr+DzT.DzXvcXvc`5Wej˖[r9-bX˖[r+DzV.Dz\Ll˖sj0j˖sj0jt9-B`:Ve˹P5ʱl9ӱt9-B`:X͕cr.T D`Ze˹P5Xcr.T dr,[΅+Dz`.Dz`j9-cvUeXʱn(,ǺT2cP*ZX7JrjRXR`5WuCV9 r V۱V9 `5WuCj;]uCr9 ˡR3VuCrUuCr\uCr.Ǻ`9X͕cP U˱n(XƪX7,˱n*5cX7Tj9 C`.Ǻr;+Ǻt`+Ǻv9jZX7.C`5WuCr0fX7TcP=*Ǻz+Ǻ9 \9 jX.ǺBr 5cr 5\9֍r ˱n,r cr cfBXBX9]ucv+ǺP;]ucrk6crk6cv9֍5j;]ucf+ǺfƪrCTƪP]ucvUucv+Ǻj;]ucT<fX7VN`.Ǻr;,ʱn˱t9֍rv0[-ǺvVX7xv+ǺvǚskzK˱nJʱnJZXW\9 VcX7X VsXJʱn3JX9mRV9mRh.ǺP*Ur br \9mr U۱V9m`5Wu9mV9mj6Cu9mƪt6c`kcfLbrیU^+ǺX5Ecv9mڱr BXLJX9mSt9mSv6P;*Ǻ`*Ԏ˱n3 \9mSv0[-Ǻ`*fr Bl6P;[Ncf0*Ǻ`,]us XVsX7ۍ7CX9vP;*Ǻnjr-˱n.˱nbX7[nZX7[nZ̀9͖۱r9͖۱r]uv.Ǻr;X͕cl-Cr-X7cl:*Ǻt,]u`5Wu`;[X79ͦӱtfX:kcl:K\9ͦӱt:cl:KjfrMcr[btԌcr,˱n9Uۡv0[-ǺX:Vml5,ǺX:Vml5]u˱tX9-ұj;cr[cvUu˱tVsXKǪt9-r[ӱV9-Xct+ǺX:V˱n9Nt9-`=VuX=VuX=*Ǻ`Kcr0ʱn9 U[V9-j+X͕cr0X˱n9XmZX\9-t9-ӡf9-ӡf떃X9-ӱV9-ӱt9-j떳T떳T/*Ǻl(Ջ˱n9Jjf9-gC^-ḻn9J\9-gKv떳P;.Ǻl*Ncr6Kcr[Φbt+Ǻl+crOZXmSt9-g[TԌcrOr[ζv0[-Ǻl+jt9-g[T;Xcr6WE˱n9+X9-gsP4kcr6WEj떳Z9-gr[cr[փ\9Mcv+Ǻ`3.Ǻ`3cv UX7^jS}X7^jSX7^jSj֍TZuf0r/5P5]uf0jr/5t9֍tK`kcxL\9֍v[P;*ǺV0Ԏ˱n \9֍v0[-Ǻ\5TMʱn*ұ|+ҽP7V{nU{n,]{n+ҽ`KZ3V{Zkc^Vkr,lʱtkc`+VMʱtbr,lŪ`,]X50VV.V.˱tf9bvK[t9\9f9fK[X9t9X:lKsP;˱t0Wʱt0Ws,U\9r,lcTKX50f0Vmc`KxKr,L˱t0USr,LCT,]v.t;*t;V.t;VNc`ʱt0Ζ˱t0ΖX:n˱t]t9jK r,,ZX:lcl3*f+fḵtoǪtKgv0[-fVX:۬JX96r,mcr,mcr,mcr,mփ\9VCTKgj*.j.j+jkcl5Ԏ˱tjr,r9VCl9]n;cl]v]vUv+r;]jKgVUj+X͕cl Vs̀9ƫt9˩X9˩XKgToclj,.x9Kcl VsXK˱t7jJf0X*5cXKCfKwcvUT;V.X]7˱t7jfKwcv+Xʱt7jfKwcvKwP;cnjgX,rKwP;[cn+`;Vv,]X˱t7[mcnڊʱt7[mŪr,V[j;]j+V.lʱt7[m˱t7[Mʱt7[MX`3X`3cnr,VR3`j:Xcnc̀9f`=VX[̱t ZX]ۡrKCvUۡr;X͕cvNcv+P;*P;UXjXjr,ˡjKCr.˱t;/tnP.Pjr,ˡv,^NcvU۵xKkf3`۵xK˱t;X͕cvcvZXlzjKx;cv+f,.f,ṉtKtKd9ngSXKd+l*.l9fX-l5]rʱt;[cvkcv+cv+˱t;[˱t;[VsX]X]V9nCj+r(XMcv9˱t Vr,.Sr,.SXKT;X͕cv9jr,.S`.r0cX]r,.r,.`5Wl6Zl6.r<ՎcX]rUx/X]r+r+t9nr,8cr,8\9v9v;*R4nr,/S`)Vv97 l9cr,oCv97۱V97jKǛt97U۱V9GcX:ʱt<Kcx4X͕cxfX:6V9ẁ9kTK˵P**r-˱t\ \9sj*V\.r9jcxKcr,/cv+r9j>,/cv0[-r9jt9˱T;]Tjʱt< CXKө`;VsX:Nۡv0[ڡr 6˱v(،ʱv(،˱v(،X;lr 6X;cPkcP+cP+˱v(X VsX;˱v(+ڡdZCXkjkP;VC`kcP3jX; jkP;cP3jt95v0ڡrkʭP]CVNcPjr*br*br*\9[rzrcT/*ک^+ڱPWcT/X͕cXYcf+ڱf3]cv0[-ڱj;XcXǪtkrKcrK\ʱv/XMc^ VsX&XzrLŪX9bv9P;*Tjrc`UPVCX;X 5˱vJc`5+j<.rk˱V9cr,br,Ǣjk˱hNc`9.r+fkgr6˱v6یʱv6 VsX;[nclkclʱvNcl<+xkcl<Ջ˱v6r]bXJZXJXJr]XJCfkCvUˡT;X͕cr(fXJjkCvkCj9.XkCj+XU˱P+X͕cr,Jcr,.Xkcr,VsX XzXzV9.Ǫ^4Vmcr0,`)fX,zkV9.cr]R3VX=,`j˱v9ʱv9ZXcr]rkz,]X=X͕crkT;Xcr6jfk`k`kcrl\9.gsP+V\9Ԋ˱v9+`Z\9Nr]Φ˱v9Rr]ΦT;cr6ݍzkn,c̀9.gXXt9.gr<Kcrkjkr/WCfkXkXkX,]j\j.r5X͕cx.X]X;]jkrZX; Vs}XcjLlW`UūZWjr,^ fr,^ cXlZXlXlr,ev\Żl3ݎcr,evʱx:Tjʱx:VӱV9OX<x;VNav/VXʱzj9V5rjcrv˱z(ڍʱz( VsX=˱z,,P3*P3X͕cX.`+f9V5C`ZcP;˱zkcX3VNcX3X͕cXkcX+cX+X=lrk6\9V5j.]cr0.f9`ct9VUsrbrbxǪXǪ`5WcxǪXʥX9ԎcX+ڱV9VKrKcX+jʥX9fX=V.ʡv0[McX9VcXʱj*VcX5kcX9VmcX9Vm˱z˱zf9Vcv3`cXX9Vt9V\9VX=VNX=VNr+cX=VNZX=VNX=VNKf0r:XjʱzVsX=VNr+˱z܎ʱzVsX=Vn˱z0XcXcXcX.X>VNc`,ʱz0Oc`3VՃXjӱrLZX=˱z0Kc`:X͕c`:c`:rL`]Ճ`LX=frLX=crLjvۡf0jrltV rltۡf0kc`; crlt+v,lۡf +v,ZX=5Yۡf ʱzjc`= X=X5v9VC`.z.zV9Vcr>Vz3[-˱z6*5cX= j9V&cX=ʱz6Kcl2X͕cl]ճvUճv+f;X5X=l˱zorml5TX=یj0fVX9V6`LZX=یj0Kcl3ft+fVv9V6`LX=یj +fVYgv0[ drml5XVsX=یjgX9V6V9V6r9V6rgXg`5WX=+XǛ`ZV9Vr,*ʱ|܊ʱ| VsX>Tn˱|-tˇҽXˇҽ`5WV9V[jt9cX>Xʱ|Kc`9X͕clUVUV+rgXg`5WdKcl9.xUv˗X˗`5Wv;V-l;և~)^a?, Kae1T&5ԇ XCV XCVf>,`6[> * j+hV9VV\ DDr/Mg[T꦳`,]l+{n: cr/Mg[t,]l+Vs^ζY꦳`AX͕{n: yn: yP XϋPϋU^r/MCr/˽X;[ʽX;[Br/ΖP0bl9 }^.bhGC`܋ţv0-bh ʽX<j5CjCjZ@yP5[Xƚj Vcv+X^l^-l]TM{j6+gӱtf^ʽ`A˽lml+T@yV˶b>/ۊ>/ۊjmC^G˽l+ۊU[l˶XUV}^0R6*R/[ml*l5Ve^*ʽ4VV^@Kyi,]j {r/Er/EP {`*l̽M`Y>0TrjR)KX]vR)V.K`5WJj9X*er5C`,TL}`*TnPSPJʭl9X9`**Sr9`*.Sr0+T/Tn^^J^Jg}`kcr0ՋT/.SXzXct95~`V[}`V[t9Uctc>0 dJdtJʭ>0UKT2V.SX;]vL%c?0 d0z\P*Yr0LBr0LBtJT2`@l`*`*ڱV9ʦzv+ST/Nl*[}`+TZj*VZj9jrjVkV3.[f+[r+X.[r3NX9]bt/-[t9V.VrV9`+7c`+7crLśt9 `5Wx3O`*̀9 l<]`+X`5W}`ۡ^5X4Tt3Xt3XͥZZ-*k`5WjX9X5crVk` Vs`Vj`.kX9XkZ``ƪ`Kf+krVs`sr0jg>0k\Urr9r0 Vs}`..sv\]@^暱r0k7HPk^U۱r9f0,sv j Z6ێ\r0k7xj+*svbr0k7>0svl\XڱV9cxڱl< ^;tڱr9cv9kf9kf3`z`5Wz`]z`.sv3`zh6.sv5N^;[zt`·ʭr0l`+`0sV5Nhm\+}`.یr0-l9Ol9O7`.[Nl\r]r̥dL&`3V6crKXlt9 Vs}`3+rL>0FKxh,]FtFcr0>j`UV[>r+Xbr`5 j.lj.X͕\3j`5׌Zr暱v9X5ctX5\9XECvVs>`5.t+v+|-rLtcrj:Xr0.X̶cr0ێ`l;Ov6nl;]vn \9 j9Me˭r+j9؍Ucrrrn\vcvm`7[l.t;VvV9`+n7X͕n3VvXvt96\96`7]vӡ|9m[rb>0*ӱr0XLr0KXLKX9Vs`:XͥtL'P:*dUXL'tL'X:]jL'`:0v;[v6]XNt:یvl >j}`;۩^0Vc`;XlCr5XlC`:Zf0v< T x,Z`;j6`;jvl~`=TCrjZ`= Vs`=lZ`=lrjt9X5sjz(]c`=V-rXz*r)TMX&`=V.Z`=V.Zr+v9XKP;]cZ9[mX9ct9XV`=.vUcXj>,X9փrǛv9X7ctz`@,f,}`PV>[NV>[NP+-{s6-gCX Ecr6 Vsl(.gC>6TPcCl2VΆlkrcCd l(.gCvUΆX ۱r j rǖRǖJlkR\ΖJr0.gKX9ǖJr-b[*R)cK`cK`-\[*R)`@RZΖbl)cKr:[cKr-P[ۡ-l[-t[l-tZ@X-j[X+gKj[ VRZ@`5ǖX+gKj->>l`-5crml.gKv0UΖ`*]Ζ`:VΖ`:*gKv0Kl;Vsl)Nt[Jgl)nx x]}l)ǖ>}l*cSlǦz}lcSXŚ>6Ջ5>6Ջ5MbvǦzv;VΦ}l*YΦt9J6@Vm6TAʶh9J6P`T [l**̀9JZ}l*ŚXM%cr6l*+T2.gSX-gf3*gSX;*gSX;X͕d]d.gSZ,gSZLd-[nd0VcS`,]ΦX]ΦjM%r6Ld*d>ldM%~l*0T6-g[}lm}l+ǶZ}lbrml+Vζbv9ۊUr˖X6Ƕb`mTmb}l++\c[>j,ǶZme^md*s>Uⱂ*sXc[`8+t9+S>6ccv.V-gc>Icsf0[b>6+X9*gsr+gsr>6kxc>6\<f9lZl`3C>6c`+6CV U[r+g)fmjm}l3c>Yflfof*gR(,gR(LfU6rlʥf+gX \9lʩl(ݎf3VNfNjm6dc`m6\lr Vs> V}l-gl=V.gl=VNfm6}lnUmf[~hr6 Vcl4Tcj9 U r6b}l4TMhhhh Vs}l4TX U>6C>6Ct U}l4ThhBf`*PLӱV9 UT0KPLj`*PLr6`AVFCv0,Zl4TmS,]FCv0,r6t U~l4Fct9eh,[FcƲ>6+gh-h,Ff~l4 l5TFlkn\Frv\9hOр[ct[ PVCVVCVB}l*j+V[rʦjV}l5 jV}lj0V@jۡVͶlbr6[l-VNZ+gf,.gt9r6[kgr6,gX&c`,]fr&r6 l6.gr6-l4*gXFct9r6 l4+hKl4X͕h4Ԏh4Ԏl6 cr6MhVc?6[ >6cvMf.gv9Mcr6nl6ݎl6Vsl6Nv9mZl+v+gf,.gf,r6NX9ۍn\vct9ۍn+g?6ղv[`[r: z}l9ǖtPǦCXǦCXMP5>6jct5V5VMjMkEVEVUC}l:TtZP9KP9-gӡrM>6 r6cӱr6kl9cӱPǦcj5Ǧcj5VΦcvMBr6+[l:Vl:V{l:V{tʡjMǚjMǚP5>6k}l: r6?6s6MǢrcӱjUKrMǪlUkfMǪ},+gӱttXcӱv;VΦcv,]ΦcP;V.gӱ|6cӽXcT9 }l:cX]Φr9VtcvM7>6mtN}l:k}l:c`5ǦۡjMcr6ݎ}lv9cXYΦ~l:`ζvmPmsJP;VζCXmڱt9\9j9jYζC`.gۡv܇l;Ƕ{}lW@^2Ƕ{T/l`:+cl;[.grmgf3V.grݎv;VcXmcj,.gXmcV(Zζ۱rm\9ncf\ζX+v*gj+TKX9/5ct9/5cr6+gXx.*gXzl[x9+gX9OZl<Ktct,/gv9OCl]Xx;V۱V9ol+x;.g`5Vj0g`5.g`5Wj0+g`5x;X cr6V`5X++gt9X9[zcr+z,]փ\9cl>T-gj͗v9/eCt9ocr6 llr6 V|Ucr6k6cr6k6\UCl>V.gr>6 U[}l >6 Vs}l r6cj퇪>VC}l?T~Z}l?>}l?tct95؀YD`]D`.gf3`Dt95X P؂Qc > k6c}:܍> >Q'c}BMR(R-KX/brTX9^*tUJr0KRLrTY/bh(*KXK%ct9^*X*R)VNR0K`5WJj.]Jt/^UJt/X͕R0 R3VZ|/R/ŚP^UR,݇}x)KTڇrR0ه/}x)X-RKj VR3Vt9^*SxLR/R/ >0RAT/*Sr< Vsx*.St(,St(Ld<]l5݇Zx+V܌x+V+Zs+[foŪtox+n`oj;T`4VmVY[fׇn[?0V@TnV9śxo6x,]jxkZ0T-k`.k`5WjX9^5crVkx Vsx Ze>Or<+ǛrkBXoZx3V.Ǜrox3X͕`5.ǣx*ǣPrZW rVj[k{4lZWx6ؽr6[WCl]WCl.ǫr6^mP>0ǫ|(.ǫlZW[|5]Wcx5.ǫrK`Vct9^x+x+7rZx+n9^crZ Vs}xj5Wi+ǫZfkt9^Mv9^mj;`W9^͇>Vn,Vwctލ}x7Vnx7`.ǻx9VwrUwr,]wr+ˡf9XOtO r<݋f˱r< dNx:><5t:,t:lt,t:.X;݇PNCtNC><>}xׇ{t> U>݋^Gv/Ve˭> ^0և{X]{X:]{X: ^3NWctv3voc>ݎv;Xj+LJPU[jUQDj9W\y2 O@  P9 X5 S` T BR JPNJP; 5ӡR)Bt:TӡRJj T VCP)XB`5V@Cf,*5ctmCl;Cl;ҡRP)\:Tʶcr:Tʶcr:*CPJJP:*cPKJXʱt T*@TVCt CX(JzrRP9XBT6Jʭl; RP:ŢPkC^R`5JP*fKRX+J%kf:Jt( Vst(LCr(JCt(UEcv:*j; RP4VmgӡT9Ut(UҡT9jԡT9֪t(UւX:*kTZ0KCrLCt(Uւ` CrLt(U6cX:*\0OCr0UӡT9nԡT9lCt(UΦCT;Jt(NZP+B@ EV+-ӡV+VMZX5JZX5XͥCVNZX9jbv:j5cPՌBtjJ\:jV:j5ctjtjujP VsP+bt:ԊӡV/zt V0V@C`:v: T: T C`NZ̀:ԪtT/Cl4Φzt;jet6 T *CP9B`:T @[P-b VMP-ʭtCVbx VsP-ʭt:T%cnKjf@Ūt:P-Njt;X:uk @ˇPctV+gPVVP.ʅ\(ʅRl<B`; B@(P.Nrt(+ӡ\T{P. CX9P.kC\0VNr`5rA(P.nx:eӡ\:Cl:t CP/TU^t( l5 6ӡ` ӡ` Pjf۽t(،ҡ`Lҡ`3XͥCfKCfrr: 6Pv: t(XmZPet(Xm7X:f@ V@(Xmӡ`%Ct(Kt d/ Vӡd0Jӡdt Eӡf(MCPKT0OCP+jZj P3JCP4TmP3 U[r:jtӁP3 ӡfҡfӡft DtK:jBf,jƢP3-f\ͦCX:jҩfLt.XnCX:,7P3nZuKGCtKGCt/Mt4VMt76cP3l5jX9ӡf,FCtKX5jcT,jcv Ff j(5X Vsr: V Kr@jӽtҡf*ԡfjҡfjZP3Xctj.jv0[ @ٌf35X:lct PBft BV@t:TCX3UctKj-[nC\ TP5Wҡj.Us`5TC\l6PP> +Brrr:ҡ~,@~Pn/[ClP?et;gl5nӡ:pP@Vr: t( ҁPK@(ѩP) Jr+ Jr+NJX+ Jj. Ju*T TTTNBt*JSZ-lSZ-lt*Tet:ʥSfԌSfN|(N|(NBV:jbt*lt*lөP3NNV:jZ V6_MBX5Nt:jt*lt*lt:j6t*lfV:j6`5Nl7Nt*ZTٍ5өPkөP+Sf7VNSf7XͥSf7Nu*MBhN`5Nt*T(ڍct*j. Er: Et*өP4NT 5өPjӱt*TmtNP3өPjj. U[f KBV,ZT 5a5NP3OSj+̀:Bt P= BVC@*Tmz0TMSj5JBjNX9N`5Nt*TmSj; SjPBv@ ucTeCt*ԍ岡vN\6VsTeCt:ƛt*ԍ7Ct*ԍ7Ct:*SrNʡR: Kr6Sr*NʩX3NʩX9 St; Sv@ cTKt*T|: ct*TE\ҩP9NBZ *BX:*bt*Tt*TөP9+Sr0nSrLl5 ̀:*t: \ *7Cv0 v *7cv:*wөP+Sr7VҩPNBrN`5Nt*TTPBt*t*f@ l. 5өP;NX+ ۱r:jcR9Sv;V.CjNX9JBvҩP+t:jct:j\:jTbTbt*TUsr:ǪX9Nj.XͥSj̦Sj̦өX5NŪ:Uc:TLSj;U۱V:\:t:Ut*mTҩXLTBt*mSf3Nź`*Sn; t:붃t:˱t*mct:˱t: bZ9oҩ^oҩ^oZT/֊7ctkśr:Zf,Nbx3XRX/VDX Ջ5j.ŢtڡtT:ՋEC`*NbP;SX4ctt,NbP;VsT/SX4JzhNbX9NbX:Ţj.ŪT; RX bt+T/ʱf3Hd 6r 6j.fHV3V.ө^0Mzt4ҩ^0 t: tLө^Mz6Jz+ǪP: ^9V ҩ^ʱj0NzX75cnNn7XRf,b@ TM%ө^4lԩ^4lT/lө^4NX:Eق,EقNlAVNzl ҩ^4JSh[NSl[T/T/@ƪPT zP]zP]0^>T.Ȫ\.VzPvkT/ r ǺX:j:lЂT0ҩ`Lҩ`RX5Kj* ұV:USt:UZ0NcvL̀:Ut; ƪ`]@SXLӁT0Vmg\@ FP9 Vf3N`jt*Sl5Hl:Lt*Ng˱V L^JSt:[VsT0ΖT3VΦt+gT:ҩlkSZ-VNZNZKZ3OZ:6[TيҩlҩlTJSf0өl5KT,Net*[lPn:vct*t*өlNeX+f۱r:Ͷct:Ͷ\:ͶTKX+vct* VsTSrkSr+Sr+өl9Ջөl9 VsTKX)*ҩl9Vʆʭt:-Rr+ʖcPNX+ʖcX+SrKөl9 VcTkt:-T+өl9N`5Net*[ZT\śT\ś̀:-W\:-WӁT fөlVөlVӁT fӁT ӁTcTct mSvNe۩^Ne۩^,HeP m7CV m7CVHe@*NGC@*NGc@*nRvv0ʶX m^ mӭP3He:W[X3ƫrNr:ct*/T6^ҩlҩlөl VsT6^VsT6^NSx;T6ގҩl+Sx;VNSx;XͥSx;Jct*oөl>T6ߌҩlҩlNʡRKʡRkSP VsT9Kʡ\Pʡ\.NCttV:UEKX9*fNʡhKSP VsT9TmgT9Mʡn)MSP&\:UuKl2NCX:UuctT9ԍT9ԍөrۋT9 VsT9 Vstvctvctvct:UuX9*`5NCn@*݀:UuT9 ʭtjzT9NRr+*ک^*TnөrZT9Nbtjzj,Nʡvҩrԩr(Lʡ|3Jʡ|3XͥSPNʡ|5Nch:UV:Ur:Ur:*B`5Nchkԩr,MSX,*b^:URX+*b^,NcT/XͥSX, SXNcV:*btUctU\:UŪj.Ncj SXmtUT9{v:UŪ^NʱX5_ctU`;VNSX/j.*T9oj:Un:UKf3*PNʱ|T9oX9NcX+*j.*tԩrjS`ԌS`ԌҩrTjT9X*5ct:UJX:*KfKR,*KV:Ub@,UctS`4ҩr0 btFCX:*P.XͥS`NnNnKh7Nt:UFӽP>*T9MS`NvNvKn;NvjS`/ҩrێct`;VNn;_ct:UcX9*gsT9lSlkSlҩrLRlNl.H\,*gX:*gۡf:UƫX:UƫX+*g\Nj.VNSl VsT9^JR)JR)VNR)VNSxҩrT Sx)NZ:UjX9*k`,NZ-XT9^өrV Rx.Nh:UGT9x:*ǣv0O7T9ԩrԎӱP>PBXX+rPJT,ObP UR(t V X5+e^6JJr tct,ӱTX*֊cX+JRVKRt:cX:Vv:l5nӱT3ފcfkcfұT3fX*[mblVVKӱTjt:Ke++bX*[m5hlVX*[m5*t,P;VΖX*[m5P9KeP9Kcl*u,B:V[V:V[PVKRjPRj+ӱTJcr,PRX;Kct,UC`ʱv ӱT9t:*ڡr@KcP9`@cr*X5V5ӱT9֎crkcrKcrұT9fXkt:*z,Kc`= crǪt:Kcf@Kcl9ʱv:KӱT;KC`ڡr0T XVӱT;XVCt:jX+KjKR`NRl9Kt:jӱT*cx3TC`P9jP9cx3Tct,ot,P9VsX* h:7C`P9nӱT* v0[MRf,ZX*^mұTKRrX3X:Kj.Kv0NRrRrPRrpcP;JRucP5BX: ctjǚujtjtjtjt:֊Uۡr@kX+KZX:kj;kj;Tc`4Vml5kj;``6ZP:֊bX+ұV<+cx*VNcx*NZTKZT;cxVX+jtOX3vtO˱t:cWst,JbRZV:kX+ӱX++cV0ncVKӱX+XͥcV3NcV3XͥcV3XͥӱXmcV7JcV:X,Xͥc`5Nbt,ӱX2VNcdKbt:chŢj.E\3Ţ̀:ӱX5uӱX7cnźj.uXt,VNSX9ӱX:ObP>ڽX:kbt,X VsX.墱j;EcvVӱ\4VmZX.\:ƪt փ@,Wcr,jұ\9 ct,WBX:˕cP;Xͥcr,jt,WB`Lӱ\9 j0Ncx,ct,t,\ʦc\5/bd6 VcXKǂX9 Vkf+ V\:LGt,Sf3lұ`:mfst; f6LX06:,ұ`AJǂY: \:,˱t,Xc@d(kf(f)5[h:֌X3jJX:֌ڱV:֌j.kR`5cv0[McXұf,c̀:֌zPǚT;cXUӱf,Ζӱf,ΖӁX3jtKӁX3V bX5T@bX55c`<5cT5kXV@cZTJg˥X+kR:[j:֬5@TUStYkRx,l5kVKctYkZX:XcZ*`55k P+X9Jǚ(+`AXͥcZ j.kjPXu`kcZNhNǚ(CT,kt:^ұfʇʱtYkrKӱfA5Z:֬5Pr,kP;VVsX@Ūl9 vӱfU۱rUX@5cjKǚMtYkTNǚ*[X+kllŪX:֬5Pj-؊UX@eror@kl5 ff@kl5 fj,Nǚ*[mX+klK\:֬5PXkcZU`:5k V,붃j:֬5XZ,VsX`jj*5k VcX`Śt0[Mǚ+V X`źX*VsX`ҩrkcZKT;kX]l5kX]z,kX;Vv0[Mǚ+V5hNǚ+XڱV:֬5Xt*mtYkT+ԱfKtYkz,kV<jtYkjP*XͥcZVST@kh ZXրEl@ӱfvX9ӱfKch:֬5`P3jtYkVNǚv0[MǚmvPǚ-`5k X]j.kxl6\:֬5hj+Jǚ.[j.kl=VFcv:֬5p`+Jǚ/TcZjctYkbfKǚ/cZMctYkj6LcZ؊UZ0Jǚ0ұfvvcZfP5k `[cX5k `OZXV[f.VMұf\NǚZkSX+kj1^cZXM˱V:֬5vKӱfcXkcZY曱V.5k fktYk0`;XͥcZ {j.kl*ұfcXրZtYk@CP.Jǚ4T bX5k hlgj.kl;XctYk@`=fXրfVӱf-ct5k n(kcZ+wcxұf Xfr(Nǚ7[nCv:kl>Vұf-ұr=fX`55k n9jX+krOZXX:kcZ[F`55k n9Ͷj:֬5l7lZXXVӱft/kxL\:֬5ȱP3Xj:֬5ȱZf:֬5ȱZ3jtYkcx3VsX rfVӱfAP;[cZkCT,kX3ӱfAuv5k r,ݍX XұfAPNǚ9cx:k`׎ej,Nǚ9VsX ǛtYkCrLұfZ0ұfZ(fX@t-kcZ 5\:֬5бr=5k t\bX@sX+kv܎ӱfngˡ\,kvPǚpZX@k`*X@k`*ӱfwr;XͥcZOCjKǚ;X`r:֬5v3Jǚ>XmtYkv/kւtY XLұf-5XLt:k֚t:k֚tPǚf,tYK@b`4k@f1 Ě`95XjX ĚX:lX+ӱf3Xͥcfұf3uctXXĚP:ldtYbXXKb͂5JcPLcPL̀: UT:l9ECP5EKP5KǢj:۱r:۱rEcvNǢt,lbPkc`t,lвhE n9XcX4 rfEj5jc`(FC`*SrKǢT7Ct,Lej: l5ElOt,Lex-ӱhX4X VC`E`5 t,f:f: VCt,P5r0TMc`5TX4X X4X X4X6cX4X6ct,̶t,̶t: v˱T0Ob`9 ӱh0E|,Ģv,E`*j,fj(c@JǪv,ڱ@j tjgX5Ζ tjgP3r:j+ ĪP2btڊXұj+[cV:R@˅X5 5cX:VSj*UcTĪ^UX:V 6:V fX5-X5-u̖X ĪP+KXkӱjUt-jJǪr ĪrJǪrJct:VMl5C`jctVC`:Uӡv0[ 5X+C`jӱt:VMl5 \:VMl5 X5jP3nctVC`AUӡv0[ 5Y+C`j j.C`j6X5jt:VMұj:JǪX3NctKu5ct5Nct,URlct`;UR3UR3Uj.`:fX5lӡv0[-ӱj:cX5lӱV:VMt,Uv0ұj:cX5lf@`=VX5lt:VMzӱj:փ:VMVӱj:dX5l V:VMKǪl9t:VMguX55:VMCf@x:xPǪx6tNǪX5KǪX5kcvӱj;VMtƪX:Vmcv:Vmj;Xjcv0C`:fXƪP3jUh5X:Vmj; ctFcvLXƪP3VsXƪP3cv0C`Uh5:Vmj;lԱj;UtVctVct:Vmt:VmX6LǺf: 5X7Tt*ڱt*ڱV: CX3uCP;VX7Tct*j.ʡv0[MǺrVX7Th: C`uCP;nӱnjgX7Tt ʭ`: n6ut mcv(cRu۱v:mSXLb`(붃P, XLb`*붃X4JǺx(P5\NǺx4ƛ^uTjcx3+ұnct:֍7SruTKcx3+t,5ӱpJr:CX:X>Xͥcj:OctkcX:ctX? c`5Nc`5h:X?nӱ~3Ncl3 X?XmcvNX;뷳@V~;[-ӱ~;mt5ӱ~< t:֏v@Cf@k6c@, ˁ&EѽPj{R)+{R) {R)X^T {T2 VJ%\J%t/J6ct/J6c@/J6cl5 `5Rtj{V, bt/ԊӽP++{V0n{VPB`5N{VKB`5NBl> RZ|)ۏӽP+ҽP+Vs^ͧP+O{V6PBtjP+ jX9 ^֎ҽPҽPNBt/Z^( Vs^( {\: P/ ҁ^(X z`5腒t/{dWӽP2VMBX6NBX9 %ctJҁ^(Kzd,ݍʱ@/P9V@zd,ݍʱP5 %cnJct/ 6^(t/ Vs^(/{d@ 5c^LBfl;l> 5|l>n{f3oԽPWctj6tjf^NBt/ UӽP4T P4T ^(`* ECtt/-5ct/-5ct/-5\`* Ec^(k{hJZ^(RV3ZZ {hKӽP4֌̀ƚtKӽP4NB`5l6 Ell6VNBn6ҽPͦӽPM%ӽPM%^(Bx: U @/T zjBP5 U[t/Tmc@/TmC^ zj, Uctz`z`z`腪r zj0 Ut/TMzj2T{j2腪PVCtVC@/T^ZUPzj5[-P5[ Bv( U۱Xt\\^jlNBX^Vs^k{nKӽP7 {n,j. ul*P9C^JBV: c^KnʱT9t/Tn7Xͥ{rʱ^يӽP96[r: clҽP9VNBX9ʱt*r, ^ zr0P/ @/TҽP9Xͥ{r2 t*'\*'^L'@/TnPUPP Bl5 : P*wP, kzr7X5 jX5VNBn+ӽPt/Tƪt/T^܍^ ҽPӽPҽPLҽP {rKӽPNBnͶct/T{l;VNzrzr9l5 @/nP+{v;VNBvk{v;VVs^ݎlX9@/Ё^(^ zx5T@{z, ct/TUӽP=VNBX9tt/TVs@/Tgہ^(t7ӽPBjW @/P*P{ {P 8C@/p^( X^(` z5t/ t/V`6ӽXB^,T@{P-݋^,TҽX+{P9VN{P9Xͥ{P9B^ {t/jbt/j\ {t/ҽXKzR(݋B\+bt/JbVKbt5C^, z^,V bjUC^,V ^,V {X7݋źtu[\u[\:݋źlb^܊^, {^, {̀u`5݋źdNbrCt/+Z^,VӽXKӽXҽX\^,VN{X;݋ڱV\T2݋@/VzZ-kX5[t &ӽX0Kbd/łP 6C^, Ё^, ҽXJzdKƚ^,kX3Ћ5C^X bR@Ћ5K:Ћ5[jk@/letkX3 b`Nbfk6ӽXY@{feSX+݋5Tk6CdŚP*ҽXkzf3Pbf-zf3Ś`,݋5j.݋5@/lX0ӽX+{f;VҽX+t/l@/lg^V t/֬ҽXk{f=Nbz b@/V zjʆz^sj\bՀ bfzn bPU@{n/Vn{n/VnZ^ۋ[t:݋u{r+Xͥ{n/VnX*X* @/ʭ@/VbP;[MbRʥX;ʱX+bt+X9X@zrzr0Z-݋ZZ-f+@/V6@/VnfS@/V^ zr9``,݋X:݋A/V.ԽX0X0X9zr>mzrgPPNbt/ҽX>Xͥ{|5݋^0Nӽ`mڽt/X*ev/ct/kҽ`يҽ` Vs^0lӽ`ct/Kӽ`kX+ ڱr̀\t: t/XkԽ`/ ۱t,C_VNXNX9JX9Xͥ{|X9er@sr3sr3er6^m{|W[t/^6^6ҽl>Xͥӽlv\GCt/^eX5^6ҽl>[ӽlb^6 RtwT,l4l4et/Onevۍ^6ng`5e`4euNʡj2+X3+Z^9jZ^9j^9jtk\Wҁ^9 ʱdcX7[n{X>+t˷bvW[̀W[X:c`ctWƒ^9KZ^9Kt%^9Xk{`2X:+tl6ctl6ctl6\W6X:f:+̀WF^9tv\WFtr+{`5Nj2+{`5ҽr Vs^9XMӽrk{`=֌ҽrktǚX++f3Xͥ{`=Lzl7 c^9o{lk{lҽr6J{x)+KX9K{x+ԽrT {x)tbt\W^9^M{x5{`*St/JZ^< Vs^TzX+z06P6X ج`4EX5[ l5Ct0 U`4 h*X:rPf `3FX:v XjhFrFrKX9Fj+Fj:f`4[ l5FXF`:Fj,ft0h7`+nhKf,bt0mƪt:vr:6ct0mt0mj:6cl5FX?vTPfLl5vZ0jt:6`F`-Kn3X n3X t0m`*vt; 5u0mh7t:7Cr(ƛT9MfKfkx3Ԏhjt0ol5ƛv0[Mx3Ζhjgt0oBv:7St;XͥxƂ:7ۡj,OxƲt3VjVC`5 v9VStc`5+ǚuctcv:XMv@`9zt P+Rr,`5O|:uZ7j-lj-ެtKPKP3[ͥ\ҁ`5f˱@ uXVsn Uj.͖cj:b`5k\,Xͥ\VsrVsr:bt\/zt:Xtkj+jkbfVsXK%jkX+暱- 6`5׌5xj+Jf dtk`5VsXbtk^(Kfmr:X5c n3VsXlZ`5׌5P.VsX+暱j,Nf,VsX;暱vVsX;[M\3.Rtktktkj.Vsl5VsfVsflct7C`;Vsf ^Kj0ݎj2&ct`56c`56ct Vs`5NX:VV:X`+`+j5Xͥt:XgtOx:NtLx:l` Ulvn/[Ml5Jl5Xͥ^NX+vctۍ`n7v`9,:,rctr,`9X`<`5,7j:,gSl:X.z`t:5t:K`,Z0J Nt:`@v۱r۱rXm0Ct0ݎ{l+Lcf@Lct n@0bj x{t:N V6_M `5l7t݀w`;TN۩l4lt:؎XctK`5`+v\@vN`5j.`;jv<Ԏv<Ԏv<Vs`;jtjv0[MP XЁ`=TM`?` 8VP@7hl;7xx97T/7jK h7J:؊~ݍZ`ngu`tbtBtBJt:ƪX:obtߎŪtߎŪ^:o~CX:o`~;k~;,~;t8hx9jK[vct8~:o^9K퀃ϦQK t t kY9,`AXͥ3 X+,r:X08ct:X08ct`pt2Ԏv [d+eCVNڱR6Tnd+eCVN'CX)*\:jJPN'CX+ ct2ԎdKvK'cPՌVjZd,N'cvHbX9ڱr:d,XMfjffXP'cv0Nƺ`*L'cv0j6dh:붃t:kzdꕲd:kzl6N'cT/J'cT/VN'cT/VNvKvX; t2Ǹ:kzj,N'cT/Xͥv X; |:Zd,+|k|X>VN|K'ct:L't:lV+J'VK't:`Nct:`,Nkt2X5cdVK`5Nx3 6kf3Nt2l6HtNX+ 6v:l6ct:l6kf:l6kf3NZYdLh:Fct2d0d0 Vsd0M'nN`N`,N'nP'nK'n@ FdNt:BX:֚j; Vkf:bV:bV: Vt: VV:Vc@2XʁdZ t2Xct2Xcv:VX:N`5NՀ:Vt:`N`N'@2 $n:vct2dۍct2t2@2`7Hl5 t/ t/VN'h0݋d {t:,G^K'v:,ct2Xnt2Xn`: `;NX9 ۱rNX9Xͥv;VNv;vK'v3N'X:Zd+zK'z0N'z@̆d $b,x(Nƛx.+x3NƛX+7j.7t2lf3ꦓf3Nƫt2^MZdLA2N t2 5t2st2 cdZddt2 փ\ a5HR pd*'ɀ3TNɀ3VN'`N'`NgK'`5$X  t2`Φv:0gSX;J'l*kt2`Φv: SP7VN'T9ԍd@*ɀ>Tnɀlt3TJ7CRnJt3JTA ct3JZf(UP*Zf(U\J%ct3Jt3Jt3Jt3JVctJ%ӁfK7Ct3Zf( Vsf(N7CjJP2J7C`5nhhFct3f(f( Vsf(N7CVnX9J7CV+P+t3Tmx: U[r: UsfN7Cvn`5ntꦛn+n7J7CnnX9n`5nt3MdJPʶPkt/VN7C^N7C^,nҽ`5nfK7CX+ c@3Ԏ t3ԎP+v/VP+t3t3VsfN7CvnXn^;VN7C\+Zf(c^6x׎{x:N7C\+t3ڱr: P=n: ct3TVN7CX9 c`5nr: c债ҁfLzK7C`nt4Cl5 4Ctʧ Zf( +N7Ca5nj.nt3*X +rf,TBf r t;݌ u3J7cVnZX9݌Zr:݌Zj.݌rt3zh4VN7c\Fctkbt3t3JX2݌Œr%cv%u3KVctuX[@XuznbX9݌źr:݌źX9݌źXnb`3nb`5NX7XX7XͥXKXیX:nbl=VN7cn+XN7cn>LX7j&ct3Cdnb|f,͇`5nb|LX7 XP7cn XBtXkX;XͥX;nbXct3ǚt:݌t zf,X0kj+VN7cVLX+ӱVb`:N7cVLt3VmX:nƺt3oX Vsf,X>݌ct3Vsf0K7X+ bt3f0KTK7dL%ct3Jf0f0f0 Vsf0l`*Yf0LVl`+f+VN7X: b^6n[j. zt3ct3ct3cvj. zf@ zth`4K`4Xf0 Vcf0`4+h4VNh4nh4Xͥh5Nh: FfK7\)JjJ%f VsfKj.˶`5et3XMj2Xͥj2nɀ즛n[M7nP:nl=VN7T+`7YͶ``kn7VN7nt3t3u3t3`7n^nv9n>P7t3f݋ct3j. {r: {r@ fݎ``=VN7X9J7X9hfC@3l)̖JV-bt3[*ʱV-b`5nfKX9nfKX9nfK`5nfK@3Gl,f6nfsjͅX9Xͥ\N7\nfs`5nfst3l7nffK7X+vct3 Vsfۍllf 6f Vctv\vfN7^Mbt3f6 Vsfnf۽t3t3j,N7^:̶fݎllXͥ|mt3o@`5nf n(k|+|+l>J7X9cvt3olKlMlMf6N7\,݌ru3K7t3˅ʭt3ZfKl>Xͥ|4TMWhZ@|4VMWhll>-VG`3NWhlt56\/]l<+lstw|w|:]j6ecj6ect5O`5f^6NWt;[|-Gj6j6t5R/bt5^*t5^JT2]jjVxx֌ZkZKZx Z-sjTv>Tlc R(kv>mv@X:rA d{t6`3 6ct6 VslNgX, ct:[tV:[X9-fjNgxb6^f( dj.6C@*PcX+mP t*tJg6NgX9mbX+mb`56[r:mr:lc:mr6[X9XͥV0VNV0VX:یfPgh5mƢ`:fl3ӡv0[-f,Z cl3ӱV:یEt,6cj0f,Z t:یEv@mƢ`Afl3 tVY+mƢf@mƪ`+mƪ`+6ctLl3 C`6`;ftL۱V: `56`;[NgT-f0lgtLtLV,m[l3jۡv,m[rPgV6`: `*fl3 ւV: `,6`-6`- flf `KfNgV<6l8f ǃX: 6x0k`3ӱt: 6x0f l3Mt즃v06tlX: Cr,6P96x+6uMg:mfct Vsl3Lf6nf6l4[Ml5mfl36`*6`*NgRlfԌx;6X:ml5ml56R36tYf=VMf=VmzNz6r:mctYVslUtFC`  5@6jC@6jCt  5t6jSl+R R\lTR9 R9VlTUctFKX9FKX9Ngt6+e[X:JV@JVNgV(Fcl>ƲX:e:ƺP*Fc^يhśt6+Cf;Jgr:o\:ӡxNgr:dr:Ngv/XͥX t6kt6kt:Cu6ˇt6Bt6bX h5یUSt6Z6cv Dl5l6|:[ jJgv(V[X0V[P:[ͥ\Vs`Vs`NgR6LgR6L\-n\:X9X9Vsv9N\ll5/۱r:`;X\ACl5*j0V@Z lkjd` [cldՀ:[ @Z l5+l5+@jJgrPgr6Ngtn f(Vۡ\ [ ՀV@Ёl6j:lKl;Ͷ{l݋v/Jg^f۽X9f۽X:Ͷ{j.Ͷ{jPg^:ldt:mn/v{P Ct cllLn/nSv,v0jZlLP;Ng`Ll5v9v{t;v{T3Ngl4[^6-lfT:͖`*vct t VslPgP5vˡj6vӁl7lr)Ng˥X;ȖKj5ΖSrΖSrNg˩X9NTd˩^(-tKg˱f@-Ǫt:-l9Ng˱t;-zh [Nl9[t:[Ζ:[.ǚlr9Kr9Ogl>Jglor6_7u\\:[.gt\v:[n7tvΖ۱r:[ntr;kv0Ng`5Ζ@ȦCl:ȶl;kf,jX:zlnv/Kcf@{X+Wx=V x=V l=Vst+ǂj:ʱ``փv [t6ct6+X9cl:VslӁl? 8HtDl Uـ)ـ yA-VJwCXJP* ұVJP=XͥTFcn(KCvJZn(5^; bP5 bX5 blRrJt7P*n(KtJ`; bxNwCX>LT,RP3 \JtJt5NTKwCXjP+NwC`5Z~bv0 n(X tCjt7MwChX9 Er: Ej. EnX? UsX暱V暱tt/ Us̀CVCV: Ufct7T ƚ@7T {nL8hLnLn, VsnLwCd`5`5NwCd: UVVct7Tt7Tt7TMr*P9JwCX9XJr,j. \3t7TNZn VsnlP9ٌP9ٌP9ٌnlnlt7TN6nLr2ɀ*'n\PPr9OwCr6 n\{|2l>t7TNP9kP9t7TNnnr;Pr;T tCvNwCt7t4 P:mSf3tJt7nSt7NwCXjbn 5P;j6nNwCvX9JwCvP+P; vJ|5 嫱VW\Wn(V t7P@ %X( t %ct@ݍr %c:ݍrX(+X(X(n,LP9ݍʱV kt/ݍʵ`X܋Zn,TBX+ݍʽXX܋Zt7*t7*Gv Ӂn,TNTKCt7 tVX*jӡv0[-X*jӡv0[MT0 cn, 5X+ݍf0KT0 \KC`:RP3nT0 t7 v0Nwc`lX*j:ݍf jt7 Vn, 5YKC`AJwc`,n, 5a5RPPwc`Nwc`n, 5u7 X*KTLTL̀KkTVX*X B`Nwc`- n,St7 ւVKkX:ݍKka5RhRhNwc`6NwcdK%ct7Jt7J6cn,lZn,ln,lt7JX*RPKwcv(ՌXJśrKCx3TnXJśr:ݍڡv,ݍڡvRP;XͥT;ΖXjgt7jn,Վn,.X]5X]T+X]X]FcX9ݍl4֎n,.gөl7RrBj Ul5 t\,VsRfX+Vsrbtbt7[t7[l5-j:[.l5-ZnΖ\tt/Mwtt7[m`;fP5lƲt3ft7Zn6[ Vsn6[Kl2fV&r&t;fj,NwdKwd:fu7ml3JwfKwf:fn6[Mwj)lll6n6[l+t7t7tV\Vn6[NwP+JwP+ 5u7[rf˱t-Ct7[nrNwvf`f`,NwvKllu7[nt7[nlNwvA5CX+͖T(ݎlNX9ft4TMwv:6X-P5 vlƪnNwcn3ft7VNgnNcr-l4TMwv:ƪnNvftlt7[nl;Ͷjm7ctm7ct3f`Nwf0kZn z`5f`Nv3Nwtmct7nnݎnVsnx:Lwt,ӱ:ӱtlkx;Xͥx;Cj[V[j.-t[Usn9Nwˡ|3-X+-`5Cf:-n9r( +P@VNP@XͥP@cV[ZR3cVcVNw˱P+XͥXNw˱P+݋n9j{X;ctr,Nw\[zfKr0k7n9K`5薃\[Vst[Vs f6Ԋr+eCV[VslJ`5W&r+e@b@jX\Kr Vsn9X5X[Vs@ҁn9Xͥ۱X5-t;n9X͵X[Vsu&t&V[VX9-fNwjK`5 Vsn9XM6\:-tctctct[Vj.-t[cn9؎`;NwvA-Y+-Y9-Y9,킰KwT2NwT2Nl.-gs@cn9olklr6Nx*X+-St[\[Wsn9[n[t7hLwt7^Mj2+j2Kx5Nwd@ݍx5ؽXƪt7^x9xX+ݍj.ݍt7^.Zn\Vsntt/xkr;Xͥr;`2ݍ۱rocX+ݍ۱rKwvNwx4 : 蚡t: t7 ۱rЇʱt8*PԌPԌxTjplj,j6ct;[CfKX>ll5cvˇҽX+Vcl9ngj.Vj.Vv6J\,fst6lNnvct;t;l7vl:ngl*ngP7v\ng`Nn+n+l*5cv bv b@;ʭt;Zvۍl+ll7ngP;KP.hgˡ\,ΖcvKXng˱)vkrVVvv:Ζcl<KX/OvKbX9ΖcX+l9Vfv+gt-v r,ng˱ng˱:ΖV-ct;[VsvLd:ΖvMhngX+Ζ@;[cv t;[t;[l9h@ΖvPngS6Tnr [t;[d-Ll2nggK;lvpǚX9ngw Vsv6Mvct;ot;o7v6Nz,c`7ngtͧ|(KP>PP>P|,ct;Vsv6ˡR6.Zf,.ZfnCV3NˡVrx:.jtZv9T Vsv95cv95ct嚱r]rX9nC\3XͥP. P0kP0k7j,.^P0k򡀺]sv( r(c\,.^;VMˡ`׎Uct zX5VNˡ`׎Uct]svr(ct]svnC\Kr(kr>TnP0kײ|jr(kr>TnUct]sv3nC\]v9t z|(nCj]V]r]r:.`5nCj:.@ r(؎Ur(؎Uct c`5nCv1Jv9lrJˡj+Jˡj+XͥPNˡj.nC\Pˡj.Vv9Tv9Tt]Usr:.XnC\3nC\3Jˡjet暱r]UsX9nC\3Nˡjr7CX+.x3fv9Mˡn[Mˡn3NPkPrˡt)/rJˡv(P;Ev9Ԏ傩tjrTnCX. 5ujrX:.ڱ\0Nˡv,Lv9Ԏv9Ԯe˭@jײVV8znC`- j]`nC`-nClۋcv9ΦX9 ˡv;[MˡvX0rkrkbtڽX5J˱j݋UctڽX5XͥX5Ūtڽt]Ux:.Ǫl< X7.Ǻl*Jv9mgST*N˱t:.X: ǚvnctnct,nct-L˱t:XͥX;K˱v*5cv9Nbtkzr]SX9J˱v+rv9Nr]S`5ncT/*'v9Nv9O˱|nc`5ncj]۽t ct j]l5ndhd3Tm`nvnv,NTPTKr0Վcv9j˱t]bv9؊Uv9؊Ù]btltr0Kd,o`2v9r0+r0K`2Xͥ`2X5v9Xmb\]Vsv9XZv9XŪ]Vsj;.X `5+`5+r Vsv9Xͥr `7.tZv9؍r `7Xͥ`rۍrۍrۍ tvct]vj..tct,.urk`=VMz,n`5nX]Ζbt-eөl7JV,.gtMZv9r6rLf3Jf3VNf3VNlrLlmrKj*Grkfn\)Oj.VNj.nl56[v9[V:.gf@.ghn\4VMj;l7.gX+.g`5nn@.gtrP㥂MSXRX+JSXT*kT*NT,T*Nt<ӵxPSX:VT*Nt:J`=Rt:X5x*KtX0Z(oBX:ެڱt:ެ[tYf-^f-^x37V:Lu Vsx3NǛɀ lf3VMǛXPǛXKf3kffxě̀:l\:BX:BX7P;NǛ^KǛ^+flxۋf/xۋctT:`57x9On/^Nv7ۡj(oCP:oCP;7ۡj:ouVN\:^5Ct:^5Ct,W{v:^tLǫX5&v:^mt zt j5 ī`:^ctZ xxj5NǫՀ ^f,X:^-ӱt:^-gtZfktNcj:^MʱX5Wӱv:^MtZtZt:^MX:^MXWӽ`5Wl;v:l2Wۡj:^mX+CjKǫP5W@nwct+7Xnwc7ct+7wcP)^mX:ލCj<ԎnVv0[Mǻr)ʥf@ʥlwcTڎnʹX:ލSP9kX9 sr:ލSP9+n 6x:ʩ`;wcT6ڍct+n+nV[T;XͥX9vwcX.wcZ0 5n\ fPǻr- ̀:ލkj,ʵf<X֌g@+V:ލsx,ʽXkX+gn܋t:ލ{r6wc^0ˇx7Vs|(Nǻr/ UnvX:ލn6kX9fj.h7j:ލvڊUx7VV۱j+Vmn̖n̖n̖:ލr:P;XXjt:ލj ލj:ލjwchZ@X9*'ct+GCdNǻr4VMǻr4ۊ5nͶbt:ލh:ލh:P3P;^5n\ PPǻr5ԎCt:ލz(l=Kǻr5[n\GcP9wcn6lt+wX9l>VNX9wct/ڱV:ލөrNǻr:֊X9kZx7VNZt:ލӱVKǻr:[ nnx7VNCt:ލP;wct;fx7VN`Nǻrlt:ލl9wct;[nnvKǻr;TMx7Vct+׃X:ލtwcz0KXLt+׃`wcz0Vx7Vr:ލt\@XLgt+׃l9wc|6X9ƪx7Xnwr:tۍh,v\:6Cv:6CvwPnxیn3UxیEcvwX4VmumƢj;fxیEcvwX4VmtmƢj;wX5Nn3nLtmSj;w`*Ԏn3 \:6P;n3 j:vX+vX9vX9w`,ẁ:6j.vv:fPKǻlkn܎n7[nt͖j.vvKǻlNǻl:wtwt n6Kn6n7j:fv0[Mn6lgX:v`;[n9Nn9Nt-PNǻr,nKct-`5wX:VnKX:ctwX:-n9wˡjVCt[EC`w˱h(LxRu[Ecxn95xfn:n;/J(/x9 cx9 stʹX:/\3cx9V cx9Vf۱V:^5x9Vx9VN˱t;/X:/u\K˵:/BX:^R;xJZxJxJt\+eCV:^r+kV:^łt\r-VNZK˵t:^r.J˹XslN˹XN˹X9K\P˹X9`@\,sTsT \ j(K`5Nf@/GX:^ӱV:^ӱt:^j./Gj;/Gj;Tjr4ctƫ`5xNP4h,t:/wCtt:NP:rLrOn3rLrLZx[ct-j./wtkr9jr, x 5v:^.B`Lr, t\U[r:^.ǪX9JX+t\U[r:/cvx붃`6nr9Pl. r6jr9 ct\ƫt\ƫX+/j+Xͥr6^mt:^.gV:/Ct\P5KX@/cY+/ca5뱀뱀NX@zԌzjzjt\C`N`=LzK`=J`=N`=Xͥz-z-xg@P5Ot UCx:T Ёx:TP ӡj5 ӡj5Sn;X 6:Nź` $I@<kcx @<`NXTNXkn,VsxKxt7VmZxbt<ݍU[r:OwcVKXNX5KX5śxj:ƪ`N`*n0VxLt:Sl< p< UtTDj ^U@ VcxAT @ kcxa ^< d A 0A PǚXjǪP3·J|TPP)·Zf,ZX+ZX:Z`5·r|(P.+\.VP.+t>t>t>K^LCj: VӁH·l>5|·l>Xͥf3Of3ot>lfPNCt> h0·t>Z|( Vs|(mt>PPC@>T CX,U| | t>TMPkj5Xͥj:UӱP @>TMgt:\:n7JCnKCt:*P9·X+j.@>T`:*{u>tO%r:JJTPLPL|·ک^:jzt:jPKC^·ڽX:{j.{t>Nv;JCv·X9·`5·|(` |( k󡀰KCu *PA U[| LP9ʱr: \: |,Tg˭t>*V:|,.t>jBV:ڱV: ct>jt: ct: r: t;j.PNcv:^Ncv,|,Nt>j{n:xBt֊UX+V-X+V-e˹t>֊X+c`bX@Ūbt>|,֍|, Vs|, Vs̀:u|,MCX:uP2V@X7%ct>kX; t4lt>kʱP+ڥr,JX;-WXX;VX|,֎Uct:c`5bX5bX9ڱt;ڽXNcv/*|,XXLX X; Xt>kWct:|Lcfǚ`5ǚ`5Ncf:5۱r:kcX+5۱r ct>mr=X+t:+׃\:`k:ڱr:cv:u>XkWct:|0sX+rj.|Lf`5|0`4+|0|0 Vs|0 Vs̀:`4`4|0ʁ|Zt>Xm5c|jZ|j|jt>Xm5ct>Xm5\:`5N\:bj.Vsr:bt:\:|KX+vct> Vs|Lf`5t:,7|0K^ӽX9{t:L\ L`;KT/Tj`;+Rt>NJT2۩^j`;+5CX:SR6Tnvkv+v+`;Ջ`; Vs|]킬 U[|kzkz`=lZ|k6\:ǚt>XP:,t>lƪ|6[Mjg`5gt:vlkl7Xͥl7g^:ͦ{V:ͦ{t:ͦ{j.ϖ[|ܪӽt>[nu:-|JGCt>[njr+Ul9gt>Dt>nt>M\ SlSf,Pr,Pr,^ lU UT:v{j;bf,pUcAU @@KfLP)JPKPKfOfO逳th:p6`Ln/pv{tYUg=nʁ z0T@z0HCv,HKP5t0HKl;J`L̀: -e逴mS逴mSf: -eT RLl5`:ft: -et,`:Jl3i) \: -et4`Af逴m t@Z6Y+`ANl3XVs逴mi4.S4kP3Fcr0j64kt: : ڽX;JPkSf3Hv/Kn c逴jX+vC^0+n c:vC^0+i7ӱt: ڽ`:Xͥn d逴jY+vC^ +n dt: ڽ`ANP,t@ {u@eT: `,Hl5Ht0Ml:in; t@mgv0j6ꀴF5r\<XCl.KP7Kn:Nn;JtkXSrLuꕳ`:f5+gtV tꕳ`:ftꕳ`:XSrLZ5+gt,XSrLtꕳ`Af5+g,zl5XkWVY:zl5XVs5+gx:zl5O75k* ctvC`XSn,逵Lڱt BX+P;N`*f逵UFc逵UFct+炱t:`st4ʹ`LX9X:`ͶkNj@XՀ4Ol5 Ml7Kl7LlLv(k;jSf:`mR`*lk;O^,Kv/kKӱttX۽X:kKj.{t K^,,Z逵݋Y9{t +kK t:`mb`AXͥv/kkSf3X۽X;J^L^lS9c9 PT `9s`5k`5K`5st:`w:Ԋ逺v,Z@v,jS逺T v,jӡv0[MX4C`Z@v,jӱt@ݎEC`:JX4ct@ݎEC`:Xͥv,j t@ݎEC`AJX4JX4 5u@ݎE逺mu; -v R,4HrAVc4X 4l t/Xn^NCBTBT*ڽP!T*CRUJBT ڡR)KCRkJlCR*P)VnJr5jڡR\ t!T {BlBt;TjڡR3nJX;Tj vԌP PK5^;TjRlnJX*5cPfJCf,t7Cf,fx*5cn6[śvԌl5v;Tjn;Tjn*5ct;Tjr*5\;Tjfv[vͶCl6]BTܡR*śr;T7CX;T7CX*śvkJfVۡT/cv( BV0v(l7P*؎P*؎ۡTJ%cv(ۡT2+Cd0nCdKۡT2X͵Cd3XJ%r;J6ct;J6cv(lv(LCdJe TJe B(ڡT6P]7ۡTo6PLCv0jCv0j6PLCv(jJt;jv(6;j7ct;*Zv6cPmP+ZP,ojX;jCV Bv;+rf6rV;P.+ۡ\.X͵Cf0Ԏ5v( VcP.[Ct! ^,zv0T-zX!L\;̅ڡ` 6KT 6KT2l5lV;lBX;lBX 6svP;VNCf.Ԏۡ`3jv( VsPٌP zv(lsv 6B(̖ۡ`3[.ۡ`3[n@CX;lf˱V;lfj 6t;lvT 6n 6n,v(Lwv(v(t!Pkv;cv(Xmv(Xm ` vcB( VsP]۱B(U `>T- `>TcP0 U b!T &v%cP2V@CXWۡdFcP2րwۡd,ܡd,ԅP2lj;ekv(jv(P2P2P2v(+CX9%cv(ڡdKBR.ljڡf*mvۡfڎڡfNCXj f0T5Pjc`jPjP55P3jBaP3kCdv;LP3+ۡf2k`,5jj&P3pB Bt,5lj6Kـj6cvٌۅP Bf05Xj6t!lv {PYPͷCfj6jjFBvCl55BCP3VECX; 5cB(*BP9TECPECP*YECPjPX;-e`5nv(kBX2Ec̀; h*r3TCX9Ecv(K h B(L h0-f! 6P4XBh0P9TEB( h4+ h4^0р! v(kj;BnvCv(ڍڡh7VnX9jX9X͵Cnn`5Ej;fv(MBr h>[nڡj!Tmt!T CP.Vn\.rU[h;TmŢB CV6[BVP5WUsP5P;TŚv5vUP5f;TŪ` C\NC\ڡj.VVcv `;UsR3UsR3n`0`\UsX9UsX;T5cvkP5 VsP5mlUs`5Ust;Tͥ j. Uۡj.`UP5*P]U^&ۡj2TnCdJCdUr;TMvśP5ڡj2]UPkCj\Ur;Tt;TXVct;TwZۅPCjUjVt!TܡjPjӡv0[mP3jUۡf0kP3ڡj; cv5XnP3Pjӱt;TmtkP3Vs̀;TmC`AjP3Xۡj; \;Tmkܡj;ԌG j;Ԍۡj;ƫv.ڡjCv9MBՀDt!T-P!T-PD`.PB(L l0NCvJCX;ԍڡnucXjvKCX]P7nP7ϖP7ϖvڡn0 C`vۍڡn7VnX9ujꖳh;-gvnʅP9TCt!Tڡr(Jv*X*ʡj;XBPf vP;TUf(]CP!T.Śv Pv CX;Tڡr,sv;TڱV;Tj*bt;TjP9X r0\!TNƪl*'\;[mP*Wۡr5Cj0݋ڡr5PL\;Tۡr*gPx3XmPۡr7[mt!T.ڡr9V r9+P˱V;T.cv\Pڡr9a5P9jCt*vnP*Ct;TnʅP*CvLCv۱r;TnvnܡrKۡr;]Z-CB储Z j]{B( ЅPUۅP:jv(lBXJ'cv( VsP: ۱r;NFCvnt!P:CP:CB(nXJcXJcfӱf3X͵CtnX;nZPśPś̀;nǚtJcX:]P+CvnXJr;ncv;ntJ\;nt;nܡv!CP4XCB* vjP;VNB`jvݎڡv;VnX9jX9X;ncvVsP݌Cv3jfXjvkfkljvf vfcvfcvf\;ngtj`nl6CC\ūv(^mZPVsPVs̀!v(^mۡx7Vt!/ӱt;OCv;o7P]PmfsTf6prt;oP CjWvX+jKX;ohr,X3Ԏڡ~ԌCP;CXP?t;BvLJvl`X9pX\;VsP?n|(j;V`gh0nj6LP?[FP P t;rwCa5W 3[.l.P 6`RP0w,TڱPݎJ\;*rv, %cX(JX(kB^ԌcT/VnB^\@bT/V.۱P+۱PKcT/X͵cT/Xͥ۱P*mBx7ݎX(kv,lBt;bh;X( ұV;6H`ڱP-cvՎV;v,ڱv,ڱt;۱P4ݎ۱P4ݎX(ϖXmcnnBv,Tn`kv,TCw,Tnv,Tnt;*ZX\7۱Po6X ۱P9X͵cr1VNX\r h;*gt;*۱P9, kct!JBX;JڱP:jBX cv,X(KctkB`5 ct7ct7v,fZnBn6[Mcv;jv,NblK TKP0R 9^MڱT/kR`,ݎz`*lRj0jXKTlܱTL̀;U`ڎz`*۱TLer;UxKp]X+bB/*۽X+zP;Vnbv\@{P;Vect ct ˱B/jc^,. v/jclBr, v/jclnbv9nbv9 5۽X]B`;Br0j6^,.Sf݋`*]JtkڽX݋^.bv^,Xnbr݋v/L۽X0ڽX0Nzd3TŚPkFCt{hL{hL̀ڽX4jbXЋEv6Ռ۽X4kcv/VmbT݋USZzl˖BV˦ʡT0nbT9 {ljS^,6X˶B/meˡB/me˱B/meP˶`<Ųl.{l3 v/mfsTŲl. 5w/mfsX݋e\݋e˱h˖ct˖c`݋e˱v0j{l9Bf݋e˱v0 U۽XkSP5Ų`,Ų`:Ų`:jbr0K{l9Vs^,[^,[v/- v/- V˖Y݋ekbrЋew/- B/Mg`*lbt zl:ܽX9ԍT+x; 5w/Vucv0nbP7K{rL۽X9 t+t;ʡnЋCP+ʱv/VX^+۽X9*ev/VJx;ʱP+{r,nbX)ʱZʱZkbX{r,XmbXʱlЋcP+ұB/Vӡv/V^Wv/VŻj+v݋^ 5۽X9j6^ 5^Ͷ{r4 XC`݋VSv/Vfvl4֎^Vf,Tnbh T+G݀3kbh6l:nbh6۽X9MC`݋t;NzrZjҡx9nbXK҅^,۽X:nbn0Tmbn0TMzt:VjKCl5 X:jfdЋӡf݋C^J{| {f݋ X B/jh+PUKx ^0{T2Vmdk{T2V۽`*v/Jƪj j rL%cvL%cv/Jv/J6^0v/JVct,SlL%v/{X.xc^0Vڽ`+ܽ`K{X=X͵{\ zv/-5c^0Zj҅^0۽` V`3 t2XZ^k\ v/XͅRP4Tʖ^ EC` Vsh̥۽`5۽`5n\< {j.v/XM6ءj VR3X Vr Vj VuP Vv/Xmܽ`k{j5Vnjnj,nj,njkt, `˭++b^jpCv [ rkV-7[^jܽ`nt X `v0n{rv/XN\,v/XN^܎Ū^܎Ū^,t,v w/XnP ,۽`pЂX,Z6^nvA Vc^8X,t{r;@^8ؽr,퀃϶{r;Bv/nv3f,۽X6c^6ZettjFh`FlFjڽl5.B/[.۽l9 ڽl9/PAXzr,/X(^@{r0mj-W l &c^\{r5]evZevZ@{r5`eՀ-g^-g^k{r6ʱV˖\*ڽl9jr,exv/[sf˖\K l+t;VmXmڽlsv/^6xsv[ֳ`5e^o{x׮ś̀zZY^6뵛tsv3N7^6뵛tK۽lVn|n|k|+gvohWGVWGj+ǣvOڽr<݋۽r0^<p[to{V+jVktϵ{\.V{\.{\Ћ7c^jsX:]t!Xv0k`jX;،X;،f\6cv+f,6\;lf(kXl6cvٌӅ`L f3k`5W6Pl6j6B t6`kvkt!-t;-`+Z`+7CX;-PFKr3XRnrʱt!-œx;XFc R(kXf˱V;5xj6^h uӱv0kCXP=X͵X`=Fc v,ݎhjZ`4V+v0KbXƒX7VNX2v0kv0kfƚtKhh`4 Vct;5`4h,ohb`4 Rt;hnt!h, 5c`4Nt;{rҽP9nvԌX;TjZ`4t;Cfk|\-~;X! `[v[̀; tv0҅`4,`FF`40 hZFv0-gv0m`4h Ѕ`4/n,r!vZVC`5T@T;^T;^j+VnXX!XXֲf;X͵\bvjkfVsXjwK`Vtt&cB j2V.Śvcvcvct;XMj&ct;XM6c`5ٌjKd3X͵jVXVjVxV` c`mt;XMǚ`5k6cv5jcv6_mhkvڎj;Xvk`n7Vo,V`6Z!Rj6vV;ʅ`+wۍ`knvjvvm`7vX۱r`v6jl,X͵v6nl,Zvj҅`9T X;Xr+X+nXp˱V5NX3NX3N7`9.˱t0n˱t6k˱t6kr+f!X.ǚB0 5c`W{B0 `:t0dv6`6l.dXmcX!-dt! P/OP/O h(FCl; t; R(kP;KP;KR;-ev6Zh){l h)FKvkgt;[h*ngP;Fcl4Fcv6Zfr h0-d`6tZFB6 h4`FfsPpgr9ogr9/h\Ӆl Vl4]FvVCvjXv̀;[X jVcv+j,Vsl5*dPBt;[vK\VN^,jgXbt;Vsl|W |5ng^6j/Olj0XWӅlU[lU[t;kfWӽ`Wӽ`7hn,m|7t;ŢP;ŢPc`Sl? l?6`l3 `v6`ـ)pgl@dv6 ـm+TP!жCt;Phv9ʡT]bR3.RVJbr(+ˡTnCX9.RtJr( r(ՋP 5P˶рJ P*X@ʡT0V(RX.Rj]\]r(,P*Y r(,v9JZr(P*+P*P*ٌr(LˡT2P*v9jˡT;TjPVP-ˡT;[nˡ`3VnCvnCvPr(0P]brkCXXmCX[ˡVrkˡV,*'P+ VjŢr2X͵ˡV,*'r+ˡVnCX]bh.Zt4VmCXvv9 Vsrlv9 j.Zv0[ 5hjl5 rlP3nP+ff3.Zv0[MˡV<+CP3*ˡZ-jCZ0U@ˡZ-JZrV rՂdnCZ0 VsrV ҅rV˖[r(kcv9r(Lˡ\0j6r(LeV]傩l4jCf 6KPAVnCf*v9lkCf.XPr 6ct 6{P]j]B9lCu VPZ@ˡ`5TjPkˡ`5kCj,nCj.XnCjnCjkCjKˡ`5.t7nv9v;X͵ˡ`7kCn:jCn:X͵ˡ`]r l<.l9.t*rK`,.T;[ˡh6X]EfFcf.XP.X]Ej]EXvVvtvj]EfkCnr(6`5.tP4 ˡh>PʡjbrP5ՋˡjKˡj8lˡj8lw9T ǃ`A.x,Zr.x,v9T ǃ`AX͵ˡj8l6Xf3P56t.x c]U`Lv9T ǃf0Kˡj8l6`5.x r`;`@ˡj]U @+Cv9TMRv9TMRX]UӡT;X͵ˡj:jv9TMR`jˡj:jtCfP5rSj]UөXkˡj:bT]UөXP5U[j;lCt*VmŪP3ˡj:bvLP5U[j;lP5U[j]UөXnCt*[mj;lCt,P5*KVS`)VnCt,v9TMR,.T9X VsrNvS`VP5*`nCtrnSr[TnCt,nCt,Nˡj:mˡj:mP5]P5]Cf]UӵX9VMP5]˱Vkr9X͵ˡj+P5] P;ˡj˱v9TMׂx9jCt-cv9TMׂx9X͵ˡjˡjZrj]Uӵl9.Z v9TMײhVP5]˖v0[ 5P5]˖v0[Mˡj-GC`=.ZP5]˖rkr4VNˡj-G\kr4.Z<kCt-P5]jkt0[Mˡj:bv9TMbVnCt.V P5+v9TMʱt:jCtKcv9TMʱt:X͵ˡj:Wl]Uӹr,fv9TMʱt:[nCtKtj*.`nCt0VmP5Lv9TMl9ˡj:ngt.`-ӱtvLv9TMl9.`]Uv.`;X͵ˡj:frj.`;ZrjkCtVrXl9.`;.f*5crnڱB9TM7CXv.fKˡjjv9TM7C`.fVrnrv.f-P5 cP;jCt3؎C`.f<brnSj*.f<P5 ʡv0[mCt4NKXt:ˡj:Lj]U`]U`;.h5P5 ۱Vv;VnCt4nv9TMGvkCt4+kTVP5Z0jCt4jv]Ux;jCt4ގP5\v0[ 5P5ˡj:Mˡj*Ǫ`,.nrʱj]UP9Vm7rˡv0[mCt7Xˡj,Zr˱trkCtP5mP;ˡj U۱VPP5mtj+VnCt7[mv9TMwvr;TjP5͖ۡv0[mCt7[nZrfX]Ul+P5͖j]UlnCt7ˡjMZrfӱttkCt7jӱ~Xr,kX4.^LBr0 Ѕr0t;T-vZ@tv]hlgr0`<텚r0B`:.n/ r0BvGP xۋ`<v9v{v9փP;.fnX]ctCr 5`=jӡv0[m`Lln`L`=jӱVC`:n`Lv9Xv0n`l`=j v0[m`,`=j VC`An`,v9X̀B9/`crpv9jŪr6̶X5;ndPCB9[ Urlf.gX]6)nf,nfkf[(gl7.gl7.gtXX]FKj0nnvcv9v9lPV[X0.gv9Zr6ۍl+llnXr r n/`@n0.gTY(gTY(gTj`*.gt+lmv9vPζɀmcv9nrݎrVsr6^ rBlnR3.gfA+br6^jZr6^jƢd.gf,Jv9/5cv9/5c^6nR3eX]KXͶ\t6kR3X͵x.g^]ƫXWSVWSj]ƻv9r6ލr6ލl<+x:VNx: l.gtl=nv95l>lZr6k6\ǚv9Vsr6.C90 l@nuUSw9xNT]bv9JTndU(SX]rO%ctO%\O%P]lnd]X]([B9ފrV.j\,.[`5W([B9 x+`([] x]f<.c fkV5Xx,.cvBv՚v9^5cv9kj]v9LGӅrl6r0PPGCPGKf]GrT  2Pr,׎R/x)nK;^X/Śt/x)VNśt0ݎbl:֎bl<ݎbt;^R+KP/R*x3nSBkR3ZvTZ| Vs|Kj.·|,lcdB`5Bt;XZX++cV3֊GXncVŪ|,ncvbXڱrjv>kǻ|,V|YkXkcz lǚX4[mXKj;Kj;kX{ Tڎ|j;sv;Zj;v;ZkcvA|8jUkcvV;tj;@|8ؽr,Ǫ퀃϶j;Bv>VNrv>Vk热V3j热V3n热V3X͵Vp烹v>Z|0 \6C|څ||t;l|lB>XmVj.XjVcv>X`5k\XVsjV\;& `5`5ٌjkjKj`5 j2XVjV|`Xr;,7ct;,7\;,7| t|0ݎ`+t;VNt;X͵t;;lv۩^۩^,۩^kT/v>nZ|ݎ `+v;V.`+Z|ݎ\;lct!lct+`+``] gn糅|6HV9)n T-+p V0jgV.j Z(k-jg|Af| U[V;mbVglgjgX.k3V5ll4،4Xc|A zv>v>;mp{t6X*gf6`grl cv>@[V;mX6P6X6l9gv9,|cv>`v>`gv>`gV;mгx4gP6X6Xg^,֌lߋŚr;mV;mdr;mdrlZgkfϦl:gP)Lf0bmTlPet; eP҅3V6 g\8cvC`; 톪h!` U k+ԌV,vkT(nT(Vs7jZ(kZ(KXҩrntxcX+X:nvK`5xcrk|9؎o,_ct;vk|9nǪ퀷 o/^6[M^<xPSf3x`x`,x; Vs7n`nv-o6Wu{r;ʡn/VNlv͕C^0jl7悱t;6;ͦsZ BvVt;`Ut0`:j̡j5sZ \;`Ut(^n̡j5t;`UwsNX!`X]cvKl!`6cj!`Vc9.j!V xAʆډZQ Usx)Vx`8lgf@^ v@$Jj;Hbf6$AHhx+[X9hŚDCB&фkf6PBV( U[: U[j"Bt" z\3+s`,ݎj,y\/^Na:,X"Y:,`HCj0TMǓf'X37SrCX+Lʡv0[7SrTN4X:lj(ެʉf9J4T/,DLt;VN4X9ll9lv,lv7hƛ`4ԎGf;ƛr(lCl5+C`=oˡf0kǛr(*x]EXoˡt.j0oˡt6^mśr(W[D]V,lC`kǛf7P;X%Q5[O'̀:KǣX3-ʉh)VngRLh) xTţr(GKXGKXJǣP6Cv:x,nkţ`9GrGxێŪhU۽xTJt/֊WCPk5jjZjԌūR9Zj(U۱VJbvԌūT*mJ̀JbvRlcx5Jef0݋P*WۡR3Rly5JevRrlZj(hRj6ߌrVJ`kūV\P+lʡvZX/gx5Ԫ`:֊WCZ,ՎPlCX+^ ʡ`+^ [VjcPWC`kūf0WCf6 kūf;Vx5lʡR3 X9֊WCR0j(Z xWCRjy5T FtxWCj6^MZjʡR3|kūj; vCX+^ ul.P 5\vc`:Xūn7\v˱T0ԎP[vWCn9JBf,^ ul=֊WC\TnZj9[j.^-sv,Oǫ`׎ej,Wn,^-jP3֊WzٌrٌWf3֊Wf3XūlWhrVkZj9 VctZ7j:j5cx5tkt(؊Wӡf;֊WӡjVcx5ۡr@^Mt-jgy5jӵ`C`Vsj:ԎCX+^MVճ值ճr@^Mj:jbx5U۱VNbx3֊Wө^6یt*`*^MʡhWөr(ZjZj:USX+^Mʱ|NcX+^Mʱ|Wөr,Wөrێtƛx:^MBx5 5cx5 SPWӱP:[ x5 PWӱP:[t,ԎWӱP;֊WӱP;XūX*^t,֊t,t,mt,VWӱf-ūXLy5kւ^5NǫXcv0Cx5kǫX݌ūX݌tnj:n7\Rf,^MBd3֊WӽP2Tjt/JXjVjB^{VڱVzf@^MsX+^MPW`kūd٬śj:lx5] ut5Zj: JXΦfV6[j: X+^MgPWf=֊Wn/nSvv\j+^MwC`5P2Tjt7JJ̀RZ0Tt7jRfj;^Mwfdr;XūnNGCf0WlkūvԌūv(Xt;Ԏt;jy5ݎZj,WXW`t;JXngX+^MˡnnCnX:kūv9j˱Vn\nSx5ݎVҩrWR:Ubx5/S`)Xūx)UP3^MKvڱVXRtoƫx*Kkf3 vly5Cf,^MǃX+^MǛ`\wcz0kūx-Cf,^Mǻlkūx9n(t-j.^Mr0y5Owcvn,Vsj:R`5 ȫx VCf,^Mcvkū|\Vsj: `*ԌWi7TX+^mj;֊WۡhC\3C\3֊WۡjvZvۍv\ {VsvڎRPW۱jԌūXkūXkū^ x VR3 {j2Xū^ Vs̀X:v0֊WX:^mj;5j;XVsj;nZj;VSPWx*5cxzVCV.RPWPkūr(5cx]Ef3֊WP5 Cf,^mCt3Ԏv9T5cx]ڱV.cx]FV.g[X5^mR3֊Wx,^mv>[njov9x]{x/Wcxog˱Vx۱V`5j.^mTӡR3ӱVOCx5̀ocPWv*5j=TZj=TӽX+^a5cfZVZj.^ǂtZ`ԌūX9X Zj=LZj>TmZj>T.X+^͇y5Jbx5j.^BPWP9kūX+^ǚl4cT6|ٌWl3Fcj>kj>lx5l6\3 fD5ƫ`VWj+Xc̀j.^`5 ȫl9*5cj>[ny5-W|\Zj>[ǹϖ۽`5Nǫl ȫlڊWP7^͗Cnˡn7XūrW`5ٌ|9nǪj@k\ZvՂۍՂ VsjAMǻnU[ T6jj`g;`b hoP5Zx R,Nǻr(؊R9XxTVsj.zT2MdzT2XŻl4XŻl.T@ՌŻP;BX+mڱr cxjDLV9TkǻrNǻr(V9t*^;ƪx7VmZn VsnJǻrڎwsP+ʡVʡV,ʡVw{P=Ԍw{P=LǻXf 6xm^ي^ Vsn/l^nn/LcX+ev+ǻl3ݎ\6X9jźn3TmŻPwZ;mkX+mk`56v:mfCx bx \̆Zx7*'cx7[wVۍn@5Ctۍ`׎wr*ŻX9 P5ʩf(ƪn7VNn7VNx+Gvۍn7XŻ`; Ct^;-sv3 ^Kr0kr0r0n9Xr6TwP9r6Tff@-gxͶcxͶ\[fx7t*ԌŻX;Mx7k\en:؊Ż`+wfۡ\,MCX+MCX:MC`5ۡ`9ۡj+XŻv܎wPwP;X(l2\,M\%cn;fvOv0w\足xWv9VmŻxjCV[̀[x7x9 6P, ˡX4*P,L%ʡfjP5C`<(t\ UR(B:^.xӡv0[Kj0j:^.t,^.t/B`:Kj0RlR,l5^.(BlrV<^X4cX9^ctkBXkʡx9CD9sx9k˹X5sj;^Ūf@^r.X%P/^`/fx9X 5`:^VC值ڱx9X cx9X cx9X \l5^Vcr0}2:^l.V Cx9悩P3^6`/g\0Nf6P^܎Ӊr:(CPVcr: %x3X`*Tx. (\<Ux. D9 D !9:`; OJX"cӡ\,bD:&=D E@OXԌӱV<śto6toVct<kx:֌̀<kj,NcX;Xc*VmʱV<+7XZkӱrVƪf@X5Vcx:VnhݎXX9Ot/V{rObX+ʱv;Ob`5Obt"j.H: vP3̀</x:^fx:^r7ft܍x+r7VNr7Xr7OE!PNCP5hʡDoǪ`3ގUf:ގvX9Ncx; Cf,6P;f0j:6XlӱVlӱtlj.6P9f*C`:ov0`; oV`3Xf kf Kf h6ݎ`(vjCx; ҉v r,kX9nʡj*ocP5KX9֊۱r۱r3 och6ݎ۱r:^7C)LLd0UahAGK% t/ԍ9z(t= US{(TnTRvUBXJjJlJlJl5֪Rv0[TVct= jRv0[MCTjT*X cz( VC`5WRjVT*X jJX=Jt#ŚP*lڱz(l6CXJP;Rf3VsP*llJ5Cz(R`;`fJųXJųt=ǣP*ZP*z(GӍP+VnZr{(*ez(*e`5WBlrr0rjf= VCfʕCTʕCv=+t=\< CxK\XՃ|K׃|7X Vz0O7| [ \YP5sfڮsfڎՃ`3Tm`. UtjsfUcvUcv,]檱v;XՃlexexsxe,`1UCP,|jjLt#Ld26C`3T@׃X=،Uct=،`3X B`Z6`U6`,]6= jl6C`P]6\l6CX]6\\6\P.PZ6`Pf3f3f3T.Bz f3nt=lf36j=lӍ`3j`<VC`5̕cvb`5+j*Vm7TP;VV[TkՃV0j`LjP;փV0jg`LX=XmS`= ؃V0cX:]Vc`5 j,*j,]VcQUVcQnvV`5jfjUVt#XMg`j;j+׃v5VN׃Հz0۬P#ml3Tjl3P;VfvUfv,]fvP;փfV`jg`jgz0یUSz0یU`{0یl3֮XX;fv;fv;Vfj=mt6``5]ft6Ӎ,`7VN׃P.[CzփX6sX#X`9lЍ`9l`96\Zsjsj,P,`,`n˹`56\ UӍ`9c`9{ VӍ`9m˹l,zl{mfst,g\,f=XnC`Af`5{܎r;K׃v<`Ϧ``̀=X7cT,Ǜj,Ǜjt=Xr,VXL7@ z0]C`:ՃP.ӡt=Nʡz0Cz0CfLX=NevLjLt=N`:VcF0ݫtl{0,5c`:Xjt0m`:XՃ`Zjt0[ `:Z`:z0V`:خvN׃`;f`:jL۱V=\=z0lgt=t=`:[rLC`J7vPLC`:f`:jӡv0[-t< C`P3ՃxLZ`:jӱr=t\@׃xLz05XLC`:XՃx,lLC`Afz05Y=Uf +׃x,`:j jLCfLCt=5P=vYC`:f`; C`Z@׃P3ՃP3vL`; \=5=5{jv(փP4XM7X=ڱV=vkF-v Ճr,O׃rv9XՃrK׃r0۬`LՃrlt#ngP=؎wcP;փx7VX#؎zz(T0O׃P*tRv`=Xh=Xz,P#X6`CF UC`=VC`=Vc`=تV3`փj,nX#Xƪ`=Vc`=lg~Zct=XʍfhZtjrjt;l4C`QfҳPMJfTo{6jֳP3j= 5P;l* C`gSf0gSf0kճP3TLz6jz6jt= 5Q;ֳP3XjMMUϦB`AgSf T سP3]ϦB`ȦB`ZϦB`jֳP;T+gz6xpd[Zg[P#JV2gsX#\]DX=bz6 z6 l@l@z6 z6 ـ,^l@/` t(4 q2#ވloBz UP;TLlǛP5TLZx3ӱt=LtǛP5Xf.TǛP9j=̅tV z X=̅tU7sr0+\Lt=̅tǛP9f.T\=̅v0ǛP9\ 8\ǛX9T 6`,]7rl{YCfoVcPǛx9V7r,]7z/Țz@X#$T {PlCRJH(X9J%t;J%X:|(̦T2 PkCVˇZf,jV>j5c|j|Z|+Vb|+V,r|̇Zj.jP+ lˇjr>TP֌EBZ3jX+՚r>T5c|Vk|·jX+\>Tk\>CX+P.V\\·rt>ZP.\ˇrfrX:j.H(W#\5V.#\5VP.[͇rjX9t>KCv(̇rPzP) X9kP`2PkCf·`5H(X͇t>Sv>Sv|9`Rʇv)Tm`ʆP0NeCt>Lj, `5·v: #`;۱V>lP+P+`;XCv9NCv9NP·t;TCz, c|(X`=VNCz,j.Jd,JZP2V ƚ|(śP2V7t:JƪP2Vdd·t> VsP2Xͥ#f*nGBV$lŢr$lŪPl$le HV#f+[CX>Ԍ"f,ʇt$Ԍ#f,r,Vr,V-fˇ|lx5 `5j&j:j&j>L6ؽr6Cd͇P)oCdP3ʇP3kCd 5r>Lt>L| f2kC`,j&;LcP3f2XEBd4T͇l5x;5z5z·t>LC}̇|ٌ|l |̇P)KCfP*5^>lr+j6cHٌUX 5r>lڑPkCf·X@5,5f6+CfH H f3KCf`:j6j>lfPZP|vPCf6kCf6f3OCf7ԍfʱV>lvCX9XCf7ԍӑP uct>lf3 5I ۑP3* |Yf5NGBnˇx:jX:j{P3+#f;j Hَ#f;VNGBv/^ 5j$lgt>lf kCvAV·킬·,5a5 5PFBP4j+"j+ U[:b|ڊc|ڊc|ڊct>Tmj.b`5·XOj+VNCV:jUcH:暱|kZP5XCdUj.&PЇP>TJ|Z bt>TJX>TJX:VCX:Vc|·X+\>TmgP6PVct>Tmg|NC`;#r>T.rˇʥfKX9*r:*t>T.5\>TnEBV>TnPkCV [j>TnŪ|܊r+VNCVˇʭrˇʭrKCV9CV:*rcP9ӱV>Tt,cl<r,c}\ cP*"r/P r/j#r/̇ʽl9ˇʽl9KC`3X: \>Tn|̦PM%P-r3[nr4*Gf6ۊrr4ʇX9*Gct>T|Bvj.*G^>T6P9ZP9b|Vsrˇl5+r4^>TCj r$Tt>T|\ Vs|\MCn>Tv>Tڽ|܍r7XCn3TCn3Tr7ˡj;*Cvˡj;KCrVsPPPkCr ˱j>T.Ǫt>T.Ǫ|\VsP̖r9-P̖P9 ӑP9Ct/͇^·|esPPr;IP9#tC^>JX>B`5JJP{lJC^mt/̶{|(݋t/j`|(݋n>P+t/Vgj>Pt/Xͥ#t/X͵H( Vslҽ`5Vj$v UPt/otC^9C^9t/U[P׎t/v>Cn0ˇt>N|(j.Jt;Cv,JcP:kCvJ'ct>nZPśPś̀>njf5NCvt; U[|(ݎuCX9Jc|(ݎPKCv,jPtkFB|CT·ک^ԌCTvvP;Ջv+CT/VNCT/·ک^-̇ک^-ެ||ECX9jzP2VNCT/CT/CTP;kgr:jzlS|JCX9j R(kCXfV>Ԏ`kCXA5CX+j rk6cv>ԎX:n|+7`ˇڱrmKX>ԎKV>ԎKV:jʥ`·ڱr)["v\P;VNer>ԎSf·ڱr*P;VNex·ڱr*|+r:cT6^NP;VNCv>ԎSX:cX+jʱVWv\ 5P;Vt$Ԏkr+jʵlcZ9[mCXVVH+BX>Ԏ{f,jʽl3·ڱrˇڱr3NCXlc|+7̀>Ԏj,j`5·ڱr3ZP;VnfP;V|+GCdch VsP;Vt>Ԏfchv 6P;VZ>ԎlkCX[fkj.jr6[KCX9 ct>ԎӽX+j^·ڱr:؊CX9P;VNwv:j`׎ڱr;CX9 CX9 vb|+d:jI Vӑ! j>nCv(ˇf,jt>n#v<^>TCX+jr4ǚjˇfkP=֌P=V·rc`5 cf, cf@|KC`ՃX:Ճ\>TC|kCX5P?XC|ˇ`5·l9r2P@ f>ʱr>ʱr: B`5`+ 8CH( U[P HBg H(`P@V, CV>Їʭj,· l$HD| f>V =X(cdkcdP2VMcdt; %j. %j.̀>JVct>JVct,XBv/ 5۽`^0ncfB|,TP5Xcj: u|,Vt: ur@ ut>*crԌcrʱrʱr: V>*c|,T6X|,TVsXXLg|,TNGbr: XVsX(kctkctP:lZX(k6\>Jǚ̀>Jǚ|,X݋ |, rjZX݋KPڽX [|,ʱV>jb`5ڽX9cv/Vc|,t,ڽX9VsX݋Q;cv/VX݋j>jbn9cv/VNcv/VNn7Xcz, c|,TP=VNcz,j.+c)RV V$V*cRJj.+BH+GbXl+t;VJP+R\,+R:؎ct+R:؎#R+GbHU@cVZf3k\>j:k\:kbX+k{nrV>X+c\0Z`5rlT2kUcV( t+0V:X+bX9\>k%fZX:Z|, c`5ŒX,Œt>K6j.%[>KBu>KƪH,U[X,b|,U[r:%cVbXbf0bf@%\Œ`Ncd:UX5b`,Ur>c|,V VsXbt@UXźr>|, XX7ź},bv>XlZ;ӑX zH,XFbVctJ`ssR9`kc\/Xc\/sv> R,TVsX0k7t: zX+ z`svK`VsX0k7ct>X:]X0k7vsv3Xk|,뵛Z;Xc\ǂ^; H, #`+"`5ݎX˭|,XnX܊X ` crK`ǂVǂV6H,NGb4TFbR@kzX3f*f*f* VsX5[V>lX+f+XEbV5[|Y cX5t>l6@v5 POc|lZ`:ǚX+k6r4ǚݎU[V>l6HffA c|lbj.k6r5 Rl6Xt0Wfcl7ǚ+Gcv5 Vǚ Vc|lʱt:ǚ,TZXـP;ǚc|l`kcfnJ`kcf֏X+k6X+k6l9kcfW[V>l6hr5ZXh5 \9b|lbf5 `-Gc|lXjZXV۱j;ZX@ƺ|l |5k6`2ǚ3ǚ3 c|l0X+k6P+5 h(XmX+k6P5f Ur5 hf SX+k6XfA zXjXV>l6Vkcf[΅5 n(ǚ7VsX6CX+k6fZfͦ`kcf[uCX+k6r,+c|lpT5 n9͖l5ǚmRX+k6xc|lcV>l6ȱP:[fAbz5 r,UY+k6X.TnZX ǺX:VmZX XkcfKc|lj+ǚ9^ǚ:JgV>l6X5 t7UfngSX+k6xkcfvv5 v/X`\X`V>l6+5 v9ZX`CX3ǚ<kcfP;ǚ=VNZXӽX:k6l5j+k6cHٌ#f3V.#f3ǚ^,ǚ`,k6t>l| Vsl5k6\;[Ě`5V |٬|LGbf:k6rǚtXǚ^$L"f U#fUf;kc|َf;Vǂ^;k\>l#h cT/zt>VmEbV(Bf>VmZXkFbVٌĪ`$Vm H j+XcV:X0#jct>VmGbv>[nn;+rZ`cX>۬cX>۬ґX+GbH,JFbf, X$NX:cv$ncvt>n7Pjjcv)"tTfXX9Kcf0XX۱r5VX+t;Vӡv0[XLlXLt;VӱV>n`:XL|,ݎVt;V V>nh6XZ0lEbveX$n7cI,ݎvj$ngt$nw{f0|,·ʭ|,·ʭt$n烩d$nV>ڥP*Pj+}]X;`;kc|ݎv;VNcv,`5\j$p^(BdRX9 r: j. |/Ԍ{fBX)j{f ^+e|/ԌP3VN{f,j. EP4P4BZ*|/T^tjzh(j6|/Ԏc|/Ԯf^u^P4^0] Ec^P;lP;c|/j{P;ߋڱj sr4ҋX:ҋvbl5ߋXՌ{Xk{XXb:ߋŚP{X*t5Kt,ߋŚ^(Xbf ^,֌X+GzX3Vbf\@{X3VN{Xc^, XXXbf^,V{XAb,ba5bk&X3bhkFc|/֌|/{f7bnbn:ߋUXbT,ߋUcX9ߋU^bXʱP)oX9J{rbX-[{r-^ VX9{r,[bX:ߋcl+{rbX{r+{r,lX9{f+^ڽX9ߋ^ng|/nZ^Vs^,^0^+GzV)Zb|/X|/X#`. ^X+ 6c|/ Vs^n{hvc|/ʱVvc`5X9|/MSfPt0t@ Vc^k{jr: Vc|/X`5k{j.`5+{j.VN{j.\`Xj. VX+ VX: V}/X\`7 vt/ vVvc|/jۍ`+n7VN{n7nnnKGznn6[|/M{r,7`k{r3 ``f^ft,7^|/XnV: ^\.`k{r9X{r9|/N{t2dX9ddd,X@`,`5tL'^0 ^0 `+{t7V`+^0ݍctLwc`5X9Xͥ`+`f, Xc|/n7c|/n7cH/n7c|/n7ctLtLj. #`; H/%cH/.`;۱|/؎5Pf3TX c|/؎5xvlPk{v `;Vʆʭ|/؎r+۱TXƚ^kEzv5[^ӽH/؎BflzP+ cX۱^,JGzv-c^k^{vk{v+{v+`;V^|/؎U^^+{v,۱t; cP۱v(L{v,J`;{Vlt/X{v,j^ {v,Z0l{v/V`5t/ lGCH/خ^] |/NGzv:^m^W[: ۡd`f, X+ X: `5 ^` Y+  t,\^f3ȱ|/[@{=eC^^|/^X-ml3+|/یbr;X/*cf@6cXej,X:6cP3et+{f,j|/یCX:6cP3X{f,l3FcX:e|/j{f3èZ^6ezel+{l7fVvc|/^6ۍ^6 Vs^6M{le^e^,e^|/Z^ۍl+ll7e˱^6{r,{r0f-7c|/[nl:e|/r{n7ntV0#YHFT(LP>J惩dV,SXSXKT2VSX;L%ct>JV,lj[Fc|k`j>؊5ȡj.X僭X*b|kVbX+lŪr>؊Uct>؊U\>؊U`+V[t V,[X;lbt>V6_@热l>[|X9^6[|:l{`K烱f+5[V>kb|0l|0l|0lX5VcX9ƪX>cH05#X:VmB|k:Ś}0bj>Z`."\.XM烹\3rX+嚱r>5ct>5c|0k|0k\zt$`.h>ˇH0  H0H0n E`7 |0LGR 6Kr-[N"f)VnGR 6Kr5l|ي|jV$lf+jV*NGV,lbX,X)Kӑ`V6[r5NV\ӱt>l|٪˱|٪˱t>l՚|6[f6+f7ffj,t>،X+lґ`3 6kr+lʱV$جcl$ج|Y7f-lf-ެ|Y7tX3 6{f4X `5 6r:[X:l&t$Ll5l&tZ@f$lf 6H Б`X$lʭ|ٌ"f3XX@l6kf>lf@l6kf5NGf0l6h$lCt$lCt)^Ef0Mg`f`5 fH #f3mf3l>l6:l6t>lf}fr>l#f3 6I `pPf@lFC`3*#f4TX9lFcv,lF\;[^l5l:l#f;lc|Vs`FvZ@v:lӽ`96`Gfn>Z``ht>$h:`Vj*VSV>XM`5^ VSXVSX:zt;V^,ݎ`5 Vs`5j+ |*r`Ujf|*cd>XmʱP2VR9J|*cd:Jr5R`V[V>Xm`+#j+ZZLGV/^6`V[XV[j.h4Vf(f,hh Vs` 6|j+j+Vs`7ct>XmeP5V[|7Tj+OGV6l> ұV>Xme`V[|:ljj[fk`U`tUj+*bt>Xm{XV[^0lj+M%#j+-GV:[NV-Gj+Ζ|J˵|J˵X9r-VNV:^|Jcv>XmŻ`[`>XX+rP:Vcf(#jc`5 %c|r:X:}KGZ0lEZ܊r VkX@j`5k\Vsr:\>X5ct>Xͥ#j.VsnVs`7n:#jVj|j2VX9Vj.&|l`5HZ jԌEj,VcP.Vr>Xt>XHZ Fj0 VZ9`5Vj`5`7l>VX+V`5 V}j(f`5 VX;|>XMgHng`5V Hng @v V۱r>Xmt>XmʱV>Xmʹr,VX9XvLj;Vc|ڎX:c`:Xv,j;Vd|ڎa5V۱r:ct>Xm`4 V۽r Vj>Xm`5vc`7r>؍`7j.,rcX:c|k`9uj.,ڡn:,|өH0Vj$Ne`өl5۱H0VjKV6[hc`:cr(ӱT9J|0KCd:LZ`:t,tӱr>t,ӽ|0+e|0+et>Z`+^ӽX:Ljf>f@L\>Pj.Lwt7}0X9Z۵xZY`;l`;۩^S/^mT/U`;Ջv+vKT/X^>`*`*f>ʡ|۽V9Vs`*|kCt>ʱ|>v/V۽X9۽X9X^۽^۽^۽^ Vs`6[| Vv/X^6۽t;Tm^\>ۡj+{v6X:t:lWctt:X:v:l#vX+lc|ݎ\$nbt;Fv.VMcjT0`*v;+v0nv`5Nv`5 v@l`;jr|KGX:,QDVDV3DV9DV:,ȪV> 賡V>[*5clԌRK糥R3Xl Vsl HX.[d[^6峭\,bl5jf>ś̀>K糹|6d`,g|6t>lV:m"f-m HYZ6kHY˅|YeV$۬clf-EZ9gt$۬$f3[eHLX#f:dXvj>۬j,mc`5gX:l4TgjFC^6gj0gj0kP5hLt> UX9FC`:gj0h,l4T dt> Ua5FCdgj3Xl4Tmh)B|6Z lԌR3gt>UhZ@GXgj-L|Z`VV[r$[mʥr(bX+bZV[r-lj+VśX:V[rgXj+Vnt>[mXV[r:x:xdH+j2&l5g|ڎlV$mEVgRgR3JVM%l r>mBzgT/JVO%lʦlʦ|6JCv>m|6J|6JX9ͶRv;VNV*n|6ۊl+VdX5Ͷzf3Ͷ|6 l|6j|6jt>m5X>m5|6jfX>mECH6ۊl U |6ۊƪlՍr>mucdgndr6f[H6JVkV:V:FVM%l+d|܊d|*l+l+lϖlϖr>mdg| Vslϖld>m H6 l6g|6[l-VgX9fkj.l6Xf>mƪl#lfv,6j>m6c:6j:6X:6I6g^>MGt;VgH6ێUlAXl gH۱r$[NX9 clϖ[t>[n5hr-r5xϖ[\,-bH܊Ur+Xlr+XͥrKrK}6CIܪct>[nr+ {l۽t$[nrɖ[|lg˱|g9 c|lV@-'Cf,-'CP@-'Cl3gP/ l9*gV>[NxgRd)VMb|,e|,et>[NB}l|r2VgXgX9ϖP9ϖf6ϖl9gZr-cl9˖ӱt>[Nt,-'{x:g`5ϖjj| Vs|lfC|lfCt>[NFC|t>[NFCf0ghl9 cl9 c|ƪl9r2or bl9mRt>[Nh>[Nh:-'l9b|Lbv:-'ӽl7-'ӽl7ϖ^@-'P;djt>[NCf,-'n>[Nt>[Nƻl9r2%r2%lيdV>[n |l5PP5rՠx:-7[ f, Vsljclkf}l5X:ϖf@-7[|lՃ|>[nX>ϖ|g|rmrml9r4ϖlϖ}\g6g`ϖXg`ϖX9ϖX:-l4ϖ}\|\f@-Pϖӱ|Ur:Vr:V Vsl9rt/؍rl9 vct>[NZϖӽ`7Xt/Zl9 vr>[Nn\@t/|`5ϖӽ`7ϖ|n7Pt,-۱V>[Nlϖ۽Hv/+v/Kv/KrlrHvϖ۽f,g^3NWct>[n`3ϖ۽$UvgV>o X>ov>olJxƫX+W[r>\>l=c|6|\>OGk0d Y* TڎUr(̗Cd/R`5/Rt {r(#P5k6P5׌ˡjkˡj+ˡj+P5׌P5 Vsr/ x7_uClʗCn/X9_ur:_uj._uj./|9NP/ڽZ/B|9JZr, Vsr,L˱P/B^,_ڽX+_ڽX:_ڽtK%X*X*k˱T2VΗcdΗcd˗cd:_U#X5_US|9VMb|9VMb|9VM\X/X+_j._XKVKrKr:_X:_`5/ک^kzVkzV3/ک^Urr0k`.׌`.׌`.׌`. Vsr0k`׎^;_z:_ztH9kr0׌ |9Xj.VΗ\˗\:_VX&V&t&X:_V`5/f@_r0.|9nBV:_|9nCT/_P;Ջ`;_Cf,_crkjljlZ-_c x7_c x7/۱rl|9؎`˗^/۽X:_{j._\l:_\:_rݎU#lj._Vsl/gV6VNj Vsrke\:_VsVb|9[|9[|9[f@_VsXkj.XjЗ\5Nj./g۱|9xΗ\|9^}9 HH )!^W[r2XmEf]rx:Kt04"$>d"Q :P5Z,{3^( X`,H@ hj.F\L_4@``tU+ rkUP tAԕP)X UCx%TmʕP=+WJ~% ҕX5TUC`CX5[Ǫn/[cl-X5eKP?Vv{R0UU^ZU~cl?֪X˦C`TCnx%J4DC&J7 */``_~?h% gVc3et@`5LgBdz(k(kV+LDl΄z, ^&zt& FCQ2kDd L(ogBx;̄LeBx@̈́\ʄ^( Fc(\&l k6Uf3o`ˡj.5|5|5|/Y^&lfj ȚlKf3Ogbf6ngYȚٍ݀f7Xdn:kj&U3hZ@gbX5Ec`:ƪv, fb`: Ȫ, Ul4V ȺY7cP5+'c, L,CY:ҽ`={z(j. Kc,ݎ[@nʭPX t;VB倬Y;P@L.*f@[`a cVƚ`5ƚt& 5d,vcakn,vj. P58C\& ar&f 6-t& ePжb̀kk6ck6c倶k6c:mŚX9жbf h[f:ͅ2\(ͅ 6׋m.悩6Lxv:Md&c̀6kd,&\&fl/ ePdj+T@gP hɀf2m+g\&[Йl5+j2Жcm9ɖl9Y@gdɖr:-'LLX&[N{r,fd,ҙl9櫙l9^ eX4؎e^0Ml&NP5+̀6^ x h d5o{v@o |j.Wsm+x5+j.nj.j.ݎx5nL6^ͥ|5x9XXKt,{m+xW7xW7t:{L6^bl/ 6mkf ht[3ts:nh@fP;T SP@Jy*XM2A2-H2M2[V2Z2Ta2d2Lj2p2Au2y2|2+2[2222224222 2Z22$2+22F2252222D222223 333#3%3)3N03x:3DA3@F3M3nQ3W3\3ca3i3o3u3Oz3‚33233393#33ǽ33333k33F3T3'34 44(414<4D4hK4S4]4Uf4n4'~4444G4ڬ4~44444!444{45 5#5)5<95G5M5W5e5m5j}55$5Ȥ5W55-5 556g6(6~>6G6HV6m6{666 6o666~677i7'7?77 A74K7`7`l7t7747777D7N7778Q;8F8M8MX8@i8py88p8889 9#9}:99098999^9T::u$:?:W:(j:s:΁::::I;;z7;J`;1p;);;0;;C;uD<dV<fe<ü< <i==1$=HK=p=Q==>?5>C>Z>br>>>>?K?:?n@,@VA:AAKCrCRC#H2ĽآHN*!%"p"5"y##l$H$@%%&P&0'k''sC(`(\)Ⱥ)E*@*+l+ 5,7, -č--d.t.AH/g/60N0H1122 3[3u3j44P55/66#7|77{88l9 9Z::Y;;@<n<!=Ƒ==r>>g??NN@@JACAFBBV(CUC;DDuDeEEcFFQGGBHΖH III:dJJ|^KKYLLEL=MM1NNOtOmOaPPJQιQ/RRSSsTvTzTTUoU V%jVrV>W+WXXXFYBYEYLZZZ!;[/[[\u\\]QK]h]F]/^^^2_U_.__ `Q`-``a[aJaa bHbybbb2c{cAcdDdddXe1deeeefIf= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Qڞ,5assets/custom_currency_sym_keyboard1.sur.pngUT n_n_n_ WГWГWГrequire "common_keys" require "keyboard_symbol" local si = smartinput local ck = common_keys local sym = keyboard_symbol local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "eng_sym_keyboard1_international" else surface.template = "eng_sym_keyboard1" end function surface.get_symbol_currency_type (surface_id) local language = si.get_current_language() if language == nil or surface_id == nil or language.surfaces == nil then return si.currency_type.USD end for i, key in _G.pairs(language.surfaces) do local surface_item = language.surfaces[i] if surface_item ~= nil and surface_item.currency_type ~= nil and surface_item.surface_id == surface_id and surface_item.surface_type == si.surface_type.SOFT_SYMBOL then return surface_item.currency_type end end return si.currency_type.USD end local surface_id = "custom_currency_sym_keyboard1.sur.png" local currency_type = surface.get_symbol_currency_type(surface_id) local symbol = sym.keyboard_symbol_table[currency_type][1] local symbol_alt = sym.keyboard_symbol_table[currency_type][2] local symbol_expand = sym.keyboard_symbol_table[currency_type][3] if symbol == nil or symbol_alt == nil or symbol_expand == nil then symbol = sym.normal_symbol symbol_alt = sym.normal_symbol_alt_table symbol_expand = sym.normal_symbol_expand_table end local enable_slide_symbol = true surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.touch_correct = false surface.extra_elements = { "popup_revert", "popup_explicit", } sym.setup_symbol( surface, symbol, symbol_alt, symbol_expand, "1/2", "custom_currency_sym_keyboard2.sur.png", "custom_currency_sym_keyboard2.sur.png", enable_slide_symbol) surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_back"] = ck.sk_back_to_previous_abc return surface PK n5:Q}V--,5assets/custom_currency_sym_keyboard2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "keyboard_symbol" local si = smartinput local ck = common_keys local sym = keyboard_symbol local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "eng_sym_keyboard2_international" else surface.template = "eng_sym_keyboard2" end function surface.get_symbol_currency_type (surface_id) local language = si.get_current_language() if language == nil or surface_id == nil or language.surfaces == nil then return si.currency_type.USD end for i, key in _G.pairs(language.surfaces) do local surface_item = language.surfaces[i] if surface_item ~= nil and surface_item.currency_type ~= nil and surface_item.surface_id == surface_id and surface_item.surface_type == si.surface_type.SOFT_SYMBOL then return surface_item.currency_type end end return si.currency_type.USD end local surface_id = "custom_currency_sym_keyboard2.sur.png" local currency_type = surface.get_symbol_currency_type(surface_id) local symbol = sym.keyboard_symbol_table_2[currency_type][1] local symbol_alt = sym.keyboard_symbol_table_2[currency_type][2] local symbol_expand = sym.keyboard_symbol_table_2[currency_type][3] if symbol == nil or symbol_alt == nil or symbol_expand == nil then symbol = sym.normal_symbol_2 symbol_alt = sym.normal_symbol_alt_table symbol_expand = sym.normal_symbol_expand_table end local enable_slide_symbol = true surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.touch_correct = false surface.extra_elements = { "popup_revert", "popup_explicit", } sym.setup_symbol( surface, symbol, symbol_alt, symbol_expand, "2/2", "custom_currency_sym_keyboard1.sur.png", "custom_currency_sym_keyboard1.sur.png", enable_slide_symbol) surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_back"] = ck.sk_back_to_previous_abc return surface PK n5:Q T5assets/czech.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("CS", "Czech") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.czechv5 .. "czech_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.czechv5 .. "czech_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.czechv5 .. "czech_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.czechv5 .. "czech_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.czechv5 .. "czech_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.czechv5 .. "czech_traits.trt.png" lng.statistic_alias = "czech" lng.categories[si.language.category.FASTSWITCH] = "czech" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "czech" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "czech" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "cs" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.czechv5 .. "czech.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.czechv5 .. "czech_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.czechv5 .. "czech_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.czechv5 .. "czech_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q`5assets/czech_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:QM)q5assets/czech_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q5ޝ"5assets/czech_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "czech_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q 5assets/czech_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "czech_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qj 5assets/czech_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "czech_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QNWW5assets/czech_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "czech_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qdd&5assets/czech_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "czech_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qg'ZZ5assets/czech_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local special_lower_list = { "á", "à", "â", "ã", "å", "ä", "æ", "ā", "ą", "č", "ç", "ć", "ď", "é", "ě", "ê", "ë", "è", "ę", "ē", "ė", "í", "ì", "î", "ï", "ī", "į", "ň", "ń", "ñ", "ó", "ò", "ô", "õ", "ō", "ö", "œ", "ø", "ř", "ŕ", "š", "ś", "ß", "ť", "ú", "ů", "ü", "ù", "û", "ū", "ý", "ÿ", "ž", "ź", "ż", } local special_upper_list = { "Á", "À", "Â", "Ã", "Å", "Ä", "Æ", "Ā", "Ą", "Č", "Ç", "Ć", "Ď", "É", "Ě", "Ê", "Ë", "È", "Ę", "Ē", "Ė", "Í", "Ì", "Î", "Ï", "Ī", "Į", "Ň", "Ń", "Ñ", "Ó", "Ò", "Ô", "Õ", "Ō", "Ö", "Œ", "Ø", "Ř", "Ŕ", "Š", "Ś", "ß", "Ť", "Ú", "Ů", "Ü", "Ù", "Û", "Ū", "Ý", "Ÿ", "Ž", "Ź", "Ż", } local accent_letter_dictionary = { [string.byte("a")] = "áàâãåäæāą", [string.byte("c")] = "čçć", [string.byte("d")] = "ď", [string.byte("e")] = "éěêëèęēė", [string.byte("i")] = "íìîïīį", [string.byte("n")] = "ňńñ", [string.byte("o")] = "óòôõōöœø", [string.byte("r")] = "řŕ", [string.byte("s")] = "šśß", [string.byte("t")] = "ť", [string.byte("u")] = "úůüùûū", [string.byte("y")] = "ýÿ", [string.byte("z")] = "žźż", [string.byte("A")] = "ÁÀÂÃÅÄÆĀĄ", [string.byte("C")] = "ČÇĆ", [string.byte("D")] = "Ď", [string.byte("E")] = "ÉĚÊËÈĘĒĖ", [string.byte("I")] = "ÍÌÎÏĪĮ", [string.byte("N")] = "ŇŃÑ", [string.byte("O")] = "ÓÒÔÕŌÖŒØ", [string.byte("R")] = "ŘŔ", [string.byte("S")] = "ŠŚß", [string.byte("T")] = "Ť", [string.byte("U")] = "ÚŮÜÙÛŪ", [string.byte("Y")] = "ÝŸ", [string.byte("Z")] = "ŽŹŻ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q8IM5assets/danish.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("DA", "Danish") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.danishv5 .. "danish_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.danishv5 .. "danish_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.danishv5 .. "danish_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.danishv5 .. "danish_traits.trt.png" lng.statistic_alias = "danish" lng.categories[si.language.category.FASTSWITCH] = "danish" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "danish" lng.categories[si.language.category.CELLDICT] = "danish" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "danish" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.danishv5 .. "danish.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.danishv5 .. "danish_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.danishv5 .. "danish_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q>P#5assets/danish_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "danish_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q8ղ !5assets/danish_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.dan_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "swedish_soft_full_email_uri_international" else template = "swedish_soft_full_international" end alt_inputs = kb.swe_full_qwerty_alt else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "swedish_soft_full_email_uri_curve_international" else template = "swedish_soft_full_curve_international" end alt_inputs = kb.swe_full_qwerty_alt_curve shift_inputs = kb.swe_full_qwerty_shift_curve end local s = sf.new_full_keyboard( "danish_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QEXX 5assets/danish_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "danish_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QZ5assets/danish_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local special_lower_list = { "à", "á", "â", "ã", "ä", "ā", "é", "ë", "í", "ï", "ó", "ò", "ô", "õ", "ō", "œ", "ö", "ú", "ü", "ù", "û", "ū", "š", "ś", "ß", "ń", "ñ", "ł", "ý", "ÿ", "æ", "ø", "å" } local special_upper_list = { "À", "Á", "Â", "Ã", "Ä", "Ā", "É", "Ë", "Í", "Ï", "Ó", "Ò", "Ô", "Õ", "Ō", "Œ", "Ö", "Ú", "Ü", "Ù", "Û", "Ū", "Š", "Ś", "ß", "Ń", "Ñ", "Ł", "Ý", "Ÿ", "Æ", "Ø", "Å" } local accent_letter_dictionary = { [string.byte("a")] = "æåàáâãäā", [string.byte("e")] = "éë", [string.byte("i")] = "íï", [string.byte("o")] = "øóòôõōœö", [string.byte("u")] = "úüùûū", [string.byte("s")] = "šśß", [string.byte("n")] = "ńñ", [string.byte("l")] = "ł", [string.byte("y")] = "ýÿ", [string.byte("A")] = "ÆÅÀÁÂÃÄĀ", [string.byte("E")] = "ÉË", [string.byte("I")] = "ÍÏ", [string.byte("O")] = "ØÓÒÔÕŌŒÖ", [string.byte("U")] = "ÚÜÙÛŪ", [string.byte("S")] = "ŠŚß", [string.byte("N")] = "ŃÑ", [string.byte("L")] = "Ł", [string.byte("Y")] = "ÝŸ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PKk5:Q%5assets/data_collect_blacklist_v1.jsonUT  n_ n_ n_ w@TГw@TГw@TГMA @}ĵmJD48:a&{Z'sfPocp&B(Ҕ|'vfGfQs VPoӒ/ePK`zPK n5:Qw)5assets/dummy.pngUT n_n_n_ WГWГWГPNG  IHDR 0ԭ#fsRGB@IDATxڱ 1`bD=- @ @ @ @' @ @ @ @ @  @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @s@IDAT @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @l @ @ @ @rZN @ @ @ @ˮ0 *E ,j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @:y@IDAT @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @صca]WE( @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @&ѧ@IDAT @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ vaU/ ag  @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @~%@IDAT @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @Į0 *E , @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @^g@IDAT @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @صca]WE(%@ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ge@IDAT @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ vL0̿ @@IDAT @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. V?XG@IDATۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @b׎Iw]`v @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @@IDAT @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @@1 0_  @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @j'@IDAT @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @];&`uUAY @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @r@IDAT @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @k$ ~Q0;K @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @  IDAT@ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @ @ @ @ @ @. Vۉ  @ @ @ @ @X @ @ @ @ @` @ @ @ @ @@ @ @ @ @ vb @ @ @ @ V @ @ @ @j; @ @ @ @ @ @ @ @b @ @ @ @| @ @ @ @vNl @ @ @ @j>@ @ @ @ @Xm'6@ @ @ @ @b5 @ @ @ @ @]@ @ @ @ @ @l&\ZOIENDB`PK n5:Q ~K5assets/dutch.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("NL", "Dutch") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.dutchv5 .. "dutch_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.dutchv5 .. "dutch_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.dutchv5 .. "dutch_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.dutchv5 .. "dutch_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, { surface_id = pkg.dutchv5 .. "dutch_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.dutchv5 .. "dutch_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.dutchv5 .. "dutch_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.dutchv5 .. "dutch_traits.trt.png" lng.statistic_alias = "dutch" lng.categories[si.language.category.FASTSWITCH] = "dutch" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "dutch" lng.categories[si.language.category.CELLDICT] = "dutch" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "dutch" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "nl" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.dutchv5 .. "dutch.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.dutchv5 .. "dutch_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.dutchv5 .. "dutch_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.dutchv5 .. "dutch_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.dutchv5 .. "dutch_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q 65assets/dutch_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 0 81 48 162 s 48 81 96 162 d 96 81 144 162 f 144 81 192 162 g 192 81 240 162 h 240 81 288 162 j 288 81 336 162 k 336 81 384 162 l 384 81 432 162 m 432 81 480 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 ' 360 162 408 243 PK n5:Q둦5assets/dutch_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q&[5assets/dutch_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q[  5assets/dutch_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.eng_full_azerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.eng_full_azerty_alt_curve_international shift_inputs = kb.eng_full_azerty_shift_international end local s = sf.new_full_keyboard( "dutch_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qyv\"5assets/dutch_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "dutch_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QGR  5assets/dutch_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "dutch_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q 2^  5assets/dutch_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "dutch_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QVV5assets/dutch_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "dutch_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q*+dd&5assets/dutch_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "dutch_soft_tplus_azerty", kb.eng_tplus_azerty_left, kb.eng_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q=cc&5assets/dutch_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "dutch_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q_z\\5assets/dutch_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "æ", "ã", "å", "ā", "á", "ӓ", "â", "à", "ė", "ѐ", "ę", "ē", "ё", "é", "ê", "ī", "î", "į", "ì", "ï", "í", "ō", "ø", "œ", "õ", "ò", "ô", "ö", "ó", "ū", "û", "ù", "ü", "ú", "ñ", "ń", } local special_upper_list = { "Æ", "Ã", "Å", "Ā", "Á", "Ӓ", "Â", "À", "Ė", "Ѐ", "Ę", "Ē", "Ё", "É", "Ê", "Ī", "Î", "Į", "Ì", "Ï", "Í", "Ō", "Ø", "Œ", "Õ", "Ò", "Ô", "Ö", "Ó", "Ū", "Û", "Ù", "Ü", "Ú", "Ñ", "Ń", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end local accent_letter_dictionary = { [string.byte("a")] = "ӓæãåāáâà", [string.byte("e")] = "ëéėѐęēê", [string.byte("i")] = "ïíīîįì", [string.byte("o")] = "öóōøœõòô", [string.byte("u")] = "ūûùüú", [string.byte("n")] = "ñń", [string.byte("A")] = "ӒÆÃÅĀÁÂÀ", [string.byte("E")] = "ËÉĖЀĘĒÊ", [string.byte("I")] = "ÏÍĪÎĮÌ", [string.byte("O")] = "ÖÓŌØŒÕÒÔ", [string.byte("U")] = "ŪÛÙÜÚ", [string.byte("N")] = "ÑŃ", } function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q/R\5assets/dutchbe.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("NL", "Dutch") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.dutchbev5 .. "dutchbe_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.dutchbev5 .. "dutchbe_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.dutchbev5 .. "dutchbe_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.dutchbev5 .. "dutchbe_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, { surface_id = pkg.dutchbev5 .. "dutchbe_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.dutchbev5 .. "dutchbe_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.dutchbev5 .. "dutchbe_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.dutchbev5 .. "dutchbe_traits.trt.png" lng.statistic_alias = "dutchbe" lng.categories[si.language.category.FASTSWITCH] = "dutchbe" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "dutchbe" lng.categories[si.language.category.CELLDICT] = "dutchbe" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "dutchbe" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "nl" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.dutchbev5 .. "dutchbe.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.dutchbev5 .. "dutchbe_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.dutchbev5 .. "dutchbe_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.dutchbev5 .. "dutchbe_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.dutchbev5 .. "dutchbe_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q 6 5assets/dutchbe_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 0 81 48 162 s 48 81 96 162 d 96 81 144 162 f 144 81 192 162 g 192 81 240 162 h 240 81 288 162 j 288 81 336 162 k 336 81 384 162 l 384 81 432 162 m 432 81 480 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 ' 360 162 408 243 PK n5:Q둦 5assets/dutchbe_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q&[ 5assets/dutchbe_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Qˍw  "5assets/dutchbe_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.eng_full_azerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.eng_full_azerty_alt_curve_international shift_inputs = kb.eng_full_azerty_shift_international end local s = sf.new_full_keyboard( "dutchbe_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q̈́U$5assets/dutchbe_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "dutchbe_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q "5assets/dutchbe_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "dutchbe_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q  "5assets/dutchbe_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "dutchbe_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QXX!5assets/dutchbe_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "dutchbe_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QUff(5assets/dutchbe_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "dutchbe_soft_tplus_azerty", kb.eng_tplus_azerty_left, kb.eng_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q0̀ee(5assets/dutchbe_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "dutchbe_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q_z\\5assets/dutchbe_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "æ", "ã", "å", "ā", "á", "ӓ", "â", "à", "ė", "ѐ", "ę", "ē", "ё", "é", "ê", "ī", "î", "į", "ì", "ï", "í", "ō", "ø", "œ", "õ", "ò", "ô", "ö", "ó", "ū", "û", "ù", "ü", "ú", "ñ", "ń", } local special_upper_list = { "Æ", "Ã", "Å", "Ā", "Á", "Ӓ", "Â", "À", "Ė", "Ѐ", "Ę", "Ē", "Ё", "É", "Ê", "Ī", "Î", "Į", "Ì", "Ï", "Í", "Ō", "Ø", "Œ", "Õ", "Ò", "Ô", "Ö", "Ó", "Ū", "Û", "Ù", "Ü", "Ú", "Ñ", "Ń", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end local accent_letter_dictionary = { [string.byte("a")] = "ӓæãåāáâà", [string.byte("e")] = "ëéėѐęēê", [string.byte("i")] = "ïíīîįì", [string.byte("o")] = "öóōøœõòô", [string.byte("u")] = "ūûùüú", [string.byte("n")] = "ñń", [string.byte("A")] = "ӒÆÃÅĀÁÂÀ", [string.byte("E")] = "ËÉĖЀĘĒÊ", [string.byte("I")] = "ÏÍĪÎĮÌ", [string.byte("O")] = "ÖÓŌØŒÕÒÔ", [string.byte("U")] = "ŪÛÙÜÚ", [string.byte("N")] = "ÑŃ", } function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q1 )/ / 5assets/edit.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" local si = smartinput local ck = common_keys local surface = si.new_surface("edit") surface.on_load = function (old_surface) surface.softkeys["sk_url"] = old_surface.softkeys["sk_url"] surface.softkeys["sk_voice"] = old_surface.softkeys["sk_voice"] surface.softkeys["sk_hw_mask"] = old_surface.softkeys["sk_hw_mask"] surface.softkeys["sk_clipboard"] = old_surface.softkeys["sk_clipboard"] surface.softkeys["sk_bk"] = old_surface.softkeys["sk_bk"] surface.softkeys["sk_quick_switcher"] = old_surface.softkeys["sk_quick_switcher"] surface.softkeys["sk_mo"] = old_surface.softkeys["sk_mo"] surface.softkeys["sk_clear_candidate"] = old_surface.softkeys["sk_clear_candidate"] surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_back"] = si.new_softkey() surface.softkeys["sk_back"].on_click = function() si.back_to_keyboard() end surface.softkeys["sk_edit"] = surface.softkeys["sk_back"] surface.softkeys["sk_ent"] = ck.sk_ent_eng surface.softkeys["sk_clipboard"] = ck.sk_clipboard surface.softkeys["sk_clipboard"].main_title = "@string/widget_title_clipboard" surface.softkeys["sk_sp"] = si.new_softkey() if old_surface.softkeys["sk_sp"] ~= nil then surface.softkeys["sk_sp"].on_click = old_surface.softkeys["sk_sp"].on_click end local keyboard_surface = si.get_current_keyboard_surface() if keyboard_surface ~= nil then if surface.softkeys["sk_bk"] == nil then surface.softkeys["sk_bk"] = keyboard_surface.softkeys["sk_bk"] end if surface.softkeys["sk_sp"].on_click == nil then surface.softkeys["sk_sp"].on_click = keyboard_surface.softkeys["sk_sp"].on_click end end end surface.template = "eng_edit" surface.surface_type = smartinput.surface_type.SOFT_SPECIAL surface.touch_correct = false sk_editors = {"copy", "paste", "cut", "up", "down", "left", "right", "pdown", "pup", "home", "end", "select", "del", "selectall", "space", "done", "edit_addword", "edit_op"} for i, title in _G.pairs(sk_editors) do key = si.new_softkey() key.main_title = "@string/edit_" .. title key.case_sensitive = false key.on_click = function(sk) if sk.main_title == nil then si.set_accessibility_string("@string/accessibility_edit_" .. title) else si.set_accessibility_string(sk.main_title) end si.input_keycode(_G.config.L_KEYCODE_EDIT_KEY_BEGIN + i - 1) end surface.softkeys["sk_" .. title] = key end surface.softkeys["sk_up"].main_title = nil surface.softkeys["sk_up"].on_long_press_multi = function() si.input_keycode(_G.config.L_KEYCODE_EDIT_KEY_BEGIN + 3) end surface.softkeys["sk_down"].main_title = nil surface.softkeys["sk_down"].on_long_press_multi = function() si.input_keycode(_G.config.L_KEYCODE_EDIT_KEY_BEGIN + 4) end surface.softkeys["sk_left"].main_title = nil surface.softkeys["sk_left"].on_long_press_multi = function() si.input_keycode(_G.config.L_KEYCODE_EDIT_KEY_BEGIN + 5) end surface.softkeys["sk_right"].main_title = nil surface.softkeys["sk_right"].on_long_press_multi = function() si.input_keycode(_G.config.L_KEYCODE_EDIT_KEY_BEGIN + 6) end surface.extra_elements = { "selection", } return surface PK n5:QQii5assets/emo_list_default.lua.pngUT n_n_n_ WГWГWГreturn { "!", "?", ",", "。", "~", "(", ")", "、", "!", "?", "'", "~", "(", ")", "#", "*", } PK n5:Q@(335assets/emo_list_en.lua.pngUT n_n_n_ WГWГWГreturn { "!", "?", "'", "~", "(", ")", "#", "*", } PK n5:Qx-AA5assets/emo_list_zh.lua.pngUT n_n_n_ WГWГWГreturn { "!", "?", ",", "。", "~", "(", ")", "、", } PK n5:Q_tt5assets/emoji.lua.pngUT n_n_n_ WГWГWГrequire "smartinput" require "emoji_unicode" require "emoji_sb_unicode" local P = {} P._G = _G if _REQUIREDNAME == nil then emoji = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local si = _G.smartinput local eu = _G.emoji_unicode local sbeu = _G.emoji_sb_unicode emoji_code = { EMOJI_SMILE = eu.emoji_list["u1f603"], EMOJI_SAD = eu.emoji_list["u1f612"], EMOJI_GRIN = eu.emoji_list["u1f604"], EMOJI_NAUGHTY = eu.emoji_list["u1f61c"], EMOJI_JOY = eu.emoji_list["u1f60a"], EMOJI_CONFUSED = eu.emoji_list["u1f628"], EMOJI_KISS = eu.emoji_list["u1f618"], EMOJI_SURPRISE = eu.emoji_list["u1f631"], EMOJI_PLEASED = eu.emoji_list["u1f609"], EMOJI_HEARTSHAPED = eu.emoji_list["u1f60d"], EMOJI_WRONGED = eu.emoji_list["u1f622"], EMOJI_CRY = eu.emoji_list["u1f602"], EMOJI_ARROGANT = eu.emoji_list["u1f60f"], EMOJI_ANGRY = eu.emoji_list["u1f621"], EMOJI_WEEP = eu.emoji_list["u1f62d"], EMOJI_DIZZY = eu.emoji_list["u1f632"], } emoji_common = { EMOJI_SMILE = ":-)", EMOJI_SAD = ":-(", EMOJI_GRIN = ":-D", EMOJI_NAUGHTY = ":-P", EMOJI_JOY = ";-)", EMOJI_CONFUSED = "=-O", EMOJI_KISS = ":-*", EMOJI_SURPRISE = ":O", EMOJI_PLEASED = "B-)", EMOJI_HEARTSHAPED = ":-$", EMOJI_WRONGED = ":-!", EMOJI_CRY = ":-[", EMOJI_ARROGANT = "O:-)", EMOJI_ANGRY = ":-\\", EMOJI_WEEP = ":'(", EMOJI_DIZZY = ",-)", } emoji_wechat = { EMOJI_SMILE = "[微笑]", EMOJI_SAD = "[难过]", EMOJI_GRIN = "[憨笑]", EMOJI_NAUGHTY = "[调皮]", EMOJI_JOY = "[愉快]", EMOJI_CONFUSED = "[疑问]", EMOJI_KISS = "[亲亲]", EMOJI_SURPRISE = "[抓狂]", EMOJI_PLEASED = "[得意]", EMOJI_HEARTSHAPED = "[色]", EMOJI_WRONGED = "[委屈]", EMOJI_CRY = "[流泪]", EMOJI_ARROGANT = "[傲慢]", EMOJI_ANGRY = "[发怒]", EMOJI_WEEP = "[大哭]", EMOJI_DIZZY = "[晕]", } emoji_table = { [emoji_code.EMOJI_SMILE] = { emoji_common.EMOJI_SMILE, emoji_wechat.EMOJI_SMILE }, [emoji_code.EMOJI_SAD] = { emoji_common.EMOJI_SAD, emoji_wechat.EMOJI_SAD }, [emoji_code.EMOJI_GRIN] = { emoji_common.EMOJI_GRIN, emoji_wechat.EMOJI_GRIN }, [emoji_code.EMOJI_NAUGHTY] = { emoji_common.EMOJI_NAUGHTY, emoji_wechat.EMOJI_NAUGHTY }, [emoji_code.EMOJI_JOY] = { emoji_common.EMOJI_JOY, emoji_wechat.EMOJI_JOY }, [emoji_code.EMOJI_CONFUSED] = { emoji_common.EMOJI_CONFUSED, emoji_wechat.EMOJI_CONFUSED }, [emoji_code.EMOJI_KISS] = { emoji_common.EMOJI_KISS, emoji_wechat.EMOJI_KISS }, [emoji_code.EMOJI_SURPRISE] = { emoji_common.EMOJI_SURPRISE, emoji_wechat.EMOJI_SURPRISE }, [emoji_code.EMOJI_PLEASED] = { emoji_common.EMOJI_PLEASED, emoji_wechat.EMOJI_PLEASED }, [emoji_code.EMOJI_HEARTSHAPED] = { emoji_common.EMOJI_HEARTSHAPED, emoji_wechat.EMOJI_HEARTSHAPED }, [emoji_code.EMOJI_WRONGED] = { emoji_common.EMOJI_WRONGED, emoji_wechat.EMOJI_WRONGED }, [emoji_code.EMOJI_CRY] = { emoji_common.EMOJI_CRY, emoji_wechat.EMOJI_CRY }, [emoji_code.EMOJI_ARROGANT] = { emoji_common.EMOJI_ARROGANT, emoji_wechat.EMOJI_ARROGANT }, [emoji_code.EMOJI_ANGRY] = { emoji_common.EMOJI_ANGRY, emoji_wechat.EMOJI_ANGRY }, [emoji_code.EMOJI_WEEP] = { emoji_common.EMOJI_WEEP, emoji_wechat.EMOJI_WEEP }, [emoji_code.EMOJI_DIZZY] = { emoji_common.EMOJI_DIZZY, emoji_wechat.EMOJI_DIZZY }, } function is_emoji(str) return emoji_table[str] ~= nil end function is_emoji_unicode(str) return eu.emoji_list[str] ~= nil end function get_emoji_input_content_by_unicode(unicodeTitle, emoji_input_type) if emoji_input_type == si.emoji_input_type.UNICODE_UNIFIED then return eu.emoji_list[unicodeTitle] elseif emoji_input_type == si.emoji_input_type.UNICODE_SOFTBANK then return sbeu.emoji_list[unicodeTitle] end end function get_emoji_input_content(emoji_code) local app_name = si.get_editor_package_name() if app_name == si.app_package_name.APP_WECHAT then return emoji_table[emoji_code][2]; else return emoji_table[emoji_code][1]; end end function get_emoji_input_type() return si.get_setting_value(si.settings.CURRENT_EMOJI_INPUT_TYPE, si.settings_type.SETTING_INT) end function get_emoji_version() return si.get_setting_value(si.settings.EMOJI_VERSION, si.settings_type.SETTING_INT) end return P PK n5:Q5aa5assets/emojiArt.lua.pngUT n_n_n_ WГWГWГrequire "grid_symbol" local P = {} P._G = _G if _REQUIREDNAME == nil then emojiArt = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local gs = _G.grid_symbol local si = _G.smartinput -- any emoji art is loaded from related txt file when refreshing smiley. local emoji_art = { } local emojiArt_table = { emoji_art_fun = emoji_art, emoji_art_greeting = emoji_art, emoji_art_holiday = emoji_art, emoji_art_life = emoji_art, emoji_art_love = emoji_art, emoji_art_school = emoji_art, } function get_smiley_table() return gs.setup_emojiArt_table(emojiArt_table, "emoji_art_greeting") end return P PKk5:Q5assets/emoji_art_fun.txtUT  n_ n_ n_ w@TГw@TГw@TГVAN0˫GQXz*0E+0C%tcqxz}_5Rv2`?Ǣ#,* % hBy,eG%\XQ~QqXhC"&ٞx$A VfHr:=Sh8ivMy=M>wd:gC>,c]^C>ovyi[& 8/!OfY^ҵn, ?l3'ehm|BDx.h>(dp6O8>U٨yL[A/BbVIK _g^sx߆iUh14NR.7-P ;5!xDww>]1E{8R(R4(Y! bx_W2gdMAc5APasd#T5GjՄdQhumrz?'?#dhha3򏾘Vqi:iE3J+v~b#$F1!>#jAMIgvmѪbf?|"^ K0].AN@: `s͒,ojyDa'Ttk!".F: *Ux:|o0^ WWYVJZڀ+N=mz_PC3h _C`>3PK.ePKk5:Q5assets/emoji_art_life.txtUT  n_ n_ n_ w@TГw@TГw@TГWN0S+1I t,j+Ami4mS KOˠ  &%/>αb;N܉~=>c؍s{751oek)VsDF/=D3趖[BGY0:8_"YJ# 68 la`EO&B~fʜW@'(qx_֠J.o1}G,"z2qAR =U\X`P.wٹ!>2HI &I!5S"2hgJ.ѳт+[NiBmq,(sdvydM9Viڙax8JDDz;I*`{[ۚs#$+mpKpU?>+u?P&N=n׍3`FI=V^y+Wmz-T);_ޕ n#mjl#7 p6̀9j :8^٫!e3s{5]Q>$m'!G^ʨ491xڰl<5sN'/@7⥡FEɿS (JNG'SUZC*LEp+Y.V|gX0AcupO'M=d z t: " %ET)jxYFToLUaB-|p W<"6e2&e2&2I q& Efhƅ4*DZxIZaU$Vŭ4֦f YGN(E@Az9#dPKv$rPKk5:Q5assets/emoji_art_love.txtUT  n_ n_ n_ w@TГw@TГw@TГVn@+/@!ID4PtCщ8H8r?};;7kǻO~eϻkqkj2{6=ж>ۮoBC AE#v⾚OMУѿ xNV31 cLDS.1/xRl; ƅ OIMB%RX΍~}k.!nIrw OIMB蝚^\5SR>qrJW΂wSR>qޣMͿvr##gb"Ʋ66X1oa|xNV31 cLDS7KUa܄ n&[F-þx-#gb"Ʋ66X]> <'+șl VL8ACl0[5ӆ65[4$Y;=;5ĢɛzQsFs'pOdE91ʹA40uwa_4F!b,ih`j^ѣ@///uUNيv}LBX6iz>ޞVWPKaPKk5:Q5assets/emoji_art_school.txtUT  n_ n_ n_ w@TГw@TГw@TГVMN@޿S71lL4a I@~6 \WĻp)7oڙ|3S $QN·Fs1PYV(3d3z_M2{jF]j]8~x'hND$-KUTRQ.SSD$QȔpi8oZgv;B]BnR {dnMWL!ݘp@^ `S婰+~ӧ%6 |PBqH)MPIPAlQbt o0*#]YqfNpmPiPif).M֢`NaOZпy\L%Iѻ% 7D"Mܢ V43xv!BJ!W wlE )a+ =&K!Q35_LrVu 4Em+# Gz1Z&j;-RsoMzU?PKPK n5:Q(5assets/emoji_full.lua.pngUT n_n_n_ WГWГWГrequire "grid_symbol" local P = {} P._G = _G if _REQUIREDNAME == nil then emoji_full = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local gs = _G.grid_symbol local si = _G.smartinput local category_recent = { } local category_people = { } local category_nature = { } local category_objects = { } local category_places = { } local category_symbols = { } local emoji_table = { recent = category_recent, people = category_people, nature = category_nature, objects = category_objects, places = category_places, symbols = category_symbols, } function get_smiley_table() return gs.setup_emoji_table(emoji_table, "people") end return P PK n5:QGJMM5assets/emoji_sb_unicode.lua.pngUT n_n_n_ WГWГWГrequire "smartinput" local P = {} P._G = _G if _REQUIREDNAME == nil then emoji_sb_unicode = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local si = _G.smartinput emoji_list = { u2600_fe0f = si.u16char(0xE04A), u2601_fe0f = si.u16char(0xE049), u2614_fe0f = si.u16char(0xE04B), u26c4_fe0f = si.u16char(0xE048), u26a1_fe0f = si.u16char(0xE13D), u1f300 = si.u16char(0xE443), u1f302 = si.u16char(0xE43C), u1f303 = si.u16char(0xE44B), u1f304 = si.u16char(0xE04D), u1f305 = si.u16char(0xE449), u1f306 = si.u16char(0xE146), u1f307 = si.u16char(0xE44A), u1f308 = si.u16char(0xE44C), u26c5_fe0f = si.u16char(0xE04A) .. si.u16char(0xE049), u1f309 = si.u16char(0xE44B), u1f30a = si.u16char(0xE43E), u1f30c = si.u16char(0xE44B), u1f314 = si.u16char(0xE04C), u1f313 = si.u16char(0xE04C), u1f319 = si.u16char(0xE04C), u1f31b = si.u16char(0xE04C), u1f31f = si.u16char(0xE335), u1f550 = si.u16char(0xE024), u1f551 = si.u16char(0xE025), u1f552 = si.u16char(0xE026), u1f553 = si.u16char(0xE027), u1f554 = si.u16char(0xE028), u1f555 = si.u16char(0xE029), u1f556 = si.u16char(0xE02A), u1f557 = si.u16char(0xE02B), u1f558 = si.u16char(0xE02C), u1f559 = si.u16char(0xE02D), u1f55a = si.u16char(0xE02E), u1f55b = si.u16char(0xE02F), u23f0 = si.u16char(0xE02D), u2648_fe0f = si.u16char(0xE23F), u2649_fe0f = si.u16char(0xE240), u264a_fe0f = si.u16char(0xE241), u264b_fe0f = si.u16char(0xE242), u264c_fe0f = si.u16char(0xE243), u264d_fe0f = si.u16char(0xE244), u264e_fe0f = si.u16char(0xE245), u264f_fe0f = si.u16char(0xE246), u2650_fe0f = si.u16char(0xE247), u2651_fe0f = si.u16char(0xE248), u2652_fe0f = si.u16char(0xE249), u2653_fe0f = si.u16char(0xE24A), u26ce = si.u16char(0xE24B), u1f340 = si.u16char(0xE110), u1f337 = si.u16char(0xE304), u1f331 = si.u16char(0xE110), u1f341 = si.u16char(0xE118), u1f338 = si.u16char(0xE030), u1f339 = si.u16char(0xE032), u1f342 = si.u16char(0xE119), u1f343 = si.u16char(0xE447), u1f33a = si.u16char(0xE303), u1f33b = si.u16char(0xE305), u1f334 = si.u16char(0xE307), u1f335 = si.u16char(0xE308), u1f33e = si.u16char(0xE444), u1f33c = si.u16char(0xE305), u1f33f = si.u16char(0xE110), u1f34e = si.u16char(0xE345), u1f34a = si.u16char(0xE346), u1f353 = si.u16char(0xE347), u1f349 = si.u16char(0xE348), u1f345 = si.u16char(0xE349), u1f346 = si.u16char(0xE34A), u1f34f = si.u16char(0xE345), u1f440 = si.u16char(0xE419), u1f442 = si.u16char(0xE41B), u1f443 = si.u16char(0xE41A), u1f444 = si.u16char(0xE41C), u1f445 = si.u16char(0xE409), u1f484 = si.u16char(0xE31C), u1f485 = si.u16char(0xE31D), u1f486 = si.u16char(0xE31E), u1f487 = si.u16char(0xE31F), u1f488 = si.u16char(0xE320), u1f466 = si.u16char(0xE001), u1f467 = si.u16char(0xE002), u1f468 = si.u16char(0xE004), u1f469 = si.u16char(0xE005), u1f46b = si.u16char(0xE428), u1f46e = si.u16char(0xE152), u1f46f = si.u16char(0xE429), u1f471 = si.u16char(0xE515), u1f472 = si.u16char(0xE516), u1f473 = si.u16char(0xE517), u1f474 = si.u16char(0xE518), u1f475 = si.u16char(0xE519), u1f476 = si.u16char(0xE51A), u1f477 = si.u16char(0xE51B), u1f478 = si.u16char(0xE51C), u1f47b = si.u16char(0xE11B), u1f47c = si.u16char(0xE04E), u1f47d = si.u16char(0xE10C), u1f47e = si.u16char(0xE12B), u1f47f = si.u16char(0xE11A), u1f480 = si.u16char(0xE11C), u1f481 = si.u16char(0xE253), u1f482 = si.u16char(0xE51E), u1f483 = si.u16char(0xE51F), u1f40d = si.u16char(0xE52D), u1f40e = si.u16char(0xE134), u1f414 = si.u16char(0xE52E), u1f417 = si.u16char(0xE52F), u1f42b = si.u16char(0xE530), u1f418 = si.u16char(0xE526), u1f428 = si.u16char(0xE527), u1f412 = si.u16char(0xE528), u1f411 = si.u16char(0xE529), u1f419 = si.u16char(0xE10A), u1f41a = si.u16char(0xE441), u1f41b = si.u16char(0xE525), u1f420 = si.u16char(0xE522), u1f421 = si.u16char(0xE019), u1f424 = si.u16char(0xE523), u1f425 = si.u16char(0xE523), u1f426 = si.u16char(0xE521), u1f423 = si.u16char(0xE523), u1f427 = si.u16char(0xE055), u1f429 = si.u16char(0xE052), u1f41f = si.u16char(0xE019), u1f42c = si.u16char(0xE520), u1f42d = si.u16char(0xE053), u1f42f = si.u16char(0xE050), u1f431 = si.u16char(0xE04F), u1f433 = si.u16char(0xE054), u1f434 = si.u16char(0xE01A), u1f435 = si.u16char(0xE109), u1f436 = si.u16char(0xE052), u1f437 = si.u16char(0xE10B), u1f43b = si.u16char(0xE051), u1f439 = si.u16char(0xE524), u1f43a = si.u16char(0xE52A), u1f42e = si.u16char(0xE52B), u1f430 = si.u16char(0xE52C), u1f438 = si.u16char(0xE531), u1f43e = si.u16char(0xE536), u1f43d = si.u16char(0xE10B), u1f620 = si.u16char(0xE059), u1f629 = si.u16char(0xE403), u1f632 = si.u16char(0xE410), u1f61e = si.u16char(0xE058), u1f635 = si.u16char(0xE406), u1f630 = si.u16char(0xE40F), u1f612 = si.u16char(0xE40E), u1f60d = si.u16char(0xE106), u1f624 = si.u16char(0xE404), u1f61c = si.u16char(0xE105), u1f61d = si.u16char(0xE409), u1f60b = si.u16char(0xE056), u1f618 = si.u16char(0xE418), u1f61a = si.u16char(0xE417), u1f637 = si.u16char(0xE40C), u1f633 = si.u16char(0xE40D), u1f603 = si.u16char(0xE057), u1f605 = si.u16char(0xE415) .. si.u16char(0xE331), u1f606 = si.u16char(0xE40A), u1f601 = si.u16char(0xE404), u1f602 = si.u16char(0xE412), u1f60a = si.u16char(0xE056), u263a_fe0f = si.u16char(0xE414), u1f604 = si.u16char(0xE415), u1f622 = si.u16char(0xE413), u1f62d = si.u16char(0xE411), u1f628 = si.u16char(0xE40B), u1f623 = si.u16char(0xE406), u1f621 = si.u16char(0xE416), u1f60c = si.u16char(0xE40A), u1f616 = si.u16char(0xE407), u1f614 = si.u16char(0xE403), u1f631 = si.u16char(0xE107), u1f62a = si.u16char(0xE408), u1f60f = si.u16char(0xE402), u1f613 = si.u16char(0xE108), u1f625 = si.u16char(0xE401), u1f62b = si.u16char(0xE406), u1f609 = si.u16char(0xE405), u1f63a = si.u16char(0xE057), u1f638 = si.u16char(0xE404), u1f639 = si.u16char(0xE412), u1f63d = si.u16char(0xE418), u1f63b = si.u16char(0xE106), u1f63f = si.u16char(0xE413), u1f63e = si.u16char(0xE416), u1f63c = si.u16char(0xE404), u1f640 = si.u16char(0xE403), u1f645 = si.u16char(0xE423), u1f646 = si.u16char(0xE424), u1f647 = si.u16char(0xE426), u1f64b = si.u16char(0xE012), u1f64c = si.u16char(0xE427), u1f64d = si.u16char(0xE403), u1f64e = si.u16char(0xE416), u1f64f = si.u16char(0xE41D), u1f3e0 = si.u16char(0xE036), u1f3e1 = si.u16char(0xE036), u1f3e2 = si.u16char(0xE038), u1f3e3 = si.u16char(0xE153), u1f3e5 = si.u16char(0xE155), u1f3e6 = si.u16char(0xE14D), u1f3e7 = si.u16char(0xE154), u1f3e8 = si.u16char(0xE158), u1f3e9 = si.u16char(0xE501), u1f3ea = si.u16char(0xE156), u1f3eb = si.u16char(0xE157), u26ea_fe0f = si.u16char(0xE037), u26f2_fe0f = si.u16char(0xE121), u1f3ec = si.u16char(0xE504), u1f3ef = si.u16char(0xE505), u1f3f0 = si.u16char(0xE506), u1f3ed = si.u16char(0xE508), u2693_fe0f = si.u16char(0xE202), u1f3ee = si.u16char(0xE30B), u1f5fb = si.u16char(0xE03B), u1f5fc = si.u16char(0xE509), u1f5fd = si.u16char(0xE51D), u1f45e = si.u16char(0xE007), u1f45f = si.u16char(0xE007), u1f460 = si.u16char(0xE13E), u1f461 = si.u16char(0xE31A), u1f462 = si.u16char(0xE31B), u1f463 = si.u16char(0xE536), u1f455 = si.u16char(0xE006), u1f451 = si.u16char(0xE10E), u1f454 = si.u16char(0xE302), u1f452 = si.u16char(0xE318), u1f457 = si.u16char(0xE319), u1f458 = si.u16char(0xE321), u1f459 = si.u16char(0xE322), u1f45a = si.u16char(0xE006), u1f45c = si.u16char(0xE323), u1f4b0 = si.u16char(0xE12F), u1f4b1 = si.u16char(0xE149), u1f4b9 = si.u16char(0xE14A), u1f4b2 = si.u16char(0xE12F), u1f4b5 = si.u16char(0xE12F), u1f1e8_1f1f3 = si.u16char(0xE513), u1f1e9_1f1ea = si.u16char(0xE50E), u1f1ea_1f1f8 = si.u16char(0xE511), u1f1eb_1f1f7 = si.u16char(0xE50D), u1f1ec_1f1e7 = si.u16char(0xE510), u1f1ee_1f1f9 = si.u16char(0xE50F), u1f1ef_1f1f5 = si.u16char(0xE50B), u1f1f0_1f1f7 = si.u16char(0xE514), u1f1f7_1f1fa = si.u16char(0xE512), u1f1fa_1f1f8 = si.u16char(0xE50C), u1f525 = si.u16char(0xE11D), u1f528 = si.u16char(0xE116), u1f52b = si.u16char(0xE113), u1f52e = si.u16char(0xE23E), u1f52f = si.u16char(0xE23E), u1f530 = si.u16char(0xE209), u1f531 = si.u16char(0xE031), u1f489 = si.u16char(0xE13B), u1f48a = si.u16char(0xE30F), u1f170 = si.u16char(0xE532), u1f171 = si.u16char(0xE533), u1f18e = si.u16char(0xE534), u1f17e = si.u16char(0xE535), u1f380 = si.u16char(0xE314), u1f381 = si.u16char(0xE112), u1f382 = si.u16char(0xE34B), u1f384 = si.u16char(0xE033), u1f385 = si.u16char(0xE448), u1f38c = si.u16char(0xE143), u1f386 = si.u16char(0xE117), u1f388 = si.u16char(0xE310), u1f389 = si.u16char(0xE312), u1f38d = si.u16char(0xE436), u1f38e = si.u16char(0xE438), u1f393 = si.u16char(0xE439), u1f392 = si.u16char(0xE43A), u1f38f = si.u16char(0xE43B), u1f387 = si.u16char(0xE440), u1f390 = si.u16char(0xE442), u1f383 = si.u16char(0xE445), u1f391 = si.u16char(0xE446), u260e_fe0f = si.u16char(0xE009), u1f4de = si.u16char(0xE009), u1f4f1 = si.u16char(0xE00A), u1f4f2 = si.u16char(0xE104), u1f4dd = si.u16char(0xE301), u1f4e0 = si.u16char(0xE00B), u2709_fe0f = si.u16char(0xE103), u1f4e8 = si.u16char(0xE103), u1f4e9 = si.u16char(0xE103), u1f4ea = si.u16char(0xE101), u1f4eb = si.u16char(0xE101), u1f4ee = si.u16char(0xE102), u1f4e2 = si.u16char(0xE142), u1f4e3 = si.u16char(0xE317), u1f4e1 = si.u16char(0xE14B), u1f4e6 = si.u16char(0xE112), u1f4e7 = si.u16char(0xE103), u1f4ba = si.u16char(0xE11F), u1f4bb = si.u16char(0xE00C), u270f_fe0f = si.u16char(0xE301), u1f4bc = si.u16char(0xE11E), u1f4bd = si.u16char(0xE316), u1f4be = si.u16char(0xE316), u1f4bf = si.u16char(0xE126), u1f4c0 = si.u16char(0xE127), u2702_fe0f = si.u16char(0xE313), u1f4c3 = si.u16char(0xE301), u1f4c4 = si.u16char(0xE301), u1f4d3 = si.u16char(0xE148), u1f4d6 = si.u16char(0xE148), u1f4d4 = si.u16char(0xE148), u1f4d5 = si.u16char(0xE148), u1f4d7 = si.u16char(0xE148), u1f4d8 = si.u16char(0xE148), u1f4d9 = si.u16char(0xE148), u1f4da = si.u16char(0xE148), u1f4cb = si.u16char(0xE301), u1f4ca = si.u16char(0xE14A), u1f4c8 = si.u16char(0xE14A), u1f4c7 = si.u16char(0xE148), u1f4d2 = si.u16char(0xE148), u1f4d1 = si.u16char(0xE301), u26be_fe0f = si.u16char(0xE016), u26f3_fe0f = si.u16char(0xE014), u1f3be = si.u16char(0xE015), u26bd_fe0f = si.u16char(0xE018), u1f3bf = si.u16char(0xE013), u1f3c0 = si.u16char(0xE42A), u1f3c1 = si.u16char(0xE132), u1f3c3 = si.u16char(0xE115), u1f3c4 = si.u16char(0xE017), u1f3c6 = si.u16char(0xE131), u1f3c8 = si.u16char(0xE42B), u1f3ca = si.u16char(0xE42D), u1f683 = si.u16char(0xE01E), u1f687 = si.u16char(0xE434), u24c2_fe0f = si.u16char(0xE434), u1f684 = si.u16char(0xE435), u1f685 = si.u16char(0xE01F), u1f697 = si.u16char(0xE01B), u1f699 = si.u16char(0xE42E), u1f68c = si.u16char(0xE159), u1f68f = si.u16char(0xE150), u1f6a2 = si.u16char(0xE202), u2708_fe0f = si.u16char(0xE01D), u26f5_fe0f = si.u16char(0xE01C), u1f689 = si.u16char(0xE039), u1f680 = si.u16char(0xE10D), u1f6a4 = si.u16char(0xE135), u1f695 = si.u16char(0xE15A), u1f69a = si.u16char(0xE42F), u1f692 = si.u16char(0xE430), u1f691 = si.u16char(0xE431), u1f693 = si.u16char(0xE432), u26fd_fe0f = si.u16char(0xE03A), u1f17f_fe0f = si.u16char(0xE14F), u1f6a5 = si.u16char(0xE14E), u1f6a7 = si.u16char(0xE137), u1f6a8 = si.u16char(0xE432), u2668_fe0f = si.u16char(0xE123), u26fa_fe0f = si.u16char(0xE122), u1f3a1 = si.u16char(0xE124), u1f3a2 = si.u16char(0xE433), u1f3a3 = si.u16char(0xE019), u1f3a4 = si.u16char(0xE03C), u1f3a5 = si.u16char(0xE03D), u1f3a6 = si.u16char(0xE507), u1f3a7 = si.u16char(0xE30A), u1f3a8 = si.u16char(0xE502), u1f3a9 = si.u16char(0xE503), u1f3ab = si.u16char(0xE125), u1f3ac = si.u16char(0xE324), u1f3ad = si.u16char(0xE503), u1f004_fe0f = si.u16char(0xE12D), u1f3af = si.u16char(0xE130), u1f3b0 = si.u16char(0xE133), u1f3b1 = si.u16char(0xE42C), u1f3b5 = si.u16char(0xE03E), u1f3b6 = si.u16char(0xE326), u1f3b7 = si.u16char(0xE040), u1f3b8 = si.u16char(0xE041), u1f3ba = si.u16char(0xE042), u1f3bc = si.u16char(0xE326), u303d_fe0f = si.u16char(0xE12C), u1f4f7 = si.u16char(0xE008), u1f4f9 = si.u16char(0xE03D), u1f4fa = si.u16char(0xE12A), u1f4fb = si.u16char(0xE128), u1f4fc = si.u16char(0xE129), u1f48b = si.u16char(0xE003), u1f48c = si.u16char(0xE103) .. si.u16char(0xE328), u1f48d = si.u16char(0xE034), u1f48e = si.u16char(0xE035), u1f48f = si.u16char(0xE111), u1f490 = si.u16char(0xE306), u1f491 = si.u16char(0xE425), u1f492 = si.u16char(0xE43D), u1f51e = si.u16char(0xE207), u00a9 = si.u16char(0xE24E), u00ae = si.u16char(0xE24F), u2122 = si.u16char(0xE537), u0023_20e3_fe0f = si.u16char(0xE210), u0031_20e3_fe0f = si.u16char(0xE21C), u0032_20e3_fe0f = si.u16char(0xE21D), u0033_20e3_fe0f = si.u16char(0xE21E), u0034_20e3_fe0f = si.u16char(0xE21F), u0035_20e3_fe0f = si.u16char(0xE220), u0036_20e3_fe0f = si.u16char(0xE221), u0037_20e3_fe0f = si.u16char(0xE222), u0038_20e3_fe0f = si.u16char(0xE223), u0039_20e3_fe0f = si.u16char(0xE224), u0030_20e3_fe0f = si.u16char(0xE225), u1f4f6 = si.u16char(0xE20B), u1f4f3 = si.u16char(0xE250), u1f4f4 = si.u16char(0xE251), u1f354 = si.u16char(0xE120), u1f359 = si.u16char(0xE342), u1f370 = si.u16char(0xE046), u1f35c = si.u16char(0xE340), u1f35e = si.u16char(0xE339), u1f373 = si.u16char(0xE147), u1f366 = si.u16char(0xE33A), u1f35f = si.u16char(0xE33B), u1f361 = si.u16char(0xE33C), u1f358 = si.u16char(0xE33D), u1f35a = si.u16char(0xE33E), u1f35d = si.u16char(0xE33F), u1f35b = si.u16char(0xE341), u1f362 = si.u16char(0xE343), u1f363 = si.u16char(0xE344), u1f371 = si.u16char(0xE34C), u1f372 = si.u16char(0xE34D), u1f367 = si.u16char(0xE43F), u1f374 = si.u16char(0xE043), u2615_fe0f = si.u16char(0xE045), u1f378 = si.u16char(0xE044), u1f37a = si.u16char(0xE047), u1f375 = si.u16char(0xE338), u1f376 = si.u16char(0xE30B), u1f377 = si.u16char(0xE044), u1f37b = si.u16char(0xE30C), u1f379 = si.u16char(0xE044), u2197_fe0f = si.u16char(0xE236), u2198_fe0f = si.u16char(0xE238), u2196_fe0f = si.u16char(0xE237), u2199_fe0f = si.u16char(0xE239), u2934_fe0f = si.u16char(0xE236), u2935_fe0f = si.u16char(0xE238), u2b06_fe0f = si.u16char(0xE232), u2b07_fe0f = si.u16char(0xE233), u27a1_fe0f = si.u16char(0xE234), u2b05_fe0f = si.u16char(0xE235), u25b6_fe0f = si.u16char(0xE23A), u25c0_fe0f = si.u16char(0xE23B), u23e9 = si.u16char(0xE23C), u23ea = si.u16char(0xE23D), u2b55_fe0f = si.u16char(0xE332), u274c = si.u16char(0xE333), u274e = si.u16char(0xE333), u2757_fe0f = si.u16char(0xE021), u2753 = si.u16char(0xE020), u2754 = si.u16char(0xE336), u2755 = si.u16char(0xE337), u27bf = si.u16char(0xE211), u2764_fe0f = si.u16char(0xE022), u1f493 = si.u16char(0xE327), u1f494 = si.u16char(0xE023), u1f495 = si.u16char(0xE327), u1f496 = si.u16char(0xE327), u1f497 = si.u16char(0xE328), u1f498 = si.u16char(0xE329), u1f499 = si.u16char(0xE32A), u1f49a = si.u16char(0xE32B), u1f49b = si.u16char(0xE32C), u1f49c = si.u16char(0xE32D), u1f49d = si.u16char(0xE437), u1f49e = si.u16char(0xE327), u1f49f = si.u16char(0xE204), u2665_fe0f = si.u16char(0xE20C), u2660_fe0f = si.u16char(0xE20E), u2666_fe0f = si.u16char(0xE20D), u2663_fe0f = si.u16char(0xE20F), u1f6ac = si.u16char(0xE30E), u1f6ad = si.u16char(0xE208), u267f_fe0f = si.u16char(0xE20A), u26a0_fe0f = si.u16char(0xE252), u26d4_fe0f = si.u16char(0xE137), u1f6b2 = si.u16char(0xE136), u1f6b6 = si.u16char(0xE201), u1f6b9 = si.u16char(0xE138), u1f6ba = si.u16char(0xE139), u1f6c0 = si.u16char(0xE13F), u1f6bb = si.u16char(0xE151), u1f6bd = si.u16char(0xE140), u1f6be = si.u16char(0xE309), u1f6bc = si.u16char(0xE13A), u1f192 = si.u16char(0xE214), u1f194 = si.u16char(0xE229), u1f195 = si.u16char(0xE212), u1f197 = si.u16char(0xE24D), u1f199 = si.u16char(0xE213), u1f19a = si.u16char(0xE12E), u1f201 = si.u16char(0xE203), u1f202 = si.u16char(0xE228), u1f233 = si.u16char(0xE22B), u1f235 = si.u16char(0xE22A), u1f236 = si.u16char(0xE215), u1f21a_fe0f = si.u16char(0xE216), u1f237 = si.u16char(0xE217), u1f238 = si.u16char(0xE218), u1f239 = si.u16char(0xE227), u1f22f_fe0f = si.u16char(0xE22C), u1f23a = si.u16char(0xE22D), u3299_fe0f = si.u16char(0xE315), u3297_fe0f = si.u16char(0xE30D), u1f250 = si.u16char(0xE226), u2716_fe0f = si.u16char(0xE333), u1f4a1 = si.u16char(0xE10F), u1f4a2 = si.u16char(0xE334), u1f4a3 = si.u16char(0xE311), u1f4a4 = si.u16char(0xE13C), u1f4a6 = si.u16char(0xE331), u1f4a7 = si.u16char(0xE331), u1f4a8 = si.u16char(0xE330), u1f4a9 = si.u16char(0xE05A), u1f4aa = si.u16char(0xE14C), u1f4ab = si.u16char(0xE407), u2728 = si.u16char(0xE32E), u2734_fe0f = si.u16char(0xE205), u2733_fe0f = si.u16char(0xE206), u26aa_fe0f = si.u16char(0xE219), u26ab_fe0f = si.u16char(0xE219), u1f534 = si.u16char(0xE219), u1f535 = si.u16char(0xE21A), u1f532 = si.u16char(0xE21A), u1f533 = si.u16char(0xE21B), u2b50_fe0f = si.u16char(0xE32F), u2b1c_fe0f = si.u16char(0xE21B), u2b1b_fe0f = si.u16char(0xE21A), u25ab_fe0f = si.u16char(0xE21B), u25fd_fe0f = si.u16char(0xE21B), u25fe_fe0f = si.u16char(0xE21A), u25fb_fe0f = si.u16char(0xE21B), u25fc_fe0f = si.u16char(0xE21A), u1f536 = si.u16char(0xE21B), u1f537 = si.u16char(0xE21B), u1f538 = si.u16char(0xE21B), u1f539 = si.u16char(0xE21B), u2747_fe0f = si.u16char(0xE32E), u1f50a = si.u16char(0xE141), u1f50d = si.u16char(0xE114), u1f50e = si.u16char(0xE114), u1f512 = si.u16char(0xE144), u1f513 = si.u16char(0xE145), u1f50f = si.u16char(0xE144), u1f510 = si.u16char(0xE144), u1f511 = si.u16char(0xE03F), u1f514 = si.u16char(0xE325), u1f519 = si.u16char(0xE235), u1f51d = si.u16char(0xE24C), u270a = si.u16char(0xE010), u270b = si.u16char(0xE012), u270c_fe0f = si.u16char(0xE011), u1f44a = si.u16char(0xE00D), u1f44d = si.u16char(0xE00E), u261d_fe0f = si.u16char(0xE00F), u1f446 = si.u16char(0xE22E), u1f447 = si.u16char(0xE22F), u1f448 = si.u16char(0xE230), u1f449 = si.u16char(0xE231), u1f44b = si.u16char(0xE41E), u1f44f = si.u16char(0xE41F), u1f44c = si.u16char(0xE420), u1f44e = si.u16char(0xE421), u1f450 = si.u16char(0xE422), } PK n5:Q[5assets/emoji_selected.lua.pngUT n_n_n_ WГWГWГrequire "grid_symbol" local P = {} P._G = _G if _REQUIREDNAME == nil then emoji_selected = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local gs = _G.grid_symbol local si = _G.smartinput local category_recent = { } local category_people = { } local category_nature = { } local category_objects = { } local category_places = { } local category_symbols = { } local emoji_table = { recent = category_recent, people = category_people, nature = category_nature, objects = category_objects, places = category_places, symbols = category_symbols, } function get_smiley_table() return gs.setup_emoji_table(emoji_table, "people") end return P PK n5:QD"5assets/emoji_unicode.lua.pngUT n_n_n_ WГWГWГrequire "smartinput" require "emoji_unicode_since_6" require "emoji_unicode_pre_6" local P = {} P._G = _G if _REQUIREDNAME == nil then emoji_unicode = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local si = _G.smartinput local emoji_unicode_pre_6 = _G.emoji_unicode_pre_6 local emoji_unicode_since_6 = _G.emoji_unicode_since_6 local system_verion_since_6 = si.is_system_verion_since_6() emoji_list = (system_verion_since_6 and emoji_unicode_since_6.emoji_list) or emoji_unicode_pre_6.emoji_list PK n5:Q("5assets/emoji_unicode_pre_6.lua.pngUT n_n_n_ WГWГWГrequire "smartinput" local P = {} P._G = _G if _REQUIREDNAME == nil then emoji_unicode_pre_6 = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local si = _G.smartinput emoji_list = { u1f37c = si.u16char(0xd83c) .. si.u16char(0xdf7c), u1f312 = si.u16char(0xd83c) .. si.u16char(0xdf12), u1f4c9 = si.u16char(0xd83d) .. si.u16char(0xdcc9), u1f64e = si.u16char(0xd83d) .. si.u16char(0xde4e), u1f194 = si.u16char(0xd83c) .. si.u16char(0xdd94), u26bd_fe0f = si.u16char(0x26bd), u1f471 = si.u16char(0xd83d) .. si.u16char(0xdc71), u1f3b0 = si.u16char(0xd83c) .. si.u16char(0xdfb0), u1f566 = si.u16char(0xd83d) .. si.u16char(0xdd66), u1f4f4 = si.u16char(0xd83d) .. si.u16char(0xdcf4), u2649_fe0f = si.u16char(0x2649), u263a_fe0f = si.u16char(0x263a), u1f5ff = si.u16char(0xd83d) .. si.u16char(0xddff), u1f4b0 = si.u16char(0xd83d) .. si.u16char(0xdcb0), u1f408 = si.u16char(0xd83d) .. si.u16char(0xdc08), u0038 = si.u16char(0x0038), u1f1ec_1f1e7 = si.u16char(0xd83c) .. si.u16char(0xddec) .. si.u16char(0xd83c) .. si.u16char(0xdde7), u1f3f0 = si.u16char(0xd83c) .. si.u16char(0xdff0), u2196_fe0f = si.u16char(0x2196), u23ea = si.u16char(0x23ea), u1f196 = si.u16char(0xd83c) .. si.u16char(0xdd96), u1f646 = si.u16char(0xd83d) .. si.u16char(0xde46), u1f604 = si.u16char(0xd83d) .. si.u16char(0xde04), u1f4ca = si.u16char(0xd83d) .. si.u16char(0xdcca), u1f391 = si.u16char(0xd83c) .. si.u16char(0xdf91), u231a_fe0f = si.u16char(0x231a), u1f51d = si.u16char(0xd83d) .. si.u16char(0xdd1d), u1f4f2 = si.u16char(0xd83d) .. si.u16char(0xdcf2), u1f198 = si.u16char(0xd83c) .. si.u16char(0xdd98), u1f483 = si.u16char(0xd83d) .. si.u16char(0xdc83), u1f62e = si.u16char(0xd83d) .. si.u16char(0xde2e), u1f523 = si.u16char(0xd83d) .. si.u16char(0xdd23), u1f4c6 = si.u16char(0xd83d) .. si.u16char(0xdcc6), u1f63f = si.u16char(0xd83d) .. si.u16char(0xde3f), u1f3b2 = si.u16char(0xd83c) .. si.u16char(0xdfb2), u1f417 = si.u16char(0xd83d) .. si.u16char(0xdc17), u1f430 = si.u16char(0xd83d) .. si.u16char(0xdc30), u1f35c = si.u16char(0xd83c) .. si.u16char(0xdf5c), u1f501 = si.u16char(0xd83d) .. si.u16char(0xdd01), u1f47f = si.u16char(0xd83d) .. si.u16char(0xdc7f), u1f52a = si.u16char(0xd83d) .. si.u16char(0xdd2a), u1f51b = si.u16char(0xd83d) .. si.u16char(0xdd1b), u1f605 = si.u16char(0xd83d) .. si.u16char(0xde05), u1f463 = si.u16char(0xd83d) .. si.u16char(0xdc63), u1f61d = si.u16char(0xd83d) .. si.u16char(0xde1d), u1f4e2 = si.u16char(0xd83d) .. si.u16char(0xdce2), u1f48b = si.u16char(0xd83d) .. si.u16char(0xdc8b), u26fd_fe0f = si.u16char(0x26fd), u1f401 = si.u16char(0xd83d) .. si.u16char(0xdc01), u26be_fe0f = si.u16char(0x26be), u0035 = si.u16char(0x0035), u1f22f = si.u16char(0xd83c) .. si.u16char(0xde2f), u1f320 = si.u16char(0xd83c) .. si.u16char(0xdf20), u1f614 = si.u16char(0xd83d) .. si.u16char(0xde14), u2199_fe0f = si.u16char(0x2199), u1f3b4 = si.u16char(0xd83c) .. si.u16char(0xdfb4), u1f376 = si.u16char(0xd83c) .. si.u16char(0xdf76), u1f3ad = si.u16char(0xd83c) .. si.u16char(0xdfad), u1f3ae = si.u16char(0xd83c) .. si.u16char(0xdfae), u1f384 = si.u16char(0xd83c) .. si.u16char(0xdf84), u27b0 = si.u16char(0x27b0), u3299_fe0f = si.u16char(0x3299), u1f60d = si.u16char(0xd83d) .. si.u16char(0xde0d), u1f685 = si.u16char(0xd83d) .. si.u16char(0xde85), u1f482 = si.u16char(0xd83d) .. si.u16char(0xdc82), u1f630 = si.u16char(0xd83d) .. si.u16char(0xde30), u1f4a1 = si.u16char(0xd83d) .. si.u16char(0xdca1), u1f316 = si.u16char(0xd83c) .. si.u16char(0xdf16), u1f447 = si.u16char(0xd83d) .. si.u16char(0xdc47), u25fc_fe0f = si.u16char(0x25fc), u1f48e = si.u16char(0xd83d) .. si.u16char(0xdc8e), u1f478 = si.u16char(0xd83d) .. si.u16char(0xdc78), u1f437 = si.u16char(0xd83d) .. si.u16char(0xdc37), u1f4b3 = si.u16char(0xd83d) .. si.u16char(0xdcb3), u2747_fe0f = si.u16char(0x2747), u1f6c3 = si.u16char(0xd83d) .. si.u16char(0xdec3), u1f31b = si.u16char(0xd83c) .. si.u16char(0xdf1b), u25ab_fe0f = si.u16char(0x25ab), u1f554 = si.u16char(0xd83d) .. si.u16char(0xdd54), u1f30f = si.u16char(0xd83c) .. si.u16char(0xdf0f), u1f446 = si.u16char(0xd83d) .. si.u16char(0xdc46), u1f4b7 = si.u16char(0xd83d) .. si.u16char(0xdcb7), u1f4d3 = si.u16char(0xd83d) .. si.u16char(0xdcd3), u1f64b = si.u16char(0xd83d) .. si.u16char(0xde4b), u1f616 = si.u16char(0xd83d) .. si.u16char(0xde16), u1f427 = si.u16char(0xd83d) .. si.u16char(0xdc27), u2600_fe0f = si.u16char(0x2600), u1f4e3 = si.u16char(0xd83d) .. si.u16char(0xdce3), u1f638 = si.u16char(0xd83d) .. si.u16char(0xde38), u1f53b = si.u16char(0xd83d) .. si.u16char(0xdd3b), u1f557 = si.u16char(0xd83d) .. si.u16char(0xdd57), u1f624 = si.u16char(0xd83d) .. si.u16char(0xde24), u1f6ac = si.u16char(0xd83d) .. si.u16char(0xdeac), u1f68d = si.u16char(0xd83d) .. si.u16char(0xde8d), u1f5fc = si.u16char(0xd83d) .. si.u16char(0xddfc), u270b = si.u16char(0x270b), u2795 = si.u16char(0x2795), u1f692 = si.u16char(0xd83d) .. si.u16char(0xde92), u1f3aa = si.u16char(0xd83c) .. si.u16char(0xdfaa), u1f3b3 = si.u16char(0xd83c) .. si.u16char(0xdfb3), u1f4bf = si.u16char(0xd83d) .. si.u16char(0xdcbf), u1f4af = si.u16char(0xd83d) .. si.u16char(0xdcaf), u1f477 = si.u16char(0xd83d) .. si.u16char(0xdc77), u261d_fe0f = si.u16char(0x261d), u1f350 = si.u16char(0xd83c) .. si.u16char(0xdf50), u2b50_fe0f = si.u16char(0x2b50), u1f6c4 = si.u16char(0xd83d) .. si.u16char(0xdec4), u1f378 = si.u16char(0xd83c) .. si.u16char(0xdf78), u2652_fe0f = si.u16char(0x2652), u1f4e5 = si.u16char(0xd83d) .. si.u16char(0xdce5), u1f4ea = si.u16char(0xd83d) .. si.u16char(0xdcea), u1f621 = si.u16char(0xd83d) .. si.u16char(0xde21), u1f481 = si.u16char(0xd83d) .. si.u16char(0xdc81), u1f35d = si.u16char(0xd83c) .. si.u16char(0xdf5d), u1f420 = si.u16char(0xd83d) .. si.u16char(0xdc20), u1f306 = si.u16char(0xd83c) .. si.u16char(0xdf06), u1f47d = si.u16char(0xd83d) .. si.u16char(0xdc7d), u1f5fe = si.u16char(0xd83d) .. si.u16char(0xddfe), u23eb = si.u16char(0x23eb), u1f331 = si.u16char(0xd83c) .. si.u16char(0xdf31), u2194_fe0f = si.u16char(0x2194), u27a1_fe0f = si.u16char(0x27a1), u1f41a = si.u16char(0xd83d) .. si.u16char(0xdc1a), u1f487 = si.u16char(0xd83d) .. si.u16char(0xdc87), u1f309 = si.u16char(0xd83c) .. si.u16char(0xdf09), u1f55e = si.u16char(0xd83d) .. si.u16char(0xdd5e), u1f3c8 = si.u16char(0xd83c) .. si.u16char(0xdfc8), u1f4e6 = si.u16char(0xd83d) .. si.u16char(0xdce6), u1f4df = si.u16char(0xd83d) .. si.u16char(0xdcdf), u1f4a7 = si.u16char(0xd83d) .. si.u16char(0xdca7), u1f1eb_1f1f7 = si.u16char(0xd83c) .. si.u16char(0xddeb) .. si.u16char(0xd83c) .. si.u16char(0xddf7), u1f4c2 = si.u16char(0xd83d) .. si.u16char(0xdcc2), u1f609 = si.u16char(0xd83d) .. si.u16char(0xde09), u2611_fe0f = si.u16char(0x2611), u1f375 = si.u16char(0xd83c) .. si.u16char(0xdf75), u1f4cd = si.u16char(0xd83d) .. si.u16char(0xdccd), u2660_fe0f = si.u16char(0x2660), u1f416 = si.u16char(0xd83d) .. si.u16char(0xdc16), u1f429 = si.u16char(0xd83d) .. si.u16char(0xdc29), u1f38e = si.u16char(0xd83c) .. si.u16char(0xdf8e), u1f41b = si.u16char(0xd83d) .. si.u16char(0xdc1b), u1f456 = si.u16char(0xd83d) .. si.u16char(0xdc56), u1f4d5 = si.u16char(0xd83d) .. si.u16char(0xdcd5), u1f4db = si.u16char(0xd83d) .. si.u16char(0xdcdb), u1f170 = si.u16char(0xd83c) .. si.u16char(0xdd70), u1f377 = si.u16char(0xd83c) .. si.u16char(0xdf77), u1f473 = si.u16char(0xd83d) .. si.u16char(0xdc73), u1f3a4 = si.u16char(0xd83c) .. si.u16char(0xdfa4), u1f457 = si.u16char(0xd83d) .. si.u16char(0xdc57), u1f5fd = si.u16char(0xd83d) .. si.u16char(0xddfd), u1f442 = si.u16char(0xd83d) .. si.u16char(0xdc42), u1f61b = si.u16char(0xd83d) .. si.u16char(0xde1b), u1f3e6 = si.u16char(0xd83c) .. si.u16char(0xdfe6), u1f4d7 = si.u16char(0xd83d) .. si.u16char(0xdcd7), u1f45c = si.u16char(0xd83d) .. si.u16char(0xdc5c), u1f538 = si.u16char(0xd83d) .. si.u16char(0xdd38), u1f33b = si.u16char(0xd83c) .. si.u16char(0xdf3b), u26f3_fe0f = si.u16char(0x26f3), u1f4fa = si.u16char(0xd83d) .. si.u16char(0xdcfa), u1f4c0 = si.u16char(0xd83d) .. si.u16char(0xdcc0), u1f40f = si.u16char(0xd83d) .. si.u16char(0xdc0f), u1f4a9 = si.u16char(0xd83d) .. si.u16char(0xdca9), u1f4a5 = si.u16char(0xd83d) .. si.u16char(0xdca5), u1f640 = si.u16char(0xd83d) .. si.u16char(0xde40), u1f388 = si.u16char(0xd83c) .. si.u16char(0xdf88), u1f528 = si.u16char(0xd83d) .. si.u16char(0xdd28), u1f38d = si.u16char(0xd83c) .. si.u16char(0xdf8d), u0033 = si.u16char(0x0033), u1f512 = si.u16char(0xd83d) .. si.u16char(0xdd12), u1f6a0 = si.u16char(0xd83d) .. si.u16char(0xdea0), u1f43b = si.u16char(0xd83d) .. si.u16char(0xdc3b), u1f518 = si.u16char(0xd83d) .. si.u16char(0xdd18), u1f629 = si.u16char(0xd83d) .. si.u16char(0xde29), u1f693 = si.u16char(0xd83d) .. si.u16char(0xde93), u1f607 = si.u16char(0xd83d) .. si.u16char(0xde07), u1f31a = si.u16char(0xd83c) .. si.u16char(0xdf1a), u3297_fe0f = si.u16char(0x3297), u0036_fe0f_20e3 = si.u16char(0x0036) .. si.u16char(0x20e3), u1f1e8_1f1f3 = si.u16char(0xd83c) .. si.u16char(0xdde8) .. si.u16char(0xd83c) .. si.u16char(0xddf3), u1f432 = si.u16char(0xd83d) .. si.u16char(0xdc32), u1f34e = si.u16char(0xd83c) .. si.u16char(0xdf4e), u23ec = si.u16char(0x23ec), u1f6be = si.u16char(0xd83d) .. si.u16char(0xdebe), u1f6a8 = si.u16char(0xd83d) .. si.u16char(0xdea8), u1f60e = si.u16char(0xd83d) .. si.u16char(0xde0e), u1f470 = si.u16char(0xd83d) .. si.u16char(0xdc70), u1f491 = si.u16char(0xd83d) .. si.u16char(0xdc91), u1f68a = si.u16char(0xd83d) .. si.u16char(0xde8a), u1f191 = si.u16char(0xd83c) .. si.u16char(0xdd91), u1f6b5 = si.u16char(0xd83d) .. si.u16char(0xdeb5), u1f232 = si.u16char(0xd83c) .. si.u16char(0xde32), u1f60b = si.u16char(0xd83d) .. si.u16char(0xde0b), u2197_fe0f = si.u16char(0x2197), u1f64d = si.u16char(0xd83d) .. si.u16char(0xde4d), u1f462 = si.u16char(0xd83d) .. si.u16char(0xdc62), u1f31e = si.u16char(0xd83c) .. si.u16char(0xdf1e), u1f4c1 = si.u16char(0xd83d) .. si.u16char(0xdcc1), u1f698 = si.u16char(0xd83d) .. si.u16char(0xde98), u1f3bf = si.u16char(0xd83c) .. si.u16char(0xdfbf), u1f450 = si.u16char(0xd83d) .. si.u16char(0xdc50), u1f4aa = si.u16char(0xd83d) .. si.u16char(0xdcaa), u1f3a3 = si.u16char(0xd83c) .. si.u16char(0xdfa3), u1f35e = si.u16char(0xd83c) .. si.u16char(0xdf5e), u1f50a = si.u16char(0xd83d) .. si.u16char(0xdd0a), u1f3af = si.u16char(0xd83c) .. si.u16char(0xdfaf), u1f351 = si.u16char(0xd83c) .. si.u16char(0xdf51), u1f3b6 = si.u16char(0xd83c) .. si.u16char(0xdfb6), u0039 = si.u16char(0x0039), u1f4bd = si.u16char(0xd83d) .. si.u16char(0xdcbd), u2668_fe0f = si.u16char(0x2668), u2614_fe0f = si.u16char(0x2614), u1f5fb = si.u16char(0xd83d) .. si.u16char(0xddfb), u1f34f = si.u16char(0xd83c) .. si.u16char(0xdf4f), u1f36e = si.u16char(0xd83c) .. si.u16char(0xdf6e), u1f354 = si.u16char(0xd83c) .. si.u16char(0xdf54), u1f52c = si.u16char(0xd83d) .. si.u16char(0xdd2c), u23f3 = si.u16char(0x23f3), u1f38b = si.u16char(0xd83c) .. si.u16char(0xdf8b), u1f517 = si.u16char(0xd83d) .. si.u16char(0xdd17), u1f4b9 = si.u16char(0xd83d) .. si.u16char(0xdcb9), u1f4d8 = si.u16char(0xd83d) .. si.u16char(0xdcd8), u1f402 = si.u16char(0xd83d) .. si.u16char(0xdc02), u1f520 = si.u16char(0xd83d) .. si.u16char(0xdd20), u1f3c9 = si.u16char(0xd83c) .. si.u16char(0xdfc9), u1f3ab = si.u16char(0xd83c) .. si.u16char(0xdfab), u1f4f3 = si.u16char(0xd83d) .. si.u16char(0xdcf3), u1f63b = si.u16char(0xd83d) .. si.u16char(0xde3b), u1f3bd = si.u16char(0xd83c) .. si.u16char(0xdfbd), u26f2_fe0f = si.u16char(0x26f2), u1f352 = si.u16char(0xd83c) .. si.u16char(0xdf52), u1f3a0 = si.u16char(0xd83c) .. si.u16char(0xdfa0), u1f40c = si.u16char(0xd83d) .. si.u16char(0xdc0c), u1f436 = si.u16char(0xd83d) .. si.u16char(0xdc36), u1f3a5 = si.u16char(0xd83c) .. si.u16char(0xdfa5), u1f631 = si.u16char(0xd83d) .. si.u16char(0xde31), u1f31c = si.u16char(0xd83c) .. si.u16char(0xdf1c), u1f4d6 = si.u16char(0xd83d) .. si.u16char(0xdcd6), u1f4f9 = si.u16char(0xd83d) .. si.u16char(0xdcf9), u1f51e = si.u16char(0xd83d) .. si.u16char(0xdd1e), u1f6b1 = si.u16char(0xd83d) .. si.u16char(0xdeb1), u1f6bd = si.u16char(0xd83d) .. si.u16char(0xdebd), u1f40e = si.u16char(0xd83d) .. si.u16char(0xdc0e), u1f467 = si.u16char(0xd83d) .. si.u16char(0xdc67), u1f0cf = si.u16char(0xd83c) .. si.u16char(0xdccf), u1f3ea = si.u16char(0xd83c) .. si.u16char(0xdfea), u264c_fe0f = si.u16char(0x264c), u1f368 = si.u16char(0xd83c) .. si.u16char(0xdf68), u1f4b8 = si.u16char(0xd83d) .. si.u16char(0xdcb8), u1f529 = si.u16char(0xd83d) .. si.u16char(0xdd29), u1f634 = si.u16char(0xd83d) .. si.u16char(0xde34), u1f233 = si.u16char(0xd83c) .. si.u16char(0xde33), u1f506 = si.u16char(0xd83d) .. si.u16char(0xdd06), u1f48a = si.u16char(0xd83d) .. si.u16char(0xdc8a), u1f335 = si.u16char(0xd83c) .. si.u16char(0xdf35), u1f4bb = si.u16char(0xd83d) .. si.u16char(0xdcbb), u1f524 = si.u16char(0xd83d) .. si.u16char(0xdd24), u1f55a = si.u16char(0xd83d) .. si.u16char(0xdd5a), u1f6bc = si.u16char(0xd83d) .. si.u16char(0xdebc), u1f639 = si.u16char(0xd83d) .. si.u16char(0xde39), u1f556 = si.u16char(0xd83d) .. si.u16char(0xdd56), u1f364 = si.u16char(0xd83c) .. si.u16char(0xdf64), u1f237 = si.u16char(0xd83c) .. si.u16char(0xde37), u1f3be = si.u16char(0xd83c) .. si.u16char(0xdfbe), u1f690 = si.u16char(0xd83d) .. si.u16char(0xde90), u1f49f = si.u16char(0xd83d) .. si.u16char(0xdc9f), u1f315 = si.u16char(0xd83c) .. si.u16char(0xdf15), u1f499 = si.u16char(0xd83d) .. si.u16char(0xdc99), u1f443 = si.u16char(0xd83d) .. si.u16char(0xdc43), u1f610 = si.u16char(0xd83d) .. si.u16char(0xde10), u1f40b = si.u16char(0xd83d) .. si.u16char(0xdc0b), u1f250 = si.u16char(0xd83c) .. si.u16char(0xde50), u2796 = si.u16char(0x2796), u1f648 = si.u16char(0xd83d) .. si.u16char(0xde48), u1f3ca = si.u16char(0xd83c) .. si.u16char(0xdfca), u1f404 = si.u16char(0xd83d) .. si.u16char(0xdc04), u1f3e3 = si.u16char(0xd83c) .. si.u16char(0xdfe3), u1f60c = si.u16char(0xd83d) .. si.u16char(0xde0c), u1f50e = si.u16char(0xd83d) .. si.u16char(0xdd0e), u1f63c = si.u16char(0xd83d) .. si.u16char(0xde3c), u1f42e = si.u16char(0xd83d) .. si.u16char(0xdc2e), u1f49c = si.u16char(0xd83d) .. si.u16char(0xdc9c), u1f386 = si.u16char(0xd83c) .. si.u16char(0xdf86), u2702_fe0f = si.u16char(0x2702), u1f38f = si.u16char(0xd83c) .. si.u16char(0xdf8f), u25c0_fe0f = si.u16char(0x25c0), u1f4ba = si.u16char(0xd83d) .. si.u16char(0xdcba), u1f317 = si.u16char(0xd83c) .. si.u16char(0xdf17), u1f522 = si.u16char(0xd83d) .. si.u16char(0xdd22), u25fb_fe0f = si.u16char(0x25fb), u1f195 = si.u16char(0xd83c) .. si.u16char(0xdd95), u1f511 = si.u16char(0xd83d) .. si.u16char(0xdd11), u1f42f = si.u16char(0xd83d) .. si.u16char(0xdc2f), u1f61a = si.u16char(0xd83d) .. si.u16char(0xde1a), u1f539 = si.u16char(0xd83d) .. si.u16char(0xdd39), u2714_fe0f = si.u16char(0x2714), u1f333 = si.u16char(0xd83c) .. si.u16char(0xdf33), u1f699 = si.u16char(0xd83d) .. si.u16char(0xde99), u1f319 = si.u16char(0xd83c) .. si.u16char(0xdf19), u1f3c2 = si.u16char(0xd83c) .. si.u16char(0xdfc2), u2049_fe0f = si.u16char(0x2049), u1f459 = si.u16char(0xd83d) .. si.u16char(0xdc59), u1f504 = si.u16char(0xd83d) .. si.u16char(0xdd04), u1f458 = si.u16char(0xd83d) .. si.u16char(0xdc58), u1f510 = si.u16char(0xd83d) .. si.u16char(0xdd10), u1f6ab = si.u16char(0xd83d) .. si.u16char(0xdeab), u1f51c = si.u16char(0xd83d) .. si.u16char(0xdd1c), u2764_fe0f = si.u16char(0x2764), u1f49d = si.u16char(0xd83d) .. si.u16char(0xdc9d), u1f49b = si.u16char(0xd83d) .. si.u16char(0xdc9b), u1f6ae = si.u16char(0xd83d) .. si.u16char(0xdeae), u1f4da = si.u16char(0xd83d) .. si.u16char(0xdcda), u1f63a = si.u16char(0xd83d) .. si.u16char(0xde3a), u1f695 = si.u16char(0xd83d) .. si.u16char(0xde95), u2716_fe0f = si.u16char(0x2716), u1f422 = si.u16char(0xd83d) .. si.u16char(0xdc22), u1f1e9_1f1ea = si.u16char(0xd83c) .. si.u16char(0xdde9) .. si.u16char(0xd83c) .. si.u16char(0xddea), u2754 = si.u16char(0x2754), u1f47c = si.u16char(0xd83d) .. si.u16char(0xdc7c), u1f62f = si.u16char(0xd83d) .. si.u16char(0xde2f), u1f452 = si.u16char(0xd83d) .. si.u16char(0xdc52), u0033_fe0f_20e3 = si.u16char(0x0033) .. si.u16char(0x20e3), u1f69f = si.u16char(0xd83d) .. si.u16char(0xde9f), u1f383 = si.u16char(0xd83c) .. si.u16char(0xdf83), u1f30b = si.u16char(0xd83c) .. si.u16char(0xdf0b), u1f36f = si.u16char(0xd83c) .. si.u16char(0xdf6f), u1f340 = si.u16char(0xd83c) .. si.u16char(0xdf40), u1f52f = si.u16char(0xd83d) .. si.u16char(0xdd2f), u1f3ba = si.u16char(0xd83c) .. si.u16char(0xdfba), u2705 = si.u16char(0x2705), u1f46f = si.u16char(0xd83d) .. si.u16char(0xdc6f), u1f43d = si.u16char(0xd83d) .. si.u16char(0xdc3d), u1f400 = si.u16char(0xd83d) .. si.u16char(0xdc00), u1f371 = si.u16char(0xd83c) .. si.u16char(0xdf71), u270f_fe0f = si.u16char(0x270f), u23e9 = si.u16char(0x23e9), u1f492 = si.u16char(0xd83d) .. si.u16char(0xdc92), u25b6_fe0f = si.u16char(0x25b6), u1f346 = si.u16char(0xd83c) .. si.u16char(0xdf46), u1f4b5 = si.u16char(0xd83d) .. si.u16char(0xdcb5), u1f197 = si.u16char(0xd83c) .. si.u16char(0xdd97), u1f42a = si.u16char(0xd83d) .. si.u16char(0xdc2a), u2797 = si.u16char(0x2797), u1f68c = si.u16char(0xd83d) .. si.u16char(0xde8c), u1f313 = si.u16char(0xd83c) .. si.u16char(0xdf13), u23f0 = si.u16char(0x23f0), u1f61f = si.u16char(0xd83d) .. si.u16char(0xde1f), u0031 = si.u16char(0x0031), u1f37a = si.u16char(0xd83c) .. si.u16char(0xdf7a), u1f6b4 = si.u16char(0xd83d) .. si.u16char(0xdeb4), u1f68e = si.u16char(0xd83d) .. si.u16char(0xde8e), u1f390 = si.u16char(0xd83c) .. si.u16char(0xdf90), u1f3c1 = si.u16char(0xd83c) .. si.u16char(0xdfc1), u1f475 = si.u16char(0xd83d) .. si.u16char(0xdc75), u0035_fe0f_20e3 = si.u16char(0x0035) .. si.u16char(0x20e3), u1f521 = si.u16char(0xd83d) .. si.u16char(0xdd21), u1f18e = si.u16char(0xd83c) .. si.u16char(0xdd8e), u1f4e4 = si.u16char(0xd83d) .. si.u16char(0xdce4), u1f47e = si.u16char(0xd83d) .. si.u16char(0xdc7e), u1f4e9 = si.u16char(0xd83d) .. si.u16char(0xdce9), u1f347 = si.u16char(0xd83c) .. si.u16char(0xdf47), u1f409 = si.u16char(0xd83d) .. si.u16char(0xdc09), u2b1c_fe0f = si.u16char(0x2b1c), u1f425 = si.u16char(0xd83d) .. si.u16char(0xdc25), u1f689 = si.u16char(0xd83d) .. si.u16char(0xde89), u1f69a = si.u16char(0xd83d) .. si.u16char(0xde9a), u1f234 = si.u16char(0xd83c) .. si.u16char(0xde34), u1f343 = si.u16char(0xd83c) .. si.u16char(0xdf43), u1f606 = si.u16char(0xd83d) .. si.u16char(0xde06), u1f6b7 = si.u16char(0xd83d) .. si.u16char(0xdeb7), u1f17e = si.u16char(0xd83c) .. si.u16char(0xdd7e), u1f620 = si.u16char(0xd83d) .. si.u16char(0xde20), u1f311 = si.u16char(0xd83c) .. si.u16char(0xdf11), u1f33e = si.u16char(0xd83c) .. si.u16char(0xdf3e), u1f612 = si.u16char(0xd83d) .. si.u16char(0xde12), u2650_fe0f = si.u16char(0x2650), u1f532 = si.u16char(0xd83d) .. si.u16char(0xdd32), u1f42b = si.u16char(0xd83d) .. si.u16char(0xdc2b), u1f536 = si.u16char(0xd83d) .. si.u16char(0xdd36), u1f617 = si.u16char(0xd83d) .. si.u16char(0xde17), u1f4c7 = si.u16char(0xd83d) .. si.u16char(0xdcc7), u1f4c4 = si.u16char(0xd83d) .. si.u16char(0xdcc4), u1f68b = si.u16char(0xd83d) .. si.u16char(0xde8b), u1f48f = si.u16char(0xd83d) .. si.u16char(0xdc8f), u1f3bb = si.u16char(0xd83c) .. si.u16char(0xdfbb), u1f251 = si.u16char(0xd83c) .. si.u16char(0xde51), u1f535 = si.u16char(0xd83d) .. si.u16char(0xdd35), u1f411 = si.u16char(0xd83d) .. si.u16char(0xdc11), u1f485 = si.u16char(0xd83d) .. si.u16char(0xdc85), u1f51a = si.u16char(0xd83d) .. si.u16char(0xdd1a), u2653_fe0f = si.u16char(0x2653), u1f4e0 = si.u16char(0xd83d) .. si.u16char(0xdce0), u1f301 = si.u16char(0xd83c) .. si.u16char(0xdf01), u1f3c7 = si.u16char(0xd83c) .. si.u16char(0xdfc7), u1f45b = si.u16char(0xd83d) .. si.u16char(0xdc5b), u2b55_fe0f = si.u16char(0x2b55), u1f3ef = si.u16char(0xd83c) .. si.u16char(0xdfef), u1f551 = si.u16char(0xd83d) .. si.u16char(0xdd51), u1f236 = si.u16char(0xd83c) .. si.u16char(0xde36), u1f47b = si.u16char(0xd83d) .. si.u16char(0xdc7b), u1f48c = si.u16char(0xd83d) .. si.u16char(0xdc8c), u1f615 = si.u16char(0xd83d) .. si.u16char(0xde15), u2744_fe0f = si.u16char(0x2744), u1f46e = si.u16char(0xd83d) .. si.u16char(0xdc6e), u264e_fe0f = si.u16char(0x264e), u1f36c = si.u16char(0xd83c) .. si.u16char(0xdf6c), u1f367 = si.u16char(0xd83c) .. si.u16char(0xdf67), u24c2_fe0f = si.u16char(0x24c2), u1f6b6 = si.u16char(0xd83d) .. si.u16char(0xdeb6), u1f525 = si.u16char(0xd83d) .. si.u16char(0xdd25), u1f3e9 = si.u16char(0xd83c) .. si.u16char(0xdfe9), u2601_fe0f = si.u16char(0x2601), u1f559 = si.u16char(0xd83d) .. si.u16char(0xdd59), u1f626 = si.u16char(0xd83d) .. si.u16char(0xde26), u1f421 = si.u16char(0xd83d) .. si.u16char(0xdc21), u1f338 = si.u16char(0xd83c) .. si.u16char(0xdf38), u2728 = si.u16char(0x2728), u1f69c = si.u16char(0xd83d) .. si.u16char(0xde9c), u1f6bf = si.u16char(0xd83d) .. si.u16char(0xdebf), u1f38a = si.u16char(0xd83c) .. si.u16char(0xdf8a), u1f303 = si.u16char(0xd83c) .. si.u16char(0xdf03), u1f357 = si.u16char(0xd83c) .. si.u16char(0xdf57), u1f4a2 = si.u16char(0xd83d) .. si.u16char(0xdca2), u1f479 = si.u16char(0xd83d) .. si.u16char(0xdc79), u1f382 = si.u16char(0xd83c) .. si.u16char(0xdf82), u1f453 = si.u16char(0xd83d) .. si.u16char(0xdc53), u1f392 = si.u16char(0xd83c) .. si.u16char(0xdf92), u1f52b = si.u16char(0xd83d) .. si.u16char(0xdd2b), u1f3b7 = si.u16char(0xd83c) .. si.u16char(0xdfb7), u1f4a6 = si.u16char(0xd83d) .. si.u16char(0xdca6), u2b07_fe0f = si.u16char(0x2b07), u1f6b0 = si.u16char(0xd83d) .. si.u16char(0xdeb0), u1f3e0 = si.u16char(0xd83c) .. si.u16char(0xdfe0), u1f558 = si.u16char(0xd83d) .. si.u16char(0xdd58), u1f505 = si.u16char(0xd83d) .. si.u16char(0xdd05), u1f526 = si.u16char(0xd83d) .. si.u16char(0xdd26), u1f480 = si.u16char(0xd83d) .. si.u16char(0xdc80), u1f3eb = si.u16char(0xd83c) .. si.u16char(0xdfeb), u1f3e2 = si.u16char(0xd83c) .. si.u16char(0xdfe2), u1f1f7_1f1fa = si.u16char(0xd83c) .. si.u16char(0xddf7) .. si.u16char(0xd83c) .. si.u16char(0xddfa), u1f47a = si.u16char(0xd83d) .. si.u16char(0xdc7a), u1f50c = si.u16char(0xd83d) .. si.u16char(0xdd0c), u0034_fe0f_20e3 = si.u16char(0x0034) .. si.u16char(0x20e3), u264a_fe0f = si.u16char(0x264a), u1f6aa = si.u16char(0xd83d) .. si.u16char(0xdeaa), u1f46a = si.u16char(0xd83d) .. si.u16char(0xdc6a), u1f6a5 = si.u16char(0xd83d) .. si.u16char(0xdea5), u1f45d = si.u16char(0xd83d) .. si.u16char(0xdc5d), u1f341 = si.u16char(0xd83c) .. si.u16char(0xdf41), u1f560 = si.u16char(0xd83d) .. si.u16char(0xdd60), u1f444 = si.u16char(0xd83d) .. si.u16char(0xdc44), u1f4d0 = si.u16char(0xd83d) .. si.u16char(0xdcd0), u1f1ea_1f1f8 = si.u16char(0xd83c) .. si.u16char(0xddea) .. si.u16char(0xd83c) .. si.u16char(0xddf8), u1f608 = si.u16char(0xd83d) .. si.u16char(0xde08), u231b_fe0f = si.u16char(0x231b), u1f502 = si.u16char(0xd83d) .. si.u16char(0xdd02), u1f414 = si.u16char(0xd83d) .. si.u16char(0xdc14), u1f623 = si.u16char(0xd83d) .. si.u16char(0xde23), u26c4_fe0f = si.u16char(0x26c4), u1f373 = si.u16char(0xd83c) .. si.u16char(0xdf73), u1f472 = si.u16char(0xd83d) .. si.u16char(0xdc72), u1f6b9 = si.u16char(0xd83d) .. si.u16char(0xdeb9), u1f628 = si.u16char(0xd83d) .. si.u16char(0xde28), u1f314 = si.u16char(0xd83c) .. si.u16char(0xdf14), u1f55c = si.u16char(0xd83d) .. si.u16char(0xdd5c), u1f50b = si.u16char(0xd83d) .. si.u16char(0xdd0b), u1f44c = si.u16char(0xd83d) .. si.u16char(0xdc4c), u1f412 = si.u16char(0xd83d) .. si.u16char(0xdc12), u1f4ad = si.u16char(0xd83d) .. si.u16char(0xdcad), u1f62b = si.u16char(0xd83d) .. si.u16char(0xde2b), u26a0_fe0f = si.u16char(0x26a0), u2934_fe0f = si.u16char(0x2934), u1f406 = si.u16char(0xd83d) .. si.u16char(0xdc06), u2b06_fe0f = si.u16char(0x2b06), u2b1b_fe0f = si.u16char(0x2b1b), u0038_fe0f_20e3 = si.u16char(0x0038) .. si.u16char(0x20e3), u2b05_fe0f = si.u16char(0x2b05), u1f344 = si.u16char(0xd83c) .. si.u16char(0xdf44), u1f530 = si.u16char(0xd83d) .. si.u16char(0xdd30), u1f21a = si.u16char(0xd83c) .. si.u16char(0xde1a), u1f496 = si.u16char(0xd83d) .. si.u16char(0xdc96), u1f4e7 = si.u16char(0xd83d) .. si.u16char(0xdce7), u1f4fb = si.u16char(0xd83d) .. si.u16char(0xdcfb), u1f4b1 = si.u16char(0xd83d) .. si.u16char(0xdcb1), u1f387 = si.u16char(0xd83c) .. si.u16char(0xdf87), u1f33c = si.u16char(0xd83c) .. si.u16char(0xdf3c), u270a = si.u16char(0x270a), u26ce = si.u16char(0x26ce), u26c5_fe0f = si.u16char(0x26c5), u1f515 = si.u16char(0xd83d) .. si.u16char(0xdd15), u1f687 = si.u16char(0xd83d) .. si.u16char(0xde87), u303d_fe0f = si.u16char(0x303d), u1f424 = si.u16char(0xd83d) .. si.u16char(0xdc24), u1f6c0 = si.u16char(0xd83d) .. si.u16char(0xdec0), u1f68f = si.u16char(0xd83d) .. si.u16char(0xde8f), u1f4cc = si.u16char(0xd83d) .. si.u16char(0xdccc), u1f4e8 = si.u16char(0xd83d) .. si.u16char(0xdce8), u1f53c = si.u16char(0xd83d) .. si.u16char(0xdd3c), u1f633 = si.u16char(0xd83d) .. si.u16char(0xde33), u1f415 = si.u16char(0xd83d) .. si.u16char(0xdc15), u1f4c8 = si.u16char(0xd83d) .. si.u16char(0xdcc8), u1f370 = si.u16char(0xd83c) .. si.u16char(0xdf70), u26f5_fe0f = si.u16char(0x26f5), u1f393 = si.u16char(0xd83c) .. si.u16char(0xdf93), u1f428 = si.u16char(0xd83d) .. si.u16char(0xdc28), u1f004 = si.u16char(0xd83c) .. si.u16char(0xdc04), u1f418 = si.u16char(0xd83d) .. si.u16char(0xdc18), u1f30e = si.u16char(0xd83c) .. si.u16char(0xdf0e), u1f484 = si.u16char(0xd83d) .. si.u16char(0xdc84), u1f454 = si.u16char(0xd83d) .. si.u16char(0xdc54), u1f356 = si.u16char(0xd83c) .. si.u16char(0xdf56), u1f476 = si.u16char(0xd83d) .. si.u16char(0xdc76), u1f632 = si.u16char(0xd83d) .. si.u16char(0xde32), u1f613 = si.u16char(0xd83d) .. si.u16char(0xde13), u1f464 = si.u16char(0xd83d) .. si.u16char(0xdc64), u1f405 = si.u16char(0xd83d) .. si.u16char(0xdc05), u1f602 = si.u16char(0xd83d) .. si.u16char(0xde02), u2648_fe0f = si.u16char(0x2648), u1f489 = si.u16char(0xd83d) .. si.u16char(0xdc89), u1f60f = si.u16char(0xd83d) .. si.u16char(0xde0f), u264d_fe0f = si.u16char(0x264d), u1f36d = si.u16char(0xd83c) .. si.u16char(0xdf6d), u1f35b = si.u16char(0xd83c) .. si.u16char(0xdf5b), u1f235 = si.u16char(0xd83c) .. si.u16char(0xde35), u1f3e4 = si.u16char(0xd83c) .. si.u16char(0xdfe4), u1f4a4 = si.u16char(0xd83d) .. si.u16char(0xdca4), u1f17f_fe0f = si.u16char(0xd83c) .. si.u16char(0xdd7f), u1f3a7 = si.u16char(0xd83c) .. si.u16char(0xdfa7), u1f3b9 = si.u16char(0xd83c) .. si.u16char(0xdfb9), u1f45e = si.u16char(0xd83d) .. si.u16char(0xdc5e), u1f239 = si.u16char(0xd83c) .. si.u16char(0xde39), u1f60a = si.u16char(0xd83d) .. si.u16char(0xde0a), u1f495 = si.u16char(0xd83d) .. si.u16char(0xdc95), u26ea_fe0f = si.u16char(0x26ea), u1f199 = si.u16char(0xd83c) .. si.u16char(0xdd99), u1f553 = si.u16char(0xd83d) .. si.u16char(0xdd53), u1f3ec = si.u16char(0xd83c) .. si.u16char(0xdfec), u1f4f7 = si.u16char(0xd83d) .. si.u16char(0xdcf7), u1f490 = si.u16char(0xd83d) .. si.u16char(0xdc90), u1f3c4 = si.u16char(0xd83c) .. si.u16char(0xdfc4), u1f4dd = si.u16char(0xd83d) .. si.u16char(0xdcdd), u1f688 = si.u16char(0xd83d) .. si.u16char(0xde88), u1f192 = si.u16char(0xd83c) .. si.u16char(0xdd92), u1f380 = si.u16char(0xd83c) .. si.u16char(0xdf80), u1f41d = si.u16char(0xd83d) .. si.u16char(0xdc1d), u1f46d = si.u16char(0xd83d) .. si.u16char(0xdc6d), u1f17f = si.u16char(0xd83c) .. si.u16char(0xdd7f), u1f486 = si.u16char(0xd83d) .. si.u16char(0xdc86), u1f497 = si.u16char(0xd83d) .. si.u16char(0xdc97), u1f349 = si.u16char(0xd83c) .. si.u16char(0xdf49), u26ab_fe0f = si.u16char(0x26ab), u1f3e5 = si.u16char(0xd83c) .. si.u16char(0xdfe5), u1f513 = si.u16char(0xd83d) .. si.u16char(0xdd13), u1f45f = si.u16char(0xd83d) .. si.u16char(0xdc5f), u2615_fe0f = si.u16char(0x2615), u1f363 = si.u16char(0xd83c) .. si.u16char(0xdf63), u21aa_fe0f = si.u16char(0x21aa), u1f683 = si.u16char(0xd83d) .. si.u16char(0xde83), u1f1fa_1f1f8 = si.u16char(0xd83c) .. si.u16char(0xddfa) .. si.u16char(0xd83c) .. si.u16char(0xddf8), u1f42c = si.u16char(0xd83d) .. si.u16char(0xdc2c), u1f6c1 = si.u16char(0xd83d) .. si.u16char(0xdec1), u0036 = si.u16char(0x0036), u1f51f = si.u16char(0xd83d) .. si.u16char(0xdd1f), u1f45a = si.u16char(0xd83d) .. si.u16char(0xdc5a), u1f694 = si.u16char(0xd83d) .. si.u16char(0xde94), u1f537 = si.u16char(0xd83d) .. si.u16char(0xdd37), u1f50f = si.u16char(0xd83d) .. si.u16char(0xdd0f), u1f6a4 = si.u16char(0xd83d) .. si.u16char(0xdea4), u1f355 = si.u16char(0xd83c) .. si.u16char(0xdf55), u267b_fe0f = si.u16char(0x267b), u1f469 = si.u16char(0xd83d) .. si.u16char(0xdc69), u1f468 = si.u16char(0xd83d) .. si.u16char(0xdc68), u1f4ab = si.u16char(0xd83d) .. si.u16char(0xdcab), u1f52d = si.u16char(0xd83d) .. si.u16char(0xdd2d), u1f361 = si.u16char(0xd83c) .. si.u16char(0xdf61), u1f4ce = si.u16char(0xd83d) .. si.u16char(0xdcce), u1f4ee = si.u16char(0xd83d) .. si.u16char(0xdcee), u1f4b4 = si.u16char(0xd83d) .. si.u16char(0xdcb4), u1f40a = si.u16char(0xd83d) .. si.u16char(0xdc0a), u1f426 = si.u16char(0xd83d) .. si.u16char(0xdc26), u26a1_fe0f = si.u16char(0x26a1), u1f1ee_1f1f9 = si.u16char(0xd83c) .. si.u16char(0xddee) .. si.u16char(0xd83c) .. si.u16char(0xddf9), u1f410 = si.u16char(0xd83d) .. si.u16char(0xdc10), u1f4f5 = si.u16char(0xd83d) .. si.u16char(0xdcf5), u1f4a0 = si.u16char(0xd83d) .. si.u16char(0xdca0), u00a9 = si.u16char(0x00a9), u2666_fe0f = si.u16char(0x2666), u1f6a3 = si.u16char(0xd83d) .. si.u16char(0xdea3), u2753 = si.u16char(0x2753), u1f359 = si.u16char(0xd83c) .. si.u16char(0xdf59), u1f449 = si.u16char(0xd83d) .. si.u16char(0xdc49), u1f4b6 = si.u16char(0xd83d) .. si.u16char(0xdcb6), u1f334 = si.u16char(0xd83c) .. si.u16char(0xdf34), u1f69b = si.u16char(0xd83d) .. si.u16char(0xde9b), u1f3a2 = si.u16char(0xd83c) .. si.u16char(0xdfa2), u25fe_fe0f = si.u16char(0x25fe), u1f682 = si.u16char(0xd83d) .. si.u16char(0xde82), u2935_fe0f = si.u16char(0x2935), u1f62a = si.u16char(0xd83d) .. si.u16char(0xde2a), u1f337 = si.u16char(0xd83c) .. si.u16char(0xdf37), u1f201 = si.u16char(0xd83c) .. si.u16char(0xde01), u1f645 = si.u16char(0xd83d) .. si.u16char(0xde45), u1f35a = si.u16char(0xd83c) .. si.u16char(0xdf5a), u2734_fe0f = si.u16char(0x2734), u1f552 = si.u16char(0xd83d) .. si.u16char(0xdd52), u1f4a8 = si.u16char(0xd83d) .. si.u16char(0xdca8), u0030 = si.u16char(0x0030), u1f500 = si.u16char(0xd83d) .. si.u16char(0xdd00), u1f3e1 = si.u16char(0xd83c) .. si.u16char(0xdfe1), u1f41c = si.u16char(0xd83d) .. si.u16char(0xdc1c), u1f6a1 = si.u16char(0xd83d) .. si.u16char(0xdea1), u1f63d = si.u16char(0xd83d) .. si.u16char(0xde3d), u1f451 = si.u16char(0xd83d) .. si.u16char(0xdc51), u1f358 = si.u16char(0xd83c) .. si.u16char(0xdf58), u1f30a = si.u16char(0xd83c) .. si.u16char(0xdf0a), u1f3b5 = si.u16char(0xd83c) .. si.u16char(0xdfb5), u1f4a3 = si.u16char(0xd83d) .. si.u16char(0xdca3), u1f3c6 = si.u16char(0xd83c) .. si.u16char(0xdfc6), u1f680 = si.u16char(0xd83d) .. si.u16char(0xde80), u1f4c3 = si.u16char(0xd83d) .. si.u16char(0xdcc3), u1f33a = si.u16char(0xd83c) .. si.u16char(0xdf3a), u1f304 = si.u16char(0xd83c) .. si.u16char(0xdf04), u1f6a7 = si.u16char(0xd83d) .. si.u16char(0xdea7), u1f3ed = si.u16char(0xd83c) .. si.u16char(0xdfed), u1f6af = si.u16char(0xd83d) .. si.u16char(0xdeaf), u1f686 = si.u16char(0xd83d) .. si.u16char(0xde86), u1f362 = si.u16char(0xd83c) .. si.u16char(0xdf62), u1f600 = si.u16char(0xd83d) .. si.u16char(0xde00), u1f3b8 = si.u16char(0xd83c) .. si.u16char(0xdfb8), u1f21a_fe0f = si.u16char(0xd83c) .. si.u16char(0xde1a), u1f30d = si.u16char(0xd83c) .. si.u16char(0xdf0d), u1f3e8 = si.u16char(0xd83c) .. si.u16char(0xdfe8), u1f4fc = si.u16char(0xd83d) .. si.u16char(0xdcfc), u1f4de = si.u16char(0xd83d) .. si.u16char(0xdcde), u1f348 = si.u16char(0xd83c) .. si.u16char(0xdf48), u1f4cb = si.u16char(0xd83d) .. si.u16char(0xdccb), u1f439 = si.u16char(0xd83d) .. si.u16char(0xdc39), u1f41e = si.u16char(0xd83d) .. si.u16char(0xdc1e), u2755 = si.u16char(0x2755), u1f61e = si.u16char(0xd83d) .. si.u16char(0xde1e), u1f3ac = si.u16char(0xd83c) .. si.u16char(0xdfac), u1f369 = si.u16char(0xd83c) .. si.u16char(0xdf69), u1f533 = si.u16char(0xd83d) .. si.u16char(0xdd33), u1f4ef = si.u16char(0xd83d) .. si.u16char(0xdcef), u1f353 = si.u16char(0xd83c) .. si.u16char(0xdf53), u1f44a = si.u16char(0xd83d) .. si.u16char(0xdc4a), u2139_fe0f = si.u16char(0x2139), u1f567 = si.u16char(0xd83d) .. si.u16char(0xdd67), u1f48d = si.u16char(0xd83d) .. si.u16char(0xdc8d), u1f494 = si.u16char(0xd83d) .. si.u16char(0xdc94), u1f49a = si.u16char(0xd83d) .. si.u16char(0xdc9a), u1f445 = si.u16char(0xd83d) .. si.u16char(0xdc45), u1f4b2 = si.u16char(0xd83d) .. si.u16char(0xdcb2), u1f565 = si.u16char(0xd83d) .. si.u16char(0xdd65), u1f385 = si.u16char(0xd83c) .. si.u16char(0xdf85), u1f627 = si.u16char(0xd83d) .. si.u16char(0xde27), u2757_fe0f = si.u16char(0x2757), u1f193 = si.u16char(0xd83c) .. si.u16char(0xdd93), u1f431 = si.u16char(0xd83d) .. si.u16char(0xdc31), u1f455 = si.u16char(0xd83d) .. si.u16char(0xdc55), u1f649 = si.u16char(0xd83d) .. si.u16char(0xde49), u1f697 = si.u16char(0xd83d) .. si.u16char(0xde97), u1f601 = si.u16char(0xd83d) .. si.u16char(0xde01), u1f3b1 = si.u16char(0xd83c) .. si.u16char(0xdfb1), u1f23a = si.u16char(0xd83c) .. si.u16char(0xde3a), u274e = si.u16char(0x274e), u1f508 = si.u16char(0xd83d) .. si.u16char(0xdd08), u2712_fe0f = si.u16char(0x2712), u1f318 = si.u16char(0xd83c) .. si.u16char(0xdf18), u1f360 = si.u16char(0xd83c) .. si.u16char(0xdf60), u1f6bb = si.u16char(0xd83d) .. si.u16char(0xdebb), u1f561 = si.u16char(0xd83d) .. si.u16char(0xdd61), u264f_fe0f = si.u16char(0x264f), u1f460 = si.u16char(0xd83d) .. si.u16char(0xdc60), u1f41f = si.u16char(0xd83d) .. si.u16char(0xdc1f), u1f31d = si.u16char(0xd83c) .. si.u16char(0xdf1d), u1f61c = si.u16char(0xd83d) .. si.u16char(0xde1c), u1f503 = si.u16char(0xd83d) .. si.u16char(0xdd03), u1f684 = si.u16char(0xd83d) .. si.u16char(0xde84), u1f4d9 = si.u16char(0xd83d) .. si.u16char(0xdcd9), u0023 = si.u16char(0x0023), u1f339 = si.u16char(0xd83c) .. si.u16char(0xdf39), u1f389 = si.u16char(0xd83c) .. si.u16char(0xdf89), u1f440 = si.u16char(0xd83d) .. si.u16char(0xdc40), u1f647 = si.u16char(0xd83d) .. si.u16char(0xde47), u1f62d = si.u16char(0xd83d) .. si.u16char(0xde2d), u26d4_fe0f = si.u16char(0x26d4), u1f637 = si.u16char(0xd83d) .. si.u16char(0xde37), u1f6c5 = si.u16char(0xd83d) .. si.u16char(0xdec5), u1f35f = si.u16char(0xd83c) .. si.u16char(0xdf5f), u1f64c = si.u16char(0xd83d) .. si.u16char(0xde4c), u1f62c = si.u16char(0xd83d) .. si.u16char(0xde2c), u1f004_fe0f = si.u16char(0xd83c) .. si.u16char(0xdc04), u1f69d = si.u16char(0xd83d) .. si.u16char(0xde9d), u1f55b = si.u16char(0xd83d) .. si.u16char(0xdd5b), u1f4dc = si.u16char(0xd83d) .. si.u16char(0xdcdc), u1f3e7 = si.u16char(0xd83c) .. si.u16char(0xdfe7), u1f6a2 = si.u16char(0xd83d) .. si.u16char(0xdea2), u267f_fe0f = si.u16char(0x267f), u1f438 = si.u16char(0xd83d) .. si.u16char(0xdc38), u1f4d1 = si.u16char(0xd83d) .. si.u16char(0xdcd1), u1f43e = si.u16char(0xd83d) .. si.u16char(0xdc3e), u1f635 = si.u16char(0xd83d) .. si.u16char(0xde35), u1f622 = si.u16char(0xd83d) .. si.u16char(0xde22), u1f498 = si.u16char(0xd83d) .. si.u16char(0xdc98), u2665_fe0f = si.u16char(0x2665), u1f33d = si.u16char(0xd83c) .. si.u16char(0xdf3d), u1f407 = si.u16char(0xd83d) .. si.u16char(0xdc07), u00ae = si.u16char(0x00ae), u1f527 = si.u16char(0xd83d) .. si.u16char(0xdd27), u0023_fe0f_20e3 = si.u16char(0x0023) .. si.u16char(0x20e3), u1f488 = si.u16char(0xd83d) .. si.u16char(0xdc88), u1f381 = si.u16char(0xd83c) .. si.u16char(0xdf81), u1f403 = si.u16char(0xd83d) .. si.u16char(0xdc03), u0039_fe0f_20e3 = si.u16char(0x0039) .. si.u16char(0x20e3), u1f300 = si.u16char(0xd83c) .. si.u16char(0xdf00), u1f6a6 = si.u16char(0xd83d) .. si.u16char(0xdea6), u1f34c = si.u16char(0xd83c) .. si.u16char(0xdf4c), u260e_fe0f = si.u16char(0x260e), u1f4c5 = si.u16char(0xd83d) .. si.u16char(0xdcc5), u1f564 = si.u16char(0xd83d) .. si.u16char(0xdd64), u1f6b8 = si.u16char(0xd83d) .. si.u16char(0xdeb8), u1f330 = si.u16char(0xd83c) .. si.u16char(0xdf30), u1f44e = si.u16char(0xd83d) .. si.u16char(0xdc4e), u1f423 = si.u16char(0xd83d) .. si.u16char(0xdc23), u1f531 = si.u16char(0xd83d) .. si.u16char(0xdd31), u1f4d2 = si.u16char(0xd83d) .. si.u16char(0xdcd2), u1f34a = si.u16char(0xd83c) .. si.u16char(0xdf4a), u1f64f = si.u16char(0xd83d) .. si.u16char(0xde4f), u1f53d = si.u16char(0xd83d) .. si.u16char(0xdd3d), u1f365 = si.u16char(0xd83c) .. si.u16char(0xdf65), u1f636 = si.u16char(0xd83d) .. si.u16char(0xde36), u1f611 = si.u16char(0xd83d) .. si.u16char(0xde11), u1f555 = si.u16char(0xd83d) .. si.u16char(0xdd55), u1f37b = si.u16char(0xd83c) .. si.u16char(0xdf7b), u1f46b = si.u16char(0xd83d) .. si.u16char(0xdc6b), u1f519 = si.u16char(0xd83d) .. si.u16char(0xdd19), u1f302 = si.u16char(0xd83c) .. si.u16char(0xdf02), u1f550 = si.u16char(0xd83d) .. si.u16char(0xdd50), u1f3c0 = si.u16char(0xd83c) .. si.u16char(0xdfc0), u1f55d = si.u16char(0xd83d) .. si.u16char(0xdd5d), u1f3a9 = si.u16char(0xd83c) .. si.u16char(0xdfa9), u1f625 = si.u16char(0xd83d) .. si.u16char(0xde25), u21a9_fe0f = si.u16char(0x21a9), u1f372 = si.u16char(0xd83c) .. si.u16char(0xdf72), u1f3ee = si.u16char(0xd83c) .. si.u16char(0xdfee), u2198_fe0f = si.u16char(0x2198), u3030 = si.u16char(0x3030), u1f6a9 = si.u16char(0xd83d) .. si.u16char(0xdea9), u1f435 = si.u16char(0xd83d) .. si.u16char(0xdc35), u1f3a1 = si.u16char(0xd83c) .. si.u16char(0xdfa1), u1f448 = si.u16char(0xd83d) .. si.u16char(0xdc48), u1f4bc = si.u16char(0xd83d) .. si.u16char(0xdcbc), u1f202 = si.u16char(0xd83c) .. si.u16char(0xde02), u1f6c2 = si.u16char(0xd83d) .. si.u16char(0xdec2), u1f562 = si.u16char(0xd83d) .. si.u16char(0xdd62), u1f3bc = si.u16char(0xd83c) .. si.u16char(0xdfbc), u1f34d = si.u16char(0xd83c) .. si.u16char(0xdf4d), u1f4f6 = si.u16char(0xd83d) .. si.u16char(0xdcf6), u1f4ac = si.u16char(0xd83d) .. si.u16char(0xdcac), u1f49e = si.u16char(0xd83d) .. si.u16char(0xdc9e), u1f474 = si.u16char(0xd83d) .. si.u16char(0xdc74), u1f308 = si.u16char(0xd83c) .. si.u16char(0xdf08), u1f3a6 = si.u16char(0xd83c) .. si.u16char(0xdfa6), u25fd_fe0f = si.u16char(0x25fd), u1f4ec = si.u16char(0xd83d) .. si.u16char(0xdcec), u1f3a8 = si.u16char(0xd83c) .. si.u16char(0xdfa8), u264b_fe0f = si.u16char(0x264b), u1f466 = si.u16char(0xd83d) .. si.u16char(0xdc66), u1f44f = si.u16char(0xd83d) .. si.u16char(0xdc4f), u27bf = si.u16char(0x27bf), u2709_fe0f = si.u16char(0x2709), u1f514 = si.u16char(0xd83d) .. si.u16char(0xdd14), u2708_fe0f = si.u16char(0x2708), u1f34b = si.u16char(0xd83c) .. si.u16char(0xdf4b), u1f6b3 = si.u16char(0xd83d) .. si.u16char(0xdeb3), u1f4ed = si.u16char(0xd83d) .. si.u16char(0xdced), u0037 = si.u16char(0x0037), u1f516 = si.u16char(0xd83d) .. si.u16char(0xdd16), u2195_fe0f = si.u16char(0x2195), u0030_fe0f_20e3 = si.u16char(0x0030) .. si.u16char(0x20e3), u1f310 = si.u16char(0xd83c) .. si.u16char(0xdf10), u1f681 = si.u16char(0xd83d) .. si.u16char(0xde81), u0037_fe0f_20e3 = si.u16char(0x0037) .. si.u16char(0x20e3), u1f63e = si.u16char(0xd83d) .. si.u16char(0xde3e), u1f36b = si.u16char(0xd83c) .. si.u16char(0xdf6b), u1f6ba = si.u16char(0xd83d) .. si.u16char(0xdeba), u1f4e1 = si.u16char(0xd83d) .. si.u16char(0xdce1), u1f374 = si.u16char(0xd83c) .. si.u16char(0xdf74), u1f52e = si.u16char(0xd83d) .. si.u16char(0xdd2e), u1f44b = si.u16char(0xd83d) .. si.u16char(0xdc4b), u1f433 = si.u16char(0xd83d) .. si.u16char(0xdc33), u270c_fe0f = si.u16char(0x270c), u2122 = si.u16char(0x2122), u1f379 = si.u16char(0xd83c) .. si.u16char(0xdf79), u26aa_fe0f = si.u16char(0x26aa), u1f40d = si.u16char(0xd83d) .. si.u16char(0xdc0d), u1f332 = si.u16char(0xd83c) .. si.u16char(0xdf32), u1f465 = si.u16char(0xd83d) .. si.u16char(0xdc65), u1f55f = si.u16char(0xd83d) .. si.u16char(0xdd5f), u203c_fe0f = si.u16char(0x203c), u1f603 = si.u16char(0xd83d) .. si.u16char(0xde03), u1f4ae = si.u16char(0xd83d) .. si.u16char(0xdcae), u1f305 = si.u16char(0xd83c) .. si.u16char(0xdf05), u1f4eb = si.u16char(0xd83d) .. si.u16char(0xdceb), u1f509 = si.u16char(0xd83d) .. si.u16char(0xdd09), u274c = si.u16char(0x274c), u1f419 = si.u16char(0xd83d) .. si.u16char(0xdc19), u2693_fe0f = si.u16char(0x2693), u1f3c3 = si.u16char(0xd83c) .. si.u16char(0xdfc3), u1f4be = si.u16char(0xd83d) .. si.u16char(0xdcbe), u1f238 = si.u16char(0xd83c) .. si.u16char(0xde38), u1f33f = si.u16char(0xd83c) .. si.u16char(0xdf3f), u1f413 = si.u16char(0xd83d) .. si.u16char(0xdc13), u1f366 = si.u16char(0xd83c) .. si.u16char(0xdf66), u1f36a = si.u16char(0xd83c) .. si.u16char(0xdf6a), u1f30c = si.u16char(0xd83c) .. si.u16char(0xdf0c), u1f43c = si.u16char(0xd83d) .. si.u16char(0xdc3c), u1f19a = si.u16char(0xd83c) .. si.u16char(0xdd9a), u1f42d = si.u16char(0xd83d) .. si.u16char(0xdc2d), u1f691 = si.u16char(0xd83d) .. si.u16char(0xde91), u1f69e = si.u16char(0xd83d) .. si.u16char(0xde9e), u1f38c = si.u16char(0xd83c) .. si.u16char(0xdf8c), u1f53a = si.u16char(0xd83d) .. si.u16char(0xdd3a), u1f64a = si.u16char(0xd83d) .. si.u16char(0xde4a), u0031_fe0f_20e3 = si.u16char(0x0031) .. si.u16char(0x20e3), u1f46c = si.u16char(0xd83d) .. si.u16char(0xdc6c), u1f461 = si.u16char(0xd83d) .. si.u16char(0xdc61), u1f696 = si.u16char(0xd83d) .. si.u16char(0xde96), u2663_fe0f = si.u16char(0x2663), u0032_fe0f_20e3 = si.u16char(0x0032) .. si.u16char(0x20e3), u0032 = si.u16char(0x0032), u1f618 = si.u16char(0xd83d) .. si.u16char(0xde18), u1f6ad = si.u16char(0xd83d) .. si.u16char(0xdead), u1f6b2 = si.u16char(0xd83d) .. si.u16char(0xdeb2), u1f493 = si.u16char(0xd83d) .. si.u16char(0xdc93), u2651_fe0f = si.u16char(0x2651), u1f4d4 = si.u16char(0xd83d) .. si.u16char(0xdcd4), u1f44d = si.u16char(0xd83d) .. si.u16char(0xdc4d), u1f307 = si.u16char(0xd83c) .. si.u16char(0xdf07), u1f31f = si.u16char(0xd83c) .. si.u16char(0xdf1f), u1f345 = si.u16char(0xd83c) .. si.u16char(0xdf45), u1f50d = si.u16char(0xd83d) .. si.u16char(0xdd0d), u1f43a = si.u16char(0xd83d) .. si.u16char(0xdc3a), u1f4f0 = si.u16char(0xd83d) .. si.u16char(0xdcf0), u1f171 = si.u16char(0xd83c) .. si.u16char(0xdd71), u1f534 = si.u16char(0xd83d) .. si.u16char(0xdd34), u1f4f1 = si.u16char(0xd83d) .. si.u16char(0xdcf1), u1f342 = si.u16char(0xd83c) .. si.u16char(0xdf42), u1f434 = si.u16char(0xd83d) .. si.u16char(0xdc34), u1f1f0_1f1f7 = si.u16char(0xd83c) .. si.u16char(0xddf0) .. si.u16char(0xd83c) .. si.u16char(0xddf7), u2733_fe0f = si.u16char(0x2733), u1f1ef_1f1f5 = si.u16char(0xd83c) .. si.u16char(0xddef) .. si.u16char(0xd83c) .. si.u16char(0xddf5), u1f507 = si.u16char(0xd83d) .. si.u16char(0xdd07), u1f563 = si.u16char(0xd83d) .. si.u16char(0xdd63), u1f22f_fe0f = si.u16char(0xd83c) .. si.u16char(0xde2f), u1f4cf = si.u16char(0xd83d) .. si.u16char(0xdccf), u0034 = si.u16char(0x0034), u26fa_fe0f = si.u16char(0x26fa), u1f619 = si.u16char(0xd83d) .. si.u16char(0xde19), } PK n5:Q8<$5assets/emoji_unicode_since_6.lua.pngUT n_n_n_ WГWГWГrequire "smartinput" local P = {} P._G = _G if _REQUIREDNAME == nil then emoji_unicode_since_6 = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local si = _G.smartinput emoji_list = { u1f37c = si.u16char(0xd83c) .. si.u16char(0xdf7c), u1f312 = si.u16char(0xd83c) .. si.u16char(0xdf12), u1f4c9 = si.u16char(0xd83d) .. si.u16char(0xdcc9), u1f64e = si.u16char(0xd83d) .. si.u16char(0xde4e), u1f194 = si.u16char(0xd83c) .. si.u16char(0xdd94), u26bd_fe0f = si.u16char(0x26bd), u1f471 = si.u16char(0xd83d) .. si.u16char(0xdc71), u1f3b0 = si.u16char(0xd83c) .. si.u16char(0xdfb0), u1f566 = si.u16char(0xd83d) .. si.u16char(0xdd66), u1f4f4 = si.u16char(0xd83d) .. si.u16char(0xdcf4), u2649_fe0f = si.u16char(0x2649), u263a_fe0f = si.u16char(0x263a), u1f5ff = si.u16char(0xd83d) .. si.u16char(0xddff), u1f4b0 = si.u16char(0xd83d) .. si.u16char(0xdcb0), u1f408 = si.u16char(0xd83d) .. si.u16char(0xdc08), u0038 = si.u16char(0x0038), u1f1ec_1f1e7 = si.u16char(0xd83c) .. si.u16char(0xddec) .. si.u16char(0xd83c) .. si.u16char(0xdde7), u1f3f0 = si.u16char(0xd83c) .. si.u16char(0xdff0), u2196_fe0f = si.u16char(0x2196), u23ea = si.u16char(0x23ea), u1f196 = si.u16char(0xd83c) .. si.u16char(0xdd96), u1f646 = si.u16char(0xd83d) .. si.u16char(0xde46), u1f604 = si.u16char(0xd83d) .. si.u16char(0xde04), u1f4ca = si.u16char(0xd83d) .. si.u16char(0xdcca), u1f391 = si.u16char(0xd83c) .. si.u16char(0xdf91), u231a_fe0f = si.u16char(0x231a), u1f51d = si.u16char(0xd83d) .. si.u16char(0xdd1d), u1f4f2 = si.u16char(0xd83d) .. si.u16char(0xdcf2), u1f198 = si.u16char(0xd83c) .. si.u16char(0xdd98), u1f483 = si.u16char(0xd83d) .. si.u16char(0xdc83), u1f62e = si.u16char(0xd83d) .. si.u16char(0xde2e), u1f523 = si.u16char(0xd83d) .. si.u16char(0xdd23), u1f4c6 = si.u16char(0xd83d) .. si.u16char(0xdcc6), u1f63f = si.u16char(0xd83d) .. si.u16char(0xde3f), u1f3b2 = si.u16char(0xd83c) .. si.u16char(0xdfb2), u1f417 = si.u16char(0xd83d) .. si.u16char(0xdc17), u1f430 = si.u16char(0xd83d) .. si.u16char(0xdc30), u1f35c = si.u16char(0xd83c) .. si.u16char(0xdf5c), u1f501 = si.u16char(0xd83d) .. si.u16char(0xdd01), u1f47f = si.u16char(0xd83d) .. si.u16char(0xdc7f), u1f52a = si.u16char(0xd83d) .. si.u16char(0xdd2a), u1f51b = si.u16char(0xd83d) .. si.u16char(0xdd1b), u1f605 = si.u16char(0xd83d) .. si.u16char(0xde05), u1f463 = si.u16char(0xd83d) .. si.u16char(0xdc63), u1f61d = si.u16char(0xd83d) .. si.u16char(0xde1d), u1f4e2 = si.u16char(0xd83d) .. si.u16char(0xdce2), u1f48b = si.u16char(0xd83d) .. si.u16char(0xdc8b), u26fd_fe0f = si.u16char(0x26fd), u1f401 = si.u16char(0xd83d) .. si.u16char(0xdc01), u26be_fe0f = si.u16char(0x26be), u0035 = si.u16char(0x0035), u1f22f = si.u16char(0xd83c) .. si.u16char(0xde2f), u1f320 = si.u16char(0xd83c) .. si.u16char(0xdf20), u1f614 = si.u16char(0xd83d) .. si.u16char(0xde14), u2199_fe0f = si.u16char(0x2199), u1f3b4 = si.u16char(0xd83c) .. si.u16char(0xdfb4), u1f376 = si.u16char(0xd83c) .. si.u16char(0xdf76), u1f3ad = si.u16char(0xd83c) .. si.u16char(0xdfad), u1f3ae = si.u16char(0xd83c) .. si.u16char(0xdfae), u1f384 = si.u16char(0xd83c) .. si.u16char(0xdf84), u27b0 = si.u16char(0x27b0), u3299_fe0f = si.u16char(0x3299), u1f60d = si.u16char(0xd83d) .. si.u16char(0xde0d), u1f685 = si.u16char(0xd83d) .. si.u16char(0xde85), u1f482 = si.u16char(0xd83d) .. si.u16char(0xdc82), u1f630 = si.u16char(0xd83d) .. si.u16char(0xde30), u1f4a1 = si.u16char(0xd83d) .. si.u16char(0xdca1), u1f316 = si.u16char(0xd83c) .. si.u16char(0xdf16), u1f447 = si.u16char(0xd83d) .. si.u16char(0xdc47), u25fc_fe0f = si.u16char(0x25fc), u1f48e = si.u16char(0xd83d) .. si.u16char(0xdc8e), u1f478 = si.u16char(0xd83d) .. si.u16char(0xdc78), u1f437 = si.u16char(0xd83d) .. si.u16char(0xdc37), u1f4b3 = si.u16char(0xd83d) .. si.u16char(0xdcb3), u2747_fe0f = si.u16char(0x2747), u1f6c3 = si.u16char(0xd83d) .. si.u16char(0xdec3), u1f31b = si.u16char(0xd83c) .. si.u16char(0xdf1b), u25ab_fe0f = si.u16char(0x25ab), u1f554 = si.u16char(0xd83d) .. si.u16char(0xdd54), u1f30f = si.u16char(0xd83c) .. si.u16char(0xdf0f), u1f446 = si.u16char(0xd83d) .. si.u16char(0xdc46), u1f4b7 = si.u16char(0xd83d) .. si.u16char(0xdcb7), u1f4d3 = si.u16char(0xd83d) .. si.u16char(0xdcd3), u1f64b = si.u16char(0xd83d) .. si.u16char(0xde4b), u1f616 = si.u16char(0xd83d) .. si.u16char(0xde16), u1f427 = si.u16char(0xd83d) .. si.u16char(0xdc27), u2600_fe0f = si.u16char(0x2600), u1f4e3 = si.u16char(0xd83d) .. si.u16char(0xdce3), u1f638 = si.u16char(0xd83d) .. si.u16char(0xde38), u1f53b = si.u16char(0xd83d) .. si.u16char(0xdd3b), u1f557 = si.u16char(0xd83d) .. si.u16char(0xdd57), u1f624 = si.u16char(0xd83d) .. si.u16char(0xde24), u1f6ac = si.u16char(0xd83d) .. si.u16char(0xdeac), u1f68d = si.u16char(0xd83d) .. si.u16char(0xde8d), u1f5fc = si.u16char(0xd83d) .. si.u16char(0xddfc), u270b = si.u16char(0x270b), u2795 = si.u16char(0x2795), u1f692 = si.u16char(0xd83d) .. si.u16char(0xde92), u1f3aa = si.u16char(0xd83c) .. si.u16char(0xdfaa), u1f3b3 = si.u16char(0xd83c) .. si.u16char(0xdfb3), u1f4bf = si.u16char(0xd83d) .. si.u16char(0xdcbf), u1f4af = si.u16char(0xd83d) .. si.u16char(0xdcaf), u1f477 = si.u16char(0xd83d) .. si.u16char(0xdc77), u261d_fe0f = si.u16char(0x261d), u1f350 = si.u16char(0xd83c) .. si.u16char(0xdf50), u2b50_fe0f = si.u16char(0x2b50), u1f6c4 = si.u16char(0xd83d) .. si.u16char(0xdec4), u1f378 = si.u16char(0xd83c) .. si.u16char(0xdf78), u2652_fe0f = si.u16char(0x2652), u1f4e5 = si.u16char(0xd83d) .. si.u16char(0xdce5), u1f4ea = si.u16char(0xd83d) .. si.u16char(0xdcea), u1f621 = si.u16char(0xd83d) .. si.u16char(0xde21), u1f481 = si.u16char(0xd83d) .. si.u16char(0xdc81), u1f35d = si.u16char(0xd83c) .. si.u16char(0xdf5d), u1f420 = si.u16char(0xd83d) .. si.u16char(0xdc20), u1f306 = si.u16char(0xd83c) .. si.u16char(0xdf06), u1f47d = si.u16char(0xd83d) .. si.u16char(0xdc7d), u1f5fe = si.u16char(0xd83d) .. si.u16char(0xddfe), u23eb = si.u16char(0x23eb), u1f331 = si.u16char(0xd83c) .. si.u16char(0xdf31), u2194_fe0f = si.u16char(0x2194), u27a1_fe0f = si.u16char(0x27a1), u1f41a = si.u16char(0xd83d) .. si.u16char(0xdc1a), u1f487 = si.u16char(0xd83d) .. si.u16char(0xdc87), u1f309 = si.u16char(0xd83c) .. si.u16char(0xdf09), u1f55e = si.u16char(0xd83d) .. si.u16char(0xdd5e), u1f3c8 = si.u16char(0xd83c) .. si.u16char(0xdfc8), u1f4e6 = si.u16char(0xd83d) .. si.u16char(0xdce6), u1f4df = si.u16char(0xd83d) .. si.u16char(0xdcdf), u1f4a7 = si.u16char(0xd83d) .. si.u16char(0xdca7), u1f1eb_1f1f7 = si.u16char(0xd83c) .. si.u16char(0xddeb) .. si.u16char(0xd83c) .. si.u16char(0xddf7), u1f4c2 = si.u16char(0xd83d) .. si.u16char(0xdcc2), u1f609 = si.u16char(0xd83d) .. si.u16char(0xde09), u2611_fe0f = si.u16char(0x2611), u1f375 = si.u16char(0xd83c) .. si.u16char(0xdf75), u1f4cd = si.u16char(0xd83d) .. si.u16char(0xdccd), u2660_fe0f = si.u16char(0x2660), u1f416 = si.u16char(0xd83d) .. si.u16char(0xdc16), u1f429 = si.u16char(0xd83d) .. si.u16char(0xdc29), u1f38e = si.u16char(0xd83c) .. si.u16char(0xdf8e), u1f41b = si.u16char(0xd83d) .. si.u16char(0xdc1b), u1f456 = si.u16char(0xd83d) .. si.u16char(0xdc56), u1f4d5 = si.u16char(0xd83d) .. si.u16char(0xdcd5), u1f4db = si.u16char(0xd83d) .. si.u16char(0xdcdb), u1f170 = si.u16char(0xd83c) .. si.u16char(0xdd70), u1f377 = si.u16char(0xd83c) .. si.u16char(0xdf77), u1f473 = si.u16char(0xd83d) .. si.u16char(0xdc73), u1f3a4 = si.u16char(0xd83c) .. si.u16char(0xdfa4), u1f457 = si.u16char(0xd83d) .. si.u16char(0xdc57), u1f5fd = si.u16char(0xd83d) .. si.u16char(0xddfd), u1f442 = si.u16char(0xd83d) .. si.u16char(0xdc42), u1f61b = si.u16char(0xd83d) .. si.u16char(0xde1b), u1f3e6 = si.u16char(0xd83c) .. si.u16char(0xdfe6), u1f4d7 = si.u16char(0xd83d) .. si.u16char(0xdcd7), u1f45c = si.u16char(0xd83d) .. si.u16char(0xdc5c), u1f538 = si.u16char(0xd83d) .. si.u16char(0xdd38), u1f33b = si.u16char(0xd83c) .. si.u16char(0xdf3b), u26f3_fe0f = si.u16char(0x26f3), u1f4fa = si.u16char(0xd83d) .. si.u16char(0xdcfa), u1f4c0 = si.u16char(0xd83d) .. si.u16char(0xdcc0), u1f40f = si.u16char(0xd83d) .. si.u16char(0xdc0f), u1f4a9 = si.u16char(0xd83d) .. si.u16char(0xdca9), u1f4a5 = si.u16char(0xd83d) .. si.u16char(0xdca5), u1f640 = si.u16char(0xd83d) .. si.u16char(0xde40), u1f388 = si.u16char(0xd83c) .. si.u16char(0xdf88), u1f528 = si.u16char(0xd83d) .. si.u16char(0xdd28), u1f38d = si.u16char(0xd83c) .. si.u16char(0xdf8d), u0033 = si.u16char(0x0033), u1f512 = si.u16char(0xd83d) .. si.u16char(0xdd12), u1f6a0 = si.u16char(0xd83d) .. si.u16char(0xdea0), u1f43b = si.u16char(0xd83d) .. si.u16char(0xdc3b), u1f518 = si.u16char(0xd83d) .. si.u16char(0xdd18), u1f629 = si.u16char(0xd83d) .. si.u16char(0xde29), u1f693 = si.u16char(0xd83d) .. si.u16char(0xde93), u1f607 = si.u16char(0xd83d) .. si.u16char(0xde07), u1f31a = si.u16char(0xd83c) .. si.u16char(0xdf1a), u3297_fe0f = si.u16char(0x3297), u0036_fe0f_20e3 = si.u16char(0x0036) .. si.u16char(0x20e3), u1f1e8_1f1f3 = si.u16char(0xd83c) .. si.u16char(0xdde8) .. si.u16char(0xd83c) .. si.u16char(0xddf3), u1f432 = si.u16char(0xd83d) .. si.u16char(0xdc32), u1f34e = si.u16char(0xd83c) .. si.u16char(0xdf4e), u23ec = si.u16char(0x23ec), u1f6be = si.u16char(0xd83d) .. si.u16char(0xdebe), u1f6a8 = si.u16char(0xd83d) .. si.u16char(0xdea8), u1f60e = si.u16char(0xd83d) .. si.u16char(0xde0e), u1f470 = si.u16char(0xd83d) .. si.u16char(0xdc70), u1f491 = si.u16char(0xd83d) .. si.u16char(0xdc91), u1f68a = si.u16char(0xd83d) .. si.u16char(0xde8a), u1f191 = si.u16char(0xd83c) .. si.u16char(0xdd91), u1f6b5 = si.u16char(0xd83d) .. si.u16char(0xdeb5), u1f232 = si.u16char(0xd83c) .. si.u16char(0xde32), u1f60b = si.u16char(0xd83d) .. si.u16char(0xde0b), u2197_fe0f = si.u16char(0x2197), u1f64d = si.u16char(0xd83d) .. si.u16char(0xde4d), u1f462 = si.u16char(0xd83d) .. si.u16char(0xdc62), u1f31e = si.u16char(0xd83c) .. si.u16char(0xdf1e), u1f4c1 = si.u16char(0xd83d) .. si.u16char(0xdcc1), u1f698 = si.u16char(0xd83d) .. si.u16char(0xde98), u1f3bf = si.u16char(0xd83c) .. si.u16char(0xdfbf), u1f450 = si.u16char(0xd83d) .. si.u16char(0xdc50), u1f4aa = si.u16char(0xd83d) .. si.u16char(0xdcaa), u1f3a3 = si.u16char(0xd83c) .. si.u16char(0xdfa3), u1f35e = si.u16char(0xd83c) .. si.u16char(0xdf5e), u1f50a = si.u16char(0xd83d) .. si.u16char(0xdd0a), u1f3af = si.u16char(0xd83c) .. si.u16char(0xdfaf), u1f351 = si.u16char(0xd83c) .. si.u16char(0xdf51), u1f3b6 = si.u16char(0xd83c) .. si.u16char(0xdfb6), u0039 = si.u16char(0x0039), u1f4bd = si.u16char(0xd83d) .. si.u16char(0xdcbd), u2668_fe0f = si.u16char(0x2668), u2614_fe0f = si.u16char(0x2614), u1f5fb = si.u16char(0xd83d) .. si.u16char(0xddfb), u1f34f = si.u16char(0xd83c) .. si.u16char(0xdf4f), u1f36e = si.u16char(0xd83c) .. si.u16char(0xdf6e), u1f354 = si.u16char(0xd83c) .. si.u16char(0xdf54), u1f52c = si.u16char(0xd83d) .. si.u16char(0xdd2c), u23f3 = si.u16char(0x23f3), u1f38b = si.u16char(0xd83c) .. si.u16char(0xdf8b), u1f517 = si.u16char(0xd83d) .. si.u16char(0xdd17), u1f4b9 = si.u16char(0xd83d) .. si.u16char(0xdcb9), u1f4d8 = si.u16char(0xd83d) .. si.u16char(0xdcd8), u1f402 = si.u16char(0xd83d) .. si.u16char(0xdc02), u1f520 = si.u16char(0xd83d) .. si.u16char(0xdd20), u1f3c9 = si.u16char(0xd83c) .. si.u16char(0xdfc9), u1f3ab = si.u16char(0xd83c) .. si.u16char(0xdfab), u1f4f3 = si.u16char(0xd83d) .. si.u16char(0xdcf3), u1f63b = si.u16char(0xd83d) .. si.u16char(0xde3b), u1f3bd = si.u16char(0xd83c) .. si.u16char(0xdfbd), u26f2_fe0f = si.u16char(0x26f2), u1f352 = si.u16char(0xd83c) .. si.u16char(0xdf52), u1f3a0 = si.u16char(0xd83c) .. si.u16char(0xdfa0), u1f40c = si.u16char(0xd83d) .. si.u16char(0xdc0c), u1f436 = si.u16char(0xd83d) .. si.u16char(0xdc36), u1f3a5 = si.u16char(0xd83c) .. si.u16char(0xdfa5), u1f631 = si.u16char(0xd83d) .. si.u16char(0xde31), u1f31c = si.u16char(0xd83c) .. si.u16char(0xdf1c), u1f4d6 = si.u16char(0xd83d) .. si.u16char(0xdcd6), u1f4f9 = si.u16char(0xd83d) .. si.u16char(0xdcf9), u1f51e = si.u16char(0xd83d) .. si.u16char(0xdd1e), u1f6b1 = si.u16char(0xd83d) .. si.u16char(0xdeb1), u1f6bd = si.u16char(0xd83d) .. si.u16char(0xdebd), u1f40e = si.u16char(0xd83d) .. si.u16char(0xdc0e), u1f467 = si.u16char(0xd83d) .. si.u16char(0xdc67), u1f0cf = si.u16char(0xd83c) .. si.u16char(0xdccf), u1f3ea = si.u16char(0xd83c) .. si.u16char(0xdfea), u264c_fe0f = si.u16char(0x264c), u1f368 = si.u16char(0xd83c) .. si.u16char(0xdf68), u1f4b8 = si.u16char(0xd83d) .. si.u16char(0xdcb8), u1f529 = si.u16char(0xd83d) .. si.u16char(0xdd29), u1f634 = si.u16char(0xd83d) .. si.u16char(0xde34), u1f233 = si.u16char(0xd83c) .. si.u16char(0xde33), u1f506 = si.u16char(0xd83d) .. si.u16char(0xdd06), u1f48a = si.u16char(0xd83d) .. si.u16char(0xdc8a), u1f335 = si.u16char(0xd83c) .. si.u16char(0xdf35), u1f4bb = si.u16char(0xd83d) .. si.u16char(0xdcbb), u1f524 = si.u16char(0xd83d) .. si.u16char(0xdd24), u1f55a = si.u16char(0xd83d) .. si.u16char(0xdd5a), u1f6bc = si.u16char(0xd83d) .. si.u16char(0xdebc), u1f639 = si.u16char(0xd83d) .. si.u16char(0xde39), u1f556 = si.u16char(0xd83d) .. si.u16char(0xdd56), u1f364 = si.u16char(0xd83c) .. si.u16char(0xdf64), u1f237 = si.u16char(0xd83c) .. si.u16char(0xde37), u1f3be = si.u16char(0xd83c) .. si.u16char(0xdfbe), u1f690 = si.u16char(0xd83d) .. si.u16char(0xde90), u1f49f = si.u16char(0xd83d) .. si.u16char(0xdc9f), u1f315 = si.u16char(0xd83c) .. si.u16char(0xdf15), u1f499 = si.u16char(0xd83d) .. si.u16char(0xdc99), u1f443 = si.u16char(0xd83d) .. si.u16char(0xdc43), u1f610 = si.u16char(0xd83d) .. si.u16char(0xde10), u1f40b = si.u16char(0xd83d) .. si.u16char(0xdc0b), u1f250 = si.u16char(0xd83c) .. si.u16char(0xde50), u2796 = si.u16char(0x2796), u1f648 = si.u16char(0xd83d) .. si.u16char(0xde48), u1f3ca = si.u16char(0xd83c) .. si.u16char(0xdfca), u1f404 = si.u16char(0xd83d) .. si.u16char(0xdc04), u1f3e3 = si.u16char(0xd83c) .. si.u16char(0xdfe3), u1f60c = si.u16char(0xd83d) .. si.u16char(0xde0c), u1f50e = si.u16char(0xd83d) .. si.u16char(0xdd0e), u1f63c = si.u16char(0xd83d) .. si.u16char(0xde3c), u1f42e = si.u16char(0xd83d) .. si.u16char(0xdc2e), u1f49c = si.u16char(0xd83d) .. si.u16char(0xdc9c), u1f386 = si.u16char(0xd83c) .. si.u16char(0xdf86), u2702_fe0f = si.u16char(0x2702), u1f38f = si.u16char(0xd83c) .. si.u16char(0xdf8f), u25c0_fe0f = si.u16char(0x25c0), u1f4ba = si.u16char(0xd83d) .. si.u16char(0xdcba), u1f317 = si.u16char(0xd83c) .. si.u16char(0xdf17), u1f522 = si.u16char(0xd83d) .. si.u16char(0xdd22), u25fb_fe0f = si.u16char(0x25fb), u1f195 = si.u16char(0xd83c) .. si.u16char(0xdd95), u1f511 = si.u16char(0xd83d) .. si.u16char(0xdd11), u1f42f = si.u16char(0xd83d) .. si.u16char(0xdc2f), u1f61a = si.u16char(0xd83d) .. si.u16char(0xde1a), u1f539 = si.u16char(0xd83d) .. si.u16char(0xdd39), u2714_fe0f = si.u16char(0x2714), u1f333 = si.u16char(0xd83c) .. si.u16char(0xdf33), u1f699 = si.u16char(0xd83d) .. si.u16char(0xde99), u1f319 = si.u16char(0xd83c) .. si.u16char(0xdf19), u1f3c2 = si.u16char(0xd83c) .. si.u16char(0xdfc2), u2049_fe0f = si.u16char(0x2049), u1f459 = si.u16char(0xd83d) .. si.u16char(0xdc59), u1f504 = si.u16char(0xd83d) .. si.u16char(0xdd04), u1f458 = si.u16char(0xd83d) .. si.u16char(0xdc58), u1f510 = si.u16char(0xd83d) .. si.u16char(0xdd10), u1f6ab = si.u16char(0xd83d) .. si.u16char(0xdeab), u1f51c = si.u16char(0xd83d) .. si.u16char(0xdd1c), u2764_fe0f = si.u16char(0x2764), u1f49d = si.u16char(0xd83d) .. si.u16char(0xdc9d), u1f49b = si.u16char(0xd83d) .. si.u16char(0xdc9b), u1f6ae = si.u16char(0xd83d) .. si.u16char(0xdeae), u1f4da = si.u16char(0xd83d) .. si.u16char(0xdcda), u1f63a = si.u16char(0xd83d) .. si.u16char(0xde3a), u1f695 = si.u16char(0xd83d) .. si.u16char(0xde95), u2716_fe0f = si.u16char(0x2716), u1f422 = si.u16char(0xd83d) .. si.u16char(0xdc22), u1f1e9_1f1ea = si.u16char(0xd83c) .. si.u16char(0xdde9) .. si.u16char(0xd83c) .. si.u16char(0xddea), u2754 = si.u16char(0x2754), u1f47c = si.u16char(0xd83d) .. si.u16char(0xdc7c), u1f62f = si.u16char(0xd83d) .. si.u16char(0xde2f), u1f452 = si.u16char(0xd83d) .. si.u16char(0xdc52), u0033_fe0f_20e3 = si.u16char(0x0033) .. si.u16char(0x20e3), u1f69f = si.u16char(0xd83d) .. si.u16char(0xde9f), u1f383 = si.u16char(0xd83c) .. si.u16char(0xdf83), u1f30b = si.u16char(0xd83c) .. si.u16char(0xdf0b), u1f36f = si.u16char(0xd83c) .. si.u16char(0xdf6f), u1f340 = si.u16char(0xd83c) .. si.u16char(0xdf40), u1f52f = si.u16char(0xd83d) .. si.u16char(0xdd2f), u1f3ba = si.u16char(0xd83c) .. si.u16char(0xdfba), u2705 = si.u16char(0x2705), u1f46f = si.u16char(0xd83d) .. si.u16char(0xdc6f), u1f43d = si.u16char(0xd83d) .. si.u16char(0xdc3d), u1f400 = si.u16char(0xd83d) .. si.u16char(0xdc00), u1f371 = si.u16char(0xd83c) .. si.u16char(0xdf71), u270f_fe0f = si.u16char(0x270f), u23e9 = si.u16char(0x23e9), u1f492 = si.u16char(0xd83d) .. si.u16char(0xdc92), u25b6_fe0f = si.u16char(0x25b6), u1f346 = si.u16char(0xd83c) .. si.u16char(0xdf46), u1f4b5 = si.u16char(0xd83d) .. si.u16char(0xdcb5), u1f197 = si.u16char(0xd83c) .. si.u16char(0xdd97), u1f42a = si.u16char(0xd83d) .. si.u16char(0xdc2a), u2797 = si.u16char(0x2797), u1f68c = si.u16char(0xd83d) .. si.u16char(0xde8c), u1f313 = si.u16char(0xd83c) .. si.u16char(0xdf13), u23f0 = si.u16char(0x23f0), u1f61f = si.u16char(0xd83d) .. si.u16char(0xde1f), u0031 = si.u16char(0x0031), u1f37a = si.u16char(0xd83c) .. si.u16char(0xdf7a), u1f6b4 = si.u16char(0xd83d) .. si.u16char(0xdeb4), u1f68e = si.u16char(0xd83d) .. si.u16char(0xde8e), u1f390 = si.u16char(0xd83c) .. si.u16char(0xdf90), u1f3c1 = si.u16char(0xd83c) .. si.u16char(0xdfc1), u1f475 = si.u16char(0xd83d) .. si.u16char(0xdc75), u0035_fe0f_20e3 = si.u16char(0x0035) .. si.u16char(0x20e3), u1f521 = si.u16char(0xd83d) .. si.u16char(0xdd21), u1f18e = si.u16char(0xd83c) .. si.u16char(0xdd8e), u1f4e4 = si.u16char(0xd83d) .. si.u16char(0xdce4), u1f47e = si.u16char(0xd83d) .. si.u16char(0xdc7e), u1f4e9 = si.u16char(0xd83d) .. si.u16char(0xdce9), u1f347 = si.u16char(0xd83c) .. si.u16char(0xdf47), u1f409 = si.u16char(0xd83d) .. si.u16char(0xdc09), u2b1c_fe0f = si.u16char(0x2b1c), u1f425 = si.u16char(0xd83d) .. si.u16char(0xdc25), u1f689 = si.u16char(0xd83d) .. si.u16char(0xde89), u1f69a = si.u16char(0xd83d) .. si.u16char(0xde9a), u1f234 = si.u16char(0xd83c) .. si.u16char(0xde34), u1f343 = si.u16char(0xd83c) .. si.u16char(0xdf43), u1f606 = si.u16char(0xd83d) .. si.u16char(0xde06), u1f6b7 = si.u16char(0xd83d) .. si.u16char(0xdeb7), u1f17e = si.u16char(0xd83c) .. si.u16char(0xdd7e), u1f620 = si.u16char(0xd83d) .. si.u16char(0xde20), u1f311 = si.u16char(0xd83c) .. si.u16char(0xdf11), u1f33e = si.u16char(0xd83c) .. si.u16char(0xdf3e), u1f612 = si.u16char(0xd83d) .. si.u16char(0xde12), u2650_fe0f = si.u16char(0x2650), u1f532 = si.u16char(0xd83d) .. si.u16char(0xdd32), u1f42b = si.u16char(0xd83d) .. si.u16char(0xdc2b), u1f536 = si.u16char(0xd83d) .. si.u16char(0xdd36), u1f617 = si.u16char(0xd83d) .. si.u16char(0xde17), u1f4c7 = si.u16char(0xd83d) .. si.u16char(0xdcc7), u1f4c4 = si.u16char(0xd83d) .. si.u16char(0xdcc4), u1f68b = si.u16char(0xd83d) .. si.u16char(0xde8b), u1f48f = si.u16char(0xd83d) .. si.u16char(0xdc8f), u1f3bb = si.u16char(0xd83c) .. si.u16char(0xdfbb), u1f251 = si.u16char(0xd83c) .. si.u16char(0xde51), u1f535 = si.u16char(0xd83d) .. si.u16char(0xdd35), u1f411 = si.u16char(0xd83d) .. si.u16char(0xdc11), u1f485 = si.u16char(0xd83d) .. si.u16char(0xdc85), u1f51a = si.u16char(0xd83d) .. si.u16char(0xdd1a), u2653_fe0f = si.u16char(0x2653), u1f4e0 = si.u16char(0xd83d) .. si.u16char(0xdce0), u1f301 = si.u16char(0xd83c) .. si.u16char(0xdf01), u1f3c7 = si.u16char(0xd83c) .. si.u16char(0xdfc7), u1f45b = si.u16char(0xd83d) .. si.u16char(0xdc5b), u2b55_fe0f = si.u16char(0x2b55), u1f3ef = si.u16char(0xd83c) .. si.u16char(0xdfef), u1f551 = si.u16char(0xd83d) .. si.u16char(0xdd51), u1f236 = si.u16char(0xd83c) .. si.u16char(0xde36), u1f47b = si.u16char(0xd83d) .. si.u16char(0xdc7b), u1f48c = si.u16char(0xd83d) .. si.u16char(0xdc8c), u1f615 = si.u16char(0xd83d) .. si.u16char(0xde15), u2744_fe0f = si.u16char(0x2744), u1f46e = si.u16char(0xd83d) .. si.u16char(0xdc6e), u264e_fe0f = si.u16char(0x264e), u1f36c = si.u16char(0xd83c) .. si.u16char(0xdf6c), u1f367 = si.u16char(0xd83c) .. si.u16char(0xdf67), u24c2_fe0f = si.u16char(0x24c2), u1f6b6 = si.u16char(0xd83d) .. si.u16char(0xdeb6), u1f525 = si.u16char(0xd83d) .. si.u16char(0xdd25), u1f3e9 = si.u16char(0xd83c) .. si.u16char(0xdfe9), u2601_fe0f = si.u16char(0x2601), u1f559 = si.u16char(0xd83d) .. si.u16char(0xdd59), u1f626 = si.u16char(0xd83d) .. si.u16char(0xde26), u1f421 = si.u16char(0xd83d) .. si.u16char(0xdc21), u1f338 = si.u16char(0xd83c) .. si.u16char(0xdf38), u2728 = si.u16char(0x2728), u1f69c = si.u16char(0xd83d) .. si.u16char(0xde9c), u1f6bf = si.u16char(0xd83d) .. si.u16char(0xdebf), u1f38a = si.u16char(0xd83c) .. si.u16char(0xdf8a), u1f303 = si.u16char(0xd83c) .. si.u16char(0xdf03), u1f357 = si.u16char(0xd83c) .. si.u16char(0xdf57), u1f4a2 = si.u16char(0xd83d) .. si.u16char(0xdca2), u1f479 = si.u16char(0xd83d) .. si.u16char(0xdc79), u1f382 = si.u16char(0xd83c) .. si.u16char(0xdf82), u1f453 = si.u16char(0xd83d) .. si.u16char(0xdc53), u1f392 = si.u16char(0xd83c) .. si.u16char(0xdf92), u1f52b = si.u16char(0xd83d) .. si.u16char(0xdd2b), u1f3b7 = si.u16char(0xd83c) .. si.u16char(0xdfb7), u1f4a6 = si.u16char(0xd83d) .. si.u16char(0xdca6), u2b07_fe0f = si.u16char(0x2b07), u1f6b0 = si.u16char(0xd83d) .. si.u16char(0xdeb0), u1f3e0 = si.u16char(0xd83c) .. si.u16char(0xdfe0), u1f558 = si.u16char(0xd83d) .. si.u16char(0xdd58), u1f505 = si.u16char(0xd83d) .. si.u16char(0xdd05), u1f526 = si.u16char(0xd83d) .. si.u16char(0xdd26), u1f480 = si.u16char(0xd83d) .. si.u16char(0xdc80), u1f3eb = si.u16char(0xd83c) .. si.u16char(0xdfeb), u1f3e2 = si.u16char(0xd83c) .. si.u16char(0xdfe2), u1f1f7_1f1fa = si.u16char(0xd83c) .. si.u16char(0xddf7) .. si.u16char(0xd83c) .. si.u16char(0xddfa), u1f47a = si.u16char(0xd83d) .. si.u16char(0xdc7a), u1f50c = si.u16char(0xd83d) .. si.u16char(0xdd0c), u0034_fe0f_20e3 = si.u16char(0x0034) .. si.u16char(0x20e3), u264a_fe0f = si.u16char(0x264a), u1f6aa = si.u16char(0xd83d) .. si.u16char(0xdeaa), u1f46a = si.u16char(0xd83d) .. si.u16char(0xdc6a), u1f6a5 = si.u16char(0xd83d) .. si.u16char(0xdea5), u1f45d = si.u16char(0xd83d) .. si.u16char(0xdc5d), u1f341 = si.u16char(0xd83c) .. si.u16char(0xdf41), u1f560 = si.u16char(0xd83d) .. si.u16char(0xdd60), u1f444 = si.u16char(0xd83d) .. si.u16char(0xdc44), u1f4d0 = si.u16char(0xd83d) .. si.u16char(0xdcd0), u1f1ea_1f1f8 = si.u16char(0xd83c) .. si.u16char(0xddea) .. si.u16char(0xd83c) .. si.u16char(0xddf8), u1f608 = si.u16char(0xd83d) .. si.u16char(0xde08), u231b_fe0f = si.u16char(0x231b), u1f502 = si.u16char(0xd83d) .. si.u16char(0xdd02), u1f414 = si.u16char(0xd83d) .. si.u16char(0xdc14), u1f623 = si.u16char(0xd83d) .. si.u16char(0xde23), u26c4_fe0f = si.u16char(0x26c4), u1f373 = si.u16char(0xd83c) .. si.u16char(0xdf73), u1f472 = si.u16char(0xd83d) .. si.u16char(0xdc72), u1f6b9 = si.u16char(0xd83d) .. si.u16char(0xdeb9), u1f628 = si.u16char(0xd83d) .. si.u16char(0xde28), u1f314 = si.u16char(0xd83c) .. si.u16char(0xdf14), u1f55c = si.u16char(0xd83d) .. si.u16char(0xdd5c), u1f50b = si.u16char(0xd83d) .. si.u16char(0xdd0b), u1f44c = si.u16char(0xd83d) .. si.u16char(0xdc4c), u1f412 = si.u16char(0xd83d) .. si.u16char(0xdc12), u1f4ad = si.u16char(0xd83d) .. si.u16char(0xdcad), u1f62b = si.u16char(0xd83d) .. si.u16char(0xde2b), u26a0_fe0f = si.u16char(0x26a0), u2934_fe0f = si.u16char(0x2934), u1f406 = si.u16char(0xd83d) .. si.u16char(0xdc06), u2b06_fe0f = si.u16char(0x2b06), u2b1b_fe0f = si.u16char(0x2b1b), u0038_fe0f_20e3 = si.u16char(0x0038) .. si.u16char(0x20e3), u2b05_fe0f = si.u16char(0x2b05), u1f344 = si.u16char(0xd83c) .. si.u16char(0xdf44), u1f530 = si.u16char(0xd83d) .. si.u16char(0xdd30), u1f21a = si.u16char(0xd83c) .. si.u16char(0xde1a), u1f496 = si.u16char(0xd83d) .. si.u16char(0xdc96), u1f4e7 = si.u16char(0xd83d) .. si.u16char(0xdce7), u1f4fb = si.u16char(0xd83d) .. si.u16char(0xdcfb), u1f4b1 = si.u16char(0xd83d) .. si.u16char(0xdcb1), u1f387 = si.u16char(0xd83c) .. si.u16char(0xdf87), u1f33c = si.u16char(0xd83c) .. si.u16char(0xdf3c), u270a = si.u16char(0x270a), u26ce = si.u16char(0x26ce), u26c5_fe0f = si.u16char(0x26c5), u1f515 = si.u16char(0xd83d) .. si.u16char(0xdd15), u1f687 = si.u16char(0xd83d) .. si.u16char(0xde87), u303d_fe0f = si.u16char(0x303d), u1f424 = si.u16char(0xd83d) .. si.u16char(0xdc24), u1f6c0 = si.u16char(0xd83d) .. si.u16char(0xdec0), u1f68f = si.u16char(0xd83d) .. si.u16char(0xde8f), u1f4cc = si.u16char(0xd83d) .. si.u16char(0xdccc), u1f4e8 = si.u16char(0xd83d) .. si.u16char(0xdce8), u1f53c = si.u16char(0xd83d) .. si.u16char(0xdd3c), u1f633 = si.u16char(0xd83d) .. si.u16char(0xde33), u1f415 = si.u16char(0xd83d) .. si.u16char(0xdc15), u1f4c8 = si.u16char(0xd83d) .. si.u16char(0xdcc8), u1f370 = si.u16char(0xd83c) .. si.u16char(0xdf70), u26f5_fe0f = si.u16char(0x26f5), u1f393 = si.u16char(0xd83c) .. si.u16char(0xdf93), u1f428 = si.u16char(0xd83d) .. si.u16char(0xdc28), u1f004 = si.u16char(0xd83c) .. si.u16char(0xdc04), u1f418 = si.u16char(0xd83d) .. si.u16char(0xdc18), u1f30e = si.u16char(0xd83c) .. si.u16char(0xdf0e), u1f484 = si.u16char(0xd83d) .. si.u16char(0xdc84), u1f454 = si.u16char(0xd83d) .. si.u16char(0xdc54), u1f356 = si.u16char(0xd83c) .. si.u16char(0xdf56), u1f476 = si.u16char(0xd83d) .. si.u16char(0xdc76), u1f632 = si.u16char(0xd83d) .. si.u16char(0xde32), u1f613 = si.u16char(0xd83d) .. si.u16char(0xde13), u1f464 = si.u16char(0xd83d) .. si.u16char(0xdc64), u1f405 = si.u16char(0xd83d) .. si.u16char(0xdc05), u1f602 = si.u16char(0xd83d) .. si.u16char(0xde02), u2648_fe0f = si.u16char(0x2648), u1f489 = si.u16char(0xd83d) .. si.u16char(0xdc89), u1f60f = si.u16char(0xd83d) .. si.u16char(0xde0f), u264d_fe0f = si.u16char(0x264d), u1f36d = si.u16char(0xd83c) .. si.u16char(0xdf6d), u1f35b = si.u16char(0xd83c) .. si.u16char(0xdf5b), u1f235 = si.u16char(0xd83c) .. si.u16char(0xde35), u1f3e4 = si.u16char(0xd83c) .. si.u16char(0xdfe4), u1f4a4 = si.u16char(0xd83d) .. si.u16char(0xdca4), u1f17f_fe0f = si.u16char(0xd83c) .. si.u16char(0xdd7f), u1f3a7 = si.u16char(0xd83c) .. si.u16char(0xdfa7), u1f3b9 = si.u16char(0xd83c) .. si.u16char(0xdfb9), u1f45e = si.u16char(0xd83d) .. si.u16char(0xdc5e), u1f239 = si.u16char(0xd83c) .. si.u16char(0xde39), u1f60a = si.u16char(0xd83d) .. si.u16char(0xde0a), u1f495 = si.u16char(0xd83d) .. si.u16char(0xdc95), u26ea_fe0f = si.u16char(0x26ea), u1f199 = si.u16char(0xd83c) .. si.u16char(0xdd99), u1f553 = si.u16char(0xd83d) .. si.u16char(0xdd53), u1f3ec = si.u16char(0xd83c) .. si.u16char(0xdfec), u1f4f7 = si.u16char(0xd83d) .. si.u16char(0xdcf7), u1f490 = si.u16char(0xd83d) .. si.u16char(0xdc90), u1f3c4 = si.u16char(0xd83c) .. si.u16char(0xdfc4), u1f4dd = si.u16char(0xd83d) .. si.u16char(0xdcdd), u1f688 = si.u16char(0xd83d) .. si.u16char(0xde88), u1f192 = si.u16char(0xd83c) .. si.u16char(0xdd92), u1f380 = si.u16char(0xd83c) .. si.u16char(0xdf80), u1f41d = si.u16char(0xd83d) .. si.u16char(0xdc1d), u1f46d = si.u16char(0xd83d) .. si.u16char(0xdc6d), u1f17f = si.u16char(0xd83c) .. si.u16char(0xdd7f), u1f486 = si.u16char(0xd83d) .. si.u16char(0xdc86), u1f497 = si.u16char(0xd83d) .. si.u16char(0xdc97), u1f349 = si.u16char(0xd83c) .. si.u16char(0xdf49), u26ab_fe0f = si.u16char(0x26ab), u1f3e5 = si.u16char(0xd83c) .. si.u16char(0xdfe5), u1f513 = si.u16char(0xd83d) .. si.u16char(0xdd13), u1f45f = si.u16char(0xd83d) .. si.u16char(0xdc5f), u2615_fe0f = si.u16char(0x2615), u1f363 = si.u16char(0xd83c) .. si.u16char(0xdf63), u21aa_fe0f = si.u16char(0x21aa), u1f683 = si.u16char(0xd83d) .. si.u16char(0xde83), u1f1fa_1f1f8 = si.u16char(0xd83c) .. si.u16char(0xddfa) .. si.u16char(0xd83c) .. si.u16char(0xddf8), u1f42c = si.u16char(0xd83d) .. si.u16char(0xdc2c), u1f6c1 = si.u16char(0xd83d) .. si.u16char(0xdec1), u0036 = si.u16char(0x0036), u1f51f = si.u16char(0xd83d) .. si.u16char(0xdd1f), u1f45a = si.u16char(0xd83d) .. si.u16char(0xdc5a), u1f694 = si.u16char(0xd83d) .. si.u16char(0xde94), u1f537 = si.u16char(0xd83d) .. si.u16char(0xdd37), u1f50f = si.u16char(0xd83d) .. si.u16char(0xdd0f), u1f6a4 = si.u16char(0xd83d) .. si.u16char(0xdea4), u1f355 = si.u16char(0xd83c) .. si.u16char(0xdf55), u267b_fe0f = si.u16char(0x267b), u1f469 = si.u16char(0xd83d) .. si.u16char(0xdc69), u1f468 = si.u16char(0xd83d) .. si.u16char(0xdc68), u1f4ab = si.u16char(0xd83d) .. si.u16char(0xdcab), u1f52d = si.u16char(0xd83d) .. si.u16char(0xdd2d), u1f361 = si.u16char(0xd83c) .. si.u16char(0xdf61), u1f4ce = si.u16char(0xd83d) .. si.u16char(0xdcce), u1f4ee = si.u16char(0xd83d) .. si.u16char(0xdcee), u1f4b4 = si.u16char(0xd83d) .. si.u16char(0xdcb4), u1f40a = si.u16char(0xd83d) .. si.u16char(0xdc0a), u1f426 = si.u16char(0xd83d) .. si.u16char(0xdc26), u26a1_fe0f = si.u16char(0x26a1), u1f1ee_1f1f9 = si.u16char(0xd83c) .. si.u16char(0xddee) .. si.u16char(0xd83c) .. si.u16char(0xddf9), u1f410 = si.u16char(0xd83d) .. si.u16char(0xdc10), u1f4f5 = si.u16char(0xd83d) .. si.u16char(0xdcf5), u1f4a0 = si.u16char(0xd83d) .. si.u16char(0xdca0), u00a9 = si.u16char(0x00a9), u2666_fe0f = si.u16char(0x2666), u1f6a3 = si.u16char(0xd83d) .. si.u16char(0xdea3), u2753 = si.u16char(0x2753), u1f359 = si.u16char(0xd83c) .. si.u16char(0xdf59), u1f449 = si.u16char(0xd83d) .. si.u16char(0xdc49), u1f4b6 = si.u16char(0xd83d) .. si.u16char(0xdcb6), u1f334 = si.u16char(0xd83c) .. si.u16char(0xdf34), u1f69b = si.u16char(0xd83d) .. si.u16char(0xde9b), u1f3a2 = si.u16char(0xd83c) .. si.u16char(0xdfa2), u25fe_fe0f = si.u16char(0x25fe), u1f682 = si.u16char(0xd83d) .. si.u16char(0xde82), u2935_fe0f = si.u16char(0x2935), u1f62a = si.u16char(0xd83d) .. si.u16char(0xde2a), u1f337 = si.u16char(0xd83c) .. si.u16char(0xdf37), u1f201 = si.u16char(0xd83c) .. si.u16char(0xde01), u1f645 = si.u16char(0xd83d) .. si.u16char(0xde45), u1f35a = si.u16char(0xd83c) .. si.u16char(0xdf5a), u2734_fe0f = si.u16char(0x2734), u1f552 = si.u16char(0xd83d) .. si.u16char(0xdd52), u1f4a8 = si.u16char(0xd83d) .. si.u16char(0xdca8), u0030 = si.u16char(0x0030), u1f500 = si.u16char(0xd83d) .. si.u16char(0xdd00), u1f3e1 = si.u16char(0xd83c) .. si.u16char(0xdfe1), u1f41c = si.u16char(0xd83d) .. si.u16char(0xdc1c), u1f6a1 = si.u16char(0xd83d) .. si.u16char(0xdea1), u1f63d = si.u16char(0xd83d) .. si.u16char(0xde3d), u1f451 = si.u16char(0xd83d) .. si.u16char(0xdc51), u1f358 = si.u16char(0xd83c) .. si.u16char(0xdf58), u1f30a = si.u16char(0xd83c) .. si.u16char(0xdf0a), u1f3b5 = si.u16char(0xd83c) .. si.u16char(0xdfb5), u1f4a3 = si.u16char(0xd83d) .. si.u16char(0xdca3), u1f3c6 = si.u16char(0xd83c) .. si.u16char(0xdfc6), u1f680 = si.u16char(0xd83d) .. si.u16char(0xde80), u1f4c3 = si.u16char(0xd83d) .. si.u16char(0xdcc3), u1f33a = si.u16char(0xd83c) .. si.u16char(0xdf3a), u1f304 = si.u16char(0xd83c) .. si.u16char(0xdf04), u1f6a7 = si.u16char(0xd83d) .. si.u16char(0xdea7), u1f3ed = si.u16char(0xd83c) .. si.u16char(0xdfed), u1f6af = si.u16char(0xd83d) .. si.u16char(0xdeaf), u1f686 = si.u16char(0xd83d) .. si.u16char(0xde86), u1f362 = si.u16char(0xd83c) .. si.u16char(0xdf62), u1f600 = si.u16char(0xd83d) .. si.u16char(0xde00), u1f3b8 = si.u16char(0xd83c) .. si.u16char(0xdfb8), u1f21a_fe0f = si.u16char(0xd83c) .. si.u16char(0xde1a), u1f30d = si.u16char(0xd83c) .. si.u16char(0xdf0d), u1f3e8 = si.u16char(0xd83c) .. si.u16char(0xdfe8), u1f4fc = si.u16char(0xd83d) .. si.u16char(0xdcfc), u1f4de = si.u16char(0xd83d) .. si.u16char(0xdcde), u1f348 = si.u16char(0xd83c) .. si.u16char(0xdf48), u1f4cb = si.u16char(0xd83d) .. si.u16char(0xdccb), u1f439 = si.u16char(0xd83d) .. si.u16char(0xdc39), u1f41e = si.u16char(0xd83d) .. si.u16char(0xdc1e), u2755 = si.u16char(0x2755), u1f61e = si.u16char(0xd83d) .. si.u16char(0xde1e), u1f3ac = si.u16char(0xd83c) .. si.u16char(0xdfac), u1f369 = si.u16char(0xd83c) .. si.u16char(0xdf69), u1f533 = si.u16char(0xd83d) .. si.u16char(0xdd33), u1f4ef = si.u16char(0xd83d) .. si.u16char(0xdcef), u1f353 = si.u16char(0xd83c) .. si.u16char(0xdf53), u1f44a = si.u16char(0xd83d) .. si.u16char(0xdc4a), u2139_fe0f = si.u16char(0x2139), u1f567 = si.u16char(0xd83d) .. si.u16char(0xdd67), u1f48d = si.u16char(0xd83d) .. si.u16char(0xdc8d), u1f494 = si.u16char(0xd83d) .. si.u16char(0xdc94), u1f49a = si.u16char(0xd83d) .. si.u16char(0xdc9a), u1f445 = si.u16char(0xd83d) .. si.u16char(0xdc45), u1f4b2 = si.u16char(0xd83d) .. si.u16char(0xdcb2), u1f565 = si.u16char(0xd83d) .. si.u16char(0xdd65), u1f385 = si.u16char(0xd83c) .. si.u16char(0xdf85), u1f627 = si.u16char(0xd83d) .. si.u16char(0xde27), u2757_fe0f = si.u16char(0x2757), u1f193 = si.u16char(0xd83c) .. si.u16char(0xdd93), u1f431 = si.u16char(0xd83d) .. si.u16char(0xdc31), u1f455 = si.u16char(0xd83d) .. si.u16char(0xdc55), u1f649 = si.u16char(0xd83d) .. si.u16char(0xde49), u1f697 = si.u16char(0xd83d) .. si.u16char(0xde97), u1f601 = si.u16char(0xd83d) .. si.u16char(0xde01), u1f3b1 = si.u16char(0xd83c) .. si.u16char(0xdfb1), u1f23a = si.u16char(0xd83c) .. si.u16char(0xde3a), u274e = si.u16char(0x274e), u1f508 = si.u16char(0xd83d) .. si.u16char(0xdd08), u2712_fe0f = si.u16char(0x2712), u1f318 = si.u16char(0xd83c) .. si.u16char(0xdf18), u1f360 = si.u16char(0xd83c) .. si.u16char(0xdf60), u1f6bb = si.u16char(0xd83d) .. si.u16char(0xdebb), u1f561 = si.u16char(0xd83d) .. si.u16char(0xdd61), u264f_fe0f = si.u16char(0x264f), u1f460 = si.u16char(0xd83d) .. si.u16char(0xdc60), u1f41f = si.u16char(0xd83d) .. si.u16char(0xdc1f), u1f31d = si.u16char(0xd83c) .. si.u16char(0xdf1d), u1f61c = si.u16char(0xd83d) .. si.u16char(0xde1c), u1f503 = si.u16char(0xd83d) .. si.u16char(0xdd03), u1f684 = si.u16char(0xd83d) .. si.u16char(0xde84), u1f4d9 = si.u16char(0xd83d) .. si.u16char(0xdcd9), u0023 = si.u16char(0x0023), u1f339 = si.u16char(0xd83c) .. si.u16char(0xdf39), u1f389 = si.u16char(0xd83c) .. si.u16char(0xdf89), u1f440 = si.u16char(0xd83d) .. si.u16char(0xdc40), u1f647 = si.u16char(0xd83d) .. si.u16char(0xde47), u1f62d = si.u16char(0xd83d) .. si.u16char(0xde2d), u26d4_fe0f = si.u16char(0x26d4), u1f637 = si.u16char(0xd83d) .. si.u16char(0xde37), u1f6c5 = si.u16char(0xd83d) .. si.u16char(0xdec5), u1f35f = si.u16char(0xd83c) .. si.u16char(0xdf5f), u1f64c = si.u16char(0xd83d) .. si.u16char(0xde4c), u1f62c = si.u16char(0xd83d) .. si.u16char(0xde2c), u1f004_fe0f = si.u16char(0xd83c) .. si.u16char(0xdc04), u1f69d = si.u16char(0xd83d) .. si.u16char(0xde9d), u1f55b = si.u16char(0xd83d) .. si.u16char(0xdd5b), u1f4dc = si.u16char(0xd83d) .. si.u16char(0xdcdc), u1f3e7 = si.u16char(0xd83c) .. si.u16char(0xdfe7), u1f6a2 = si.u16char(0xd83d) .. si.u16char(0xdea2), u267f_fe0f = si.u16char(0x267f), u1f438 = si.u16char(0xd83d) .. si.u16char(0xdc38), u1f4d1 = si.u16char(0xd83d) .. si.u16char(0xdcd1), u1f43e = si.u16char(0xd83d) .. si.u16char(0xdc3e), u1f635 = si.u16char(0xd83d) .. si.u16char(0xde35), u1f622 = si.u16char(0xd83d) .. si.u16char(0xde22), u1f498 = si.u16char(0xd83d) .. si.u16char(0xdc98), u2665_fe0f = si.u16char(0x2665), u1f33d = si.u16char(0xd83c) .. si.u16char(0xdf3d), u1f407 = si.u16char(0xd83d) .. si.u16char(0xdc07), u00ae = si.u16char(0x00ae), u1f527 = si.u16char(0xd83d) .. si.u16char(0xdd27), u0023_fe0f_20e3 = si.u16char(0x0023) .. si.u16char(0x20e3), u1f488 = si.u16char(0xd83d) .. si.u16char(0xdc88), u1f381 = si.u16char(0xd83c) .. si.u16char(0xdf81), u1f403 = si.u16char(0xd83d) .. si.u16char(0xdc03), u0039_fe0f_20e3 = si.u16char(0x0039) .. si.u16char(0x20e3), u1f300 = si.u16char(0xd83c) .. si.u16char(0xdf00), u1f6a6 = si.u16char(0xd83d) .. si.u16char(0xdea6), u1f34c = si.u16char(0xd83c) .. si.u16char(0xdf4c), u260e_fe0f = si.u16char(0x260e), u1f4c5 = si.u16char(0xd83d) .. si.u16char(0xdcc5), u1f564 = si.u16char(0xd83d) .. si.u16char(0xdd64), u1f6b8 = si.u16char(0xd83d) .. si.u16char(0xdeb8), u1f330 = si.u16char(0xd83c) .. si.u16char(0xdf30), u1f44e = si.u16char(0xd83d) .. si.u16char(0xdc4e), u1f423 = si.u16char(0xd83d) .. si.u16char(0xdc23), u1f531 = si.u16char(0xd83d) .. si.u16char(0xdd31), u1f4d2 = si.u16char(0xd83d) .. si.u16char(0xdcd2), u1f34a = si.u16char(0xd83c) .. si.u16char(0xdf4a), u1f64f = si.u16char(0xd83d) .. si.u16char(0xde4f), u1f53d = si.u16char(0xd83d) .. si.u16char(0xdd3d), u1f365 = si.u16char(0xd83c) .. si.u16char(0xdf65), u1f636 = si.u16char(0xd83d) .. si.u16char(0xde36), u1f611 = si.u16char(0xd83d) .. si.u16char(0xde11), u1f555 = si.u16char(0xd83d) .. si.u16char(0xdd55), u1f37b = si.u16char(0xd83c) .. si.u16char(0xdf7b), u1f46b = si.u16char(0xd83d) .. si.u16char(0xdc6b), u1f519 = si.u16char(0xd83d) .. si.u16char(0xdd19), u1f302 = si.u16char(0xd83c) .. si.u16char(0xdf02), u1f550 = si.u16char(0xd83d) .. si.u16char(0xdd50), u1f3c0 = si.u16char(0xd83c) .. si.u16char(0xdfc0), u1f55d = si.u16char(0xd83d) .. si.u16char(0xdd5d), u1f3a9 = si.u16char(0xd83c) .. si.u16char(0xdfa9), u1f625 = si.u16char(0xd83d) .. si.u16char(0xde25), u21a9_fe0f = si.u16char(0x21a9), u1f372 = si.u16char(0xd83c) .. si.u16char(0xdf72), u1f3ee = si.u16char(0xd83c) .. si.u16char(0xdfee), u2198_fe0f = si.u16char(0x2198), u3030 = si.u16char(0x3030), u1f6a9 = si.u16char(0xd83d) .. si.u16char(0xdea9), u1f435 = si.u16char(0xd83d) .. si.u16char(0xdc35), u1f3a1 = si.u16char(0xd83c) .. si.u16char(0xdfa1), u1f448 = si.u16char(0xd83d) .. si.u16char(0xdc48), u1f4bc = si.u16char(0xd83d) .. si.u16char(0xdcbc), u1f202 = si.u16char(0xd83c) .. si.u16char(0xde02), u1f6c2 = si.u16char(0xd83d) .. si.u16char(0xdec2), u1f562 = si.u16char(0xd83d) .. si.u16char(0xdd62), u1f3bc = si.u16char(0xd83c) .. si.u16char(0xdfbc), u1f34d = si.u16char(0xd83c) .. si.u16char(0xdf4d), u1f4f6 = si.u16char(0xd83d) .. si.u16char(0xdcf6), u1f4ac = si.u16char(0xd83d) .. si.u16char(0xdcac), u1f49e = si.u16char(0xd83d) .. si.u16char(0xdc9e), u1f474 = si.u16char(0xd83d) .. si.u16char(0xdc74), u1f308 = si.u16char(0xd83c) .. si.u16char(0xdf08), u1f3a6 = si.u16char(0xd83c) .. si.u16char(0xdfa6), u25fd_fe0f = si.u16char(0x25fd), u1f4ec = si.u16char(0xd83d) .. si.u16char(0xdcec), u1f3a8 = si.u16char(0xd83c) .. si.u16char(0xdfa8), u264b_fe0f = si.u16char(0x264b), u1f466 = si.u16char(0xd83d) .. si.u16char(0xdc66), u1f44f = si.u16char(0xd83d) .. si.u16char(0xdc4f), u27bf = si.u16char(0x27bf), u2709_fe0f = si.u16char(0x2709), u1f514 = si.u16char(0xd83d) .. si.u16char(0xdd14), u2708_fe0f = si.u16char(0x2708), u1f34b = si.u16char(0xd83c) .. si.u16char(0xdf4b), u1f6b3 = si.u16char(0xd83d) .. si.u16char(0xdeb3), u1f4ed = si.u16char(0xd83d) .. si.u16char(0xdced), u0037 = si.u16char(0x0037), u1f516 = si.u16char(0xd83d) .. si.u16char(0xdd16), u2195_fe0f = si.u16char(0x2195), u0030_fe0f_20e3 = si.u16char(0x0030) .. si.u16char(0x20e3), u1f310 = si.u16char(0xd83c) .. si.u16char(0xdf10), u1f681 = si.u16char(0xd83d) .. si.u16char(0xde81), u0037_fe0f_20e3 = si.u16char(0x0037) .. si.u16char(0x20e3), u1f63e = si.u16char(0xd83d) .. si.u16char(0xde3e), u1f36b = si.u16char(0xd83c) .. si.u16char(0xdf6b), u1f6ba = si.u16char(0xd83d) .. si.u16char(0xdeba), u1f4e1 = si.u16char(0xd83d) .. si.u16char(0xdce1), u1f374 = si.u16char(0xd83c) .. si.u16char(0xdf74), u1f52e = si.u16char(0xd83d) .. si.u16char(0xdd2e), u1f44b = si.u16char(0xd83d) .. si.u16char(0xdc4b), u1f433 = si.u16char(0xd83d) .. si.u16char(0xdc33), u270c_fe0f = si.u16char(0x270c), u2122 = si.u16char(0x2122), u1f379 = si.u16char(0xd83c) .. si.u16char(0xdf79), u26aa_fe0f = si.u16char(0x26aa), u1f40d = si.u16char(0xd83d) .. si.u16char(0xdc0d), u1f332 = si.u16char(0xd83c) .. si.u16char(0xdf32), u1f465 = si.u16char(0xd83d) .. si.u16char(0xdc65), u1f55f = si.u16char(0xd83d) .. si.u16char(0xdd5f), u203c_fe0f = si.u16char(0x203c), u1f603 = si.u16char(0xd83d) .. si.u16char(0xde03), u1f4ae = si.u16char(0xd83d) .. si.u16char(0xdcae), u1f305 = si.u16char(0xd83c) .. si.u16char(0xdf05), u1f4eb = si.u16char(0xd83d) .. si.u16char(0xdceb), u1f509 = si.u16char(0xd83d) .. si.u16char(0xdd09), u274c = si.u16char(0x274c), u1f419 = si.u16char(0xd83d) .. si.u16char(0xdc19), u2693_fe0f = si.u16char(0x2693), u1f3c3 = si.u16char(0xd83c) .. si.u16char(0xdfc3), u1f4be = si.u16char(0xd83d) .. si.u16char(0xdcbe), u1f238 = si.u16char(0xd83c) .. si.u16char(0xde38), u1f33f = si.u16char(0xd83c) .. si.u16char(0xdf3f), u1f413 = si.u16char(0xd83d) .. si.u16char(0xdc13), u1f366 = si.u16char(0xd83c) .. si.u16char(0xdf66), u1f36a = si.u16char(0xd83c) .. si.u16char(0xdf6a), u1f30c = si.u16char(0xd83c) .. si.u16char(0xdf0c), u1f43c = si.u16char(0xd83d) .. si.u16char(0xdc3c), u1f19a = si.u16char(0xd83c) .. si.u16char(0xdd9a), u1f42d = si.u16char(0xd83d) .. si.u16char(0xdc2d), u1f691 = si.u16char(0xd83d) .. si.u16char(0xde91), u1f69e = si.u16char(0xd83d) .. si.u16char(0xde9e), u1f38c = si.u16char(0xd83c) .. si.u16char(0xdf8c), u1f53a = si.u16char(0xd83d) .. si.u16char(0xdd3a), u1f64a = si.u16char(0xd83d) .. si.u16char(0xde4a), u0031_fe0f_20e3 = si.u16char(0x0031) .. si.u16char(0x20e3), u1f46c = si.u16char(0xd83d) .. si.u16char(0xdc6c), u1f461 = si.u16char(0xd83d) .. si.u16char(0xdc61), u1f696 = si.u16char(0xd83d) .. si.u16char(0xde96), u2663_fe0f = si.u16char(0x2663), u0032_fe0f_20e3 = si.u16char(0x0032) .. si.u16char(0x20e3), u0032 = si.u16char(0x0032), u1f618 = si.u16char(0xd83d) .. si.u16char(0xde18), u1f6ad = si.u16char(0xd83d) .. si.u16char(0xdead), u1f6b2 = si.u16char(0xd83d) .. si.u16char(0xdeb2), u1f493 = si.u16char(0xd83d) .. si.u16char(0xdc93), u2651_fe0f = si.u16char(0x2651), u1f4d4 = si.u16char(0xd83d) .. si.u16char(0xdcd4), u1f44d = si.u16char(0xd83d) .. si.u16char(0xdc4d), u1f307 = si.u16char(0xd83c) .. si.u16char(0xdf07), u1f31f = si.u16char(0xd83c) .. si.u16char(0xdf1f), u1f345 = si.u16char(0xd83c) .. si.u16char(0xdf45), u1f50d = si.u16char(0xd83d) .. si.u16char(0xdd0d), u1f43a = si.u16char(0xd83d) .. si.u16char(0xdc3a), u1f4f0 = si.u16char(0xd83d) .. si.u16char(0xdcf0), u1f171 = si.u16char(0xd83c) .. si.u16char(0xdd71), u1f534 = si.u16char(0xd83d) .. si.u16char(0xdd34), u1f4f1 = si.u16char(0xd83d) .. si.u16char(0xdcf1), u1f342 = si.u16char(0xd83c) .. si.u16char(0xdf42), u1f434 = si.u16char(0xd83d) .. si.u16char(0xdc34), u1f1f0_1f1f7 = si.u16char(0xd83c) .. si.u16char(0xddf0) .. si.u16char(0xd83c) .. si.u16char(0xddf7), u2733_fe0f = si.u16char(0x2733), u1f1ef_1f1f5 = si.u16char(0xd83c) .. si.u16char(0xddef) .. si.u16char(0xd83c) .. si.u16char(0xddf5), u1f507 = si.u16char(0xd83d) .. si.u16char(0xdd07), u1f563 = si.u16char(0xd83d) .. si.u16char(0xdd63), u1f22f_fe0f = si.u16char(0xd83c) .. si.u16char(0xde2f), u1f4cf = si.u16char(0xd83d) .. si.u16char(0xdccf), u0034 = si.u16char(0x0034), u26fa_fe0f = si.u16char(0x26fa), u1f619 = si.u16char(0xd83d) .. si.u16char(0xde19), --Android since 6.0.1 u1f917 = si.u16char(0xd83e) .. si.u16char(0xdd17), -- [1] u1f914 = si.u16char(0xd83e) .. si.u16char(0xdd14), -- [2] u1f910 = si.u16char(0xd83e) .. si.u16char(0xdd10), -- [3] u1f913 = si.u16char(0xd83e) .. si.u16char(0xdd13), -- [4] u1f641 = si.u16char(0xd83d) .. si.u16char(0xde41), -- [5] u1f643 = si.u16char(0xd83d) .. si.u16char(0xde43), -- [6] u1f912 = si.u16char(0xd83e) .. si.u16char(0xdd12), -- [7] u1f915 = si.u16char(0xd83e) .. si.u16char(0xdd15), -- [8] u1f575 = si.u16char(0xd83d) .. si.u16char(0xdd75), -- [9] u1f574 = si.u16char(0xd83d) .. si.u16char(0xdd74), -- [10] u1f918 = si.u16char(0xd83e) .. si.u16char(0xdd18), -- [11] u1f573 = si.u16char(0xd83d) .. si.u16char(0xdd73), -- [12] u1f576 = si.u16char(0xd83d) .. si.u16char(0xdd76), -- [13] u1f6cd = si.u16char(0xd83d) .. si.u16char(0xdecd), -- [14] u1f916 = si.u16char(0xd83e) .. si.u16char(0xdd16), -- [15] u1f981 = si.u16char(0xd83e) .. si.u16char(0xdd81), -- [16] u1f984 = si.u16char(0xd83e) .. si.u16char(0xdd84), -- [17] u1f43f = si.u16char(0xd83d) .. si.u16char(0xdc3f), -- [18] u1f983 = si.u16char(0xd83e) .. si.u16char(0xdd83), -- [19] u1f54a = si.u16char(0xd83d) .. si.u16char(0xdd4a), -- [20] u1f980 = si.u16char(0xd83e) .. si.u16char(0xdd80), -- [21] u1f577 = si.u16char(0xd83d) .. si.u16char(0xdd77), -- [22] u1f336 = si.u16char(0xd83c) .. si.u16char(0xdf36), -- [23] u1f37f = si.u16char(0xd83c) .. si.u16char(0xdf7f), -- [24] u1f37d = si.u16char(0xd83c) .. si.u16char(0xdf7d), -- [25] u1f5fa = si.u16char(0xd83d) .. si.u16char(0xddfa), -- [26] u1f3c5 = si.u16char(0xd83c) .. si.u16char(0xdfc5), -- [27] u1f3d0 = si.u16char(0xd83c) .. si.u16char(0xdfd0), -- [28] u1f6f0 = si.u16char(0xd83d) .. si.u16char(0xdef0), -- [29] u1f32d = si.u16char(0xd83c) .. si.u16char(0xdf2d), -- [30] u1f578 = si.u16char(0xd83d) .. si.u16char(0xdd78), -- [31] u1f441 = si.u16char(0xd83d) .. si.u16char(0xdc41), -- [32] u1f595 = si.u16char(0xd83d) .. si.u16char(0xdd95), -- [33] u1f911 = si.u16char(0xd83e) .. si.u16char(0xdd11), -- [34] u1f642 = si.u16char(0xd83d) .. si.u16char(0xde42), -- [35] u1f644 = si.u16char(0xd83d) .. si.u16char(0xde44), -- [36] } PK n5:Q0]5assets/emotion.lua.pngUT n_n_n_ WГWГWГrequire "grid_symbol" local P = {} P._G = _G if _REQUIREDNAME == nil then emotion = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local gs = _G.grid_symbol local symbol_emotion = { } local smiley_table = { art = symbol_emotion, happy = symbol_emotion, horizontal = symbol_emotion, wired = symbol_emotion, love = symbol_emotion, negative = symbol_emotion, } function get_smiley_table() return gs.setup_emotion_table(smiley_table, "horizontal") end return P PK n5:Qµ[[5assets/eng_hard_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "hard_keys" local hk = hard_keys local si = smartinput local surface = si.new_surface("eng_hard_phonepad") surface.template = "" surface.surface_type = si.surface_type.HARD_KEYBOARD surface.surface_subtype = si.surface_subtype.KEYBOARD_HARD surface.support_mode = si.context.URI + si.context.EMAIL + si.context.PASSWORD surface.multi_input_type = si.input_mode.MULTITAP + si.input_mode.FUZZY surface.precise_input_type = si.input_mode.PRECISE + si.input_mode.PREDICT + si.input_mode.AUTO_DISABLE_PREDICT surface.touch_correct = false surface.default_nextword = true surface.touch_to_save = true surface.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } surface.explicit_strategy = nil surface.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } surface.extra_elements = { "top_bar=hard_candidate_bar", } smart_symbols = {"'", "@", ";", "?", "!", ",", ".", ":", "\"", "-", "(", ")", "~", "*", "%", "&", "#"} hk.setup_keys(surface, smart_symbols) return surface PK n5:Q-1ʸ,5assets/eng_hard_qwerty_no_prediction.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "hard_keys" local hk = hard_keys local si = smartinput local surface = si.new_surface("eng_hard_phonepad_no_inline") surface.template = "" surface.surface_type = si.surface_type.HARD_KEYBOARD surface.surface_subtype = si.surface_subtype.KEYBOARD_HARD surface.support_mode = si.context.TEXT surface.precise_input_type = si.input_mode.PRECISE surface.touch_correct = false surface.default_nextword = true surface.touch_to_save = true surface.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } surface.explicit_strategy = nil surface.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } surface.extra_elements = { "top_bar=hard_candidate_bar", } smart_symbols = {"'", "@", ";", "?", "!", ",", ".", ":", "\"", "-", "(", ")", "~", "*", "%", "&", "#"} hk.setup_keys(surface, smart_symbols) return surface PK n5:Qyc c 5assets/eng_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local input_type = si.input_type() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.eng_full_azerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.eng_full_azerty_alt_curve_international shift_inputs = kb.eng_full_azerty_shift_international end local s = sf.new_full_keyboard( "eng_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_smiley"] = ck.sk_smiley_open s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.sync_sk_lng = lc.sync_sk_lng s.commit_input = lc.commit_input s.compound_word_input = lc.compound_word_input return s PK n5:Q 5assets/eng_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "eng_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) if not si.is_international_version() then s.template = "eng_soft_phonepad_mainland" else s.template = "eng_soft_phonepad_international" end s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil --for mainland special textbox use special settings, hard code s.surface_layout = si.surface_layout.OTHER if si.is_mainland_version() then s.support_mode = si.context.URI + si.context.EMAIL + si.context.PASSWORD end s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_smiley"] = ck.sk_smiley_open s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["sk_dict"] = ck.sk_dict if not si.is_international_version() then s.softkeys["Dot"] = ck.sk_dot_eng else s.softkeys["Dot"] = ck.sk_dot_eng_inter end ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.commit_input = lc.commit_input s.compound_word_input = lc.compound_word_input return s PK n5:Qb<5assets/eng_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_inter_mode = si.is_international_version() local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local input_type = si.input_type() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main if is_inter_mode then --international if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end else --mainland if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI then template = "eng_soft_qwerty_email_uri_mainland" else template = "eng_soft_qwerty_mainland" end alt_inputs = kb.eng_full_qwerty_alt else if input_type == si.context.URI then template = "eng_soft_qwerty_curve_email_uri_mainland" else template = "eng_soft_qwerty_curve_mainland" end alt_inputs = kb.eng_full_qwerty_alt_curve shift_inputs = kb.eng_full_qwerty_shift_curve end end local s = sf.new_full_keyboard( "eng_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_smiley"] = ck.sk_smiley_open s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open if not is_inter_mode then s.softkeys["sk_dict"] = ck.sk_dict s.softkeys["sk_num"] = ck.sk_num_down end s.sync_sk_lng = lc.sync_sk_lng s.commit_input = lc.commit_input s.compound_word_input = lc.compound_word_input return s PK n5:Q/T T 5assets/eng_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if inpute_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "eng_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_smiley"] = ck.sk_smiley_open s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.sync_sk_lng = lc.sync_sk_lng s.commit_input = lc.commit_input s.compound_word_input = lc.compound_word_input return s PK n5:Q 5assets/eng_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local template local alt_inputs if si.is_international_version() then template = "eng_soft_tplus_international" alt_inputs = kb.eng_tplus_qwerty_alt_international else template = "eng_soft_tplus_mainland" alt_inputs = kb.eng_tplus_qwerty_alt end local s = sf.new_tplus_keyboard( "eng_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, alt_inputs, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW --for mainland special textbox use special settings if si.is_mainland_version() then s.support_mode = si.context.URI + si.context.EMAIL + si.context.PASSWORD end s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_smiley"] = ck.sk_smiley_open s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_num"] = ck.sk_num_down s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open if not si.is_international_version() then s.softkeys["sk_dict"] = ck.sk_dict end s.sync_sk_lng = lc.sync_sk_lng s.commit_input = lc.commit_input s.compound_word_input = lc.compound_word_input return s PK n5:QaZZ$5assets/eng_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "eng_soft_tplus_azerty", kb.eng_tplus_azerty_left, kb.eng_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ --for mainland special textbox use special settings if si.is_mainland_version() then s.support_mode = si.context.URI + si.context.EMAIL + si.context.PASSWORD end s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_smiley"] = ck.sk_smiley_open s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.sync_sk_lng = lc.sync_sk_lng s.commit_input = lc.commit_input s.compound_word_input = lc.compound_word_input return s PK n5:Q_Yaa$5assets/eng_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "eng_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ --for mainland special textbox use special settings if si.is_mainland_version() then s.support_mode = si.context.URI + si.context.EMAIL + si.context.PASSWORD end s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_smiley"] = ck.sk_smiley_open s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.sync_sk_lng = lc.sync_sk_lng s.commit_input = lc.commit_input s.compound_word_input = lc.compound_word_input return s PK n5:QSY%%5assets/eng_sym_grid.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "grid_symbol" require "emoji" local si = smartinput local ck = common_keys local ct = si.context local pi = si.pending_input local sym = grid_symbol local emo = emoji local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "eng_sym_grid_international" else surface.template = "chs_sym_grid" end surface.on_load = function (old_surface) surface.explicit_inline = old_surface.explicit_inline surface.inline_strategy = old_surface.inline_strategy surface.resolve_mode = old_surface.resolve_mode surface.touch_to_save = old_surface.touch_to_save if old_surface.param ~= nil then surface.switch_tab(old_surface.param, true) end end surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.support_mode = ct.NUMBER + ct.MATH surface.touch_correct = false surface.extra_elements = { "eng_sym_types", "popup_revert", "popup_explicit", "top_bar=none" } surface.ROWS_COUNT = 4 surface.COLUMNS_COUNT = 4 surface.MAX_RECENT_SYMBOL_COUNT = surface.ROWS_COUNT * surface.COLUMNS_COUNT local symbol_punc_eng = { { {".", ",", "?", "!"}, {"'", "@", "…", ":"}, {";", "\"", "/", "_"}, {"-", "+", "`", {"()",1}}, {"(", ")", "=", "\\"}, {"~", "^", "#", "*"}, {"%", "&", "|", {"{}",1}}, {"{", "}",{"[]",1}, {"<>",1}}, {"<", ">", "「", "」"}, {{"「」",1}, "$", "¥", "£"}, {"€", "¿", "¡", "•"}, } } local symbol_number = { { {"1", "2", "3", "."}, {"4", "5", "6", ","}, {"7", "8", "9", "%"}, {"*", "0", "#", "-"} } } local symbol_emotion = { { {":-)", ":-(", ":-D", ":-P"}, {";-)", "=-O", ":-*", ":O"}, {"B-)", ":-$", ":-!", ":-["}, {"O:-)", ":-\\", ":'(",",-)"}, {":-C", ":-I", ":-O",">:-<"}, } } local symbol_web = { { {"http://", {"www..com", 4}, "https://"}, {"www.", ".com", ".org", "wap."}, {":", "_", ".", "/"}, {"@", "", "", ""} } } local symbol_maths = { { {"+", "-", "×", "÷"}, {"=", "≈", "≤", "≥"}, {"°", "%", "℃", "℉"}, {"‰", "㎎", "㎏", "㎜"}, {"㎝", "㎞", "㎡", "㏄"}, {"㏑", "㏒", "⊙", "∠"}, {"⊥", "∫", "∮", "∝"}, {"∞", "º", "¹", "²"}, {"³", "½", "¾", "¼"}, {"<", ">", "≮", "≯"}, {"±", "≡", "≠", "№"}, {"§", "≦", "≧", "≌"}, {"∽", "∷", "/", "∧"}, {"∨", "∏", "∪", "∩"}, {"∈", "∵", "∴", "⌒"}, {"√", "∑", "Ψ", "¤"}, {"‖", "¶", "", ""}, } } local symbol_greek = { { {"α", "β", "γ", "δ"}, {"ε", "ζ", "ν", "ξ"}, {"ο", "π", "ρ", "σ"}, {"η", "θ", "ι", "κ"}, {"λ", "μ", "τ", "υ"}, {"φ", "χ", "ψ", "ω"}, {"Α", "Β", "Γ", "Δ"}, {"Ε", "Ζ", "Η", "Θ"}, {"Ι", "Κ", "Λ", "Μ"}, {"Ν", "Ξ", "Ο", "Π"}, {"Ρ", "Σ", "Τ", "Υ"}, {"Φ", "Χ", "Ψ", "Ω"}, } } local symbol_latin = { { {"Ä", "Æ", "Å", "À"}, {"Á", "Â", "Ã", "Ç"}, {"È", "É", "Ê", "Ë"}, {"Ð", "Ì", "Í", "Î"}, {"Ï", "Ö", "Ø", "Ò"}, {"Ó", "Ô", "Õ", "Ñ"}, {"Ù", "Ú", "Û", "Ü"}, {"Ý", "Þ", "ä", "æ"}, {"å", "à", "á", "â"}, {"ã", "ç", "è", "é"}, {"ê", "ë", "ð", "ì"}, {"í", "î", "ï", "ö"}, {"ø", "ò", "ó", "ô"}, {"õ", "ñ", "ù", "ú"}, {"û", "ü", "ý", "þ"}, } } local symbol_emoticon = { { {emo.emoji_code.EMOJI_SMILE, emo.emoji_code.EMOJI_SAD, emo.emoji_code.EMOJI_GRIN, emo.emoji_code.EMOJI_NAUGHTY}, {emo.emoji_code.EMOJI_JOY, emo.emoji_code.EMOJI_CONFUSED, emo.emoji_code.EMOJI_KISS, emo.emoji_code.EMOJI_SURPRISE}, {emo.emoji_code.EMOJI_PLEASED, emo.emoji_code.EMOJI_HEARTSHAPED, emo.emoji_code.EMOJI_WRONGED, emo.emoji_code.EMOJI_CRY}, {emo.emoji_code.EMOJI_ARROGANT, emo.emoji_code.EMOJI_ANGRY, emo.emoji_code.EMOJI_WEEP, emo.emoji_code.EMOJI_DIZZY}, } } for i = 1, #symbol_emotion do for j = 1, #symbol_emotion[i] do for k = 1, #symbol_emotion[i][j] do local new_symbol = {} new_symbol[1] = symbol_emotion[i][j][k] new_symbol["emotion"] = true symbol_emotion[i][j][k] = new_symbol end end end for i = 1, #symbol_emoticon do for j = 1, #symbol_emoticon[i] do for k = 1, #symbol_emoticon[i][j] do local new_symbol = {} new_symbol[1] = symbol_emoticon[i][j][k] new_symbol["emotion"] = true symbol_emoticon[i][j][k] = new_symbol end end end local symbol = { number = symbol_number, punc_eng = symbol_punc_eng, emoticon = {}, web = symbol_web, maths = symbol_maths, greek = symbol_greek, latin = symbol_latin, } local sym_types_name = { number = "数字", punc_eng = "英文", emotion = "表情", emoticon = "表情图", web = "网络", maths = "数学", greek = "希腊", latin = "拉丁", recent = "最近" } local default_symbol_list = { "'", ":", "/", "@", "&", "#", "-", "_", {"()", 1}, "$", {":-)", emotion=true}, ".com" } function surface.update_recent_symbols(recent_symbols) symbol.recent = recent_symbols end local recent_symbols = sym.get_recent_symbols() surface.update_recent_symbols(sym.layout_symbol_list(recent_symbols, surface.ROWS_COUNT, surface.COLUMNS_COUNT)) function surface.set_recent_symbols(symbols) sym.set_recent_symbols(surface, symbols) end function surface.get_recent_symbols() return sym.get_recent_symbols() end if si.input_type() == ct.NUMBER or si.input_type() == ct.PASSWORD then surface.sym_current_tab = "number" else if si.is_international_version() then surface.sym_current_tab = "recent" else surface.sym_current_tab = "punc_eng" end end surface.sym_current_page = 1 --si.get_setting_value(si.settings.SYMBOL_CURRENT_PAGE, si.settings_type.SETTING_INT) si.set_setting_value(si.settings.SYMBOL_CURRENT_TAB, surface.sym_current_tab, si.settings_type.SETTING_STRING) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) surface.switch_tab = function(symbol_tab, is_ignore_accessibility) --si.print("#################surface.switch_tab: " .. symbol_tab) surface.sym_current_tab = symbol_tab surface.sym_current_page = 1 if not is_ignore_accessibility then si.set_accessibility_string("@string/accessibility_symbol_" .. symbol_tab) end si.set_setting_value(si.settings.SYMBOL_CURRENT_TAB, surface.sym_current_tab, si.settings_type.SETTING_STRING) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) surface.update_lock_status(symbol_tab) sym.reload_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) end surface.update_lock_status = function(symbol_tab) if symbol_tab == "number" then local locked = si.get_setting_value(si.settings.SYMBOL_LOCK_STATUS, si.settings_type.SETTING_INT) if locked >= 4 then locked = locked - 4; end if locked < 2 then locked = locked + 2; end si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, locked, si.settings_type.SETTING_INT) else local locked = si.get_setting_value(si.settings.SYMBOL_LOCK_STATUS, si.settings_type.SETTING_INT) if locked >= 4 then locked = locked - 4; end if locked >= 2 then locked = locked - 2; end si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, locked, si.settings_type.SETTING_INT) end end surface.prev_page = function() if table.getn(symbol[surface.sym_current_tab]) == 1 then si.set_accessibility_string("@string/accessibility_next_page_only_one") return end surface.sym_current_page = surface.sym_current_page - 1 if surface.sym_current_page < 1 then surface.sym_current_page = table.getn(symbol[surface.sym_current_tab]) end si.set_accessibility_string("@string/accessibility_next_page&" .. surface.sym_current_page) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) sym.reload_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) end surface.next_page = function() if table.getn(symbol[surface.sym_current_tab]) == 1 then si.set_accessibility_string("@string/accessibility_next_page_only_one") return end surface.sym_current_page = surface.sym_current_page + 1 if surface.sym_current_page > table.getn(symbol[surface.sym_current_tab]) then surface.sym_current_page = surface.sym_current_page - table.getn(symbol[surface.sym_current_tab]) end si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) si.set_accessibility_string("@string/accessibility_next_page&" .. surface.sym_current_page) sym.reload_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) end surface.lock = function() local locked = si.get_setting_value(si.settings.SYMBOL_LOCK_STATUS, si.settings_type.SETTING_INT) if locked < 2 then if locked == 0 then si.set_accessibility_string("@string/accessibility_lock_on") si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, 1, si.settings_type.SETTING_INT); else si.set_accessibility_string("@string/accessibility_lock_off") si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, 0, si.settings_type.SETTING_INT); end else si.set_accessibility_string("@string/accessibility_lock_disabled") end end surface.on_slip_up = surface.next_page surface.on_slip_down = surface.prev_page surface.update_lock_status(surface.sym_current_tab) sym.setup_chs_symbol(surface, symbol) for k, v in _G.pairs(symbol) do surface.softkeys["sk_" .. k].main_title = sym_types_name[k] end sym.load_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) return surface PK n5:Qhrr 5assets/eng_sym_keyboard1.sur.pngUT n_n_n_ WГWГWГrequire "common_keys" require "keyboard_symbol" local si = smartinput local ck = common_keys local sym = keyboard_symbol local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "eng_sym_keyboard1_international" else surface.template = "eng_sym_keyboard1" end local symbol = { {"1", "2", "3", "+", "-", "@", "$", "(", ")"}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "?"}, {"0", "."}, } local enable_slide_symbol = true surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.touch_correct = false surface.extra_elements = { "popup_revert", "popup_explicit", } sym.setup_symbol( surface, symbol, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table, "1/2", "eng_sym_keyboard2.sur.png", "eng_sym_keyboard2.sur.png", enable_slide_symbol) surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_back"] = ck.sk_back_to_previous_abc return surface PK n5:Q)p 5assets/eng_sym_keyboard2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "keyboard_symbol" local si = smartinput local ck = common_keys local sym = keyboard_symbol local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "eng_sym_keyboard2_international" else surface.template = "eng_sym_keyboard2" end local symbol = { {"[", "]", "{", "}", "<", ">", "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "€", "¥", "£", "¢"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } local enable_slide_symbol = true surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.touch_correct = false surface.extra_elements = { "popup_revert", "popup_explicit", } sym.setup_symbol( surface, symbol, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table, "2/2", "eng_sym_keyboard1.sur.png", "eng_sym_keyboard1.sur.png", enable_slide_symbol) surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_back"] = ck.sk_back_to_previous_abc return surface PK n5:QÞ 5assets/eng_sym_keyboard3.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "keyboard_symbol" require "emoji" local si = smartinput local ck = common_keys local sym = keyboard_symbol local emo = emoji local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "eng_sym_keyboard3_international" else surface.template = "eng_sym_keyboard3" end local symbol = { {{":-)", emotion=true}, {";-)", emotion=true}, {":-D", emotion=true}, {":-P", emotion=true}, {":-[", emotion=true}, {":'(", emotion=true}, {"=-O", emotion=true}}, {{":-(", emotion=true}, {"B-)", emotion=true}, {":-$", emotion=true}, {":O", emotion=true}, {":-*", emotion=true}, {":-!", emotion=true}, {":-\\", emotion=true}}, {"http://", "www.", ".com", ".net", ".org"} } local symbol_emoticon = { { {emo.emoji_code.EMOJI_SMILE, emotion=true}, {emo.emoji_code.EMOJI_JOY, emotion=true}, {emo.emoji_code.EMOJI_GRIN, emotion=true}, {emo.emoji_code.EMOJI_NAUGHTY, emotion=true}, {emo.emoji_code.EMOJI_CRY, emotion=true}, {emo.emoji_code.EMOJI_WEEP, emotion=true}, {emo.emoji_code.EMOJI_CONFUSED, emotion=true}, }, { {emo.emoji_code.EMOJI_SAD, emotion=true}, {emo.emoji_code.EMOJI_PLEASED, emotion=true}, {emo.emoji_code.EMOJI_HEARTSHAPED, emotion=true}, {emo.emoji_code.EMOJI_SURPRISE, emotion=true}, {emo.emoji_code.EMOJI_KISS, emotion=true}, {emo.emoji_code.EMOJI_WRONGED, emotion=true}, {emo.emoji_code.EMOJI_ANGRY, emotion=true}, }, {"http://", "www.", ".com", ".net", ".org"} } surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.touch_correct = false surface.extra_elements = { "popup_revert", "popup_explicit", } local enable_slide_symbol = true if si.get_setting_value(si.settings.SYMBOL_DISPLAY_EMOTICON, si.settings_type.SETTING_BOOL) then sym.setup_symbol( surface, symbol_emoticon, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table, "3/3", "eng_sym_keyboard1.sur.png", "eng_sym_keyboard2.sur.png", enable_slide_symbol) else sym.setup_symbol( surface, symbol, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table, "3/3", "eng_sym_keyboard1.sur.png", "eng_sym_keyboard2.sur.png", enable_slide_symbol) end local sk_emo = si.new_softkey() sk_emo.on_click = function() local display_emoticon = si.get_setting_value(si.settings.SYMBOL_DISPLAY_EMOTICON, si.settings_type.SETTING_BOOL) si.set_setting_value(si.settings.SYMBOL_DISPLAY_EMOTICON, not display_emoticon, si.settings_type.SETTING_BOOL) if not display_emoticon then sym.reload_symbol( surface, symbol_emoticon, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table) else sym.reload_symbol( surface, symbol, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table) end end surface.softkeys["sk_emo"] = sk_emo surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_back"] = ck.sk_back_to_previous_abc return surface PK n5:QY@"@"5assets/english.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("EN", "English") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, support_mode = si.context.URI + si.context.EMAIL + si.context.PASSWORD }, --soft keyboard { surface_id = pkg.englishv5 .. "eng_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, --for mainland special textbox use special settings, hard code surface_layout = si.surface_layout.OTHER, }, { surface_id = pkg.englishv5 .. "eng_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.englishv5 .. "eng_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.englishv5 .. "eng_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.englishv5 .. "eng_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.englishv5 .. "eng_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.englishv5 .. "eng_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, --soft symbol { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_down.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "number_right.sur.png", --number from phonepad surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.englishv5 .. "english_traits.trt.png" lng.statistic_alias = "english" lng.categories[si.language.category.FASTSWITCH] = "english" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "english" lng.categories[si.language.category.CELLDICT] = "english" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "english" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.categories[si.language.category.CLOUDINPUT] = "en" lng.categories[si.language.category.EMOJI] = "english" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) local path_head if si.is_international_package() then path_head = pkg.englishv5 rom_qw = path_head .. "english_curve_qw.rom.png" rom_qz = path_head .. "english_curve_qz.rom.png" rom_az = path_head .. "english_curve_az.rom.png" layout_file = path_head .. "english_layout.rom.png" rom_file = path_head .. "english.rom.png" else path_head = pkg.default_path.ENGLISH rom_qw = "english_curve_qw.imy" rom_qz = "english_curve_qz.imy" rom_az = "english_curve_az.imy" layout_file = "english_layout.imy" rom_file = path_head .. "english_cn.rom.png" end lng.dictionary.files = { { file_name = rom_file, file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.PURE_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.PURE_ARRAY, }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = layout_file, file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = rom_qw, file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = rom_az, file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = rom_qz, file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q 6 5assets/english_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 0 81 48 162 s 48 81 96 162 d 96 81 144 162 f 144 81 192 162 g 192 81 240 162 h 240 81 288 162 j 288 81 336 162 k 336 81 384 162 l 384 81 432 162 m 432 81 480 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 ' 360 162 408 243 PK n5:Q둦 5assets/english_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q&[ 5assets/english_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q5assets/english_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local is_international = si.is_international_version() local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "ā", "ą", "æ", "ç", "č", "ć", "è", "é", "ê", "ë", "ę", "ē", "ė", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "ù", "û", "ü", "ú", "ū", "ñ", "ń", "ß", "ś", "š", "ÿ", "ž", "ź", "ż", "ĺ", "ľ", "ł", "ď", "đ", "ŕ", "ř", "ť", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Ā", "Ą", "Æ", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ę", "Ē", "Ė", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "Ù", "Û", "Ü", "Ú", "Ū", "Ñ", "Ń", "ß", "Ś", "Š", "Ÿ", "Ž", "Ź", "Ż", "Ĺ", "Ľ", "Ł", "Ď", "Đ", "Ŕ", "Ř", "Ť", } local accent_dictionary = { [string.byte("a")] = "äàâáãåāąæ", [string.byte("c")] = "çčć", [string.byte("e")] = "ëèéêēėę", [string.byte("i")] = "ïîíìīį", [string.byte("o")] = "öôóòõōœø", [string.byte("u")] = "üùûúū", [string.byte("n")] = "ñń", [string.byte("s")] = "ßśš", [string.byte("y")] = "ÿ", [string.byte("z")] = "žźż", [string.byte("l")] = "ĺľł", [string.byte("d")] = "ďđ", [string.byte("r")] = "ŕř", [string.byte("t")] = "ť", [string.byte("A")] = "ÄÀÂÁÃÅĀĄÆ", [string.byte("C")] = "ÇČĆ", [string.byte("E")] = "ËÈÉÊĒĖĘ", [string.byte("I")] = "ÏÎÍÌĪĮ", [string.byte("O")] = "ÖÔÓÒÕŌŒØ", [string.byte("U")] = "ÜÙÛÚŪ", [string.byte("N")] = "ÑŃ", [string.byte("S")] = "ߌŠ", [string.byte("Y")] = "Ÿ", [string.byte("Z")] = "ŽŹŻ", [string.byte("L")] = "ĹĽŁ", [string.byte("D")] = "ĎĐ", [string.byte("R")] = "ŔŘ", [string.byte("T")] = "Ť", } local reversed_accent_dictionary = si.get_reversed_accent_dictionary(accent_dictionary) local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) if not is_international then return false end for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) if not is_international then return false end for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) and si.get_current_surface().surface_type ~= si.surface_type.HARD_KEYBOARD then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) if not is_international then return nil end return accent_dictionary[c] end function traits.get_original_letters(c) return reversed_accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:QD-5assets/englishgb.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("EN", "Englishgb") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.englishgbv5 .. "englishgb_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.englishgbv5 .. "englishgb_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.englishgbv5 .. "englishgb_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.englishgbv5 .. "englishgb_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, { surface_id = pkg.englishgbv5 .. "englishgb_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.englishgbv5 .. "englishgb_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.englishgbv5 .. "englishgb_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.englishgbv5 .. "englishgb_traits.trt.png" lng.statistic_alias = "englishgb" lng.categories[si.language.category.FASTSWITCH] = "english" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "englishgb" lng.categories[si.language.category.CELLDICT] = "english" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "englishgb" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.categories[si.language.category.CLOUDINPUT] = "en-gb" lng.categories[si.language.category.EMOJI] = "english" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.englishgbv5 .. "englishgb.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.englishgbv5 .. "englishgb_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.englishgbv5 .. "englishgb_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.englishgbv5 .. "englishgb_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.englishgbv5 .. "englishgb_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q 6"5assets/englishgb_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 0 81 48 162 s 48 81 96 162 d 96 81 144 162 f 144 81 192 162 g 192 81 240 162 h 240 81 288 162 j 288 81 336 162 k 336 81 384 162 l 384 81 432 162 m 432 81 480 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 ' 360 162 408 243 PK n5:Q둦"5assets/englishgb_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q&["5assets/englishgb_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q6 g  $5assets/englishgb_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.eng_full_azerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.eng_full_azerty_alt_curve_international shift_inputs = kb.eng_full_azerty_shift_international end local s = sf.new_full_keyboard( "englishgb_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QG&5assets/englishgb_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "englishgb_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q2}G+ $5assets/englishgb_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "englishgb_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q5Z[ $5assets/englishgb_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "englishgb_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QEE"\\#5assets/englishgb_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "englishgb_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QjIii*5assets/englishgb_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "englishgb_soft_tplus_azerty", kb.eng_tplus_azerty_left, kb.eng_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QPbii*5assets/englishgb_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "englishgb_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qۿ~ee5assets/englishgb_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local traits = si.new_language_traits() local ct = common_traits traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "ā", "ą", "æ", "ç", "č", "ć", "è", "é", "ê", "ë", "ē", "ė", "ę", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "ù", "û", "ü", "ú", "ū", "ñ", "ń", "ß", "ś", "š", "ÿ", "ÿ", "ž", "ź", "ż", "ĺ", "ľ", "ł", "ď", "đ", "ŕ", "ř", "ť", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Ā", "Ą", "Æ", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ē", "Ė", "Ę", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "Ù", "Û", "Ü", "Ú", "Ū", "Ñ", "Ń", "ß", "Ś", "Š", "Ÿ", "Ÿ", "Ž", "Ź", "Ż", "Ĺ", "Ľ", "Ł", "Ď", "Đ", "Ŕ", "Ř", "Ť", } local accent_letter_dictionary = { [string.byte("a")] = "äàâáãåāąæ", [string.byte("c")] = "çčć", [string.byte("e")] = "ëèéêēėę", [string.byte("i")] = "ïîíìīį", [string.byte("o")] = "öôóòõōœø", [string.byte("u")] = "üùûúū", [string.byte("n")] = "ñń", [string.byte("s")] = "ßśš", [string.byte("y")] = "ÿ", [string.byte("z")] = "žźż", [string.byte("l")] = "ĺľł", [string.byte("d")] = "ďđ", [string.byte("r")] = "ŕř", [string.byte("t")] = "ť", [string.byte("A")] = "ÄÀÂÁÃÅĀĄÆ", [string.byte("C")] = "ÇČĆ", [string.byte("E")] = "ËÈÉÊĒĖĘ", [string.byte("I")] = "ÏÎÍÌĪĮ", [string.byte("O")] = "ÖÔÓÒÕŌŒØ", [string.byte("U")] = "ÜÙÛÚŪ", [string.byte("N")] = "ÑŃ", [string.byte("S")] = "ߌŠ", [string.byte("Y")] = "Ÿ", [string.byte("Z")] = "ŽŹŻ", [string.byte("L")] = "ĹĽŁ", [string.byte("D")] = "ĎĐ", [string.byte("R")] = "ŔŘ", [string.byte("T")] = "Ť", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Qi-5assets/englishus.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("EN", "Englishus") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.englishusv5 .. "englishus_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.englishusv5 .. "englishus_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.englishusv5 .. "englishus_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.englishusv5 .. "englishus_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, { surface_id = pkg.englishusv5 .. "englishus_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.englishusv5 .. "englishus_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.englishusv5 .. "englishus_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.englishusv5 .. "englishus_traits.trt.png" lng.statistic_alias = "englishus" lng.categories[si.language.category.FASTSWITCH] = "english" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "englishus" lng.categories[si.language.category.CELLDICT] = "english" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "englishus" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.categories[si.language.category.CLOUDINPUT] = "en-us" lng.categories[si.language.category.EMOJI] = "english" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.englishusv5 .. "englishus.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.englishusv5 .. "englishus_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.englishusv5 .. "englishus_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.englishusv5 .. "englishus_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.englishusv5 .. "englishus_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q 6"5assets/englishus_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 0 81 48 162 s 48 81 96 162 d 96 81 144 162 f 144 81 192 162 g 192 81 240 162 h 240 81 288 162 j 288 81 336 162 k 336 81 384 162 l 384 81 432 162 m 432 81 480 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 ' 360 162 408 243 PK n5:Q둦"5assets/englishus_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q&["5assets/englishus_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Qڍ  $5assets/englishus_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.eng_full_azerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.eng_full_azerty_alt_curve_international shift_inputs = kb.eng_full_azerty_shift_international end local s = sf.new_full_keyboard( "englishus_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q,M&5assets/englishus_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "englishus_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q< $5assets/englishus_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "englishus_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q;qx $5assets/englishus_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "englishus_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q7\\#5assets/englishus_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "englishus_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q{ii*5assets/englishus_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "englishus_soft_tplus_azerty", kb.eng_tplus_azerty_left, kb.eng_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q&ii*5assets/englishus_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "englishus_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QZ(ee5assets/englishus_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "ā", "ą", "æ", "ç", "č", "ć", "è", "é", "ê", "ë", "ē", "ė", "ę", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "ù", "û", "ü", "ú", "ū", "ñ", "ń", "ß", "ś", "š", "ÿ", "ÿ", "ž", "ź", "ż", "ĺ", "ľ", "ł", "ď", "đ", "ŕ", "ř", "ť", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Ā", "Ą", "Æ", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ē", "Ė", "Ę", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "Ù", "Û", "Ü", "Ú", "Ū", "Ñ", "Ń", "ß", "Ś", "Š", "Ÿ", "Ÿ", "Ž", "Ź", "Ż", "Ĺ", "Ľ", "Ł", "Ď", "Đ", "Ŕ", "Ř", "Ť", } local accent_letter_dictionary = { [string.byte("a")] = "äàâáãåāąæ", [string.byte("c")] = "çčć", [string.byte("e")] = "ëèéêēėę", [string.byte("i")] = "ïîíìīį", [string.byte("o")] = "öôóòõōœø", [string.byte("u")] = "üùûúū", [string.byte("n")] = "ñń", [string.byte("s")] = "ßśš", [string.byte("y")] = "ÿ", [string.byte("z")] = "žźż", [string.byte("l")] = "ĺľł", [string.byte("d")] = "ďđ", [string.byte("r")] = "ŕř", [string.byte("t")] = "ť", [string.byte("A")] = "ÄÀÂÁÃÅĀĄÆ", [string.byte("C")] = "ÇČĆ", [string.byte("E")] = "ËÈÉÊĒĖĘ", [string.byte("I")] = "ÏÎÍÌĪĮ", [string.byte("O")] = "ÖÔÓÒÕŌŒØ", [string.byte("U")] = "ÜÙÛÚŪ", [string.byte("N")] = "ÑŃ", [string.byte("S")] = "ߌŠ", [string.byte("Y")] = "Ÿ", [string.byte("Z")] = "ŽŹŻ", [string.byte("L")] = "ĹĽŁ", [string.byte("D")] = "ĎĐ", [string.byte("R")] = "ŔŘ", [string.byte("T")] = "Ť", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q*.Q^5assets/error-cat.pngUT n_n_n_ WГWГWГPNG  IHDRbr^PLTEĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿ!&tRNS`KPX:rh *!xB2%VHIDATxiWP97ƽ) EGpHv H@ ֊/g1@'  x/W.^ݥ],gEJ1\;gE8Csp}Ah .}.eopIRD8w)DPxX'rdhk`, _;2D;(wēw04!y`FА{ tnWX$?|zC+`nP7 "h],-ĞiKA(q¬ď/]MRw(3F Iy+8 h/5n!4k]7ju\Q,4)84+·n@h¨UVF;䒹/2gL:|d,fMKukɵbC$%$ؐQ<]v%lLCji~Dk1X U j& Lwt*- ݀ز'L`biL?∡nv}q*x䀹 [jkHJ8 61<%;$ lMlz"tWBz7 ,M wk|+:NJqFq} V&0v&AOT-db(I`bFqb׹8{לqgƞr ;~i]}`Nyfϰ֞/'*\\T U[2{X0ubBI@ܓ ړ@h.gm7I Kfє?i" U@l'2sHbV|H[Naz" ہM*d3-c/Wepdb#H>}|53Na6a(>2ld:tf|}/cG&Ɖ&|}sɸg㻽H/z2|÷8>#Nzp6 !!b <!6VHMzI+p/eu#C]P0~=P24{8!HZ{ޢ~w1{[KC 5S`vwPa}kUFJ?)1(@)$+Qu>tdkPw=KSvu ,^ ]׮٫+]")EAOz)tgqsr'w羢[]_= ҽ2x%urqUG} V';9֟|jX}ws--ֹ1N8ƭyI2?]5b~w)G/`Aݳ6s#т8)ZrW:U9_V/߆ѓBT*Dm+toUo&Fn}ڿih|\KVGypx[iNF)VktvM0P;4ʥ;laP*GEQoVρ>s j0$Ř-\nk\eRtQd'}ab{ m\$<{5s773oC, 0 b(ueh{n:L+jBs ڬ#zBJ%y$bb{k\kg(郑jlQ@rRɁHװ/b5suHtqNϷ^, Tf1~\d{s|Kl(BHs|oЈT)_髝iD(Sd)Eei- xXy@[toI: os2Yr NV9Ny^o?R-vq1q7/[BH*%1_>I՗SEm7╗'0DNosXؙX.r ]?[w*miZ^*1aFrzjG9Z2U{ȨY/rng3]SH {<(9b;zd[~+dD1R.Q߫풋,費֞+|L( ;(wN=ׁbMq(}\n!ۮLh48TgD)c6'l - aνnD򼇘#uROy>,CaF<kDHz-S>QƚߣV5x.`np0FUtG::YX T0;օ2UrGٱPm0zTCEbqIzL %ya0!N52HV No>.C(;=}z;n ̥Al((>V [EXiE\+l1hz Socg~ףj@ DFC|^(>MiJxVAS%\i|'q|Gu7=JD Vx M^,zgt34 ޅir0A,zg,w:.3"DG(_!+{u:Kpxd?lrQCE/#ܡ9J < ` 8ߡ x$(q?iѦMSE9b&OZCkfyQ[zq"#6iҗ7RCel_c9\zBAo4_n= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QOO5assets/eye.pngUT n_n_n_ WГWГWГPNG  IHDR fMtEXtSoftwareAdobe ImageReadyqe<!iTXtXML:com.adobe.xmp [IDATxb0L@d; Ce߀ שl&(c 3x6W0@s8 / 1#إfX-ʕZp*2 >y R!OA!VZSq9PKx`PK n5:Q)Y5assets/finnish.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("FI", "Finnish") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.finnishv5 .. "finnish_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.finnishv5 .. "finnish_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.finnishv5 .. "finnish_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.finnishv5 .. "finnish_traits.trt.png" lng.statistic_alias = "finnish" lng.categories[si.language.category.FASTSWITCH] = "finnish" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "finnish" lng.categories[si.language.category.CELLDICT] = "finnish" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "finnish" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.finnishv5 .. "finnish.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.finnishv5 .. "finnish_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.finnishv5 .. "finnish_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q)$5assets/finnish_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "finnish_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QBuq q "5assets/finnish_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.swe_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "swedish_soft_full_email_uri_international" else template = "swedish_soft_full_international" end alt_inputs = kb.swe_full_qwerty_alt else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "swedish_soft_full_email_uri_curve_international" else template = "swedish_soft_full_curve_international" end alt_inputs = kb.swe_full_qwerty_alt_curve shift_inputs = kb.swe_full_qwerty_shift_curve end local s = sf.new_full_keyboard( "finnish_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q<$ VV!5assets/finnish_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "finnish_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qw#ؓ5assets/finnish_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local special_lower_list = { "á", "à", "ã", "â", "ā", "æ", "ó", "ò", "ô", "õ", "ō", "œ", "ø", "š", "ś", "ß", "ž", "ź", "ż", "ü", "é", "è", "å", "ö", "ä" } local special_upper_list = { "Á", "À", "Ã", "Â", "Ā", "Æ", "Ó", "Ò", "Ô", "Õ", "Ō", "Œ", "Ø", "Š", "Ś", "ß", "Ž", "Ź", "Ż", "Ü", "É", "È", "Å", "Ö", "Ä" } local accent_letter_dictionary = { [string.byte("a")] = "åäáàãâāæ", [string.byte("o")] = "öóòôõōœø", [string.byte("s")] = "šśß", [string.byte("z")] = "žźż", [string.byte("u")] = "ü", [string.byte("e")] = "éè", [string.byte("A")] = "ÅÄÁÀÃÂĀÆ", [string.byte("O")] = "ÖÓÒÔÕŌŒØ", [string.byte("S")] = "ŠŚß", [string.byte("Z")] = "ŽŹŻ", [string.byte("U")] = "Ü", [string.byte("E")] = "ÉÈ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK k5:Q 5assets/fonts/UT  n_ n_ n_ w@TГw@TГw@TГPKk5:Q5assets/fonts/default_bold.ttfUT  n_ n_ n_ w@TГw@TГw@TГ`TgnzotRAB1 FX (REiJ7J &dM M{s߽m̜9sΙRǗM{is9Bݵ}}ɪsma\ys/v=|/^yi&K{Pp×A-(#YwAGη Ƚ~A -o6|M#_wh]izӰFs=`M?OF9P+G8솤,q.=ΏrdȻ6k%SM[osOPh{K{BuA Fo}p8 H5lo~BϏnPYȐe7~Ȓȟ#FਖQFE=QԦ(Otx1bz|C3}bG>;)vZbnK74nl܌eqgV W&<0;aU;12AbĮI-4Y7num]C\oZvԟZF- l0K 5|Fw7:X4Nmܷ-n+yP3K>|(řz_C{Riif-I[V$Ij&YMF4yMV4YdoS[zM7Yf4f7PzVK5oWhZljlrh˱-g\*Uѭn666Sۼ6{Vm6m^hK[_:݄vڽna-kl޾eAh_rF]cϘv|2Vu񖎋;EvjߩO玝Wu.2˶.uɮwЭow={w's# =&ӳgϡg6?Ù=Ϝq^zuuI鬬F+Sdɜ;wszӫϵ}rrۼ|l8$ˑwݹ~:ol}@mw߽7iZ8o@ހ&l65 \<0g`op~]s8yFPn(ReW 5wsLoe#gk2<6s/&5|D]oިn0'jSM4ԇ"\4U_k6WRcf^sQj~'Jat24kM/u!qzrY.Ǚ%e\6sw󰰋>=H%2KD#k}O_ > NbO+ae%l|"w[aK(RG*Q52:VDZh~>_צ׸, 'lL57q)N)wʸSW@"q".qV,RlN)+FJ׬P'L/Ebyg<}&l}A9!fN]Gr4?oXPnQ0[ whnɿSr~} 30?wcOsKcpp9 8hf Y>3T_(4*CŗKt%(6RP ;B"k'q;4 skRr!}2Wǵz|>qLׯ?Eh,參 cFJ߿,%NOuW~Q+;qD?Kߙ[yJ2zjNuo/%>YN^֤|Ys?_Oc(go}|~t1W*}j$@_D-HHiLpF!-H}=؎'O_q{8ቃđhJ xxHdOy+Eejϋ==_'ۑ=?U:j=[È?}B0yTKo$,; {S2U:kS~"4'~ `r7(R-Gw[:]ӿ^PRg?5?D%Zp#7u{ե<#5_g!Q| ߶Vo;pԴoԶھòZa_7PǭYrMsewSvePvnJ*Jn2klJRr&%WJnJ#A.ݔ. {Ͽ!ơM,zك/@/d7A{uP{—׻:4uͮ7Qc.5nBjpQARæ٬5 Nuf, `?=~/N=.>D1gZ= 7 2?֓t!Jq#n'?粢wc ~9Qi3%ݔ|Rr#%M1%gQr3ܲ@Q>9R^J d8^zĿV O?8չY__~կg5NUiz!eD(7^z5}چ^*g#lǽS51\-᪇^Pׁ>ar+nF7yMW+eV劇/ )ZY%?qK[Tb/}ٱW)Eцת=Z+rV׫QNֿ"; m'kD膍uDO(fDY4]w7dEJC8|+`hfFCP241W.4~

_ic1,Kik9XARwW_~5<d`3lہN}`Y,@  # hh,7wncO8~L3\y&z</ϔ? *=*\sqhq 70RnKc{OMMM/WEfЃZʳxv-u׳}6 7~3[G췲~;bj']w~/m'(p܀ѫ@ ~P>| ؀P" A,F# RAgzF[t#Ni3͝ >leWλ`2{ nL p|BoMZ Vgꓭ7A ԥ |V7&Z@hq-nM7Z@h - 7&Z@+helMx6xuf=-Ak@G >2DQ\2h ~<0 `X փll?`; A>c X+hT!㩐1T*d2N)d2F #z<2 BC!_bؽB;/ B+ B+ Bl+ľ N ޠ +nXqÊVܰ7a +nXqÊVܰ7a +nXq WG;n_ O7t@qÈF07a #nqÈF07a #nqÈF07a #nq+amA/DD hhN2:8k؜scsnl΍͹976؜scsnl΍͹976G6ՊrK5Q> G砣B qIĤH7z]q7:?םWz{wKQ 4j45yGѩ:i]I mf/+U0Lk:=v=`/(  ă@0%ulfhjj . E@0;$vB@HoZJ'R:҉Nt")HDJ'R:҉Nt")HDJ'R:҉Nt")HDJ'R:҉Nt")HDJ'R:҉Nt")HDJ'R:҉Nt")HDJ'R:҉Nt")HDJLR zM4W;73[[ -byE>bs 79՛s v\x.XZd`3~[v v----X}bte!e6e#]6e#]6e#]6e#Y6e#Q6e#M6d#M6dlzM/]6˦w.eӻlzM]6˦w.e3Y,Fwxy"f5K\q)A\7'W yx/:evż<=&s3\{Fy{=?r9JGP),C^s2z i{\{{{{{{{<'s=i ŒF hn7^2ʞ{A)>j0<QjNTd1x}"]u"\us1:k8z5WؿFSd>,:zLKq-RG,BwEu"k#FWa*U*CWe ]2tUU*CWeL4U+_n·rj)r|!|!6/{]cyzzȪ}(-L 0((Nt!f@_A|_ܣ z33n,bsCVV (9 {] ox3[o+5HTHT0Вy3\^u ׇ5HpǏscz짳~&eZxA;zvʚ!$gKN:::::::1 2a瓯琯琫|r؜as>L·e09&d L''!΁S0lNY"Ws󍜓1~rrrrrrrrrrr4W~ mO'!Z棁h~/Q99ha?yo(!!Ap '!!1hd>ژ&棅ehaZXehaZX&n@ "0-D ehaZ؈6=F4MlDF41M@<4MCD&6hbZh @n4Pfnh.`8A!( w4MlDF4MlDF4MDD58`@F1mCFY`<2kZG K<"^Ǔxa} /%0xn>n>n>n>mx/^ 0K`6fav FaPkWQx/X>T>ċ'Ex NKŒbإ fra$Fra$Fra #N҅]I6 ؤ ra(v&=tbMX.6Y k k kz kd)Z.Z.Z.Z.6&]0R˅9'\.9I6 d),:€Mh.bRͅ\l҃MzI6Yù0 ù,\l҅MI6E-o@G{`~@N#/W`*f |V5\[.' D A,M=hqZ܍w˳ODˁg?\]a>| 9sj@?$y8cy=.U~žd&ÏjH~)2n$ױM=wEAǁxEoŽ9߰_`=f'yWp<$wvB@ovc FhK@^S&KF)(E%hK`$ti Җ2ʭiKS:wCyO`!D+K\#:"\5{.Ǟ˭#u .%D\FS6L10{+VBgfNl, BB'mEaWQH딏HuZS-A+8_ ,/µŽr`QU,L,MDZ?uvTWq?c?|G;xNq5]@?o-kz 6` lO`'-`Xgv:KLX^ `r̈́,LXi ubkaa- ̄0 Lw"W z^- .%.%.%.%.%.%.m>,x?=kt=GO ^_kX~zZ@Oa>z[ǂ} F`v>z^@ ~ ޯc왷!ERaX~ym} D2Kuo۽Nl/=+g{=+glog3w/=K ^zT@ Q1=*8GУbHE1(r8+r8+rzULE1-b1\E9#[9#[9vo/KK:n/[g0:{{b%z^b%z%^/K{^/K{u%Kki K<KQq{:37M/1M;YH(b&';L>v|0ya09aIɓ'&:Ls0ya9sƊ˰2 +.Ê˰2L3y_B\mB\={)siQ]'w\uZmֶVZJk[im+mBzp"ŏ!gjhc!sy$07̹5XqZf?{-_uT}Zʯ::`}XMfi{镣Ax}{|cο3כcE\-ɲ2ʋ_Sps9Fq>X JdgsyyټFHe̷jkEǕ0n4]VZUj ;]iRr{7pv^j++[ͣOPzcwω˜''.㷰ʚ͟j{%_ f[G{~\fdjc1O 'oM5h*t\`Zmg"Ct]DWMt=DOqKFOK`W0 &IbxT<&Ox bxQ$^WTxCL3Lx[9bxOL|.` NjFߋ b?E*bI䉝)Q&~#BRJ !2RFh#ceLue}D6eKZeQv]e7]gʳd?_^,7&9B,o#(y-wʻ9F+X9N>$#r$'˧3Y|Q,_Sku9]ΐr|_.GcT~&?_ȯrF.K2\*Zk:̖FY2Wn'w]r#^[2'%TgU& i*rPTjUJUiz3UoGUu.SCPuJ]nUnuz@=ƪq!&Gcq^QSkjz]MyjZoJZUzVFImV9jArVMmW;O*OTnG嫽j*PST*RTrʣDruX~QuTU(2 aHCFe7 FFc#H1R4bt5>>c13Acx( )B`\tjc|- ҙO}hoJXi|y<~df16ŵU}j~;t-t=#5u`3fCe?8n{2r{1v3ѫǮXqF W=Zz|yGf#RG=F$3oF?d,3FƕeǴHI`CY`,?FYDԞʼn>:KV{B \ lT`3,Tnآ}R$ꏖrdu㇍kBacqGxS'L'T>] =Sj5~2 yTϱ3ӵF{@Wfvk0DgW]62 j˫W__\$5ukFBPn= h¯*{ѿX:lY z?A?IW}gp[kJި>uu-#p0cңA[߂TkJwWkT8I~_a~^ciTb ?'o֪sC8gJkcQ?'uP wlhㆁw(ZQe'ԾNJ#pWJTE[5B?Zs~o a}M3a$)ȈUKQqp` zUMXR7-VWs5QFq8?H@f[ ԮڨߺoZ<ګD_ aGxOʉ#تxQت2]681 udJG_k0Ǖ|e6mlb{mLl`{mklS^e{e[^d6ٞc{ٞb{ Ǎe̶،&'`=5n@Ah"D}Uą 1Qhh?EHi[p|Z]/qEqv`\kU<1/.@_x`v\ CyWkĵb=%^D3-1[X+v{֊݇P,O'3sKF,1z; FqqK-n5.*n1iƕ.ZcIk\f 1.ӌmb(扯#z1ʸB1bqNū2^&3՜F'qX.YF_Flt72$(Z+BdG.%rq$˿yT唙"!hOMoʅD[+\;U! 14Fӌ \ۣFY&7a ɍS%OH3o'N~=%.%1%5YJ۔SU#5*56^jVRM麟=bf>Z,fѧYCci}FDU&ѧg1铰=ļWf'ܔ>uHVէZ}"Ч}ꓤOG铴as\hmb^f^`v6^=]17w P`E3+vVUTb[ŏW/XZ0r5p_}/j_辐}jk;{{v{$o/w~{=GwN |fciVӟ/|Fy8gu rm".kROc JDJ+l ۵i11i23|dXN6fYԫ8m3CCzB 7D+ VGsMUc=S>ƍ6_nĄؘȈ0E,с6,LgSqs \'o3ƩlS/xϟ?>s=th/x|ξ s_'t&,C 9\7zflZjΩZ'7_/!>48Uhm޴Na 7TbcR1nClUg*)~f:0ꭇ }0"!~ XYK–#()(%=R6wEEb8ԅ}fvٶy X|/zvO@f<ٮnͺP>qߢzeKzeГEC tl$MzspfyÌ4ސX(=D҆ !C{K?oAr\N>.!PpEZy,EҡbcҚg6.]X5"j1X>:n]_'i7v{X힕鈌@-馴~f1WS GEα1UzDzh;ymL{"gr<$wGUl򍥢,9HucV͉F#+7>p]mkmz*)MfVgh F~ zD$VH EZQdt ~cyN4_ߤmvi/{Ǝ} 9%ӎGd_ޑSygK~Ywv5hr,1Z[q6)ZMܷ^5mZQ1 ' W76:"<4X {eM#q:Qi@CJkd/KHKo&NSlg,WX٥ܱx+lU߻{Z{>{pۧYvݿpފ3hҸQQ!AvRzzvS5{H GOXѯMl`&Q&okWFwJT1#Fr݄"a~a̷ˮX5oWncMh-+eCw*UHżA5StlE*Œ|A:_/g|C2[aVWaG8LiʌlۺyɫU :v+_N,j N5R"2s։rc[{WyCG6Q \޽\]fqex=< )OS؍c{l٨EB=qٵ:=Fi~ujzLo\{t*V{zi^YjM,7fu0gѭʧ]'1ح! ;dЯhnVxYߥf| d:i 9+ov Gwkhs^5AnbչK>|7<_"C-eٵs[6MkܰnR|\tdhMU己g׫ð2HO PCm*oZf)ztj/^RƗg]2 Vΐ!!5lv}|CcbAz7K&c1cm5οBwY玝m8p{v9͗{)ZrB}G'?yY E2WYdϦz5 TC+Uk2M*>"G*6ɇvA H5V )0׾031*Jd]uco0# Y5[K$APz"ܰzl&ҊVẄI`N$:h5M $Vɝ2z䰧_rz#|K펉ON:`_zյӚ'}7)G]#GM}zuݬ5R=o׍ U##Y-t 3o Zx7<@FRbeHUK@YreNv=6U<㵗,2ϑ+w$P9[c>-~E5Hgt1.46"+wU ۪ ɂ)H1b*g^4|_ JvyG~a4up-]t8.f&S l^r<ۨ#`2beŪI/3o=jWrG9mq-32"|4 sڿ;p3/_ǮFRDc6 PaΌ3Z+Mcʸ".WmKe[[){§yN+]}堑gd|mGj9R:L+^Z3܎ ,ڦzα&~cM)uƈW1"&R *&fcT[UqL`53#`d1R֔K{ʸrcޯRdv[g"X7UzXزK"StFsԕWJWůҐO2–E 6˧ʌ=gpuƌ21N>_zݒ&k88ݞ22d#W ߜ_.\sC&WlGig]y,VZ2&8 wqP*uSOړ}r/F+^EۊTV+G藕3֪Qðd^*4 ÏgG|Q2JwG*ܘmy9u#3TY1٬UIaMX(ug rwT+2Wj$bIW"8o ZI .P5x9վw ]9vF:%5(;-u㵷Xφ9LCMYb%Y}k1iuܹgi2,~[eZR{\Wک݄5ɜƜkl5_~'-Ν~fock뵘Go5^^ T].au;jMXNVK[;d@ĕKAvyy+ ^*l7Miڊ+$0u lDc5{\ WQOST`Q?:1D:w_:[ٻy>,Z0XV:uܣrE(("WLjQ1Θ}㻟W_zT7WXg-]7}0u ³ce`1s{WgG|uc193ax.$8Ȧ59j&mF:ɋ=S7=zGfo gʼnm~4WK{[H5rM_ʷ\uZL_yί_믻&m[1R]]8Oy:1QzA\($jռ1ׁme77@>K ϶řnY5Wi]aJ`J&Z/.160-)z9WstO܃#}mp {ࡶex WzD&.z}ucU*EhڊڊN6]*ʆgr/Q$9Yn5'Z{ 9v >{"ḇTܟ 5ex߄>Rs4 Ej":k r&l-t@`fZ6i,k`eMIT|mWGtu-Su=oʯaWwS#v}Ίգ5ܨЊգO׭Q!tqfm%_ 5L֙h ͟iAMkKՖNo7]tKڴ5[zt^7Us=6>~l9wnͲ{E$e6u'CĚ;A=A*7,O0-y/n"qP1qY?&t0&t)X)l a_|On \QN+ q JLJy]5S j =ZCo*Po=:(wiy@`[rXBOP7CX=&[Y^剩  pN{ B9tYhJPT\%[v쐋Wݻڷ4)/l{}8MiaxC@m"آhK&$f\a{ҡyw[l⑪˦'_WLS۶xzۗ T'X 9UM|NUeeD1A{Yؽ(2WCj<"_Y8K_>OwOv}ؼF ۼP8y_yJ! 3q8_@ҕҷ&rB3ˀ >Ú7i\VgB,VX/mIQQ|r Y3Ս:G5m#1,)}40)wl'NY.=Oy'ZPh$8a]FJ ga`F!X))b7P%]:Ȟø)xcCqs85 kqQX5ԡ{T)owtNӴ9AʊgN& dX/6'J\`7a.SS﹧=S>bD39ٞ8ʼ?w8Np/1OCJŦBP촆ۘ#dFϗi ZI"cv\MT齋WպtKn۷iM':ee͚L2p,G }g}}ѿ(sj2ҧYAoEOc:BPXrBU#$ PFGFX-Qnig 2 3%b=+(@}p(fa]+h,fi86o,>#}v何ϝL6 |x5u G<a] B=fc )NG=WeΜp(uQLId`pu&d24~aZ"T5>'\n8ڠT!,?Ҍrf%I6m*?OI>}YboJC^*yO.}2fžgtE3џa2*"8u* fZ-2D'7ԉ|,3Ք#@RT)/sM(9T Ra#FK;s<ޡC^vzGU53ܽ?ws\aEka#Xfm^k7uψ/u}x-}GBJޢt*28m, 8 dPcH u6ˌxKMO)Sڣ2mh8"[HG@^]|ZT^?{ j'  *#;kCH#T5?\D;z1-2 NәKK2㪟Aq f>a,Ӌ3 W3v&3K|99q ؇$xr8\";q_EGTiB0 Sv ۦc۬ZlH_j2,o x7Yȋ0J%E;r.K{m^G,Gvu욅CQ*z %ߐ0\lvr||RgS=d1lBc 4Qd Z'9JeW ە.rF!qFwX(Ia^, 3`.v !Zo׽TO,}FLT}m e)J? \|OHz\haǸ6mj6!fh}O>Ԫe;kmdc\. ![ӨNhSOprQdaAgV:ȵT*/N )b מ!~^t6g㞏*Cb2CߺqQ]Z!jMת,CӁT i7SF!Ij 0Ѫe#ED&Qav dN )'4:Y%1[I2K5ګz3oLQLp&W7r)Y⣰e#S(M8VG n=9o_iw7s4Ȼ ;;l 5f}lR-o1wn_@͝װ[xru-r;enZpZ1S4 cBu{˜E ٵ=Q3=$MfJeζǘ@Lwy`]plL5$ zűdADQaQ 7<ߩcW7,=::a45YjNF2ly##O3s{.b17DZH +4`y5DJ)B0BjWIHq̎2fу{䉗g3S0 =PF;*>J 'gJm̏YѢCMu5eNZ8.`5@дJ.JB"]Pum@f JpjkM%bOI{g>$w[FPg^ IFߙ-xF;"f1Y n(D^*-p"|7n{=e}J.'U68ϨQ}=7cM q=1h2{tT7ǛT#(k ̥f>m,)gGbkB {?w}QJO9VIr⭆DV]!B-C[t<{X.X  ɢ1EY/}?&0hc j 9Ǿ< mǂm'0zxo"/VNɏo[3kPz7em`}!GI, $X^h?!6wm*64Pm3ЫM' *@6 ۔ Oj^mw{ ޏj3C/Em^a;/4ŒP6>{ -(fYL;592&XD&./Ef6a?.& ;*;?M7.Y2:JF%h@ZCO ,Nm5Vr{>5VMOȰO]z t?'d'ަֆ OȰOXA-߶d.7F,cm*cx&OOma@5)\[=e_TQ4/ƗfZi]8cEQZ=2,23)Y!v-'r>G$fR,j.ݧ!wPy^< u͑PDd=9 GxHb6"6xSDeH! D-4(^4^vXp =XwkΟc*֌K5 TENB*p=;)B=3^zowF@ǐݝ{_أoMׄx9PM!)yZ"LrҺJ]yJGOmI3$o۾6Qk11{}WLxܥ@ףM' =3գXźǵw(^ &tpQgZ(TarL sbX%04h*@T]u.{ɯGIdӝ^FUlx79(^] @ZH-?&ڙvv{CiSL-Մ{wkϡsb3ݗb,{e}oIoSZһDz6 *) -i {}Y&&=m|>W+|&L-p!MJk/*OK݅,Np*h mk.ѴeiM,c Xl, -FuK "QBU`sbCkM{<.+`CZ8,]/7z{ϸ Xzύww(\9lN-ܾ߯2ĄYEe߻˰WyNG ( V>lOn{XyY]azɍ,i t};2Gz2V,MgG+z~oVsYmT<0!1/r vBEwrH*A9wd\Qhxoɗ>ȬVxOXd+UyBkz&˗;=qݜ M'd%f  ` C{|\L4q|֦!bX{9,X 9TPCd S[ )[:/]_ͨ! Ta*=B2<,`;!D=nuaq"-sgv^3z0r|M:whWl#D4?DE(lhV,3$.VCf'.o쾠1e>~o-HCg[n`[Tm*P`66n>{alfY<{ ww9"Q;7SEsc$w hI4mx 5wЮw >}輯{ϛU]W"<:{G |UNɗ }0ҥI>(NAJDy/i|~IxL1=..|0%EݯLwA݅1QmӔdAZ?TV=dox?=[pދJcxz}ChcYm, ^Ҽ2\7յSk,Xzw潨a`R>pt/%m[m7j|SΰF11`l,=-T6r\DY0h8q|ɂ|0:ј҉Ő?Y,Cw} \t~d\ =7_d'J=OJғw\S<[SզZBM6=6hfрäCX=GfigzmB)rf?_+ڎd-Ԫ 6$&384SNݙ Sӧġw'Ix3c%Gjf'a2q (ɦkg c|T L'ӽ*?y<0]ڦwC{M]d>_v{]>5g:UFXf|+IxƢA@Q(]y}Bq$**7 mjq=4ۃz뺼)w>5dU[)7{~2)刺`N4ɇ6' ΨFQ  >FAG# މK,W0n}-svOZ>Iu}'Z;3Qg+2'<hTґ'eBfygI y !êbK@t٣Zdv<ʫVYQ3dAwZ#dL|,0C B30٨Es$4o٢%f 2kA 2H,K"wZI@F Y&Z 8F]E[AQyko Q=Vˢi8Cʆl NhQzl=>*!sZ?eX Z?G6?g4?GD\c4xU7sZRr|ٜm͉3H@鏼Y)!$0Bj25Xf [xWKBuI{T(Oݣ?A0mOݣZZ ÷c{ei=Oǒyj?ww|W "6ĢL {Е ^TW:q@HO?] ݵJ{ S^!T ;E P՚nBXAi_z?7~)E[=?۝!z|6Au}j Z0>˚xNx~Zz:ԟB('Իz?)-W)m- 5DO7(8X\m0P-plA+IݣTOd3+z]B/kJ:jQ]mVm`\ 5dޒt0Ux ( J\RJ%ģF*&r2ɠ휾 ){B6bi+La:%d_# S&Mt#7=e\*^҇ 0~#? Ѫ`8XfKEϛ]<\׫> :JJz?G13J "{"ܢ˜v@%LԢц6XHo lڴUz|^(g}Y~>,퐧HSZ0+ y92LKMeQ]4Ji*t.MoZB3ѐ[% =،X|Q>Aݤ嗏|VcΪPmyt[^ڶUw]iwjnN T܏v}&AB)a8cL^i+bXsjU,B4\IRF(~㩠Dۼx?aKLFjKRU[˨&J$xt!ZpMnJ4%GA@AC.Gu6f|z\lZFMȻ=wťgdqw!%"}BL>(+B,tN!,`A\p-/lSTV8 98|}VDNc(?K|i 7zfNBX0 빕~L+*9:IYgP[aM L:1pl=&b:p>8}@+)򧃗/L,_ߙ窂2ԙ w9PeKEU/bA[F<*ʐOpÎp*:D`~̓d$ˤ{7ng窬bK!pgm/g7~VSy79u0dpF6NInzx~ecRSc5n 4t)=P'} dvƣ x/2[ӛs?A'mSnL*_*}GmSY,}Yۗ+@]4wEO~{0T!Dc&3m<(CCҚ< is2um۳iǞNJQBJQ;;&X:WF(F2 g3mJ%y[Lp%]`UcsO ;HE)i8wUTݺWE1YLRT/F*350&QD"*vD[\?0J!Ayz%(hT~"dޮ,^$@J&ԋs >W:YKٳG͞mf:&+уj{v'j^O(߯cVR7rj<>'}[:jAT2]f(Ж6țȔ `~D4@IZ \vdOD</Ȣjъ<"P(ynjj-jO'zMyeߺ6KmV{!CS+Qcz+lcJ3>S\>~T!˪xK55{}O:kٜd֙ު.n+. BSD3Y||m+>RsCo5vOIsJ|C.izb>߉~~ /oR_eiUwg̱ "1LWWI UOތp͇W5/Kf>fߙ}>SgJa F6ɷld+.j`=A&e[jVԒ~!L \ r /u|]RUW*i+OZP? ;~Փ"cë{#sTk9bsE2#|}&(Ϫ'b]ǃ!*k4EUb;ezr䗪yJqHcq`St#j'&?.YgpO6Ǣ@XNp8(- lŢO-I|X jjPӟޑ(Q( &OF=Etuޡ/ձ)?Yy*ϵ%mZmW{Q/1C%VmA~vR5cvǡj/u;8yhmgm>r 6lRw* AZ=~H]ВFI*+D,(*6A՞*LB]6)sIƇT#ThA>zHn!LZJ߈ 5'x<5P6GuR-6^;ٳn6uns*5Wec`]:ݥy rB9P ti,Bq@&1Q&aM&+PIFB6J+aXEW-^DJ3iu&qhޘ#AÒ\/G7BAowС utؙSokւ^HkBZϽro4Ϝk~h|'-!9cd 61pGQMVWUg2AK~5p՗$pF B\lxRDMPu,n 9&R*ɬ'ҟW!E6Im''  h&)(g"n%"sVc[m6)7}Mr =MCMT#8no@@$1WaX1MP$(@FSRD ^epMPfۀ *ۀ zCF7Y;b'{_L.Z X`Oy㎗W){nٶ wukoSy=0!#;@S0.f5c 6\`PBZ( |OCL\LG`9 I12m^Ejqe~n:tŧƏ{h3wv+l3Qs"f1OCYS0I;_OIY=r174UnqLp G/}S;Ry[Ԝ"Nc8,a, GI S‚^[JP J24krI_dI3yL3i,l!ߡj%;ހJUQI_xR6=x B6όjUJlRdȶgE+j+nT{?Ya`Cls(gDJx#%S%i jI*hw0= 23HZ 3$ qO$K*`B=n0B3SD$|&~b|Ff1뚿K!sJhgѭbKчczPt=  ~wqJd % [)K̰7 2dopɠV*´ʔp<3ju]%6tաIhn^b|>qe^O.ն~"oYw"1zx٨K,xf|Jt\ۓyyOK.Lwju#Jl"QΪ݁tP yK~K 7- vi#KAN\nj5sr"Խh#ĂSW |JݙF׬F˼rh!5?}tj )|5uI8*lvgFɏV- mEX|/QP :%t#47d P-U#7B)T@ЏM*Ìp$|z=z`ݸDA3OM\;,bO]/YI峵,gb.=g;}clZ5+)zPyj!=3٤jU6ǭkޛpsт9bEɶSk5AQ&zs-5ӻzuB /'\d8f8]'EFjlX 5BTcN(.)8l Ĝ7cV+WG*p?ÿ<5 K onatI*8FMB5 (2:BW2e@a9`Z2BieEwɍyU(8S|rl_/K>"ѧPWZ _Faq 'n<:M*SP*.7dq✌=ZYB:R{HYDR՚\Ą5%&EYl|Jv^ˤMuZű!FnHԹM|7yPt봀kHvؔrL̀V>6S$u>??nmۉwۗ~hA0e;@[Σ 6o n @`R£U=gmՇlTۇXe͘%K7Xjl}u0\|ra^by2gXaS 5+LM$(~GРN'gX" ʯg$U۲7ٻyVtF9M~ِ'7)[/r8뵋l,^vGڋL&fQű= =Q(*f!A $"c&IPKلǦ0E-j,dgT"؞CUHf6Gي/#x5qVo%@KW\*u_$}T+OFU܍ݿ=:eVlRL3"$$$:$*,TM*Dd̒ (O țL"c:2:VxcS:mh9~ \Al.8,]bXǻ|:>I\#޾U=Eyܾud̹?.>Xov; d NCw^:?#yeqht_oots\I^'7~b<ԛbуrF<49#eG͚잲q)UL^Uf*.\{VUBqo~]‚ *Ek]dBKf7g6]^oOC( Tʒ[uàlu?4k|̨=~JM\!V7iߣBZ_O3-?v6XS0ŗR3! u~]A\PP'mmGg4.I,)nDUl^L.Y\i ~'[b)@紀}7җwyɻ =$HN(3F ȾʅvSU6=0!ҥj$޳qm5 ׄ g !J>N%: 2I({邫nRZt_ \d ;{}Hr6O ]SO'!w1v1 -.CHR̨"^d+jOh &("Aoy( yS=Ov:DkJwVcB34 <0Peד] z,(*N&GraGy`K=crI]|Xz&xA6SG2H7! <Ϙ"QC3(թNݙNE܆$S&` ?␄!v,֣Gձa0'oj 8@ƌ !JOYko@yn=eB7&ZaxR"BʺG~{W 3l+ڄDa3-¶WeS6I[dXZξYbN!k -;^Qafr>Thq;]cD`k52ܕ0B,8Q~-`("khWǵF&"͕|I (*:"?++T>t?)눟7izG뾇l%YSP {VBVtd-$Ȭ(TlNUXsafV!TӰ^ ZɍV)5 J?CmPWur<=xX ψb]m̝pRw"'a*(Gs*/v/DȆZF6 E>S/{?B8@ %˖'V*HXpxzANŒrϩ?M*B~>|1GMl6qu(rvziվh;q&6GH]=f9B''ˡ :;ð,x:GpNezyXlu۳R9UL5-B#*w ݰ$9C+hw2WT!y7Fm;~Vۓz3`)`YL az7-~б#!$"QFm^U~-$ӏWH7mQ5v.=΋,zHmc)ICrG 3r_~W6\MR_g=cҸCxA%=Z+_zzSI6y)9_np,v:f:ARN ᏱTv`sa}l/`4Mfsl2PBdEtG]@;{lwXoXk9L6JB ;>'`(l02+eN էK0ZAK! *Uj!6m.5a,j_ú` #1l`b˙l+Y\d˅vk+]BՍmz]ZRnw"C{>ԝ^P:",4qsv0d%խFGwZj\&*>{~#›KVZ|\L G+Ox[S:_ ]^s`:E(o(BIrgX˼ӒxUtEOdH&%2 &#Yfʮ&M1xqVñ"ӣ:4\kmQΞ=6pUvcY̹{\|sfUϙ:˨ѝT`m۸Ӧm65&%D>e$elظU>'"|ata.5%yT\ZW͗RA2qe|ߠ=XVTS)pzpCuUE3thO:'2v^y߮f#[|gը9C?FwW}ջ'W9ށl<PjsgTZnQ3g{߫5kܟQL y;L#4ς׃7 kFW5{w.RNĝ.8$|_V>x(~Уێ#yt/!Y;k5j6rITq0&`=kŒ٘lm@gE_61\_)s9 NY.GA,kƪ3Qє&HTul ʱƚ=:ۏ(]ԪJw5/r>Ev9$Oo_L0t7NWl!y=ʀOϒmrj3gb3Xp0d@BF0+d6Yc5C (ٞ pQk5oۑ/:0r h_O(K+Ya5f /}AZVԈlIAPOC}#wY.rD*^|Mq?<|OKG=LҶ|lo;j64u :U KMIN|)UyjKoUEf[l1Pvr坂1?AT1qq tO^'U跷_Ը|Η2.aQt[(ywHl (;>v{˜ P ӌZ.EQ_ZXxg^n U5 Ro4tp08gΐDJY!Y}Hʓ^'m}׫ #+[QR1 jpYh/<^fFt+a԰AF{D n! FrBjT43F,x| ="\*>g&Nhj%pgDAyVfFz bp>:$&ic,+~ȚDtEYWȩq+T91nK "R׼yN(r){LAgN-ϩXe1ߍ?di[C:C^qdd8P7zK!fPȏ/#Rr~ڋZ!$xU а^gf살:znTafv,@1ZI:D٪);T1jkn^ d^58isg^t_"L0`3L;CEg2ڀa6Kt>B2IAD*hDud!\6^AQ X\Y{X'WpZ|jvKMW i3NHk񌓫l S˖r: yW%T/{9[P&,cC4ݜqb,%ɌX>1=b I`)۞w걟 @2I[!!vZK^j Iվdt]YEbt%(Q99Ƚ'W§˧bB+E,s1344$(x2MX0N2@ ^A}Ya7ngGܖMQ_:#ſoo35 UeNo _S?-I ;( v1(,A4DHw@Qq|ҬYqv&w)tF5''6ʌ,j؀XǞ$ɧEdIT6I:}zTLFz9Hf́\70&myWr / 3a)Й㊽Oq͑Iśxf v%g߻H+uM[<9<lPHÂ_b'ޖaW'XBSsʛBIF,YGz]$:*1QJfOOϻkVݏ?f{΢,FRݳ=Vc؍0=7/9JzI zkZV#s{TSp<,B}՜j:sm켍xJ(b+tTb9 Yj-ήEtmX(^Zܘ 9Hb| kqֺq׽aeNګ"*]M&1NDjM&ȴUfvE#MhJ= 2Joћ>_Eipp+cѣM!EhU~kDҋe^#RntbV&XMEՔe0mȗF+5 IOD%?(,= P1 7} Tw${6o}1Q Fhˍh{38Dn4}' ]ZgR˖=۷k[غ 7im3PCzv[,]Q"k&N&[-VWR '6 gah4y[?-yY>n%D!-9Pj^& pT,ګZDgN\bH(1Mz|ԤyYS:$WzI!k;y:Y|4RI5 `FK 9X2-)I~AJ.eKf8 ] 'GTE2?:oֿ^kst,~t^Ag2[ Sؿ|K= zRf؀<}z^]񕌑-^qhPe^~7̿7u}GOߩ{+{ƖuAiκʘBJZץzlO^|;d oe6mVeqגIM ,,_ⶅZ/n kW,ebMV$1 .Xl˂g,aT- {GvڟI-5nKI?˩ȱZlB2J]6H,}ek(1i[g {;1ڲ"-3ݖ׍ͻ|T+~H57l`!0!)1UѽekjCʌOmV2)2.V =^} ;p8 Z= 3&,<,Q90Rp({bژ$ ”$PO_e@ii 4X:+=RpNÖs $DlVE-ʩAq]o$8 QL ]侖A! _o:'Oq>jGci+pso] 8iE{Tq<{7X# aW{AŮQkƨ1h,1{)|M({ٹ{{~novvvvf W( i^0Qu-gѥa/B9!RSALk5!L]tNlxh!%]K4id~xIܥ>9/yr.HIW|%5P[#1c8dIYS~bVlXj1i8t>[CP+ Wĕ$ H3IdlPP۩FHӦN4~l#Vŋ .l_78۩2y7WTŀJzd,VJRH, ($DvRE`g֙M}Zkm1g[vgivXZ~^!BJ7ndze<ח劸5՛~6(*orD?w6nb#e#vcApS%Ȫ&h]PwhUA?ֆx^QK œ/V>$7'>VˉYy7PTti99逹g_l܃{yySO_W2}|ҁp*:uJP:qrvW>:`Cړ'i<>͊{z(YhqH?]yOGygI 0.$rs^EǑ0abW_?ߏ~Cu|&_^x7.):A[ lڢP6hhO>~NӜ'Ϻp,%R<СtR.iGB J·qkOA=z+0+$1&fQK5ϯJ?Ur/7NU8-L8gsl[kj_u<սVkmUcڿ<@FGAWv܃W .bťB +>ƒWj%Ui< YنDz\+ls?؜+0+]] $0gb=堲ذi(iס֤eQ;;&|SÇSRxOI{Rer~g5Kj%a`lpgF%!A5}y3Li^#EWJ%NEv{Z @CTno2d✹7lziK1} zE?)7fKswҰu(cLY.YM C=fL5*61Kƹ3ݓ/3YKӭUO諽Y?ϳsI7`4 T׼];,;pX{͕nfkcZKQ/U~[g}U|Op4ԙV\htmG8v?cjB>SK8j\|<}uY #Q0^Jj4 ~:ƒ`1~ZT0ׅ~]^u`aG\mSc;k!ZQubN}HWk`c#TJ}(3>}j' 0tU4,߳YS]6l,ܔ!MK|A$O]RqXq豄M<!}bAT!_((kPގ'v~{*wI7 :hJRt}Ot5yY>5}k^2q<{04 LAӴRUnH8w 4Oӛ.tAy\R 3c?ytufv=*WF+G*gsP'n?T5($ज़ؑ6@1Y]1YSl>ӺZ} IcV.VNJ17Pc̤|@TP\4YChxX碹?Icm. W~Vx041:[cI|ō;~^E8X:,lI s0>j42$Q ʌK?*7o}$ O[vM kt{gu/+졋%^XW/@T-˃GN*3@nuy3#kH;aS>Aeef16a1U\B ҹ J9w+!~?mVV]~;j~;dRwMc˞EǓGT=;:;~.qGc6rD8u[հj78@!͆<#.GH!Ij3Fñ:VÁ~85@-F'G}}%/w )w5'Lw;:g|WqbU8D?驆Ґ/? Ӳ lnQm%Y o-;\H Q[y 6y?;H'O[DyںX,Pޅ>Do5g<=f*5_ӑ?!ZW\M{1fg:L |DsR'LK\p{}grlʪ48s`·K9'qxK JL<`wBo^ 4i'wir4[DG/+h {-_)uh2~,c`5&!G@x(Ľ"ߪw*;I(ϡ'Jy<xf+,V( s4s]5pk理lx %~!~|ڑ>X6pg@ʧ,$ "9KHYNjJFpY FXi~a֬(oR ,EuJ'찳5?8tٗxT=:*2{ <݈Ǯ cL_UzrM_d0p&U;(YDjwF}_̚W:% |ި> nQ4a6BaV&/2;_2^ʟ-֣o4Mk$Pl{){FL[aA|7#[Д`#'^HsI8V0LŃA ӆ_۰aV:O=6K6N-x(~؁N1|ġcɘ{Lmvޡ^Xa[+g>RY+4f?odt)WR*y@>a%Zz>YTO*qsѰ] A8R?BCei0J޺١K~2urg9FӥgY˜YSh<:ԣ)V MHJ+=&R ~[)O5,k>VޅkXK)AxOoh炨^X1|'R©!k(`6o}plRz\YLSB|BW8|Z@c*Poa_QÞ*2?:d`Hîݽ_7t P=NiBd~"zy{]Wta:~ϊ^8 qѽ ć Ƨ.Mc))7,~NCy#YR]?+,",hƻQ|x)csԉƲ/VЅ»|4ܓ{̼:!$F ӡF.j8ǧF"t$QU)ظBZnubZp˾ю:T?*#3;_f5H/{Q$ML6XtTgW%Y Df ġ{FSUvRuTf^R* tuf źp>9ƻl#V^2F0d `m8z/MeW͠P_U JRze=Cn_{#}_AFOht黻:aҎ 7X}>]+uAj7I;MoxٶƎ)(iGTxeeݶ9hH|{Qы., [?@HG:=Pן86U^7*>#Ȋ\+ױkmLq+& ^x[;esd FLJ.į<;}KD7rizcӇMߪ3My"g .#Bo {i\cGiݍ:E`+?-8Ǐs!}ie]Oy[5U^;^Zg<{^SZ1hm]{ аYH>1jƄRF]^WR׮uڎ,M7TXɊd"6xRe2viyMM84lYlqio;8:QmhnC>*QYm!^ǓO>5<'Keہ,Nɫt^_ՑϣT5VІd2G=w"mUv6}ij_EZ=ڑE[jicT<:4ZvtU*-x}x[; u<}žx&W⩊Y]Î8{|HT2dM!r!]M/i!C^LTZpE%Z =[&,Hx;40xeC& ?cp3 ͽ Hq$(+Lb.|SOGi7_~SEXƶuq!w'8|> ?牴>!4N4Rr!|2}NPB2h|Ɯ5~K Qck`J _œF,(+̥t0DsNP^|z+bc_Txps|ۑmu[]s*J~%r39N9sgą5k^>6U򛯀NtF|eIL4dd!I2rOg }=(K~?T|ֱ!jEDXI7ohӪy3G}`7U$w!˃1YM%#_ y25̔>uI[hːTNb]cIkqq/~sע#ƴ-eؾpɮ]^!o޲m6#m[i~>FؗoF {3W1ceL9=:rrL_Nsr8zNKHp/+lgQ t$Yw6L2ɣEMG@=h"D`J!A空+x9n|*R]{[^4 2e2E/Ar=> Ddሣ>PcM@&ArjA|?UˡsupIrpBTvQ'ܙ\hxfFԺC-9cBT~Xb|$FP~pч,&;M"פͯ~~Kdu tΠ:̌=s՜o}7gO(zx'NYCT6zzYϳ^:#^.N=Nl=y~bE{?g9P j~w#ucWB9{Zcr"VݹuKv+IOgϝ;{p̙wݢ۱oI?\Z5r>ʳi AwMX䳅rN܏s|?VPL'l:e-s-`@^&dxDXHF[5&8A 8bʘ#]DXJei7%~ s$x6:.ͳaa9%%^ϻQGdccǡuJ/Bz!5Jۘ4!.&cJ` :Z"P;I׶aUvVJ&_3Æs׉쵦4MIjJ}w.+ٱcY7ۤm٪E̍r=193L=ӣ˞3,hz䘄 m^eaZ$ we̩dhc"?g%p3_cO'߸3(6.{q1uC\k=xkV N3Gx%*5_?4M}rȔNP 4")RF&[/0*e|tV,ۻF a׽=L"ؽkZFNR%US"6Ll 6Hh}`ɤ\OA зeBq)ӯ#v-]{%sX&}UiA5s$:Rl E3X-uEe,ܼF:]`zV29gTj\=rYZnew{ޯVbyww)ͭ/GivI /uP!`qC[_t;k%'{'8V(?z]Ŀq2'}pTel0y&B#\"@xd>Qi45ʮeo 5O'S SQ1ԢSf͋x߲# azF`@ڱ*a/';Ļ~TwuE,@!I ->B/EAwS"eW ~NjϿ\=v{+Jj三4^m1)lNdAxtd+A|Ďw>oS;VC --}Z͠^>\6EKVltF8dGKυA6џG9Nʃ7驌1<".rh} ҅!Aއ|RHƓdG^!%dYCbMѫW._dsgϜ1hѣF 2p@]s2;1sĈ~՘S=j{M?KmaӂunB*wcDKkQQsjod=*i1^6C\L{oS;j[5kѮ^x?v\îLޫs^g I?w>M<'= G}+5ON;Ros/e c}4NMSBG?2w܂':CV.M#۷7uzǎ-33[njX?Z;NyIS>.,X9/פA|srͲwXtDzo g,^k)t+k@?'Y',f3%A0 +&WG @V% '˚]koRaJ|̔?=dŖ ?Nl9cYfqI9ٽv;%"J'nbCBYkϵ_ũ|T盳\h8*蓉w|9~n\o"$*Ձ:g_:agj0#"n-,/"o ?}jDzQ-B[b/×0nUTe`rΕ{ʡCWY*ŰxmTz`!]i_PpRx0F 9~'G2x j@#޺@+@^ZuRXи?u,B]! 4[o B/G8#t^q #Cy@_w^+xS_\b,Cϫt W hqOMCG#"♅IG֭?"2;+Sׯ*'kSYZ&segUam=x+lJ.]h{ }0"ww HEsn֖}_6ט)7>@zcF yL\.B \0}Ǯڶ`BچY~cMI4 ˻H_bm&Yȷ_)W{0~|EϨ+3rצ<-6|W^P6Gn(ajC\u%77Ϗyu]D)|p鶩W't>3}DY~:/a:LoZ;%.9Z a/d!Ŕw;'4D΋Ojvdϩـ_?6_<0ln\s+IO̥20E~"Ѳ{TVe{A .НvqqR1"[ ͟4MThZiE_*R㗥xktƍ3ܼy=V 6X?oP7nPҙ'gϴ3/>r%Çmʃ d쓵{F'6%-@fb|/7nc]UqiZ>VT~_xy6gefz ;_TKM \o8U\f[3Xm,٨=Pz;'c4ciwvi#4c-@&I=5M=kT} ™N/_UE?9H(nV$1h\}iAo2G7D/Mf|PҫG'P)f'G^پUvM:oxd5R[-W{MMH]5E]+OJPF8OW˓j WTOB'̆'*ٚ p>Wqifir뇱A t%[4ܿIPO5g&BvZ|-qfMezR=xdk(+}R5 ѐfڎi9Nc+iZ@^Sja5 ȝ a =9鎖F&nymmim>TWUZbxS"]4SQ&=%~Lɴc!(߶XSt&~9\mi&HiH l:lKJm?)ژaV%5Lq}H3YGDuO3W_iSH#O#O#t%ji<4GE)"t>C {Sd~.ca]LMmAẎ=)Hp{}_m=pFc*yQqdۊ[Nr-<*TyT8j 厕˝yP@PSRl%ϿQڡK{12AyuLQ(dkؑZ8Ķρ1QiE)?Ilj]sm:>S8iĦa7f^X{=*YO{/}H}{:ae6mVM㫧I#o]\;,-@?~CgֻO.A!YJbðΧ:צ|}054ˀJ}0m}}0mzjhS ||tyM\S>6:b֬YsjX(\{6"';5UJ z;쯦ʫm@/{mVj&_i2,׿q^ZcmM],U{h,3U0Pצ\%o:J͐W_ے8ɤq`8K'gSWgmsZq.k0oa夭WyV__݇.osY:{zBI:5 sH|n9ggt | fXax=5 4ZvI4<)Llh3w<-̰o劽2S9n"IZڄJ7n\_7iR?G2!INQ!ybԳUL _o}vYzZZ7Ufa}D-[# 4p)rtrr4um?u|v["4\qofiEi|~*iչ򥪄H:}#c7HIjB?KthLr@iOKȧ؞9 i .sUsoS)_P2dwfWaBlۇ 6N\ې-<0e|CH9p6}!~I],wEgHs<]H3^aj7.'Dt.ˡu9<C&st/ {SgR2B~Wsu=$k$wi|}+m8QlP8pd;kbɹ3,;xtb1n禌?5ax} r8U50D$NDϗW,y).Їoh*Ᏺ6rCyAyKƉnn~#*nz/}M^VP4{~Q~/&_QDQfda3/DEPH\?!v*mI:IWz=Cis֎$d@Ѕ3sZ1}64Woݬ#gϛʍbN8_e^an/Y :QJ#s/Seݻ; Zy1-HC ŵ'~'_e[9zٍO09|֯>WʾZM'є&6|r>MLⶬp>];5. +^9Q T).%Nf]o]Z'So+w,6mlp8z'6o>zfrNN)MlTbu^y*z]|wI:Kw[/^BcC3qI$~Ll9z'4pZ>+trmZ,~o||nR9lϊ!6uNʀReubY QN1>΋Y`΋&i~:c=SYǣ£yG8X._QJ\BaC'n8w9{gʮ#9]7ɰpz[tpBZ]_+IaEekzFFL6|h):;sTRz+wO8im ?']xjCڤ N*}3J|p{]s>+؞mh"8wk |辝r-; n ]uA(|'N,E. gzmFOi{1΄ߑOdUKZD&.X{]8XhQS{ n ydzdLMه+ `!]i/H]u&s'VDWȩU,-9ꄂz]%$MyRj,3^V^G!!-s !T}ӀsED{:OVH?9w6ٟ횵qb=;uxgѼ;3-Fm'Ŵd{jZ0mZA5HMmDG6]7.2R.aeu%IIar;]ovQ\L{)K@>ۅ[è%&T#Nn gYlƳoϘ6u\aC0?7 Sa;f5eZvrqb]5o.Dy-qu!f‰{J}Z4llm+@{mx橬 ̨7w7KHGSVS4FsG+vPV2mڊQSf)MŲfC^F\Cg32HwR 4tX"KԋyNr?Z&͛&6;佳VmݤUë'#MLZO$D&F&MϷ_˂rfY¾z/t5Վo\hCI3D5J.5P d؆u'OLՈ k4$4"ɦ~Ǔ#2:S+"^$v2C;ƆG$$5PJz~ͩƧ\VkA6v+hPur>ذɮmdemӅF.ٱcŻv-fwow5k 3ЏGKt5M7rgF3ϕgޔdBn{f:.yz{U uM#e<ς{nB_&ܐC'+?Fء_ҽ̙OܦQZzwQ{imGn보vĜv2ۧM޽YZ̎&SVцX^U#3c^_zgPWtC<=Pgz,W(>i~Tn_Dg}1+WΘ쁓(GWK7o^t~O_\戅 FϞ,}0y2@[>|u Ίuj?סv~j/,pĂzUZRo姿ӯʣ0CC~sNyxܣTa~/=~7fLc:O".fޯΌyhG.5s ~w/F]V|O0JvH #gx%qb'PEK '2WGx'2H "Mqώbv H+q.]};Ab5(sF$@L#k4,m^DiY Mz5v%!,'ㄟI1gߑۓ~B2RHIxCҔ [_"}Ldgr@7dHI..qua2,pz[,z=TĖ$C y]^.>&ĻPF*.)uօb̟,1׃ TZ _z2 yc^?1~e4iXOB9"A]CoB"xa#N@VWI o/\f /k Q{z;qCZAV3^d!6ہvi.mmۍb쿽c{62/{*ޙ3Yľ -$-@:䀷.\Q4zyK w, ,aevנd!e?b.\7{u>亘J6x[GYK[&CV<-R/"VJ:e6z1 FlZv9ix"$mP/^d$eΫ9 ef;ɛz 62 q9Mj8ӖLđmys-}AZBE)2Q~Ϥh-ʅ$^yt .hd޹봺m6Q.'pNgk8rBPYun!=Ħd^/Nҗ_:w ֩reX/ ~D҅.v5>w WBRڀk*i+6# 463(Uy3( dnnhA%c>Y:4> g/X9;W3X z{}/dl3e_j۾hs5{w[[\}%NqNhw\Fg37i ,q L_&" c`YcK !L!&q>Nΰc>ac kc&i&ތwӻضZcnBG;\<0F$kd?bXN 60MZCv@f)d q`}ZAjɟԢAg{5k?|!=A@rzp"E'K< }~ pA_ w`ת߼nNav84@E~Hϻ ly*^@3^e)/_x~֋asG{4p0/ˇpm//Z+_m#܁p'7F^Fx;"|18?@xS4Pw@А]HF `=,#)`Y|69"p> Q' D!(xOBpxdw #wpp!0L.gl(a qʁJ`/O B< y)&ݵhtpa89B yNa,537 -t7񷘉"ən|F8=S)Z$]AÁn= 0Fw >IO"O %)¥%\%\z•o t=jGu_$\'. ,r`Xnww`&`3 lXځN1qw v{'gY`Ky mt U(}g#i=и^>)Cymih8Ќ}Č}Č}Č}Č}Č}Č}Č}[܇9vgG}9`?%(?|xAC/b*i==KISi80<]K "ϵxdEZ OmӞEkLE0XVmvO ~< /Ay ct# @i@i8pCs^?{B;|癃 _ 4`ǟo;s)CY_^qF!u߯k >8g@hY #ÆF|`}'&WK@hV'ӷhk#KQOE= eKk=WFWMH{B4l];VV/V+Ujvel6[}hxx؆;Gc]< ~A8Eq ap@C&h!SWQK;jB]}vjh!\H?'X4Аzqꥡh!L`^} a;Cͫ Tve%Z Ԑ\"ZdiwIg~6 M@3BD..&S']n`~%%,`IK2XmY6Kf ڤPk~@mShFDhf E6AC3ByIü]z)px)JC( 4r}(a")ĘLQ=} 'L9Mc+Q@v=^D8 a~0it m4rC#ݥg!w:px`t>g 3s|΀9>g 3s|΀9>g 3s|΀9>g 3s|΀9>g 33D` 0xO{g}s~ Ig1_#4!]we{!]we{!]we{!]weşpA_-]FаxԲeȊ!+^xeȊC9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9W@W@W@W@W@W@W@W@W@yW@yW@stV@gtV@gtV@gtVBg%tVBg%tVBg%tVBg%tVBg%tVҪp)^S[ P[ +++VBs%4WBs%4WBs%4WBs4WAs4WAs4WAs4WAs4WAs4WAs4WAs4WAs4WAs4WAs4WAsVHܮ *(*(*(j(j(j(j(j(j(j(j(j(j(j(pyC@tOvmx. '9>ȉANNNNNNr}x '9>ȉANr} @a @a @a @a @a @a @a @a @a @a @a @a @a Ba-Ba-Ba-Ba-Ba-Ba-Ba-Ba-Ba-Ba-Ba-Ba-Ba-BaAaAaAaAaAaAaAaAaAaAaAaAaAa#_Y|~=#_|~=#_|~=;g'Dqv"Nى8;g'DӀ8 Ӏ8 Ӏ8 Ӏ8 Ӏ8 Ӏ8 qv!.م8gB] qv!.م8{gA=q ك8{gA=ӈxшxшxшxшxшxшxшxшxшxшM`o{؛&7 M`o{؛&7 M`o{؛f7`o{3؛ f7`o{3؛ f7`o{ [-`o{ [-`o{ [`o{+[ V`o{+[ V`o{+[}C2߇ >d!ÿ~ߏ~?Gh?@hA? Dh߆J+mx6oSyې]iCv ٕ6dWѫѫѫѫѫ:Ы:Ы:Ы:ЫQ:^G(zEuW'zuW'zuW'zuW'zuW'zCcu 1:^zC.䎺;B .䎺;B .䎺ѫѫѫѫѫzЫzЫzЫzЫNI:^'$zDuNv s3An r;" zo½^vzEnp"YD8g,"Ep"B"!B"!B"!B"!B"!B"Csp!9D8"Cspady@ady@ady@ady@ady@ady@ady@ady@ady@a@<<lxہN1q {Q? _tµ//4O'\{H'\{Hޞpm# 6ޞukoxdJ'SBz2%0!=ғ)!=ғ) =.E}9ӓ)!=fϠW/"^ړ)/ԞL M@3Lr8L~0}D``6^ SqvH^ ˁJ`v`(x x1IBY`_C^ 5F^ M@3Bh&8`&8`&8`&8`&8`&8`&8`&8`&8`&8`&8`&8`&8`&8`&8`&8`&8`&8`&8`&8`&8`f8`f8`f8`f8`f8`f8`f8`f8`f8`f8`f8`f8`f8`f8`f8`f8`f8`f8`f8`f8`f8`f8`8`8`8`8`8`8`8`8`8`8`8`8`8`8`8`8`8`8`8`8`8`~{V|!CV- |[~j76.y6z]Oj>>}>}h-~~ ^4xགྷ_鐐!!$PC8aE V5ox#ƍ={yk䰑Q#zq'<`ۃ^|?zi:M{mڕiW]q?.>trtMw'ӯzƆgK3ޞь/X3W8s̽3fwg^y#8 l N =xopOYf̪:kYozwdz b I ) qN!_ 13?B? ca&] 1;`qvG?~1r&?8Si)ٔe*1UMM/01&bc3boDOą">";rtȈHkdjȍ#FD^|+/s%59*"jaʨ-Q QmQQn=dNϜףEϏr¹+0w1c"b%!f 1/\y;棘k1_3/q^ʼ束wqo8h_ZlXlT˱Wc[!V5l qگ?=!k0`c /`L8(W'nLܞ7'SxEbE-ZGbd#4:iEI&'Q',hů'$$oMޞ|1wK(Z_/_d7RXgʕc-:5.uQiִi}i,ۺ̵e_/X^s //EĊkW|zzpz~VN[YqV}a%!QG=:ѭ~Xcɏe=V#?aY9Yٗr9s_m^ݻfĚk49gmr^@ޛON}r~:.g]WA@‚Usէꃢ7 eŗ.~QP2䉒R+~a /l'm 1ecWo,6~̠gf36o[Ƴ~ώxvnyⳗ9bs7n~eۛ?|m-[[Bߒ%k˥-\}=7E<\1[lMޚhkV[;n֫[o6n[Rem+ضi[öm/n{k{ۮm*{i#*VlTW=zo۶#k;6(Q;.Ng3ڙt9+Ng5k5#kjbjj2kהyÚ/jYɵ+jnu}ڷkձu"֭˯RPVwb;u}UW?>>>|R΀cvٙ3kgΪ;vw~ ! ֆԆ nnÍ]Swٕkˮӻ;|w/w'|O֞=[hnLli{S[/6bhiYRRr彖[GNko=SOz~ew=aN7j_оMj~78Pt9QL>upރW~qphԡi̇Zyhz+:O;l>xx[7n;|×_=| GBX9Hّ#G~#6--mQ[F[~ۖm=ml1A1I폵omZOگwuH((Zǻ׎N;uG?8yNs΂΃>sX۱]?>xUێ? q"DщWFwtu{Twt=v3guOo''sN:[0QqKRs2ONw剷lMU?c׽ؽfo:0#Wu_:S<[=l6VT?#(Kb/8ꜞU]>Z%̧1u/6稺7Wu6Wu_ϯ`6lØVT/,(18JY[b\PX&?RUXRHnN^:p~(Y~zYnQq^a148DgGz <09rr94Vz>d-+.sgnQIqa;Y<+d-9tP-gϰ"ְ8ҧ|KhUҿ)t,~JQBװRjhxZo)[ǖQ'MSOt̼#Ɲ(c,jKm4OұB3K똍)BBtꜚ:iTNa'7cJҪzuOWHJ+s8]-tEb~6ex6i#&@6A6=Ħ5D>Y/f"X$33 r^tǰyl>eVeZYj}~%tYB[RYrieGct_$OzX;`e̮*Vjvupsr/V_Y_Aƾ`_6v@frGku1{g-Sa]2{fOl{~Χ8L3nm]|l`OOFf,gGsl ʶkS"ჸ/ヹ?>cnp>G{(~cX>Ⱦb$')|*O|3y0Cx(pndmb+*y&w,sx._b~bCD*bGQ>1Z/ƈb/&QLD,A1M<$"Hb"L$"D0 sD+b<1_ 8abX(DxX,$X$%"E,"M, .VU"C<*LY"[\ZkExB<):Q z(ŢD iQ<#6ogfE<'mL Q)D.vNԋA(DhyWqP&E8*:1q\][miqF􊳢O;E8/^w+b@*'.K5CxCX)~"?owe qER+~%߈oŇw#{*(>ğŧ?g/sWR]|%!ſ Lr)%$}, ar!#rO1r' i$(')r|PNr 3e%Cd Z^LF92ZΕ1r/cUdx@. 2Q>,Gd\,"T&4;#Wtαr%`geUV-WnvIfG];/!d̑r\jZ'O|nu7};vFľ#ױWd,SHY*7ȧF$%*2Y.+dr!F:Y/wK{dlͲE^OAyHGdlqyBvn#O䷥K+>yNK|Y^ߕ(//G c|KT-&ߑ?/K|OZ/#?ɏDI^ɿ_oKw.)7[= cd5 C a{ # -)-ȣ/azΑ]TX>(0';$(7'V?Kج >k rq`[v^Qvg߮#4$VVl,G/(>i]1*FΘϞSXުؕ\sQ ^jݪBT꿀s!x|#u,Ga-wBI^~Nw 5<5} yk Jm^%HHyO N{vaOOaMQnnA '/{#$;"v.0,"|$?ɳg$rc}aqIQ^FY|(T>,}(D1d҂5uҒ!St EO ERt EzTUbR=lLV-US;n6i곛FUFWZQ^R 1RO>ijkgڧ=gn׽Wc݄obӭW~abk iR ui8nU}bz\\(^ ozYfGզ}96R,_D@ j5'tvH JVn~^%CrTL'k: Krsy4ld/Q Uϑ& J<1.YлXT YBcSr=+~WfC_9WsUxktq SeU2LUJ*oTYUƪҪJ*TiWe^*PCU?T*PCU?T-}UbUvNEØѤ߼wW|qG^6y| ̇^O-tgBK?Y_m 颖%j#0n9bCbOIQ-jZQ?ȣϢv}vX]Cp$'x n;=l]!/_CB nno2~b{H{Ja#40ݼۮzZɓX|汊pkbO߭oGŷc N) k. 1J0ukmՊ:W]+&槏5Z͜nty9iG/UB$06:/yE&1jZV>f+n"A.@˛~csyۖpf2Q㨝 sFזet#F x0%hw:Թci7\rJ#zxbKP%К >Ч4RrjO@#0t5}b;nǪķXdfgڌrVp9'Ro'Z$dZmLb:-ft 2ffmD1KVckD'x|\fM 2o* @3mŝj]1tMskgv4%>Q &X#|ʟKAh゛<54(虮avmt~x)FM12X$4@t&fx0I #h5j'ѐ捎 sFb|=T751A3]g,uESu Dב3^cp/IS0:?϶Js]3026Ɋ3h0=#Ƥ[JVEH2s]#9R=S[AkHYӕ\tO:pØrs@1iVoC LߍGҐRx5T?Eѣj:.+;M -$!]c' R/  h6v)*@5[<_&< 7;=;L2|cIMZ*n sߨy)]o5kL3eK]A+6SNczSoKyTVZ47?(7z51=cd<]iuB5.;o!3df/1Hp Wї bX6}7 \frZjmM*@/o)fp±|lӃ {Č[cPKTaA-sPKk5:Q5assets/fonts/default_normal.ttfUT  n_ n_ n_ w@TГw@TГw@TГ̽XTG8>3.."A",H"b7bkQcLbccc1DcI]ļy7ܽw̙ϙ"r?TE;`Ըw&~lޤS f!.h 9Y:oBqY%`Yx_3>k\^_6&}EHV᤼BWо [ I 9F}qOTlBEdz[p֓?ކzF#ofO9~'P)B}Aa_JgHN4uI+* <[[ z֎FP5TE*J)C3xJ2-'ˑR/FahUsȗ&CJP@e(\(('B gu| @H?Dg?T*d3h(VpZ*Y"\O AFr+Ph:@E eمRE j0bCa2QxF,Fr1喢Enh3pǠ|n Éh :bdCa?qJ*mgAѣ9KEQ(-, {  ~&:4.|4.5²1h={E Rw _\J _r,а,>®+- ?x:f{iMyhNjϔ^ZoeV j5urauk))P_|Ԉ tQ U~0rr+GnyR:|QCd(]k4TȆ Tu.er dMڙ TީQ: rOeq s&Uuuh*?` },B F>r@y1%# m 6.-2=r}Pn&ȧUle/f@=qPA=(-Ee]wRZwh#u2C-N#P"?<(Pؘ~ QI7&U4{wjOJ61T/ +y[TBe r:К3ob^GG>crϹZԍFQ>+BLvj&Ci.Mu?)DNJ46*9fcɲF uQI6(7^rRA.vׄps=,cf~ p@BamD! [z͈?&Զ}{ *U舲9:"YHqh+tHf[vqCz-TΗuXx—}m-JZ&P:G~J,s@Z |@)B=ZgL{)Sz6Rm$dj:4Qt_g}B߁gBDD#.Qr\1ES;(КB/ȇ kATf LMsD6X*`߀B h3q@j3Q<0~!@Rq@ 6xH]-1pFig4_~S<҄I7+i]miW h LƀNFnQ4}!7vyoT_ VHyFT/솱/ƿCL/4m&fI;j6 Mń_sm?/FR^xv \C=ۣPCBS`Nx,JcfTj7+VY&@qD8h\7뺿ЉY|s_e/Z&Tm5T[j!n>Q2"cMNCxܛ4a!:,]Z?1$ |h:9ʁ4H*P|P?Tb |m}WALҋ@3?> Q۔Ϸ@}gFCP։P"MU BKlC9B2:W] ~W) [p`B69[V(|O9-ؽ-2)0h37 |M[eAb|d) t<4à8@9or>|WL4KPBw&Tc@=̥PD'ԛdqG 9i)~Mo,tMAs8fGGWh 7('JxՠBGW{ᔯ.g,rV|g#24ȉeDll<X:AY6y|E~0q*ΞrKvw_(8b |nKcqj5AhM&I)Tk@ 'WLOzKuu:=ILaqg0]nL S)}0!~/m;w47F0hZa 0oP#L020T 0aۺ uuuzyHi4R* I} _024|b8`: o[o=u[oUߒ}nnw _ z7ݾMo}Nݝگ6lSCeO%`ias΍'! NB#<\+R#7<'.AGZQ FQ Ea(EHQ bQKQJDPk%.o#ꀒQG:Ψ ꊺzިhT4t4 EpFL/D D;.Fh/ڏ :!=:8: ,z qm$hb>B$1Ur@+drt. WrQ8^A9h<7'sxfq.ؕZp\+%NsMܚ:r)\.%i\<ךӡRG+R FkJU עh ڄ~qA8Mx0f`FohSOj\4A{6kr|MKcѿW [wZץ{i*1=]:eӟB'>^DoMk.e }fEU|WfzzdžI^M֋P-b~izEǰÎzu7ᙦ^1Go1;%Bw4Сfj:-fѩNsڬxWLFo۱;}t~HГd#$GlcVAЂL^TcP?gCaa.0JLlL4G0r $c zE8+'ae䎚LH"pM>SϤ#Ҵ$;y{|Tze^ hhLxZAi oyWa`[kt&\}Fm>Ě-2D#EλQ#6F IbptK;L;s#5zeLMg$0Amnl=&uFpjC#vAYo׮zG<#>P55"MHmv>lk 4Li~i8 :Z#PBGLβq3szcV.1 3) C,AgJ$-uIK7xã4M[h&FyϧnΙ|8iaJ^Z観pƇ^޴LG&3} 8 K7wN'I`tWt8sM2?K xg I4ⅾ/|۟Mod 3mϚ96-?[A8FY֣i`xL7>8r(?rrL|?m?QM`.59rLiB&u#@ܴIL_d''*\)[:N+!o27:T6̧T6 r$†u^GTVӏZ7''ɮTOBtnѝo)\Y{,hઅC|td\Wn6woǗ'BKDTYqJWf*TOZUX}hMs+Z?inf)[Ѷ[.ne':b::px)ȩsKObs.-34n۹osգGI-=Gy5k!>>}:nlh554O\_Hi71.WUw`d`i`E`Mo> "A.AAAV:t9fOG/C6XxD Rj M Z0tC0İaƇ;:gxFxai"F8q%Vă)!?rzjEZ j*UV٭Z-lUѪՙVﵺQkکuڸ)liRܤII%}t7Iȶm h{_ە؞o߹}Z1_։TR]J]=SEfv(u+9 9(ufjiԵSwH}* >:~ZҴkv鏇<ӡ1CӆzhV8l۰~:<ۆ_aFC2f4wİGGdF3v8>Y0,Ygͪoֽپ>:g\s&:ܴsoiWt}e+7yο=OKK/\|Aɂ 6/Yp|7Yx!Y0`a– ;/L]xfՅ_.|H\(`QE++{._nq,.Zc}W߶?]gl67lH{ä 6\pmí 7n쿱r㕍76ޫ,QaGȦM6]ݜ-dKɖUU-rNV]_%mMkօ[wmtہmnw/^rv}Z/m߼}kwrߕ}='w￿_r>@Ɓ}* kcqX3uʕ6wYjg^}L_YhR!P4 33^!G qnn֭Gn]=7u&_1:"o1P3BM Jiqz4]5lA((*VE `M҅;1'41N'krĺj}G۫; ~!}r?I{~[.J)Wǧ36Lp'>ͨ2.(96:;:X[)sKlT=$s<0B A Fp@'"w{vW:=/:iӫ{.۟{#7QW@~JK@ A s z99Xx4qgbLVXTW3 Kg#+Gc[5Sׂ`')`-cc>Eɓix&c[ٲy+U9ҳ !3V-6u'ow79thNN93Wi>thv9I933<'- C~OQ4jI>^nN kTiV-Cm W;ǀ A5p2 @-b7"]ӻF-^lx, DBl)րcYF%@3F\گMon?[dAW|d͒w*߯}#[ȟy\u`nj!:LulMaE-y3נ|@j>"ye҈>!&+[uu"rGejDά__{r_˥dQft66A/?xsv@ ͰH][Aq9V=ܼS<(= =XFK'\c;璖uZl:t(:p sltןcs@@x'8F{OpO܍w6!zbY;%/ʜr[rnh&ƣGc[ =a-ne I=P߂? RQOPee[̿rgfQ1פNӤ4rPw uFYE#>5l =!"Pf1;Mu`j_C;TPcӭCQқΓp45>R?zɒ]o|5zφvNYܴ8v8Y0K9亟ZNä-|B/εCB$αSlkDJj~/9m۶ o.n>'Hwt>sR=G,m;;<3@R^"U㏄n :l<=lm ~0]A<(T"2>XQBp64WmpQ!.xڥ٫o)$£w_rTLWH73lt}gvb1D G) 4p՞i:1<CcB4{{.8UB\LW1RRP!-̒N^uo+/SdfmG%:*\9qB4z%Ⱥ?WXXY`^xv1U}ػ rX ?rP˗Lwz`GeJ Ra9E=Ym`g䉵ُIuiZ0y0 Ίx8b%NCTUP*َ7}P8)T^=iNMDQ 7sЗK׏GeũTݼOt戋HQSB<(XN" i\A rf8 '83=-~fޣ6_&cR'XMXIK0Gg<K;ޮTtvŸx^-qwB=7 C3]pl\1\(mB)"\#$MR'AE4n2^uD@Пc.kKߺNS㖕.]FSQA}*Pxy89X Y[ cJGp&A +dc$M JAȇbcxcf`'j݄)Ó^?_ -~ }vqֳ/D%>UJkۀsmtNVV9[9Z%قA#?XD3,åYrK&ҏI?J[ϽpHQXk0 H*9 2Az4dd;oL~] aW7|cƱlG4>&fYzgƂ˩3Sͨ5-d!6 x 9hx;;X ʬD$ +rAo@)Z2\z.Ps?<ѳw6^Jp>K )(ݻ-~OrX[<%O1ľ6HH\+ 5M<+t tM$w%JJ6%ʐ- yOĺ,=n#~%%ti~GKjlT4T'yF"vXfXG34\˒_^ B O}t=qז[V:;;&kMc WzJANcG#X(H-I,uSad3IZL 3"CA-7”fgdcȣ %yy2ΠKSi&_|~ј[q5 +0`P :X$e%i'd!<˿'s/MgGtՂb͂V*1 P-H' $RK[vY?y8P#M,[uKJuHGo|Ï~ ɒK0 {fA)h7ugIod:.,O]Nj;}uqtр  k"rH4F)[~0PhOZ"hqDvTqfJרg<1`QNYW;[ߓ.{#1Ƚ]W_ν- .{dmbjVtlԘb-6dOb;pw^]~>Y_Yƀ> Ή:ӄ*1_B|B#]` Ua-/Mk$od4HJ]H^kd2c% ]r ƢqyKBuJy$mr8:a!q( [ L5,Bjs ;ѭΊsYȈ%!l Wn'ܐ7ct"}ilɁQ1/{؜9E}AI]%_qJ?n>'̿A.*dH=dN,`!mr6€bv͟V 6G{H'>XW|˵I-oqHCftϢPyΙw0E8l-+BWB1c9M$'ͽL]M˃{-W/[D,ATڙWت@ߚ^ @{ 7aZ  ;OwWljmk5x%kq!0B,SO1;VaQ KIk_VJsSy75t UAܠ#?X=⩊Ew4څg(<-qn-D**͕ ^h )MPA *ӤzW.%5rڶ-3752uK]zD03=KzG2|icƸ.(YX̎>1TmSB[h7K3tvDX75D 2jmG=y7cߞ=}O+_By =Mx?i.; h-@^?R]@ y1Hp-:ዋJMEɖʰs8!#-ð9aE@:?J@5̯N[3f6JlI#\jS``VElvW`C>qHnTH3x3ks$Ķ:|Q{w!?& ;CB>ckT mf[d^֠)"BTlZ+m\*a^֡gUI pp쪝GT9bfaUvms+n2>:` GZSn߇bK pyĹ"YPelZxTCD;^|N5?t.\7FOOc.֯4_\/1G$u(*aIBWm)UR V3Jrz߭F&s4s4&deMi.).'R -!D |Q\ yz6R5e&1W q,@6 DZ RvA_NҳJ#ޘ4P 2\0ScAQ1ԭ4d\[<8u枀'|d%.xڪYf:}iWvWZ Sɴ{z<$SʁPʑh9,˖,V4Q/XF2DS(?/i8QZO,;wp6gg Hٙc D7a{a/{7t9e4:7?Ǣ-Yɹ}ߨ9G"CGţuYӘHi;Jf/UHu _ѤhՔiB1ٿnJ[Ǘ S(z˒]USVN޲y}  ɡ5Ojx-2k̏w,7JuFϪxWc7ZǗxΙ% {1ruEfrgA$@Y3` dJ) fk0R,Cl\oLF(쀸xMG[.,]oF. 6w7WY&iV2>j-s&\mr t-f[`Ay8 >:p@&l=tso}q7"8R2|٬^](N=+0b΢gS}u?B[IWFiV5SJ9RO48_{!N]G9~L دLf~  oc=SsXLcW6w F}q-Ph~%c#xB&]>0m4'<,'E/VNs1_׊A8h)spa/Cu@HW|U|s3+خEbcĨ7J.#._&_{|2wdc`ǿuZ,׉<{JK$d#-WWl\]Lh݃c89k2`TFbÍDe$;;8~8JK xe!0:Gj9Rr YnXq3F8N H:ٯ p8`g_DWh\{Ng0 1d֫&O)C:uT˾ӗZ8 }B7~G`qwW] ~wI7˭p1&iwIXd{U09MsRXv9a'$Ob؜a6yjt.,#*TsJ2rr2HKq3=K}1dYZ|gކkô)-Z2J<RRbrN1fYs {k_oOz0D9UYj⮮nT%)<J3B34G@B5HHZnӬYYvIuݑ.M׹ބU˜R$Zˊ6Dy+k4 P٪M'e-)2 zB~x"6õ:wV|%%X d~]^}>nޏ.onSyW0vy.?/w'{W#^BV p^v&cl&S) p0%}?>mMu }a }ok3_e%}w݂}tJc΄}w &3>>YЬ fR3˜uUaƉM#Xa~5@%W!?KFeR+RrGƢNΎ2o'u >`y8"`L;I] vC!ĴxLԸ ٹ?vc;#gd}t[ wvgIϻ?wiV8;ɯÇWŬ_`Պ cJڶ=RҿŊ/~}U\qvI;T/PX9l ,Cpn"Oxlb*Ja [l,<.P84ꈖ1Y5V"'lBaT*;JIo[@Y0'(oa9k>ן<|O3~ c j/q:2IjA 7JʒnI7l2PU'~twAGi~ӭsWqJH"r+k:hmHŨ] Unb$04] #!ihQKJ]+` $]ěbk(hx"bʚ0u^U}aע6v]NdC.x$xu>ftQA{tQV-.GU+1 KYq+P񏯰SBNCWz0z8]3_Aݙ?:F)m B4d*O*)n2ᶩt83(řUrV[=$=w׮jȔ`A(ƶG%:uPZ O+h>Ώ]F(*(_]HotƗ‹R6G־uIy|bކ:6y&4 ;xphLByÕ͏6gpF.\1Sɦ!سKzd1k鴉=g)l*rIBQ)$8@K1enΏtg@1g2qA'W9߄XufsIzgl3.^0@>|ACzq{Ii%] uVqӧ١Gκ6=3J9=|2S ώc_E>!er\Dvv Lil21I&0bS ܸ{Z[9&[+-.iy\҈|kâvL/o44)pհ=t'V*-vO21'ـ;1?Jx(1Xx֗y)9;lD ӻR/LOs٣ >{dO% |nDvq0rV7&t6]3 i4x-=%K (ݑ,9CRO6Ȗ_d'MݢA@4VsaXs09 }WM&A9Mq&=kTmؙҗI졏dDa"r q(˴dx+thhm`F;,rJw}2I"ae/3e5)$ǯhl3'2.hrx&vMыv&#@##gR6]m nlޠM Ím7hcnNA6cAp*mCNmIžئQ Q x./~́8'̖4$*b%tčQ)Tw+g8zl3+؏ V(j?p4e^W=ɹgi=ua^u[)R8Ot|O\pݟ9_N͍t [Inܦ`ttĚ^ettۈ~ƠuO'\n |hV<.Sϡ0ϘfgnNwvUk bߊ2G|||~lX^:h:'ȑ||173/%vևB Y3l! 켎"8-pQ^fnS6jj4'LjЦMzیi<kƳC2 '0q>^G6c9gv?Ry\ eg Xڪs 87ܩNӵmv>LED"]X-Dv; v{5>a ;yol~z#.f~T-K SSöv5?u=4tQ;vk(ɭ7nFXh(t**bӍVSA6_aЪtAVuZ!Czi^SMsb9ĚXxAomDs?cЭzC>c~oez+v+ڤSۂaj QaW?,]: r B#ȼ˅mTeYџ014̴Gᔯ+lI N9҇߿z;,\5<5gi*+_]WlT_ә ]!r1z3[^ !/i m,V`c_Py&u4Ѯ.ȵÖਜ਼")l_f/7)28%{|i5)TXC4sѹk|P#6&@S4&eFJGbduԹM ;l ˋJ}X^\rM7טR>/0_){fk7 (i j-lBpyŐףi< >ҧe1^c v|vb T3RnrWkLjοǽ fb3 l3gxC'!Oǡ{Of!a|!.FQb9|dc.txuZhi-q:Qqg8Wq:I/F&^̰u,y*56{|N#.iQMKh#yuv?STjP2CZHK!pڼEP8$T\xzpm6O4%cE&= +Z=<*.BE#dyJ#D"se{"%6}F­HQO?-+n4|NWgqd:\ba{qjb:K3Lg2tc8# c1딴MdP^xE5P=nilTgSp4GeJod q̳\H7Z6S|>N'cΔ!yk2cKR[>N[qq 1NΗQ8r C>1=#?>Nyb>lӈYktm^M/f60ʹ'8b*o &٩d:X,~pf![A;"_q!` )bR*RkTY;a>-0S .Bՙ y[ `̓i춙 u-ro'bsf;;?S@B;weO/6i&;(!ݢ pwoygy~4Q,U1U?1~|8o51~ߓ¶Б2~şEt=݈Y rEN'mL>RUX8=C,"C=Gi.fRR_WU?騣s W\^H}{,9,af)=J۴mxexCfƎ$ʳ$X) u\c>Yޣ>#Dl4@`Cw,~Gf)\Z}Of-UmTIy<Jdu-q(oZ۸VƱ{ơkhQK$ *F^7pLY#rmlMU+h˧+Omb\aV  _WM󳫊uP+G7-|~80(w^]"wm;+ok6ݸiHa>s`:#BǟZ_ds[[w>블LwxDiSZ_dCm?O$-//3=rSTuD(:FImX>qr+F$.;]ݗ~SίP7.0Ix~e{宑޸51=ѭTV2RRQK $HcҌ=njUEX)}J 8LEbj$-MCP+ا'eP{[RyŬ g<;~Q>YW灪}|qke!̸ 2GIW|l9lFI3.|Ndgj2!yk2YZgq qz>{L q= =b@- VOn9bbb<!$ܪHH4#U`c"솗FJhM{U'O=ђf$P[b$s2Y@Q4cU!R%Ԣm)ere^nZg|[ziӗZtE6ʓ}keMh"Β$I Ҏ2Rs5iUBd@jKi(͈mP,[-9)UeeZ%E*BQDp%cBq71yo"ŭ4iߒH;MkrԜ[;r5;Om2|Ā#Pߓ.:<:;40g S'mwK/^#cYc^&df=p 2fOyogr9NȡګCe`&cI8Iǡ"9.qцӓCeN0ҳɡ.TfB #wZ?cy읺6>؝lfw9U<G "-!ܠiT}S)pZZt>qZt*Zt0]!_ѿ|4R rint|.|.0JK-}Jg1Ac8x:㠾 z$5ǐHsQ1tXL4u[³ޢM;->N>J|ޛIIyo>N1N'i-9)ơn6ꔷ1ڠu1X!@;cI}ߌWGJ7T9pe[E} ~>/EMI{7^/ ME I`(ZtHkAL8r:xPv$5Vq##:(NrAWc\_R pE<4ؐ7ڡZcHŀ4!XѬsfI9իs{'ZAGݡcg a6^a4Qˊ@nM2s"jg鹉ݶ_qFv ѱ|o+[pC:Ӭ@N(%0èmplX'jذ5ukj::le^OPЮO oO|rVPcvءz%d.za6c0)v1&7Jٌ(%C g'^IfȦMudSf6PCfJAmj7]Gq*r;px=r}5ZgX jY2͵ax)3GU Xϩɭck|~|y .o+ 2E]rpwPTwؙAQ#:A_ֆKp{Jؽgwe7k;fmVx1~^NO\| mӚgC.!( L\v kbqoջXu7|Ɍ|ϋ}n`ݫYM#T2srx"TP, x#Y$^c+WXnԿ?iYMnj؋"gh-q6|SwF a !:0K1(%MjI SUlj䤦Z {cj,B,y cNZͅw* |`A1!!5c; ( ~ZiPwkE`oߵC=urH! >V!5+Yz2b%"! Q @('9ejiJH3K-;2q"SM aj8.ǻmu­JP(8/c9 'Bu/tM/_|9W8/0CU={WS]С+eY9Fo_Eꭻ~8zoǙ;!vdvj"Bd]%brF15F' .V[d.D<.ՙn=SVߗG'gt0VQ$U9< `*匪iAph[#:= \hsW-emD^CIX;rLAJHdlS,ۦ%gLHG$*~9%В}Pp_=2iܓ0e [gO?`s۟ f QUCQ=')>fGt@h5vw 1hzC"}`(:,YRu z)yL6O?}b=#9&}ZZ4|s{s3DE͚jj |x PFLU\Qa%Zs_{",X2YNV}'Bs钥!gs| RT!CdK܏ 䃔dB՜   Elǃ U2maqҳ ~IJ?Y~uP6u!ٜ/a!Ń-Ѱ= Eɺr=tӹ|ja#Sy{n#'*M:r+OO%7Bz hp3Nà2PcJk?FS?FSN){*MMMMTnYHڝF4}8fu#P>U[2L?"o!Ц+vcmm`6TF5IG:CNOK[ylt'hT@zLJ"k 4j\͝[!<`0?Dy4|W~$:[Io}[Ugﹾ#WS[5ynƋ;f6 .XunjŬr {0OwiORC9$g3 OGFwyT-Uf@>UZR`WOIP}z(r ;3=-916fF6Gzv,Z&XVċu$P7# ˴U57?vuF7>5_uΫQ֭f %/}i ӯϟ8we~]ߌaĈSOrv@;6;OR)Rz(|)ArxmH69`i=<S=QV.e~=j)s{Uy︄>؝`§>Q=jkr4r-gv u1,bpw^e]/%IX|ru#mhVPBY%]h߱/+ DZJ|MX!~B+8fǮ8];Aю%E"P}B!}OPy}TF}R*!PPG.\AO@J7$?} H#~#:V6mOwo. &u2m֧:ԕ$kMV+AR92!2>&~ª!XddDT/"YM+ 1Bn֪Ihi4[egI@XG3}5$RG6~iZZˎ]I`fW\ \㷾8m}=AGTXXXlXLDc3#K6dU; p8Y;dT 3 r#'v&^7lC27o L_ ٵtL~c,lXV/Ց XIAI(~{"Tv"~Vq E?E? 5˶g iuz;u$6;;LJsrЗ"?;6_LmdGhGcYe#t69|a_j2T$bDLϜ߸#4 CXNUA* |m#A~I2mMpnΒPy#λt~;ݲItny.|KiGR)-yU[F>Ya8BCC0h 6PZ*bG. ّүykN3ގNCG\'TDt?Z^0>D|||ٔ҇tV^ڼf֢9adJV商-JC T*)рmHJHVKoq}&GQ-򱇙i'рON^8qHLRbxx rXo3Md1 ڒBH'c-]}{GifG3qE-尿+-qhhLזom0..,ipNs\'_į"{տDŽ  GY|D}7+̣YUR hΑAZ*ܴ" Լjm6wCmq6o~JRQNwiS=&{DL{.9ճB<$yڔ;~} ^!ö.üG_z O2M!i")a0g]/ 2L؉'tttIJ!LweϡY`vъ=EAM#&=hDoptԟ}ctޫe8P+.zk3טmzM ֩UݬN 6sT//42)(@ŠSıf2h) )KɃ^[pAp45tAF2#ݞ:@ j}zwZ sR;RkL +*rWXF:aח.CC|+_UxOM9Cѝ;vsQva+@V}B{o/JPT\{=TK)8GhR`P'D3C Ѯ"GH$u05d {pբW)LvQͼm @r:oFD#`@݌C5uBnW̑`P,2g0%.xX \ƍxܤO'hB+wnX۞;/Wj#ŏ4gzmZ]䈊CRZJ\V|Vdxh\HUQU/U? ΘhM(6X%*,i:ꙻb` g/uV@ @H(K=3PV~|\,l)%RK6"(HըȠ`})(NJX:yz64dD(z0h7i%٩{  =6yS鿉s/Z@.*sfwzjY_Y${lE}zC\"e; VNX>\Va1Ytgs. QTMȮGh*D+gOn $u_(v}9_g&]ʲICTH}Qfӧf⢨ *@^F%Eك #9hhOgo48Tll'i;:2fPl!.)m ^8wῧm=;h~Hkx-_zWOԦ]6)EYX+T;d+>r)OJAb:+^<@ ?@]7Xb禈w[{^QSrH>$yt&/{N管xn x}א3΄G6+-W_=/khݫNw!}55\!l<MOk}DWKa-1aq,|.+q8SLl,I0Q_w)YIt6]r}XK;ҞNP$EET $=q\7)$ET8馚g\y 3H@{O`c~l ~qoZڿ?C~ͺjZM^ts{֮r>y#8 8:bRmע:\;"ש ;:☂ ޚW7#=:¦Y!ڐ(G0 ^{&'L6 N~Ux#+gw{﬿z'v\[͡]Y \\\Ro:C]/? sOҺ=@螮߻=~i99GȒ7)V(9ȯo{y㻜eԉ[9+)2l|P3>0&7|A=]0$o ʧg99cQW:'qNP[QHϝ];pVGȭtt,-ujMu-H7'<Ы7++g}mݰ mm;xpD>g⋔ou8k&kҁ<0nno~l]غuu /IJ'=g*3MwmM,OG9~IagwXa*cAZ0dgɤ깪)H}t!C @`3(7̯:fP^y7^Y&4Vߑ~ީ%"9pmmkUoڻ,( ;Bu53KYx)߼BYdGVeYtQԅU9 ,ـʭ.ȇztV]B!{ )_Gu )Ϩ=D4J 3$Ca 09p0jH8VSĦꊪ+f[XI$((qRT$W/(90}:jh#iĭ|ȶ^I>]_P *2W 9`I<`qJ0 jT ?<#c1XT%XA峓&VK[<'YJ[tU?>)|MԸ8ȏ?}`5]t\0v) AR@_[ZxH1 $+T7ffthjRU2?H,WƝ{sP^_P@zA$mP6k׎Zg>S܀NqDQTo[ɣgZT^F0_>& qL-,}A7 c@2`b@lvn"!S@e k[iY,w9ƕ;5 %2]z4N;*RyTǑzL$EX+2G=2H-uuncl*Eu0y2AGLF:빿kL-qӐņ.k$K^ ¦r+2ό=3*MOSAaY 0 /3^9-S#Z-ÿk:/U'=.rU3 W(?U yTfrS $v5Ց@sGC J"bџ%g#Gix#Q?PcCto4oGCFs?w<;ڃYMlhmKT<$js-CGGI2HXfjq6MdM ɂ09B5d's[Oy|>r3:"N]I5; 9ec_܍ҙgg^gxkԺ:b$slp`Ռ5rl6]7 2ʶ[Tlv[%-=s| % q Ӳꭅ85 wUC+]v&S7E~W?n"4T#FqU. Z;2VpU#c$??p.x`0`pRԳny’6_~뜻A{~{P#[drGY9-i+9H$ niTHZ3e[Ӭiɉq,ZKAF}BUfn"cY4Y~ 76zfwiwʞkm Y\;>N k[j`7TwI2 tvp6AA @?U@*˿p]iײe9jW]*v(o';WN53RFI9([֪.[4V 2Bht,tlzlc7̞ZbŒ%ղ&Nz8&< mZ׫sg9=SwoPJvǚ5mV-i^Ok;}blp,?TSz*uLx\U,J k -Yi]n>45yŢ&+>Qi<&kPFףR3^oYWrc:kpL?N. p$ WO`}$*2DVjI͂ A֑e,D%7I;:sӒkoM/)B&"[fN [U1?EIVU>Gwz໙#s`23G-}kn #IUj?G+$SG?̈ުѽl#f<#KcYN_%Tyz82x} nicˡl[^j?AX3{e aƻG)&åD+nzVFPb$(`V7jKNOGMdm:t%kPsWsRQv]+), ,ZBC7*VNn䣾hΝ {Q޻X?GMQPC`UN(t 泃E:cL=aZkdwGOWeܱ/#|7Syr%& 4'u,M葛#K/eT_j-u^v6hС} nЃ4mܨ^ݚս}Nܻcdk#ɊT?jŮK@`_S3.!`c}x{m} &_`S"e@#Oބ3KzKKNXe͆fϒ+ [9aDG<$o<Cߡnj;u^hЄⱯ5Θ_SbgFl{}] DЙ)aoק_UQK`p~yMA9y~ rsxA5RR֝0"gLIߤ떌U0Jbr:16.U?4ʮ3.bWe5ƾ4 vw)IpP5^632<8*@9[Z@ul&F+(;DŲ$gK6;ZlV DZ[?`փ٬!%A wF ~@^)#/)<%/a==x]_LzU3G +#q}Hr=%V}gj4z!r qAaGf6VF=z4yIZ%':E3ɓuۡĭ?n%{XM}B9U91oV@5ҷEC/pD[-XGO+E\ϳ ·D7l{e=7tJ~bɀ|-~zTka%Qm$"Ն>?WiRTLKkH!(Ĉ2VYi&IeUSXGAOپUCrxן.mȒ.yqڞqgp AJ2 FZؤzbKcxCZG>UdS_؁L9a gXd$%H5R4B:YXرQVbbp$8rqcO=Y8pİ'пcߎ}{ѽK'GGvmnZMk5mܰAĚ5g~pBpB\,yV3vBBw\ =w{$2DQEI^2*ز U9iIUլjLNSmv?356 ɩrTBD=(Us^{\: A.(&9 6Ϯj;ҟ15oyQOM d7RTMZUU柦,2VRarR,j)ёHHJX|w"^ڔg}%Gϒŋ"8(/;W"nV %P Y<5Y2o1N <9FʰуH'ӭ[?Gu{uȗ7_v}s3^b F,[@OVjU ӪWHE ~Pקq&U u{=/EO Ih)^IgryGQ1{N8W.-ޘ6%xе+۵ԲHuK{}{"J9cslt)ytIcfs$'^>JH6V_bߜ6))KWbWXήW=\W+y翲:R 0Bdz4p\$J ̫j]?gD}<^3 &Ů5FZ1:97+zm(Z~3YVIBPXA֒ON͘RdL+w! InjUy=F@wh#ETPz4(*rD}l,S[`N3!AR6@<%Kq GcPSS,Q?R Vq03D.uq4zhh󷎅E(YD >Cƞ{N|;K"uk[AlT* ۰(!:)JR \\_':1R;G*J0G1 a (s@HH22)$œ {Rr(\^=]+<opS__L+2{xFT-m5̴YFY-BZ:}ms'jNF^¤9:%\(NJصUIk=G.XzT!K /t-?WZ K"O_ts͓ں5Ș$Q|stoOG cI ZEA>< F];ق74y+eg8*2 2nTՙGN%Pts:e]|s^ǂx>;ɝ i3#pKF:q0.见e9 OauYYe+jn* ҜuTR1{MNŔUxL%R{'mwt.ܡRҤR\1Iv$6$GE6gyIM{$t\='#j `bqoI j%'A"qTg/^}sT&Ϸe3W~3J]%pU'4ܡKǏ_N~y\ECk_Y.yO6 ֲ =uf3J=Y2*PBW}ّۙP:%{ֱ|tl{^iD|6(\xg>p)EoEN坿ѿ}kVCM=^ 3%26k,T8v 9 1q5CQ OѰyg< AY+v3srfّb?%33DԌ rU)"/UqT­3Ol^D(; ɢœ2鏖@1Y9,wҹ涡?[8oanLO!+ 2Lj툨(V<25hY%*dLV0L + HNQ/n/ >7a'zt9o}|t#T|+dSCY|44=x̏TKJģθ%EKPCr%|l^ca1"OdsT|䨢(J"jjw@*+Xs`Rpcnp)ˌ;r1u*;Q>ߊZ3)7W+7s <[`w5)A|EӋÊ zvsԮyFM iԁу^4p34?w=N2Q(5UxPr9{._un g]mtﮕ|\ie#nfc龠Ex)C*rD%& )5%!#1#:Xxo[7JPC6HX $6fG `{S[\W1dP)~ R1%'cK$@|gdͿ*o(:E3eyg'a&g>a{RQJ?N;&s6nԆ!i0#W[ԏOF7/-@U4PaBw+*[967)|Іa?}{3VJKkѭڪ0}3?mu[Ccu]!ǧ ZУ7BCA{=S3J"gAK>mʟa; gZ0OƦ3vUmӜcgi}9>! z0TOC0SAnzǬ1Gj>t~k8ƐKBǚrkcX2QHCR0W*a,v͒`_KGHd,ꜲhjWau Ȳ/#@ .rlV 3f<չ.uE&!#PNEj`ߜrΫ y6 ݗGAR+R3ެy`{XͨXj C+ǀ5QE 1FũY5KC0?ח>pXbu8 8 *gVq|t ?"JaP!ܢymRJ DupM K8k`b*dZ$<XS 4XNxUߕ.@D .;v*tjEeo}+^o'[eʻ7 {.[y̍ku=F]Q(紵^JףI_\ꪱx}gT8"&7a}d W}}V GF=ۊL@ŋg\Dgx=mѱ}Kkg0||KUJq14TP1: >F*\:Y6_>o}R>Fo^kI3"o>N);ܷQz^46t&;lcFaAA aN*Oùܔ>vOk&*HۢIēH9zxM=LwIyO: ж+TtME>۔UŴ/klh']z6֣!7sZ^'|3m?Lx?;ע~So?H3f!b Xe5lFBI<N5_cHuǤ-Cś]d3xs1뚋SzЃ=;Гzyeɇ3^&M .F'Ch+Ḭ-`Q B76,EX #yZ"J KHs7oC+7n@noveX<é/n۵dJftEQ #*:IIщUclǧ.E(hŮTX"ŨhTlj"&јjIL5D71Eٻ3Ͻ~ߟ̙3̜93w_a+e޹rAWvTQSIcPP za.u*WL4qϧ{z '9+)8ߛ>Ő#^}'Ȉ|haiZ0_utޭMuӓ%Ba&ui):^tU(8xx>? ]ܸq?'.b&ޢb2w2ٛgRG&%$~y/|Kb)hw<.ݞVójg۸_OjkբicEmvC#&ŒШzǥpyߔ~hqs{ʅ#E/_О3R-Ο{y.kRxy^&YθڶA-̛FbʄnEy6jX GVvs'#ԪEIPJ'0;L&c7S io~B׭Wëki\zQ+_+**Ѿ|2yyV+[5%,.ۣnܺ+KKJڵ8i [LLm[}je&cÕF*W j!ʧU$ra`Y;WV^_f%oԮ s)S'_SZ|,G?1=z^a7et |LqY?mܳ՜Cs&2U̲B-UhpuYo8&VOY&.G4xSr4Ԯq<1!7͖)./}cm{(|Ǎ|X[Gs>M4쨥Z͚6_Vj.7#+>< lh&W:t#h;x3&z ϥb~u|.koyu~֌awuՕ8 jjԫبזGw3 ﭪTR\>Gg_l>3bsV~{>6|6V@,!Tٸ5 e (nx7QDVў?P'Ql;K Xnay;,4ghn|PMF漹;Q?]„L:-x^ve{؏'9]~>ئ֐+w^9Rl,oL-@̓OAnK3/ODS?7z=YJ㽋8Y_R1طڤt;|+l\WRգ[x?NLZ*W]RߋؾEsKfغ'wݳM'۽C:71NSZ5:Tqq:C s'gf3 2{”b:cFYM"_SΈ|6=}/t+M[#Sd樺RC!UѶܡSҽcg~;anKA:U?u߷nq/^ -T͞P[.)O܉&M{&ļW߿yҒp$7))s][Nysfcߙ bG 39#b ÎU {X=|8Sy ¬)h#̇>QF?ͺgFjV/sD= X\i]`ej%}t9:,*cqʙ*>t9'u9?6[[M1fy9,"M/HY_oY,HS:^_yӛ:twȑ ؛|gHe/,hk2b9>А1PaD;eݙ>b=9eİB-^}jOSF̼mK鑀hd@^h[O >O}rSys+O3g}S;HNvk9 R J>@|ex:M\L@vdQ\u5 :˙"'1:Ҁ 7tFjkzi^{cB; }=Dٌ^L}SNho˯yX:DXG֬EyaəaCu7UkDՊr8İh̠˙h>ӝrbؖJc ȩR)g(}&[ r7yO>̐3?cZz*/ ]Yn"(?؂`#γQ~e㒪=4P~R|'c,%ʍt9Cr<QANUJ%)tZ<ܐ^AR'/]N949 6WXYOCY2˩㔣]6?L`Tm Oj+WM/aیUcJ}GX 5äKFNu~aR*cƦj ewXa+Mu9#rvʺ?r+u9%9Oʗʗ.)'ݮ7t eοQY[TFNot9]=Ai:VXӱIa+qҚ#}vOC3^Z_X;bO3hHNO0P^ԙ#LP%nu9rBً|!gd|tޥڿCle>Yn/KiMwe]6HN T_N33햋rۏqڽҏ3}]*ZZ&xHnd .E;tpX M{8!9U~ b44$rM{w.$crN[]Үv]4S`igM87ɫBmk-]>_Iss+uv?Q&-HnU gբcCIi:جf}]ٖJ{iu]t /G7{rh#JU'ﱗJ{sSsmt6򽲧{2-Ӧ`?ᭅ6:Ei\-C> kˍ {.~Tg;?-T,{VDa:khQ'":@}J]$&H飿֣60Z~e#F*;,ڱ;|s{9("w\f3;+N5"hP>*'D΢p;U["-.ƒ,UiZ˧_VlԯQܹ4ȑ1ng}WȲkaWxScn^kƬ߳gmZ+FoȱUY~c"¢'FOFM>塯lİi k#D:aF-(X[v-t갑+WMO+W]nï;{:7Oy3mt3.jo0/'|-+g}hfRWP{q+>޳D{m5_Ubfj߄^ݝŽOf~Wk~tFqKƦ{_V_coO{v%Eݺm_wczYWuQ~}{p3"<9#U]"EjxkԽߪcp9; W,aˍkagIY\\jT1|t"c[f+w7B:wÿ-{**,@/#mR`EΜCm)k+iKڝ([afKX[w(*z_35M 'Ir=? zШ/瞢c"Dߛ;"רgsx5owHc xWqi-UkU˟lT=)7ʽ7]թ++osbnc -qSw~x͛1~ ^υ]wgj- UZun1eT(M)֣W'4Uگ.j݋Wz0 D0mYbONҭ&:atpԴ#'{6ٳn}ԨEDj jrD&_3bHK Ǐ6u#?v⪕nwcֆZ)Df )M7|vրeT^t}K7̛j5Dm3JVƌٌHr.SͯPx"/qp_K5 mb37v eϐ?453抳̢=ލ[ :ޣER?sw\wĵOVyGj9TKnܼ]ᵯkElk쯍~TWds۫S}pqxU"~X[X^\}M(l5,X]Z沺0WL25,[!zmfD4i% qyjD>P v9_0 1YTl/6~VkU=,.δh~U4 gӪw*]5)$xq.pcse]jwV|yZAAorSyF_=Nl½<tsMQM{?ӊx?E~ɞ  ,YZB]~;o槬M1aʁxj3jnUs/N[~E:.qWkj ~כzw.&~'KΫ?+:ֿշ..7\Y07p䠥G4е5Pvn0JЯ>G, ?6ݤQ*{_wM"աR/3O{,=)ޙ}ټ ϳɚ l IpmzG< $lkw3kGq9)gG6܍*mTWΤjþjus:[1E&k>m,'m޶cbt{4fJjhՍZ]gwݸOz$<ա l@áF <ߣr)qĎwjbw[=WaTa8W~8FOͩ)Z4dM 7R=tf&q+Sڨ}k/ҳl͆`n4J &_o 3;K /ۼ5?kYGzpa ^=O*m!~\ZG jՔQ+VD55{{f#.0jԀ]:v1|8pUo%ڭeŢS6ʡK󏿞)ӻM띐~۴ңJO~Y~/%?kyeKsmZ ?0Х+m*ɮdWuf]o3 ,E%?GnWwjN.xKhNpL_l*T!|JpS:Y*]>;v1v dxm1 ﬽kJgJegzU2u!6ܼEDNgEevR,KPAn׍w߳MR_j۾N7_ Am4Yw!WhҬ!MY|]HYoVyW3&͍%5|C|m-;G Qs= u)|H?oY.eVbWT?U]+l0ٮЊ>ū|1գG.r+O2nܬ= /^,%z: 4G9+#6p7ҩ>C.?<7@-?%uMMY2)D\mQNR‹˱[lC>҇PǶӵiIs̵ϣQ!Bvs כ:/lQk r@M#Q_E|2N3kͷ38r+1CaKAQrPC G6彴RyCWAvhh hV[5]#9PZ-z# տ a؏Y䘯a,l_##w(#-W=C{L-_RFS'|: vZzui|#Q~>}%u@ 1)Ls# R{N9VvrG_ivWa봎jLBaV|Dho|aqSG*\KrֻN+WU1r?ŻjS:VʫSEw~_-*ǺgLm`E[10R]haRCϱO*xZj_uR\hQVϡGuSCmk(/ICFtu+=l;-Tӗ=r|V'ϗ|x+²;)9EL?CEE,G +׿.+o ӟlnS=LӓuÞ8bny 83TBEE͜aYn㶽n/(OQ<0aPD{N  v:ǰ/fVd]!ln_+'?Amr_u͙N Egݻ&uY, "] ޞ:m:J>mM'Vh755flŶuCy^Y 2LDr]3L0ۊ2>z7gG:~~-[νwac9 @L;hPG_״sK}r3!?WƖyth󽊆خݿω0Fqi#mvCU-_-w}83~T35Tjx,휺CӔ7*ūiڬ>i0gD/Uܦ u~F-Fw-Tz4s?[Y{soVaa%;>."1qIȎ'{`A}EkKVH3"{5|$EaٕEDL6i@m۟,s%>FbhԤjMYˡڿ|Z͓i~L_w%ptWsDQ~#߸W{8ptX:ckkkx{Q -%f, s_2܈BcWL{*u}g Φh 𭘭DX7i#ݢpµVL{xw7ʶ7ܝ#w|֞.!>΄m>|zԟ\ZyXhfγ~$_1*/ǐ~vۻd0^z9W8}afr# 7uމ/&9Ob۵mjs#uj%kmcr۱1"76O4h$=Ԥ,L2*/wmu{۷K5Y=3cHclv&}%ۋlJ7Y{U-c@EwP@lww~'{5wuZs!Q͚ye}dgo<=5>=TOuW/΍{xYkj˾;C5m??g1&{u&kTޝ˽\hvΪ lyk?\|kߖ+Go+CRSkL߀iGJr- ҖFlOٖ{В|ѷ{QIڲX-Q1yx&Qυƙ6QCG][M?>Pc{^5J?T2ۖÇ`0WoBs_@+c_,xzRw .6| ѳU3^ky ,YzukԴT-^_Ů6X)=\,3.kȦovwŢ/]~|s+?M" WRۋ.F>:G*娮x˵E]@ 7z<Vw⏲E<}hy#zR|%+}cDŏJ wbJO7׾5udv$ x&ɯ`/]x|e͙͡d}26Ƌ^d]:ٰ's'k煘::xڴ9ox8Eiϵ${ K):E=JV΍1DMcԍů۰ c|[2l|Y9/L^7kiQWFYN!U;ɶұVX1!F߰4Dk6.D̒)/]F!hm0`ԗ)xmx {RL9 MmT|}_<ߗ?wÇ5ɼkц4,eWS:RNOVveFaJ6>l^ˤ(Tn8TʪǷl9q|N:) xM99$ݛ#΍;e)zLvq#/6_l7>&{_޿^cx_voI\=t+Q =xaDϞ;xJ$&q?Q ?;'Nį89{s.Gh9mϋ/ٲEJDfA 3_/NZ(jʲem=EcX{m6w\K/Va6pB !X ,*iJrDQ[o_a(֚UO~0fS(EoVӾS l liCx{{?$e0a D`0)}"|؇ մ Cs0p0mC~O8iCܪ6x ,i< <<,U?݁M-^ W[_ap(08Bڒ?Q%AN<0L&#\A!aQ< Eb` 4 : <<,Uʎ4S)C؞cmBUڳ̝[8|L& VPHC tr:@N9 tӑ'8`<0L&+:ZW[ۿ&lvRD%088' t"P@?~In4Q[sC XPN{2FʑB?U T?/_ѿ 1_]šf)%TՐ }]d+&O8,XA`|;!oC)wT } mU*`"0 ܄3,`6pp'p?R<>yc|`aixx^!NF[ҙJRR؇;1_S({"a-݉yؒZzw5)lwKAdͺ Cq݉ @B$`2p?B~0X,%3,Bb%Hbx )1}{K@ FD=0"Qu{`ӃQan3 7AB0<1`>XEb` 4 ,X CFCPY!hC4oUB<<1`>@!D(* 0WB7B+@8tK8 <  Rwh2F*h2A13a 0.P`:ߒ0ϓFf0I0$A?0p,Js,Js,Js,Js,Js,Js,Js,J3r A>=}zH!#B$`J1~QxQ|< !X ,* |CP!gCP!(!s|hFd$t6 60 ì* 0Wu¡xFqxޏ\A!aQ S,O+)rGR)=)w9!H9JP* >>>>QQQQQQQ.(pK8%:#sx983<>83<>83<>8'<~8'<~8'<~8'<~xhmm<6Cxhmm<6Cxhmm<6Cxhmm< 6&@hmmM 6&@hmmM 6&@hmmM 6&@hmm"M6&BDhmm"M6&BDhmm"M6&BDhmm"M6&A$hmmMI6 &A$hmmMI6 &A$hmmMI6 &A$hmmM6&Cdh mm2M6&Cdh mm2M6&Cdh mm2M6&Cdh N܄UMXuJA:u }R_`'u }RuNA:u `'>)XIO }Ru`'x*4L0BTh Sa*4L0BTh Sa*4L0BTh Sa*4L0 A4h Ӡa4Li0 A4h Ӡa4Li0 A4h Ӡa4Li0 A4h ӡa:4L0Cth ӡa:4L0Cth ӡa:4L0Cth ӡa:4 fo~3 f7?o~ l-r@9[ g l-rBV 9[!g+lrBV 9[!glm rA69 glm rCv9!g;l퐳rCv9!'XE/2~ _d`"XE/2~ _d`"XE/2~3z&RDH=g"L3z&RDH=g"L3z&RDH= g!,ԳzRBYH= g!,ԳzRBYH= g!,Գz6RFH=g#lԳz6RFH=g#lԳz6RFH=g#H}R߁w H}R߁w H}R߁w H}R߁w H}R߁w H}<.xwc ]~7Fw#nߍ>s>s>s>s~A= ߃{~?$'ُY~̯cf~쇟d?$b@u :X+r+r+r+r+"A:X bDu"!:XbBCu!!:X0bFÈu#a:Xy /P@y /P@yCcu !1:XbC|G|G|G|G|*@*@*@*@*@SҜ49/)xi )KS ){KS/M!4EP EP EP EP EP EP ŐP ŐP ŐP ŐP ŐP %P %P %P %P %P %pNCiH8 !4$ӐpNCiH(>RJC(>RJC(>RJC(>RJC(>RJC(>RJC(>RJC(>RJC(>RJC(U>]pjV:Q5sS`Kq[++Wk6&Oz=I pշ \) zmA8OyC< BfKn0ϓ)x .sX< | W냊sRʼnZj«uV )juCjuCj:WiGsRB7 I iNJHsRBҜ椄4'%oiNJHsR<Ӝp "nX< ,UԜǨ9)9) = ҞE86 e Ph]1`E±xo?"x`0LG*C<O!BP,O+T^ cTj+ +++++++++++++++++++++0?` 0?` 0?` 0?` 0?` 0@` 0@` 0@` 0@` 0@` 0@~D4ZX,3%d&-fzy‡a|8NH>cx0>O`Y}Cyy#d>OQ|Σ >?g|3|>{_| _ʗ<+*k:o`73v}ξ"K%<'$7M<47-|+ƟyY<|s?!~Gyˏ|^$OB^ċy ?_/3,? WE~_ [mCOg&_7ǿ?G/O۸ .$"\D*DUQMT5DMQKڢ+D|*>7 J|-ķ;A?qW,~į7C@<e&4aLr)&i"HW&j!kZ]֖ud]!l(Ʋl*ͤl.[H/Rl#v ;NiYv>WIƢ!{^#e_O@9HAr*r)Gr c8^dx9vIBV.8*Ka{MN< #Y9IFd9ENQr.Y!gg,ɞcA,-,e+2F. "X.K2\r\%W5r\' 2N(d(7*d,ȭr|Vn2SflC>'w]ȓ{^'2WayDy̗I8@=IȉhM(BZ#DjEVGPQFxD p@ ZyIvsphoyyf;f7>}ޤSJ~@7BА𐈐Ȑ萘ؐN! !!Ct 3aҢ2drMϛ\R\< ˺$N~XUgO-.ʿ"<.s&L.~YaUѓVIT昜g66.7;ܩӦʷ(y'͎o w*2ioÂęVALF:=n2fjAC_W2 XECaCmJѢ6bVpy 1Ԓ¼)FM.Vh1Th!"1Ec/ }m墼ųfϘ;ES*;+;PlcM+)^W:;8(l-C-ø`JegPbwͲ 8+Ȍ[xٶEƛޝmzwRۻVJ VV:hjh;GTNsaWO ڿ:6״M:vZqIQh>z/5ej7ײ˼|ۚcg͚fc.欠vc#ɧ⥑V ֞eYs/dZqVr#P+CgϊR_?yU8cZWT<;0 /9cVj[#j/fiQcO+%PW?;/tX*: g+I\a ?.tTތytNTS]T qӊC/(:=OWdϛVfČ#^Uh>kQ?&?Xf RV[%KMZ*MTRm\cd^md6zRT.n饗L+e*jltS 8 -6l6b4W-p$2YiV2h*TLQe*KWe*3UlUҡJ*s2I')$şORI?I')$şORI_n)Ɋ?Y'+dşOVɊ?Y'+dş++_)`?XV`?XV)?E(şSOQ)?E(şSOQ?U*TşSOU?U*TşSOUi?M)4şOSi?M)4şOS?]+tşOW?]+tşOW?Cg( ş3P7Cf( śx3oT7Sf*Lśx3o;Sg*Lş3T?Kg),şRY?Kg),şRY?[g+lşVي?[g+lşU6Q9?G(şsQ9?G(şsw(~5/y)šߡ+w(~w(~w(~w(~w*~w*~w*~w*~w*~w*~w*~w*~U?W*\şsU?W*\şs͟T5離y?UjOU~SռT5離y?UjOU~SռT5離y?՞|Ivi[aZqؕvq_i6FW6eT{vT|vLUe*ULUf2[9tRk$gVي?[g+lşVي?[g+lşQ9?G(şsQ9?G(şsC;C;C;C;C;C;C;C;S;S;S;S;S;S;S;S;M hV*\Şs{b{{RM%{ e*U9X)LUe*ULUf2.RcK䗰j-ɟriaR*dVNrj"Ӣ)WMfDmzzJdѬ%%!%ya3g`fe8KK$%f=PEϚ]0=ov|i1Yїiޏ`E,smPVe\=$C&#S Κ>yF ։΁Uyb>7OUkYkYڇeYYOGZj&_bSòza9v ]0n#b]vVq, X&x`aQ%,J$яxY:LlmNlcN9X YF69iMA}\gw߸foI;/_~~{3~y/_[99SOs'NkN{S:SvisN{ഷN:];Ӈ3֟eG ?;`@= mEJ,f@=;ҁq-V gfʙg~;AxUI$ OK<'/d;R>M8ڴisH:]Iw_)ˌi2XtƒN2f^uC†R2dŐg=q֒zCtC:َ_;{9L9Ws]ΝwYݲRg}=>ڜ_q9B;z;C9:t,v (}F`|(4X{_bhk4'6 -Wpɨ~>ث&j}?xvv uV0&]e芬Ⱥ Ykq'2#!iil:+)jc#VxS5b|a|ErVՖjo ^ja p_n=xB):seWȕtvڂ>.Qi-ƣZ[C iYO3vR#"/ٙiN/Bh6[cXj m3SK|@.4.E,q1?)7xZ+ -w4bj-ڸ?ŷhChemkTc>qT7\}F)]x}^o7M}~h XeHםY4;|7x{7sf̽Z֯wjjSg=˻`76مM3{c֡S%:^K"=*-=Z3ԋ~oՙSg"7w_2M7_Q3'cظ f|$HX+oH)V#j+Ê>fI'\dAK=P#֏>nkZ=Za0Xkk졆+!9jO]kiO ܱ6ޞnO=ʳ|v"{>!wCG֟fagј~Ͱf-{k~#%ͫ ԱR3cmf<~~ؙ9ru<Ǿvi?uSD7Vk^OϚ4=X~dχyܱ'6Z~z[tӔ$4mbwux@QȑCxyρ:4%: r{t\t;z#n(##d́y#n#ngFpF8b2`(q<#nWFܡqv9#tačA_i4 >7=#n#n(zbpDlj| u ϳ4~V;*ވ_?ɘD#cBD311# ._/c'k^wڎ*UEsk x17I{zژ,0`Nj}vya>aD3⬧v҇Dv"iKD䛌o+"{>@ϐe uF yΊ#Aچ{ՌmԬW~9sgg|$b"_aϱ{ {5^2Vmanö G`\kUvn7w5sL^8a3^<M3~{_ޤd^9Ȉ🟿Bi^ģ/7h>;,==,;1~4b'F.ODq#;vq9RG0c}y_e%>Dgs3\D50Y^͟1[X({,\`=V~ovK!(C$Ku/w4rOo򱙃NDOmF/ؽoACe5V^D?|h[ift8FnqϞ-c}yGx~`Q^Mϴvy9O;9ߏǎ$GƱI&ϡ*,NJ;::=T~YY X=X)בѬugy~gy~gy~; ~vVp=?{MyA{sHdiDFFdYa61J/G^Q.B} sYgju@[PZ/gͧEyi|V`4ZuY/X>V7AFYҠm W=KxZ;g]sg~+ZsƐB懾$$ΆcCE7&D̠ M[t| 2H{n8vVxH'~Fp[E. H0aF-sM`,I<gsy~nr?C ;] ,=>m@;RQ~D1JY glf`zlN#A 3   z.F[dBP y\<ړ`1OQ=Ub:CPG#:b7㼎8#:⯎#ꈿ:⯎#ꈿ:b#ꈯ:=1< @669xxxxxxxxxGߖv" `````````````fβ! D+⍹s7ҧҧҧҧZ1!<ĜsbCy91!<ĜsbCy9s>q:H)/^p<O*)XԒāN t9`4fk+fIs NȢ .p@u \Ep A_d3t -]hBKZ҅.t -]hBKZ҅.t -]hBKZ҅.t -]hBKZ҅.t -]hBKZ҅.t -]hBKZ҅.t -]hBKZ҅.t yVfK }䊐Ia"DDO-&*wq|! ctץnݻm/Ww|T=DԊ ?j?j?j?j?j?jGב+Ԓ'Ԓ#2c,]]˼]˘u1vr| sZ-ru; 8rWՠ|*:ll3j1Fc^NBoIoIoꉖhWvhWvhWvhVfhVFhT6hS6hPHYHWtHWtHWtHWtHWtHWtHWNoIoIoIo)3U1U1U1U8R ngbbbb/S ^7x,˹={VrF|6*FQ~FWIWIWHZEWMWMWMWMWMWMQGt.UEt.<'Z?'2DH" *O?^u?^~<~dzUx VM?M?I?I?I?keoOOOOOU*ćpnbMl7&ăxpnM<7o >&ăxpQİNiN:\+Lⷠ5+y^ok~z"v ̵EV님휻Q{aG(P>jevdvdvdL*  Ckқ ^t1b[̷o3*fU| xv4gfT>K2< ><2, KK,xއffC*'"R#&v7.X]ĆpnbML4n$p!H"@#1Po~s372Tҹ΅ƍo~ր.|SoрO3xao?6`k7vvcc7u?~8t R@Q5hM?)M`z-^p<G}|>pn[A `;2t g`, Kn9.:є)Qpb09P7%ܿW9:P~ C2c9ϨBE'-|Mٓ7~cT`/.d l#5VorfO?{ 2_]e`9X Vrl_j 4q?7 b t A$=mD6"aM/<_~< xo_u~, _5r>x ǟq5c3L$ 0ǚsl13&kLyC`/s] HGj?R"~UtDRxb6'fxb6m\eGsu.b+ت#≫x`.-Kjsuiݣw?jg7sW=r}92x,r3Pց `# `HlNa5vbXm'Vj.V- b.,x'vN⡞x2d G;N,Q%j]Xb'xإ͔ͤdUD=1QOL"&ved=ZEZzR@HgJjljl $3?aفd;v Q-"$m#Q-"Q-ݐ`6ۇ!؃a}l6ۇ!$ڃ{`l[uC}Ad/>ًO#ST|d*>2ه'Y,|d>2 Ǭ'U*|d> YGV#Ad>2'3 |@~2YǬc1}DFFf&f&f&f&f&Ff&f&f&f&f&f&f&f&f&f&f&f&f&f&rFrFrFrFrFrFrFB_KK_K"(Ӽ{{{Ioᓞ>gOyZn췞Os'9gS^3ݎ??[~ϧ5 5$ /dba]/b]/e:'`1xʲ{{+ | VRw5(axċGxċGxċGxċGxċGmV^X|wxfK^k_E=c٨V^1/1/V^<Ń^<Ń^k?-zzoOx׋wxˈQ[` X >A%׶+*D^KTx50OD'IJe5j4h,XV"Bn~+w̷\ȣ]\1QX0o~K`>Veȗ2ڕ~4}sFq˚oɃ5ܧ x-Wkq{[q|vMnct֢vuD!DH4͌c#^sAq8 `GmuvUwWmSNb^+ڍ`m|Ѥ35>hw>U533UZAqc0=mڳfT7ko\}HZǦ26G~dq8U&1P3I$"E )Pqpo #8q@2ş\q'n7wqO/#bxT,'ēbxJ<+ϋ+Ux]A.\}PJ|*ֈs^lb$6- Q%K~(_owRp)d$d,!=d?yͯ5h&KWڿoo ]zDKﭟ)zgzͿN^QB=^ݫtޠ7D 2"R91b_Ǖ^Fxt` W5r'~ZZz mzdؾ7GB|_|YN=}>F/FW[ϡz_zSoE5{3es4#XE/4h~ݪ]vTrX;uby^M%bD$=+g[: e7-֝kBz~t7Mm|Ũ-^ZtS[eмCㄽ0L^[}inZ|EAͰё ~! 0ױk}]i4*_ūci~C=)츴mj֍S"8UL[tP`߆Z=!\mlG%"[͔/-}S|Vfсvo2+p[v;>#e]ּg˙ӛ}^];Bϖ0 6w.;^OijA'TOѾM]o obDofhFhp$hdF-Z^Aa<'{ o9uDys> Uv[Bc J"~sLjm9fG9nenV>bZ~l~쁭Ymhلё}`ѵ=psvtW:GuYY@sYus\F.mL]=+$-TqG_l&T$彋hiBKY7e?ky`_\ >uBZIGj}[о/ھo5zMHKt0ڣL;=h i&Z<"&ʶ#]]j%hpA}Qm:[ַ݅hm+У[u]< fZ [,|.Dн< :Z;I^+::3/T>k~zo9Ss+k?ZO:ߠe=g^og\T_W2C}=}^/na{-7`{U-lؖȶy؞e{iO=8"=ʶb lv/lv&;vlVݢ6& O"OãA'ƻ;bFqH1GHxJψ7įbL'V+]-nEC|)%HM<$Cex\M+^4-V|PKWb+,zPK n5:QY5assets/french.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("FR", "french") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.frenchv5 .. "french_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.frenchv5 .. "french_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.frenchv5 .. "french_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.frenchv5 .. "french_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.frenchv5 .. "french_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.frenchv5 .. "french_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.frenchv5 .. "french_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.frenchv5 .. "french_traits.trt.png" lng.statistic_alias = "french" lng.categories[si.language.category.FASTSWITCH] = "french" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "french" lng.categories[si.language.category.CELLDICT] = "french" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "french" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "fr" lng.categories[si.language.category.EMOJI] = "french" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.frenchv5 .. "french.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.frenchv5 .. "french_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.frenchv5 .. "french_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.frenchv5 .. "french_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.frenchv5 .. "french_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q 65assets/french_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 0 81 48 162 s 48 81 96 162 d 96 81 144 162 f 144 81 192 162 g 192 81 240 162 h 240 81 288 162 j 288 81 336 162 k 336 81 384 162 l 384 81 432 162 m 432 81 480 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 ' 360 162 408 243 PK n5:Q둦5assets/french_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q&[5assets/french_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q!Y !5assets/french_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.eng_full_azerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.eng_full_azerty_alt_curve_international shift_inputs = kb.eng_full_azerty_shift_international end local s = sf.new_full_keyboard( "dutch_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q#5assets/french_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "dutch_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QvLӹ  !5assets/french_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "eng_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q/  !5assets/french_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if inpute_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "dutch_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q"tJWW 5assets/french_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "french_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q*+dd'5assets/french_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "dutch_soft_tplus_azerty", kb.eng_tplus_azerty_left, kb.eng_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q=cc'5assets/french_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "dutch_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QxNĶ5assets/french_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "æ", "ā", "ª", "ç", "č", "ć", "è", "é", "ê", "ë", "ę", "ē", "ė", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "º", "ù", "û", "ü", "ú", "ū", "ÿ", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Æ", "Ā", "ª", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ę", "Ē", "Ė", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "º", "Ù", "Û", "Ü", "Ú", "Ū", "Ÿ", } local accent_dictionary = { [string.byte("a")] = "àäâáãåæāª", [string.byte("A")] = "ÀÄÂÁÃÅÆĀª", [string.byte("c")] = "çčć", [string.byte("C")] = "ÇČĆ", [string.byte("e")] = "èéêëęēė", [string.byte("E")] = "ÈÉÊËĘĒĖ", [string.byte("i")] = "îïíìīį", [string.byte("I")] = "ÎÏÍÌĪĮ", [string.byte("o")] = "ôöóòõōœøº", [string.byte("O")] = "ÔÖÓÒÕŌŒØº", [string.byte("u")] = "ùûüúū", [string.byte("U")] = "ÙÛÜÚŪ", [string.byte("y")] = "ÿ", [string.byte("Y")] = "Ÿ", } local reversed_accent_dictionary = si.get_reversed_accent_dictionary(accent_dictionary) local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(";")] = ";", [string.byte(".")] = ".", [string.byte(",")] = ",", } local surround_separator_list = { [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(";")] = ";", } function traits.is_surround_separator(c) if surround_separator_list[c] ~= nil then return true end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.get_original_letters(c) return reversed_accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q^5assets/frenchbe.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("FR", "frenchbe") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.frenchbev5 .. "frenchbe_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.frenchbev5 .. "frenchbe_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.frenchbev5 .. "frenchbe_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.frenchbev5 .. "frenchbe_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.frenchbev5 .. "frenchbe_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.frenchbev5 .. "frenchbe_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.frenchbev5 .. "frenchbe_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.frenchbev5 .. "frenchbe_traits.trt.png" lng.statistic_alias = "frenchbe" lng.categories[si.language.category.FASTSWITCH] = "frenchbe" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "frenchbe" lng.categories[si.language.category.CELLDICT] = "frenchbe" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "frenchbe" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "fr" lng.categories[si.language.category.EMOJI] = "french" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.frenchbev5 .. "frenchbe.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.frenchbev5 .. "frenchbe_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.frenchbev5 .. "frenchbe_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.frenchbev5 .. "frenchbe_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.frenchbev5 .. "frenchbe_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q 6!5assets/frenchbe_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 0 81 48 162 s 48 81 96 162 d 96 81 144 162 f 144 81 192 162 g 192 81 240 162 h 240 81 288 162 j 288 81 336 162 k 336 81 384 162 l 384 81 432 162 m 432 81 480 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 ' 360 162 408 243 PK n5:Q둦!5assets/frenchbe_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q&[!5assets/frenchbe_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q!Y #5assets/frenchbe_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.eng_full_azerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.eng_full_azerty_alt_curve_international shift_inputs = kb.eng_full_azerty_shift_international end local s = sf.new_full_keyboard( "dutch_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q%5assets/frenchbe_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "dutch_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QvLӹ  #5assets/frenchbe_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "eng_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q/  #5assets/frenchbe_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if inpute_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "dutch_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QVOYY"5assets/frenchbe_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "frenchbe_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q*+dd)5assets/frenchbe_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "dutch_soft_tplus_azerty", kb.eng_tplus_azerty_left, kb.eng_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q=cc)5assets/frenchbe_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "dutch_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QxNĶ5assets/frenchbe_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "æ", "ā", "ª", "ç", "č", "ć", "è", "é", "ê", "ë", "ę", "ē", "ė", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "º", "ù", "û", "ü", "ú", "ū", "ÿ", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Æ", "Ā", "ª", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ę", "Ē", "Ė", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "º", "Ù", "Û", "Ü", "Ú", "Ū", "Ÿ", } local accent_dictionary = { [string.byte("a")] = "àäâáãåæāª", [string.byte("A")] = "ÀÄÂÁÃÅÆĀª", [string.byte("c")] = "çčć", [string.byte("C")] = "ÇČĆ", [string.byte("e")] = "èéêëęēė", [string.byte("E")] = "ÈÉÊËĘĒĖ", [string.byte("i")] = "îïíìīį", [string.byte("I")] = "ÎÏÍÌĪĮ", [string.byte("o")] = "ôöóòõōœøº", [string.byte("O")] = "ÔÖÓÒÕŌŒØº", [string.byte("u")] = "ùûüúū", [string.byte("U")] = "ÙÛÜÚŪ", [string.byte("y")] = "ÿ", [string.byte("Y")] = "Ÿ", } local reversed_accent_dictionary = si.get_reversed_accent_dictionary(accent_dictionary) local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(";")] = ";", [string.byte(".")] = ".", [string.byte(",")] = ",", } local surround_separator_list = { [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(";")] = ";", } function traits.is_surround_separator(c) if surround_separator_list[c] ~= nil then return true end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.get_original_letters(c) return reversed_accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QNA5assets/frenchca.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("FR", "frenchca") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.frenchcav5 .. "frenchca_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.frenchcav5 .. "frenchca_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.frenchcav5 .. "frenchca_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.frenchcav5 .. "frenchca_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.frenchcav5 .. "frenchca_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.frenchcav5 .. "frenchca_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.frenchcav5 .. "frenchca_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.frenchcav5 .. "frenchca_traits.trt.png" lng.statistic_alias = "frenchca" lng.categories[si.language.category.FASTSWITCH] = "frenchca" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "frenchca" lng.categories[si.language.category.CELLDICT] = "frenchca" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "frenchca" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "fr" lng.categories[si.language.category.EMOJI] = "french" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.frenchcav5 .. "frenchca.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.frenchcav5 .. "frenchca_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.frenchcav5 .. "frenchca_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.frenchcav5 .. "frenchca_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.frenchcav5 .. "frenchca_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q 6!5assets/frenchca_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 0 81 48 162 s 48 81 96 162 d 96 81 144 162 f 144 81 192 162 g 192 81 240 162 h 240 81 288 162 j 288 81 336 162 k 336 81 384 162 l 384 81 432 162 m 432 81 480 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 ' 360 162 408 243 PK n5:Q둦!5assets/frenchca_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q&[!5assets/frenchca_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q!Y #5assets/frenchca_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.eng_full_azerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.eng_full_azerty_alt_curve_international shift_inputs = kb.eng_full_azerty_shift_international end local s = sf.new_full_keyboard( "dutch_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q%5assets/frenchca_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "dutch_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QvLӹ  #5assets/frenchca_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "eng_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q/  #5assets/frenchca_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if inpute_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "dutch_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QvYY"5assets/frenchca_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "frenchca_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q*+dd)5assets/frenchca_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "dutch_soft_tplus_azerty", kb.eng_tplus_azerty_left, kb.eng_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q=cc)5assets/frenchca_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "dutch_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QxNĶ5assets/frenchca_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "æ", "ā", "ª", "ç", "č", "ć", "è", "é", "ê", "ë", "ę", "ē", "ė", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "º", "ù", "û", "ü", "ú", "ū", "ÿ", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Æ", "Ā", "ª", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ę", "Ē", "Ė", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "º", "Ù", "Û", "Ü", "Ú", "Ū", "Ÿ", } local accent_dictionary = { [string.byte("a")] = "àäâáãåæāª", [string.byte("A")] = "ÀÄÂÁÃÅÆĀª", [string.byte("c")] = "çčć", [string.byte("C")] = "ÇČĆ", [string.byte("e")] = "èéêëęēė", [string.byte("E")] = "ÈÉÊËĘĒĖ", [string.byte("i")] = "îïíìīį", [string.byte("I")] = "ÎÏÍÌĪĮ", [string.byte("o")] = "ôöóòõōœøº", [string.byte("O")] = "ÔÖÓÒÕŌŒØº", [string.byte("u")] = "ùûüúū", [string.byte("U")] = "ÙÛÜÚŪ", [string.byte("y")] = "ÿ", [string.byte("Y")] = "Ÿ", } local reversed_accent_dictionary = si.get_reversed_accent_dictionary(accent_dictionary) local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(";")] = ";", [string.byte(".")] = ".", [string.byte(",")] = ",", } local surround_separator_list = { [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(";")] = ";", } function traits.is_surround_separator(c) if surround_separator_list[c] ~= nil then return true end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.get_original_letters(c) return reversed_accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q'7Ԅ5assets/frenchch.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("FR", "frenchch") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.frenchchv5 .. "frenchch_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.frenchchv5 .. "frenchch_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.frenchchv5 .. "frenchch_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.frenchchv5 .. "frenchch_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.frenchchv5 .. "frenchch_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.frenchchv5 .. "frenchch_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.frenchchv5 .. "frenchch_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.frenchchv5 .. "frenchch_traits.trt.png" lng.statistic_alias = "frenchch" lng.categories[si.language.category.FASTSWITCH] = "frenchch" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "frenchch" lng.categories[si.language.category.CELLDICT] = "frenchch" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "frenchch" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "fr" lng.categories[si.language.category.EMOJI] = "french" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.frenchchv5 .. "frenchch.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.frenchchv5 .. "frenchch_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.frenchchv5 .. "frenchch_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.frenchchv5 .. "frenchch_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.frenchchv5 .. "frenchch_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q 6!5assets/frenchch_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 0 81 48 162 s 48 81 96 162 d 96 81 144 162 f 144 81 192 162 g 192 81 240 162 h 240 81 288 162 j 288 81 336 162 k 336 81 384 162 l 384 81 432 162 m 432 81 480 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 ' 360 162 408 243 PK n5:Q둦!5assets/frenchch_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q&[!5assets/frenchch_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q!Y #5assets/frenchch_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.eng_full_azerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.eng_full_azerty_alt_curve_international shift_inputs = kb.eng_full_azerty_shift_international end local s = sf.new_full_keyboard( "dutch_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q%5assets/frenchch_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "dutch_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QvLӹ  #5assets/frenchch_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "eng_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q/  #5assets/frenchch_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if inpute_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "dutch_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QYY"5assets/frenchch_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "frenchch_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q*+dd)5assets/frenchch_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "dutch_soft_tplus_azerty", kb.eng_tplus_azerty_left, kb.eng_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q=cc)5assets/frenchch_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "dutch_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QxNĶ5assets/frenchch_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "æ", "ā", "ª", "ç", "č", "ć", "è", "é", "ê", "ë", "ę", "ē", "ė", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "º", "ù", "û", "ü", "ú", "ū", "ÿ", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Æ", "Ā", "ª", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ę", "Ē", "Ė", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "º", "Ù", "Û", "Ü", "Ú", "Ū", "Ÿ", } local accent_dictionary = { [string.byte("a")] = "àäâáãåæāª", [string.byte("A")] = "ÀÄÂÁÃÅÆĀª", [string.byte("c")] = "çčć", [string.byte("C")] = "ÇČĆ", [string.byte("e")] = "èéêëęēė", [string.byte("E")] = "ÈÉÊËĘĒĖ", [string.byte("i")] = "îïíìīį", [string.byte("I")] = "ÎÏÍÌĪĮ", [string.byte("o")] = "ôöóòõōœøº", [string.byte("O")] = "ÔÖÓÒÕŌŒØº", [string.byte("u")] = "ùûüúū", [string.byte("U")] = "ÙÛÜÚŪ", [string.byte("y")] = "ÿ", [string.byte("Y")] = "Ÿ", } local reversed_accent_dictionary = si.get_reversed_accent_dictionary(accent_dictionary) local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(";")] = ";", [string.byte(".")] = ".", [string.byte(",")] = ",", } local surround_separator_list = { [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(";")] = ";", } function traits.is_surround_separator(c) if surround_separator_list[c] ~= nil then return true end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.get_original_letters(c) return reversed_accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QlE5assets/galician.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("GL", "Galician") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.galicianv5 .. "galician_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.galicianv5 .. "galician_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.galicianv5 .. "galician_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.galicianv5 .. "galician_traits.trt.png" lng.statistic_alias = "galician" lng.categories[si.language.category.FASTSWITCH] = "galician" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "galician" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "galician" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.galicianv5 .. "galician.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.galicianv5 .. "galician_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.galicianv5 .. "galician_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q%5assets/galician_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "galician_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q6 #5assets/galician_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.esp_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "galician_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q6\\)5assets/galician_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "galician_soft_qwerty", kb.esp_tplus_qwerty_left, kb.esp_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QM7 ==5assets/galician_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "à", "á", "â", "ã", "é", "ê", "ç", "í", "ó", "ô", "õ", "ú", "ñ", } local special_upper_list = { "À", "Á", "Â", "Ã", "É", "Ê", "Ç", "Í", "Ó", "Ô", "Õ", "Ú", "Ñ", } local accent_letter_dictionary = { [string.byte("a")] = "àáâã", [string.byte("e")] = "éê", [string.byte("c")] = "ç", [string.byte("i")] = "í", [string.byte("o")] = "óôõ", [string.byte("u")] = "ú", [string.byte("n")] = "ñ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q5I vv5assets/georgian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("GE", "Georgian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.georgianv5 .. "georgian_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.georgianv5 .. "georgian_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.georgianv5 .. "georgian_traits.trt.png" lng.statistic_alias = "georgian" lng.categories[si.language.category.FASTSWITCH] = "georgian" lng.categories[si.language.category.SUBTYPE] = "georgian" lng.categories[si.language.category.MIXINPUT] = "georgian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "georgian" lng.categories[si.language.category.LAYOUT] = "georgian" lng.categories[si.language.category.SPEED] = "western" lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q $5assets/georgian_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs = kb.georgian_full_alt local shift_inputs local main_inputs = kb.georgian_full_main1 local input_type = si.input_type() template = "kr_soft_qwerty_international" local expand_long_press_inputs = kb.georgian_full_expand_long_press_input local s = sf.new_full_keyboard( "georgian_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.match_surface = pkg.georgianv5 .. "georgian_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qm $5assets/georgian_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs = kb.georgian_full_alt local shift_inputs local main_inputs = kb.georgian_full_main2 local input_type = si.input_type() template = "kr_soft_qwerty_international" local expand_long_press_inputs = kb.georgian_full_expand_long_press_input local s = sf.new_full_keyboard( "georgian_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.match_surface = pkg.georgianv5 .. "georgian_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q 5assets/georgian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x10A0 local z_code = 0x10FF local A_code = 0x10A0 local Z_code = 0x10FF local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_georgian_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:QEJMH H 5assets/german.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("DE", "german") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.germanv5 .. "german_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.germanv5 .. "german_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.germanv5 .. "german_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.germanv5 .. "german_soft_qwertz_german.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.CU1, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.germanv5 .. "german_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.germanv5 .. "german_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.germanv5 .. "german_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.germanv5 .. "german_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, { surface_id = pkg.germanv5 .. "german_soft_tplus_qwertz_german.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.CU1, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.germanv5 .. "german_traits.trt.png" lng.statistic_alias = "german" lng.categories[si.language.category.FASTSWITCH] = "german" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "german" lng.categories[si.language.category.CELLDICT] = "german" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "german" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "de" lng.categories[si.language.category.EMOJI] = "german" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.germanv5 .. "german.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.germanv5 .. "german_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.germanv5 .. "german_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.germanv5 .. "german_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.germanv5 .. "german_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ_GERMAN { file_name = pkg.germanv5 .. "german_curve_cu.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.CUSTOM1 + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q5assets/german_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:QR2i5assets/german_cu1_layout.pngUT n_n_n_ WГWГWГq 0 0 40 81 w 40 0 80 81 e 80 0 120 81 r 120 0 160 81 t 160 0 200 81 z 200 0 240 81 u 240 0 280 81 i 280 0 320 81 o 320 0 360 81 p 360 0 400 81 ü 400 0 440 81 ß 440 0 480 81 a 0 81 43 162 s 43 81 87 162 d 87 81 130 162 f 130 81 174 162 g 174 81 217 162 h 217 81 261 162 j 261 81 304 162 k 304 81 348 162 l 348 81 391 162 ö 391 81 435 162 ä 435 81 480 162 y 87 162 130 243 x 130 162 174 243 c 174 162 217 243 v 217 162 261 243 b 261 162 304 243 n 304 162 348 243 m 348 162 391 243 PK n5:Q둦5assets/german_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q&[5assets/german_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q !5assets/german_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.ger_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "german_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q웷pp#5assets/german_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "german_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng if not si.is_international_version() then s.softkeys["sk_dict"] = ck.sk_dict s.softkeys["Dot"] = ck.sk_dot_eng else s.softkeys["Dot"] = ck.sk_dot_eng_inter end ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QCՄB  !5assets/german_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.ger_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "german_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end local main_inputs = kb.ger_full_qwerty_main s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q\ !5assets/german_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local ct = si.context local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.ger_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "german_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qe  (5assets/german_soft_qwertz_german.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local ct = si.context local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.ger_full_qwertz_german_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "ger_soft_german_email_uri_international" else template = "ger_soft_german_international" end alt_inputs = kb.ger_full_german_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "ger_soft_german_curve_email_uri_international" else template = "ger_soft_german_curve_international" end alt_inputs = kb.ger_full_german_alt_curve_international shift_inputs = kb.ger_full_german_shift_international end local s = sf.new_full_keyboard( "german_soft_qwertz_german", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "cu1" s.surface_layout = si.surface_layout.CU1 s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q)MM 5assets/german_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "german_soft_tplus_qwerty", kb.ger_tplus_qwerty_left, kb.ger_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q (~99'5assets/german_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "german_soft_tplus_azerty", kb.ger_tplus_azerty_left, kb.ger_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q@S77'5assets/german_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "german_soft_tplus_qwertz", kb.ger_tplus_qwertz_left, kb.ger_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q{hKK.5assets/german_soft_tplus_qwertz_german.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "german_soft_tplus_qwertz_german", kb.ger_tplus_qwertz_german_left, kb.ger_tplus_qwertz_german_right, kb.ger_tplus_qwertz_german_alt, si.TITLE_CASE.CHANGE, 3) s.template = "bulgarian_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.CU1 s.default_nextword = true s.touch_to_save = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q]]5assets/german_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local special_lower_list = { "à", "á", "â", "ã", "å", "ä", "æ", "ā", "ė", "ö", "ó", "ò", "ô", "õ", "ō", "œ", "ø", "ú", "ü", "ù", "û", "ū", "ś", "š", "ß", "ń", "ñ", } local special_upper_list = { "À", "Á", "Â", "Ã", "Å", "Ä", "Æ", "Ā", "Ė", "Ö", "Ó", "Ò", "Ô", "Õ", "Ō", "Œ", "Ø", "Ú", "Ü", "Ù", "Û", "Ū", "Ś", "Š", "ß", "Ń", "Ñ", } local accent_dictionary = { [string.byte("a")] = "äàáâãåæā", [string.byte("A")] = "ÄÀÁÂÃÅÆĀ", [string.byte("e")] = "ė", [string.byte("E")] = "Ė", [string.byte("o")] = "öóòôõōœø", [string.byte("O")] = "ÖÓÒÔÕŌŒØ", [string.byte("u")] = "úüùûū", [string.byte("U")] = "ÚÜÙÛŪ", [string.byte("s")] = "śšß", [string.byte("S")] = "ŚŠß", [string.byte("n")] = "ńñ", [string.byte("N")] = "ŃÑ", } local reversed_accent_dictionary = si.get_reversed_accent_dictionary(accent_dictionary) local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.get_original_letters(c) return reversed_accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QJ2~ 5assets/germanch.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("DE", "germanch") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.germanchv5 .. "germanch_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.germanchv5 .. "germanch_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.germanchv5 .. "germanch_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.germanchv5 .. "germanch_soft_qwertz_german.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.CU1, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.germanchv5 .. "germanch_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.germanchv5 .. "germanch_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.germanchv5 .. "germanch_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.germanchv5 .. "germanch_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, { surface_id = pkg.germanchv5 .. "germanch_soft_tplus_qwertz_german.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.CU1, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.germanchv5 .. "germanch_traits.trt.png" lng.statistic_alias = "germanch" lng.categories[si.language.category.FASTSWITCH] = "germanch" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "germanch" lng.categories[si.language.category.CELLDICT] = "germanch" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "germanch" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "de" lng.categories[si.language.category.EMOJI] = "german" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.germanchv5 .. "germanch.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.germanchv5 .. "germanch_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.germanchv5 .. "germanch_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.germanchv5 .. "germanch_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.germanchv5 .. "germanch_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ_GERMAN { file_name = pkg.germanchv5 .. "germanch_curve_cu.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.CUSTOM1 + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q!5assets/germanch_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:QR2i5assets/germanch_cu1_layout.pngUT n_n_n_ WГWГWГq 0 0 40 81 w 40 0 80 81 e 80 0 120 81 r 120 0 160 81 t 160 0 200 81 z 200 0 240 81 u 240 0 280 81 i 280 0 320 81 o 320 0 360 81 p 360 0 400 81 ü 400 0 440 81 ß 440 0 480 81 a 0 81 43 162 s 43 81 87 162 d 87 81 130 162 f 130 81 174 162 g 174 81 217 162 h 217 81 261 162 j 261 81 304 162 k 304 81 348 162 l 348 81 391 162 ö 391 81 435 162 ä 435 81 480 162 y 87 162 130 243 x 130 162 174 243 c 174 162 217 243 v 217 162 261 243 b 261 162 304 243 n 304 162 348 243 m 348 162 391 243 PK n5:Q둦!5assets/germanch_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q&[!5assets/germanch_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Qzt #5assets/germanch_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.ger_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "germanch_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QV^&rr%5assets/germanch_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "germanch_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng if not si.is_international_version() then s.softkeys["sk_dict"] = ck.sk_dict s.softkeys["Dot"] = ck.sk_dot_eng else s.softkeys["Dot"] = ck.sk_dot_eng_inter end ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QK  #5assets/germanch_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.ger_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "germanch_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end local main_inputs = kb.ger_full_qwerty_main s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q]J  #5assets/germanch_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local ct = si.context local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.ger_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "germanch_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qe  *5assets/germanch_soft_qwertz_german.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local ct = si.context local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.ger_full_qwertz_german_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "ger_soft_german_email_uri_international" else template = "ger_soft_german_international" end alt_inputs = kb.ger_full_german_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "ger_soft_german_curve_email_uri_international" else template = "ger_soft_german_curve_international" end alt_inputs = kb.ger_full_german_alt_curve_international shift_inputs = kb.ger_full_german_shift_international end local s = sf.new_full_keyboard( "german_soft_qwertz_german", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "cu1" s.surface_layout = si.surface_layout.CU1 s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q+̼OO"5assets/germanch_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "germanch_soft_tplus_qwerty", kb.ger_tplus_qwerty_left, kb.ger_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QG;;)5assets/germanch_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "germanch_soft_tplus_azerty", kb.ger_tplus_azerty_left, kb.ger_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QJE99)5assets/germanch_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "germanch_soft_tplus_qwertz", kb.ger_tplus_qwertz_left, kb.ger_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q{hKK05assets/germanch_soft_tplus_qwertz_german.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "german_soft_tplus_qwertz_german", kb.ger_tplus_qwertz_german_left, kb.ger_tplus_qwertz_german_right, kb.ger_tplus_qwertz_german_alt, si.TITLE_CASE.CHANGE, 3) s.template = "bulgarian_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.CU1 s.default_nextword = true s.touch_to_save = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q]]5assets/germanch_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local special_lower_list = { "à", "á", "â", "ã", "å", "ä", "æ", "ā", "ė", "ö", "ó", "ò", "ô", "õ", "ō", "œ", "ø", "ú", "ü", "ù", "û", "ū", "ś", "š", "ß", "ń", "ñ", } local special_upper_list = { "À", "Á", "Â", "Ã", "Å", "Ä", "Æ", "Ā", "Ė", "Ö", "Ó", "Ò", "Ô", "Õ", "Ō", "Œ", "Ø", "Ú", "Ü", "Ù", "Û", "Ū", "Ś", "Š", "ß", "Ń", "Ñ", } local accent_dictionary = { [string.byte("a")] = "äàáâãåæā", [string.byte("A")] = "ÄÀÁÂÃÅÆĀ", [string.byte("e")] = "ė", [string.byte("E")] = "Ė", [string.byte("o")] = "öóòôõōœø", [string.byte("O")] = "ÖÓÒÔÕŌŒØ", [string.byte("u")] = "úüùûū", [string.byte("U")] = "ÚÜÙÛŪ", [string.byte("s")] = "śšß", [string.byte("S")] = "ŚŠß", [string.byte("n")] = "ńñ", [string.byte("N")] = "ŃÑ", } local reversed_accent_dictionary = si.get_reversed_accent_dictionary(accent_dictionary) local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.get_original_letters(c) return reversed_accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q U5assets/greek.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("EL", "Greek") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.greekv5 .. "greek_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.greekv5 .. "greek_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.greekv5 .. "greek_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.GRD, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.GRD, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.GRD, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.MATH + si.context.PHONE + si.context.NUMBER lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.greekv5 .. "greek_traits.trt.png" lng.statistic_alias = "greek" lng.categories[si.language.category.FASTSWITCH] = "greek" lng.categories[si.language.category.SUBTYPE] = "greek" lng.categories[si.language.category.MIXINPUT] = "greek" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "greek" lng.categories[si.language.category.LAYOUT] = "greek" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.greekv5 .. "greek.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.greekv5 .. "greek_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.greekv5 .. "greek_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q%ֿ5assets/greek_qwerty_layout.pngUT n_n_n_ WГWГWГ; 0 0 48 81 ς 48 0 96 81 ε 96 0 144 81 ρ 144 0 192 81 τ 192 0 240 81 υ 240 0 288 81 θ 288 0 336 81 ι 336 0 384 81 ο 384 0 432 81 π 432 0 480 81 α 24 81 72 162 σ 72 81 120 162 δ 120 81 168 162 φ 168 81 216 162 γ 216 81 264 162 η 264 81 312 162 ξ 312 81 360 162 κ 360 81 408 162 λ 408 81 456 162 ζ 72 162 120 243 χ 120 162 168 243 ψ 168 162 216 243 ω 216 162 264 243 β 264 162 312 243 ν 312 162 360 243 μ 360 162 408 243 PK n5:QR̾"5assets/greek_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "greek_soft_phonepad", kb.gre_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QӚ 5assets/greek_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.gre_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then template = "eng_soft_qwerty_international" alt_inputs = kb.gre_full_qwerty_alt_international else template = "eng_soft_qwerty_curve_international" alt_inputs = kb.gre_full_qwerty_alt_curve_international shift_inputs = kb.gre_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "greek_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end -- not correct mistyping for ";" s.softkeys["sk_1_1"].mistyping_tolerant = false s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q61ˉ5assets/greek_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local template local alt_inputs if si.is_international_version() then template = "eng_soft_tplus_international" alt_inputs = kb.eng_tplus_qwerty_alt_international else template = "eng_soft_tplus_mainland" alt_inputs = kb.eng_tplus_qwerty_alt end local s = sf.new_tplus_keyboard( "greek_soft_tplus", kb.gre_tplus_left, kb.gre_tplus_right, alt_inputs, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng if not si.is_international_version() then s.softkeys["sk_dict"] = ck.sk_dict s.softkeys["Dot"] = ck.sk_dot_eng else s.softkeys["Dot"] = ck.sk_dot_eng_inter end s.sync_sk_lng = lc.sync_sk_lng s.commit_input = lc.commit_input return s PK n5:QI߉225assets/greek_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true --this is fake for the order of greek alphabet is not continuous local a_code = string.byte("a") local z_code = string.byte("b") local A_code = string.byte("a") local Z_code = string.byte("b") local case_insensitive_letters = { "ς", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local special_lower_list = { "ά", "έ", "ή", "ί", "ό", "ύ", "ώ", "ΐ", "α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ρ", "σ", "τ", "υ", "φ", "χ", "ψ", "ω", "ϊ", "ϋ", "ΰ", "ς", } local special_upper_list = { "Ά", "Έ", "Ή", "Ί", "Ό", "Ύ", "Ώ", "ΐ", "Α", "Β", "Γ", "Δ", "Ε", "Ζ", "Η", "Θ", "Ι", "Κ", "Λ", "Μ", "Ν", "Ξ", "Ο", "Π", "Ρ", "Σ", "Τ", "Υ", "Φ", "Χ", "Ψ", "Ω", "Ϊ", "Ϋ", "Ϋ́", "ς", } local accent_letter_dictionary = { [si.u16code("α", 1)] = "ά", [si.u16code("ε", 1)] = "έ", [si.u16code("ι", 1)] = "ϊίΐ", [si.u16code("η", 1)] = "ή", [si.u16code("υ", 1)] = "ϋΰύ", [si.u16code("ο", 1)] = "ό", [si.u16code("ω", 1)] = "ώ", [si.u16code("Α", 1)] = "Ά", [si.u16code("Ε", 1)] = "Έ", [si.u16code("Ι", 1)] = "ΪΊΪ́", [si.u16code("Η", 1)] = "Ή", [si.u16code("Υ", 1)] = "ΫΫ́Ύ", [si.u16code("Ο", 1)] = "Ό", [si.u16code("Ω", 1)] = "Ώ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [string.byte(";")] = ";", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_greek_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_greek_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_greek_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_greek_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Q#,O::5assets/grid_symbol.lua.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "emoji" local P = {} P._G = _G if _REQUIREDNAME == nil then grid_symbol = P else _G[_REQUIREDNAME] = P end setfenv(1, P) si = _G.smartinput ck = _G.common_keys emo = _G.emoji function symbols_from_string(symbols_string) return _G.loadstring("return {" .. symbols_string .. "}")() end function symbols_to_string(symbols) local i local symbols_string = "" local item_string = "" for i = 1, #symbols do if _G.type(symbols[i]) == "table" then item_string = "{" item_string = item_string .. _G.string.format("%q", symbols[i][1]) if symbols[i][2] ~= nil then item_string = item_string .. "," .. symbols[i][2] end if symbols[i][3] ~= nil then item_string = item_string .. "," .. _G.string.format("%q", symbols[i][3]) end if symbols[i]["counter"] ~= nil then item_string = item_string .. ",counter=" .. symbols[i]["counter"] end if symbols[i]["order"] ~= nil then item_string = item_string .. ",order=" .. symbols[i]["order"] end if symbols[i]["emotion"] ~= nil then item_string = item_string .. ",emotion=" .. _G.tostring(symbols[i]["emotion"]) end item_string = item_string .. "}" else item_string = _G.string.format("%q", symbols[i]) end symbols_string = symbols_string .. item_string .. "," end return symbols_string end function layout_emoji_list(emojis) local result_table = {} local index = 1 for i = 1, #emojis do result_table[index] = emojis[i] index = index + 1 end return result_table end function layout_symbol_list(symbols, rows_count, columns_count) local result_table = {} local rows = #symbols / columns_count if rows * columns_count < #symbols then rows = rows + 1 end local pages = rows / rows_count if pages * rows_count < rows then pages = pages + 1 end if pages == 0 then pages = 1 end -- one at least local page, row, col for page = 1, pages do result_table[page] = {} for row = 1, rows_count do result_table[page][row] = {} for col = 1, columns_count do local symbol_index = (page - 1) * rows_count * columns_count + (row - 1) * columns_count + col if symbols[symbol_index] then result_table[page][row][col] = symbols[symbol_index] else result_table[page][row][col] = "" end end end end return result_table end function get_symbol_title(symbol) local title if _G.type(symbol) == "table" then title = symbol[1] else title = symbol end return title end function get_symbol_counter(symbol) local result if _G.type(symbol) == "table" then result = symbol["counter"] end if result == nil then result = 1 end return result end function get_symbol_order(symbol) local result if _G.type(symbol) == "table" then result = symbol["order"] end return result end function normalize_symbol(symbol) local result = {} if _G.type(symbol) == "table" then result = symbol else result[1] = symbol end result["counter"] = get_symbol_counter(symbol) result["order"] = get_symbol_order(symbol) return result end local international_recent_default_list = { ",", ".", "?", "!", "'", "\"", "@", "#", "$", "£", "€", "%", ":", ";", "+", {"()", 1} } local mainland_recent_default_list = { ","," 。", "?", "!", "、", "~", "…", "@", ":", ";", {"()", 1}, {"《》", 1}, "¥", {"「」", 1}, {"‘’", 1}, {"“”", 1} } local japanese_recent_default_list = { "。", ",", "!", "?", "「", "」", "@", "#", "~", "※", "‘", "’", ":", ";", ".", ",", } local FREQUENTLY_USING_THRESHOLD = 10 function add_recent_symbol(surface, main_title, cursor_offset, input_content, input_emotion) local symbols = surface.get_recent_symbols() local i, exist local max_order = 0 local symbol_to_insert for i = 1, #symbols do if not exist and get_symbol_title(symbols[i]) == main_title then local symbol = normalize_symbol(symbols[i]) symbol["counter"] = symbol["counter"] + 1 symbols[i] = symbol exist = true symbol_to_insert = symbol end local order = get_symbol_order(symbols[i]) if order ~= nil and order > max_order then max_order = order end end if not exist then local pos_to_insert -- find the position to insert into if #symbols >= surface.MAX_RECENT_SYMBOL_COUNT then local earliest_pos, min_order for i = 1, #symbols do if get_symbol_counter(symbols[i]) < FREQUENTLY_USING_THRESHOLD then local order_of_adding = get_symbol_order(symbols[i]) if order_of_adding == nil or min_order == nil or min_order > order_of_adding then earliest_pos = i min_order = order_of_adding if order_of_adding == nil then break end end end end pos_to_insert = earliest_pos if pos_to_insert == nil then local min_pos, min_counter for i = 1, #symbols do local counter = get_symbol_counter(symbols[i]) if min_counter == nil or min_counter > counter then min_pos = i min_counter = counter end end pos_to_insert = min_pos end _G.table.remove(symbols, pos_to_insert) else pos_to_insert = #symbols + 1 end -- insert new item local new_item = {} new_item[1] = main_title new_item[2] = cursor_offset new_item[3] = input_content new_item["emotion"] = input_emotion new_item["order"] = max_order + 1 new_item["counter"] = 1 _G.table.insert(symbols, pos_to_insert, new_item) else max_order = max_order + 1 symbol_to_insert["order"] = max_order end surface.set_recent_symbols(symbols) end function get_recent_symbols() local symbols_string = si.get_setting_value(si.settings.RECENTLY_USED_SYMBOLS, si.settings_type.SETTING_STRING) if 0 == _G.string.len(symbols_string) then return get_recent_default_list() end return symbols_from_string(symbols_string) end function get_recent_default_list() local recent_default_list = nil if si.is_international_version() then recent_default_list = international_recent_default_list else recent_default_list = mainland_recent_default_list end return recent_default_list end function set_recent_symbols(surface, symbols) local symbols_string = symbols_to_string(symbols) si.set_setting_value(si.settings.RECENTLY_USED_SYMBOLS, symbols_string, si.settings_type.SETTING_STRING) surface.update_recent_symbols(layout_symbol_list(symbols, surface.ROWS_COUNT, surface.COLUMNS_COUNT)) end function get_japanese_recent_symbols() local symbols_string = si.get_setting_value(si.settings.RECENTLY_USED_SYMBOLS_JAP, si.settings_type.SETTING_STRING) if 0 == _G.string.len(symbols_string) then return get_japanese_recent_default_list() end return symbols_from_string(symbols_string) end function get_japanese_recent_default_list() return japanese_recent_default_list end function set_japanese_recent_symbols(surface, symbols) local symbols_string = symbols_to_string(symbols) si.set_setting_value(si.settings.RECENTLY_USED_SYMBOLS_JAP, symbols_string, si.settings_type.SETTING_STRING) surface.update_recent_symbols(layout_symbol_list(symbols, surface.ROWS_COUNT, surface.COLUMNS_COUNT)) end function symbol_sk_on_click(surface, sk) local input_content = sk.input_content local input_emotion = sk.input_emotion local back_to_previous_force = false if input_content == nil then input_content = sk.main_title end if nil == input_content or "" == input_content then return end local is_emoji_unicode = emo.is_emoji_unicode(input_content) if emo.is_emoji(input_content) then local emoji_input_content = emo.get_emoji_input_content(input_content) si.input_string(emoji_input_content, input_emotion) elseif is_emoji_unicode then local emoji_input_type = emo.get_emoji_input_type() local emoji_input_content = emo.get_emoji_input_content_by_unicode(input_content, emoji_input_type) si.input_string(emoji_input_content, input_emotion) else si.input_string(input_content, input_emotion) end if sk.cursor_offset ~= nil and sk.cursor_offset ~= 0 then back_to_previous_force = true local i for i = 1, sk.cursor_offset do si.input_keycode(_G.config.L_KEYCODE_EDIT_LEFT); end end if not _G.string.match(sk.main_title, "[0-9]") or is_emoji_unicode then add_recent_symbol(surface, sk.main_title, sk.cursor_offset, sk.input_content, sk.input_emotion) end if surface.always_lock == nil or not surface.always_lock then if back_to_previous_force == true then si.back_to_previous() return end if si.get_setting_value(si.settings.SYMBOL_LOCK_STATUS, si.settings_type.SETTING_INT) == 0 then si.back_to_previous() end if si.get_setting_value(si.settings.SYMBOL_LOCK_STATUS, si.settings_type.SETTING_INT) >= 4 then si.back_to_previous() end end end --setup the page of single page of smiley function load_smiley(surface, symbol) for i = 1, surface.MAX_KEY_COUNT do local key = si.new_softkey() local title = symbol[i] if title == nil then key.main_title = nil elseif _G.type(title) == "table" then key.main_title = title[1] local unicode_title = key.main_title local input_type = si.emoji_input_type.UNICODE_UNIFIED local alt_title = emo.get_emoji_input_content_by_unicode(unicode_title, input_type) key.alt_title = alt_title key.cursor_offset = title[2] key.input_content = title[3] key.input_emotion = title["emotion"] else key.main_title = title key.cursor_offset = 0 key.input_content = title key.input_emotion = false end key.on_click = function(sk) symbol_sk_on_click(surface, sk) end surface.softkeys["sk_" .. i] = key end end function load_symbol(surface, symbol, page) for i = 1, 40 do local row = symbol[page][i] for j = 1, 4 do local title; if row == nil then title = nil; else title = row[j]; end key = si.new_softkey() if title == nil then key.main_title = nil elseif _G.type(title) == "table" then key.main_title = title[1] key.cursor_offset = title[2] key.input_content = title[3] key.input_emotion = title["emotion"] else key.main_title = title key.cursor_offset = 0 key.input_content = title key.input_emotion = false end key.on_click = function(sk) if si.get_setting_value(si.settings.SLIDE_INPUT_TIP_STATE, si.settings_type.SETTING_INT) == si.condition_state.INIT then si.set_setting_value(si.settings.SLIDE_INPUT_TIP_STATE, si.condition_state.READY, si.settings_type.SETTING_INT) end symbol_sk_on_click(surface, sk) end key.case_sensitive = false surface.softkeys["sk_" .. i .. "_" .. j] = key end end local sk_page_num = surface.softkeys["sk_next"] sk_page_num.main_title = surface.sym_current_page .. "/" .. _G.table.getn(symbol) end function reload_smiley(surface, symbol) load_smiley(surface, symbol) si.sync_display() end function reload_symbol(surface, symbol, page) load_symbol(surface, symbol, page) si.sync_display() end function setup_smiley_tab(surface, symbol_tab) surface.softkeys["sk_back"] = ck.sk_smiley_close surface.softkeys["sk_sur_change_from_smiley"] = ck.sk_sur_change_from_smiley for k, v in _G.pairs(symbol_tab) do local sk_symbol_tab = si.new_softkey() sk_symbol_tab.on_click = function() surface.switch_tab(k) end surface.softkeys["sk_" .. k] = sk_symbol_tab end end --setup the emoji table, set the title, icon to each category function setup_emojiArt_table(key_table, default_category_name) local result_table = {} for key, category in _G.pairs(key_table) do local index = 1 local emoji_input_type = emo.get_emoji_input_type() local tmp = {} for i =1, #category do local add_into_list = true if emo.get_emoji_input_content_by_unicode(category[i], emoji_input_type) == nil then add_into_list = false end if add_into_list then local new_symbol = {} new_symbol[1] = category[i] new_symbol["emotion"] = true tmp[index] = new_symbol index = index + 1 end end local new_category = {} new_category = tmp result_table[key] = new_category end result_table.default_category = default_category_name return result_table end --setup the emoji table, set the title, icon to each category function setup_emoji_table(key_table, default_category_name) local result_table = {} for key, category in _G.pairs(key_table) do local index = 1 local emoji_input_type = emo.get_emoji_input_type() local tmp = {} for i =1, #category do local add_into_list = true if emo.get_emoji_input_content_by_unicode(category[i], emoji_input_type) == nil then add_into_list = false end if add_into_list then local new_symbol = {} new_symbol[1] = category[i] new_symbol["emotion"] = true tmp[index] = new_symbol index = index + 1 end end local new_category = {} new_category = tmp result_table[key] = new_category end result_table.default_category = default_category_name return result_table end --setup emotion table, set the title, icon to each category function setup_emotion_table(key_table, default_category_name) local result_table = {} for key, category in _G.pairs(key_table) do local new_category = {} for i = 1, #category do local new_symbol = {} new_symbol[1] = category[i] new_symbol["emotion"] = true new_category[i] = new_symbol end result_table[key] = new_category end result_table.default_category = default_category_name return result_table end --setup category keys, function setup_emoji_surface_category(surface, key_table) for k, v in _G.pairs(key_table) do local category_key = si.new_softkey() category_key.on_click = function() surface.switch_category(k) end surface.softkeys["sk_category_" .. k] = category_key end end function setup_chs_symbol(surface, symbol_tab) local sk_prev = si.new_softkey() sk_prev.on_click = surface.prev_page surface.softkeys["sk_prev"] = sk_prev local sk_next = si.new_softkey() sk_next.on_click = surface.next_page surface.softkeys["sk_next"] = sk_next surface.softkeys["sk_back"] = ck.sk_back_to_previous local sk_lock = si.new_softkey() sk_lock.on_click = surface.lock surface.softkeys["sk_lock"] = sk_lock for k, v in _G.pairs(symbol_tab) do local sk_symbol_tab = si.new_softkey() sk_symbol_tab.on_click = function() surface.switch_tab(k) end surface.softkeys["sk_" .. k] = sk_symbol_tab end --special tab for emoticon if surface.softkeys["sk_emoticon"] ~= nil then surface.softkeys["sk_emoticon"].on_click = ck.sk_smiley_open.on_click end surface.softkeys["sk_bk"] = ck.sk_bk_abc surface.softkeys["sk_hide"] = ck.sk_hide surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open end PK n5:Q5 c5assets/gujarati.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("GU", "Gujarati") local packagename = pkg.gujarativ5 if packagename == nil then packagename = "com.cootek.smartinputv5.language.v5.gujarati:" end lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.english .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = packagename .. "gujarati_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = packagename .. "gujarati_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = packagename .. "gujarati_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = packagename .. "gujarati_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = packagename .. "gujarati_traits.trt.png" lng.statistic_alias = "gujarati" lng.categories[si.language.category.FASTSWITCH] = "gujarati" lng.categories[si.language.category.SUBTYPE] = "gujarati" lng.categories[si.language.category.MIXINPUT] = "gujarati" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "gujarati" lng.categories[si.language.category.LAYOUT] = "gujarati" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = packagename .. "gujarati.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q[eHϞ $5assets/gujarati_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs = nil local alt_inputs = kb.gujarati_full_alt1 local main_inputs = kb.gujarati_full_main1 local input_type = si.input_type() template = "gujarati_soft_full_international" local s = sf.new_full_keyboard( "gujarati_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.gujarativ5 .. "gujarati_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_gu s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QQUU$5assets/gujarati_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs = nil local alt_inputs = kb.gujarati_full_alt2 local main_inputs = kb.gujarati_full_main2 local input_type = si.input_type() template = "gujarati_soft_full_international" local s = sf.new_full_keyboard( "gujarati_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.gujarativ5 .. "gujarati_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), 0) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click end end end function on_long_press_once(sk) local expand_sur = si.new_surface("expand") expand_sur.surface_type = si.surface_type.POPUP_EXPAND expand_sur.softkeys = {} local key_alt_title = si.new_expandkey_by_title(sk.alt_title) key_alt_title.on_click = function () si.input_precise(sk.alt_title, "", "", false) end expand_sur.softkeys[1] = key_alt_title si.popup_surface(expand_sur) end s.softkeys["sk_3_8"].on_long_press_once = on_long_press_once s.softkeys["sk_3_9"].on_long_press_once = on_long_press_once s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_gu s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_gujarati s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qa$5assets/gujarati_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.gujarati_full_qwertz_main2 local script_inputs = kb.gujarati_full_qwertz_script2 local expand_long_press_inputs = kb.gujarati_full_qwertz_expand_long_press_input2 local input_type = si.input_type() template = "gujarati_soft_qwertz2_full_international" local s = sf.new_full_keyboard( "gujarati_soft_qwertz2", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.gujarativ5 .. "gujarati_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "અ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end for j = 1, 10 do local sk = s.softkeys["sk_" .. 4 .. "_" .. j] sk.on_click = full_on_click_commit end local sk_5_1 = s.softkeys["sk_5_1"] local sk_5_2 = s.softkeys["sk_5_2"] local sk_5_3 = s.softkeys["sk_5_3"] sk_5_1.on_click = full_on_click_commit sk_5_2.on_click = full_on_click_commit sk_5_3.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_gujarati s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q % %5assets/gujarati_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0a80 local z_code = 0x0aff local A_code = 0x0a80 local Z_code = 0x0aff local zero_code = 0x0ae6 local nine_code = 0x0aeF local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("।", 1)] = "।", } local special_vowel_list = { "ા", "િ", "ી", "ુ", "ૂ", "ે", "ૈ", "ો", "ૌ", "઼", "ઁ", "ૃ", "ૅ", "ૉ", } local special_semivowel_list = { "્", } local special_tone_list = { "ં", "ઃ", } local special_script_list = { "્", "ા", "િ", "ી", "ુ", "ૂ", "ે", "ૈ", "ો", "ૌ", "ૃ", "ૅ", "ૉ", "ં", "ઃ", } local special_script_dictionary = { [0x0ACD] = "અ", [0x0ABE] = "આ", [0x0ABF] = "ઇ", [0x0AC0] = "ઈ", [0x0AC1] = "ઉ", [0x0AC2] = "ઊ", [0x0AC7] = "એ", [0x0AC8] = "ઐ", [0x0ACB] = "ઓ", [0x0ACC] = "ઔ", [0x0AC3] = "ૠ", [0x0AC5] = "ઌ", [0x0AC9] = "ૡ", [0x0A82] = "ં", [0x0A83] = "ઃ", } local special_attach_list = { "્", "ા", "િ", "ી", "ુ", "ૂ", "ે", "ૈ", "ો", "ૌ", "઼", "ઁ", "ૃ", "ૅ", "ૉ", "ં", "ઃ", } local special_consonant_list = { "ક", "ખ", "ગ", "ઘ", "ઙ", "ચ", "છ", "જ", "ધ", "ઞ", "ટ", "ઠ", "ડ", "ઢ", "ણ", "ત", "થ", "દ", "ધ", "ન", "પ", "ફ", "બ", "ભ", "મ", "ય", "ર", "લ", "વ", "શ", "ષ", "સ", "હ", "અ", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif not traits.is_special_attach_case(code) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_special_semivowel_case(code) and traits.is_contain_multi_case(last_series_precise_input) then return last_series_precise_input else return last_series_precise_input..script end end function traits.get_normal_script_main_character(script) local code = si.u16code(script, 1) if traits.is_special_script_case(code) then return special_script_dictionary[code] end return script; end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(3) if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if traits.is_special_semivowel_case(code_se) and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_multi_case(str) local str_size = si.get_string_length(str) if str_size >= 2 then return true end return false end function traits.is_contain_vowel_tone_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true elseif traits.is_special_tone_case(c) then return true end end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_tone_case(c) for i, v in ipairs(special_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_script_case(c) for i, v in ipairs(special_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_attach_case(c) for i, v in ipairs(special_attach_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if c >= zero_code and c <= nine_code then return true end return ct.is_gujarati_character(c) end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_gujarati_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_gujarati_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_gujarati_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_gujarati_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_punctuation_character(c) if c == si.u16code("।", 1) then return true end return false end return traits PK n5:Q y5assets/handwrite_engine.lua.pngUT n_n_n_ WГWГWГrequire "smartinput" local P = {} P._G = _G if _REQUIREDNAME == nil then handwrite_engine = P else _G[_REQUIREDNAME] = P end setfenv(1, P) function setup() local si = _G.smartinput local handwrite_engine = nil if si.handwrite_engine_type() == si.dictionary.engine_type.PENPOWER then handwrite_engine = si.new_engine(si.dictionary.engine_type.PENPOWER, -1) handwrite_engine.files = { { file_name = "penpower_handwrite_data.hwd", open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } elseif si.handwrite_engine_type() == si.dictionary.engine_type.CLOUDHW then handwrite_engine = si.new_engine(si.dictionary.engine_type.CLOUDHW, -1) handwrite_engine.files = { { file_name = "cloud_handwrite_data.hwd", open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } elseif si.handwrite_engine_type() == si.dictionary.engine_type.MULTIHW then handwrite_engine = si.new_engine(si.dictionary.engine_type.MULTIHW, -1) -- pos sensitive handwrite_engine.files = { { file_name = "multi_handwrite_license.hwd", open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "multi_handwrite_data.hwd", open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } elseif si.handwrite_engine_type() == si.dictionary.engine_type.HANDWRITE then handwrite_engine = si.new_engine(si.dictionary.engine_type.HANDWRITE, -1) handwrite_engine.files = { { file_name = "single_handwrite_data.hwd", open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } end return handwrite_engine end PK n5:Qx&&5assets/hard_keys.lua.pngUT n_n_n_ WГWГWГrequire "smartinput" local P = {} P._G = _G if _REQUIREDNAME == nil then hard_keys = P else _G[_REQUIREDNAME] = P end setfenv(1, P) HARD_KEYCODE_UNKNOWN = 0 HARD_KEYCODE_SOFT_LEFT = 1 HARD_KEYCODE_SOFT_RIGHT = 2 HARD_KEYCODE_HOME = 3 HARD_KEYCODE_BACK = 4 HARD_KEYCODE_CALL = 5 HARD_KEYCODE_ENDCALL = 6 HARD_KEYCODE_0 = 7 HARD_KEYCODE_1 = 8 HARD_KEYCODE_2 = 9 HARD_KEYCODE_3 = 10 HARD_KEYCODE_4 = 11 HARD_KEYCODE_5 = 12 HARD_KEYCODE_6 = 13 HARD_KEYCODE_7 = 14 HARD_KEYCODE_8 = 15 HARD_KEYCODE_9 = 16 HARD_KEYCODE_STAR = 17 HARD_KEYCODE_POUND = 18 HARD_KEYCODE_DPAD_UP = 19 HARD_KEYCODE_DPAD_DOWN = 20 HARD_KEYCODE_DPAD_LEFT = 21 HARD_KEYCODE_DPAD_RIGHT = 22 HARD_KEYCODE_DPAD_CENTER = 23 HARD_KEYCODE_VOLUME_UP = 24 HARD_KEYCODE_VOLUME_DOWN = 25 HARD_KEYCODE_POWER = 26 HARD_KEYCODE_CAMERA = 27 HARD_KEYCODE_CLEAR = 28 HARD_KEYCODE_A = 29 HARD_KEYCODE_B = 30 HARD_KEYCODE_C = 31 HARD_KEYCODE_D = 32 HARD_KEYCODE_E = 33 HARD_KEYCODE_F = 34 HARD_KEYCODE_G = 35 HARD_KEYCODE_H = 36 HARD_KEYCODE_I = 37 HARD_KEYCODE_J = 38 HARD_KEYCODE_K = 39 HARD_KEYCODE_L = 40 HARD_KEYCODE_M = 41 HARD_KEYCODE_N = 42 HARD_KEYCODE_O = 43 HARD_KEYCODE_P = 44 HARD_KEYCODE_Q = 45 HARD_KEYCODE_R = 46 HARD_KEYCODE_S = 47 HARD_KEYCODE_T = 48 HARD_KEYCODE_U = 49 HARD_KEYCODE_V = 50 HARD_KEYCODE_W = 51 HARD_KEYCODE_X = 52 HARD_KEYCODE_Y = 53 HARD_KEYCODE_Z = 54 HARD_KEYCODE_COMMA = 55 HARD_KEYCODE_PERIOD = 56 HARD_KEYCODE_ALT_LEFT = 57 HARD_KEYCODE_ALT_RIGHT = 58 HARD_KEYCODE_SHIFT_LEFT = 59 HARD_KEYCODE_SHIFT_RIGHT = 60 HARD_KEYCODE_TAB = 61 HARD_KEYCODE_SPACE = 62 HARD_KEYCODE_SYM = 63 HARD_KEYCODE_EXPLORER = 64 HARD_KEYCODE_ENVELOPE = 65 HARD_KEYCODE_ENTER = 66 HARD_KEYCODE_DEL = 67 HARD_KEYCODE_GRAVE = 68 HARD_KEYCODE_MINUS = 69 HARD_KEYCODE_EQUALS = 70 HARD_KEYCODE_LEFT_BRACKET = 71 HARD_KEYCODE_RIGHT_BRACKET = 72 HARD_KEYCODE_BACKSLASH = 73 HARD_KEYCODE_SEMICOLON = 74 HARD_KEYCODE_APOSTROPHE = 75 HARD_KEYCODE_SLASH = 76 HARD_KEYCODE_AT = 77 HARD_KEYCODE_NUM = 78 HARD_KEYCODE_HEADSETHOOK = 79 HARD_KEYCODE_FOCUS = 80 HARD_KEYCODE_PLUS = 81 HARD_KEYCODE_MENU = 82 HARD_KEYCODE_NOTIFICATION = 83 HARD_KEYCODE_SEARCH = 84 HARD_KEYCODE_MEDIA_PLAY_PAUSE= 85 HARD_KEYCODE_MEDIA_STOP = 86 HARD_KEYCODE_MEDIA_NEXT = 87 HARD_KEYCODE_MEDIA_PREVIOUS = 88 HARD_KEYCODE_MEDIA_REWIND = 89 HARD_KEYCODE_MEDIA_FAST_FORWARD = 90 HARD_KEYCODE_MUTE = 91 HARD_KEYCODE_PAGE_UP = 92 HARD_KEYCODE_PAGE_DOWN = 93 HARD_KEYCODE_PICTSYMBOLS = 94 HARD_KEYCODE_SWITCH_CHARSET = 95 HARD_KEYCODE_BUTTON_A = 96 HARD_KEYCODE_BUTTON_B = 97 HARD_KEYCODE_BUTTON_C = 98 HARD_KEYCODE_BUTTON_X = 99 HARD_KEYCODE_BUTTON_Y = 100 HARD_KEYCODE_BUTTON_Z = 101 HARD_KEYCODE_BUTTON_L1 = 102 HARD_KEYCODE_BUTTON_R1 = 103 HARD_KEYCODE_BUTTON_L2 = 104 HARD_KEYCODE_BUTTON_R2 = 105 HARD_KEYCODE_BUTTON_THUMBL = 106 HARD_KEYCODE_BUTTON_THUMBR = 107 HARD_KEYCODE_BUTTON_START = 108 HARD_KEYCODE_BUTTON_SELECT = 109 HARD_KEYCODE_BUTTON_MODE = 110 local si = _G.smartinput local pi = si.pending_input local ca = si.candidates local fl = si.filter_list local fs = si.current_focus function setup_keys(surface, smart_symbols) local hk_up = si.new_hardkey() hk_up.on_click = function () if not ca.empty() then fs.set_current_focus(fs.CAND) if not ca.is_first_page() then ca.page_up() end else return 1 end end surface.hardkeys[HARD_KEYCODE_DPAD_UP] = hk_up local hk_down = si.new_hardkey() hk_down.on_click = function () if not ca.empty() then local current = fs.get_current_focus() if current ~= fs.CAND and ca.get_default_index() == 0 then fs.set_current_focus(fs.CAND) else if current ~= fs.CAND then fs.set_current_focus(fs.CAND) end ca.page_down() end else return 1 end end surface.hardkeys[HARD_KEYCODE_DPAD_DOWN] = hk_down local sk_prev = si.new_softkey() sk_prev.on_click = function() if not ca.empty() then fs.set_current_focus(fs.CAND) if not ca.is_first_page() then ca.page_up() end end end surface.softkeys["sk_prev"] = sk_prev local sk_next = si.new_softkey() sk_next.on_click = function() if not ca.empty() then fs.set_current_focus(fs.CAND) ca.page_down() end end surface.softkeys["sk_next"] = sk_next local hk_left = si.new_hardkey() hk_left.on_click = function () if not ca.empty() then fs.set_current_focus(fs.CAND) local first = ca.get_first_index() local index = ca.get_default_index() - 1 if index >= 1 then ca.set_default_index(index) elseif not ca.is_first_page() then ca.page_up() ca.set_default_index(first - ca.get_first_index()) end else return 1 end end surface.hardkeys[HARD_KEYCODE_DPAD_LEFT] = hk_left local hk_right = si.new_hardkey() hk_right.on_click = function () if not ca.empty() then local current = fs.get_current_focus() if current ~= fs.CAND and ca.get_default_index() == 0 then fs.set_current_focus(fs.CAND) else if current ~= fs.CAND then fs.set_current_focus(fs.CAND) end local index = ca.get_default_index() + 1 if ca.get_item(index) ~= nil then ca.set_default_index(index) end end else return 1 end end surface.hardkeys[HARD_KEYCODE_DPAD_RIGHT] = hk_right local hk_bk = si.new_hardkey() hk_bk.on_click = function () if pi.range_exist(pi.L_RANGE_CONFIRM) then pi.cancel_confirm() elseif pi.range_exist(pi.L_RANGE_PENDING) or pi.get_signal_code() ~= 0 then pi.delete_character() elseif not ca.empty() then ca.clear() else si.input_keycode(_G.config.L_KEYCODE_BACKSPACE) end end hk_bk.on_long_press_multi = hk_bk.on_click surface.hardkeys[HARD_KEYCODE_DEL] = hk_bk local hk_center = si.new_hardkey() hk_center.on_click = function () if not ca.empty() then local default = ca.get_default_index() if default ~= 0 then ca.confirm_item_2(default) end else return 1 end end surface.hardkeys[HARD_KEYCODE_DPAD_CENTER] = hk_center local hk_sp = si.new_hardkey() hk_sp.on_click = function () local default = ca.get_default_index() if pi.range_exist(pi.L_RANGE_PENDING) and ca.empty() then pi.commit_input() input_string(" ", false) elseif not pi.empty() then if pi.range_exist(pi.L_RANGE_PENDING + pi.L_RANGE_CURVE) and (not ca.empty()) then if not si.get_setting_value(si.settings.AUTO_SPACE) then si.set_setting_value(si.settings.AUTO_SPACE, true, si.settings_type.SETTING_BOOL) ca.confirm_item_2(default) si.set_setting_value(si.settings.AUTO_SPACE, false, si.settings_type.SETTING_BOOL) else ca.confirm_item_2(default) end elseif pi.range_exist(pi.L_RANGE_CONFIRM) and (not pi.range_exist(pi.L_RANGE_PENDING)) then pi.commit_input() end elseif default ~= 0 then if ca.get_item_source(ca.get_item(default)) == ca.SOURCE_TOUCHCORRECTCAND then ca.clear() si.input_string(" ", false) else ca.confirm_item_2(default) if ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.clear() end end else ca.clear() si.input_string(" ", false) end end hk_sp.on_long_press_multi = hk_sp.on_click surface.hardkeys[HARD_KEYCODE_SPACE] = hk_sp local hk_ent = si.new_hardkey() hk_ent.on_click = function () if not pi.empty() and not ca.empty() then if pi.range_exist(pi.L_RANGE_CURVE) then ca.confirm_item_2(ca.get_default_index()) end pi.commit_input() elseif not pi.empty() then pi.commit_input() else si.input_keycode(_G.config.L_KEYCODE_ENTER) end end surface.softkeys["\n"] = hk_ent for i = 1, 9 do local number = si.new_softkey() number.on_click = function() if not ca.empty() and ca.get_last_index() - ca.get_first_index() + 1 >= i then ca.confirm_item_2(i) elseif ca.empty() then si.input_precise(""..i, "", "", false) end end surface.softkeys[""..i] = number end local number = si.new_softkey() number.on_click = function() if not ca.empty() and ca.get_last_index() - ca.get_first_index() + 1 >= 10 then ca.confirm_item_2(10) elseif ca.empty() then si.input_precise("0", "", "", false) end end surface.softkeys["0"] = number local sk_clear_shift_state = si.new_softkey() sk_clear_shift_state.on_click = function() local ts = si.tri_status ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) end surface.softkeys["sk_clear_shift_state"] = sk_clear_shift_state local hk_sft = si.new_hardkey() hk_sft.on_click = function () local ts = si.tri_status ts.set_tri_status(ts.CAPSLOCK, ts.NEXT) end surface.hardkeys[HARD_KEYCODE_SHIFT_LEFT] = hk_sft local hk_back = si.new_hardkey() hk_back.on_click = function() return 1 end surface.hardkeys[HARD_KEYCODE_BACK] = hk_back local hk_sym = si.new_hardkey() hk_sym.on_click = function () ca.confirm_item_2(ca.get_default_index()) ca.clear() ca.add_items_to_front(smart_symbols) end surface.hardkeys[HARD_KEYCODE_SYM] = hk_sym surface.hardkeys[HARD_KEYCODE_PICTSYMBOLS] = hk_sym end return P PK n5:QlZCZC5assets/hard_symbol.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "hard_keys" local hk = hard_keys local si = smartinput local pi = si.pending_input local ca = si.candidates local surface = si.new_surface("eng_hard_phonepad") surface.template = "" surface.surface_type = si.surface_type.HARD_SYMBOL surface.surface_subtype = si.surface_subtype.KEYBOARD_HARD surface.support_mode = si.context.TEXT surface.multi_input_type = si.input_mode.MULTITAP + si.input_mode.FUZZY surface.precise_input_type = si.input_mode.PRECISE + si.input_mode.PREDICT surface.touch_correct = false surface.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE } surface.explicit_strategy = nil surface.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } surface.extra_elements = { "top_bar=hard_symbol_bar" } smart_symbols = {"'", "@", ";", "?", "!", ",", ".", ":", "\"", "-", "(", ")", "~", "*", "%", "&", "#"} hk.setup_keys(surface, smart_symbols) symbol_punc_eng = { { {".", ",", "?", "!"}, {"'", ":", "…", "@"}, {";", "\"", "/", "_"} }, { {"-", "+", "=", "`"}, {"(", ")", "\\", "~"}, {"^", "#", "*", "%"} }, { {"&", "|", "[", "]"}, {"<", ">", "{", "}"}, {"$", "¥", "£", "€"} }, { {"?", "?", "?", ""}, {"", "", "", ""}, {"", "", "", ""} } } symbol_punc_cn = { { {",", "。", "?", "!"}, {"、", ":", ";", "."}, {"……", {"“”", 1}, {"‘’", 1}, "-"} }, { {"(", ")", "(", ")"}, {{"《》", 1}, "@", "%", "~"}, {"——", "&", "#", "*"} }, { {"﹝", "﹞", "〖", "〗"}, {"【", "】", "『", "』"}, {"[", "]", "{", "}"} }, { {"$", "¥", "£", "€"}, {"", "", "", ""}, {"", "", "", ""} } } symbol_number = { { {"1", "2", "3", "."}, {"4", "5", "6", "0"}, {"7", "8", "9", "%"} } } symbol_emotion = { { {":)", ":P", ":D", ":("}, {":-(", ";-)", "=-0", ":-*"}, {":O", "B-)", ":-$", ":-!"} }, { {":-[", "O:-)", ":-\\", ":'("}, {",-)", ":-C", ":-I", ":-O"}, {">:-<", "~zZ", "@_@", "^o^"} }, { {"^v^", "^ω^", "←_←", "→_→"}, {"#^_^#", "^_^", "*^_^*", "*^o^*"}, {"-_-", "-_-#", "-_-||", "-_-b"} }, { {"-.-", "?_?", "π_π", "-O-"}, {"O_o", "555~", "e_e", "haha~"}, {"hehe~", "oh~", "Yeah~", "Q_Q"} }, { {"T_T", "::>_<::", "(-.-)", "≥﹏≤"}, {"(>_<)", "~_~", ">o<", "-O-"}, {"^v^", "(^-^)", "(^o^)", "(^3^)"} }, { {"\^O^/", "^o^", "+_+", "⊙_⊙"}, {"⊙▽⊙", "⊙ω⊙", "$_$", ">_<"}, {"(>_<)", "(>﹏<)", "(~o~)", "( ̄. ̄)"} }, { {"(*>.<*)", "(?o?)", "(ˇ?ˇ)", "(⊙o⊙)"}, {"(≥3≤)", "(╯3╰)", "(°ο°)", "(☆_☆)"}, {"*^÷^*", "*^◎^*", "*^o^*", "╭∩╮"} }, { {"^_^|||", "^=_=^", "﹌○﹌", "~>_<~"}, {"~T_T~", "~w_w~", ">_<|||", ">o<"}, {"y^o^y", "Y(^_^)Y", "y∩__∩y", "╰_╯"} }, { {"╯﹏╰", "╯▂╰", "〒_〒", "~^o^~"}, {"~_~", "~`o`~", "=^_^=", "=_="}, {"≡^ˇ^≡", "≥﹏≤", "●﹏●", "●︿●"} }, { {"●▂●", "?▂?", "(*^@^*)", "(*^﹏^*)"}, {"(=^.^=)", "(=^ω^=)", "*^____^*", "@(一-一)@"}, {"^-_-^", "=@~@=", "= ̄ω ̄=", "↖(^ω^)↗"} }, { {"└(^o^)┘", "(ˉ(∞)ˉ)", "(* ̄︶ ̄*)", "`(*∩_∩*)′"}, {"`(+﹏+)′", "~(*+﹏+*)~", "~@^_^@~", "~~\(^_^)/~~"}, {"~~~^_^~~~", "~~O(∩_∩)O~~", "<(-︿-)>", ""} } } symbol_web = { { {"http://", {"www.*.com", 4, "www..com"}, "www.", "https://"}, {".cn", ".com", ".org", "@"}, {"wap.", "mail.", "news.", "blog."} } } symbol_maths = { { {"+", "-", "×", "÷"}, {"=", "≈", "≤", "≥"}, {"°", "%", "℃", "℉"} }, { {"‰", "㎎", "㎏", "㎜"}, {"㎝", "㎞", "㎡", "㏄"}, {"㏑", "㏒", "⊙", "∠"} }, { {"⊥", "∫", "∮", "∝"}, {"∞", "o", "1", "2"}, {"3", "?", "?", "?"} }, { {"<", ">", "≮", "≯"}, {"±", "≡", "≠", "№"}, {"§", "≦", "≧", "≌"} }, { {"∽", "∷", "/", "∧"}, {"∨", "∏", "∪", "∩"}, {"∈", "∵", "∴", "⌒"} }, { {"√", "∑", "Ψ", "¤"}, {"‖", "?", "", ""}, {"", "", "", ""} } } symbol_serial = { { {"①", "②", "③", "④"}, {"⑤", "⑥", "⑦", "⑧"}, {"⑨", "⑩", "㈠", "㈡"} }, { {"㈢", "㈣", "㈤", "㈥"}, {"㈦", "㈧", "㈨", "㈩"}, {"⑴", "⑵", "⑶", "⑷"} }, { {"⑸", "⑹", "⑺", "⑻"}, {"⑼", "⑽", "⒈", "⒉"}, {"⒊", "⒋", "⒌", "⒍"} }, { {"⒎", "⒏", "⒐", "⒑"}, {"壹", "贰", "叁", "肆"}, {"伍", "陆", "柒", "捌"} }, { {"玖", "拾", "佰", "仟"}, {"万", "ⅰ", "ⅱ", "ⅲ"}, {"ⅳ", "ⅴ", "ⅵ", "ⅶ"} }, { {"ⅷ", "ⅸ", "ⅹ", "Ⅰ"}, {"Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ"}, {"Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ"} }, { {"Ⅹ", "Ⅺ", "Ⅻ", "㊣"}, {"", "", "", ""}, {"", "", "", ""} } } symbol_radical = { { {"丶","丷","丿","乚"}, {"丨","丄","丅","亅"}, {"亻","忄","犭","扌"} }, { {"亠","宀","冖","乛"}, {"艹","厂","疒","礻"}, {"讠","衤","刂","阝"} }, { {"卩","钅","饣","丬"}, {"冫","氵","灬","彡"}, {"纟","爫","囗","辶"} }, { {"廴","冂","凵","丆"}, {"丌","丩","巜","乀"}, {"乁","乂","乄","乆"} }, { {"乊","亇","亍","亼"}, {"亽","兯","冎","勹"}, {"匚","匸","卂","卄"} }, { {"卍","卐","卝","卪"}, {"厃","厶","夂","夊"}, {"豸","釒","尐","屮"} }, { {"屵","廾","彐","彑"}, {"爿","牜","糹","罒"}, {"訁","耂","襾","覀"} } } symbol_pinyin = { { {"ā", "á", "ǎ", "à"}, {"ō", "ó", "ǒ", "ò"}, {"ē", "é", "ě", "è"} }, { {"ī", "í", "ǐ", "ì"}, {"ū", "ú", "ǔ", "ù"}, {"ǖ", "ǘ", "ǚ", "ǜ"} }, { {"ü", "", "", ""}, {"", "", "", ""}, {"", "", "", ""} } } symbol_russia = { { {"а", "б", "в", "г"}, {"д", "е", "ж", "з"}, {"и", "й", "к", "л"} }, { {"м", "Н", "о", "п"}, {"р", "с", "т", "у"}, {"ф", "х", "ц", "ч"} }, { {"ш", "щ", "ъ", "ы"}, {"ь", "э", "ю", "я"}, {"ё", "А", "Б", "В"} }, { {"Г", "Д", "Е", "Ж"}, {"З", "И", "Й", "К"}, {"Л", "М", "Н", "О"} }, { {"П", "Р", "С", "Т"}, {"У", "Ф", "Х", "Ц"}, {"Ч", "Ш", "Щ", "Ъ"} }, { {"Ы", "Ь", "Э", "Ю"}, {"Я", "Ё", "", ""}, {"", "", "", ""} } } symbol_greek = { { {"α", "β", "γ", "δ"}, {"ε", "ζ", "ν", "ξ"}, {"ο", "π", "ρ", "σ"} }, { {"η", "θ", "ι", "κ"}, {"λ", "μ", "τ", "υ"}, {"φ", "χ", "ψ", "ω"} }, { {"Α", "Β", "Γ", "Δ"}, {"Ε", "Ζ", "Η", "Θ"}, {"Ι", "Κ", "Λ", "Μ"} }, { {"Ν", "Ξ", "Ο", "Π"}, {"Ρ", "Σ", "Τ", "Υ"}, {"Φ", "Χ", "Ψ", "Ω"} } } symbol_latin = { { {"?", "?", "?", "à"}, {"á", "?", "?", "?"}, {"è", "é", "ê", "?"} }, { {"D", "ì", "í", "?"}, {"?", "?", "?", "ò"}, {"ó", "?", "?", "?"} }, { {"ù", "ú", "?", "ü"}, {"Y", "T", "?", "?"}, {"?", "à", "á", "a"} }, { {"?", "?", "è", "é"}, {"ê", "?", "e", "ì"}, {"í", "?", "?", "?"} }, { {"?", "ò", "ó", "?"}, {"?", "?", "ù", "ú"}, {"?", "ü", "y", "t"} } } symbol_kata = { { {"ア", "イ", "ウ", "エ"}, {"オ", "ァ", "ィ", "ゥ"}, {"ェ", "ォ", "カ", "キ"} }, { {"ク", "ケ", "コ", "ガ"}, {"ギ", "グ", "ゲ", "ゴ"}, {"サ", "シ", "ス", "セ"} }, { {"ソ", "ザ", "ジ", "ズ"}, {"ゼ", "ゾ", "タ", "チ"}, {"ツ", "テ", "ト", "ダ"} }, { {"ヂ", "ヅ", "デ", "ド"}, {"ッ", "ナ", "ニ", "ヌ"}, {"ネ", "ノ", "ハ", "ヒ"} }, { {"フ", "ヘ", "ホ", "バ"}, {"ビ", "ブ", "ベ", "ボ"}, {"パ", "ピ", "プ", "ペ"} }, { {"ポ", "マ", "ミ", "ム"}, {"メ", "モ", "ャ", "ヤ"}, {"ュ", "ユ", "ョ", "ヨ"} }, { {"ラ", "リ", "ル", "レ"}, {"ロ", "ワ", "ヽ", "ヾ"}, {"ヲ", "ン", "ヴ", "ヵ"} }, { {"ヶ", "", "", ""}, {"", "", "", ""}, {"", "", "", ""} } } symbol_hira = { { {"あ", "い", "う", "え"}, {"お", "ぁ", "ぃ", "ぅ"}, {"ぇ", "ぉ", "か", "き"} }, { {"く", "け", "こ", "が"}, {"ぎ", "ぐ", "げ", "ご"}, {"さ", "し", "す", "せ"} }, { {"そ", "ざ", "じ", "ず"}, {"ぜ", "ぞ", "た", "ち"}, {"つ", "て", "と", "だ"} }, { {"ぢ", "づ", "で", "ど"}, {"っ", "な", "に", "ぬ"}, {"ね", "の", "は", "ひ"} }, { {"ふ", "へ", "ほ", "ば"}, {"び", "ぶ", "べ", "ぼ"}, {"ぱ", "ぴ", "ぷ", "ぺ"} }, { {"ぽ", "ま", "み", "む"}, {"め", "も", "や", "ゆ"}, {"よ", "ゃ", "ゅ", "ょ"} }, { {"ら", "り", "る", "れ"}, {"ろ", "わ", "を", "ん"}, {"ゎ", "", "", ""} } } symbol_zhuyin_japan = { { {"ㄅ", "ㄆ", "ㄇ", "ㄈ"}, {"ㄉ", "ㄊ", "ㄋ", "ㄌ"}, {"ㄍ", "ㄎ", "ㄏ", "ㄐ"} }, { {"ㄑ", "ㄒ", "ㄓ", "ㄔ"}, {"ㄕ", "ㄖ", "ㄗ", "ㄘ"}, {"ㄙ", "ㄧ", "ㄨ", "ㄩ"} }, { {"ㄚ", "ㄛ", "ㄜ", "ㄝ"}, {"ㄞ", "ㄟ", "ㄠ", "ㄡ"}, {"ㄢ", "ㄣ", "ㄤ", "ㄥ"} }, { {"ㄦ", "", "", ""}, {"", "", "", ""}, {"", "", "", ""} } } symbol_icon = { { {"☆", "★", "□", "■"}, {"○", "●", "△", "▲"}, {"▽", "▼", "◇", "◆"} }, { {"♀", "♂", "※", "╳"}, {"╭", "╮", "╰", "╯"}, {"︽", "︾", "︵", "︶"} }, { {"﹁", "﹂", "﹃", "﹄"}, {"︹", "︺", "︿", "﹀"}, {"︴", "﹌", "﹉", "﹊"} }, { {"﹍", "﹎", "﹏", "ˇ"}, {"‥", "︷", "︸", "?"}, {"?", "︵", "︻", "︼"} }, { {"↓", "↑", "?", "↖"}, {"↙", "↗", "↘", "←"}, {"→", "?", "?", "?"} }, { {"?", "?", "◣", "◢"}, {"◤", "◥", "卍", "℡"}, {"⊙", "㊣", "?", "?"} }, { {"?", "?", "?", "?"}, {"?", "Θ", "Ψ", "卐"}, {"㈱", "囍", "◎", ""} } } for i = 1, #symbol_emotion do for j = 1, #symbol_emotion[i] do for k = 1, #symbol_emotion[i][j] do local new_symbol = {} new_symbol[1] = symbol_emotion[i][j][k] new_symbol["emotion"] = true symbol_emotion[i][j][k] = new_symbol end end end symbol = { {"punc_eng", symbol_punc_eng}, {"punc_cn", symbol_punc_cn}, --{"number", symbol_number}, {"maths", symbol_maths}, {"emotion", symbol_emotion}, --{"web", symbol_web}, {"serial", symbol_serial}, {"radical", symbol_radical}, {"pinyin", symbol_pinyin}, --{"russia", symbol_russia}, --{"greek", symbol_greek}, --{"latin", symbol_latin}, --{"kata", symbol_kata}, --{"hira", symbol_hira}, --{"zhuyin_japan", symbol_zhuyin_japan}, {"icon", symbol_icon} } local candidates_groups = {} local hk_sym = surface.hardkeys[hk.HARD_KEYCODE_SYM] hk_sym.on_click = function() ca.clear() si.back_to_keyboard() end local sk_hard_character_listener = si.new_softkey() sk_hard_character_listener.on_click = function() si.back_to_keyboard() end surface.softkeys["sk_hard_character_listener"] = sk_hard_character_listener function symbol_sk_on_click(surface, sk) --si.print("####symbol_sk_on_click -- " .. sk.input_content .. ": " .. sk.cursor_offset) si.input_string(sk.input_content, sk.input_emotion) local i for i = 1, sk.cursor_offset do si.input_keycode(_G.config.L_KEYCODE_EDIT_LEFT); end si.back_to_keyboard() end function load_symbol(tab_index) local index = 0 local candidates = {} for p, page in _G.pairs(symbol[tab_index][2]) do for i, row in _G.pairs(page) do for j, title in _G.pairs(row) do key = si.new_softkey() if _G.type(title) == "table" then key.main_title = title[1] key.cursor_offset = title[2] if title[3] == nil then key.input_content = title[1] else key.input_content = title[3] end if title["emotion"] == nil then key.input_emotion = false else key.input_emotion = title["emotion"] end else key.main_title = title key.input_content = title key.cursor_offset = 0 key.input_emotion = false end if 0 ~= _G.string.len(key.main_title) then key.on_click = function(sk) symbol_sk_on_click(surface, sk) end key.case_sensitive = false surface.softkeys["sk_symbol_" .. tab_index - 1 .. "_" .. index] = key table.insert(candidates, key.main_title) --si.print("#################symbol: " .. "sk_symbol_" .. tab_index .. "_" .. index .. "(" .. key.main_title .. ")") index = index + 1 end end end end return candidates end function switch_tab(tab_index) ca.clear() ca.add_items_to_front(candidates_groups[tab_index]) ca.set_default_index(1) end for k, v in _G.pairs(symbol) do local sk_symbol_tab = si.new_softkey() sk_symbol_tab.on_click = function() switch_tab(k) end sk_symbol_tab.main_title = v[1] surface.softkeys["sk_tab_" .. k - 1] = sk_symbol_tab table.insert(candidates_groups, load_symbol(k)) --si.print("#################: " .. "sk_tab_" .. k - 1 .. "(" .. sk_symbol_tab.main_title .. ")") end local hk_up = surface.hardkeys[hk.HARD_KEYCODE_DPAD_UP] hk_up.old_on_click = hk_up.on_click hk_up.on_click = function () local tab_focused = si.get_setting_value(si.settings.HARD_SYMBOL_TAB_FOCUSED, si.settings_type.SETTING_BOOL) if tab_focused then -- none elseif ca.is_first_page() then si.set_setting_value(si.settings.HARD_SYMBOL_TAB_FOCUSED, true, si.settings_type.SETTING_BOOL) si.input_keycode(_G.config.L_KEYCODE_FUN_HARD_SYMBOL_TAB_MODE) else hk_up.old_on_click() end end local hk_down = surface.hardkeys[hk.HARD_KEYCODE_DPAD_DOWN] hk_down.old_on_click = hk_down.on_click hk_down.on_click = function () local tab_focused = si.get_setting_value(si.settings.HARD_SYMBOL_TAB_FOCUSED, si.settings_type.SETTING_BOOL) if tab_focused then si.set_setting_value(si.settings.HARD_SYMBOL_TAB_FOCUSED, false, si.settings_type.SETTING_BOOL) si.input_keycode(_G.config.L_KEYCODE_FUN_HARD_SYMBOL_TAB_MODE) else hk_down.old_on_click() end end local hk_left = surface.hardkeys[hk.HARD_KEYCODE_DPAD_LEFT] hk_left.old_on_click = hk_left.on_click hk_left.on_click = function(sk) local tab_focused = si.get_setting_value(si.settings.HARD_SYMBOL_TAB_FOCUSED, si.settings_type.SETTING_BOOL) if tab_focused then si.input_keycode(_G.config.L_KEYCODE_FUN_HARD_SYMBOL_TAB_LEFT) else hk_left.old_on_click(sk) end end local hk_right = surface.hardkeys[hk.HARD_KEYCODE_DPAD_RIGHT] hk_right.old_on_click = hk_right.on_click hk_right.on_click = function(sk) local tab_focused = si.get_setting_value(si.settings.HARD_SYMBOL_TAB_FOCUSED, si.settings_type.SETTING_BOOL) if tab_focused then si.input_keycode(_G.config.L_KEYCODE_FUN_HARD_SYMBOL_TAB_RIGHT) else hk_right.old_on_click(sk) end end local hk_bk = surface.hardkeys[hk.HARD_KEYCODE_DEL] hk_bk.on_click = function () if pi.range_exist(pi.L_RANGE_CONFIRM) then pi.cancel_confirm() elseif pi.range_exist(pi.L_RANGE_PENDING) then pi.delete_character() --elseif not ca.empty() then -- ca.clear() else si.input_keycode(_G.config.L_KEYCODE_BACKSPACE) end end hk_bk.on_long_press_multi = hk_bk.on_click local hk_center = surface.hardkeys[hk.HARD_KEYCODE_DPAD_CENTER] hk_center.on_click = function () local tab_index = si.get_setting_value(si.settings.HARD_SYMBOL_CURRENT_TAB, si.settings_type.SETTING_INT) local key = surface.softkeys["sk_symbol_" .. tab_index .. "_" .. ca.get_first_index() + ca.get_default_index() - 1] key.on_click(key) end local hk_sp = surface.hardkeys[hk.HARD_KEYCODE_SPACE] hk_sp.on_click = function () local tab_index = si.get_setting_value(si.settings.HARD_SYMBOL_CURRENT_TAB, si.settings_type.SETTING_INT) local key = surface.softkeys["sk_symbol_" .. tab_index .. "_" .. ca.get_first_index() + ca.get_default_index() - 1] key.on_click(key) end local hk_ent = surface.softkeys["\n"] hk_ent.on_click = function () local tab_index = si.get_setting_value(si.settings.HARD_SYMBOL_CURRENT_TAB, si.settings_type.SETTING_INT) local key = surface.softkeys["sk_symbol_" .. tab_index .. "_" .. ca.get_first_index() + ca.get_default_index() - 1] key.on_click(key) end for i = 1, 9 do local number = surface.softkeys[""..i] number.on_click = function() if not ca.empty() and ca.get_last_index() - ca.get_first_index() + 1 >= i then ca.set_default_index(i) local tab_index = si.get_setting_value(si.settings.HARD_SYMBOL_CURRENT_TAB, si.settings_type.SETTING_INT) local key = surface.softkeys["sk_symbol_" .. tab_index .. "_" .. ca.get_first_index() + ca.get_default_index() - 1] key.on_click(key) end end end local number = surface.softkeys["0"] number.on_click = function() if not ca.empty() and ca.get_last_index() - ca.get_first_index() + 1 >= 10 then ca.set_default_index(10) local tab_index = si.get_setting_value(si.settings.HARD_SYMBOL_CURRENT_TAB, si.settings_type.SETTING_INT) local key = surface.softkeys["sk_symbol_" .. tab_index .. "_" .. ca.get_first_index() + ca.get_default_index() - 1] key.on_click(key) end end function surface.init() si.set_setting_value(si.settings.HARD_SYMBOL_TAB_FOCUSED, false, si.settings_type.SETTING_BOOL) local tab_index = si.get_setting_value(si.settings.HARD_SYMBOL_CURRENT_TAB, si.settings_type.SETTING_INT) switch_tab(tab_index + 1) end return surface PK n5:Q*-5assets/hausa.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("HA", "Hausa") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.hausav5 .. "hausa_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HAUSA, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HAUSA, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.hausav5 .. "hausa_traits.trt.png" lng.statistic_alias = "hausa" lng.categories[si.language.category.FASTSWITCH] = "hausa" lng.categories[si.language.category.SUBTYPE] = "hausa" lng.categories[si.language.category.MIXINPUT] = "hausa" lng.categories[si.language.category.CELLDICT] = "hausa" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "hausa" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = nil lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QfR 5assets/hausa_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local ts = si.tri_status local shift_inputs local main_inputs = { {"q", "w", "e", "r", "t", "y", "ƴ", "u", "i", "o", "p",}, {"a", "s", "d", "ɗ", "f", "g", "h", "j", "k", "ƙ", "l",}, {"z", "x", "c", "v", "b", "ɓ", "n", "m",}, } local alt_inputs = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "*",}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "₦", }, {"@", "/", "-", "'", "!", "?", ";", "`"}, } local template = "hausa_soft_full_international" local input_type = si.input_type() local s = sf.new_full_keyboard( "hausa_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QB+5assets/hausa_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local special_lower_list = { "à", "á", "â", "è", "é", "ê", "ì", "í", "î", "i", "ó", "ò", "ô", "ù", "ú", "û", "ý", "ɓ", "ɗ", "ƙ", "ƴ", } local special_upper_list = { "À", "Á", "Â", "È", "É", "Ê", "Ì", "Í", "Î", "I", "Ó", "Ò", "Ô", "Ù", "Ú", "Û", "Ý", "Ɓ", "Ɗ", "Ƙ", "Ƴ", } local accent_dictionary = { [string.byte("a")] = "àáâ", [string.byte("e")] = "èéê", [string.byte("i")] = "ìíî", [string.byte("o")] = "óòô", [string.byte("u")] = "ùúû", [string.byte("y")] = "ý", [string.byte("A")] = "ÀÁÂ", [string.byte("E")] = "ÈÉÊ", [string.byte("İ")] = "ÌÍÎ", [string.byte("O")] = "ÓÒÔ", [string.byte("U")] = "ÙÚÛ", [string.byte("Y")] = "Ý", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end --special for turkish function traits.to_upper_case(c) if c ~= string.byte("i") and c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Qo-5assets/hebrew.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("HE", "Hebrew") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.hebrewv5 .. "hebrew_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.hebrewv5 .. "hebrew_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.hebrewv5 .. "hebrew_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.hebrewv5 .. "hebrew_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HEBREW, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HEBREW, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.hebrewv5 .. "hebrew_traits.trt.png" lng.statistic_alias = "hebrew" lng.categories[si.language.category.FASTSWITCH] = "hebrew" lng.categories[si.language.category.SUBTYPE] = "hebrew" lng.categories[si.language.category.MIXINPUT] = "hebrew" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "hebrew" lng.categories[si.language.category.LAYOUT] = "hebrew" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.hebrewv5 .. "hebrew.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.hebrewv5 .. "hebrew_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.hebrewv5 .. "hebrew_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.hebrewv5 .. "hebrew_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QBX#5assets/hebrew_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local expand_sur_table = kb.he_phonepad_expand_long_press_input local s = sf.new_phonepad_keyboard( "hebrew_soft_phonepad", kb.he_phonepad, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7, expand_sur_table) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qxv, , !5assets/hebrew_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.he_full_main1 local expand_sur_table = kb.he_full_qwerty_expand_long_press_input local input_type = si.input_type() if not is_curve_mode then template = "hebrew_soft_full_qwerty_international" alt_inputs = kb.he_classic_full_alt else template = "hebrew_soft_full_qwerty_curve_international" alt_inputs = kb.he_classic_full_alt_curve shift_inputs = kb.he_classic_full_alt_shift end local s = sf.new_full_keyboard( "hebrew_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_sur_table) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q !5assets/hebrew_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.he_full_main local expand_sur_table = kb.he_full_qwertz_expand_long_press_input local input_type = si.input_type() if not is_curve_mode then template = "hebrew_soft_full_qwertz_international" alt_inputs = kb.he_full_alt else template = "hebrew_soft_full_qwertz_curve_international" alt_inputs = kb.he_full_alt_curve shift_inputs = kb.he_full_alt_shift end local s = sf.new_full_keyboard( "hebrew_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_sur_table) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q7`'5assets/hebrew_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "hebrew_soft_qwerty", kb.he_tplus_left, kb.he_tplus_right, kb.he_tplus_alt, si.TITLE_CASE.CHANGE, 3) s.template = "hebrew_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q`uu5assets/hebrew_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false traits.right_to_left = true local a_code = si.u16code("ץ", 1) local z_code = si.u16code("ץ", 1) local A_code = si.u16code("ץ", 1) local Z_code = si.u16code("ץ", 1) local special_lower_list = { "ק", "ר", "א", "ט", "ו", "ן", "ם", "פ", "ץ", "ש", "ד", "ג", "כ", "ע", "י", "ח", "ל", "ך", "ף", "ז", "ס", "ב", "ה", "נ", "מ", "צ", "ת", } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_hebrew_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_hebrew_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_hebrew_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_hebrew_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Qf25assets/hindi.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("HI", "Hindi") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.hindiv5 .. "hindi_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.hindiv5 .. "hindi_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.hindiv5 .. "hindi_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.hindiv5 .. "hindi_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "hindi_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, { surface_id = "hindi_sp_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI_SP, }, { surface_id = "hindi_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.hindiv5 .. "hindi_traits.trt.png" lng.statistic_alias = "hindi" lng.categories[si.language.category.FASTSWITCH] = "hindi" lng.categories[si.language.category.SUBTYPE] = "hindi" lng.categories[si.language.category.MIXINPUT] = "hindi" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "hindi" lng.categories[si.language.category.LAYOUT] = "hindi" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.EMOJI] = "hindi" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.hindiv5 .. "hindi.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qi !5assets/hindi_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.hi_full_qwerty_main1 local expand_long_press_inputs = kb.hi_full_qwerty_expand_long_press_input1 local input_type = si.input_type() template = "hindi_soft_full_international" alt_inputs = kb.hi_full_alt local s = sf.new_full_keyboard( "hindi_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.match_surface = pkg.hindiv5 .. "hindi_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_hindi s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qc(X X !5assets/hindi_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.hi_full_qwerty_main2 local expand_long_press_inputs = kb.hi_full_qwerty_expand_long_press_input2 local input_type = si.input_type() template = "hindi_soft_full_international" alt_inputs = kb.hi_full_alt local s = sf.new_full_keyboard( "hindi_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.match_surface = pkg.hindiv5 .. "hindi_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_3_8"].on_long_press_once = function() local sk = s.softkeys["sk_3_8"] ck.show_expand_symbols({sk.main_title, 'ऋ', sk.alt_title}, 2) end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_hindi s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q`33!5assets/hindi_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.hi_full_qwertz_main1 local script_inputs = kb.hi_full_qwertz_script1 local expand_long_press_inputs = kb.hi_full_qwertz_expand_long_press_input1 local input_type = si.input_type() template = "hindi_soft_qwertz_full_international" local s = sf.new_full_keyboard( "hindi_soft_qwertz1", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.hindiv5 .. "hindi_soft_qwertz2.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.force_reset_changeable_display_normal = false s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "अ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_hindi s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q=$u!5assets/hindi_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.hi_full_qwertz_main2 local script_inputs = kb.hi_full_qwertz_script2 local expand_long_press_inputs = kb.hi_full_qwertz_expand_long_press_input2 local input_type = si.input_type() template = "hindi_soft_qwertz2_full_international" local s = sf.new_full_keyboard( "hindi_soft_qwertz2", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.hindiv5 .. "hindi_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.force_reset_changeable_display_normal = false s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "अ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end local sk_5_2 = s.softkeys["sk_5_2"] local sk_5_3 = s.softkeys["sk_5_3"] sk_5_2.on_click = full_on_click_commit sk_5_3.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_hindi s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qi>>%5assets/hindi_sp_sym_keyboard1.sur.pngUT n_n_n_ WГWГWГrequire "common_keys" require "keyboard_symbol" local si = smartinput local ck = common_keys local sym = keyboard_symbol local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "hindi_sym_keyboard1_international" else surface.template = "eng_sym_keyboard1" end function surface.get_symbol_currency_type (surface_id) local language = si.get_current_language() if language == nil or surface_id == nil or language.surfaces == nil then return si.currency_type.USD end for i, key in _G.pairs(language.surfaces) do local surface_item = language.surfaces[i] if surface_item ~= nil and surface_item.currency_type ~= nil and surface_item.surface_id == surface_id and surface_item.surface_type == si.surface_type.SOFT_SYMBOL then return surface_item.currency_type end end return si.currency_type.USD end local surface_id = "hindi_sp_sym_keyboard1.sur.png" local currency_type = surface.get_symbol_currency_type(surface_id) local symbol = sym.keyboard_symbol_table[currency_type][1] local symbol_alt = sym.keyboard_symbol_table[currency_type][2] local symbol_expand = sym.keyboard_symbol_table[currency_type][3] if symbol == nil or symbol_alt == nil or symbol_expand == nil then symbol = sym.normal_symbol symbol_alt = sym.normal_symbol_alt_table symbol_expand = sym.normal_symbol_expand_table end local enable_slide_symbol = true surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.touch_correct = false surface.extra_elements = { "popup_revert", "popup_explicit", } sym.setup_symbol( surface, symbol, symbol_alt, symbol_expand, "1/2", "hindi_sym_keyboard2.sur.png", "hindi_sym_keyboard2.sur.png", enable_slide_symbol) surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_back"] = ck.sk_back_to_previous_abc surface.softkeys["sk_hindi_num"] = ck.sk_sym_hindi_local return surface PK n5:Q-e99"5assets/hindi_sym_keyboard1.sur.pngUT n_n_n_ WГWГWГrequire "common_keys" require "keyboard_symbol" local si = smartinput local ck = common_keys local sym = keyboard_symbol local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "hindi_sym_keyboard1_international" else surface.template = "eng_sym_keyboard1" end function surface.get_symbol_currency_type (surface_id) local language = si.get_current_language() if language == nil or surface_id == nil or language.surfaces == nil then return si.currency_type.USD end for i, key in _G.pairs(language.surfaces) do local surface_item = language.surfaces[i] if surface_item ~= nil and surface_item.currency_type ~= nil and surface_item.surface_id == surface_id and surface_item.surface_type == si.surface_type.SOFT_SYMBOL then return surface_item.currency_type end end return si.currency_type.USD end local surface_id = "hindi_sym_keyboard1.sur.png" local currency_type = surface.get_symbol_currency_type(surface_id) local symbol = sym.keyboard_symbol_table[currency_type][1] local symbol_alt = sym.keyboard_symbol_table[currency_type][2] local symbol_expand = sym.keyboard_symbol_table[currency_type][3] if symbol == nil or symbol_alt == nil or symbol_expand == nil then symbol = sym.normal_symbol symbol_alt = sym.normal_symbol_alt_table symbol_expand = sym.normal_symbol_expand_table end local enable_slide_symbol = true surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.touch_correct = false surface.extra_elements = { "popup_revert", "popup_explicit", } sym.setup_symbol( surface, symbol, symbol_alt, symbol_expand, "1/2", "hindi_sym_keyboard2.sur.png", "hindi_sym_keyboard2.sur.png", enable_slide_symbol) surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_back"] = ck.sk_back_to_previous_abc surface.softkeys["sk_hindi_num"] = ck.sk_sym_hindi_normal return surface PK n5:QGZ"5assets/hindi_sym_keyboard2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "keyboard_symbol" local si = smartinput local ck = common_keys local sym = keyboard_symbol local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "eng_sym_keyboard2_international" else surface.template = "eng_sym_keyboard2" end function surface.get_symbol_currency_type (surface_id) local language = si.get_current_language() if language == nil or surface_id == nil or language.surfaces == nil then return si.currency_type.USD end for i, key in _G.pairs(language.surfaces) do local surface_item = language.surfaces[i] if surface_item ~= nil and surface_item.currency_type ~= nil and surface_item.surface_id == surface_id and surface_item.surface_type == si.surface_type.SOFT_SYMBOL then return surface_item.currency_type end end return si.currency_type.USD end local surface_id = "custom_currency_sym_keyboard2.sur.png" local currency_type = surface.get_symbol_currency_type(surface_id) local symbol = sym.keyboard_symbol_table_2[currency_type][1] local symbol_alt = sym.keyboard_symbol_table_2[currency_type][2] local symbol_expand = sym.keyboard_symbol_table_2[currency_type][3] local cur_sym_keyboard = si.get_cur_sym_keyboard(si.get_current_language().statistic_alias) local next_page = "hindi_sym_keyboard1.sur.png" if (cur_sym_keyboard == si.SYM_KEYBOARD.SPECIAL) then next_page = "hindi_sp_sym_keyboard1.sur.png" end if symbol == nil or symbol_alt == nil or symbol_expand == nil then symbol = sym.normal_symbol_2 symbol_alt = sym.normal_symbol_alt_table symbol_expand = sym.normal_symbol_expand_table end local enable_slide_symbol = true surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.touch_correct = false surface.extra_elements = { "popup_revert", "popup_explicit", } sym.setup_symbol( surface, symbol, symbol_alt, symbol_expand, "2/2", next_page, next_page, enable_slide_symbol) surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_back"] = ck.sk_back_to_previous_abc return surface PK n5:QcSE[~(~(5assets/hindi_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0900 local z_code = 0x097f local A_code = 0x0900 local Z_code = 0x097f local dot_code = si.u16code("।", 1) local special_lower_list = { "ऴ", "ॄ", "ग़", "ड़", "क़", "ऩ", "ॡ", "ऌ", "ढ़", "ऒ", "ऎ", "ऍ", "फ़", "ऎ", "ऍ", "ऎ", "ऍ", "ऋ", } local special_vowel_list = { "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", "ॅ", "ॉ", "अ", "आ", "इ", "ई", "उ", "ऊ", "ए", "ऐ", "ओ", "औ", "ऋ", "ऌ", "ॡ", "ऍ", "ॠ", "ॄ", "ॢ", "ॣ", "ॕ", "ऑ", } local special_semivowel_list = { "्", } local special_tone_list = { "ं", "ः", "ँ", } local special_double_tone_list = { "़", } local special_attach_list = { "्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", "ॅ", "ॉ", "ं", "ः", "ँ", "़", } local special_vowel_script_list = { "्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", } local special_vowel_script_dictionary = { [0x094D] = "अ", [0x093E] = "आ", [0x093F] = "इ", [0x0940] = "ई", [0x0941] = "उ", [0x0942] = "ऊ", [0x0947] = "ए", [0x0948] = "ऐ", [0x094B] = "ओ", [0x094C] = "औ", [0x0943] = "ऋ", } local special_consonant_list = { "क", "ख", "ग", "घ", "च", "छ", "ज", "झ", "ट", "ठ", "ड", "ढ", "ण", "त", "थ", "द", "ध", "न", "प", "फ", "ब", "भ", "म", "य", "र", "ल", "व", "श", "ष", "स", "ह", "क्ष", "त्र", "ङ", "ञ", } local special_upper_list = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("।", 1)] = "।", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_double_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif not traits.is_special_attach_case(code) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_special_semivowel_case(code) and traits.is_contain_multi_case(last_series_precise_input) then return last_series_precise_input else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(3) if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.get_normal_script_main_character(script) local code = si.u16code(script, 1) if traits.is_special_vowel_script_case(code) then return special_vowel_script_dictionary[code] end return script; end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if traits.is_special_semivowel_case(code_se) and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_vowel_tone_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true elseif traits.is_special_tone_case(c) then return true end end return false end function traits.is_contain_double_tone_case(str) local double_tone_num = 0 local code = si.u16code(str, 1) for c in si.u16_iter(str) do if traits.is_special_double_tone_case(c) then double_tone_num = double_tone_num + 1 end end if double_tone_num >= 2 or traits.is_special_double_tone_case(code) then return true end return false end function traits.is_contain_multi_case(str) local str_size = si.get_string_length(str) if str_size >= 2 then return true end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_script_case(c) for i, v in ipairs(special_vowel_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_tone_case(c) for i, v in ipairs(special_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_double_tone_case(c) for i, v in ipairs(special_double_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_attach_case(c) for i, v in ipairs(special_attach_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if c == dot_code then return false end if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) if c == dot_code then return false end local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) if c == dot_code then return false end return ct.is_hindi_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) if c == dot_code then return false end return ct.is_hindi_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) if c == dot_code then return false end return ct.is_hindi_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_hindi_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_punctuation_character(c) if c == dot_code then return true end return false end return traits PK n5:Qe5assets/hindilatin.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("HI", "Hindilatin") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.hindilatinv5 .. "hindilatin_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.hindilatinv5 .. "hindilatin_traits.trt.png" lng.statistic_alias = "hindilatin" lng.categories[si.language.category.FASTSWITCH] = "hindilatin" lng.categories[si.language.category.SUBTYPE] = "hindilatin" lng.categories[si.language.category.MIXINPUT] = "hindilatin" lng.categories[si.language.category.CELLDICT] = "hindilatin" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "hindilatin" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.categories[si.language.category.FORWARDPREDICTION] = "hindilatin" lng.categories[si.language.category.EMOJI] = "hindi" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.hindilatinv5 .. "hindilatin.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q Eg? %5assets/hindilatin_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() template = "eng_soft_qwerty_international_without_dict" alt_inputs = kb.eng_full_qwerty_alt_international local s = sf.new_full_keyboard( "hindilatin_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PREDICT s.default_nextword = true s.ocean_precise_input = true s.touch_to_save = true s.touch_correct = false s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.PRECISE_INPUT, } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT, index = 1 } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q?? 5assets/hindilatin_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "ऴ", "ॄ", "ग़", "ड़", "क़", "ऩ", "ॡ", "ऌ", "ढ़", "ऒ", "ऎ", "ऍ", "फ़", "ऎ", "ऍ", "ऎ", "ऍ", "ऋ", } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif ct.is_hindi_character(c) then return true else return false end end function traits.is_userword_character(c) return ct.is_hindi_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_hindi_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_hindi_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_hindi_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:QC6~%%5assets/hinglish.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("HG", "Hinglish") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.hinglishv5 .. "hinglish_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.hinglishv5 .. "hinglish_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.hinglishv5 .. "hinglish_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.hinglishv5 .. "hinglish_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, { surface_id = pkg.hinglishv5 .. "hinglish_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.hinglishv5 .. "hinglish_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.hinglishv5 .. "hinglish_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.hinglishv5 .. "hinglish_traits.trt.png" lng.statistic_alias = "hinglish" lng.categories[si.language.category.FASTSWITCH] = "hinglish" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "hinglish" lng.categories[si.language.category.CELLDICT] = "english" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "hinglish" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.categories[si.language.category.CLOUDINPUT] = "en" lng.categories[si.language.category.EMOJI] = "english" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.hinglishv5 .. "hinglish.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.hinglishv5 .. "hinglish_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.hinglishv5 .. "hinglish_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.hinglishv5 .. "hinglish_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.hinglishv5 .. "hinglish_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q  #5assets/hinglish_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.eng_full_azerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.eng_full_azerty_alt_curve_international shift_inputs = kb.eng_full_azerty_shift_international end local s = sf.new_full_keyboard( "hinglish_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qރ~%5assets/hinglish_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "hinglish_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q%  #5assets/hinglish_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "hinglish_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q  #5assets/hinglish_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "hinglish_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QOcVjj"5assets/hinglish_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "hinglish_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q&ww)5assets/hinglish_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "hinglish_soft_tplus_azerty", kb.eng_tplus_azerty_left, kb.eng_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q"Vww)5assets/hinglish_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "hinglish_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QZ(ee5assets/hinglish_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "ā", "ą", "æ", "ç", "č", "ć", "è", "é", "ê", "ë", "ē", "ė", "ę", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "ù", "û", "ü", "ú", "ū", "ñ", "ń", "ß", "ś", "š", "ÿ", "ÿ", "ž", "ź", "ż", "ĺ", "ľ", "ł", "ď", "đ", "ŕ", "ř", "ť", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Ā", "Ą", "Æ", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ē", "Ė", "Ę", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "Ù", "Û", "Ü", "Ú", "Ū", "Ñ", "Ń", "ß", "Ś", "Š", "Ÿ", "Ÿ", "Ž", "Ź", "Ż", "Ĺ", "Ľ", "Ł", "Ď", "Đ", "Ŕ", "Ř", "Ť", } local accent_letter_dictionary = { [string.byte("a")] = "äàâáãåāąæ", [string.byte("c")] = "çčć", [string.byte("e")] = "ëèéêēėę", [string.byte("i")] = "ïîíìīį", [string.byte("o")] = "öôóòõōœø", [string.byte("u")] = "üùûúū", [string.byte("n")] = "ñń", [string.byte("s")] = "ßśš", [string.byte("y")] = "ÿ", [string.byte("z")] = "žźż", [string.byte("l")] = "ĺľł", [string.byte("d")] = "ďđ", [string.byte("r")] = "ŕř", [string.byte("t")] = "ť", [string.byte("A")] = "ÄÀÂÁÃÅĀĄÆ", [string.byte("C")] = "ÇČĆ", [string.byte("E")] = "ËÈÉÊĒĖĘ", [string.byte("I")] = "ÏÎÍÌĪĮ", [string.byte("O")] = "ÖÔÓÒÕŌŒØ", [string.byte("U")] = "ÜÙÛÚŪ", [string.byte("N")] = "ÑŃ", [string.byte("S")] = "ߌŠ", [string.byte("Y")] = "Ÿ", [string.byte("Z")] = "ŽŹŻ", [string.byte("L")] = "ĹĽŁ", [string.byte("D")] = "ĎĐ", [string.byte("R")] = "ŔŘ", [string.byte("T")] = "Ť", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QN#H5assets/hungarian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("HU", "Hungarian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.hungarianv5 .. "hungarian_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.hungarianv5 .. "hungarian_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.hungarianv5 .. "hungarian_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.hungarianv5 .. "hungarian_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, { surface_id = pkg.hungarianv5 .. "hungarian_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.hungarianv5 .. "hungarian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.hungarianv5 .. "hungarian_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.hungarianv5 .. "hungarian_traits.trt.png" lng.statistic_alias = "hungarian" lng.categories[si.language.category.FASTSWITCH] = "hungarian" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "hungarian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "hungarian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.hungarianv5 .. "hungarian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.hungarianv5 .. "hungarian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.hungarianv5 .. "hungarian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.hungarianv5 .. "hungarian_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.hungarianv5 .. "hungarian_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qh"5assets/hungarian_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 0 81 48 162 s 48 81 96 162 d 96 81 144 162 f 144 81 192 162 g 192 81 240 162 h 240 81 288 162 j 288 81 336 162 k 336 81 384 162 l 384 81 432 162 m 432 81 480 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 ' 360 162 408 243 PK n5:Q`"5assets/hungarian_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:QM)q"5assets/hungarian_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Qu=- $5assets/hungarian_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.eng_full_azerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.eng_full_azerty_alt_curve_international shift_inputs = kb.eng_full_azerty_shift_international end local s = sf.new_full_keyboard( "hungarian_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q:f&5assets/hungarian_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "hungarian_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q\J $5assets/hungarian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "hungarian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QZלx $5assets/hungarian_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "hungarian_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q^^#5assets/hungarian_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "hungarian_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qkk*5assets/hungarian_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "hungarian_soft_tplus_azerty", kb.eng_tplus_azerty_left, kb.eng_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qkk*5assets/hungarian_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "hungarian_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qg^^5assets/hungarian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "á", "ä", "å", "à", "ã", "â", "ā", "æ", "é", "è", "ê", "ë", "ę", "ē", "ė", "í", "ì", "î", "ï", "ī", "į", "ó", "ő", "ö", "ò", "ô", "õ", "ō", "œ", "ø", "ú", "ű", "ü", "ù", "û", "ū", } local special_upper_list = { "Á", "Ä", "Å", "À", "Ã", "Â", "Ā", "Æ", "É", "È", "Ê", "Ë", "Ę", "Ē", "Ė", "Í", "Ì", "Î", "Ï", "Ī", "Į", "Ó", "Ő", "Ö", "Ò", "Ô", "Õ", "Ō", "Œ", "Ø", "Ú", "Ű", "Ü", "Ù", "Û", "Ū", } local accent_letter_dictionary = { [string.byte("a")] = "áäåàãâāæ", [string.byte("e")] = "éèêëęēė", [string.byte("i")] = "íìîïīį", [string.byte("o")] = "óőöòôõōœø", [string.byte("u")] = "úűüùûū", [string.byte("A")] = "ÁÄÅÀÃÂĀÆ", [string.byte("E")] = "ÉÈÊËĘĒĖ", [string.byte("I")] = "ÍÌÎÏĪĮ", [string.byte("O")] = "ÓŐÖÒÔÕŌŒØ", [string.byte("U")] = "ÚŰÜÙÛŪ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Qo5assets/icelandic.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("IS", "Icelandic") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.icelandicv5 .. "icelandic_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.icelandicv5 .. "icelandic_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.icelandicv5 .. "icelandic_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.icelandicv5 .. "icelandic_traits.trt.png" lng.statistic_alias = "icelandic" lng.categories[si.language.category.FASTSWITCH] = "icelandic" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "icelandic" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "icelandic" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.icelandicv5 .. "icelandic.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.icelandicv5 .. "icelandic_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.icelandicv5 .. "icelandic_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q-&5assets/icelandic_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "icelandic_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q˭H H $5assets/icelandic_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.is_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "swedish_soft_full_email_uri_international" else template = "swedish_soft_full_international" end alt_inputs = kb.swe_full_qwerty_alt else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "swedish_soft_full_email_uri_curve_international" else template = "swedish_soft_full_curve_international" end alt_inputs = kb.swe_full_qwerty_alt_curve shift_inputs = kb.swe_full_qwerty_shift_curve end local s = sf.new_full_keyboard( "icelandic_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q%g22*5assets/icelandic_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "icelandic_soft_qwerty", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q#5assets/icelandic_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "á", "æ", "â", "ä", "å", "à", "ã", "ā", "é", "è", "ê", "ë", "ę", "ē", "ė", "í", "î", "ì", "ï", "ī", "į", "ó", "ö", "ò", "ô", "õ", "ō", "œ", "ø", "ú", "ü", "ù", "û", "ū", "ý", "ÿ", "ð", "þ", } local special_upper_list = { "Á", "Æ", "Â", "Ä", "Å", "À", "Ã", "Ā", "É", "È", "Ê", "Ë", "Ę", "Ē", "Ė", "Í", "Î", "Ì", "Ï", "Ī", "Į", "Ó", "Ö", "Ò", "Ô", "Õ", "Ō", "Œ", "Ø", "Ú", "Ü", "Ù", "Û", "Ū", "Ý", "Ÿ", "Ð", "Þ", } local accent_letter_dictionary = { [string.byte("a")] = "áæâäåàãā", [string.byte("e")] = "éèêëęēė", [string.byte("i")] = "íîìïīį", [string.byte("o")] = "óöòôõōœø", [string.byte("u")] = "úüùûū", [string.byte("y")] = "ýÿ", [string.byte("d")] = "ð", [string.byte("t")] = "þ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PKk5:Q5assets/index.android.bundleUT  n_ n_ n_ w@TГw@TГw@TГܽ{8(2w![-Ro:qfӝ&) Ph$}[Ux )9w' x UB`'yiܼ͍a߼?|^9oɽ\gO,9'm\ Jd3oNYei8ɝhnro6¸nUzof$O0g H$B20)&/$ͳ]N흷Ն]6rk<_a޲9[N])nBo܃0mQ?Qm2=/zM|2wq\WcC<( d2d-'x?mA_0#?g3ҒCbQv 3d"AgL5ROZ0a[E?3ҿQ4"@ƷUP;n,* I3m>qZOT|z5ay87 e—XK 0;͔hovO$@zn"!"{Zem9Y3iwFgAzZ8Zohlzru {}G!AB*#P:Q J߸9]\(;Gxx go_5[ }}n _in-$Olk,[ \]=Iқ)|AV>%a8HP69?i 6#~ʢp6;a#&"=X,-|$ "v&BJ szda)],yD~)L(N'@U6wh>jC׹'GOZUaa+gB3_g.p{ H]]~F-ER}W(}bTdu˘׵CGحt3[#;jn 5- 5H݉]ji&S3Pʯ@`[U{XCC$Β3A<70&isdQFѨŒ4NKY K7D 2H1È靆΢xCRWAyL8ӓǦ|5`ahF+>UJm2;EOQ۝@aRKdd+wqn|h׳+QWHU-M{邀w8 U@)VZuj8l$3J8nʿ΂gYp ooFT"L8*¥"jd uoG;y8Ũ%]Ӽm:s%<aۋ/KcRLN,U0b' G9ym%w>WzsHjIYWu*5Q P~4:n!c󃄒̉v6V=O5OWvDWMD NF: V[z42KR)⺡MG[f,F%Cc3!ϭ!8O}x%pաctzzz`'O̴v I YL|fωcguxp?\qrjdzowcc1z6V~E GgѨ\yo]ΤDk e>X-`ԌwPs{??OzmC'15+8 ՛lE&X<4_PWPVՐ>x$)\?C%hҚ W&vR>]AR1(-hobz KbU|BIfg~l!se6 2]t ΄̄_U qFžHIA;sW :/ͯ1ee|ȓeAe$G˓'E>@IIng<)i?wpxcÏA&j*SABs, $w.xfHb,M1d'\&ntQ-W囏x:yG.|[[#@6fo7ڠ,^XTKT WmPaqs,0E˃aBC-+\v )f-֞M`{ >ǂ E>FeX\x9-v#@6u &lݴ-;ت4\4S¦jP`)ӽ#WyUaLEoG̒pcs?9zʁ;p'8 R‡9e^XxAE0O\=C= \i[>ou%nz8|uQ>~7lV\Ɠh5YU1xVv)Xưq&)+=<<i wiѨ~rFT 99oNyښ"5Pօ3:N#I%YͪY&l9YTwΞ?hg(i6= a~ ځ;񗭘-kMW9O䂒f Ѝ!h.. 0pLR;ƅB!>SصZuXiF5 , y#~OM>GҞdه%2"%UBصarGAxc B1/!`F*7<+`3ڗk<GW0N~bZ\";vP, /9ӆ͟$jrÔ}胚0 ,3PnXv;IH@'^Dg dxrz2$'*m%혚]E TZqi1ņ'olǖ ;b'j[ӏ fJ@ x"<} ~"we~"8VYCgHnL&zC y٪%V<ŮS")e^nҜ[iaE&_/T۳F̨^ b6Ҕ l\$]TA'W<#z?P,ܭ[فM+i61se7Si?G[-pLՊ*.n\E n^YS]68nnn`Kdrcv`oSI_A|j[O_&%X JV2 Ö+<-Mj.w;=m@*hwa2o@ҫ.~ U팎@w3~{f` Njx eEpͬnw`f]LHY@h~ /?B~oʒ?Us~ LAdg) Dt%(vOWӓR9`254*L}()V*RܳLڅo]W.%e:j3x527CGMO|\g1$0ra|άAqAdz3>+JoߠYYXׯ$/Ar*p+ L褬Jg5pQI=C7Ge ڐPO`"N& h9&na:%YQi@Ȇ鼔 -]d˰M v ?,þq 8ۙ{dξEAzTԗ9G~S=F4\AX POdмLlU6n}>R-{0WO=8bm̄ڕgfd\vo J1 U-7] ۨ9ënA;Vh7̲#ut輁%E5T0h3Cc[ڱ薇2lLP @X):}4$pχ]a / 29,J ɐFٸ2Ó3X崴^Hc@aVѸfN;V߱- Q끹,`Ѿu!)}M}t?A/[x<:`$}#OO쩦RNӟR]Yd ` ݩٟ` .r1NE @|z#z~K;wnzĽ!89O񧦘(V5XXii0hGwwQPʋfW(c+xT-x UH9P`_)5xXJ]!FA)^9:ڸ"ͦSb(&wӔ!ߙHG?Y FL:bY=LC05:>~%|X|u~|x sv{rsj>lV_Q]a9 ӧKw?<h`?o:vo <)vxǸ#sJ<T*=e@5>pGgMg}OO_i}UJU}5d 0kXȇmI <A>;Q i#A 9>=>{g,*zY>, nw0=uG[mAH)NO1韜]D`irMǝuF${~w;`"f8zP9I/5z& Sk`gЃv&$?v}|$iAw0`p ,Jy*kb0' 8㳳,A`?{dA*A3zgnh>;9= Uۧ2 #R!<1R)y|8MЉMҠ{v04 Qm'pzv&>ĈIDN@OY?mw|WS!VgpvSx w:Ǝ,S#`tΰ#Ez&!y98տVI靜wdB"9_.':8c}^~ :l.ipxvv"Lo%֜t @ Tr6 :^~)*=;GJgqoFv2;9JoAIO6&Γ,uvNOaڈP1BMY}'0z@5(`03~ĭIS~/Y <%H*a#.&&^ a\!8huG0;gfLB6'&t?ÌXb]?8kw`Z# < 2U9+ (w =C`pkD:]U \aeaf:M2dтH&ܷi(g,OGz8ŀraRnc,]H 4;1b 9kI)8,Hº4`# &!2S$z@:9PHrXƼ|}Ȓr5NsйWȭ~ T\g@T.@ '3*%1 Ja2dFs܇u 30eia BHq>u qVmLU~ЁivOe@@=,ܧ6p$es `"_ =R f A8919CY ,T,D*u .c&ƒ{MT@n8.ͅ:(9g8Rftpxy j)A)Of" "9r$@M8b-JUdmZ!DrBl7 *32(^u bG $#9~q=0ʐ1yS]nv恇nn=،ʝzlBjT7Pj\eeH /UC5rF"_א:-2]VOdj!'Lk݅%ah xHyQJNCWi_ 0>ȍϔ(pAY.)5%wxCaLa[mnp:6辂#X0|0Va:vנWpi5,<_>3Nϭ0ƭ0yJ'NI>Tb=QlzIw?5?S0ε7p9M5d\: t_L]waX}LRG!D Kn܋XYKVDyȧ-_!,c.YNwSIˢMoۭ _NYWm~} JP'cjRڠ:sPT dO USi+t`ӑ} Ѱ/BQ?iV@SC`E|k`cL߂pEysi0Bc'=<".(;0_=D|?sޗu˜'w W#jyY计+K³a.А=:>=޺f(:EW4tV@m&ԏ,xJ%BG"~I-KWt=:LD°esLbs6!\:[*җYHb%T)Cn\&'xSf 7B@6#G'bߟ ڂѼ*=؍ /OZ1Yŵ %\+lbf=:lڣ…ab2+Jk@"JBw,VV9G'2@GrY츚Ն }7 G跍Vxl1m ?M3cѤ9t_}xl Y4+,GۡW^Yfs-hs9F=-lHEP&^8_VI{URWuxqr7a3Hf3 `t5f pCp9 !E73y 䛰_`I_7={t+N{@\^H6#Е*==Lr})TDXĂgʞ^8bQe C2鈌ݮ힚j}A&oĸ !-d.#P[jldJS>=^֊(ujaweB\eAWϫiy .[=Ċ*i+19Şw7YAg欮X^6S]{ O;#Σk#+-:Q]`hZ"mU44#dEPy ZO73+Ly,Bt=h̬d2a?$.[}S=ލDB]~PēN t !fґ)UOChK)-Țwx؎s3qyO񒈝pZM^W| Le^6 ˛+w),l7|4AE!Š$7`e UF?$6Bx7x60m!y{jS}-f)8TKMG O@H*IK8p X 0 @7^P✮P!4a;Gr׳(}/E7^˟Fkkr0 -)$37JkĐZCJD큗Ȳ Xf~;K޹Sb IS0h焹D fs!Ų;|<]v ΅9B/DLGU$wu l7"M^O]z5FaZ=|pYcRTLJ"_+5o__`܂ cGI V$CF(I wxJ&Yg 3){8aHpQ!Z^gfu(I"Tٱ}|cn ż)jX~,W H# {9`ί;/V An̊gL_.гHi5"~W0eԭ[:n< S^Hа]+r~;fEi JGƩMA#Kw*I oVp\mݩ!)E?W1)x%z׸Pl*FH d9s=V#IbL*ψ+B|5kXlE͞'!ݾ¥,۸vK,a$YWW`TS's%7F&:6r)zY] @a{4=!Qi}{o\ޞ& "L;*|nD)G߲nam,5 {kfo:-:"d0*zE65v4w"?gTtwføRbZ_^Nϳ?⇙oءsbH@ !EA|{_Bj`)ܖs"M_R 5=)+c'P䤥)JzHjgg0OQO'xD:5:]Ccckڠ{XtkAm;Xx?m`+7CT' a dj|eN*2HbKAs@{G yAC5]JHM Y`! tśf}g6'ÈᬄTীB%*3/ 2G=>.MaKf2V)hǪԇQWcR39 "4X*@7bTދ-@2y<3:3+k4C PVps0c`2l-I(?k&g{>Lm3 nj` +JZ!*a^n$qެktlMȽkNcSk[j"&>ps:r:G|N>bq+Qɷ:/r- 9տ""g "sxm YS}[;fTteji^ۼOHա`x&C o<%8`}lZ2 uxTLL \l YS72`Ӱhq[DU܂.]4v&_;ܹR}ElY+Ccĥ0!]X=zy\rjU%JяFۥɣZR΢:"2*F) UaczפvRxɈ}xiVQ"FB܅-`Uq`AvlkMdAqJO Z&2Gcd3WWltoQxNjPޯbme)d4<ߡƿF{6";:'uϭi7;@7rJ ic)sr@nt]G~Foh-N:Bpn]gE%TV"Yɐ ja'˓%nj-.TW{(-1oq[8^F@%]A.+nOuLko)n$Wt[79RЭ#Fqt^`? wZ{ ^en+vҙڕ!Xcw9ł>s "ahץq|пNyRlΌn #q!KiN:;PyY_fVSH{{kz8Ql[izPߌځ9n;O48ҙz6bb-Ld|݊#^n y$$|>DG"J-vU%7ĥK Vc2= z,CȡpH@>'4ր"#wK=C%h.9ie4;Q!T@9zJݮxY83Rd2 <~4#t qi7vdKWوj_#gdޅpS&xWg+/oJ?8sz}E,GXڔxt4ퟬb׺zO\6Dx+9g `F6_>fi?b~`XQjrm,d~T[lu\"P֨I[([Ix).C)2L:9)"L w<]SpyeN?u djDZFa:b؞P0E9 'ZF.BPk}08n#;{4g2ԓ`BtsIbf8 ^+?S:>um$A&"u,B̲Y\OCC%m/ºYu9/  %D L,EӋ". }OWΫIO/=^^1!1IR*$)ILǂx]wW`WCzB ELS<9Ohk}=Yd]&od0ֈⲵReJcRHÚ8Ǎizft]IEÈ803]6Kꟴ6C>/?32Z#JݓJsLnJ~ai'lJ>/h($:vo-&O@3xU:[/ը@ӟDGe֛R1]KF$x0z-mOR*6b"8ч xց8;@,AӖ9@J4bB  XPm1՝ U(J.12o֚h؏nKS7r<(HY6zs55ǧȨf 1.ԸۓgbwfpZ tsfmoՒH;ԜpIX[fĖZi Sqc8Vx@5F@-T1brc!2_1KӈO=]H8gx@S}H2Agc^faK @yOH 9sP~פ{ߊдk5= Lpbx}M;]^_<]^ϯ.L@6*AxCwBB)wWHPV 0 _x⇋/|wͰb yy9Qv-&>Ʋ\, oc#N-ѝZ)¥Rwdu<7PA,+YKw]HW3*NXCՓB}J'O50:)9Aivx1 ZE H /ENÝ6])jdr/q)}Xwڝn:8CVZK+_;O^xpS8Xys,wc"kC[ x,/wl,V1L !lw CQTܶBU>?'~3z}F}eN+ se:⠠bHjoODYX;BaM!hU,|sT99vRJ1M;wGް8'9'sg@ kWn k?BK (쥿y)לhz8AfM>3N,]>A`~a¬. Wl}8e 6 KKSl`Fxad[c kc%EuD(Kh:>K/m~.]~fΟ:%qx?&IsF^~T䎹-F՗#!B| ܞ腹m/.$ߡE-ET5*8:y30g 7~b`E 7+WԍSTt#p`]L-Hl[;7w by*K]1au;ԙ4݃ rX;0uk:͕>.2.'anʉ@r> 6um5{}I3ٱ*R\icv zLa` \6:܊`,#j&Sd44 0V~F){3PgJɟ??m>%7hzQ Vf iyT#J i'B ߨ% d,2 k7զN+t7ZUONX;I+|7!W"ӫF2JR<:Ql\3CE kXNm*,lZN̹0Df $q޶qv^ X-KsڡS$+=H=HE"*fهT7h]#ӑuC.Yh$21CNI[P`'h7Hmu|l>XdF06016O1/?UeEݺŋA%Z#af1!02.Q=Ud7W ~%hLDϯנ;L1[zSx1V(U3J*i3@mư q:?=SSӺ{V! zF cazh/iQR ^qw)_;( 8̹KPVi5@svd'k!Ptֈi0PL(əNH 9CS4ZˤsLmij+xm^c^;KM6@]qb24Ѧ6uIYy( >ɗUD3()J\."6uoq\Np)8jg Sku f>ʡ)ronJt  p4~XhC){xv}LcȥJ_e=ݏi=gъc/S>h^/toiit0x.8ŪC*JWr>ReeLіV,aekW"5.E?.޿|uq99$īחo.n~|5I7?^+SC]X&Ӫ2_!1*KC;:|,Kfh*O LAB-G箵@Vca\N5oq'R+HjwBKCY*` up|C+8nb3/BtB nJK='=#b}w+9rNGƯArh"+UDY+:k]Խ4FiڈrLH+9(9gP'f'i]#\5iv N\5ԛxV :Eg,d ˲a/QT"N , ZPJ>rO2IP4QU<[F:FVJ|RC@)FF1~Xby+7;1ʛ:x$rxF{AՂ7u71|^sw#훗"ޞAP"ߕ28UHKT_)>YrRoJR& A[e85 < "+h8W!0)"5*^|jpX6OVAYZ"t\қ PB+Jk ^m{F5x$٥l]&G]W%+%NMݤ=yj5\I)_% >V  *sTOuuSX4wL-kV-vJR)k}$~F3l Uy޾WUU zOsS`747;m7wOMG z͠Z[0tHiDrWNFdBX;Ktžܨz wV i0l[Pr`J +)8̩".:%5cccqGUDPW`qu+Ka=(evoj'yMv@K{fgS?}˭EpAUMXNOʡlN%hˣ1ͽNC."nflہwIX+rSn8,Sx<ݑ+g`Wz^+^ s 9az1_tg)ޡ(3>şuh~KxW<,;>ag8,`^<%$ 0C8j b2SOF3YMV9F: C%6tހ9H7 WOR*R=lP. P³S&y#u׷#~} . l4/"[$ "@W@D9H?S:_֫"$xKӊe!W*ܺa6û`=N>LR RicEH @M|jߕuM"v2 & 1Sl\`Y!:N5,R˾Ϳ5g]]Bw_j sC 6kDnCN&.d,\y/|܌Q'=!nddl&nQDwu3oE,-eឺJ7[4x2.%t:7oì4QpҲHV-n9T-Vah蚍:jL" 54p'ISv]x8߂L y@ljL* ʒe0?A5W>gQgIsBW>Uwu-Nn~jYn߸+URnecےpsG)I-Fs򤗨 :Á3S~XQZl4syFg^rM;(ԕj»t/eYdp*ᶶ!%sKnmm{:a$Hɚmqb)X.*1ҭoIUPo P;:"ajoMTaڭ̶[L3RC pK-3p(ޒ!DxjϸkC7"}wojm!')Z|PùNhU+cFdwnDR:8~EW.YCqxJYc;n'į==A"%&GBީuG:`v!]=,SּRcH2l[.#}U"UOnNbed6mS ťe8y.뮇PbK@7-=GLenJ@\*ʚ5,DAb2]z( i#3ISb޷r97iET'")NX5XnKQzfaDyc*A7NxTgvZw.7t? P$#Z]1T]Cb++$]y@$)8[G$7.kC>EA)\ף0ӣ)h" &QQzZ9b?__ ruk7Iܒ ;c`g%A?WKy @ʐЫ;=pڷ;bic?-paG.B4+k8)ìk q'a1C-@A))0f"N5*+54-[|3]KSNM(at;d*XL 5`*,NvL})uVV3:W`ƯQRnVn i0ŚƬ]] IBvAu8gf_W<tcicu'zC.-_~z ߢb\HݸME@bW9?ĊwQF5 2] I?Z=soOxjTh"TɩL^OY(2Ϡ+,] -/G?X _xAcfBF!B`,J JX@z:lcQA!˪@ܐ%с]䫖G~g.ŵS&ת]99ʒڸ=Cgk_arP=yLZU}Eq_> ƫs^0N|2M/Da"W6VC1B峱PC 9.)"^_)aRPJD&iok%9}Ӕ5Nx jdF]d/VL{&ߗ'E jөя,K)C{+.4n EA?Wa*]ir%DAO`<ʰZAj~JQ}NHAe> w)߉CN3(v :KGaL}sxa6S2/?#-m <;oñ3A'kK~GUN>(ӖA-9 1BLMiU_ঽ ; W@u|RX#A|{9~fZ:@iK9>}Z5Sکjj.DX^ uUDRZj] B%J)%ՓvHa"O:$EK] F@PZs e~vcnjbn(gw_z@uD^7z:EFQ!yA//Kzy_^k#-uECD*4p3LJͤN?pIp))-b-;i k嫯O~k/T Uͥ y}n)oF2uR|H Arڨki5o>mGw1e]u勚^zEs 7F%_)+T)nփVB>=zs`S͌M~McmWKk,7Zݡwէӽ`Z|@,='fwzGV #. ^%KD:6'*첎tF)G %ex0ܯ')>ϗ>tp3G8d"+9ÝD=:Q|󭅣9+-Z=/ZW<6UiR: DXxB<5 L굏j;)7ԫj_i[a^͞ V;+c8(w{aY!gC 0OGQ?p,EHs#~P)~/TtPBU F!zb4Ѯ߼͚ݻlB#H<5M q SHC`!0q\rss   <x!PavgtwL  ̇wEBc >Rrw;ibyM,v'OZHL!=AOZXnS{g?3MQӧv)?jϣO5c |+Vs!xzry|USUCU3ڪ3jηVSfb L8z$u!uāUY1V|3h!eњ9 aVHq&0sP;Yl9` wCx7sUCH^42aZ3e-.9xJsr>g>g4G4GڕAkvJp'š L1p :(&O_Wa@5a=(o߄oߐb."`"ĵ¤p]y3_}/x&}RvE.n=׺₾&N.ilk cҖ@[]SǎTDEzD@ݠpm|0|Ygzg(M8ZEW.EzW-!F[u_t,1XˀQBJ8Άqs޼kFp:t_uGz\oshםMK/ֲkaK`I`mSmm*RS_!ufq Kby;OD`x-0wACBsjN J!}].̂>/Bzl;'MeO+Ԉٟ3-2V3vpGr P|QF.C٘/1o^g0s0[%d;ȿ;/'zwGsI+r٘?~h.3]Po{|KW˵{.EA&0 Pd4@)P'3Ep{IᓶO=j~~EpS%RgX 2v/ pOCg30e0rC A.t-LX[_Q}5ڽҼ=BYPkGMy5=Svŷ=vmKx2S..Vixsxhf }q˰êz.;Pu[u1 NtS?DL ̕'{OvA3=HkD_04~,J o,̌ N4A]M*lND4sQ̐DQۅb|m :!Y͔鎁_K5e'pIz#. Btãpz|EJz0u;/?dUS6ƐEFviڛfKPN5*,) n(aTNSJUf,i-U3`lj2Ɠ!BTֲ,)~ S2GCXx$D~dNJ߬FLzh{au(*oEQEN?ЉV9<"Ph`aHy3[q,zpjlpe b+ۍ=^u=ν#_>!8ϧ'T'њ~⦖S&3O2S_8  Av8]ԇX(z]}nbvMt1^sTr q a![V)9Ct7Ctt*OzpԦ z4]DT8/{9Pع3Yc< pE;=TXX!e~u1f9S!)( ][(tpn\GxSUpBchвm()GZW>}D%;q3[R*3R%2(!N5"!{CyR..r,l{Ihep׍/Fy߆۟*7kg@85F_5:%^$}[Q$i/H9g:lL(tI2xr0棣Ykуh5R0:s 69 i>@s(J2d}Aci,q7S S3c;~O% Wyɒ&y|9zͽ S\W+e4옛%h_)`Mޔݞp.!9hI$njHK89r ,jKrh&"6=iX8AFaĩqC70!W =wIQ[R9@_ҿ℁rKQ:H9*BHXmd$\+/+7<{)*1$ho$ DUi8U qv ̠JX>>|ߵ- Q`YafHHCXjqԋ`]o{GSՐ T6x7A'L:AF:3Osb9}OD^ y.sG"1q)Jfm.1޾tub<,o%pYL^` rj-00SCZ%ƩETr|>dACx+Zif A9,ZB޲\]9N[EWޒe} .0R>ޕ1s D挝 nP$EnL7;/~LL mzS:N5E'x &~΂ܟY8Kލ)|)PAnC.P&Ƹω2V<@b&QT7mEU_UWf%7s ."Ѐ/4iM tSJ$ڬl_uryr> D$l{0~Vo ?qvIe.;C: I$%a%zNwK?2t2aoO}2%ss !U 'C#[zTJ.E ٵEp y``h9KEN5pZP!>>&0规meCK*H!"bq?r'W !>8$%&?RX2a7͠lr^>yX߇R1l3u|글|*LѢ"QQD 'Gʴ*fH8e)^f1KtJJ\aG[>(Z{i{2~\e8ASs})al8~poe{ۅcʿ OBZ>>>)P#^ԯ (,P+|nT@CHT!4 n.[Y?g:TSWUGJ2E_)r XzjDJn EJWG\cĹ 2DČjr:|7H)u`*F. VQkL";[)S/eAcCkl6*HdSEN)\'߂> gC7Ks7zɠה٬ܢy}d/prTO=tv4\m#U00`Dމ[]‧Iz&/KJc\4u3G3H||S" Wx@#< vvr 4Q9ґ͢ L fjV?wG'hgϝFcbbyY7 ~"bb#U m R0fTFRl^襦yO $¼QEozBˮIdlX! ϔ@:AG?B~ ]g ( g@cRsUP6O,Eo$~EenSu>'$%`J"3HͥSeZ1 (p/2k(֊yRǾhN>"v"#uc} Nڍp4",j/y@FWL;xŽrG448/y]:UjL:d/᫫5>y,JVJ R)"76{JPZ#q6$:Ȃٍ2V.C<@yiگ69U_:J_&ý=h.#CGMHZAQ@ 4ڸ%Ic`"e=-^M%ԐI1[ʀ XѼTo:wS^7OYQv<6 wQnXS?Jgt\?>N=Ut:^ PU>*0LP2niҎ*"t $I!WmV!<- feeDejD5oHB m)&4 *8+Bo3ąNz m( [߁4y#~ێ[I+2)yhT*Cʷ+-׸D>Q0dxpy8GKZ4㝷F+Zb/?]N jdU!Z&3$R&TJ$#ES1<ESL5wdH[p⃑P'&m@*Kjv]CصtCljba ䷹+ƉI0` $DR 3>"1/~;/m;4Dt}f+m u6*폔if7vׄKp`躷p7}U)rNTA@];d[ox_&b9, uo[kC&lg۱>) $PC`H\!(̭X/xoN1=1TBW:$<> (.Yn윘s$ЊksDw) r>(XmG9-y'P @ `%f~-@ Ƹ=o1QuEPe~a6IƦ`wfwH>_2 bKxT3"-Mq$ P>'#E+1sU+$U}|UK݄K5D77؇P7e4KiU1E%`@;/''ϭF}BհCn{m̫[̰R> F_N1Kvpd,mК աP:Ye4lȾ9O2"o;^dO^r?AԟO?@C볷Q tq̦tYF$< 4RJ1T-m}OE[~ќݱ#8>L8!al?P RM~ `ыv~77U|]}0:066ӧs ucX `(Vg.W: DpT8sSEN$ON=u<{(_#.sO1Nw )'O]'njaQF~6s[R$r]Q٫2L>/>jY6N| }\%ҝpszRR!ܥ^N,VX2,cvg3/l6nRuGyP^Uᐩ ܊6M3(z9o,J> \hPc!Aj0@±Ϋ0]t!]Xts-~sLқ WEwh)\oTPAcgA;kk*ʇ.`V6DsÖks&}K׈`mgoG;&՘Z!8Cync'wasEH#J VKD,|:JE{#&z#ćza[DaF̹tRB(?> Yz)YGSn~lT0ӫ"rX=c ]Vo `#Qw~Edkj)/&6^le.%Y Z)v+HS``)Znl< FStԘ%,m%%Qtf'[GxKa)5Y2k4fo t ]Or+\s9ٱlxxM07h.r7Rx ; (H-֚\|l'VyC(H9åKv8B'O(N"/\&+ 苨`?n?uDCd})Buh`{1Ԝw3Đt6bҌ s$E@Osm05vʠSL螘S ̌J8\%w+iu|:9,!C&mŝ;X9bJkLz8 go{c^[?~{|z|1= ) '/|Jh]jQ1f NjBqM2SoEqI]j!qn˜f8\*}߃5WjS;>*~Z1\`<MI<!AP#6Xfy#ю=rQiEآ'^iVmjMHka}'$!mrJ[bR-9ô6)dВ1|XL##d $y!+ϸg> vMU)#[!VOʁc A6+FBSx0Ofڤ6f}bJ][BN宬`E^]BB:QA>N[ יg;z=ob֒|h(:a(%;k7N&U7M+'~ΒjmQkqq e_W ;?fFq/gZ`պw z5T zZWfLF#vh^e4ޅr7.#PԬe*jo$/wܲ҉ GF{ɇ'H1 ,*uŠʦl^D^De%[ Sa !,. ӭh bV`Hcԝu\!ZδF\ \~/$P9P1iKY_fB|X899BYqFd ؓ $HЦ]Q&dvMBρ%`En7f㊩!B/4/0?ML^(s *=pۮIrx! cսkS-W,[>?>huD^hr##7suA.ydp*ّA j(HL{gJ*%Y*0-)'Ur=*41jCfF7zjj:emZ aQNE+)*qqk/v]p=5Ρ09-Sɑw<|D )yDŽ]}d}Ss{ni6xCe}CENpr}P0!~tXLs3ry2o@xzXSmJH/`+ۜ!@MQ =aoAF'( ТW$^eFG8FT(B=>w+z\k{`)WCU{')#Vi?BDs::E6^{w^:LIrQw:"3YX!r&#K3$<5RхgQ@冐'm8uPuzB7C~/A^pޭȁ&M@Z>p(+&CcxeK^ Ձ/~~"Yc`L&"N>,ă<ۋpbGK=k{ፐ.zT&qSuhq*9Si de^ + ->4Gs_>^^yc;@GqڍF4yqߐF,hjr֥6m|A)E)xFF oI xQ$XTFrAFu:c4{#S%)z)p1Dڐ qҿ&~"n '˂.H?,QgL&LerWUsslF{efDj m3BD#^.ֆ"XOWK *&R5~-8?dK܂;߄~"ԡKv@tЩ1%ʕxBO+] qbЗh%zJ`S( mȒ2% eSC^ա,Fj /sy9 6Ưtk,7NiDSӖ/pTb Td"Z҉V6_)` N,q{nOaso? [s :n-U ]!yJGS{lW1=db}Ѐx ݅ v~h0~#f!dUR/5 aa l+1OFl ۅKp˨Z~?'⡫;Az>M2*^hPb.EyTPN3kWQ*LRT1pq7{PjV8GzO؁p6 4A0GRjQN}ʇ.]_|Y_뾐t{ QtY.9@# |` -Mf>N$ ozvKDK6Rh]q ]o߳_+ÐV$]h߅t o'@*va!+)S+P;ٹdwx0 i*I7@}Lé>ipj;9/ %Ï(n6p)46IRR/$ZyBM0+TjE}ܷ-򚉽6GRwTNbbN,68L$C򷡿Ac憚{) 34 ySݽEae~C&ɞ'Lo.}Xt|TOB72S:k~**$Fe8E/߱Xxv\u̡Yv+'b!՛ }o mTFWsqw:4,bQ#ɄY꜇y+A50Ƙ#` I#An'qn%ߥI%DDylq}/|G7`<c׬ ?<]Lvb!6RڸuBR _zߜ1@:=y{ؗ=q =5=u{(h~$ RqaS DfTu1kXx\ީoNE:uXSjG:@-Ìȓ~ +5.M,Lu tACy;ZוAOoHho%k)A0w|~}:간{' f^^3 |2ЧW84s{AMY}~ & x*:;ZeĚkƬfx5f*GoYbXl69^*6 *ObiR/E'O]& Y_ &tYnRte.0f$ؚ!mTuzK.#=pٹ~i$/P }H9OX|tL1_~}˟doNm|6~w7_ߠ~|3-a5Aaw/ pG=d/9RS ?=d7O3QˏA(x{[GbC܏o315g?4gK&H>.ȳ-Cq,oj0?y=>f#~|#E{So*کS~n5(ъt/PЍJ7WG@2_GGVw;|u O~~?3)#L`?!gV dsa\%0ו"aKaI TLm:oIhJx{ eD+bLQ *| xt:m3DX1k|_ķ0⥱,1ؘk652@15+o|̢8KI8K" JSs)irQ%+&\$)pR$@`B$?ҧ<(||BLZ1l,{m. [9؂TsKoo:Ox58!W7+&O.6QXhFE̒:O,*$^abPOLjkBFN@ %Pn_%j@Bz.yҐmZa ҹ__|Qp :^嶛p{h^,1ڻKtl=:Vpl{(|:^l9+hwFɷjrzlb:/[?ordx.)akDj W/u v8 =,R%܀5ԁ(KTqA=5"Z}5wI^ǂy|67{}do,Ma̙ѰBY=p}ZQ3-GsKVJjbt6^^FUxeվ0s ȕ+0տw6r2rlf8=Ӣ^O'yQ< iaF4( K")+Je"iVBWS9rbf^o7i9j8 !=5ҿbzk|Re9`39Yݽ}hՙK/%sBIeh)K+ݬp)Up1z0TˊQJi3WZ;뷎!Z"d[)Sf -ml;Vsu46mߣbMD߰ݜ 5a+ )ħ/I֢ې}a_ ^JidZnRPھ@knR e&[×yyAdP)H)vKL*p<&O h"ܐA_7JW6>p #I+=B&L܇ /@F- c [6Y;6ny_~Cgg}h.e/_.1nj+-UuvAgqX8p|@iVhx^p׉jcgȍH]@[<HoxTG5=&X1=Xoxe[7y$Lեa#}h=qƎ5;)Xb ,W>K]qD΁%Iŷ0U_Rec{15,G Dѭ"!}aThva@{`?B|]>.AgpHʾqz7Xߚ׻}T;nGoZQͺeͯt50mio)miocH (+L?"V, օCÑ=[!.i`箺Ur gj{V~\a{OutY{ܜ zYDitҖ!b~LkO’Q fNsqݪhbV|hb~aO+Za1fU8;^ ]cDN!nJ 7qwN=x^VozyM |k,X+r'<]PtOvkƍlK)#XKωP'䯤@`DJ̄40Չ t2BEGxuB A#EnŻ,f(oV iOa̬zb^s_֢݊nj|yJ=H rF TVpWb0yHnL_;z5\#=շ oʶVI3EH1bDϩ"[ u L46I,ݸFvJr>Tیwu@jיfL%ucDP犣J[\X#LyZqVd;V~I!bwF~32ئWǐ) ᗴe3iO*&!Tj5IJ@}*k0* J-xԅ lIg 4'E$j¾U۸>0ma,T*H: oU[eN5Wa>~=\#s^SfH@ߺ3y ҋZl40~p qmd A g|# d 7DXVbv~$ـ#4pQ΄fa3ǩs٘>,lcNS[#~qWsW27p  ̖>ok2n$b+58Rǖ +?=6u *uc zAam9%7!7KAZ8>r<É2`vQ{_e!x%4Y)Xe8avKh{V ֯NwXӌ\kFp3OR?Tk$JƼl[Nf. %bnü@ eG~i. ,>@ Cm^f­ن`' 'eϭ_BAE7b.q-8"2FxdTͭ*8rt6c SxSwSzEVT^J,XM^~ZkQ$I'4Hsn6?r}fƞɵ?d9aД|OtNu ~_9A}D.Q8]H]_U!c 4Mݧ^TP؉?#Ds ۇhQ]3x ^Fa^UK<ʴ _54G?|=z{vv4w +68;& 뫵r)v%VEx##dDtSQ1fx|w)5zfpb8 Wp$Kæͩ/(8H =ZPq\ZTrI-cUy9OrB[W䃅WcAlWx@Z$̰VGiEkZ:,INډZ=v:'mWLkk+Z_fmf}uv\(yoۯ?۶wv>@o[;;d￙AV~I)SN:zcLnL9 e(,L~>'ݮ\L3A*eq)/yz\@么~m_w>% PINǞӆw}"f5Uo?*C )tOjR S5 m`Bx|ayE4Ws:A(^O4%W?koP 'Y? uFubojXvCE=\:me܃mڽO-`.ϯW˓+D R!aj9&q= P`XsLjj Tw1?xipMXjs08epMq@8:^+E2P"')PُI:R;<"\"ހ+ѭߺVr۸k*JrW!pxϡQW[zD_MO:U܁/pGt흴F\6׻͋ O@XmĆ\WJŒJi#yqNs<˟EFzl;>ZNQlX}!-`elMv"P߆.,qKR6RM nmZhU7w976+2Wrrp:D>6/MZL Ə׾F'oTYUG y& vҞq|/,FT'~nLW2([$}5M& 8sRxaL] ;A~&eb5ysB[JCq:5V˨E  B UcF$ Ix3U h', G(qfOs5+@/kt?+*RsY*x\QTa|"sHNE6ulяIi_PHF#4Ԇ~W]G=ُC|KHkc!ks<35!mcr.:Zt9Z]O@O1<.Zv`x}C8M(55ZxN-<d1μm-xur.}a&^t^@\N~9.n!1ja9"~s-#I| =0N!S[ w-mNu۞3:AL>̀7j* ?W ZDHBꚪ]0w9#I2O?{t}c`XgsTGi=f{,EaϘ&zjwW4 K!]â#] I<ѐ!5b%#(SI6 u&hYcDhyÆ]U)e>jT`(m ^SOQrGJI=ѯ /Ĵ. '}8Ԯ&.w|>mɖgn0&nW6/# $6uhvٱqC1Ͼ:u,J@N~' #IU|zqaáJriҹOp\*Zd5Ra cz $Jugklٖbӷb) PKv{϶xkQ*)pX`8vejpy{dIҽt ^w|8ĈXK!)0Kys1%yĔ.tBuP Њ9!>=(% ~x}K|3q,^ԥWDc-EūыW#rlH$\!V=FI "q_ov#z%M۶Bae3$o-+}Ja S?9}VSU=9sNbo_Mx` ;N-0B DȦB&`ɨB5 +V+ȌQ-/L8"+ddY[WcB OBVڠ֠{/^ 8t_*5'{L X#sZ8S2͜GL)A > dJ5HJ 5aHB3J[[矘_ր~o"f~wGGΌC!ܒ1`[c)#Ag!@vnХQ![$!E¯Wi>.| LV21A{ZF! g 4SLbW$IPqYNJҍ˨hWdbv/Rxгa7]e9rYRԴ~G_'BR"zBA(<tJv xF9u|^ٌ/kƃ6xV!R0'V+8d2F&9_?Хm_?JP%g ̴ :/ ĀcQBW@uoU\@W`@yh*m~v +^{*$H+["͓g ]&j> *z0TPP70W&#nj7)TC@ѰÛQaw+$> 0 ~Z kivIBq蚵qEs Z{\蜤_q<+H`' JkM M 92r'o܅Qo#{wT1YM!&T`Q3fNoxiK(9R!V6}OYw}(\F|~4[]%o+RPa-S vmEPǘuP1i*:IbV<яAOQTё5s QD-ИmLsd[R?;MAH>0:JKyսL;w9|D:S, E:X 5!vSP,:k%jCU)9ZmoOicHDAU엑.ְ< u L4R7D(]8#{j 7Y|R׆g#KuA2%X+dӌ=y=jI]$[V!7 Ssy.їJ*ƥ‣A_E0rdӚ 0m,j' cX)h҂"klR)Mrd{[\nl``sFX>AQ9Q5ꍃpO̐q8,"A/| DD- ve" g`:XgJ:-Y:*t nWyP+IMc˨tfst=f؜b&dε D׃[e`@2BMs'靝,;Tt GNB t"H/UnX#`& g8)7Z}8VBS iū46r,E>DV) C|_R_;G5#3ufuဏE W.dI|瑗|M&ˊD8ͨ:#FFL\f nqv ;H?ȭ e#7lJ-̏gқZP`u\|qa―ghLc0:pia}B0q6j2qt1mKX_uʻ%JLר";i?+Tiͩk#2Qp5x#tU~B}IJ1xeH  !  VGkk$XM@,LHL*SB@`T…q_#V~#qI ߄kyr4a\WS>UWAUr (]!Zo*Z N!d.1 ?b}LQ=. m?6Jն~ o61km@\1f FGVBh(N /5A};x4ssƀYzSϻp E低Ա"kyICN1b׹t: juf #u-dp:islURK˪CTF aYsխRO08Zc^s&e@x8%EА>;Ȗz&|ԿD !+dO\J\"̇jM5D?>4~Vֺy+(>;J4A&J xpX%(B1@Mmk(lc}6 6 #8+ܰ\]r B|aa&'z 3gGIurs|:l˷0a.T⽤HЇWydkՆUȲ!if|6h](g>\ՕE9T`^mH\P3/5S8~xl/K泪d#FNob/J$C$DЫ!}`ld#m4Y3Q$gbȼs6'\{v]{xhR ڪ8;NU$i :^c*~x dn;OH ĸ.0Em{g-N:("-"e8N1JR} Bb H5e? 7MM=󺡮JܮoVZmbkx rחG?.b:d\\jwP>}:ܼJgWj-- {/j==[gu[f̮|Kxd8z:n9zY$.{ԍa~k m-i{ gd%P#jIVoJXYI(b1ʩ80yv3u+ f=xWH2iYNI-EVO@4jK9C0폙Ƃ zZ9òu^ VKPp8XMw_>묏`X(B5NZ'BCãAu+O~( |=ii&a_o\nÒphEdn9fk2 NtHe}/yF{굸nߋF؋q[׵(tgoz}{/̣/q8UU-b_&O^'OImHV|aWx Vuu,_] B[}N _ObԿ~F8~-8vw4د˧c|s#Ĺ}Ӕ{a|w#ذB'./I}K˱rmix ;XnpGU@NĴq z=s Ca>$u ^( [5f4[jP*7_M, s (oST㈙ԕw(phM|Svq7@:sh_1^6f?isj]mUWIO {R}B> ]AV85EwYw8{%}3 9駏"a:#*ĺpEd,2LC%L7Qf>%6D}ĒW[Z^J= ױ>E)@u%zfqS}n\PClWZggQjPlK5-3>y wW?߷e}KYQJ鳈^y<(OPdh_;3d&1no³)LE(峄5Ytebc$ԊyB}\1׮Yvy1O(CO%웂N\u eL Daej3eêECe@i$i_xЯj@ }5k66" \(#$]?TZ1LjTX,YMKhzy WB>=8XUչH3[ ګ+Y<}ôlľ}CKhhSkbfӬznEƟAZ~򝝠cqS*½<$70$s̤ZġPNɰ^U{*`4.h M _χYZTK) XM3-S`;: t3bJ+]."ao_:0V3-5א,m5V&q1">.>yj$<]|]8n.^bZ#gձ`!hZm6Li{{~tDYf:6[1Vh4,j6[+eW4@[qIykr!Ȃdnj8!;ԢP,jվl>I}8.l@û?mpdoq 9W~mRe"DyI,΅~G>èPb%Ȍ&bIk</X ;t 668-"iL*+L$'Eo ר?D"*LB !Mf-5P )0K8R<8En=e>hX?EW i&GZ3HL(ɧyj7jXǘnV<7%?,j`CaWZ"v2MdЏEz Au=QSW#4 Iln;]^ #G 4c;$BGjW[s kb)kS!%W2[M"GD{p %J@ZSv*i2 㧿+T/Q24,ߌv> 7ޙPը D =ËuݛHT߫!Q8*ǺsB|M& eQ|oS]Ou$F\ N܌B3I% #p޷HKm xLd\#p_/i#=wVq$C=gaGa{S11Dڅv.jܲPxoh8j_scht@zڔAM$ɛh w}r<@]Z=Ơ} Q$<q壩6D-ʽGmbC$-<ф~l'Q&x*N ݉a:8rcS׎/Tp9x19?@*XzBdʄF:LFRl>c}%oY5Ro;tbuaǤ͋/ȿ'D?c$Q Dc̗ӄp mV2hTCMoaKAWYKП\`(P,:o!|u+XPw p:E>$ت7Wjts=B?^[ė/Vu2R G QF (![[,s)5?$U7 _Ke*e eUdY$) 7#~lKRVqٕ:έnyߒ)V˕XhfEFnJ͕E,@.wqkl*<"ޒ}(pqKY94\Rs]_y ]^W+ti S]=TWZ X=AԔ|ڳ'4OeeHY )!53M(Ɍ)1SA.zϰDM(*}"\ 4ʕ4uxƜިokQ):``%KXL7f5W\W:Kk,YC^:֊Δvۘ+.IDRoZk y>=)C5ʀ#oI0~iu2miZTd::8=eU~P%+o؝;aaLyS NsegTCa _VKd\M8q?65 Q2* B*q0 dId .4eRmLT8M /s25y|4 9I䲾νD."1o  x\6^:#%=gZd/xk 6Hэ=xF&[1[9$Hp / yٹv.f=3qYԃqROz; 4E_4po-sMb[~s]稔5Iߓ#[1V1d˘ LI%da%3d"{F3(n-h^,@XUڬ6G;!2 $ An-I+~3sk!M+2[096Nb_)Z!A՗s%װvQ5\rdH IC Xg{2gHD5_#PW*hi&j %F6^Wnmz0Lv F>[j{wjgJ)=B4'fBO ֋'cke7K+( nmlq24#$ $ƒ.Ru2>XfEܮ|+:%Һ7r*iٹ^-U9y&We mv 1OJ]BC.tR8_S\&[\q23>j|˗ XژEqCMD֙?,&%`]YJ^Np;+yVAK%F'D:q*iZtMmFbѓ"&rI _'T0]^|Œ频$%PP fѻo6ZpSBMU]3: y.LPfDfZ! M8kT9_*wp̝JfmY)(-x>FTkYK=k;S?Xdc؎@CKDžT!8/о|A%jbdD^,+xu|LSˣ O[6ht6DH ;Ճnxy`܅ 6sp"임F86G|sRxZXs`сm"(Q y'078i #4qXjQ(SKJP>]xio,&1qy!yדzfsK'- AIeFA0I8ń}$bvTp&p"'u r3NNOsH|ͻ?FݧG]vXwzSʀrA"ts:rl_WqIڹtg)D{~\faOWX_z {fsqU6.[<&ﻔlonoR+Rg 0bD'1Sf֪ѻ k-rJ~U3siZrRx˙aJ_E[!MQɘzt?+@,5$4lkx|Y@G~PayBJay 6~쑉 :kh8盇.6,ynObX?lQo9Iq<6NFs옐T{HV#ڟ;jLa0k&O*Y-s1 ~ֳ\~=|?ǹuuRn-pMLia{Ѐsa6PÙ]i ,cKY4٢u#*b,"qⓋ(_Y<5XT6sP/xj;=*hQ[y#Wl{NT9r{.oxm}tF%alP* ?w] $)uy0j̉F;WEdTtK|*sxgZ˔Š8j {od̥9C`Gp*Zt[eӻ d2tEB,u0%ټڨY m'.щvfƳ:gehrS,քQ]C԰jkKRd%_: nO7+R; jTџ6~9 CW+(ΓjpC@xZst-T&W]IZxpb"]z:FTa)Aj~ndž-9c,Ё@fC2 /P%ס$1)1*'($NuضHO)˓ !k>5[hBkhX|5 "vùI/"y m;-gC/{¿%ʓB=ЦHDs$M $5ŇLHM$og-45h 8w6N:o1;OK'R~KQgCדxOei,AA=)4tW"Y0#qpOg͏Q2N'tN^&"@mItZYvD31`ѭXHY֔,d郝,F0˴臭ZBx !@8SMy&vTRC90#iEas_D3Z7Eg mO[^uJXV+u^oZTVCܩěK[h Њ995-2 &5ΌJn*_ dҮtl/4F09jF V>sv:Y7L^,+cU \ ֜5Mk^VG,X1z+p=0amԜIVRUۗE04G<\N~a+ZkSąͮtD˶Ag2u#7ݼpF WUD*Y 8_;'C7o4"˹!/GϏUC5/D`/co=0\CKu@0ȷ. .[T!e{$gP*ڭ[.ۍt9JލNSW'WE<'jvĠG7a@Z.j+A6;2Q7w)bu]":Յ@/N6 Lf_e`m,=dҩ D]WhsQr^[2Ԙ:%,u.o>ކ38pUϼ#bp@Q y*muZ^ė%|6/)h2Ȋ9s y8CI uZvz@p\fI$%ޛpo+ol> 9fWÃ_N2{(%#)E Rv9]*\iHF2c>"/⮙K2*^ wZ7o}$*&V{2q=[x8\U\E.o|zWdhyjz%D^"- 2W7-]B 3艈-a[{Z^L{6|/^ç=O$RHJGT$YxN<|i@;7V)#9peïy.Iҁ#T7\ Xӽ`oa+)&_d<}^|;iOvDAW;~=;AxW׽+3iG{v&>8&{{rw;Ҟ? /{3֌o~s${|6o((}c94{\C0bϰ޼=|wÏ?_:9=_L_^|_gez߻g_|'S1*+u@}h2Q9OdƑ|`e?dr~ÿm,^h~U#5G 4?a^Ƭj{˜.N }lk]=-z\㸞Fޛz2f5XX"LҊtJ֞SbV_aݰ? kc,Q( )nqoi>Tٵ1sF:z<yy2re) /ғGPidljSۿTV ᧏P: 8|of~'Nr bbaTuZU ]15dQhg'z4Øw~f>.K$ B4"*j*h3|Ը+;X .>=TVNj7ߝ!}tr"\xw3tbva+$FPU2 7C2Xf$J -i+$&ZP=y pqRc~6P&¡i?pNEjZYVoREäKâ)Fx.Rwv[تj8LLv dA$ֻM.x$7񐪛"w.K?ɾq?"tGu.m.>}DK&'2yhea$ mx>m#L(T; W? qBѮ[oh>j"! ^9_<ЍlRcjkQ#moj*E-4vvP\)=&3Gkq[ :e6+Z Ӓָ*ʥJ Refv LQ[ EFEKeHkd:` 六a>텙wJM\.]lP2듇Er>s!&4a 5"]5ws\:Qnt-A7piۡ|B^;]Z,&G: *\g`lOhۅ2Tq2a.9tr~ۇޏfm"cAaJȽ^h 7 Ÿ‹fAPQP c(?.4õZ̴ 2 (M v,u=S fJ+jjI**&ZO.T1 3ԕBNk,!XMQzucftikT wJ >כ[[#chz1 gW-u[)qۯ uJOI_+ix\Sc3Jn*X&"U [ۙte/~uge )9ˈJ|>Ы)ĭ a: WTR.sQ=|.܃RPMBr|o)5Vq51֨)8Bg^=_=Z$>bIKiDZb7Ѭ^6j (F~QPHyB&O4qdZs&v,L* °(#0'&'6kĦ!CĦQYŎS?o:ut11e%-02._!fK93tMQSΰTCơe/e_8%tcPtRW~ЀFxQdt; +Y1d^]@=@X/AܕjɺwrxAL,GN&/ c 3 $0 њ9fp'ut#ؒs&r~( A rLW~ G36UPOчɐX#3!PaSR"$Yy-e'`ŐO{d"y /R")32quP9L[8u8/(mtTmoˈPO}]dǻkC 3+D^zhOƃ`Sɨ)˜"kUĵ^&|OFk&;j\%^k %+/絾Vܡ24M 1%N&@c'10RB6TYZ<+xֳP1ۓ^7CR)En3?/.c9j$SQEK8 h4 z&EC5BT2&!\f],Y'D5~}}Crʁ:38gN ><ꬩr!cEW+'6TZH"Oo;EА N!##:S)H&k:D{/VtU|;!hȆYju2]ZHtnZ wMhx2qqtq 3D'`4bh?7gýhc9ŰQy7L9ۜl= N@fOL"ܪgW4a8n0! H+V$.p\,DN1+{OZZ&8<֪1TJ!fr KEzcXF7dTQ0ҏ#V\% yno_w㸫D#6N蘡3 A"~C`&r¯G98UN4p+᱘)Vc S] Eكmd߸yٷoijek@R6H'KXS}eRO,rq`ꨉD =kq Jȏ 4^v Gx,䒆2epSt!ԗa;όL=wtmDcAQMx,qXJL=؎2,m%=AId"w!uqT>Q9?I%<.~=Kc}Y.ڡV4l&9.|!/H[|W-y+D#}̔bxbBQ8N@-t%,,Ä RPe't@GI^_WsӀf/l;·cZ~~v + .9v&Zio jK{S P@vcӁ[9H݀ަtd"8_ƚ7D6 eԙSlq+RS1iVްB} 0Q>blHj!494߅w]i\ _`|ѵZ ,M *z,a[//'N7:Ęd%rE8EUqz M0j3Iq4|a$w?|S2EUo+=_e0I3fnsR2>9?~zwcҰӣoNg< Ym/ M<\q:D2E"H1!X9G5 <;sRq"eSЇkֹj/KſTP|>N8g )Ctћ %K`feZ]+s*ݽI4F1dzA=[m:|2q~ukW@cid\Z-{ 1u8=K&i[ZYKd|7ΐ'6ʔRܕ6{F2;$^VA;إDcx{[~;vewa vW1tM'HZ hy1yټ"OK4@Q֬V UEB |U6  SY/A5R-X=_pHY:Lȋ >ֆHHJk.qHS}:D󇼘Xgf)"[2ղQQ% '#z' jrf.ۧT 4ta=WFϧI@(!Sb[Gp;Ǣ,תkaC *% REJޞO}M(r:p}b58T//ÀwUY:H=6 cz͵5 9lIjx2 xwd5' qQ C{> t@G| +zwYǩc,aK y$U0nSy;2*/3l̗6I®b9 7Vz͑$\uQ~<җ *xdy_ʷb)|Y+BEķ<;ѯ]"`DVAO0:aiQkt ٶ>KjE[7HU]=Ў%R[kWm] 1okT`q{ 2ƸԭM$\)CX 0cbkΎ1a bT.J ]Qa)O3Gf~.렄oeĥƋAZ;nOݱf+Vϴz/A!(؛v0 T o=|q4\k_Zthd8  !HEG$Y/+ Ր73vu+pP ȮB|=^ 36ZҠ@RbEez(gg7F$F;K~yr!Ha]֟MNjKS7iӴE=fe^: nrELxK(+nG ]#`3X=nAIR꽲&.d* OX*_Χ2Uő[M2'::c SMAI,@. _uyT`._lfOO)ֹg8uXѿ BHŸ33~Z]Yd;\juCl.|gl&XXp/y6N4ݤ~{Fp>)z?K4#Ʌ^P>|m]S`0KѹGƝ~w¿ G k?O#tZ^'2~]Q6T2K&eýD}jŸ̲28TM;@g5KނE< Dkym}Q^f](IuWg6[ r!Q[G{T-z}l=Ї5F܂S9#:vjbu]# OE(s 0"TG@ں!!Jﶌ@\T*gu1-'nEݏ^w:hdI> I[t t0k>߰N >Y|y\Y@mw%%fDu'*Z\t`AތHeRT:% :ˀqW1G!F3-8<E#نn篞oXɏAq:.uRI8Q3lzB/ЍF֭cq3{ڋC[Ӷp'<1R6V蠥9_%AEPD9>nleX ,lU'h@b_f_ԑ&P!#LdN*cXPrWd hU;Sxxne AxZ,FDŽ%}d\Vw 1NJ|-d_U:OΟmvmr@[^?yEYRB0 +%%PkT@;='((|2Q,)M-jh:rtR鱁@8W{@6fc΄w1Oo'݁6Ŗ[9P__'T Bu4够/?z Mo N2sPA6VnT2kK{ݨw!gN|d~Oq9[|Gώ5_t IIbc'g 1Vo8I1*kfϽ8i)<`7rꧺ8fO3Ͽ7TyCёs( ;z7pvXQVɷM)8r*G!([3PՐZx|?d'[:O~fD[3DO5|[Bpa6Q[w--+lfAEA=W8sV+ B z<ﰻد;3A"' ߢ |Z^k笌 {e&RdC6{1_gy~'PmÇșeq{e^t⫚Κ),μλ_>cEYVVؘ 2kd*uߐ~K N,5Cj|Bl%}a .Ec$nӎ)' ? e_p/!zM(j[F I;#YbBaakbE#G2y['KknPGZxNȆYW$)NI~Y<5f(EtZ]U+7 7O dlܾ)?AnvL "BHhus [7#Z {+ w+Y | q¤A}R@ Z'YGHN$UA,CXsf Xg]YzC?]>7 Ϻ'Ԝ5Zx}/Eʞ)U:|O0c7,,"K=vޓDp;.S _54D-j-F QLZ[J2rv?YJ7Ƹ 8Jv_kRFY"eunkrsaK. ,\/;t"4QL ]%״'wu 8)N;ww@Uwh>7!w0$r&B620NHyѦ/ =LB|$u!#zDZ^YgTCHg«4zĒ?3~al|.ַo =`.W @Dxb ËpX6ŷC^W^Et짡 ăxD"B@%JuR0 7CD$8]8,kk+LX7u| խ}>Ӡbm2gg ]vjn}~ "y%A ~mV yh%ڜ}+n !r$ySn0xeblNĘX6GHd"DGD  Sӈ[*^tU! %%p6%8\Qy7µ *.5'PJp  XIJq쯼VlH4lKj3|:aqt/:l]q脳yo^XPiHf}㣿4{/v!@>C4cJ7٪2xx"d~/2,C(ݾ\5%YjS# ztݾ! *Zك1)شń\懥))w[$ ݡdaYk{* Z Vx%44ɳ}@ѭ@"B/(#]|Ծ$1 toT` xXBq᝼ӟ_6=?&cq{^^H$nFs|c+r)ff33ls3JB33۹ܴXW?ԧb__qhs5嫆6L`53]?cҝ$?ʓX /4(g˨v#)#f]@&y8d d$$Չ6TT4<''myH~7Q4Mȥd$ 2lv`J .1Q:֑- 4NGK*NGe)nTDJ[l.ۗ}2C,Zo^2\DwQHd!@rwi!/(>& w׏R!s s5e~K^w$,[[\v;5u0.6CxÂBCYDhf$1>"aTBGZH% R[ t(Ia_x/扊A6Ƿ6Sql%;W4Ųs W$3TUبGO:y|Q :lYy* l\b4x~ߕiZjEBӤL 2fM[A Xu2_e`:e;ͥu:c&j@IU,'@e)^K4<!2*6Fh\㢈O@~s1+P{;K2%`֥GhpsB L+pI)"K.kyF'[ ^`t#= ڦ]@óoZ ]' I e,RXE˂lP.E¶.U**Y Ƴ'_p r3:̶| ]X4JnZrOjGBh=x2?j}ZJ?yAJ$u! Vi95{zL)uv-Duoh5O b+O&]R61 JLQג]1KB=fPf^b&!1Ob&uxGiXj@ kΦ 8"+9JX'ac`Y h~ o8ljuf/WTUb<{QW׀Qa!*Rn{axm0t-0l:#[ЅWUD㾺o1 j=O+v'Vb;l*p vuΟtDX-+ڌж!;ߌ1~0jFaMD2soK-mأZ1JƣtljΚu]Ȉ:S *ى*hQ鰎)oEmΈv4=[ %J]Eٹf3v"I dC z@1z7&ryC"a @ojV >d?%Ñi}XߤSHU ]Oif~ToM`j_޵mcW~~ۋi-˹Lk^i&i˛TIʉk뿿!vsӧ1E\;ܔLNs-_l &Qx4OyqZTWtqjnSfkJ[;֌HuSq*×^@Whi,'dF;L&KAhGu1Y ګu:"x$$]:ʶ3K$Lon6x0uԁH 9J6% P07UpmQ_W9كQKhL V [ ]iWک*NhL2-{V k\Y%=ݖM"]7pfDBM][[,ue0-#*5"qd iԹHKܠҊDxyWmw" #ZIS,M@yƨc.2T05KF\ߴuAU`ڜZ*],[Cr(߼ :VrB7[})Ԛ8չI>y89UHǀEt$̔lc=ֻp˲P^.˷+=z7Ac 0W iA; aw񷏤uݸ#GPX耑"ZV$Vyh!QB2pGZC(A uRs6#= ,Ax073J"lN~σeˀa_<>. ܜuP94g#FL5(}d||45>W>,hQnB#-9Ho&v04G.E0ip *i\`a%B_ŢD[  2w9Eɡ I=s 39/YsmPPbrŒ(a_`k3Gd=cQSj>\ܸ}r=Py}$R瘩29MIdž{\Շ#!/+i>|g|:چheQm<&+ *=(c1S!Wߐ(cyB?f%ˋdUl$Ic%c{VxOјk0cPz I&SLT곍QI,m2{'y%/W팋 #p|]23_$Ӌ.[GijqmllGXIOUQF?ޗȎF~4]>3 MY{VuJik+ :3>zp%@Yf]n\iz]H֫K0 >n7U{jk0֊nH9†n'N;6s&sp;R{ݝ"ڬrz1H)

u\=Ȧ>F0 8Pf]L,3|o+*:E \{ zV&&  d6)<+K˄1Wt9. b@f B 9Tږƶ-<tT4CGLX+㶷S[HנD+*`]1VG `0Pl93%M]hg1Ǎ1`-.)hcteq] ߰=Kfd<̲e[^@vlլLE-M N_HJ }M-y]W|#=*Fz$Xcl:G})cW L 94ҡF-]jmGSD^86ȒlɅ&Sy݈"֣q'& juEkSJ 9j IC"p`$_foi)K`1kHrNA` hE}"ˏV<ٵ5r[nՂ>ָ-V{rpkK6F;\{=, e I[u0+Z\ޥ흓PwP_@64MVdg@z(gPC#Jeq*,r55pU)?}-[Grˉg+Di<ȏ9tZGk2_JI]뎨B|m+ M[VrA?YnWXwutX_sM>Jh#h+7}X37Zq5}=aN,HwY}\}Ƶ{; wyK+'͋՚)[ޭnEE3FutS2Fq~q>K|UCtD0t'#` JW]4 rs]RY^H;ޭE?Ɓ7EStVQT0zt7) Qq38-HTa\XGٱUVa:=njhvrmTrO7o}!u^ZF4#{y~Cf x8w1=7ڀϕb;|Kq(.R?&37dN97wF O/S?syju::#3Wᖅ96H5g"k-/|`vF0awԙ\2=$3\c*j>vm&sV91OYP[ 2$MNmg@J9x5>夭FeK>gh3d|ME=L֕4{\0u78wSDWS^UƢJRUhbX貭v:Ma/,WAұԦT6FpZAGf*k :MhhوЩӷ]{̦Acb_ЦG`BљO]$[)ES!qL_d1d|pr K("azt=ӌ&o>w;wv;7OwGo^x /F?ܨ;"dť]ȺͳuP!^uLrBI\t1e_%J@V }1n6(f" *D0pV CaXm~hvҦ1fȊ$5W(])˝uTMKo iߗOsQ[Yw29:``.EkUf+A/%+jڏ1jr0W]G e[3MmEógm uH [{KDA PTE|}8"QT3Nم`q͓VGO֒6V܈lo`|KEӳ`VRrN 0 wr57 YK wN-M٤8|٤ͺc9oR^j .u4dP\?\smm4}DF$T>FU;3ЮSPk|r8mVu{pt͔˺Mh{v|5Z^ZZ&~Թ1@t 1F{l|-,au#٨ w'h7{H靪Hr}ZSk8>'Y'E!oz\{Isw-Zds[gf"G2L.Z6Ls~C*2t>L{2)0p&ᐏw-*N>AE94:ub:e`(cЪxCMA=9\\`&*GM,@vYCo44"(em0@RB:૞:ud*XU?G<;{n}別QR|'cbb:M#U؄FaAIN9+V5ztĆ5 Me1a~<͵% :3%k=oݛbIhHo8!Hsj]*Yfap@1OD#8r%Y2PS`Rր=mU@*]S01+"tU.MEyV"Nw/KF/zO̱@+{֥3FETw(ҁ]bܚ}l4 \ ƞj\>})+4!iA[/Z7k> Mn nnt!se$AE:''Yrc7pڊ'C=|)3ʊ^ #By+rsh,wP)10&ԘO| ~CADw2p=w +y}gPdI/7*Gm`%8DyU7Q>KFiuGW+Bgf7Ґ;w&x,ЁMmڷ# L^+uUإcjWQڍ~W7Nɭ}ڬz!)ufa}NpG#':z_DԻùȭ`rfﶯ'DׅP׏!=՚'y62I/|,"mEхU?G(r#cIٟ' &!G+'/2xX0ưk&+f,_btDHv(:Y*T3FV[+(ρBGCz5R='Ov~ 8(r;3,89 :(,cc\J&@ːX2M`]ΐEx{[%Ld1ːt1d`cG_=f4O1FQLڃyɅh&/9}52W&*+*r"*#\zg bf .^'Y].(ϥRHZ.Z6e_bBx*\6,H+s4򤥖.A8Wd\tדuRa0iE_?$A3F rDm˖ʲv(P47DK%^zq!)]cVC% Hr&8#튉Ev^4׍#scd̋;x5Ǯ+!K:(&%ڐ Cr#gaP)ôlJtz@̏W/J@׈Ut)9 ="nyOq$Uǧqj2QT?Qt)N1" g.N]&y| ǎgʵuְ:I߾aP|ZHR{ZErIlQ5NW t9W ;]lsHOrZA=C "e+q_j+$ 7+{ύ 'c![{ҒJj K_YZ;Bס,\hssSHDuZ% CjaikulY1!LdV"e n>uy.kH1ڃ.+\:##U.]l T,9U~"i)enLұ(j<_vA#aZlX>DANKYOrC::{G#F\٤Ks^fϫ ÷;+6+ȿy,MS5F̬;J^Wѱv["5o[C< jǪz8a9Y(hFO {&k\J`Rϴ^tb1NA&]uk ᒅ|`nX(_t|wwI1eVXe4Mu2ic箄YnDބ˶NO+5 SCɓuMgVB7l.5컆⡵CiUxpߙj^UQq3 i #xvAcQ,zmssIDsQw$~JgI|ُwoՍ~$æ8X[[-c{i3t @ Fp.dؗ {ݑ(ϵqj0}M1LR-*{/J4&1ھT<;x D%і}F~{0pGt/O4?s|?ǟuNo7ʣ.$eH(Yx=E hNuB-^gLk;oy:瘏,1JŧhW&>f팣*M ~֗Dc)2SC82?A:bD \Aj :P{G҂5uWH!殽WD]IR4 Zq`%p^J;;%dzU:2ɋGn8By89,NP1hJ6Xcz8p3YTW6QN˚ /@p.WOiNƶǮ hxkZP%?e^bh{;gAÝ_$Q>3{G_O)s+lZ>=M'R%FuGFQMbWdMk I._LmG GWz=q|0!I$\$1KS[*XI26n1؈b%WiqsY2hFH:m͈6&J,ѹei5Sm,ߧ30m~8fݫ~Y!>c0]E3hKwȘ@&ݙ@K;# ,4ޙbNfgw'PPQMDd FPKܒy_3'{;H=ϻn9MGs血}O*ֺcL dqu(1X(H~վoK -MNXǚ^ tI 'Afm.ifUy#,*6tc/fek=qqʐ ddÿ5tYB#b%j`4\^6tS߮A48g2S8K 1IϦ+4g Qa4e0'5|یѩǏ"M?\ cC*"Xӯr9gL^1`PbC&buٔ TG [f URlaF P5s7^Ó8^Ԇ; N񂨽RDxmՇfg1~$rJA^4țm8Z&dVS/KtH=[P Yӝph64(իSG/Sߖne3͢%6O -hQ` 8TfR+m^{Wt 1&#rsS ($b{)yM?LXK ҭԕK)@^7*ϒY^X;, -u3g8@=\ie sV_2}&w>SkhK@e?Q/x) m;Ն DH ʚ{_z&$Cv)H>#Fq*FuIQjt@X})dt'If[aXf?6-8܅Ѵc^Kn (ci0A?:yׂ)SGFλ\@eܮQ"ùKR7f"J]Ok9>YLB gB$E02֖mlsXհF87b1_{/esh@31e-$0B*"zt諆fۃ:>ďxֳ)|hndžC6V OERrhs S{u3%uc$pʧ긺:8NDŽ]7i\:6w v݈i#XRAN׫I惰Xۮةܶ?1R+At8uʙh/Y:?( Ͼb=<ﻬWbI,AjMc|x;DN)(v/ڠ)wս[f&99Z^n,(PUܤj_pB8^J+IW]zEt@+*DgN: iB_8@HKع B"G3y>{32t0A|^$ dߡ@XY]ԠdnupotY=*`|c E.V,Yp]*@Lf-ZCmsA=Ѱ6\YWp4c 8ldoon:C=ixL 4?4czw#r+ߙ6}51Jm} ;ԑXM[hc11.ӱiJ[(gPFEнDmݤ=/iP1a!%dH2z~R߹.$@I")K!2Kdpe4" *D$G+B(> Vq Ԋu\ B"b ǔ 8fqUPHK9biPoclA,D,M G@RᲶ?)~ĿgFca8p_*-UDvonͷA[mnܴ軧څS?EnC5NdC]=ijB >z,TE^gmlC6yqWuk+MC3{Fx.?/ 9MI? XSZM6pmxWrwNޘ@6"] Z+`p\ToG̀6*wAo4>qqL/-NEYr<}[1br8DiWbC?y÷Oxw?䑟G:#?)Or.9 WIتRL m&O0$SxydtSO;BKTG\]43:rI,`+2ͮˊ!"_ړbZx-uL"$uuJ+o[@~9ʻ=_|Rx|جn;ռStH]#ݱNڪKʜ~y?ۑ򰢯4JBk*ҳR_OcJseÚa*8) Z}cd52 -kwhXz=-1ayv*/勁$˺SI_݉ u8[1%׳KSCDeqo6!4բ7feu%&t4i܋Ap:|0qR%pH?ot`2Q^PD A :VR1Oqp4ĸTzŐ^+֨~5Y붱wVf3mtHerSyߍ\zTkQu87c'9my|W3&kΩ954tυtʠi2XW:`=D"kVvKe=8 ռ%r%tVE-aa [6U|&4o#HA&ׅ$/Wxs=҆ D 265D|u*MX&/<,o0քy8TD#_c*9dER4<\J,I7%Mi 85ǐzv{S 'PH5mEiR1,ؠ5!Vc-Fj}IerAD{zSL\U3mtN:Q:^=@޷+z_Ž"Δoy?8à-tw'!w+MFZEl}ŗfWՐ_s+>V&i{U}=I2/h#A[bl(݆w5IeFPzVR ^9ɏ+WF5vahC_ܡ{mλ@Y OA"V%&٠xm5wcˑU]wP,QMjգ(0f\ȾH<%UUsʿIԅݦҝɁhQ1 <\;lPMŰw l{%vP>"WË9 Ivn_pZ\:*Ty~Dc "j2; 9<+ M.>:Z[[,)rtE>JcVb)1qJgN6i[u%GӖM >'8eͮqX{߹Btwwt{;̎:JofQ|f(>qI:JW@tF.MԖLnQ y+(m]aݽwf= !_&/".)w8mg=^TlX\Ia[tkڏw 1nqCM^ȩ|{ ;$aѯ`nlAv`'ȏ񰍾BV؟vI1Dv%=|x0&,45aqti*%OND-5]hF놁M"]e|6`r-0.џW <~=T5{+VfgcIJD{+^cYmVݳ"xUŕ|ǵ%uڦ[7Mm4^v*JʖeKT_,C1-p ~ԚFjQ4Z|c@TOhjZM:e#c k*eS9uΚw9 Z߃cnxR~Y UTףooP7FF0ҢUl⣏"N*JA!Kv`{Ą:"ekwlF - i0{FrTp]lS!*ufY8hsKq>cnpӣbs A)yEPlX S160[;9!`xW~^1V85b8 m 9ōaEcG< Zn6-a*=Xv:uA9vV]GVkaZϷ07q B'1||࠰A3~5k%JFIa,; 'f-;O}U= 떣Y#vjvdZ)j~.f g.A+ֆSy! pLrTүGx1K72qkzАűjBX\B=֯AT %m{!CtP^ȖkRY_Yxq(QΧ Ugq5 u=;\M nV.7E%]/?a#x/"s]BL"st2v%Fc}s%-JN4CcBU}.sI'&S:|b'4Wa;WZN+g,Nn&xIYFn^mvf73p0;7oao"y2#,Paѽ0"kw5.q$iqz;p?@I3)&LQ9 ?ӊ7wv͝޽yS̓Tҷ.쮦‡-:n:=t.b.b $: (JY0xEXYofhs.< R%m4DnnQ{JoF^Q&oC}[Fjh[qϰ b܊,$qF)ΏYVJv \N Q`Y+9Mo*wWnPRv0*T!JM8b7O 5ִJ](g%WN)8.Gzx'rǘ#<ۇrG89TĦKu[P 7XVcqf鸼M76ޖ. =a ~\«$F/,3rn8ߏ{r(g0x`X Jq$Ho>`p`Apv5HMC)`a,sD*wZ{Vvȷ{N+Xi3={ΎVq[P-|wSdX.M!lVŹx"lk+j\u6R [vdB|մ²GbtdՌ/p();6~O%q!5:.~C"b kX &enCPyVI2XԈ#7mW)Qgh8J % ^i<Qx] E  37RB9\|xCNX@_'{`/=5R0IFI0yAJNW؉+Rܽӻ7EU|{ܽ` (e^^ ݿ{wjmcCFows},R ZpVEs-n>ȜFI55lXf@ѐ)ү$Ef#*NN^QB*g.cFC#B~djveD͕R$@`$܌A]yrHY`#m[S!]ipK1T?+/b4<׭r9oPo'lęm'}B ;h*ϡR-~>:6z' b[(K8ۧO|w LfSi^w^2ٙjk+;)!"ȌHzpmszF>$R6OIMP'Ym9M?IpGՁx w(e)HSL=B2- $Q)1nX1暿p%Vv-;@XbzcT]A)PʁT2,_$U鑉d%tg"o(VĴ Ab,'x biMnr3 :0'ߵĪ}ӢrЖm@/خ'_ҖA\CGeӏR-Ek 8E Y\IDD؀-uE"-': Td%LG<'I}Lz`fHblڊ[9 6MT0:Xńed""npɿ5S3>,K\6 4ǽ(No_g=ؓ5ep5&g 4tNe*4,*sD%:`}0\i (-v!rr:hZ"O /ղ 2;nP e_٭bYlTQ;Xm&n)~{5.h(psTĥ i̞zI!}jm@r8(0E]3H>ϛrg${e=ʎ n&0m#iWS7"_񡩛cW̉KJwQcW!]˴BXW~F(Gq5Эdx[\iVM%se12y\: p1o*عlWn5DY:mfscxȹ6-cJUR+^cNHR5&UbAuxeZ!h|-ߦ6KauOw?1 i|Hp^џح:뫭Ml!Z8L4McQRPda~ K>,LW"bnK0|Z BF!7){RȈPMZ?d,ǟ>֡"+3ݬVThc-hޢybkM˶sCw~Kg֥֜p*)(5~Q[oö쪳7j%+eqy,n0וlsr+O"p "O|S7 L]0Z?- G_{2{V4EJX߀p¾~ 'IbʆOfUaO",4TxG^a2þ cf2/VMѝ㨀B wS?',uRH-͏1F@Avb"Ï05`@]C/V37鮝(`$v;^1l64 OXka<᩠,Z5bY]:P)Ș:3&:ųa9F.C݉ 둓 ;U\eyu&( ѓ ~EBmC˰ҒP.oQK‹Q$J_tZh ;Q^ðΒ CQ6FCpCG?D7l*d!vcC+bb(W!7|%{PϊJ쾛 +agu{0[D^{"_8& Aeİׯz=\)I?^ Z;БEl hyȏqV's UzVdN lBϢEkoP6+ :'pc;i@l>`*7D ]&`ϸs!w8 {*m#mW!g)(x?g?ȔJFbaIMVzh3PB?̂gUu]DK"K+fur|PȘ$B'lQ鍂&չ-BEt3>^H oj+"NNH^Ltu wltTcKm{(cE!#Cb+>'Pp#Y `*8Qѯ"~$}+W;\B.wCKKkLz /;:!Pqн_ _t)a-o>,2?0˲:HbWg1 q~,WflGY \ae",fٸ^]rkkZC  f-YY݀` ذ=&g=c_vf,3*\JOAI jp^\!IܙQ!%Zt8J/FP EM00N=/Մ" ovf{ LcTmB6?hN`昻%;w=}{SW{7hnӻݽ߰w;=|;޿`nJ7ݏvomD~ٻ>/HAj+owݻw}svPW>8eR-)Fh@Rx塎OR;Gdฤ_2p$\871Q uߊ*;IwG/{NN4i|oOȏg/zEOhZij0StU9{PP/T{[Eݥ8mm^oC>U?' ޼-luPP=,]_m|O_{s?>,(ĵy1j 7dv-x[Gp,^!g28^cj-D*fhsuZws XFKĖm<2KGԜ^GMꁽU-V >G\}d?bGia`;^o^Ku#p>D<5ԯcZ$/Q\PD}Oӟ:`rB ~>l4s&!Ѳ9`R<J]efeȅ8` '(0IqJ%6?21 AftiQC9~XTʯt-J-,*y9P,#DlbD#?_M¯_3_6 Pku0P |*ܛ?z[`08dP$D&bT3مBB4Rr3 #5IN6(_G5R@86yoGZi-k;*n@{1#ꓣ--(ǂfvo}jW׋N7wշR ?&did1|Dַxur,B OlMG?޽{M #fUR %jV,IvYR7DT qǵ(JJs,d&ԣͫoyiC Z:n` n0azo9]> nR<Wx}x}>TeWѕొSձ Kd))ʝCd@n֚$A9ۏ͎Qލ G^sPnoY{}ETj5Wݦx/6F/[ >:Wl y2,P00Sh:L aC*N~ ?L\nCFt'qfQy BByaflOS@O֙`eDDߟXRͯrcl={pze ۉ; ,NX&g[[ф1'1|EdH{_ru'~D :I[[]&Q՞ %p'U!|U{~ %$2^SũI[u^aҟ1/a90; Yu GqRz7я0*AATLkat2oQrG0F5-s ,[)ZWr—;X0cPaD@ A9`YHcAi%EL@1VfLyYA# '&`xr4 )f0!yRHh{VG6dC/Mq$De4,ʘUprn8SUz):]zt8O'7I4?Cw(:gxzaտT]?cj*_5l"Ky uC?~|M8́gl:cӈ65rR^%IF[[;;' nQ `W Oִ5INO_J4_;rHM#ƄQX:Exb!Fk'yVJ*rƯfFf]=9j Nh̍P|!gw6(r$>n A2L5L_eQ\~2)Ks$0UDny+˥pS~"CӑaTל@$Emric*evp5Xj}Vu"*zF沖C , OFh6Z>u)jfzTSYK(sdy;,|˶M?<}Ȁ!F ğDrgU̞2q'Gލ^߽=_o;|EZVetM&nbs]YŮȮ1u2,OX-6;VwiW'd~Nzg|=U4+ELAo6l9荝42IջPʉ[jz_י |&XUhЋ2ÿ3 ,ښUFz+m82ig/SU5֒I3ANs:QCc.N3f@M8u %HqP(w~6H0a@rIN1ۉ]R-)I fm0SƎum*`s/`JŁ+||sC[o t9In-d\2OCL.KYvE阉|Xθscd&UVaj)LAe LEV#v^U8)bW!%m U2( >'JdhZ'ok덜 Pkzu{Iy-ݡΊG7m;)8fnl}0vٍܯJC|P4PYer檽u݃r4_(0ɕ(\4 R-(Z5nwTUu^%É#Aʹ}0>ct7% (Xp\'%[66 E APn(lgj N_{G XDN#aZ|lex4eΘ +u\tJI^yegOκԥR>eN-l &eoX{[LIj ߸S˥m_VYH"zFvX Iog_` s:|:r­7BU N-{KCB;<[r=9 i6F 5{G^e>C"k}}x%0< -Xڛ L\V .^zEW22wCJ1'ƴ_]&2o` ~W )bCؐ`Q fQ\mt]mW=k*'f- s)S-TĪuX}X>/j-,%P.'-q:GG!6yu;^CfSϊ{V3I}֢I}FjE#|q5Ϙѣ:_ DS ~>k>[}֪}T[/_XSQ@A[NJde@.!bCT Nd)GL01)D8yx9:r J¢X, %׎PGz !pmc(|נޖ )]>|V ZwY_&qEƺb5lmʘ ݗ1"JtGzra) `rh8")rG0N0ecZkb3c.~03ќ,-]VNwLmvBG7iĬ7'=}үg ?H/b>Aa D,[ŲeY˖eX6lg3$**6OmsƼuZ^=jU5k00m%eӞ:cXmwخƿ&:%T"^tP?x:Ձ[Y[,c2iW j<: im{<: É{j}"HX9WeL*"׶Xu54U2+rKU~rvBhxo`Q*:[J~fc˱dkfC>}uL\E嘧p9R1 H#ȅCg4 [N9jvO4Fd|V/5 &3p[q"1؍ۋ{-{Ś˼b,i9.qm86T Dgz̖*sa}M u1xs9i==a B )ì r@GiL()sKY9]!'e)SEwB@ϋ|>kC'I;$mMzAVQJuyF46yXqy>0My,t --:?&VXEVYI.RﺙJF<rba'E1",FaRLKUjĩ[U"ɼQ2I+ ΪٙnvF~N*(V@i7 +}!jNn 8M]2Vɴ̀-n'ԃ>>niJxisBr.]mvn%0\Kx4NK.Ƣ:^?M4zꐤwyV2%1?<:42W!h^_"Q(^fMeUp˨@dwN>Lc:4ʧbkK=t?Aw3)a Ldc1+.CAb>w=@wڍOrNZlyY!pN)&gs@GJ o)% BT4(䯀ym r{lf_d_8^]vRd*5MAbY`t 'Pzh@Q2;$WsFzmڑYN8H2 iU'Vh% BSڄ:=חlmUVy"+Qr5qQp׌9xt5d uYt@fy`5ιbjLErlTr 1ҡwJ6"vU 0i z|m,k#=bĆȱBipϥáG-jM=D5)zOG]*=,HkeYѮ˥l>CMk=~JLG>z7BoDըVTzYVf}_ETU jvA*f!"v!Z d]M dg2i^ww8s)h~z4tVpgw6Z߿3ͱa4]RF0:/wCIS"IuQ6y0O]IuY]$.*uV˵J[ԩϲǒP@Q_n~ZRWgs95i16P`jgx8<.7Q" +woFEw+#ͳ6%b+*IQYIPӴgZ$ ` fF1hp›{5d R$AìfDf_qjm dt&D9M?N9U\?seUϰo` }f".&Qͷc) eYxtTM<+#~Uu_ o%:FTYd֞0f QO=Kv!/4u EV2aXbhr'\y5eV o9Wu'/a'ۇP>'G3iʹ0rs,)2b=D.fo* \T aww !sIM@ M7+AI4 IfrY 0ȏf y8w1Y]gM|pT̶)fͩ z`s8w>nS神I7y6q hj<='fsr l+UOI`P]/\K1T)"j~4:FaFw*e Aw!)w=Dŕ3fBО3hD|%av" ,X[&Z֌r (|e&NgIc<|k .f^Kw`8}m@qGy> HÔ&ތ-@$&6 ko>o$y{(L4yr)ʌk+i<" j)*qBxF *13u$^`%6U~" mpj%k~NC>Bu9)'|}j婀`d~ڦV"^\Z#a +PYRrQ!pPGx~:.I]km?WW#'9>U4N]_eyFXɚ&;IQ!\6:ɵT6K!\l Vpl9aΧ‹Ҷx?WُJZݗ,<:&P_%E/  Hojx4X֥yL2O'YM6H_EP*O"zk Xuu<,͊<jzqiAMnCFzq!T M Wmf6޷f%p'$7V" D(Fs(Qel*Sc72c$N~[C`٢Dw]Tdc՞1!9;?99E+`~vz,3o"dq{sߦE7RaWr\d"x,Ht\H̲5x'$lw7N:C鍉,qǷ?ȕMM]=VfJ9S*oDG)>-<ގzu[kmch!*XHrS`K\1\S EϵUVz5T) N24}՜YFlH`eKL=.ЌdP,|fmj? ^q'v/w|ãŭ|1*@~Jq)Ő @k2CdN"+ `sWQ\Ys\=?f7I* +`ʍBm5V ~G A.۔í?ql%-]ʋMe]yk^7՞DIB byMKo;YxȠY5ӡQ'Y:1̼GqP)a#6cw\=䬇v?9?)3/BeTKT]BWWQ?!6!0-CAO]xO)=SLO{4}xx3x2VrjfXј?b3KOleF. ?]{uK3|~Ɵ|;. =wbx]F ^ Rx޸*l7űmy"Tg8Y-]9kFq Ao+n W9p X7 igA y; ;޴5 5f1M5coa})6Eʿ-Q%߉q;؅=د1o {\'ζm_^m_^osmH[Hx 8C¯>r=+{xmx2nׂ̘\I.noV7&'l7&:Tnx]@iXH<Hy9jjc~a. C52J0@Q  )⾝Fpx C1E4 EHKAg~yq9~*r4,>9(hSֽ9geJ^w Ƶ}j~o:2tF2:#osל6[|sAس&Jkp-to%rtĢW }BN̠y>LGFmbg2.JAE%P؂E6]_# }>&ET?Ƭ+|z_ /'^Dh7Y$aRhԎ<(poE4+D<".u)N!. "w顁Gu꺥~=[IF=|0Lphb]{JChd T[{o:[լ\g5kqg5g5z|: B2k(mmr銳<<:[wɹrUnțfiZTt3G❫=V{1;$jiRZ -ȕk;w_fa9sW\b<UX~:T@Z-.`܋8e?+0xE٥4rdn_07WAP8W\m}ǥck m |T+2p+-\xC\k|1*e߀9WJ:haP];Xpkڻ;3h ; >؍>eFAda]Hǀe4:U<أq(/qvs/$ljRکVtn;iA! Rd']ݴiqیPK<`S?<ձ,ii`aw(RP܎X8أc`n C-|AS5rаI7ǿ905I L*z=2MϠȿA4=n i@_b6Nj(rfצnWO] j#k}12;% |_y݌1gM"f./<;C RL&oLz}6ƴ!d"FE8T u2Hŷ W{,I  I_p>8`y~&)uFE7w;,/7'Y]'LGWN&WB-r "4qUAY? g2!@~8"{x6b.{"? NUQ_햽s4x)NS(ӿZIWtTtnb:Ԙژޚ~]W5  9nI??;8c;)QS?$@aPz*qvY:/xE*3sk:->J1Ib t>3+ݴܘf:UaìW7Ƭ.c %s@)h~i)߮i;FɓMFg*[a:^Kn8nFhMcY5Uuſ6EO_ k4xtYړ?fCYšާmS]惥fu#Ih?_+1C1Ͼ4K`wI+$oA D!%ʉ$%ŴLVy>3<2=g2U{8eaRƯ'L>‹V⥆) <=gxT84QέGrT;g 9`5@5PgLaYE φ.p MLۭ=&)03=u=ƭ^ PF LᐢʿAG\}L0G D:q2وKUF+2 SϬb(R`7%sU Xv dkyO@!/>Eh~ONMm"Gw1w:f;榖:Kmj UtkkwbՊk?zk&Q?6'32~ie4Ok 4w ).0_Gxm ]dw-t0Y۵fʎ.|3Rj"O>*;cǂTyEL)}H&J&&oS%2]V]rHUawϦƧmr8b8Lx_Uł^QNJVLL6bTEJgz|(_XS*[. i"N"z*iMĚjD|$r6"Qg1v\|C{/ WL!MqgC[* 8ٵ e-= 04hPDG" $N't_`?y{{]ߛ0$Gv>^G?!I)S*<34/47t kfY~n 9[V[~5]]KK\a7/;G~NRvpPI_vkYtx$O7[m=»[%ORF!9c-:bBf\h4m"9J(K- 3+|`̈lOH6o *?0дФ._xc) 'NȝKr- *2+2r +;(QEr\kbcTr^b?xov= .^kzR_ 틟E4ȅG *ua߾oN_]ݛ~sN>~ûOxr;>T4K5h]1y NiZKpfvVD~="MDSx *dmゔ H8삻Y@RjX|5Χs:ԭ]'-Q``+Eh©[iWB`a^R`֩ ~ * 'T\0[Jjԧp6UAlʜURJz#x%VB%?MT:|= aZ, j kBvh|gxŋXȏHxBe_[* Pxpn A<_Hb)J@+H,YR6fs6aC6c삝$a#GyU]dlJrx[U>Rg _9:\Grs™W,uPW.W)lMYl'g=E?o|Yv{4meG||5I!݃^m{ik>pf0˸5[3]k7 l .ܟuܔ4߭"\_5 JY:3$*[+|>eJ`(p #j^]b[Y~Y[%x+䤡x1xcXJBYUX2+WcUcvUΏ _Etmi2xٹ*_ U̕K?p̬[@)BgXU T( ^W)*jyKK_z?cB:zZ=< <אˤ5xrȺ¬#TBSh9Umh.\>pRȝp&tf{|+6 e~UnYQ9,KВ>8W8h@j]k$\ǁQ86=bdΧR*"\J7W?j51ⳉQ ߆K{[d$c>d,fVqSz@sb+18yh}pj ppj<5wƅ]mY 5.AE4C$0 Ah-WQr*XxO[Pwc;}dQ.&TY(%YՋ޾;zP[m:ͦ1 \'?X$ͦdGgz|cb?PicKҺS9D^GY</<a@yp+"^hCJmUvgf @E;1chĭb[n,JQm[ -ͥ6]<]Jv] ,ۦ``N5z~}k;4\ A@vγ^<;=+9oG} Cx=%ԋ`oG]_U6gV4 e",G/P]i]vi(MݫB4Eh]__GwA!z/0'Y Yh jQlYq?VbԏЬUV (#{23&$,YbNZ`dQc]ZF{"׆iQ:!; f FHDȺv wk;|e> (%T_ ]QDl} ^";΢(VC• vA=x-/*Ҙ#vIw2hy',: # 4Ơ? V ݁IcS+h^1[rϏubG=>㣱ш1z?ꅷ\AC #K 4.yC Z{Zou'47иY34$ s{4 ?+L37ϣ[%Sӣ,(V]AODyKo8& ycnЋp!SJx (87 91VFƚM*w,=0VǮL7/+R= ޣVGPz.Jh>' 8];"IT 6p˒8SBO GɈFvƁ/u tx!wk o ];3Mg#TOF(DW71!t|b1*N#}`;p?MQ8cIJ9L6J/zH4Kr0fg9h"֫*21o%2X7A!o 4FJCA "]]ZǨaER5l'̀1 86t5]VBi|R-\׋.,()x`k }f|g9gnE, F=?(".EMgp3ŞdƄ7.80/%Ck(OCPCtUW}&Lj/SЇu'wAcfs']]CKPcc 35ds,nђ0yq/YhЦSrtrbiFe@(o $h S^4I!(3o J2(DJ&k >5'%IzYZ?1Dz7sT.711ȐҼ#(౰Y,C{M`5?9iƆi/;_kI 'D^AB31bMW[!ob8~Z$D-Gc^o$dG!̌%Hv.alV#~e>ART0ة ]$/պvjdΡV ~G!Q$AAІDuYdqeUR_rӬ/)V71L)Uo.~^u{{ҁ)|8t^#x{vQ~peo$X+} 9)'Q/NO}kXŧUAQNUjX+mO5ɄU@I^8.C'\m0Tp-Y΀w"*wը31Q{)yd~&;C_G z+ rg"9Ei1WvXJZ֊VKwhЬ)R4\rAYYwWR`m{)Q\k֖FX6Y8)L 3v&̐N',ƄG[_NQ4/omULDՐaWXkHY0)gA= Fj'MdE `a:_\M>XikS/ԟͅ E.wrZHr!D'+xZY0&v[A{XuP{׿jœMf2O _&^mČ ݬXH Vz9Ӕ:gy][Y{|iՌG$3ͫO_;A>^]"b^di~%|OD0u:Y:]ףگZHUdwCt2mPsv4_ʑ 4|Սx_ y36&>"U:رm wa-JrB^yGeK;)}aHpۆ|gj_%?xi%`!} mֺG;)MwVl(Zu(=alnsw/&Z<ݔyg9@)c3^:=T q¯SGI34Q~;~3tP|ŶUy<5:fd, d[dl\^d1MTdGW#W)zh袼z|3o[~l/[1ȯl[5I(Y.A&2?pqkWI{naJO"FRi[[HWo(mkPB1ˋ>Ѫ̞cT !3'ݒǩa lf*Y-SG)0"~Qq%0v*I@Xq[j 5!<Qgֹ9+]#]{|$n/VjfnZ j5 c#,i7DM8G_<(EYȩxq+(\h`V E-Lp42ērm!BkNERyaj(;[hfZ t̛+?v`ד2[Ϋ@u]U{Y2Nkfyձ늫6KkajY\L^d_#Y(VTHR߇ |UsJJﲣ?wlkIgp-죫عI3qduYlj å?{ZC;n䅨ԟ~.Vq.fF+:*] Xssk!_c#ݱSQǎUkƕ%1e~bkHY "$NGo|>t8mqbrTOp{%懭|MP#i=1i;i9)S`Zd e}hƾy.3sETjhH?Z&NmBVgeuTš_ z */YP0-hG nz{OG;1֓H=fzN74F‰7ΫWzk,H_[[3r+(ь aAqeLT_[)|}>f>[T h!̿1h VʸƟO&Tmd՝`^*ݳH6ΚÀtnCḯ唩]()ZYǁ'u0Y|:VT {fy2HEF^m ?FdwA!vXYvC!/qU$nk_ oDÆ|z”Gz\;'cB'8ku "7aWE`e>C?,.E__}w̮ǬZ..89KdZ9Doa}"0< rFP>sy\R)b7P|ᲐXwgtRt\cƃlМj1:;7 L_t'g2vTe 1^C--q?pcp~2Mt4G+a,Sop$ExKWDtfN0%W*#tE4Ձe`!Eo?g}Lw=GM>|X,mvQ_\p&uġ[0oMYE ؋%tү!:BBWbZo^85tƜqW`pRWWDQ}Kvr«uB=\S0\TF9)GwQ@aL6ss>;PU]`}'#,ƚuJ׭͢kfCK`4_ozf Hя3 g.nE+HqT)~q8^#~3 [>7Af"Z7rK[ݿ:H,nI,#u*c,n 3 $21)hXIp{g7kUU63䒥8yaTǠoH*d7Vl4 K  ŗ4ʓ.΋?ަxC5L|6*_e!ְJ$Pm]}k*6gl8y^C$G5FGV(V:ڠ=9S%./䙏U~C٣Ixoń#ۧ<&@&)>/,[ڃ0k*}B,%AO~}"ZflA$J Vp_ACyyxS9kUswa-9+Ÿ7lHԁKC[iR2PH,]FTB]&AF[~= FYIU{>Nca!8~_2&+ v!F'9 S~j. _t#`q&%[*1N@hgWRrCށe<@R['SLJ{ϨAޓ6_:>y|6RCSYq9/hG2-M2l'zH$  S2`e0XBЕF<9EDPTgO?zP2QA10 v5Sb)MaCH\؄y-Q~\0pK^F<|-#¿Rs*e) 4yPWsT*lPnqlsJfbѯ"d65JQSʙr*|ic:A%W w. Jy;2` T B%ZB=dr/` p'' ುMCt@4ЛZmoS歡ߺA h]q:k|G%csƻ|kK{5!y.A"QzwLmqPs.AD@@2mfocykdNE +:hN! T'2+?rZ=l5yd^-Y^}S_M,0-LGo#֟p֧#]Yt<xj ( 8y ƫD9Xj[9&(-5(āweQ*12m1} bTGqs[,AAQ^`H !7t~5eRʳ)9^2x͍+c r(,47-I|e¸do*ήeBdMA.>GIwtűrymSK/q*t/?16E9U.i>{0aq~Glrژ%imm9R@#[2=ʽzǣ{L7Wn[)iYsc:r $=q yv5~' |n""W#Iډθj{31'yTpmeRcT`)۲%+MnwOfHM{Ҧ`^@QSAAϬNM Bv:jmgh chz͗bk"ǐ)r&STzvx|[2njE3m*jAC#"<i b|ֺ*2ޛLkH779KQnl((d6/x81C!QUѦhTDW(PZ=Vցk(ؐXn4P#]kS8+kQ\T꽦*n\A7q^V"K/6PW@ueD 좄i&8'ZVdAS>hFCwD937".+e/OFI2Qˈ'#et>)b|~AIPR4y|qvxqx@e>W?8h na8S>skwžR>gV1oխŲKΝ} p}5ޣ2!Zr+Rp8[}>&,uN2)qb R ?!KTnɑ[^A=3Wphi#fBoi鉶9; "yx=jR>w'=AIbzv1#}RFh'"*,b !xlolyr8Qe$ըU9pJ BXB$r%/PC1_7V3.sY"l.s*-̛ 7kKL~Z$#o(JcO!Z$__Yv];óՄx@$rR2ZG1A/sJZHVufE )kF~ta%`t2*hc 6 =Gfe^:D=pn唷$:{n*X{&ZixKPFXE* n;5_YoJ?||rD͔ɌڤC7 ^+cJWi(LD ӸUEJ/M%_+jT?^a͜Gm1=T:Mq [mPbgydY<* L nDR>/"7Yމ,ZYpLyJ Ց$oo[ in`dlzv|pã/ΏA%N"KxtI$Q%vCWא{tko $_,=n<ґ޿膰nL9|~~sXWcCp1 |VOs#"Ox."kcZx0λ, E;~lrQ\0CbjF4Py{DZm}&0:h9 XB\˄ϗ@'Ae5Xz-4Ԗ泈/!. ΁L\^/xT,}{gb=FGioaP舠DO0kgDW& K?cLߧiyRiyni`J43elrsmՓ9c%cN!^DJ& KRWJ@+!eGaGGŋ NihL8_N'7I^${fLo!l{NB61̉S^œ̮/C޳N簃璇|h݃g|OC@}8C߇jMRQ*鼘͋O{pIg/Is#%!7'%gsH.`L}[:1^E %w*x FZ"gBi}b_ܠB7I蓄Z5Ad] t+cm c4fx5  [D/8#ʇg $o e#Uv [p&ϒ#!-h17 'f3hf<%;*TJX+'1.)`Ķ GVdYzxTzx@z¥tv~'W|:rH!X?٩>ͅ2}qSc`nmUyU(i]&ɔ]f.U ]ǻ#=c1HqD.Q~NϚ(L8cS].rM.w]W0E2 AUOաB K}fb FRS I]S,>?- >'9%%s4xzyy R:ۍ҆w1uӱ}wm/=sZ62a{{h]0 ԏɚTQe]d;JUS-py=񢝹>Q+EE:J< 8F&Ec݈];:țF$+m兢9q4[Z_*w~2@݆= h䅣 2 Ck]F"5/YFQaA*0* 1JAQk^|G:eH0j<%m]p~W5rp_فwG9Y\u5_k?kl8 -+`-e7WTX #k%ZR6x^v#x}9?2_]t*Yٍ4 sV;Ƈ ˏ#$99 +ZlÊыZ]6frǜ8,G}>|ֳA{oG},cZֿ{ %\m<MaWm"J3s nW5͍dˏ! N QI^h?do«2Os%C-5d sKhguݻۙ'afϰZM=Lwx|e;k.OB] RS9 ')SQ WiR4ػ\;Ka(~\-o$s9j>~dTc˅O<<,KNN?U6t tn=\D;Xt;>ve}݃cZ$ Y +;8@*T1@^mmg F[`g'{^_V} ؇-˘>s$7G7lDqlKJ'^d/O$6xEJuEVMJ/\d'Q氛}pyc_@# X:J`Q"h$sUv@ܪ8$O>Kݍ-dWNl'kG.]-Fy9󚂽OD'l}XJwp$j!:Z=v1qj!0WǷ#zY߱qcsylY@Xwϗ\z(K%kՍc7 4QBqqqDGU5I' ?._G^FF(hAaNIS`cto2#$3#{^$ū_-77y3p&Cx%ଙC5sdcX| atлBeѰ4bt8eB4 @wX\a6B$:G|*iOvKU&$pyݜ! 71a>a8z&0̐QQsMwQ8ZF0Vݼ.w(@vCs%f3HCJg&(eh(dN1N"S]D{BgeMsT)ʮwD_R\S6aXE>7 W@ }C;ǫoP'*$=>=L%d)_i"CnqيҲ]2znkvM"'i\TCSCv)s|'' elF""gp"STJ*H7lK\ 'V2?ة([<90pt9;o0/7mxOK?&:>\B~$U\䌘8 SP* &Oknf|Rwq6)DfA~st6^ѷxN8~UخUx m_)8<hN-鐔/ EBP y;E+nJj|p/(#5fA8E_W q|䡴}nB[+ԓTtj|MF9% y 8_+5ݤ/M˜nx܏ڊ)<[ P8?Ɠɴ 5+pa˜RҸto8+x]!$QFpp9ɢ8\DTF 딼wlEĴGsgO׋˃@AՒmYm-+O9S$Kkg.՞8aȝeREҴ:w!J{T)5KJ!%Sݼ3*UzՊa(zO.ȭ-U`>]Ꞣ{(hs)SJ \F,HyC(uI])r)0pӍ:S' _AoRIR҇썞gNT@ZNTJcd.a4G|ˁLqjiwCJ~ h[KFf#͕O&{N'4 0kIt}wh;¸yGKْlVl퐢\FeZI u24242 M7M^B<}e#qj=+zE̔-h.hyJ%I]2 R2H}iv]pqjYi"ʔLg4;qoHkSJ,-{,clB*>Z+]W5?A#W !eHv/yʒܒJ֧2%8LY@*`@kY-2xz+(!JۍM-#G_Lh̀X9:2͉lj,騐rR(޴JGv\f(Msx圈f垃l]W4< BtJg{ԇ-eg83OOY B͛(LP%F2'6dGdQ ғWɲZZY'4-Uzo/DÜ%rags0ѡPP騉s^S;A37t9Y4ȃݎq _+b鼇 a\Vb~! iQe6H! tڰ|O\8ډRɅ4,|E"=Ya&9$bap-@Lh܈:N# K #qaqaln%΋X[C[ yE_0?w sgwĕ㻇b{n)8m@ |5")G4F8Q7P;P[[Iڀk|xgTFؠh:Dz(߳h8S}ru"^w >>>c4~mh31FB@9 H]Z]O&-< H̒a",`TK%'S ˷B @Yʹ c"Ӿ gG5 m p~.j2U-)`o)pkJr#lDEhhRY-Iw!+kFK-q>(d;@a@tG_.xfZ3-{eiET6%$dR iG(HSPmQ~[6ҼOU%Ï.3C0y=JvDvdZ~vtMo+3cW0t0,lZ))n :3߷FΕfĢ4#ȡlC3nF~>ݺy 6nǷ3v2/YAV&[ixc@PuTj) M =5ǭ5ZR &N.sfL=c-tmx2Q,ZO#]c=<6RJd{kpeLF2&w)_c˘B$ 4O)9/QӖ7kjg9cX29s_YUG\IpΚ' @l h2!Eo9arCe|/F[ڊBD!󋽪s6 \؝ig).w0 `2 3zZၵ>S ,^Gfd#ds fjkĞe/oZDϴ]*JZ7b>W*zcvkqҖ8kLj <>6䄫*VGiV=>4Um{h"m7ѐ;E5YC-T"88l} f3 \)xG/ xܰz`U@V1wWpZll`Ap;nX糾nS44A j)Rhtq<[zqC߄i0Y hz]<3@.1{,+W˔s)4rt]Q+PUSWkVJIK47i[c83L--)v3 Pi|,%=- LMYLxS؎[ݭIj2sO鱦w(&zp$ͺ,I}N^y#5jOKI #RthǴLSa:'ݳc?Π{?_cw0|N:5gH(<@ԇ+ +%xpOX1. 2H;d2O3~5z@o5u{=k#4oc6Y_|CڴƋd8#an{T6*]IMb7>-F$o2%M!T -\FBN8B+RyrױI/oDx#f7,ȿhij:8J"4>_xtqX0SFL\qCjG<#f|2mH l Jh8A?bV]ӗkIo OkKIU7AIu(vyd^s7\L66ZX|].de?`#G,vbC6 .Yq2*+?\O4nyL@8g萕i1 9TqI5 Ux&%V\U5.:d(QZp+N8WO-CU~"GKFW=*^c^{}"VS!I] p0w;]̄g)|yϜw`Z-$nuαs[=wk;nsB3aUthN ʨxÍ}1'%Wp"/xi%~3| Ae!qfTufD:k(Y8*;.kF;hh0}1뵊ΤRP[|P:NVמfjag]=kP]| c/8U 쥒zY- 2u @)~TNu-wadgw0a~8Aw)<@摅 `ptx|uΓT5T9EC]*%-ˤȴ @($(HZjE|J%7;FMFU>f2UZ"YH( Pu:jP} l2,*gI]"V.^85%4v,<2s.!L 2(Mp@ e*v&WZΉek|'|T#߬$]FZ \[yq\GVWݒx ;'ayG+]^VeQT9^>{=3t_ 0!p}j 9 E]vB u?Z{g-;?P21MXk }327L #3oHcQYFxZ&;,C~Vt_/!107T@(7FXKL./[v\M5qi %;`:]Q%Oj?e9ïǯs\E:98j~9x`SE, O bnS ӖV- P-<9M[BfUcj%VMX s$$qFX4e>AeǍ,06Ȝ"aFSyLLgg RX/{V%Y|ȯ"0u2. /ZiNZ(}O(T~R @-<\y3%%Z:l\%sU3$eU/).OW$=WC9՜_!E[9ݺ]tP'uPr^xP7B?(No)N}g:lÕrp-wij[q4E$0. -j:S/P.m)I!8oHl(xXJj*{̐(r/n%̕꜎WeU79[(V#W,]$pDLj8d@ݪH]i2^r~<+u`b%]ۿNEc#֩ #%'>5Gu*s鳫%gI.#fyBS Y'QF׎ CQWK-TnBp6X>6Eq~lWBUBH,%0HH DggpTbbMx *ck0%n(UwV'*rAʭF,N.I6R=|x9遞:>)7oEiTiܳ{n+%@Nۛ:'mpNc=q땡"-@\~c_˅r0d> .sKȒkGsƽcK:acc fS%V}5# (6W)##+ˍ3.VIԉ`N+Liv;sG;a!f_(~a6zM4pV`0ENht,ЕmtƢ$cb )4J!\?QHJ^YV>E $_q|bBFJ᯲fW ;xQ*pɼ$gɏC@WJzP(vT1*k7:$.LvxMB  M 3gQU2*0ZfR_mZc$r_H BemOlx[w)ڲ J)}wj^~9{ Cc<*iPk8( A$h9v3{S]+Fxv'-el->Q3UIprm5U||؋g1ܮun^vE(%IqNOBC(H#@=\CU +wtz+( s$\e/ )z) :+r ^.-Ro/\ In侰^~  }S륳neB_[UP"рbLVeL~U[%Z>S %O=-/rFa:-ay!FWe(ZUxhE/!$$ψnj#C#p0}RQ ]%?+ָ* LD,D fj6y|&m|S9:r8!ORʸ $%(KGf5H1gP\ېLnN>p{|bůl E#gUP+4]O9Z|bXy-yzn-X@b"a2 '6h>9 *J;=讍ؐX4ـ¹^6z\FGA-fp 9wRB z=Rds@ ]ڌR `[]% y% jǖx y-#I]x0-s01,}$*Ыp}~0{ ⇳E`TTOxP\%֥[[L; 2u ^}F*w ׎(tAkh})f->z? }%mP?-0$͝-jx-O@pi&p QE\{^Rͼ/BƹpXm=R<ڰpxq8n=F3 ۱zs_ uVȱbt++ "gnZK41H8 % }F9~ R9:kmM}Ə^= k762m=[8Z+{BFq Gb-.,mECi&ci#e~c(吞܏=DP(i7C<Njض3;|ɔd"ۊ=nQ8 ĆU3ʆ0Hd4od_3۴u| w3sB/%IR6a $!\(4tq-%^Bjaul|qq%HdƸ'յ?laKH]12KJ&f'pHv[o;`  l$ot|e|/ R4PR6`wFagc'XF,Gt(a+1\ɄM${|׿4Qx4B8~Z8}.$:I!_ޝyeqEX*%"TZNnon%$@S9ة;~q30, mʾ"7S;7laD>$ >px}'d>Nj۹E7%A2I`% HSI i p~b $`6!+Cc4L.}QW1CCċpVN e$Vrd_@p /lGc+YZ[:](D"92.tZ J:˳"o$oγ{cy[=S`D)lF1 \2&  s/~O}cE s^1B{oGQ'Ӯ;)߽F盰ϰq$ٗyu0nWݓHb\Qԗ;PfֽKIRN?xR˩S(r.eߛ;FKR0sc﵀ pm54N-O[,'WLl;jӶHh*(p$݉Cqh4bO7ɩ<#'OrxK>xM sxM%›"8b,%~,6lQ-\\edO@1OgZj u~MZ=$bAM|/T*_ S j*u䖹HD AW 7 gȄr{JZF՚@lj^i\Fuzs[*nmM˦s{;Ms{Ϫc̈́_eN?#gO ٟ[fNoMJ@jP9tPa,;SːkqeJ߃Bӱƒͧ0Twi*zE6ߒLF pj"=*̀jL4+Z =3jt*ϗuIlxKd׾fjaYYUu RC%jgZto0M{+I|1m[F ] `cH lhec@!Xͩ01U1l#Uy̝Gw:ƵI݁l K+Bf\L/?geV0V i(]hEę!دrꂴx4{euǤ<Rrm_@{95_rw`9CB>\RJMD< ^PI_ujZ(E>QM t*+, |25.*eQ{etŔ*DereJ~~1W1^QPjay7h^w_V&HqBpDYP =[dٕ=t:|0X$^ m~5}V;v<@>fP 4qu W/͊L([Lލ룇hIomn1 :^x]G4Ra76v[y[wlHs>]2 mׯgn<z#rZ! Nrvd9/{z֩VD]k{_SKugBk/~fv~y W1@Jm,a-ٵ옺!ܚ+A4yL0DB 4B-#!$ٮ?\LdOk/9\Uf8ݠՌA2fxkM9 O@,"OR7;ź?\[D~r`4-1n׈ձmeiQ#O\+gz 5;EW&4yN{r̓`ㆅ"[W0͛"2[,MY+M._2p;",\b4i`$0=;v }4 P݇6-`vыG<}$Lzc8r& 0pR[?Exgѹ#E*6L AYpr0XR;o=^^6ؿ(Y4cf=_5 +a!*'8%TLkٶ0Hoǂ];^X_T4(OoX-]X0>_pu'b( 0^"&<-s +p~՝~EPd6ӵNV3.ItB6}Nf@"+'tf9Y]JPL+&(*s 0ܤ`?yH᳟bRKU|'5H ,Y@W!ߌMVw5.ףpeX?|UO}wZk[k2@勏3v ) ᄎVsa. P4y3*m!lj^@p ^@|EBpwYpd"ue}U<7X8r+bK6jZv&%fM;y,dou(rJ2l[56dM}ޟ]/08# UJ{x^'>ji8XRS;Xpĩ(yx;Qm,-?L$\ۙ$ ʓ|a4 _5J%TDLHc@T,E < 0`|eCJܐS1RH_yBfk*Mg>:L9ab0v}nf R΍U#[ ~eq BntSHgBh42FP?Y h~:'!ɨiŴB*C+[bߔe[sOf؆*y\1v#x\3X=M.njU2]XvuݸdMz3 w5?P:7#ôEr 1썴H0? ||֐1Z_Ĩ# WC+֑(@YJ+BfˇՒZx3b+dzc|PH{]tb.>irћG7p:{X; Ծs%x"|ggjYRV{*Gp%siV(]>IgLvc7 ytOH0:T?Y):Y3!gcUvk3U)"3$ѱc`᠍ҫ=R(e3 =8̂Rl'ͅ(M8n8EXW2f vMBd5ipw1,aaWy.ۯx'f>D1쵭BH%ߘ %i<GkpL:xɤk| J{p)*:l5I-9K**PUVrtctv'KޣXZsUs\댹4H,EN0hgT g(++HPIKfXisKKp& 'ɰC^kN;+=͹ѡґiPQ.ƠkXQݢR9j֊a&̨ Hqնn_>Wp9x繊\*4݆;*\&9~4MM%Jw)BY߆i$^٨VVl.Sq;-rkMyn#͂ͫe5X|udn,8?U,PV,qwsDX+PTB8YXCA_ɇV}ů[HPBέ*M22% Ȩr)'ÄnjaBq:NlxxѣX9gS=9w*'Ձ١Zu9 CGy$o"@{yoPH7o_ W{X"~y2(B!]ā3dބ֫uff+[:x-yt^40:nfEqM/kXP/L(3:b孿Y )3w+1 9=I:kzW? Sؙ m v:BA-n+x@L1t2WD~ MϟJM;"/FE(`\)? GL'NѺy /q~^&"QP؁ȯ˖r[Ȫ$/lkr j5 ,SV][V5 o7Wu) *=QY'S tu35U!|g9SH.RRkʹ?ooe"d8vU0E X'$)9C{B-Dٿ _VM=ҥcCp:{Ek#\\4 ev_kMg,%jsQ̺񆵑3u~ΦOii #I狈Y˓DX涃oۢWCXTuk*wnTڊ,`M;ʞc| sD;?>}h5v2Z}J~XWXN1?&q^?_ Z:^~6ePz~. b=)xH hF[Xے**>IX7Cf,z3,G]0 KT<`+Wj[\4&oHЖNPdQc#}賈0+@K@fQKhKHq=UeX<iJH8yp,W"!z]Yd(^NeEKHPY师Pb3'3^CgJT*) f*G ~CS8 X5qVvUJJXnz(zL4)\*m?k)6Im_Ȫ^`v mҎD2JdoTH~+i[Q=Cc'u1z"qҖN2@(3p6Cɣ3EN6 `iư*eo! [V20g}}G30#t(F"cJ[Xkma,Ffc=RE;I[[,R6hEkVѷPQf`pP $‘e+?H*k%䢞ҳ֜3h~eDiN0<0 V7 RB9OVtV\+B&Z O2(IGV峲j2"X2]<uF'Xy ;ie}URHɥƆ$kΕ1d-יI00ECebGX]'`ղEktzZ^I-0Ҭ\>J+2kVfp2=p\c Y/-͖%zE3esB< "JBL#w3PQr4,v(++fH SxVRz\ pU3QߠɃQScλn1Bn<ɶʋŘ䍯"!]ڊT.yhX_k/ (o3}ikpL^_G%@u+d)!nCu4*:m%p4?"ƯyEЊ𚻋EF"#R]._+'`y[2z3# LT x)X;N74XL!h r6̌ F-^3-(8"ӂ E˂{oH=U r#yNIdERfab'/bUlcGY}/DV"KaL7aITw'n,'1É*F G^֚-9@; E7PDmTK2r[_9sl@8Eg_ݓO,p3_X8?)goqb0΃^{tEqd =nÄ "mSCՍn.i=(tt$e&¶T,v ?)$Ϙ~ |8*EAR4cKƫ?o?U9 EVJC"%k1ISM,ТQ*D M^Lɝ+ Ɔw7~$W4(qB`qr fAenofSecy5,>^cȌm<^̂uI5B, 7L_^Z0D{4,.|L,OE=d_Ǝl9WV?>)xIﭯ ;G74?6aG;m}dWO=nn`gkݛxћ7h.NhˆD3!(Gg;E/I #-QujȬyi:-TD~Rͦ st?}Mu=L¼ OƎU&;oS֞P"GQ_@gGCK!NQ]WZZ[Mi,("0 ^.$q882^g!9 \Q-@yjP@db.n!et% D,H!X+Q4ųkEG޵ivW7 a%vh^^:q( ޔ"\w03y2TscŚ_ˁsYl.=Rpn-@ OE'a TGg:dE ciSV^Z -pW΢@)z|aMளϜy{uY(!lˆsl,Le1:'MWlx!(fR&%/p~vTvYBJy5VX _ B}:j#;*ph!߳Xacqo#t1',g6c"K_y`w܋<=͐ + 6!"Dt[1rr+-"(+::Zȹ5.0G0P]1a߃¾Uz3bt朾 #'"M#l$vKvAˡ;ד+j4EѦ(|rFy(5EƿѲ9/S]ETGU)9G aVYB@KkkhA"q}]'[%oot)6iwZl[yq_%M\՜zQ\MLLoj'I=hasd)R(2ڒbJ9iomW:>W'g4 '_ch~`Yޔl43<ƺ7VPT%zc=[jOv n="?.K; ü4L<[@cޥ-߼z5&Lt4Ml>CRua0/],ȴ-=Zm`#I(Q?QZI8$eNɔּJ%k3׳i$8|i!Y?V -hx*5W-F8ޛM0Tiڠ k-du&<1 O ZsV.tJU"8C0, W. d T@" )$jj#V.zeN9'o7ɥ蒄K` Iqx)z8~tḚֺ-ޑHEQ"ʄ N}WWڍБE}[,?X(vrCf汝+/7wB$ 5qǐNP a8,J5=)89(@sdk 7j_hrQ*&A)ʍfNM&yB4yNtט$/#"<-ӛXɉY+!XQH 75}{ L5)_.+3l~(1"0yL¯4g Yؽ?88 }Ѡ4p5R'纛U=ƽS1abMgzcP[6= ;vr>+ib2Z_[_HNuظ\Ϊ55{j-dK:;8ծoX$&c;StJdT N6LVr2Bx2baBY9+X9i8ɊX߸yomg" +5vklXxsN )W]ε@p{/Q{կ jr4?+ǏYE!s<!1KDOѣߢJ ·@$)-Hgi,4 e~$Z1=Psg+t3-m]]en*yw~+N#x# ,OT^2WMpj6Q>6luRL߃Nb/IPdXk)@ ?=HPZo۴=틁v\甚eG#ɸb|apDhz"# xtDHZ9nI0sMV˪SWKR+Z"O;ga ݟu>w$ENQZ+>/jΞ5!{n :?`zANGIxTsN]a%>{2u .bq8}MF>7YlIwpH-h}Zs׾{Q[ZrMf(ƍq{CgB{:{?{LKG&g{zch0$v' I,4'Do"\gF{`&xvgP 6"a`}8Hpy~윣~q#ȫbkqM$eBZl 3A9!u=@`vQb{k ]9@^/\W ub*gņ㯖˩`}Nm$ SeF^v8k~~<ݳnAV=]W 䊳w.]\[__6im2guFǔtHm0 nh<"$f?as5,(6<a?O/G3n 0<$fq Y4GrJ6} QS&7%R\%Jwk߭5~8'5nt 6/CR9;BZ5~$)P$L(Czrv޿l^3uU8Zd3j I,;Y"42h|!GXKX;rsm4 )GcdB-rNgؿv/G&ˋOc|EZq2vA#6Rjra;tV^z(.5\M=UF[&%=ӵQTg>*]$pTUɅ^|]!l KdD PQ`2-eSnF(A<5xёWCmϾ eT劚Lhj‰u87rF͉RuKUWe)[_/3طm੺}Vq| h}jSJéR_}s~aQ5o%1'lۯHX3ORIcf;m-a[DbA<|F3fH3EO : cuq|3 `)1B kv39e1˹ElmQ* m`)[t@!TOeB'^#=mv}Gd7rrr vC6;ݡc{([_ C1' ~IOT`xGͷ8n}GB TZQMS"munb%ݖ;f޾o:*ĺ#QcTQ] .DEU]_qrA!1ddoQg(kH~'M<)3qy7˒΁N9 `!=tO;l#J~{02dNŊ"l7a,:k)-{c )FѝIH(zDe4K!j{ɩ;,6 d=ڦd$2 -K;ezѭ 2\u8踦u$=QUq9,^,RYo7*(1[uazLblt~8 ͭ2%/T\uT}2+E=)nAbVzT~v<l&5 Gi/ '}.V)?(0wPM?( 5,Fλ- B9n [m{>}A9Wh_w:Tax[R`E1esy64qJ[ ct*!P\JF8}sdS|V΁sɍ+wT8O"':zލħjA^U10M ro{ؠ&ڌWCZ䇨d6PHбBxZ0B!nvJ'-HTj?мȐ۹{dNv뎳Mp p=z^ ̻a|+=, 8 >Cf}Nkv΁ /'cԴbI^ӓ~!Ӧ%kiӓI_OK:'m|*2[H"U2 #i"q2zljtz>_$zhQ4k c?hn J9Gq@Ԑy]bzqwLh ;D_`7بwЅan `LIyzyIc(3uܨ7ldJCG~|^kO@IYQJwkǛ#r˪@ TQQ}=Д/\DlȅLp:ժiUMB'ڧm_^JZlf߷3s}[܋ZIVSܻdWkʜW,$ >JSiT([*Njc\qՆmy[мcq}NKݹ2'CޠS3//uI*-Qes y,> kYb4%`ܦbgÙ2+[!x $!:d 䧱7b jHlSq-~r2$䧷,.PDɬv DJ11UÓ31*ka$plmԐAo7lj%H% 8uѱAPYbiz.tG[ 'Ó?gOlM3)C$Q"*eyoom[YTKZsV,{_՝`47G˻0V2t@ߐ<[,g)LEr׆* pTfJp *L0Ԟ v/X sQVao3<@4n0Z[ҁbVŏ@5$.1hsmٯ~ȅ$=j0 8umc;$ ̿q$(:9K tWux9ZLB7s-vnb k3-.mǚυ[FFJlڅ6wHUKe%6;0A>ksJG,Gve<пO-Z&؀`(1 3,1JqH'yi* dfuACYcֹqXO!6 ~P?p#f~}߰)FPvBbja%SY<|bK؊Эfj}|,CEpO(L?l0 ?:CE:کːf!iksa8=gC =6dknp9;Xy7ku "kе.N?5t8o$(X.%m'[O gF˂XK}`_DK6~6 oaG`rl{D}< q7!vBK>k<Et>fyϰ}l'#(u/f쮅N1<9 ǽ|`S/iU#¯Yw Be1yM{qh>;ss Cc 3KkO,(FL#=P2ȵ\Yr}yNbC)|Y N^|FiÛb( 5'#S&0b؈דU$:4)00?[ pFgͨ{ W6_pDp "(Mh ~X-D%CE N 42 Ppcԉ? nAin)>uO g)>)l7f1(c8&-hK*vv{qvhsI|vN?|_6/q.H;g[I%&O[Y'Pv8z4CpBx8,Ye Ɵ̟[Ʈ,Ath <k X`,$;۸Nc̑9)[b&8(,&X~)vԽ8vdpK}\X;.iqpp~q^ġsZN/eyCPJ8d۹½*?řHƾD2"’- ɉ(@ad0b9%z8u/}oN#bTPP2y}1#@Sk"A#s;~-i୅e8Jw>cDwP^M0n}|! NB &~)#=} xLbn쇘lOôR@|<>bw<<1<ԑ.<yw8Y(^+t7j'b0vdOL0# <"jx@BTNV=AD/5=Ά hC-ݤȀ!%삂1 mq 3{ >+BPG VOrx+tce᢭Yf/?&.XtshwAoa)'x9eQr5 Pܓq2uغFgk7u$~:&`,@υ/{ǣ𫩓 q MW"tķ_p[i&e 5n<wIe?D{KHB5q[;{A Qjh"؞ rR" B:b'ɀV,q;֗ZOH!DZ>6~Q> gba vrs6wvVvĊLeݓnŴM Xc֛:߆/TD!99: ooPi\U|}tTjy*jp!Šed t~ ҇yY}Qָ!j?f+h70gkodu'RvbCRxe6kTaA6Q~gF"M)=!賮2Yi$nDU57OFN SM{KՖT%+tJpGv40Ɯ{HKI}4@š'^ .` kx=8aЛG_F‘) s۽魔]ʐ8mnرJ?tΨ,| ueY\v Z[4- 8|jkW_Z[k|;u0a݁WYw!9ӜɹqH¸bȖ_I@ y?{&{4|@^}:d/D( )B8y\b=ݣ~{) 31KF@8g?{WgԈ?`< 6OgC-ӓ9:1ћ࠯%Ө%!5V%Uc7u = %d}TH|"'0J ۃ>;ila^}F%i{Q8<3jr(-㇒hۯkɝuDdS*fR]XӋ./}%u@:/L;CKQ(<ωB:y<0+Y3&ioo< LxOkeqO@eu͇x$kDhbePyt<̕fW4y~|;=X>D+%Z:[Vd$> G.~r($2\3 >cэW;[۰[OiqrCfX :Ɓt,r5ci+9Ot4"O~%|6\>%|\|Jdh|4KP>>p*鬔\qRr1|QGK^ !+e7>De ҡ5U*1||n0xrL/nTx94%,a&dҶwt4$ OZȳM=%g\-4vF3eXѱf  cj`>v;ra?7tHE Qٙ1}6)`ApªJ> #UrEwgJltŕ>h䂮iZhP"4@Ŷ C%])pPVB#;U;F9_D^,X²B K2hnB>?.i+''o %8*uD#ҫ$rh rk`w(o)x5rHrX5IōW껶dI} eI}&eIZ-uC%I([i XL$i6hiNt`Q\ۼ$xYPM:F%MTXnQ-I:ܢt#F?WGOrn)ǧPW4Lp>]CА&x])h=NK&qZ܄\?;d 0ì0M*Kli;0qqln.csŭ߷7O%:vH bb+䅦mdu ikyyCb?/Ю-#%ul q-G&09Kp}T%X8*m&FcrK0w: ggɌg;pd >{Tf"]{ɚ$mU^0Su}"qiA{z1X#cA-\n?|@/:X!k8n {Ǽcod&Yɴ9Gz<(fY\Uޘ}yw}v F}e|pt(KwҲ^mJzV膲q,THB?AjI6F[ENrv-*ѷKۺ}Cf/E 3nẂb}t,kyލu4\SL&b2lA[;׀;. L j t>RFcaЩl@uA/󽦰侘&oЫ2XT8:ȂnI~ U+QoẑK?7K˩ni ^=>N;=B,_iUGT'Z@͒R QBˊ-jRKTZИaGU M.-Ur],4]t( PH3޽HDH$)] - d?̜3/ 4׬dpLÛ(z(u|:B 8z7'FEg7c;zE,޸fu&lm8>5YpOO2re]y> |jx{G=\˪!nGmOM:n-U+LAtyOO0WeY (nÐڛMՁDh[ia9e dz j?sl\叏媢̋{-%5l6@TAc+P\K, &K-1\Uƪ07 8,"(pc Xx++ Ae,&m"xNV %i6zf5WGDKVKKlIV?yt)1ܕ5<9m]3+Omy:> ^@;d_:4W_'_{ Muc ^ڔ>4%̛*=r9ؕ;1` tGk(ccS>pϘFh2gx92 |5KjrLؕ$_M8ݵ+ )Q8^K<zutZI˒_M,4v.ҚYʌ&"Ab9אk HseSRZv2k@]7ſ|㸗])GJ9'n j)T:XEf@ [2HΡR$=):;aZZ!O1pڃpT sӲ"Of>ʲU纬kz'rqpr:j/ez-d>;1@PobVO+4 *21X+whHXtc4T+^!@\N`8N|zҵ܏wࡋ_hiq+WB7IL+|F}CF"b fK]j FEEŷ/C03TzHB-:Y$%tJ//Ub<y0^2 AyJ(rp ͣK)CI9_b)9mֳ)3gιZwupɼ'o/렁/5 %nȜNU;8&q}Oʧ~>PY!!cYYtvBEOuI5 Y䍸3AGb!yw/rPb~$ ]Qa+l(:lo%tM-LL Y4,j׼~z@FJ{0YQ/RؽP[{]8ѹX )=z- DJzWP*瞁&g{|-^ H7,d2P;;WFep8J`2 bETS,[̷ܣ=j"w輫{;:JU,+!l2Tַ\0Gg1+ajV(dEbV,3r0+2up(wEľ/)В:[/tܑ7-.p*7W 阵 gqlz~~GַR+_o8rw{> ǃw/YuF}N_ "u_,,HgAqㅄ%EC,}O2f6LZ\36vF#wGK*i%pKL%ա ) & 0?""  # 2D u-+L/YB`-4t|0o]1@5!{bW6  B6f|waLztx@-[3O!qe{/xPW#E7vZDnR&Zc LOM3{@^o8.zQ%5թ0qk$eY~]GAC PN=ǽhЀZ9cSSsงvMC-hK ~&²*iNh cǞL}RL虌8Mi@!Nsg9;,& 3LB |9 '|$M<ㅽdH)y "% 8IN_أ߄U`"І"S dgٻ@p}8XX)RZQ [w8O_!n$R;CzY!1\s6\˚ 05I[Y:#lxRGG@vP)&%Մ}*oJ\pR gB D 2 ;~vD}HiyLAo~id2A*0R>w._Bp\B[/&X_<,E>݄GUU  r_"~r15ŭ jpB`:XJpKXS |ҡVdW5,v M-Mf0Eyv,u^VKq!N35֪-Q>: ׿MK:;yb>Ыqs!j,^,0ymhhtR8ArZ%OjS+|W$0Ʋg ekKtc8^Dw59aSwcrOpy)`9w\74c3/eϴ>p2uG1 B7ZTI;4%@QT.ՖuuLN|3?J%A J/" DJ$`*Ki1͞G|g_MG{L_nMǬѿ$wPjw(6cX~ek_A$O\svuyX x>״ u:E0KJH ,q= P;~bGW7O\}xۏiGti[ryf?gLױ{%E?px)> SO6:v!+,sʮ5Fz=TW|0ML;L%iFi*n۽ˏ>Rÿ ՜)^ OǴ 'a4^a, :bŸ;~p9e#&/VsMIb$b ` [I"ppfRJ/mq gcߞPv!?E94]f$x&7)$/Na3yKp5ձIv8ǠjK4 >!P`IcT'{ ?= =(R?qA[ οRs! xt s:+}+OȚcIPhse\. 3jKt侴g[sO5ۑDyq`sFy/]x#Vko+o_]@lWxq8O08*@zp磀uFiDkh-/÷9ap)ь_LM 'Yo6¶1UZ^Ɉ"-; %Z3g*Z8SXJ;pztH^Ю[TĮn5FD[r+䅮XžAlsu7D9zwۤGxܒVIš?٦)|if2m;tλP( E _S`.K3`jxZX-A>0=W3$O)$j{Z;Lfv])էv76\0:N/]@:&:5zr<BN y'QqUu5Z E)p6Б,@cb9\^]9"'W.'f9te>qAg똱p=uYG|Ӊ c~ixG/Üsc &1ٓKhi)0~SB=c #`6yтUzIl]2؛+ XwR``LHY&IxOXM Ij7L.&F#Rƅa0UowwnY#P~7?9,>.Mn{ ?U OTʅ|vKp?I \Gڧ,E,akVv1,C|ڽh]ӝDAڨADX thM4%RAX=>0$>|<=Uޘ!#-أbG B g;# Z27bl0"Mc ^Jd7WtCӈ8O*";wn V FVdU7o/Z-N⟵HaB0l#>Ϋ^hmM $Ĝ@cb>s1PpOvH1(%MBg2)).OvyBse=^<w[lAFٕF~sk*03# u׿BcSA07/>G $i`$/"Ht;=ܥzgf>5- rÈ],E5Q:Bʒ#2Z-N/hBqT7kM1\ޯRHHFMh +|bŧ.$LQ=f)#Cr9q/kbrУ(yrj/ ՜L8Utn īDWY|);.C?f%~<,vBW䩳5(J Z9W[@sBR;D}v,Fҿ:LPWz#{fVe&;n * 'bn; 7IAg5LhuGLSG:a6tn1Xtd6pĊQ"!xjؠz&}l4Oxb1ޢgj:@6]q1INT^*^BB;1\3-+JELȖyk0oii 0۵Ց\& Z Xɵ;I;KF@^ox;XVu<ԉ3F b#b#M,u9) s"+`h)F@U:/t]klNv^l@e"Rr]i%*3 'A/\_f_#); JރzY◴"'$;%;fD,ӓGsL[u\[5L#E^׆p%HCb[]{ҵWpd90Z Z[Ra1TAu )մu2" `o##7EO̼}Z)948!L]/۲[69C>U5:jhS8lgM8kWA gSmיlߩ8-PmgPdlf+Π͟8Y8?Aq Nq\8kVYS,Y{SB 0s2CdD?wp/i;`ut!ٹʋ)>೿<܈3}=H,j˜TYyPFHOe(`1ʼnxP$}Sq椞&Q8 A 3=F `t[G/Dqe%I]%RXF 7# rLgPj{`Lp ֎HkF7b_WW5]/ȡ= ɭisjgk)%}e>rbk崦ʔ{ʐ\Ikz gM u*te6ZԨ0b=uC͸ss rF>йGG=_ Q : ˲Ft1|"wj"QɜUœ3s9< 7Q O szA?`YZV[UhjNpc0k7&:;rSd}yeq4?,4z橗.; 'z3 )ZY`$ߐ$O~t\=K 8S[%Z3et)>~/(l̓EoׂuzQh@*}q|c;iWT)Oh5姽]Rf2m_ս 3؀؎lT1Gw݃?̡ޜ\_Ε& =OS?P䲲%6SX:0/ |LlBh$UYlTXu =ݕ%m`|a\7v)d{TKk9ތ-*!PLLW}HyVaV oM@R_O+noQpзWϫ.uzBnK{'(z:# gynKW (9si`;"goww88{GE$OO95[#rLA!c]fqqh󎥫YJo]VWv䨽w%~駼y@,<%HeR<ya(`PW9ܾc3y1vY熌PR[[|KTWG]<sʡ0I7V92|[ΰ!0o^1@,kpe&c?#sHu _E]v-h_,8KCdC&fbWL[r:S-Ac|yJw>Tvϟߝ];n4GRȾ/z)|wsGc=+?iYAyu?3{;z=i=GWw' Uk56&&XSVދvG ؎RnL*>gzQJ2m;HRjiC84ŝںL#?My=:5Cxt=KS6Şň SD+-C51-(✏eK}xM wՈJ;*4qzR3aW~dD240BTpށsL2 M!&YnrUn6bV5~NBr_A>Q`Od^ 8B.?Q9I}N1]9Z1}c1a"ϚYOwEFw.H:ӪJj\XW@}Myy<_s`<yxX&67Aw%Ms6̐έ<쎃ώ^\qY+BGJ9w޾sr.!,xpb‘? Ŷr8 #er"4 >)ιӣaVEFDlO H =\<-ҵIQI8p 3:6#0q"t Ⱛhkj- x~} mgDRM2mg~H9 8@d頫98U ::ۀvd1 RAUyog_R` 1@~8=AR[w`x{Dr-)lY豕ig9~/!C* (98=iE 2,*Z`nTcVO L 8cxw.nʅ}N?WO;i\5gǺ\meLy ,m< =AtU{G0z bC1Zz>\׵u[ N#?cT[C6ԸKB:52}֩AxƲKYcg :5>kl;Z5Ι |%1D7XsԪ_`^@mqXc,Y YS/5_x k9*; ߝ){NS~CKchY(;6 ) eí8W7qi8>*ׯކHhӉ`٭te== /Wgs~Gxe9H$ 7Y85$b^*1- pu){\_'75nRŴF9/ð8߼8;CЧ+mÙBg^;=);aw9{}}Oޝ.?sC:\Zj/hC|418Qjwa'juEхp^4%}Zv.y,]G ⧉ Oei1=4_U{52d:Ѳ{I'.T b(q9m3_]u˹h~\Qf 1s.p;yp"hė+NyeFt{]^o=F]A'(NF}cs5etDw#"*\J$<4Ô9][ [;sj⧗4)KD" #ۡR{hj)oF4T7&_-ɢbh~}6<* l&3<59߱ ^T'a`h-x w=/_h/-egbc$#,̂k/Z&jy"+񦢭3v!h"TŇZ/FqZyMCJ{ @yZŅ!t'[Pm:Ӓ;/IН`,D'1؛gm$c6Y/O|lQi4$HdSm}p*({vwtr15`.=|#

DgIV~x,JW5Hjf yC:O/h7~vdvc}Hx7t@~ξqAZ/+*Cɀw%^σɔww׌F[Hd;Z99j t^b&Ll+D@z 'ek?fMp˶>˂dKXM'uBG/x'z=\w10=eTVNFe9/fa^+KN%JN%c7X?W=%ex/s eJzsJKCp>%Ww9RgQ"ׅZ U/-U*'(#&('b:f|kgiߨDI(wfy#v{ب]|9%I\G_6iZFD^ *+P Pm]7Ye%B"Fp*ȥe9d' B'\)_r)F~༷iFý#}SnOrEtPQSQK"Gd\y&TV$K DžNǰS QEtnW5RY咰Y$Q/{}wq4вUb^7>%H.M[Ɣ`/S!/)֮dG^]kkvz;4Yηe%gB\Ϲ.xV+,Y!Ҩ%A2meWM:xmOpd ̽ 1>Xhrmu,z7pO0PYhtбN5*}͹oӓ&{N)&)=İxtyφ4Bv`ZG@d'~~ $a)2*vB&;pz(̀fIy<2XZb|(x||kz%5 y.`>xnZ'ݹT-:eq"%6DRJPw;_j:/+g*Zx8φ%Cj۷hvqޓV虓!D"2h#zҒ#.n`Ye3WONҼ'c-wf|ɂ٘ 7ha3*!Vcw*pVeW& cX;>N1o%@@sJD􍄆%>0MxPF&ٴzln!'|<`GuTeu/++Py=}]eiÇ% o4_0 +L?>t.,bbfNn,W*jxX(FVeqi<Ϟj}RޮZzub;5v, ;mm_XV{DCR <Ͱ{v\V+BWZO\oB5ElTQ߯Zl*|5wDo+k7=>^暿Er_6B ;@xL+ћkϔvfIb>Y[a<քK~?;,O%Z0W;&aGU`7 aj_Y9Mxrޥu=ꢕӧN>:XHNh qLǠ[P#Fzڨ&QNwH<:Uq=䈍kR8.P b,Ќ{da]y-Qz5%D=krv[k:ۺP`Dgsz5N;ZN:gK(4qG!p&?~ݛovzy#WQ\i1LkTαpGVrD&u^_~;NUgt2XROϧvBo h@{Iʕ?wLY6w|r3l~ҦJJ{冸$u_{mm]eeb^߶[-` 2ْvRy5W+rpcP\C8抚3_Ãn;xzzCC{/3 ޥq_;$6s)L]V3לG NS[ؠw=dBbkr'w(RDo6&VQ 91yk4Z֦(S@{BT໐oyR9_ildbGKp 9't'd-0LC{qӋh"7NRP}mFZ}b '7K˷d `RܕN*o:jAcŹ~]:^ ԿIo4/49+#]OZt:pLeNPZa=V 9T7xӃz\W.#:M~$q7hO3X%ܸ\A3N›0LAk,L0}O$aV:Ws.=K›H?ÀNF+W.0Ӝ)^ewQk=VUb.8LuQ8] ۬xPD$ !zپrg>$%g'KH0 #E3 @Dc[V0=M,iC,ޘ/rNKM eKj؃/{Ib .3DH@5:Ym CJD&%nj !5`Y/t܌lAōC9Yr!Yj4ñ}"v~?p^SJ`x8MgrN+%8N:}ӜeSCd]Cd7'?|Б':;sOD3ExpW_J7~Yv |TTg0K~֖FC]4KJ9ylCDg5 öN- Q{z ^׌q.1]s7vM&d-{G<>PYGG!@މ|f* gA}8rYggV1?w̪ԘYgV1?ThCl5?3c.QtZ>O9@5trpjiԘ<9q9P&rsD:=Z6ɏ8Z4LI-DL!RcPr՛ђ䍔WzK]4ŎHNlǠ6r}kQ'S}ZkD]>!^tMvRfz͛7fFq)j{"4`۠HVW1r1Hf WYpL@7ajWCwm7~6|_w8^=aB[ߩ;ojp%.o|VA$S{ʦzFTжͩJGqzWjpkYT-9Ev&i8, 43iI4SP1qnGROή}z\=l=9/Ƃ'вژU cStI4JWKY+R6 )הp6 ^0vSօ*gYpq6gB'DS1%~K udVzI,EZNNj몇"Hk0 )BɺRA2+*"$\)TTvKA'O)/|`D6똮t_-bШL54rzJ0 zYkH*-i86 ӝiXC,K(/ h-$ [#o9$nJTL,*BjKQs!krJ0VHV 4sf)4-C^X ʀ={aB8"azmk<a P%!Gfއ_}%Yxؼx)Je峴|ɈDYPhaR`/dԃŞ I7lRbf]u &oFbyuǀNj7 W(4`I%絭v;],p0(+̟d ű#XY2g%bO;#k~뉧֡i)`=v7ӼBhA 4r\5S)fBegX{ #&/ g3ֱsa̝6E$ͣC\Wa ؒ0}UAl\sO5MB=^}(-NtA%Hz,T}[@&,gNoiYv§Pw"{ 0x5M\vФ=[bҞHR`X%u5/ӆ4ag$dO2-dnLZi4HMŮQ}q:E*j)3,@x ovұ&4 <<FX;4.:q`=iwLO==/BR>Q S|!%[|ϑ s>{Yɷ vBԾ/,"X;1`|ƿJwԑWsI|5PK2-_ҐՏgJU,OX or'd,¼RȞ?s& YZa?$eɽvkVs箲S?f〨`-Z2LYKdOToƨ2IHt0Xtt>mHڛNWIаr:խŘ{╖h{$e ua4d݅n^bY瘎>r,MaƝ;LG[.Q6LRY|@/`gV#{1跳 `Л]2 L;t^G~hW#vce6ODAv$V3Dǃu$b &` \nSetc%dDgޥ~# ÎK uw. vLKa.@ Fj) n(Zgî C2ͻ%Hd΃Y [ۺx}2(nZ+eQk>PbFcܗ3^W-Co,{mrɝ:*e|@o\’.{0-W\B9$=fV YcqYI(@5 ?{EE0vX"s/e i'jeh p 6/_TM hjnY y/U[Sȝys/ QOacm7A=1ʭ^};m+vMo4n<{Ex`첳n:k>?$냐% yǢݜ&x8U2n!3ONEi6ftȝ/)(wf[ G]linq Ѹ̫ ̜'@c,aClWdu0{ Sw%T.I K1 ?dS;vAᷛypS)0߫:G>X/Gi8KҐiwNh ڊCr\*ady;FP/BG֮|>O}<2oL!NEoN`ܒgwբN[>"-i;W+㵗rɛ)县9;:YTT ' c N ߝ'@yu\d޽Fch?j&`g-clM4C`^CYcz?z:d|ECUO\= O4̌W.pn/Q!rvh B#wa,īecJ`rF/ύ^7ߟ}@6^e19u1pC6svGagSo*I+CH1QXjd})JXA"oMɡvuY|LO] Mqq~Qkqp{Ó!{2𴃱p=~xq( 235AO"j ؑI3vZ{ҏ-~lf?ַyV h qkOĐ2`(ӎ '%F#|fK*X\tt᷽1m S'G 1&iFbf|e< ;4 0t+VU{_zf# |*NN`y#E1H `fN K_.^w C|kȞng*7dTjk;TSvyv7-5XH c}vH$sSƀx4^&1Ӷt_/D8HڃwT%@8sARk׮tV5}eO@Y^Km)fsbYj6=LDJ bf$ϮBW@v- A(_u!7sߞπ{Z9zmw+nIi ?w\OCAC;aO]al˫?yx0e#.-2hMuCZt>q#<CPtEB#yU0Is>cQlK)W #*s׹RA-?h}@dxhoz.+YMSn0{9ۜvQ/w9LlS6(V2;~'M^a4r<wݵ]k՜EkLJl73sV8I.V(2G}\RKݜb>g)R./BXF]+a(_ECKIR[2ծKڨR&߹;4wv_K(~y>Í 87 hGrCLe(d\W;ZrU"%>b$a,QZ Y1Q 2R `4s\J3ˉWdZgj39xfӂ[fj3C.ozEb:hbwSpIMS讎h..uِ앍(F> y 0a굽J۞R1^jR[{ %0[=\^{eTw^{i: 2WB{Zg Lzպl7K筫 a܅6;qo0ؓI-%2m:b4Ӽ(U2 Mϡ 8& V晊`x.d%MV~`h֨@p(tWCr@`fA,F!5\h6zs4@o6zY/!ȱ[y"`h0~5.㡿Fg_oqä3WrCzV6˵-#*Y+njG[27J',á4')ƹQ(mUh~Ď.͐haIųzO^@-~\>`2x{J[KNGgaH+V}6dV?b gp(fr 7T w|T67OWIkFz.iȁ:weVM37e 194[_45U^YcbEk 2sG!qՃaQj('+P!P\t*R<#ZC[ C1q;ꕫX61 Gg#1SSA3Jp6䀴R94?p7Hڥ@x4LBN*]>Q2c ^脘i:&< OqZN,1&ꀥm(h:'.rM.eltwttZff0KR1Gwˋ# 9eZ?XSI]DU1+}&ĵ&JdVVuSyt3M)D(f6A۳J9 :Uf&dҜ H`7KB!'aC x%} :. Őh3Uyi{zЖb$6ޗ_,ߍgOYV#’M~jK…+vz֜4KwJ$ 3,}ħlēh}6cOl7Jd:OdG+:,g򶷡6=y_%xW6o߇!Vd =R'/T mpފ% {G0ǽPva+] 4jyr! _u)jߗ0zڀr9XdmGכ"Ļ"#͙ah\u#?'>RO[,1CD 1>8 ֜ S=; 9 x9"0ǥ3\> pkYaI0'Ta%DNĶJb4Q.Sg* -M|-5c*wعZ Yg,R( Oc߃{n)uT:#N=xp8p&*#.{zE _F8V%"")nR `ad)BT ^^0 #]tl.J{6PÈƌCQ hU씟uqhB@ 9~k<7-U1. ,WEt1+vNkxK)3j#rçho(}S=G{N\h%(JՒ(sda]TV/m׿\)MTmОDꤩ*(3ڞL:BpőnsIkWq~c8ER>H T BDXrD9Z;%В֠G5[N>kֈYSHӔؐ~9wj؁J9϶?%*yu7 w굺 =:B0лpKNw4'%ϝD BwA7:*H9ux6C$"f@%9/ Q`#@?ΦMw&g8)0`DeٸL }FΘnݭS\G5A V' *eGQP{C@,Glds= # K(ʣ^e'-KCU(дjxkSGγeX !Pɖ"KgO~v&\S2aaɒ:8 ?~Nm8^h! slKhOAV~Xf5(|M-\ևjPܰ;ΟxVkg'=ٽ\HWJå^nj3}¼2rj]o6j{!YC|#mԔat{N&*l]JumΓ?+ʱL7,vVH d5ˤO ]fy@\?$L9|.J F%uPYP!ʌ%xtMuram~GMYOPì ӑ6#\<'{#ن1^1f2jZ)v/50'L,$NA $x0bӽkH?Ub#߃*tA /ȕVHѯ5gwt?zͯϝ =InxDS.]=K&K%̍J!'(D `;8&/zwv>gP*A{8T1{-%wԎv4++_ ѬGU(ZLUܞMfJk*lsX"YGJx.2^dtXӈ]c9]~46>ɫJfA4?#T &{8u7G{)f;޽id4 ATX7~ )077c\ ~SW`dGqcJ0KMDA)ȞurE ݩ眦7ٴklkՈhڛE#'  q +# Ћdzq}Ƌ .ހÐ p: F7#pq3CM0JU3>}=e?/SeR'U/*tDmi}h2 ]~F[٥p.1gi63kjHVU"N%nu4AՂ*JZıӄ2}ѫR:\LǺ72Bqw|Y(>o)4~K<>PJ8q;3(9 9 Lj@|\fZ-nZ("vWi4\3G!ľ(gj(@8q/hv `XOPWOxQ죴* o~ֺ}|4B8 Gꨫ+#gt˫m/;?\ ?0Ǜ 3cɁ3H3Fm:ex$[)xz-ٿuRld r^, [Hjy'qrw8m!Cr (As١As[W{[zFJRfZ շ mo.<) !S( j45NWI=3^V-`Q^;`_iFݺ)tvC1 H 1.֨},f?Aa\Z\.C:\;}ߖPZ:(6h>waNfH7# vi$'޶\եwV\PzK,J.6eGeVOD[=M4 8ɂu2ӯlZH{~XC>Ɵ-wP!֩~oDZE`5/9LNNQ]a3K{dy!&>#ڎ~m7=+!0]Z d!}" <2vmi]$

LQ,0%{ 㛥%sO 2H<5S"O o}&)}G~|1h=iv幌0&т T~υJV!BYkq/yjlENtlJ9(t hy %+r]X͙ɑ╙@a: GJUa%0 ? oҭx,&kҔ5 ^+ dXB$Ji(F)g+M=%Tb+Mc4+xLV3Alʡ~\IǨ ֨;$Wiۏ#?Y? hH;(*<|מ!C|3߾߿gL*?dXIrIBWH~vI?.7iss k?*;UNS&ʑS=oW̴hJxj(˲c &UφaO`1MU}1 lP;#w,+n.hHb A$Rp"hA/)QȄrп$kdɭpaU7Io)bnNZ{J{=izesoѩ>L-&r[)$SrqMiYJOL֫ΐ&dGr}w$lgښw'&z!\TN jktǘ*i;^tZR)JQ.Z_[[Vox J݂SLD;1d:r dM\}V;(3.8Ǫ$UrՔZ0bI vRf#PBR)S;rg4)v(6+:NgAAT*ׂmh$`SwU?ݡƿ0&+Wv 7;C/M{lqo S Pl e\&3|ˠ:ޜ[d:Hd-[$ٹLCr62f2>`&PUMTqH%-ȏnBDhOY8]UkUr)*{%;#F%cF@鰳?a?> % awV=V~7XxXAtx|D i"79FFi?;EНlgG-WH; {qZʕuTdp}Zu#ۡg,PŅIىV89+j%Gj֯$:DD@k.1ޑs#ׇ!શ[A,qr`l^SGF6 ?65#5TщXH2uǼH9=.HMVDǦEAt$ H1c#>nzNFf]69am;jmPb*v(k2a'QMMITYcSOB$rv}'cR{lvk:-_!%=hJ qQ{պl+ (uY݇h\J|i+ss`>/FUǿ76؍x[;Vɶ0P[iOZO?0c46`-Cl u4kRA lT_hP4gAm+sn>j7h5_"*(zn\.*0x |D#{Zaɠ\kƯj߾:ts&Gudd&;*QNx^g:;Xf2QX pUQlb:b#wLT U?@s&PS(&I//몪yܚ{:LzHZj="0w㦿/MJ Z]:w|PRuqQb[Z 29">9TAccY"4/@=F0^7 ږqv)<ڳQyi_̲e䗴rJ]К+]iեz֘?HюYOR|}@M5X@%PXjY"nR+􃽂+ZѢؚ _<;n)^ԙ0l0~ +p/ 1Vc,(KBy)UNg#mDlZ߭J|;rv6od !iiC%l{Iۯji<2&ʮfZBWŕ8y$r>,ȃ(}[` $S|lzT ~}-Z*'@$vBp{k.!,lV̚_ NYzeH;*@ b%`_3bTځ,XsUS,%GsyJ˾)XP <ւt*1*n#~JgvYՋh=Qp{"i8)YLjŰ?Woe ][$cN#t Ex5G W_KRYza"|\"Xx`|s2D6x3 1Iޱ*U;L [`x;P|5^ƲC (DFSnY [DE[s`?icw9TJ8n4i]/RElxħ`6c5֖Ɖ=ogwEKnaS*=H[WöpXQd]'ân.OT6N"93h`o'Jn'J U ;n$|لZs~,{vbW .B9D0Lbc@BڅRb 4dB: ^\;WNg*q ݉U'gs͝Ӗ.iF^{\Nj= #e]t.%h8 ܿޯ֧i>IT3-'kpp{fƉ]miN۪wi ,"vAx҄[bG9ab?$bncKqBfU2 chOx?\T('5 X?}D;܍t2^]t!wg,44AdFq$Cvޗ8'`ͪ;BYw҄ ]UU+GӪ@E۰//0g8YXoѥ9^@gF8Y {t~I:ب<сOŹ1g YPPR!BNE軰Cϳ0GƎ$}K ¾ (SuIDԨNwۤmi- sZ&YGǞb]# K%S# c OqxfjXFpRʘq4V!P†܇Z"jXnoo HAtѹ^0l5jٞCX2,$爙7ScZܝh_xDO:gz٘ݺͭF5Qv͙׆cvX> bgX?Cv l#rNn׵UL݉2{E^a%`:dOBUFi먜Hی#1hx'k~G >6\i\(e6DpW2Y$56U॓$:D^zFJſ9Cƈo'e%67U"i:r=b>& |'`&498%gHsnDLZ0[sHpp/#{Mb:sJ=w+$ - /"ĭa0`Y)&`6&f6"qXH6 176W0u n *rXtpX!E*0 Th>0.8 TVV T8 !Xa Tx@Xa`d [`΋TxoCw\M|pNN$j pbd.ԎǏGRg1GL|}qQFt+ QPTi/hB)$,{dieԿؠ Y*FY7ci8&["|0L ӯE1@K=gr") VXS TCӴG_JXaleÀKDB8tN.xsi~3Xt5̠jf-`{F`C _ JCG*ܼڴ}egh(_[,q.ڇ|@\QDol73hdrD+\SI}d辫B ݲ{"׻pL(V wpm0P|M f$;ޜh3R\s`Wͭڹ^ zƽތYvfI\VLHȝ'~|$b ՚S<05mniƋM'Ȼ3L15Sm:F ϰFӾN/6W0O77W,}=bbr#iq0ggL#mxaf:P>B1j|n@NsB4a!ix߁AM#m8⯫EE5mq$A,<拣 ,Swn*VŊmpwgu{mXɻލ\} t528 w:2;>|m.~ο*U۾|W}ec-Dz 1°053LG==(Lopn\"Q!3gVwC(UT:jY+oER}q;PmK7GI,x&PE3<`%+<hQi}.VgҸd1 _JEhLY !`L7#Mp\$Uǩ:hyM)4h[]fGu^)8'h [s[}vX-|tQF?u0N-pt$5A,#>±ASX@"q*~<_K+eXE6@G>(9Q!؅=eL|@Q3Q;6,o<`5;tK4 qRB.`| hp+s 0XQ B?*ȞZqud[O?8(!q+hL'D>LC5w@ĺPSi2}oIk%6 j;j@8/i9zFOnZnV~(&ʞ(MHOߐb-AW܏bdɅ_v?k: jM]U(MZ6/z'K ]qa5_{(]L=" 0i#̲6)Ю*]ᨤ6#kpd72ޫD:=*X Ԯ! xa?ͶNU֣Y~_-Va$B\: /1q%ಂƍ  $@75cv4 *9o(&rs4;$֩R|yIq 78^iM=I3}!U}&\%nF3L9\[h 'p`)[vSJt)m6%y6dhц3¿lәaFcmL44r /iK<3ۜ^#Z^Qʠhyڂ==TӔaݵ"UYc2e@)Rq* (^1~'jb,џ-WHY|9p*+,4zw5]3%T̓Nϸ}<O)i[e_b =DN#F,p&t%bN ($&s:& Peq& sU/1Q0((|1q-EYڦ/hSďaPB ,NmwH⼳Q w6N4Y҂K{A}F ]g`֙mE;v^|J <f1 BPi)Kib[}C^~ݘFw 6ߨ7b$G.ҵi*ݰ +`NR(Bv 6C*n//0߂K~ULʋSFHpa>eNBņ{ŧq2hdb>#HDr CƷC:>&DĦS8g*k-8\"uxmwlydRF2N3Um[;--8 Xi2KP.m9 )ږ4Kq|a.Kge_hXAy J2и[ܸWP3ʩ:Ic`H1 A =(vP؁b:LgQ:LTy);%T*׏ _}*􄞪'S]5yS$*lQH(1@o7EI E:fC!I66݌ F>M3$9pJ[DQzIk>h̊Qd]TM3X&RS(ʌ =*zL8jz-cOWJbX(DvSsOL/ hM?51$L% ire-5Q}g 2J "Ve1Iix[!C e0E"6pأnk,V@wJVV8ʦYRƐ23 ^<5׷%BeY|ȇJ"J RL2, T,6QD&cv^[m%K_}stg;vB1E&'`gًoWg<ɕĖ8hWOlcgWb ?WiZ$'Y+pt q2V&ܔtL&='˜rBg9N9n׾MԵd!F?B 11 zGJryBXc}r!mxGT`a0~JDP&vP&ڔwYP*B˴HVN/M[.Xp-x,9B1Q9DZϨO:1;VYQP0IIb$`"V-!K1VY?B1kG{X @]Y]EY0nEԋR?"mT䒖Vf{ f[o~'$UZJ|>=4)֒:ʝ/疀9{cgE_^j2=wt! Fir}3m?|jՎ=XS9߀"6j0,_EY[e̟]QVެ -EbM  ?A'?r89e`T9nߌ*,V< 2L e1U<`e_Q&o+y;=\$Zpö ټ'iY:G5l _.?=."P>'*) !Fү4W50lˎbE~L_ BŌ̳ECͺ<&(":J1RO1`z_g%D`l"vUg8Fhh`]u!DJu7Rj43swv޻̂bMWv1vqqdŇY<튉%b{KY~,Yt@3tfS2ƽߤIx4%Y{\jhQ;_&Zj".Njʫq]$h${04yҳY =|\(W Y$2%M`'-" I gV,",1 >VeԨ@ yebyBӼT( 4H IdjZT2Ed?, >VRS(DP$+0D 2|?˗?EBR3Y"ɬfJ`iRD3^)٤>z" 'J}o>bR5R 7㟢?Jl֯䋑֖D\I}5>2OH|c+ɓ?Jr7qΝ/kMr*fbgB?RssG X̤$)IRT\rIR$E%IpkdȜ[6Vb`8Cc nd""'gD+aq1#'\Gڃ̪ז,]?NDf)\! <9^tZL,(Siнz%RTzrعl}j*"xKʦD1uzK)Ux}V+ʂ|ր  *[F!3b.뀬D:F4BN8U}5/ ' Rctif//<8LL時/瑵J&oޛ+ǠKa{#K |S8"Sh Αω=i 8(lX6+aYۛ\3ނZ@+qښ2UHi@^:WP(_!D w1&~B触`0{ Miز >1{p - 5T=?="x?GL8;~NTy_*?3F4\PIrhNHR<"r< F,I[%\/:cQc - 0; ,((ٮ*PcrFtAcEIEvwL&i$5Ŋ JMI:<AG),{ׄ]HƩX+jDِd +Eb UGN$}d\r7T^^@ 5y4ԤzvȒDLX= ?)G`qo_ʝ O+OT_)P~|e+cdZ/r HF;. qGY&Z!tS>= $IRbz(.~[\ߔ@~wP+ӿIqW#&F+ .'7Aj8]exҺ p{~ZeR%g7*x"Y%)mQm&܊ַ݃̒6EyhE- !>}Ld?Hr]%Zd#Jz/@E+((wADQXDKK Y /Lх1QJ[I0G+iO NKňyż 2(!3/HHPLyJ Ky].J@F0A9 ?6kqIa"mEu| u|D-RhZ(|#VP,ErC)vZv A^ڨreb$ǔ͐6'}ثROPEIsdh0"k#B!=7ȸvȸGJ &J|>(3zy |NMHt &'f$ \P}[+˰(y[BAԼ-GqtGW*XYSmt`. 2mّyyvt +pZ|Q1p!KH1G cGžZXXLdU#&/4kb\fB~j#O5(b*DZ]FUWnܝf[J*uIxyyk+4K9 C*#Q :SSV`HZg Cp*G=1T%(v \1=8 R6H,ki: DH"o"*Tox=O/Hvnk pv푹!Q Ӝ%CְKi$Ut%[T%VIBFEVjt{?/i}:hUvM@2z|*aAN 7"(; ƄH[OhHNV3A#sym髓gIL~Vr6RR18["5"MO8 uK:6ӐLtXof_ by?$Ú* QXH.¶.5RQX>,k"3vB0\* חFBL)TRJ Qm4K;LEu_!քԚS<ҟbV;O,U@wjYkfh-I9x,1M*v*<@ГN![emTj6'ެm6vGz"uUyaiu.WN[㙌vtyL4@/=mQ&S$2Ɋ@ 2a]aʬ}9ow> $'LVDO1yDd k Y@u8R8ݽtZ˜={djEzWKҎƔg]*fne],ph~=6a8hQc#4`uӘR@(.= x`~{As< PF^dp9H *Y7>gqjħj \Q5熱"'{J2Q4Ռ0?B6ʬ`I (w`޵T%kLY;9W?+uZsOJ3.6U ӟa[oԚgY;?{w/UYNu%{{LLQ"i0kHUYoW^eoA# xR|LMƈ 4ϲuv+~!jLm>U(8=3:& [NbTFi +G5݁}4s&*\hB%`j@i"WtDps:پݧJ E|ƛ;aCpfZ53Ff2ѣBLbI]C2]`{fsbt+l(A~[ab9 C1)f\TiLH{57k bs|B:بХ 5ExX4|l#W/[.!q>3YS7}K{Hes{:߱.0KB` w+аX>5wozjsRu$ϚJTPv4%7:c1Pق!!A8~03~sY++x1Ty+1- \ܝ .yB6m1mSF6qHrı%G_|E9uVMdQB? +-5i"7֡lW5f,25fuAuu^5qy| @1{AS`غp nx)-V7zH ZZ&>7 &Ia(%$I;H7@0*$[=QOE<=l2w O7W!@U'}[ ģ;,($_V UfHuefm3*ox~ #j9a+yRM[蛸3(^n.Rn;mrw:`agXTlpUN ]جʴ9}Lp_ߨ}l*>Go>6i莿uިVУ/7ꍷnr_4Ǐ7WT{=ИJ HIZ.BqO)  ޶8Ps`eQP+EymBXQIh&d(zݤeajȇBy0{ZժE}7炍s +I$t  ';p xWLw;_KMziw%il<7ۥQxrDe>hAO;ّ1P@|>7Y-G]mzC1*m'Z7HZISffxSg#:#ɩǸ03ŝE)2g\Oɸeq4j~(x43UQiIUM.U2D?hpqS+Z1?+B!hynj1/7 ij7}]Zp7K<>Jh|#T~_KY!\=d kN%ϡhfF+NJOde(?"v"nB `A)(m1LXP*ܚf66UURLG;yOժ 7aKMIJtj0̓T,ZF㾓2CSZKzM&%zQSLH .HiK.sW 'EbOՊ>b.3}E]%9@acioIp,F Nh`؀(*zر^tNf/~gvoYIq96zY"ۚQ*G#4"=ZՐZJu:g. RI;qlU|vóչhrFdh( #-l~O*x  aԞᾈ)_[0OEWxTKxi_vض~ت8?a@@u-K"]UJ]`v<^YN1帘y;a=X`V@[)6h:!Ma %R};m)uicLA2| Isj"Ąh2]~ 5, e1W$7UL\&K󴠠ySwxGRZ!#1s$_8:Ȭ4ؔ||Q&n)ł58TMyU v:iU>Lyٶ#TWlvq&k'oc"Wcha2S1J W?76^ed;]NJb@E##{c=d@|f \UiT4db1ѡGH8ُJ [W֠}6,ٷq'OK,!͗,OEk} r&6(tXm=%W:+ͲQXOjl-t~bvDJDWߢpZwqV7爸,sU^c Cc* J(-vYwߧl߁VsTֿL{lc6"ӻlk kU܊0䝧|"c; ˣJ3F2N%Yfɞ~E,%I6Q]{SuvֲIꢋ&,|u?> pfef2Y2QVjFK(H6Sw^ڝU1VVepgi@:M s,gWgRIND=< Q 2~WLV!U둚R4fx<+ꪐDɑ'%#hpq6MIΞJ14K PsZpM*O[U~[Ny. h(B# )?+WLGޗVOBMoabېa>(:1;5ctJG\S UŠ6*5F.!e@S4g#3Wet@sA `ReXsW6n ,~=eը4 H0_*0VrfՀV|% xP6ē̈́OW:"U 5e %")jք|D ]ⷅl#ӹ{SgO~o0tXR#0}W|'usJ}s;Ïv &Zem{ljGOS/Z7WCD). ] פQX 6 O3;D 5f鹽r+n~UE @[mLW`P, XZe*BrP(vO fUk m,*csKB]&`$mL6C?E, Gx[xN fSxZ&uŪ-oŏ}n~{'Vsq*c  pLE ٍ!y=.C:nEuPR#@^iI `?Ki_(_:8/oU;Pߙ_YvvU- 0xtmٷ}'DFZ>壇]/i16Ec>=f3 x_irM$=TR_6B ߏ)d f5 Π}IYQH >n5P8@_޿Wt@\:jg5R@3W6V%r϶.PUOK](5k ܄WTnj1U4) VA;F&eb R)Җn&zp{ yjo`(n ;Q?ďol0E{˒oww&zsx4Bg4c.u{ad \c*{Hll:-*HJ#}&LY(ac܉rv؂:jD^aCQݰ_05z[3AƗ\"OP,.{aI9sPC{Lկti$Nz4sW9*+*0~V޻ 7i܄z>`lUyHDBzAwRsѽI5zU O8)NDIF~l,eqn^-abwb ̲0(.A82Jjw㖳LL&QGMU܆üC)ޠ 1a $]_&h}yQEt R.Ap4VxB+}!`9*3(\O1+UUQτF)#A٦*A~CY.Oo5o;*5>Ms>s3D A\X2h" |MHUzCg/ R Z専 iL2*] CU~e+ʄ rcYOw&'_]d`rzW&3,6Ip(7Yz#M`?ʖd.@kEJ[)i:%Z2m&E!)B !(@K:l'&* `eh(9 夃 \ƕR0̸@i`Z*#B%-2DPZIHه ɝrq!;3EKyQ^!zl-So0j3>o֢44WRk`$Ulenee[Z4lvMo\՗՗P{Hhic=ZMq,5t1\%b xn׳V*.gRl>SD-0]DG7Uf.vtAU,AsS-zl,#<$`wشu\w);H1&`Ay{4vIZ |r\ߎ>[R"Φfk,08JМJV~7A %Tt:] ǔ{!`Lߒ2j+kr-de"@jV @LeL&\9h$ٞP}t{ϼ"={DzQ](!emv?\;>uN)1AЙA;-WMOU#.xuCQY/2tJ"7Ūέihӳ=K^.7|.~ÈRϙs5S2YG&ʢ8̖zA]AF_\t_Gn辑w+G\H?us;O?wzW2rNޏ!ާpq-F~Yz\k-RZܓQ 7wѴDl8oq.ë܇WϢNxኼ"5۠ (r(s麣aNp:afcA=H9? .̏0w23V;Cxg` L]F[*u4EQbQaH&# @Lq glId,Cp$t^[ VQȴuyI~7\d^ ).V"_(+V5%k9#zpi&Sg7i (ۓ9'Q}/"`"Bz=MeB jSTnP}'hBfxz|t+vGF_ϝc$dPy?:Myu [gw {Ϗ:{+ g1E4xdfDz)K-MךN @: #فG ErGu,>Ʃn!ާqKe@~U6}C8޷{dVxeY~$V2E3Swu?iS{֒Jk %`!pw/9+EF< ~лvOW>P^z`#n-EJ16m|M^8Tރ lq5f[6_ՙ{6_S.%vBKWl\_P[5G%ZBRxY W /j4]M ˔t#8  :in;J,N٠d ńtM4 qRe$*| ߋqih3GF^ &RfuZ/ .@DUp6j|==?;;>!-脌X1i}AAp%Hmd:/^ϗ'ǂ/ݧBK,'e|| ͠4ص 3|U 6F6Fd%FEfd!Մ_ZUZ@dlo7yZ+_(o+=W.x`I-Ump??To2ʳ > d1&Bh*I _0^fnլM0eudv fxtMaU[G!y)@*6sb~pMvh'dL0+ɟ@1e_7:f.̡`QCon[%˭6q)I|HS|=Jf5tYkK?3i/]bKqz3U"DRZvRL¶)'\8s[LՁ@ FV&eCD(r]}R3?E!WthY2ZQLiRDa#8ArR@#P.U­8kTGgsǓp`0vb`-X_k䬄{I u Rus |Owv㯊/#I7OKGך51ұt m1wbPͻ® r3 x/X'ޗ2mO AщP^ $z`0oxA"I81b} ~#> n:oN$LARe'B GI['Gj av@78 `O~4/8jG8WPj};/0}܆~&0ߨyƾfW1#D1[X%&+ڂE4HjHjqj㡵@mTXJ~ܘ曕m {`(f7$4ڎ 3A&s Ýʣ`˛$w_1L>eEO8ωrpyW])lxJYfAaP%?r |1<0|5]R,Y$ d> I$!I% I'! opoZ  ॣyߋpCA9rEb/fcw/"R 5y [|f杫:u^Oe|Qc`R^!gψLg?òx,! 9oh'7i <,75F*Ft0Cpn*NIK~C@f.'(K dyI*ОÊ?QKblθւ `tK'z;˷D+0 "~廌Ʈ\۠5qe%̃Vk#@F:^6yz~F29Tf]2ah_ߕ{GfHaX1qZXNVy~PTl JrOj^_S-Qzk`h>%J=QG'vrx_F&J8ݼ>9G#1 N-zKsBoɓiK ~rlP\a!z3/@] vfḭ[ qw%\Dp! exڤMҏȜhu bm Q99 3oP)P#4nm<7y!f)(Tzj*%,Y#=(n 3rp6"aPa*Z } Clq\Я3BE~9R'9W* /^ _!zmef`d;nP-~uZ?}+S&YT9R`kd48>bBk8bV k "QmMx/WC}p GdMPx'n![h]=0o2|:uN|p'wY) (`Fw~rI(TEZof-YEG9\x9㬫PFlpǪdc N=6IR ,x9RhP@MPL혇?ay ZbXnM0=u6ћ]@ԬzMCx ?e-)OYjauZS kuv="* )8^-WT2xdFٿx8j K"mCfszXk\z媖3 !&FK11w7A<WU^s&)i#䭔]|=X > d?yEá{Z*жZ<\ |_PCAYۃtϝEpc#n VpzmM*h RL>VOk 7\5[+A9`!-8aUNUXBt91CtAtSTFr"=+&m,j e'e@e]Ꚍ1C[kIT ֱ:V]{q-5^ճ>Sky%/NkQ'%^@4hԙF]n^ ]hoq0Σ`R 5PPiE5GN3_=0[sn3 ( C/?bU#@nJ:H1lGLA+keRHq蛃b!Hx4{+mj=d?&DcMgһQ?%|Px[ZErR2F$< ]a4j%&/WZܴL60O'37Dv?.HMAHktN:\А'Nj)>/% %+>L8Q+J!R;9)5-1PD]tDܲ/.[!"p((=&-w`2[rαE(=-.y,mp)4Rz,H姳bc 8Nqu0¡j-DQm. EjaRs!3D@yTe62 X *LgPM4anUM[my;|]I3`|e[!E>áH'}qFtZ >2z?i;3ȘF; >+Wa[T1gQ*?s'J<7P2lymQ⮰+Gf*-"fG4f=j}~U\>^:Ip8uv9NEC;[Nn%d%22&b2ҿbCv^=OإۄGRJx/J%-edw(zMt!DbnLb^u_zv,3D_k(]V֙,X[KkPջ$ ?bfVz΍̻w0jLi%y50PC/GݏƔR]OۺÑhj施[B{[ sjY-F謴mt5I t8X{Blެp!bo4EAүCR+#@ C ކäàݙPO x 7{.ne+0gnEC^KV [k13@ NӀnQPDM @M%瓾GYV5b,I.1G%4 h\P :L:]_Zqܑa6@?,@/Ύdv$u0EMno}j̃.`; 9cXmD><)Ű 2B|ZZYIۘ eNR2D*·H]|~;<:0)TB2SKAX*IIgL8ի'9! g)V>TA,1`JÉ[j2'R-;ꗇMa,K6Y{%ң#ˡ]x&J;"YE, 21(0[e*b4aEeRei^Et?qP9KK.l9( *z cP*{U*8,Qdmd ɷ5I@K9Ċ4M2zŠƽڮ/mg숱wh酳L6>jr3zVֲ,[ ۪(&17<:k0n~yER Z0;(˼mo+,[^4)OZLNc/V9kbw3)k|Sdkj7lJkVYVR _ X6\h(IOIA^ 8Iny9Nc &f1r#숩 Ph%ća޵`8#gvtQ7g`@a_U={s3WoU Oh Fs%f_Eoր`ED ir(CXYcHN g+hRzϷ Eh,f\F 4aE>(rᜆ,`b|jY3Zp`b~·; nCFtj1FE'BH/9H/ j|,p+V ֆ=:G'Q BύwoL"!Bs$D`( 5.>w~OAtk#?bL2a9ᙼX JWx%rP3xEƪYl3̙M@Ü9V6ڶ$Ib$>`)}Y!p^ @PSQc*TUtʃ*:fhcWyj:x ^=퐇Ut*PgWdYAʼJu긍^1n./l8!u /,@qlqR=`~> xntxf#m fsb%A[F o& fⅪxU-6wXuíŪ97^XZs^|fbf/`>K—.e16JZGZ]'=-ZlM5DÍ |8kjPuPL631(wY`6Ɂ=iyrfdkN>~$MK*L+cicHSE}dz`'Q߼Z9}(sb o-݇{m{^^ {Ŏ7EeJf 2%!*֝Ht!7hEfS)&5FTpj6сrmcBNB!eCit'*OK껜QSuaJRM7n^2xOdLP- nU<)0?ix2ǤM4!5{\zd-)0i|\P LV]-e@J +{tYC#{{Wi6i_BM3r K,Lfhܜ XJRsuOZ>,L_/a2u`,`9/Nնa1N{tSE^1SgX)T+u@߆*|@-*9&E*eYaf B}ȝ"x"UF,WUYAk>.5PcXGhb`b64 p!}q05?s\{X8_yأE\FѡQg}"+P^cCkȠ׉ W2ΛZXNBֲPB|w.o^-q޼{l +~uUýf۪v}4li/)ȓE(F7OοtDUiEڿN cGZARj]{!"Z?o^E?b ertY_v ~dl_<`F:Xipم̓/ҌB֙k39[&\ <[%xTY {o$z̽%̽Kkγ7~8Vk{ߝ~v]ʉ(q|/d8i v7+@;vXوO /Xn藉JV ޱbu;/',+0iԣ1y>嬾=;"BfyoVh-L\;Pi)yŊ3v5*z㼡=#|bx{qWlDFXwc(fv-+#zy7VĒp0y}WfWv] @/𞰷]N,ZRK*Ob]b" nߵx#d4Xwă!Tfr{ޟ^]U0/5 O ]f-ɖFIO'+>y[`KWlwa}pnw^o[ߐq)Me51Z% 't#7l+ p5zBb}t;M<) )|:!Rxw|SOt],ө$x366Ssp:]3=G"=Oh0d0[Pdo\~LCAw`5f(@aWǿ]3R 9/u/1u%{K7l%;ˀ4$Sã_aZ^I"m|"xDNQTnWFkhX%|N1gBv%?u~h%JQ[J#^[ =҃֫z|*i_ u'.1&iC1]*՘%bJ)Q70[NMꝍ1RxO*7lu`YX>7ߊONe֥a'r_oPV{){rd!D M~մe82 l!Wڐ9/P^8O>j 8́ eٴICasVTm[PDl k"6^ kS\AdnWH^o70OjJ2,eZCC}ݠte qʔtt?wd feX0ڣ'kL-e'?mѴҔ7,$̙/3 B7"=ʞI[8ܵv5@mpsPְLA%M#׼T#IR+(ՙ]e+zR"2@+F6_@Z8.[Malnn:U1NKZPE:LfU۞BὑN;}!QmdB9 _9XnU<-L,#<%%]Px_ 7^ϝGGQ -)zwﯕܕ ܶ`W bq#7X41A/W#>]cVưN?u5/YҢJ &[IA\ 2Vo ӑ,tNf5 Hs` o` yOn8^͒yv nJK ,#xEL Z6D5s%_Q䱳"*g *f7d9+;uh 1sk4 |iy!+q90h5’ahIϰd$%[x.Kihi9 }sL{6冓l$=8XHxƫ6ލ1%$Swڏb63 n`}tp@[=ʟGCFqR+(eJn&?(Wv>p}>aDnLI2r +3i1Tbxq5{-{'}Z_ؖ 0R+D ]QdƸ+X=o~ ];ȳXٯ?DO`ݼV˛sc܍ͦdQ_w{9UjD\/mѬH1m^uNOrѐ*f#"f&t]:f,,,'CzfNj]Kp*/6{֊o6gWG]ٲxzD$c>A.*lX۰1W؊pd$=I]hhgoLD`r#hܥwɴp=:bnK& UIhpE.R2Mp~/sQ A3 !H CL'x3+i!˲!wʾy4и%TDMu6QT[{y@_6s9 j<Pqg$-YK&_kRTڍ!s?=&g|vҭgF`k;5!99y4m?X*FIN>itb28%O䴖e3I>3ͫlRhg[[jJN99OD` !2!ʁ^/aK3 E=oC{aVN]99CH|;_6BP,\k1DaUٸSӇzU 3z&ɉ4m`Rډ\D4&S2/[iXG BCx$Ձ >iB/'Ϸ L嬁r+?<:&K{7þC)c/I鲒I'vltG]+Щ $0~Z`cL^x#z@'i&m{^ls׹tiwATszKm@|jgFg~B(_]|1m[ye6U˵ijQ!Svτg0E헿]~zIH? 1ơ7k;>kꘪUHyH٬xl2"6o~{=N;^^x^&PH M%}mgBLo+D.ړt Gd#lы F WB>,6_r}/iq-&9c?=K&5FY `9_TV eD/Gj9ȇ: |h9qdHRN!Mk=ڣڃ[NDqj@֙f_ 'SI[Z]7tW]wT ?|uٓm"nj 3dNnbn.C7 4\I.f65'irr]zaKek$O'S ?5s +B_VH076= *w@ o=}kKjW=1; ׋Vq# 2%Kk:ʀUn=i]xNvA-v񀎂Fnmrgoscd1&M*peʉ\ߵ߯ș(>(n@Y |16^c"QCYycEgD3. f&]k\J5CN oA]o^ Ŝ_8{/6ZяVkCBx4tl 1ӎmC9ӗ@awup6pr` ^[SbD-_ nQAY0.Z $裈R_|SEpSTѡ˰/=K9wM`^gLxE T!g2Z6DDǤ?q|7.D"+ŘsǸ[y?]:]1"9 äWFv'??^,5d*򏩣'"1S^\oO%Z(ڀL }xg?V-%d'LOS! ןB@PNR_x$@ߗ:yc ͻ2דض"ت I| x bs";5w4nx+Vng#c&f 58$(r6rks&+}! Or5F\%\LA0R-\ |ېPolޱ!p( gd%蹼8Fy$}/ NN11/= p^U'SmS|b%pWerfOxƇdy:p\p`sF ҔF<ыa];.@,ͺ8xZg~I򓭷 9#"VB{QE<i;'{ 8FˎAVj;m F"P#SI7ҏ(@BPp+P;їJ\c(s Bb ҲD޲пqgҀ’3%g+fe9x0NRhs+rqJ*vj}M67%˛;0d*Jwjz歡sC^w4k4_kg5t0;rYF̅veMTQ[/@D F_/OYBwyӧnJ4LT.PIт.;ip8ӢRZ!n^9D #][@KEԯޭw Qsώ-'`"w_Am^_fUK &Do_4vV 7hzÈ{FeSI3KYFx{R?*jr0nM:Ƀ?LX :TkbϬ>fۨ 越6¥MAwşØN+}Ҁ'[F$2 ۓ9rt֡ >w=i-lilE _! 2 VfxX+M$0ే°l U=y_;4<"F) vAԍ2RvF[ѕ8,mʇ6 $@b|(ӖsM,^VKԦOm[oaEhv錡T jZV~♡Z6إWJ3v{zyPMV5L׊r(y @NRI0+"ap2Z27̴h ťOk$`sxdNnoLxX3ךn6! }t{ϼ1{Vdƒ3`?{ŒhN؀eni G"z/D_vubF)Rk&VvחYp"6X>U|-fL4b8 i"I@M=-,.OTl١:ĚS:nI1ov#F>Gav $2(n %Ae M@a.o|ǘXRP65E Hkv͢h!Nmu>Men-ׄ-B;,aJB-iBYUfpd%D/Lх^ՆǟIUP2Y1H>)KDC/'S~E㗣G%릔 =Rx~82KTh7kisI;? 2PUkFd=1C`?MuЉ{)KQDg*}S!wyn^i&=˚92BpWI˱@40JDt# V:da@z iF?< sZb%G &g{ 1D}-DЁZ_.c(>$(ّ/j:_Ϳ=Sr\e4jh!rɆVAɚPb9ohx]qN;W'yQ \ʤLIk|BXS)jDa4kfN45slP33!U jH;G)6@UVwvM ,+M P0SUmimf87hc*@neV4<ϧWݣ:3Zg[ܻO?UGtԄ")uyX)tGA`JD}.{*= V]sWaM.GZΧS^\A|"<1A*xޜIu5؁u-NHXGS^_:C}𜓝@F,&f $Vי]djy\1'I|ND鴆?UY&%gJ&k+&v3Xe&-+4 Z^/jBsHS-n@jBBEIm]R#flKڃBY9u0 $iWEX^Xh+3Vq{ ֠ };ohrtbh.o^7}vOOX?qhO:;[ZfnYNh鿲e:]|VYo.JMRj'ܖFeݘ 3vџ$C;yI֮BTC0tAj($+\ aT֪iC/O9yᳮ:3" `.:<)zON:DbaDEA)kBz:C|PII1{xvC;?iO3 J<Ӛ7|WIro%_:dh]YLza|75)d-xR3Qq{ziptFH-*[-AJ H#BtxI8ʅ:Z /(]N~Yuz.\gK-k֌($!;~{|܀1TE6𬯯%5@A=s* pYH ~B j6;n\y~7F{\4RaݤfLM6ڞsUoe5=ayRwMM5?D$%~}^S|^DvdS)DRz;jMxA"TSUޢB:?}pKkpHkmT,z:k8@U$9L%^\ʄPJi.SrCLHmiR Ȩ66_@hYi%}qx4'`kElY<bf0v7 $㎽!d6pT63Waq^7M8kf|k`8@9\qȶ^=I`t=\sQl)yg?YمD!'.i潤lzP+iTh:ݍN4^z`\?V\nYq⛪DX1eK;mpJg2},bqa)jPf@H /bLUEW.H;+|sSZ7A8$# gG]ഢ,cğ)IYFv焪Nyn*l34&(=`\qaW.#jk =Cеn!\@pAaG[_(g(䩓BjBІaTA\DKfIɓF)J7gTLCi-Z4d@bbL[(,j2霆= ۖq%ڱcYjFz(v&X[k2\g$G݄[1/m!P]"J;JFp$f1#")n ?_tx6椄SCT@&9kll\ʳ`GVHVu\s[8&PRqv~tLhxR*@]û~>:潩ozlݛNK^O|{o^~@d;'lܦ/-1SՙLXXġ@0+YMhU0MK1`!oZݔ=!1gm'4sy@i1jL\ u.^^%/| ^WOr$lڱM11/`ɝ y!#~#ggǿfQM@4 L <*,p .p`\S.pbK|9,.pqGe <\+`uVcdt_=L#'<%[Q6]uO ۜ0DDSc.,**eܕʘ4obEͯ(z^.ĝaڦ׀&v#p⟩-v,1<#`0c,7#ZJM((&3TQf" BJʓDd0 4fϝrs8Oc$XD9!yxjgVzX{j0ah%@?EP.2M>';:~4NƐ=Le vofF=/҂ZQc?"I?ú՚UaXsp4OT{p˱XfoJ9Fqrۺ|Hah)Yc|6fW qhz4z\HzR]V!\!{z̒0yoV[Fo4K_ ?+LSDu?zPP?n0 KY.*OL r>Ǖ:Bvc|O49X6vX (m{mn7ȩؐ6GBԫթ7>a?RVo9-|ln%rSCݠtB d99g.GI ye)א [3MC YPlܾ_%aKz=I'Ivۣ??}8?gg8#} '/g+8"-͝DDxp/]FI,g-Q[zSn0{qi4 1+ ς[6lhT(kV4q%CK9 Q,*XBO%E+>կS*[3 +1B*hBܫ_]NhHՄۉB : Zp09ƈSdNEH> Y̓Ygn_xT\Rn4 b@+.bF\WfW*Ͳ6$>8pӔt6,1St8 F(M_iBM߬Q IC)Y܍a;B+??KB~RDi3%@^1HIWRJRfu4B&yYWOn.2z5VVWhj-/򅲓h=f5@hMf)0Y&߄,`r+1|(!38;0e:vo_ӎRS((ڸv%a&!U#oy^/Wiř:J)^ jD2Gő$\Kv-A*A0Yo,8mU˔}hAI?'!Vx(chTebhY3f>Z&鲼A954"- %;)_#(ղxYƃÿ1fG΂Zj/kϦY^&Y- t±XypJ(B8VKNgB8‰+S@!#ѷ)S*N٬t.s>NhSg~ X/ ~pprPvm___#RQ&nWqZ6_Z6-Բ4|XЦ7&Y 84%ƓVI,m4_xއO ˸P&VRIW' .^<'+Y7=&J D@y|h{N枳sgķ/= F$D5 erS/ҝX4cr3{! v~pz"WK{߄?pMnkh U&Q^o8z y.Xo,_nr)ŤH77% *-ܷpڄAԮ]>сb} \ mi_ g7Ґ-OMTVkHbJzH8wF YP^*br6 +1Ѯ@R!龁xx~~r\>99>p顃c߳g<ΕJprz@<>|_ίN~UVm) Y9I J&ؖ(*Ŭ z=>;o?@ĿI. U \}\o% |B0E'tLqvLS!CL.;,^ʻ,a2 wdj\[bDℊ} m1hƳPv8r_&nR]NSm)ÚU?HePBޖkTm Y;B͉V9O-KDM">P hE gH"/._^ˊ8Lbv]N2'U"^qu'-i ^@4u#_=BZ4:O&^SP/wTOp)q2kHavTii^ MOƃ$C3?ppt~ta^1aKbӭ-[{['/YWW xN"hK8p7MI˂t&cN*l(91CV=hY_1+$F;dEbĉ.UhRI?]WmWՇWIe 'Қ8/Bҏ?IA>F!QVF=o&2U'v 2`MLžK)|g6y&ܪJ:>NƏ:X^8){ew{͆i<"݉A D*'F$(`d0-5Y&-nԗRNBz/@f{@.OR6^͔K`ZԳ&]lM-w E6jBğ3%͍ oeZfݪWQD/fJtTAfgWS9U@՛8ͯ"KEm?-8x .ד#v'7{vN4QtICGNsBɍ6ۂU tnʓ;7^')a,P'BO2OeVsSlmSI| |kܬW+)^\bD\]y%7dO鮜>3[:,fwU±YW.9*:il:oڅ,ɣL`Re_*+#]f]joci aԋ*XMhn:82?ģĮ=>} kp4n9mrB܍&ـrH:c!jù(wr&CrRrO0?Y+z;`!%E d7ښLM3C%96u%v[[ԯ9n4~tT d_6CRB_aE&hba8Qu 8,h\ڷZ{h>>7q>WZkem^'Miڝ?\/7,pY6 I?vkDēkO%l3Jg&#AU6p>~t [ TlfUXFAd.dXt"gV(mȴޤJmdu0Kp'篢Cj-nfr~Mi`YRg\[ylmD[ B~MG,߷ȤG66$/ToH~~('#IH"D*R\t~.嶩Y|rq Wrr]r 7e6s~zr-g\ ~ 7cKi%+l{|ǔgm I`Є6|kƬ')scKU+V&D4ZO ڛrøºp͒٘o_7 `׵Ǯ^Mk;U il8p/u*](׭I 8ՓܣMq|f_jO; LB9o~,9pkwz5݃7ٲ+CkK"vT8佷'g,c\\oo$ͦ0u4EKiU|X6^G>PIgJjqIT'+8K G'S0m֝W:6*6)[.˖:Hzc x, $!J\"@P%:8UwhMHjm6fe!qUqצO҇(DDm.*wU(e y,JdLfhuS;_6 iLA=h2ޔ;mmhC#&EװObs)d($L9y)FOQedw[.f|.-jtsZh)dTٵwκUv oN7ҏd 7ll5mlR6ɏF;F[lr˚⧳ & ~Rf%jZeB2MKfuEyM$*Flne1F`>LcK^ y{=R)Oջ}ï|N&ҝ}8:߭m"٪ Yr_TᇽLJ/a,=WQN?8| 2 8mͮx,X&7d߬[SKwTL8ۣQλLJgW~8z?x+]zO>;;WTf6*2~UǑ7nmf"[[WlD4خ!tĂLlPfB(z {ݛeqN7kӵ9[u#|Dm0˕b6~hk %u 1lR|r(s/0P&hGfc>ݑjuL]&߾ jo&%mC͐Dgl~#( MZ^idw֚'\a7RI9S9ˬ^,ft +́ BtˬW-O\=jern/=$2A@Fl, @xmDWfP_-%AeBzHt&raCpP0C rm ֆ&:ϟ-1/H_B'Wֱ6pQI `o˙ e!DOਈ, Eץ0LK<2E*ͥPO6)!ɼx,ϞgԤOyɾPU{?=;+[ "Co֟pj_C̥[/ 0^e&+i?eH܀ݫ'vL`e.SGpmR/c?Wp=dȵѮ |]8{ rvy i;#I +TKe{Xڮ.O|~٣l xMziOz&-H [i[ qEUZMe^VMg&#PLkܨM4 'T :cږJuԢbpf.旮Iρsg]ȥo=b)'tIIt/KYsI+rGdbrB~zzRQmgղuH?+ub,2{\4 4ʽ5G̱Asv/;)5ا4RrHQWۉEƼ8 an*?n0hnXn$%5@K67Q{dȄ++Rӳ#)|㓷Z8_BIP>mjۋlk[r{,]K'+.UL{@߾zE+6>wxha珻Aslg/~d(՛ÓO^sfEN9W+R@}$aΪUPOHꨱ{MFvjiשsxM_{(k˪DrRLle'zM +2Ĥ5*Z7B%BMJ~Fb,]DG~7IEHEcDh<^Ռg;6ݑ[U>%mG2wzmDP 6}ZЙDeO[XLn!HO s5LWm~'JW>iXGoJW||Q{m(腳bWORJm\|1c6W}wB֍k'B]?wx̏ 1Y% 5Gnp2;w9ۯ]/ŞmYmSr[9)̚TgyG&==mzoJ&ꁺT7x 7@yzw!^= w{,y\e}6M\fQe2NѮ1xl93wq< hwߡqx}{׉*ifm([ֳ(LwGd7Xf! gcewܴ0V]Um/kMx,o}ttN,wXd6ݲ?Սy!c Kpb]L,>˔z"ftM';'}foɛ7o5̿{o$ؙ&ѥĖ+!K}&,(='ùJ/yw{)F=!|CG7eW'kammR꬟/~58^kZqV-ov*֍ ॵi*{_ִljٸ lŶCfHp;3-0g +{Ӆf{`.a0LGۧuۍNwCf3y'ꁖէ,tk/ /X0Ω!v(l@479w0?1Wgppi֦od4C I'wxˡaL6βՃʇ@V:08;>>wEὂ_/WݽsEWjS9ž-I?aeqU?juVW=+_e\qPvO_Y2/T>κxmH,hS>^/˷ɲ<&e\|듓ÈRO(aNY|,+[%GP"p^D\YzP?jç|ҵHYՉ܏>yV'`7.GÍaϭi ˿3ZJoMj/ :_|gIr|Tb캸z.vQ <9dk񾌋Iž[U 06OFGoN^)5(Ygu Fb{H'Xxz&ש]~?qjԟ\ˍS:@Zo$,PٛLU2lԣrULi ;jw[f;Gs|48׫B$WnGzFZMίo>c߾`kk{%S_ҿeF˼r5y"Ci˓Ae/4cyr3Nt{SSڟĚP"A ʳ5O:8?:LPʼ g' ^$ۣn|@YTNNLJuDЋ0r};Kڒ+6@iqvCUxkuA~ aO (dzyNPD8)H]ќLm+(0/$R:/|2.yF3wy6!LP Y09Yl87sZt^ $BA9Qx^!|YWު5*抮t~3|Ic83z&߭hKJj-NlThfaK<C9~?~_;&*W!^uf_e|K4ݭf6oH3&ʙP,I>Ni~)W:Ӥ &+;~}|)AsNO .]l"`J蛴9ݧgO>JO?H śͿ$S/ChHR_Wj`h{eb6PveޓTf WQ8TARVU{S`;[)f&VN_0sP2mDyGe7)0'krF;-|Aw?Xw/s΀kj-u/M41 r/R48Q\Ui +:_^u3/2G'{NUJK2s:[>cbh5tߞ*֫[YbG7<cݭ(G ~=Nq;ԒOPSQ6s߇SuG EfESO } >}C,` Y,5  (w=. S}?k$W/u}\$OMGAda;N-+*}kd&,Y QħM0Cl4I$)uTY 3f E[3)B\]t.xwc23 zq)+=x;{oxhq,ڝfuXן?@Ԑ9y&6!DB7Ӈ0)OX}BM}A[/kMnq[ߌL~G#%ƬdtE??ck|Cb}mɨ )~MVq".-IfpJ@WmE{i6_ԾX+eUFJeW2x񻕇k*OXj&H C2a \@ Y>V9䴀0傩S ㇷ{K<| 곈u9YxzP8'LsN~7 ld .U67ߙ 5}5kNO3 Ulܫo4d6c%sdf?0,^|EP$={z̯T [R'>]}MMcbSnm.>@BBEG%J:椬*0gu Hrfaٮyk4p۟E3{{dNN\ ]|c6!7 _goy"rUC~^ݨnbWׯb;4-i)#EͲ:-DȟV2-mȷo23q5Mɒ,-铏%6{#;so돚Yy iCNf5sQx{E~#hlqRD.[M\e :s-KZN=zٮ^zr/h۾\ҍ뽠]4e.t6 _|,~7m4S7}C305M\A /nCoupziڶvǥN,mmazygyzYǥiPo沗d=lt{2cMmo.x KӶQGnҼ.h4im:M\W4h@v+fK3;zupi|Y˜qijtp%zgAFmL_a6u1%=qmY6.f9ⲉ˖4tM\A4e.u\A; 0GZlԞ4G$Ffk ~MCY0aXl5}\]V Zu\+19CAoE6\T-e Y\Y9g$cdomv A%ڂ;7@f8I5z=3&4(6hKp%CĥyŊW0\6':ʃhq "@` Al 1hB0}6uco1`Wt0Q v]zh1Yok:d`\+.C 擅LiE zDXoLCFk6q[8-.Y;4\1D.OJqiVoc9 V`OWoS9Ϫ{t,y4QJ9ēY&> ]C|LP%YK%$t,EK %<$2TђI6okC0e"MR.djF $L^d#f菍Msˇ YʴOIn](fX\/`Y{ ΐ$}RXĥLI>'HimHB?_wR@KS !T9=l P:j' 1,(wqK23Fl׸Kl!؈Q,Q;@ᘂJ|>M>D6P:zv%7pAm }#`ΨÜ!x倆` fJd0@/pad6"al}E@P9bI0 lC)̠ȶ'XJ &TnR| i5h~hup"| "<` SR-4@:c-,4C($^Dqiv":T GC J!=~V@`$ 6t;ǂtA?g3/u? ^ ܩ4=X+6p [/@ 6Ռ4\2{G1M:>m Q}G(|/u(f¥X gM|ҥNlV,-C"7d\Tl'WC y,n@|$9=gx'd+ ! t?q 8bf!Z|=/0!&$l`0pœ%@jе:( n7 KP6=z z$I=4YֶnI:OdBtX)mk Nk܀CW:[ed(C&h&"^]8>T>D_*´:l ;dO9a$5m <{tH&"8&@piv'!Jo0\"M"7y/lD @\zo2!W7%K2&b}MH.CL0-YN@'d#_b  yۧ Bpa(;QZX6l~2 ]@02f@E2fV'%‡V)hZ2E!JV3|?cGF'`,% $uI*ך6^yaiGXrX-T/:`Y+ۃװi&thPHh$y@vd{.urբ#Jg#*A⵼T<2ˉ:^01TgLj 7DֈPNF7֊Z>"TU~ S`D0 *fTPXA !Xy. df+al=)\@u9҅NB]Q u"tAdoa]؈|CKCd0Bo4a  /Q Wn #tA @aEvXQ"P q8?ZLTAV'"\H%ak@P P N샴8 dh@87L hA&`sƓo:Mxh;GԦ}&팧SٛucX (G~$qB8dHדOy H'Jz@++ +"a AۊՅBP P. >o6I0mnuє@dCq!?$cΊd " |@x&n@f0ID m,u\&^t[ذ¡dy#eol jZDQ|(x nID ZKxZRX<܎6rpSK-`ńi)q_Yv)Sm`f,ˆhnn1 fg<p  f0}mc={6uyAG\ @Fa'Sl3+;$Q旰(\+Ohy~$Y rS¡ m҄"J_u:n~hZuKAf@S GuL =Ih6e Ai$5c]rJ@N.\98Ȍ _$.#J 4F+GidFGoHv~E&y0vх@1\Z)x0PIc-MRPr<0읂 ).!&GU TFs[FX.@Snu3IAh(3@)$@),>4NG#o,}NҠKG`îW+f55&&BP`YZMɵCS8-r'vB`MXLY+-?r#g6G;<'\! 䗄葎rQSly%*sAw;"َ wp GD!K?dDi1@l ^3șP6EtP*^`ڲQ *PL-w9Ĭ.lnl?H"㵟(8"ޙ$E X wǙW)%J1+)-D"VBFr9-5b "=`)Ӭ@OlP;ECS])!mŒ`WTI@1gHn'&yQPhtLݎw"y0\SɉHsB|ȣ5N͙JBϞsCjIy NG C 6HbFH&/#c;[C4ƥNEzݥ@).Fy?,ATrR~&`~TK$a_dil*- F-'%`JwZu^܅ ;yg E8/s<3O.ji-(]ݢ$P $P.j,JpÂM¸fecl 2n9!5!lIH&r ]K8D^LtVYB[*lYCPXJK1$`5,(L ]5!s1A/ [H&ZJZ1,dߖ%w ׃<﮽aP(YHIm B^!Ʈ(u ~[JXEX8uBFaKvcP@&d"-=%-00 p+-\[6]ʝpB +ȔN9zE\ŒR"4g1a8dQ.v*^q@4UHsA.*Py-D4"88Y(.RP v@x9lHpf"-@9qtU hӐsˏkfAB#Yޝ*Pp Nf NU mQt'd:P(hR%Evb!TMJ Q9B+*B,eA$~;낔<':aA9gP^|SA9}R= 7KwJ_ rWJ0RxBAX(psf暍V.:pfcMP',hf t j<*M,ĄR QJ77$3+`3;JPCA #轂=wpYypESt ᜶܁)O+H #c(hH|1k= q14hN2>T,*-V*yϰT;I-pL s'kO;wv\Vy2s 9Ldw&NMu;-la8q +71gV*zX"8=^-.qau&{29dT#{ {X8U ] [Ѐd>4 b ]+qqiBr!!q.CMIV5l$N;JT6_ Nxu$Yiw Z u8 ,M~L.Hؐ ќQ?JA@¢ s d\ *47CwF]${)Z ^r_\p64+KNePf.I\έ @No6V"T&J~*R5OYI O2R褒ﱠ| 2e}` 8s)Rӂ$w* 4 Rng0"B /d&BeP3.8r\B5`IiR$JHmrH[v} sLC:0K LJEɴ L)&EAabܓi*Lh+h LA~xQʒ \B)9-S*gȆsn~|BlփfN(BČm.8;+v H)` V*@2F*NԠHT^`Yѳk]x ?q) 0pp$!d83;yY1djňޝ%H0\ztPyE\O `+J+2.M\p[KP]*C Fz^0I}r_Pjҁ~WՊxTbd$(Xh.igE d^A Il^ytu7 bS(eyaJ"V욙  "Wy}MrQӠx@J3B9 H!)|JAϕ?@h@U0Yb`hP@"YrN9̄A*19i%^.vMYr sr2YQ_x.ME8 % hU"ɍ;æpsj" " ,&0V!)ɖw9Ss$f< )qvIB$t nNGw r,@XtfAY$&\,`܍SlߥPֳG$5՗4zXqggڤ3x_ΖZ(ʜ.SulTcj")aoX7V)93^sQO*%鑜 ȰK 5_5&Q+XNec:R(;Ҕ|# ^<R^WXJwAH@س2gEIqeD_ F[ǀvnu 8{d wHdܹ-$'⹐GhYm! kF>+?I C$9Ĉ9bg  B?)zÀh$D uzY䁇 T e!D8md,hLxE9р|ȷT ?ȥ˖LR?p ݑo.@^ P)G7ZsQYP˗BأB-E ǀ[ AZ^SₜS =PnJ݁ 3S;LNgpRV+ ITP:<GSgHq_p2 i4s`d^B'E8M"Y$!taemƝ&BmYbXD҇ɲ ,ǰ 6[2F B)AՓt ?C0H'Ax)Td&!-"` HT8Ǩ]3ԓl)@h܌!5ԈCZ16ϸ;zIVXx);f0)#YV,.VN)ÀVL[\ED; ":/&Tqw8 B0Yx*U:δe&%Ҁo&R$ Ht^q:6.#$im8r L» e@'XpRK 7Ə*=e\לTmĸ av]R[M|&x̓puBOwshz0Dğ)cUɁ!K@?F@[8@iv(q.3b?(Ж&CI тˀÌ._@~HNq'XซYdV.:Rq#y4E_g#0`dgW0|r iHDۮ[T9J"![ڙ48 RQig{$6.*O=x a>VHr~c8au;P$岳a8i XٻH݀.!p>mFe͇2v1HNdž?.Kj:*|N)4YO.qW"8;L-;́[8 րםHu'yEi 1NG:ll4w5,'$Y0v6GQ&ہw77 Tq{,#0"- 7Jj8]AI(@IVvBQ(Y M!Ad ;hV4 "d%ĺ0\EP"؛ۡW@^jGBsh88A Llۜt, rT"0 Y.%"K8YЀruрqq``0/Z/ B,!}lTjT"z{>7mvOe 4[ub%͢Z*T@N:*^ΉdK:ffn4Bb39s][E( t(u;rh7U)XSY7 %N RSV\La񶋙@x TC~B31M!!-rX5iA:*U`+K*0Y%`z)eŔ#= ""a KЖ=C %at12)!GS/IT/PXbh?cQ m-[$spbuXARFQz.)!Wm:v ĉ%Sx%ۨd$E+u$9㪵T#_ץL'%zDr?E7abl)2!!!řV_ʖ.y!5lV:@YAؿ(d!}iFƆB rs(Ar9ΆT XJO8UBu'88 *+RLIϢ4 Ɲl;Rz)$5gPBY2ߢ85w9GcE)hNP)7A`KWX4 `Sl8z@r;Fs)@CfKX\Lisg $:00Bʱ^jtU5Է8a%K0CKB\juqEF:XNTKak@YeAA9%FjK@R>\'yHAUЅ˪y] ,;צ8G'a`.U:8hĐ]hHSC}EE(E . r8~'_Tb0c*r7IZI.8*BaM&&XRjiTqDCmW8TmLz*?3ӟj@ݼr횟$fC~M~*o(,Mr^z4z| _̣Iɜ:ӹHhu%COYT+tIb1q*x}rqtMF3l@}Y"^p_:90n,(s!>0Vh@kBOxNf/+I\kƈ3zArb)AUXITAdTp.V2\)bU.["(D젦> INn4)y+:Ss"s$m4&p&8"MR3dT$~MzD[IP2ɑn7qu,[_EhQKvAןj Cg>1r|eIOn|/Hغ7sŎ)#nߊޓj^UK&fozYN0XWE2i8獠8Fx)HxVG6EYkr%b{ "ޠ2g9 S9O4 ڻ mdAs\Qd<蓧w@DQRTSs=B #3(^^_M'An6ISt1txAOOb*W5+ͨZr|rn=\'b/=/7\DF r=E2k0֕4'hOlֵND.(/ ZŘa2YR'bo;IR2*Wځr╒0ZDz9 %I?aZQ4$m2+|AHrKgzJdA@y(LI!Pk?Nx oit/44,EFC=]Mf3TIin1]% 0]"~[sA|/G?^["=`mqR׼a@d .~o =6:0QKPTw կ!-巈];ӄ傞t9a4 jzj/O4a$)(Pv*Q(b,sHɔQq1EAtG!Iɓ6JX i,p3iom${O&$Hh * 1z6**2w N& m~oEj&Q O!Ȇ6J%Ȩ!RZeqB( V-gd˞ gb{H{(+zfh6J.!SyzWCY%.,*͉ܴSS-DCZZdvSj5-զ TS_hyOvk>KPi *(gb4^z:"5a ]+߼/fނ|@&$t hHF!lE25ȰV3Nu2:M+5TGl;(\*'Z{ڄkWN W2S7G$#kPއ3|gCSx>iԂI'_"]ا2 {]T$|#3-fsI~B'^n>wv .&2z$PHEXJ VZ\TҹKO)lo`.$)OzʵC)§w$t*TFnT-{+R*23l V}$dLW1zy?ǟ/LMVpM%qv`n=Ҋc/W ;SQ}IEHő>d)HYYĿa(KOȞbb2ʮٕ$ YvY~nų8E#_Ik/F7Dَ\' SP9i'qFE&kcM0'BoT%R^9yCN%>IU2O*R'_4oD;)aU* /8,"y:;Q*V띠zC J:{롅ll]I#ezx2!ζv{Y/D]BXaabd3nVHTքmK -@-EVRl!J2ͧω`bprxkfC}m)3E-(P'b..BXΒ{A.  ǚd}(aC4 4ǃT$( /a0_K{[1qJf#JsߘeE$Nj_`KYsMkp-eÒυ:k2'D D;&6q1 t:;(t"6࿕cY""aDFjym " .靈n] 0RDg.g GiKP}n]ngxS֤zzUs cEP$/θqYRav h!s2G 6MKӿzaJK>JcyKbdpA O]|RȧoԠqְ󋫶cѡENݰBP5Ήfyr QwDj̕0ߓ_IPJZ< p.Q Ƿl,pm6Z;$mta9 ({`E U)Ú*Mp:>xW4fᵯr&䁯y`u]~gPNȸWZ)*˗B[LL"v9o1t*²Y qk86웏`j-+#{ d0hd \<&u8|x?cu9@YA3v9>Ʀ?H%Lh{VK_s"'l'a}pEƒյJ Mz9d>3!$B8rug(!iTT4L uc]PQn /WʲO#!b-4"-x&k* Ѕ %r>b5o ?aa:K%c#HG_}jxQMa kě(VMf:tvp}[rp֏10Fh2ޱ3Ţ EIKwֳIXF+!h^mPOU73Lr;)e!x*E M˻JI`lg9N ]և`BLLQ@x['Iu6g?=nqYFI'*@-SL lƂqIi7:?B?ڂPN nB\YBIx,*g(^jx4h `?0]֦6fC SjbX&A,᮸g[vz6ihڌc׀ͨRvBR٬H8%tp!2 "1%>r(* G6Z lb`!/v֣#ܯYc8aXhx t'}(kA,|ҥ T26$䝔76ws#_mW2F]!T  H#⹆#* b\`{CD{v luA+!䚁T"σZ'2*#[K"i֧ E>CY;Jz5~\k|~Z[l)7leQ·E !g\EHxU|_a35U^{'($ =F.Cqꄟ{"AȓtB?ӓULÅK, -Q(=~7mrAS~W !n_ABv1vHʲҸ7 wzXb+ZRPzYNG^]le}zѣo5 ߐ HRPqxӉWofY`nlDƔxxL eQpASRmKUk㗰?y|6j;(P1]rRlO܈\QYGkfo NpR]5'3dL*iH*  _57*6o,F3_1?"5xuS)M&&v7&rDn`YdJ}aé-N8w;xb}B!Xx F̘{ AΤ& i)TqEH%޵xj'esD\#=w5uI9\iXCIĚԒw':`p:2z:>Z `ʥ&1H`j5y4)+ض>r9MT5dz?0LmNU*AXge.?.ಃxhI^ΰ1׺ N;cᦨu$̬.h8[lqz9FT;y]B?=ƾ@['N"1!%PK aPBe.Lj_{@.V2 aX+͐)aNH!+MkVbaIJ 7I~;vV֏j/dqlwtQI}}0 !M-E6X%W)>dw=@aXuֆ$ SӬ ?Iu%Reky .j"N|߳rOʹ=q6Z@ 2z;wܾjƾa)>WB73P^Ukn8)p5ɒ4rv8lVH%m064FҴG g^xX "}t$=C9[rH Чe.=UŬA > oPdOj`Wt(+27V4&m= PŖڳb(<{k쓠۔Hjy!E7֨[â{" Xg;Ŭ#kD_qL(-$jVji(wp|x]FtghYG\s(4sG,_0d1saPBr"f[ϭp6ȔF~]i3a{X1T~y#Ja5Ҟ4?0Ȭl=T 3KVVM{,EDڊ<' Ǿ55hN1S`'7U``SncG4 O"6c`J-:4* v_PUA]?C?PڄʭpQiˆ^>FCg74f,o!g٭V;%0׈Vs`Ɵ%ZڼSQ΂KT-ha t#i'"6:VH@5!S,I$Cә=Hd% hΧR2ncyELMR9à-ޯ@E=icӊGiqX &-̎`&hToL5~9_LpQd=!E@6G6z>QBKcjD&6}Drl*,JFެJW`msu""af c34ȸpSU(ɏⱵ KC4UߊrbY$ صbjSBc$GѤ󋆡kA xo}醑jonuuo26Ύ:h٤P郞#|J NgFNL óJ 3mm%JL´:tFT0]|\w,-XD"@+а<">>BO,%¶lZ`$b* ߑVsZ dIR֚VġqϴM-i'W=7,Bqi%'re#M>z7Y4rC4fSZjWy̌h,f>D pTEth:Ei>_եO͈ `cE2<|T7 B7 {^*hkV.IOzK&Q7rz%B,(˄%b['b]l}3PV8zD֒VOӁ8LWaCaNm zYr4ޔUjV cb5Ԏ!8̮YO̩Fl'IP q]X |7b!+taĘ{~(q,-Y,iŚS-ZgՓ[d`; "`*0!3M"*]Z=C~$^ݚ(@‚1+ZTH$zXMU6M`>*M_R'Pٮ6uNDEt \riq;Sz[n_2IܫzؚDZ\i󃷃mn Mʈc"V`ҍ}W"KO_ cQLxXO޽ 1$Wj8B1kFaPZ;Q@'c,A`*M7e=JI <22 ٗ(3vZE"K:HT-  g36M%X"[XB):#lN@="A"8vQ@XATD㳾j]oBu!G*{Dga׈ã h[8xs7ɢ]ԑz>s 5??ckMHǢ^!"V6 ?pV3_U'BxZaCy԰k:TxSc3i08n/җ.채kC[MlZ^/٢V畈&XW& Rv0eeDq0` Ҷo"MTs;!UF C2m1&\%d)1 CE!gX[IHk v^$LʞbQN0 7G=rV)j5$YiGe$نC=ctFPjy]7l%STzB{D>dIpP K}l] :~V6gd0cn7Xyj6<޸oȟW . ?􍦢YJmXO{ ?anL6.MJm̈ޗLydxZ o EWdq<ӵ Iް= Z|_W:im1=$MF4)XIݔM!8(B1#H}DǓ{%GthL4,'{<^$[n z"5[cDF&xTPI9Xd E:;$ԍ/4ȠN8vXBKłx/O%%3\of+NSҾiET?l@spٵ9B)-fhGZwD=[lk.Ss`2PKKX5|ZeڶjʜT-8A 1n(NR2kԌ!WosVd= 9i| k>{ѭpA& v=cV@~HXљ(b_-F\*6li1*߱Zۨgs)_q`\t oQzi#b0nky6CV\w x9S*&Ӕ+(h0Rn,~xuuyTC6 FZte"z`̀ -ʇ^Xl#9 D؀=+D2ѰĮ$ưErfݝ%Ȍ8+L8ٛ0Ñ$][invJ\|[_`IvG4%hw:[9KK0Fd\BazU1`4b{ g룩{%.ͨ­ '#DsIjg4+&&a9N-Ef9;6M;x`V}’n 'm`|bD'B8<ߴ-u4u;jVuad{?+`Dll[&q !q"GÞz$hvU˻tZń@8ꯚ'ZhľX=)3DBó<3pVa5¿қER7[JXjn}Xpr@E yʵ6&sItS5FAWH$Z"%ΈCgŢ%H8qvV<քe~ȓiRCv`ףEy)q%'͈Fҩ1d5{6At7$[e'_& MEdDBt6aG |(&LE ,DY*Vp[Wʠ"RW5$--m5d/BHvu"ɵ ca*n!i`6r]t{F!)aS=9б.I"^lK~1`@VDb?$g2lB*NbGچuŹP#p6֒g+1Cڋգ"I$ dif(qtk&.H`YF!eTCDF.tdDaƆ;k۔7Rz*nf(KZCB)8+k|ߛtn7u$=*=cK<> o"LOM2`ՁIݤ5D§WH,):-~8/&QPp\?~_NBNݾ_/(&xv՞}Uqo~w>9޼|.os?D?+֓z7?̐r3ۚ$_SkyYYzFz3v| q]?^{nY>K]Ӄ.7x 7ɪz];^{Hݽ'׻߮GgWw_F+8h^WoN fyu1<]cū/_'boK,xTUy+os_\W5B F\m!u—.[};{\Tګ}>jތFFo_#QpA>j)^?[=^{zﺝw)pZw~=ܵ;|ɿH7n۝fcg*:Lrmg//~6 v=?Ў? g7ntyB7ۦp{ ѝ ~Z1S?oڼ_6I6鶣z9oHEuK?~yo 3W{#A\ 7=73.槟V.']\ْY胳-C` 1 /PKV rJPK n5:Q{F||5assets/indianbodo.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("IN", "IndianBodo") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.indianbodov5 .. "indianbodo_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indianbodov5 .. "indianbodo_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indianbodov5 .. "indianbodo_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.indianbodov5 .. "indianbodo_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.indianbodov5 .. "indianbodo_traits.trt.png" lng.statistic_alias = "indianbodo" lng.categories[si.language.category.FASTSWITCH] = "indianbodo" lng.categories[si.language.category.SUBTYPE] = "indianbodo" lng.categories[si.language.category.MIXINPUT] = "indianbodo" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "indianbodo" lng.categories[si.language.category.LAYOUT] = "indianbodo" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.indianbodov5 .. "indianbodo.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qeݙ &5assets/indianbodo_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main1 local input_type = si.input_type() template = "indian_soft_full_qwerty_international" alt_inputs = kb.devanagari_full_alt local s = sf.new_full_keyboard( "indianbodo_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indianbodov5 .. "indianbodo_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end for j = 2, 11 do local sk = s.softkeys["sk_" .. 1 .. "_" .. j] sk.on_click = full_on_click_commit end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q &5assets/indianbodo_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main2 local input_type = si.input_type() template = "indian_soft_full_qwerty_international" alt_inputs = kb.devanagari_full_alt local s = sf.new_full_keyboard( "indianbodo_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indianbodov5 .. "indianbodo_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end local sk_1_6 = s.softkeys["sk_1_6"] local sk_1_7 = s.softkeys["sk_1_7"] sk_1_6.on_click = full_on_click_commit sk_1_7.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qq M&5assets/indianbodo_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.hi_full_qwertz_main1 local script_inputs = kb.hi_full_qwertz_script1 local expand_long_press_inputs = kb.hi_full_qwertz_expand_long_press_input1 local input_type = si.input_type() template = "hindi_soft_qwertz_full_international" local s = sf.new_full_keyboard( "indianbodo_soft_qwertz1", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.indianbodov5 .. "indianbodo_soft_qwertz2.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "अ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q&5assets/indianbodo_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.hi_full_qwertz_main2 local script_inputs = kb.hi_full_qwertz_script2 local expand_long_press_inputs = kb.hi_full_qwertz_expand_long_press_input2 local input_type = si.input_type() template = "hindi_soft_qwertz2_full_international" local s = sf.new_full_keyboard( "indianbodo_soft_qwertz2", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.indianbodov5 .. "indianbodo_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "अ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end local sk_5_2 = s.softkeys["sk_5_2"] local sk_5_3 = s.softkeys["sk_5_3"] sk_5_2.on_click = full_on_click_commit sk_5_3.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q** 5assets/indianbodo_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0900 local z_code = 0x097f local A_code = 0x0900 local Z_code = 0x097f local zero_code = 0x0966 local nine_code = 0x096F local dot_code = si.u16code("।", 1) local special_lower_list = { "ऴ", "ॄ", "ग़", "ड़", "क़", "ऩ", "ॡ", "ऌ", "ढ़", "ऒ", "ऎ", "ऍ", "फ़", "ऎ", "ऍ", "ऎ", "ऍ", "ऋ", } local special_upper_list = { } local accent_letter_dictionary = { } local special_vowel_list = { "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", "ॅ", "ॉ", "अ", "आ", "इ", "ई", "उ", "ऊ", "ए", "ऐ", "ओ", "औ", "ऋ", } local special_semivowel_list = { "्", } local special_tone_list = { "ं", "ः", "ँ", } local special_double_tone_list = { "़", } local special_attach_list = { "्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", "ॅ", "ॉ", "ं", "ः", "ँ", "़", } local special_vowel_script_list = { "्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", } local special_vowel_script_dictionary = { [0x094D] = "अ", [0x093E] = "आ", [0x093F] = "इ", [0x0940] = "ई", [0x0941] = "उ", [0x0942] = "ऊ", [0x0947] = "ए", [0x0948] = "ऐ", [0x094B] = "ओ", [0x094C] = "औ", [0x0943] = "ऋ", } local special_consonant_list = { "क", "ख", "ग", "घ", "च", "छ", "ज", "झ", "ट", "ठ", "ड", "ढ", "ण", "त", "थ", "द", "ध", "न", "प", "फ", "ब", "भ", "म", "य", "र", "ल", "व", "श", "ष", "स", "ह", "क्ष", "त्र", "ङ", "ञ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("।", 1)] = "।", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_double_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif not traits.is_special_attach_case(code) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_special_semivowel_case(code) and traits.is_contain_multi_case(last_series_precise_input) then return last_series_precise_input else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(3) if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.get_normal_script_main_character(script) local code = si.u16code(script, 1) if traits.is_special_vowel_script_case(code) then return special_vowel_script_dictionary[code] end return script; end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if traits.is_special_semivowel_case(code_se) and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_vowel_tone_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true elseif traits.is_special_tone_case(c) then return true end end return false end function traits.is_contain_double_tone_case(str) local double_tone_num = 0 local code = si.u16code(str, 1) for c in si.u16_iter(str) do if traits.is_special_double_tone_case(c) then double_tone_num = double_tone_num + 1 end end if double_tone_num >= 2 or traits.is_special_double_tone_case(code) then return true end return false end function traits.is_contain_multi_case(str) local str_size = si.get_string_length(str) if str_size >= 2 then return true end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_script_case(c) for i, v in ipairs(special_vowel_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_tone_case(c) for i, v in ipairs(special_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_double_tone_case(c) for i, v in ipairs(special_double_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_attach_case(c) for i, v in ipairs(special_attach_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.is_upper_case(c) local char_code = c return ((char_code >= A_code and char_code <= Z_code) and not traits.is_num_character(c)) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return ((char_code >= a_code and char_code <= z_code) and not traits.is_num_character(c)) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if c == dot_code then return false end if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) if c == dot_code then return false end local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif traits.is_num_character(c) then return false elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) if c == dot_code then return false end return ct.is_india_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) if c == dot_code then return false end return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) if c == dot_code then return false end return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_punctuation_character(c) if c == dot_code then return true end return false end return traits PK n5:QLH]]5assets/indiandogri.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("IN", "IndianDogri") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.indiandogriv5 .. "indiandogri_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indiandogriv5 .. "indiandogri_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indiandogriv5 .. "indiandogri_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.indiandogriv5 .. "indiandogri_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.indiandogriv5 .. "indiandogri_traits.trt.png" lng.statistic_alias = "indiandogri" lng.categories[si.language.category.FASTSWITCH] = "indiandogri" lng.categories[si.language.category.SUBTYPE] = "indiandogri" lng.categories[si.language.category.MIXINPUT] = "indiandogri" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "indiandogri" lng.categories[si.language.category.LAYOUT] = "indiandogri" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.indiandogriv5 .. "indiandogri.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QO '5assets/indiandogri_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main1 local input_type = si.input_type() template = "indian_soft_full_qwerty_international" alt_inputs = kb.devanagari_full_alt local s = sf.new_full_keyboard( "indiandogri_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indiandogriv5 .. "indiandogri_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end for j = 2, 11 do local sk = s.softkeys["sk_" .. 1 .. "_" .. j] sk.on_click = full_on_click_commit end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q74 '5assets/indiandogri_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main2 local input_type = si.input_type() template = "indian_soft_full_qwerty_international" alt_inputs = kb.devanagari_full_alt local s = sf.new_full_keyboard( "indiandogri_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indiandogriv5 .. "indiandogri_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end local sk_1_6 = s.softkeys["sk_1_6"] local sk_1_7 = s.softkeys["sk_1_7"] sk_1_6.on_click = full_on_click_commit sk_1_7.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q   '5assets/indiandogri_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.hi_full_qwertz_main1 local script_inputs = kb.hi_full_qwertz_script1 local expand_long_press_inputs = kb.hi_full_qwertz_expand_long_press_input1 local input_type = si.input_type() template = "hindi_soft_qwertz_full_international" local s = sf.new_full_keyboard( "indiandogri_soft_qwertz1", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.indiandogriv5 .. "indiandogri_soft_qwertz2.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "अ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q|+ '5assets/indiandogri_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.hi_full_qwertz_main2 local script_inputs = kb.hi_full_qwertz_script2 local expand_long_press_inputs = kb.hi_full_qwertz_expand_long_press_input2 local input_type = si.input_type() template = "hindi_soft_qwertz2_full_international" local s = sf.new_full_keyboard( "indiandogri_soft_qwertz2", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.indiandogriv5 .. "indiandogri_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "अ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end local sk_5_2 = s.softkeys["sk_5_2"] local sk_5_3 = s.softkeys["sk_5_3"] sk_5_2.on_click = full_on_click_commit sk_5_3.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q**!5assets/indiandogri_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0900 local z_code = 0x097f local A_code = 0x0900 local Z_code = 0x097f local zero_code = 0x0966 local nine_code = 0x096F local dot_code = si.u16code("।", 1) local special_lower_list = { "ऴ", "ॄ", "ग़", "ड़", "क़", "ऩ", "ॡ", "ऌ", "ढ़", "ऒ", "ऎ", "ऍ", "फ़", "ऎ", "ऍ", "ऎ", "ऍ", "ऋ", } local special_upper_list = { } local accent_letter_dictionary = { } local special_vowel_list = { "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", "ॅ", "ॉ", "अ", "आ", "इ", "ई", "उ", "ऊ", "ए", "ऐ", "ओ", "औ", "ऋ", } local special_semivowel_list = { "्", } local special_tone_list = { "ं", "ः", "ँ", } local special_double_tone_list = { "़", } local special_attach_list = { "्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", "ॅ", "ॉ", "ं", "ः", "ँ", "़", } local special_vowel_script_list = { "्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", } local special_vowel_script_dictionary = { [0x094D] = "अ", [0x093E] = "आ", [0x093F] = "इ", [0x0940] = "ई", [0x0941] = "उ", [0x0942] = "ऊ", [0x0947] = "ए", [0x0948] = "ऐ", [0x094B] = "ओ", [0x094C] = "औ", [0x0943] = "ऋ", } local special_consonant_list = { "क", "ख", "ग", "घ", "च", "छ", "ज", "झ", "ट", "ठ", "ड", "ढ", "ण", "त", "थ", "द", "ध", "न", "प", "फ", "ब", "भ", "म", "य", "र", "ल", "व", "श", "ष", "स", "ह", "क्ष", "त्र", "ङ", "ञ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("।", 1)] = "।", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_double_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif not traits.is_special_attach_case(code) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_special_semivowel_case(code) and traits.is_contain_multi_case(last_series_precise_input) then return last_series_precise_input else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(3) if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.get_normal_script_main_character(script) local code = si.u16code(script, 1) if traits.is_special_vowel_script_case(code) then return special_vowel_script_dictionary[code] end return script; end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if traits.is_special_semivowel_case(code_se) and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_vowel_tone_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true elseif traits.is_special_tone_case(c) then return true end end return false end function traits.is_contain_double_tone_case(str) local double_tone_num = 0 local code = si.u16code(str, 1) for c in si.u16_iter(str) do if traits.is_special_double_tone_case(c) then double_tone_num = double_tone_num + 1 end end if double_tone_num >= 2 or traits.is_special_double_tone_case(code) then return true end return false end function traits.is_contain_multi_case(str) local str_size = si.get_string_length(str) if str_size >= 2 then return true end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_script_case(c) for i, v in ipairs(special_vowel_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_tone_case(c) for i, v in ipairs(special_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_double_tone_case(c) for i, v in ipairs(special_double_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_attach_case(c) for i, v in ipairs(special_attach_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.is_upper_case(c) local char_code = c return ((char_code >= A_code and char_code <= Z_code) and not traits.is_num_character(c)) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return ((char_code >= a_code and char_code <= z_code) and not traits.is_num_character(c)) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if c == dot_code then return false end if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) if c == dot_code then return false end local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif traits.is_num_character(c) then return false elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) if c == dot_code then return false end return ct.is_india_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) if c == dot_code then return false end return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) if c == dot_code then return false end return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_punctuation_character(c) if c == dot_code then return true end return false end return traits PK n5:Q(05assets/indiankashmiri.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("IN", "IndianKashmiri") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.indiankashmiriv5 .. "indiankashmiri_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indiankashmiriv5 .. "indiankashmiri_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indiankashmiriv5 .. "indiankashmiri_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.indiankashmiriv5 .. "indiankashmiri_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.indiankashmiriv5 .. "indiankashmiri_traits.trt.png" lng.statistic_alias = "indiankashmiri" lng.categories[si.language.category.FASTSWITCH] = "indiankashmiri" lng.categories[si.language.category.SUBTYPE] = "indiankashmiri" lng.categories[si.language.category.MIXINPUT] = "indiankashmiri" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "indiankashmiri" lng.categories[si.language.category.LAYOUT] = "indiankashmiri" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.indiankashmiriv5 .. "indiankashmiri.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qn\ *5assets/indiankashmiri_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main1 local input_type = si.input_type() template = "indian_soft_full_qwerty_international" alt_inputs = kb.devanagari_full_alt local s = sf.new_full_keyboard( "indiankashmiri_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indiankashmiriv5 .. "indiankashmiri_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end for j = 2, 11 do local sk = s.softkeys["sk_" .. 1 .. "_" .. j] sk.on_click = full_on_click_commit end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QO *5assets/indiankashmiri_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main2 local input_type = si.input_type() template = "indian_soft_full_qwerty_international" alt_inputs = kb.devanagari_full_alt local s = sf.new_full_keyboard( "indiankashmiri_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indiankashmiriv5 .. "indiankashmiri_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end local sk_1_6 = s.softkeys["sk_1_6"] local sk_1_7 = s.softkeys["sk_1_7"] sk_1_6.on_click = full_on_click_commit sk_1_7.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QY*5assets/indiankashmiri_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.hi_full_qwertz_main1 local script_inputs = kb.hi_full_qwertz_script1 local expand_long_press_inputs = kb.hi_full_qwertz_expand_long_press_input1 local input_type = si.input_type() template = "hindi_soft_qwertz_full_international" local s = sf.new_full_keyboard( "indiankashmiri_soft_qwertz1", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.indiankashmiriv5 .. "indiankashmiri_soft_qwertz2.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "अ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qb!*5assets/indiankashmiri_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.hi_full_qwertz_main2 local script_inputs = kb.hi_full_qwertz_script2 local expand_long_press_inputs = kb.hi_full_qwertz_expand_long_press_input2 local input_type = si.input_type() template = "hindi_soft_qwertz2_full_international" local s = sf.new_full_keyboard( "indiankashmiri_soft_qwertz2", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.indiankashmiriv5 .. "indiankashmiri_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "अ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end local sk_5_2 = s.softkeys["sk_5_2"] local sk_5_3 = s.softkeys["sk_5_3"] sk_5_2.on_click = full_on_click_commit sk_5_3.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q**$5assets/indiankashmiri_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0900 local z_code = 0x097f local A_code = 0x0900 local Z_code = 0x097f local zero_code = 0x0966 local nine_code = 0x096F local dot_code = si.u16code("।", 1) local special_lower_list = { "ऴ", "ॄ", "ग़", "ड़", "क़", "ऩ", "ॡ", "ऌ", "ढ़", "ऒ", "ऎ", "ऍ", "फ़", "ऎ", "ऍ", "ऎ", "ऍ", "ऋ", } local special_upper_list = { } local accent_letter_dictionary = { } local special_vowel_list = { "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", "ॅ", "ॉ", "अ", "आ", "इ", "ई", "उ", "ऊ", "ए", "ऐ", "ओ", "औ", "ऋ", } local special_semivowel_list = { "्", } local special_tone_list = { "ं", "ः", "ँ", } local special_double_tone_list = { "़", } local special_attach_list = { "्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", "ॅ", "ॉ", "ं", "ः", "ँ", "़", } local special_vowel_script_list = { "्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", } local special_vowel_script_dictionary = { [0x094D] = "अ", [0x093E] = "आ", [0x093F] = "इ", [0x0940] = "ई", [0x0941] = "उ", [0x0942] = "ऊ", [0x0947] = "ए", [0x0948] = "ऐ", [0x094B] = "ओ", [0x094C] = "औ", [0x0943] = "ऋ", } local special_consonant_list = { "क", "ख", "ग", "घ", "च", "छ", "ज", "झ", "ट", "ठ", "ड", "ढ", "ण", "त", "थ", "द", "ध", "न", "प", "फ", "ब", "भ", "म", "य", "र", "ल", "व", "श", "ष", "स", "ह", "क्ष", "त्र", "ङ", "ञ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("।", 1)] = "।", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_double_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif not traits.is_special_attach_case(code) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_special_semivowel_case(code) and traits.is_contain_multi_case(last_series_precise_input) then return last_series_precise_input else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(3) if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.get_normal_script_main_character(script) local code = si.u16code(script, 1) if traits.is_special_vowel_script_case(code) then return special_vowel_script_dictionary[code] end return script; end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if traits.is_special_semivowel_case(code_se) and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_vowel_tone_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true elseif traits.is_special_tone_case(c) then return true end end return false end function traits.is_contain_double_tone_case(str) local double_tone_num = 0 local code = si.u16code(str, 1) for c in si.u16_iter(str) do if traits.is_special_double_tone_case(c) then double_tone_num = double_tone_num + 1 end end if double_tone_num >= 2 or traits.is_special_double_tone_case(code) then return true end return false end function traits.is_contain_multi_case(str) local str_size = si.get_string_length(str) if str_size >= 2 then return true end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_script_case(c) for i, v in ipairs(special_vowel_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_tone_case(c) for i, v in ipairs(special_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_double_tone_case(c) for i, v in ipairs(special_double_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_attach_case(c) for i, v in ipairs(special_attach_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.is_upper_case(c) local char_code = c return ((char_code >= A_code and char_code <= Z_code) and not traits.is_num_character(c)) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return ((char_code >= a_code and char_code <= z_code) and not traits.is_num_character(c)) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if c == dot_code then return false end if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) if c == dot_code then return false end local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif traits.is_num_character(c) then return false elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) if c == dot_code then return false end return ct.is_india_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) if c == dot_code then return false end return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) if c == dot_code then return false end return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_punctuation_character(c) if c == dot_code then return true end return false end return traits PK n5:QB 5assets/indiankonkani.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("IN", "IndianKonkani") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.indiankonkaniv5 .. "indiankonkani_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indiankonkaniv5 .. "indiankonkani_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indiankonkaniv5 .. "indiankonkani_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.indiankonkaniv5 .. "indiankonkani_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.indiankonkaniv5 .. "indiankonkani_traits.trt.png" lng.statistic_alias = "indiankonkani" lng.categories[si.language.category.FASTSWITCH] = "indiankonkani" lng.categories[si.language.category.SUBTYPE] = "indiankonkani" lng.categories[si.language.category.MIXINPUT] = "indiankonkani" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "indiankonkani" lng.categories[si.language.category.LAYOUT] = "indiankonkani" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.indiankonkaniv5 .. "indiankonkani.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qq< )5assets/indiankonkani_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main1 local input_type = si.input_type() template = "indian_soft_full_qwerty_international" alt_inputs = kb.devanagari_full_alt local s = sf.new_full_keyboard( "indiankonkani_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indiankonkaniv5 .. "indiankonkani_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end for j = 2, 11 do local sk = s.softkeys["sk_" .. 1 .. "_" .. j] sk.on_click = full_on_click_commit end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q s )5assets/indiankonkani_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main2 local input_type = si.input_type() template = "indian_soft_full_qwerty_international" alt_inputs = kb.devanagari_full_alt local s = sf.new_full_keyboard( "indiankonkani_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indiankonkaniv5 .. "indiankonkani_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end local sk_1_6 = s.softkeys["sk_1_6"] local sk_1_7 = s.softkeys["sk_1_7"] sk_1_6.on_click = full_on_click_commit sk_1_7.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q ])5assets/indiankonkani_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.hi_full_qwertz_main1 local script_inputs = kb.hi_full_qwertz_script1 local expand_long_press_inputs = kb.hi_full_qwertz_expand_long_press_input1 local input_type = si.input_type() template = "hindi_soft_qwertz_full_international" local s = sf.new_full_keyboard( "indiankonkani_soft_qwertz1", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.indiankonkaniv5 .. "indiankonkani_soft_qwertz2.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "अ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QP)5assets/indiankonkani_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.hi_full_qwertz_main2 local script_inputs = kb.hi_full_qwertz_script2 local expand_long_press_inputs = kb.hi_full_qwertz_expand_long_press_input2 local input_type = si.input_type() template = "hindi_soft_qwertz2_full_international" local s = sf.new_full_keyboard( "indiankonkani_soft_qwertz2", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.indiankonkaniv5 .. "indiankonkani_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "अ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end local sk_5_2 = s.softkeys["sk_5_2"] local sk_5_3 = s.softkeys["sk_5_3"] sk_5_2.on_click = full_on_click_commit sk_5_3.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q**#5assets/indiankonkani_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0900 local z_code = 0x097f local A_code = 0x0900 local Z_code = 0x097f local zero_code = 0x0966 local nine_code = 0x096F local dot_code = si.u16code("।", 1) local special_lower_list = { "ऴ", "ॄ", "ग़", "ड़", "क़", "ऩ", "ॡ", "ऌ", "ढ़", "ऒ", "ऎ", "ऍ", "फ़", "ऎ", "ऍ", "ऎ", "ऍ", "ऋ", } local special_upper_list = { } local accent_letter_dictionary = { } local special_vowel_list = { "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", "ॅ", "ॉ", "अ", "आ", "इ", "ई", "उ", "ऊ", "ए", "ऐ", "ओ", "औ", "ऋ", } local special_semivowel_list = { "्", } local special_tone_list = { "ं", "ः", "ँ", } local special_double_tone_list = { "़", } local special_attach_list = { "्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", "ॅ", "ॉ", "ं", "ः", "ँ", "़", } local special_vowel_script_list = { "्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", } local special_vowel_script_dictionary = { [0x094D] = "अ", [0x093E] = "आ", [0x093F] = "इ", [0x0940] = "ई", [0x0941] = "उ", [0x0942] = "ऊ", [0x0947] = "ए", [0x0948] = "ऐ", [0x094B] = "ओ", [0x094C] = "औ", [0x0943] = "ऋ", } local special_consonant_list = { "क", "ख", "ग", "घ", "च", "छ", "ज", "झ", "ट", "ठ", "ड", "ढ", "ण", "त", "थ", "द", "ध", "न", "प", "फ", "ब", "भ", "म", "य", "र", "ल", "व", "श", "ष", "स", "ह", "क्ष", "त्र", "ङ", "ञ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("।", 1)] = "।", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_double_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif not traits.is_special_attach_case(code) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_special_semivowel_case(code) and traits.is_contain_multi_case(last_series_precise_input) then return last_series_precise_input else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(3) if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.get_normal_script_main_character(script) local code = si.u16code(script, 1) if traits.is_special_vowel_script_case(code) then return special_vowel_script_dictionary[code] end return script; end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if traits.is_special_semivowel_case(code_se) and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_vowel_tone_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true elseif traits.is_special_tone_case(c) then return true end end return false end function traits.is_contain_double_tone_case(str) local double_tone_num = 0 local code = si.u16code(str, 1) for c in si.u16_iter(str) do if traits.is_special_double_tone_case(c) then double_tone_num = double_tone_num + 1 end end if double_tone_num >= 2 or traits.is_special_double_tone_case(code) then return true end return false end function traits.is_contain_multi_case(str) local str_size = si.get_string_length(str) if str_size >= 2 then return true end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_script_case(c) for i, v in ipairs(special_vowel_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_tone_case(c) for i, v in ipairs(special_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_double_tone_case(c) for i, v in ipairs(special_double_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_attach_case(c) for i, v in ipairs(special_attach_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.is_upper_case(c) local char_code = c return ((char_code >= A_code and char_code <= Z_code) and not traits.is_num_character(c)) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return ((char_code >= a_code and char_code <= z_code) and not traits.is_num_character(c)) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if c == dot_code then return false end if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) if c == dot_code then return false end local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif traits.is_num_character(c) then return false elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) if c == dot_code then return false end return ct.is_india_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) if c == dot_code then return false end return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) if c == dot_code then return false end return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_punctuation_character(c) if c == dot_code then return true end return false end return traits PK n5:Qnb05assets/indiankonkanikn.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("KO", "Konkanikn") local packagename = pkg.indiankonkaniknv5 if packagename == nil then packagename = "com.cootek.smartinputv5.language.v5.indiankonkanikn:" end lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.english .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = packagename .. "indiankonkanikn_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = packagename .. "indiankonkanikn_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = packagename .. "indiankonkanikn_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = packagename .. "indiankonkanikn_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = packagename .. "indiankonkanikn_traits.trt.png" lng.statistic_alias = "indiankonkanikn" lng.categories[si.language.category.FASTSWITCH] = "indiankonkanikn" lng.categories[si.language.category.SUBTYPE] = "indiankonkanikn" lng.categories[si.language.category.MIXINPUT] = "indiankonkanikn" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "indiankonkanikn" lng.categories[si.language.category.LAYOUT] = "indiankonkanikn" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = packagename .. "indiankonkanikn.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qe\j +5assets/indiankonkanikn_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs local alt_inputs = kb.kannada_full_alt local main_inputs = kb.kannada_full_main1 local input_type = si.input_type() template = "kannada_soft_full_international" local s = sf.new_full_keyboard( "indiankonkanikn_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indiankonkaniknv5 .. "indiankonkanikn_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q 7}T T +5assets/indiankonkanikn_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs local alt_inputs = kb.kannada_full_alt local main_inputs = kb.kannada_full_main2 local input_type = si.input_type() template = "kannada_soft_full_international" local s = sf.new_full_keyboard( "indiankonkanikn_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indiankonkaniknv5 .. "indiankonkanikn_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end for i = 2, 7 do local sk = s.softkeys["sk_1_" .. i] sk.on_long_press_once = nil sk.on_click = function() si.input_string(sk.main_input, false) end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qy+5assets/indiankonkanikn_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.kannada_full_qwertz_main local script_inputs = kb.kannada_full_qwertz_script local expand_long_press_inputs = kb.kannada_full_qwertz_expand_long_press_input local input_type = si.input_type() template = "kannada_soft_qwertz_full_international" local s = sf.new_full_keyboard( "indiankonkanikn_soft_qwertz1", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.indiankonkaniknv5 .. "indiankonkanikn_soft_qwertz2.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_zwj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q(II+5assets/indiankonkanikn_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.kannada_full_qwertz_main2 local script_inputs = kb.kannada_full_qwertz_script2 local expand_long_press_inputs = kb.kannada_full_qwertz_expand_long_press_input2 local input_type = si.input_type() template = "kannada_soft_qwertz2_full_international" local s = sf.new_full_keyboard( "indiankonkanikn_soft_qwertz2", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.indiankonkaniknv5 .. "indiankonkanikn_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end for j = 1, 10 do local sk = s.softkeys["sk_" .. 3 .. "_" .. j] sk.on_click = full_on_click_commit end local sk_5_3 = s.softkeys["sk_5_3"] local sk_5_4 = s.softkeys["sk_5_4"] local sk_5_5 = s.softkeys["sk_5_5"] sk_5_3.on_click = full_on_click_commit sk_5_4.on_click = full_on_click_commit sk_5_5.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_zwj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q?q&q&%5assets/indiankonkanikn_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0c80 local z_code = 0x0cff local A_code = 0x0c80 local Z_code = 0x0cff local zero_code = 0x0ce6 local nine_code = 0x0ceF local special_semivowel_code = si.u16code("್", 1) local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } local special_semivowel_list = { "್", } local special_vowel_list = { "ಾ", "ಿ", "ೀ", "ು", "ೂ", "ೃ", "ೆ", "ೇ", "ೈ", "ೊ", "ೋ", "ೌ", "ಂ", "ಃ", "಼", } local special_consonant_list = { "ಕ", "ಖ", "ಗ", "ಘ", "ಙ", "ಚ", "ಛ", "ಜ", "ಝ", "ಞ", "ಟ", "ಠ", "ಡ", "ಢ", "ಣ", "ತ", "ಥ", "ದ", "ಧ", "ನ", "ಪ", "ಫ", "ಬ", "ಭ", "ಮ", "ಯ", "ರ", "ಲ", "ವ", "ಶ", "ಷ", "ಸ", "ಹ", "ಳ", "ರ" } local special_script_list = { "್", "ಾ", "ಿ", "ೀ", "ು", "ೂ", "ೃ", "ೆ", "ೇ", "ೈ", "ೊ", "ೋ", "ೌ", "ಂ", "ಃ", "಼", } local special_script_dictionary = { [si.u16code("್", 1)] = "ಅ", [si.u16code("ಾ", 1)] = "ಆ", [si.u16code("ಿ", 1)] = "ಇ", [si.u16code("ೀ", 1)] = "ಈ", [si.u16code("ು", 1)] = "ಉ", [si.u16code("ೂ", 1)] = "ಊ", [si.u16code("ೃ", 1)] = "ಋ", [si.u16code("ೆ", 1)] = "ಎ", [si.u16code("ೇ", 1)] = "ಏ", [si.u16code("ೈ", 1)] = "ಐ", [si.u16code("ೊ", 1)] = "ಒ", [si.u16code("ೋ", 1)] = "ಓ", [si.u16code("ೌ", 1)] = "ಔ", [si.u16code("ಂ", 1)] = "ಂ", [si.u16code("ಃ", 1)] = "ಃ", [si.u16code("಼", 1)] = "಼", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(5) if not si.is_empty(last_text_from_user_input) then if traits.is_contain_triple_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local string_len = si.get_string_length(last_text_from_user_input) if string_len > 3 then last_text_from_user_input = _G.string.sub(last_text_from_user_input, string_len-2, string_len) end if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.get_normal_script_main_character(script) local string_len = si.get_string_length(script) if string_len > 1 then return script end local code = si.u16code(script, 1) if traits.is_special_script_case(code) then return special_script_dictionary[code] end return script; end function traits.is_contain_vowel_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true end end return false end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if code_se == special_semivowel_code and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_triple_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 5 then return false end local code_se = si.u16code(str, 2) local code_fo = si.u16code(str, 4) if code_se == special_semivowel_code and code_fo == special_semivowel_code then local code_fr = si.u16code(str, 1) local code_th = si.u16code(str, 3) local code_fi = si.u16code(str, 5) if traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) and traits.is_special_consonant_case(code_fi) then return true end return false end return false end function traits.is_special_script_case(c) for i, v in ipairs(special_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_kannada_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_kannada_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_kannada_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_kannada_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Qw@(~~5assets/indianmaithili.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("IN", "IndianMaithili") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.indianmaithiliv5 .. "indianmaithili_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indianmaithiliv5 .. "indianmaithili_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.indianmaithiliv5 .. "indianmaithili_traits.trt.png" lng.statistic_alias = "indianmaithili" lng.categories[si.language.category.FASTSWITCH] = "indianmaithili" lng.categories[si.language.category.SUBTYPE] = "indianmaithili" lng.categories[si.language.category.MIXINPUT] = "indianmaithili" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "indianmaithili" lng.categories[si.language.category.LAYOUT] = "indianmaithili" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.indianmaithiliv5 .. "indianmaithili.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qיq]i i *5assets/indianmaithili_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main1 local input_type = si.input_type() template = "indian_soft_full_qwerty_international" alt_inputs = kb.devanagari_full_alt local s = sf.new_full_keyboard( "indianmaithili_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indianmaithiliv5 .. "indianmaithili_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q),Yn n *5assets/indianmaithili_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main2 local input_type = si.input_type() template = "indian_soft_full_qwerty_international" alt_inputs = kb.devanagari_full_alt local s = sf.new_full_keyboard( "indianmaithili_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indianmaithiliv5 .. "indianmaithili_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q:$5assets/indianmaithili_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0900 local z_code = 0x097f local A_code = 0x0900 local Z_code = 0x097f local special_lower_list = { "ऴ", "ॄ", "ग़", "ड़", "क़", "ऩ", "ॡ", "ऌ", "ढ़", "ऒ", "ऎ", "ऍ", "फ़", "ऎ", "ऍ", "ऎ", "ऍ", "ऋ", } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_india_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Q-К5assets/indianmanipuri.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("IN", "IndianManipuri") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.indianmanipuriv5 .. "indianmanipuri_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indianmanipuriv5 .. "indianmanipuri_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indianmanipuriv5 .. "indianmanipuri_soft_azerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.indianmanipuriv5 .. "indianmanipuri_soft_azerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.indianmanipuriv5 .. "indianmanipuri_traits.trt.png" lng.statistic_alias = "indianmanipuri" lng.categories[si.language.category.FASTSWITCH] = "indianmanipuri" lng.categories[si.language.category.SUBTYPE] = "indianmanipuri" lng.categories[si.language.category.MIXINPUT] = "indianmanipuri" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "indianmanipuri" lng.categories[si.language.category.LAYOUT] = "indianmanipuri" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.indianmanipuriv5 .. "indianmanipuri.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q}lJJ*5assets/indianmanipuri_soft_azerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.bn_full_azerty_main1 local script_inputs = kb.bn_full_azerty_script1 local expand_long_press_inputs = kb.bn_full_azerty_expand_long_press_input1 local input_type = si.input_type() template = "indianmanipuri_soft_full_azerty1_international" local s = sf.new_full_keyboard( "indianmanipuri_soft_azerty", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.indianmanipuriv5 .. "indianmanipuri_soft_azerty2.sur.png" s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "অ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end function on_long_press(sk) if si.handwrite_mask_visible() then return sk.on_click(sk) end local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local key1 = si.new_softkey() if sk.script_title and sk.script_title ~= "" then key1.main_title = sk.script_title key1.main_input = sk.script_title else key1.main_title = sk.main_title key1.main_input = sk.main_title end key1.on_click = function(sk_1) local main_input_len = si.get_string_length(sk_1.main_input) if main_input_len > 1 then si.input_series_precise(sk_1.main_input, "", "", false, 0) else si.input_precise(sk_1.main_input, "", "", false) end end sur.softkeys[1] = key1 si.popup_surface(sur) end local sk_5_7 = s.softkeys["sk_5_7"] sk_5_7.on_long_press_once = on_long_press s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_bengali s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_bengali s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q*5assets/indianmanipuri_soft_azerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.bn_full_azerty_main2 local script_inputs = kb.bn_full_azerty_script2 local expand_long_press_inputs = kb.bn_full_azerty_expand_long_press_input2 local input_type = si.input_type() template = "indianmanipuri_soft_full_azerty2_international" local s = sf.new_full_keyboard( "indianmanipuri_soft_azerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.indianmanipuriv5 .. "indianmanipuri_soft_azerty1.sur.png" s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "অ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end for j = 1, 10 do local sk = s.softkeys["sk_" .. 1 .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end for j = 2, 7 do local sk = s.softkeys["sk_" .. 5 .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end local sk_2_1 = s.softkeys["sk_2_1"] sk_2_1.on_click = full_on_click sk_2_1.support_expand_char_type = si.expand_char_type.EXPAND_INPUT local sk_2_2 = s.softkeys["sk_2_2"] sk_2_2.on_click = full_on_click sk_2_2.support_expand_char_type = si.expand_char_type.EXPAND_INPUT function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end for i = 3, 4 do for j = 1, 10 do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click_commit end end for j = 3, 10 do local sk = s.softkeys["sk_" .. 2 .. "_" .. j] sk.on_click = full_on_click_commit end local sk_5_1 = s.softkeys["sk_5_1"] sk_5_1.on_click = full_on_click_commit function on_long_press(sk) if si.handwrite_mask_visible() then return sk.on_click(sk) end local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local key1 = si.new_softkey() if sk.script_title and sk.script_title ~= "" then key1.main_title = sk.script_title key1.main_input = sk.script_title else key1.main_title = sk.main_title key1.main_input = sk.main_title end key1.on_click = function(sk_1) local main_input_len = si.get_string_length(sk_1.main_input) if main_input_len > 1 then si.input_series_precise(sk_1.main_input, "", "", false, 0) else si.input_precise(sk_1.main_input, "", "", false) end end sur.softkeys[1] = key1 si.popup_surface(sur) end local sk_5_7 = s.softkeys["sk_5_7"] sk_5_7.on_long_press_once = on_long_press s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_bengali s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_bengali s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q W W *5assets/indianmanipuri_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.manipuri_full_main1 local input_type = si.input_type() template = "indianmanipuri_soft_full_international" alt_inputs = kb.manipuri_full_alt local s = sf.new_full_keyboard( "indianmanipuri_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indianmanipuriv5 .. "indianmanipuri_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_bn s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_bn s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QA_ _ *5assets/indianmanipuri_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.manipuri_full_main2 local input_type = si.input_type() template = "indianmanipuri_soft_full_international" alt_inputs = kb.manipuri_full_alt local s = sf.new_full_keyboard( "indianmanipuri_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indianmanipuriv5 .. "indianmanipuri_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_bn s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_bn s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q{i1i1$5assets/indianmanipuri_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0900 local z_code = 0x09ff local A_code = 0x0900 local Z_code = 0x09ff local dot_code = si.u16code("।", 1) local special_semivowel_code = si.u16code("্", 1) local special_lower_list = { "ऴ", "ॄ", "ग़", "ड़", "क़", "ऩ", "ॡ", "ऌ", "ढ़", "ऒ", "ऎ", "ऍ", "फ़", "ऎ", "ऍ", "ऎ", "ऍ", "ऋ", "ৌ", "ৈ", "া", "ৗ", "ৃ", "ব", "হ", "গ", "দ", "জ", "ড", "়", "ো", "ে", "্", "ি", "ু", "প", "র", "ক", "ত", "চ", "ট", "ং", "ম", "ন", "ঽ", "ল", "স", "য", "ষ", "ঃ", "ঔ", "ঐ", "আ", "ঈ", "ঊ", "ভ", "ঙ", "য", "ধ", "ঝ", "ঢ", "ঞ", "ও", "এ", "অ", "ই", "উ", "ফ", "র", "ক", "থ", "ছ", "ঠ", "ঁ", "ণ", "ন", "ঽ", "ল", "শ", "য়", "ষ", "ঃ", } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("।", 1)] = "।", } local special_vowel_list = { "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ", "ৃ", "অ", "আ", "ই", "ঈ", "উ", "ঊ", "এ", "ঐ", "ও", "ঔ", "ঋ", } local special_semivowel_list = { "্", } local special_tone_list = { "ঃ", "ং", "়", "ঁ", } local special_consonant_list = { "ক", "খ", "গ", "ঘ", "ঙ", "চ", "ছ", "জ", "ঝ", "ঞ", "ট", "ঠ", "ড", "ঢ", "ণ", "ত", "থ", "দ", "ধ", "ন", "প", "ফ", "ব", "ভ", "ম", "য", "র", "ল", "শ", "ষ", "স", "হ", "ড়", "ঢ়", "য়", } local special_attach_list = { "্", "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ", "ৃ", "ঃ", "ং", "়", "ঁ", } local special_script_list = { "্", "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ", "ঃ", "ং", "়", "ঁ", "ৃ", } local special_script_dictionary = { [si.u16code("্", 1)] = "অ", [si.u16code("া", 1)] = "আ", [si.u16code("ি", 1)] = "ই", [si.u16code("ী", 1)] = "ঈ", [si.u16code("ু", 1)] = "উ", [si.u16code("ূ", 1)] = "ঊ", [si.u16code("ে", 1)] = "এ", [si.u16code("ৈ", 1)] = "ঐ", [si.u16code("ো", 1)] = "ও", [si.u16code("ৌ", 1)] = "ঔ", [si.u16code("ঃ", 1)] = "ঃ", [si.u16code("ং", 1)] = "ং", [si.u16code("়", 1)] = "়", [si.u16code("ঁ", 1)] = "ঁ", [si.u16code("ৃ", 1)] = "ঋ", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif not traits.is_special_attach_case(code) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_last_series_input_special_group_case() then return traits.get_normal_script_main_character(script) elseif traits.is_special_semivowel_case(code) and traits.is_contain_multi_case(last_series_precise_input) then return last_series_precise_input else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(5) if not si.is_empty(last_text_from_user_input) then if traits.is_contain_triple_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local string_len = si.get_string_length(last_text_from_user_input) if string_len > 3 then last_text_from_user_input = _G.string.sub(last_text_from_user_input, string_len-2, string_len) end if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.get_normal_script_main_character(script) local string_len = si.get_string_length(script) if string_len > 1 then return script end local code = si.u16code(script, 1) if traits.is_special_script_case(code) then return special_script_dictionary[code] end return script; end function traits.is_contain_vowel_tone_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true elseif traits.is_special_tone_case(c) then return true end end return false end function traits.is_special_group_case(str) if si.is_empty(str) then return false end if str == "্য" then return true end return false end function traits.is_last_series_input_special_group_case() local precise_input = pi.get_last_series_precise_input() if not si.is_empty(precise_input) then local str_size = si.get_string_length(precise_input) if str_size < 2 then return false end local code_1 = si.u16code(precise_input, str_size) local code_2 = si.u16code(precise_input, str_size - 1) if code_1 == si.u16code("য", 1) and code_2 == special_semivowel_code then return true end end return false end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if code_se == special_semivowel_code and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_triple_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 5 then return false end local code_se = si.u16code(str, 2) local code_fo = si.u16code(str, 4) if code_se == special_semivowel_code and code_fo == special_semivowel_code then local code_fr = si.u16code(str, 1) local code_th = si.u16code(str, 3) local code_fi = si.u16code(str, 5) if traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) and traits.is_special_consonant_case(code_fi) then return true end return false end return false end function traits.is_contain_multi_case(str) local str_size = si.get_string_length(str) if str_size >= 2 then return true end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_tone_case(c) for i, v in ipairs(special_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_script_case(c) for i, v in ipairs(special_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_attach_case(c) for i, v in ipairs(special_attach_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if c == dot_code then return false end if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) if c == dot_code then return false end local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) if c == dot_code then return false end return ct.is_manipuri_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) if c == dot_code then return false end return ct.is_manipuri_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) if c == dot_code then return false end return ct.is_manipuri_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_manipuri_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_punctuation_character(c) if c == dot_code then return true end return false end return traits PK n5:Q,5assets/indiansanskrit.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("IN", "IndianSanskrit") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.indiansanskritv5 .. "indiansanskrit_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indiansanskritv5 .. "indiansanskrit_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.indiansanskritv5 .. "indiansanskrit_traits.trt.png" lng.statistic_alias = "indiansanskrit" lng.categories[si.language.category.FASTSWITCH] = "indiansanskrit" lng.categories[si.language.category.SUBTYPE] = "indiansanskrit" lng.categories[si.language.category.MIXINPUT] = "indiansanskrit" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "indiansanskrit" lng.categories[si.language.category.LAYOUT] = "indiansanskrit" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.indiansanskritv5 .. "indiansanskrit.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QZi i *5assets/indiansanskrit_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main1 local input_type = si.input_type() template = "indian_soft_full_qwerty_international" alt_inputs = kb.devanagari_full_alt local s = sf.new_full_keyboard( "indiansanskrit_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indiansanskritv5 .. "indiansanskrit_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qn n *5assets/indiansanskrit_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main2 local input_type = si.input_type() template = "indian_soft_full_qwerty_international" alt_inputs = kb.devanagari_full_alt local s = sf.new_full_keyboard( "indiansanskrit_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indiansanskritv5 .. "indiansanskrit_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q:$5assets/indiansanskrit_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0900 local z_code = 0x097f local A_code = 0x0900 local Z_code = 0x097f local special_lower_list = { "ऴ", "ॄ", "ग़", "ड़", "क़", "ऩ", "ॡ", "ऌ", "ढ़", "ऒ", "ऎ", "ऍ", "फ़", "ऎ", "ऍ", "ऎ", "ऍ", "ऋ", } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_india_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Q ww5assets/indiansanthali.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("IN", "IndianSanthali") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.indiansanthaliv5 .. "indiansanthali_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indiansanthaliv5 .. "indiansanthali_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.indiansanthaliv5 .. "indiansanthali_traits.trt.png" lng.statistic_alias = "indiansanthali" lng.categories[si.language.category.FASTSWITCH] = "indiansanthali" lng.categories[si.language.category.SUBTYPE] = "indiansanthali" lng.categories[si.language.category.MIXINPUT] = "indiansanthali" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "indiansanthali" lng.categories[si.language.category.LAYOUT] = "indiansanthali" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.indiansanthaliv5 .. "indiansanthali.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q79b b *5assets/indiansanthali_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main1 local input_type = si.input_type() template = "indian_soft_full_international" alt_inputs = kb.devanagari_full_alt local s = sf.new_full_keyboard( "indiansanthali_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indiansanthaliv5 .. "indiansanthali_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QUh]g g *5assets/indiansanthali_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main2 local input_type = si.input_type() template = "indian_soft_full_international" alt_inputs = kb.devanagari_full_alt local s = sf.new_full_keyboard( "indiansanthali_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indiansanthaliv5 .. "indiansanthali_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q:$5assets/indiansanthali_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0900 local z_code = 0x097f local A_code = 0x0900 local Z_code = 0x097f local special_lower_list = { "ऴ", "ॄ", "ग़", "ड़", "क़", "ऩ", "ॡ", "ऌ", "ढ़", "ऒ", "ऎ", "ऍ", "फ़", "ऎ", "ऍ", "ऎ", "ऍ", "ऋ", } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_india_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Q&5assets/indiansindhi.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("IN", "IndianSindhi") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.indiansindhiv5 .. "indiansindhi_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indiansindhiv5 .. "indiansindhi_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.indiansindhiv5 .. "indiansindhi_arabic_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.CU1, support_mode = si.context.DATE, }, { surface_id = pkg.indiansindhiv5 .. "indiansindhi_arabic_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.CU1, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.indiansindhiv5 .. "indiansindhi_traits.trt.png" lng.statistic_alias = "indiansindhi" lng.categories[si.language.category.FASTSWITCH] = "indiansindhi" lng.categories[si.language.category.SUBTYPE] = "indiansindhi" lng.categories[si.language.category.MIXINPUT] = "indiansindhi" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "indiansindhi" lng.categories[si.language.category.LAYOUT] = "indiansindhi" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.indiansindhiv5 .. "indiansindhi.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qk e /5assets/indiansindhi_arabic_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template = "indiansindhi_arabic_soft_full_international" local alt_inputs = kb.ar_full_alt_for_sindhi local shift_inputs local main_inputs = kb.ar_full_qwerty_main1 local expand_long_press_inputs = kb.ar_full_qwerty_expand_long_press_input_for_sindhi local input_type = si.input_type() local s = sf.new_full_keyboard( "indiansindhi_arabic_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.match_surface = pkg.indiansindhiv5 .. "indiansindhi_arabic_soft_qwertz2.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.CU1 s.support_mode = si.context.DATE s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_arabic s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QnK  /5assets/indiansindhi_arabic_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template = "indiansindhi_arabic_soft_full_international" local alt_inputs = kb.ar_full_alt_for_sindhi2 local shift_inputs = kb.ar_full_qwerty_expand_long_press_input_classic local main_inputs = kb.ar_full_qwerty_main2 local expand_long_press_inputs = kb.ar_full_qwerty_expand_long_press_input_for_sindhi local input_type = si.input_type() local s = sf.new_full_keyboard( "indiansindhi_arabic_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.match_surface = pkg.indiansindhiv5 .. "indiansindhi_arabic_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.CU1 s.support_mode = si.context.DATE s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_arabic s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q_ _ (5assets/indiansindhi_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main1 local input_type = si.input_type() template = "indian_soft_full_qwerty_international" alt_inputs = kb.sindhi_full_alt local s = sf.new_full_keyboard( "indiansindhi_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indiansindhiv5 .. "indiansindhi_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q=vd d (5assets/indiansindhi_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.devanagari_full_qwerty_main2 local input_type = si.input_type() template = "indian_soft_full_qwerty_international" alt_inputs = kb.sindhi_full_alt local s = sf.new_full_keyboard( "indiansindhi_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.indiansindhiv5 .. "indiansindhi_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q1a"5assets/indiansindhi_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0900 local z_code = 0x097f local A_code = 0x0900 local Z_code = 0x097f local arabic_characters = { "ء", "آ", "أ", "ؤ", "إ", "ئ", "ا", "ب", "ة", "ت", "ث", "ج", "ح", "خ", "د", "ذ", "ر", "ز", "س", "ش", "ص", "ض", "ط", "ظ", "ع", "غ", "ف", "ڤ", "ق", "ڨ", "ك", "ل", "ﻻ", "م", "ن", "ه", "و", "ى", "ي", "ئ", "إأ","کگ", "پ", "چ", "ژ", "ھ", "گ", "إ", "أ", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "چ" ,"٠" ,"ى", "پ", "ﻻ", "أ", "ث", "گ", "ؤ", "ٿ", "ڳ", "ڇ", "ڪ", "ڱ", "ڀ", "ہ", "ڙ", "ٽ", "ُ", "ڦ", "ڃ", "ڄ", "ڊ", "ڦ", "ۡ", "۽", "ڏ", "ڌ", "ڍ", "ّ", "ٻ", "ڻ", "۾", } local special_lower_list = { "ऴ", "ॄ", "ग़", "ड़", "क़", "ऩ", "ॡ", "ऌ", "ढ़", "ऒ", "ऎ", "ऍ", "फ़", "ऎ", "ऍ", "ऎ", "ऍ", "ऋ", } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else for i, v in _G.pairs(arabic_characters) do if c == si.u16code(v, 1) then return true end end return false end end function traits.is_userword_character(c) return ct.is_india_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_india_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Q5N'5assets/indonesian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("ID", "Indonesian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.indonesianv5 .. "indonesian_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.indonesianv5 .. "indonesian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.indonesianv5 .. "indonesian_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.indonesianv5 .. "indonesian_traits.trt.png" lng.statistic_alias = "indonesian" lng.categories[si.language.category.FASTSWITCH] = "indonesian" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "indonesian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "indonesian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.indonesianv5 .. "indonesian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { -- QWERTY { file_name = pkg.indonesianv5 .. "indonesian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, { file_name = pkg.indonesianv5 .. "indonesian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q둦#5assets/indonesian_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q'cqhh'5assets/indonesian_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "indonesian_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QEy  %5assets/indonesian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "indonesian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q$5assets/indonesian_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "indonesian_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q^} } 5assets/indonesian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code end return c end function traits.is_case_sensitive_character(c) if c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q:ee5assets/irish.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("IR", "Irish") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.irishv5 .. "irish_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.irishv5 .. "irish_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.irishv5 .. "irish_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.irishv5 .. "irish_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, { surface_id = pkg.irishv5 .. "irish_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.irishv5 .. "irish_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.irishv5 .. "irish_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.irishv5 .. "irish_traits.trt.png" lng.statistic_alias = "irish" lng.categories[si.language.category.FASTSWITCH] = "irish" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "irish" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.irishv5 .. "irish.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qe  5assets/irish_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main local input_type = si.input_type() if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.eng_full_azerty_alt_international local s = sf.new_full_keyboard( "englishgb_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q."5assets/irish_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "englishgb_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q槐H  5assets/irish_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international local s = sf.new_full_keyboard( "englishgb_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "ā", "ą", "æ", "ç", "č", "ć", "è", "é", "ê", "ë", "ē", "ė", "ę", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "ù", "û", "ü", "ú", "ū", "ñ", "ń", "ß", "ś", "š", "ÿ", "ÿ", "ž", "ź", "ż", "ĺ", "ľ", "ł", "ď", "đ", "ŕ", "ř", "ť", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Ā", "Ą", "Æ", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ē", "Ė", "Ę", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "Ù", "Û", "Ü", "Ú", "Ū", "Ñ", "Ń", "ß", "Ś", "Š", "Ÿ", "Ÿ", "Ž", "Ź", "Ż", "Ĺ", "Ľ", "Ł", "Ď", "Đ", "Ŕ", "Ř", "Ť", } local accent_letter_dictionary = { [string.byte("a")] = "äàâáãåāąæ", [string.byte("c")] = "çčć", [string.byte("e")] = "ëèéêēėę", [string.byte("i")] = "ïîíìīį", [string.byte("o")] = "öôóòõōœø", [string.byte("u")] = "üùûúū", [string.byte("n")] = "ñń", [string.byte("s")] = "ßśš", [string.byte("y")] = "ÿ", [string.byte("z")] = "žźż", [string.byte("l")] = "ĺľł", [string.byte("d")] = "ďđ", [string.byte("r")] = "ŕř", [string.byte("t")] = "ť", [string.byte("A")] = "ÄÀÂÁÃÅĀĄÆ", [string.byte("C")] = "ÇČĆ", [string.byte("E")] = "ËÈÉÊĒĖĘ", [string.byte("I")] = "ÏÎÍÌĪĮ", [string.byte("O")] = "ÖÔÓÒÕŌŒØ", [string.byte("U")] = "ÜÙÛÚŪ", [string.byte("N")] = "ÑŃ", [string.byte("S")] = "ߌŠ", [string.byte("Y")] = "Ÿ", [string.byte("Z")] = "ŽŹŻ", [string.byte("L")] = "ĹĽŁ", [string.byte("D")] = "ĎĐ", [string.byte("R")] = "ŔŘ", [string.byte("T")] = "Ť", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(":")] = ":", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q>SS5assets/italian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("IT", "Italian") lng.on_load = function () local si = si local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.italianv5 .. "italian_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.italianv5 .. "italian_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.italianv5 .. "italian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.italianv5 .. "italian_traits.trt.png" lng.statistic_alias = "italian" lng.categories[si.language.category.FASTSWITCH] = "italian" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "italian" lng.categories[si.language.category.CELLDICT] = "italian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "italian" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "it" lng.categories[si.language.category.EMOJI] = "italian" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.italianv5 .. "italian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { -- QWERTY { file_name = pkg.italianv5 .. "italian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, { file_name = pkg.italianv5 .. "italian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q둦 5assets/italian_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Qj'$5assets/italian_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "italian_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QP# # "5assets/italian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "italian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qʌ*[[!5assets/italian_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "italian_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q \5assets/italian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "é", "è", "ê", "ë", "ę", "ē", "ė", "ó", "ò", "ô", "õ", "ō", "ö", "œ", "ø", "º", "à", "â", "á", "ã", "å", "ä", "æ", "ā", "ª", "ì", "î", "ï", "í", "ī", "į", "ù", "û", "ü", "ú", "ū", } local special_upper_list = { "É", "È", "Ê", "Ë", "Ę", "Ē", "Ė", "Ó", "Ò", "Ô", "Õ", "Ō", "Ö", "Œ", "Ø", "º", "À", "Â", "Á", "Ã", "Å", "Ä", "Æ", "Ā", "ª", "Ì", "Î", "Ï", "Í", "Ī", "Į", "Ù", "Û", "Ü", "Ú", "Ū", } local accent_dictionary = { [string.byte("e")] = "éèêëęēė", [string.byte("o")] = "óòôõōöœøº", [string.byte("a")] = "àâáãåäæāª", [string.byte("i")] = "ìîïíīį", [string.byte("u")] = "ùûüúū", [string.byte("E")] = "ÉÈÊËĘĒĖ", [string.byte("O")] = "ÓÒÔÕŌ֌غ", [string.byte("A")] = "ÀÂÁÃÅÄÆĀª", [string.byte("I")] = "ÌÎÏÍĪĮ", [string.byte("U")] = "ÙÛÜÚŪ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("-") then return true else return false end end return traits PK n5:Qɵyy5assets/italianch.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("IT", "Italian") lng.on_load = function () local si = si local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.italianchv5 .. "italianch_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.italianchv5 .. "italianch_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.italianchv5 .. "italianch_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.italianchv5 .. "italianch_traits.trt.png" lng.statistic_alias = "italianch" lng.categories[si.language.category.FASTSWITCH] = "italianch" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "italianch" lng.categories[si.language.category.CELLDICT] = "italianch" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "italianch" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "it" lng.categories[si.language.category.EMOJI] = "italian" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.italianchv5 .. "italianch.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { -- QWERTY { file_name = pkg.italianchv5 .. "italianch_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, { file_name = pkg.italianchv5 .. "italianch_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q둦"5assets/italianch_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q3l&5assets/italianch_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "italianch_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q0p% % $5assets/italianch_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "italianch_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q̾]]#5assets/italianch_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "italianch_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q \5assets/italianch_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "é", "è", "ê", "ë", "ę", "ē", "ė", "ó", "ò", "ô", "õ", "ō", "ö", "œ", "ø", "º", "à", "â", "á", "ã", "å", "ä", "æ", "ā", "ª", "ì", "î", "ï", "í", "ī", "į", "ù", "û", "ü", "ú", "ū", } local special_upper_list = { "É", "È", "Ê", "Ë", "Ę", "Ē", "Ė", "Ó", "Ò", "Ô", "Õ", "Ō", "Ö", "Œ", "Ø", "º", "À", "Â", "Á", "Ã", "Å", "Ä", "Æ", "Ā", "ª", "Ì", "Î", "Ï", "Í", "Ī", "Į", "Ù", "Û", "Ü", "Ú", "Ū", } local accent_dictionary = { [string.byte("e")] = "éèêëęēė", [string.byte("o")] = "óòôõōöœøº", [string.byte("a")] = "àâáãåäæāª", [string.byte("i")] = "ìîïíīį", [string.byte("u")] = "ùûüúū", [string.byte("E")] = "ÉÈÊËĘĒĖ", [string.byte("O")] = "ÓÒÔÕŌ֌غ", [string.byte("A")] = "ÀÂÁÃÅÄÆĀª", [string.byte("I")] = "ÌÎÏÍĪĮ", [string.byte("U")] = "ÙÛÜÚŪ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("-") then return true else return false end end return traits PK n5:QT/ 5assets/jap_soft_abc.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "surface_factory" require "common_keys" local si = smartinput local sf = surface_factory local ts = si.tri_status local pi = si.pending_input local ca = si.candidates local ck = common_keys local sk_main_inputs = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l"}, {"z", "x", "c", "v", "b", "n", "m"}, {"@", "_"}, } local s = sf.new_full_keyboard( "jap_soft_abc", sk_main_inputs, nil, nil, false, si.TITLE_CASE.CHANGE, 0) s.on_load = function (keyboard) s.explicit_inline = keyboard.explicit_inline s.inline_strategy = keyboard.inline_strategy s.resolve_mode = keyboard.resolve_mode s.touch_to_save = keyboard.touch_to_save end s.template = "jap_abc" s.surface_type = si.surface_type.SOFT_SPECIAL s.surface_subtype = si.surface_subtype.KEYBOARD_FULL s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PRECISE s.inline_strategy = nil s.explicit_strategy = nil s.additional_candidate = nil s.extra_elements = { "top_bar=number_bar", } s.on_slip_stroke = true s.const_candidates = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", } local locale = dofile("locale.lua") if not locale then locale = ".cn" end for i = 1, #sk_main_inputs do for j = 1, #sk_main_inputs[i] do s.softkeys["sk_" .. i .. "_" .. j].on_long_press_once = nil s.softkeys["sk_" .. i .. "_" .. j].on_slide_up = sf.full_on_slide_up end end if si.is_current_chinese_language() then s.softkeys["sk_sym"] = ck.sk_sym_chs else s.softkeys["sk_sym"] = ck.sk_sym_eng end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_sp"] = ck.sk_sp_abc s.softkeys["sk_bk"] = ck.sk_bk_abc s.softkeys["sk_4_1"] = ck.sk_at_abc s.softkeys["sk_back"] = ck.sk_back_abc s.softkeys["Dot"] = ck.sk_dot_eng s.softkeys["sk_place"] = ck.sk_place s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_hw_mask"] = ck.sk_hw_mask s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.on_slip_left = nil s.on_slip_right = nil return s PK n5:QZ j??5assets/jap_sym_grid.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "grid_symbol" require "common_keys" require "emoji" local si = smartinput local ck = common_keys local ct = si.context local pi = si.pending_input local sym = grid_symbol local emo = emoji local surface = si.new_surface("symbol") surface.template = "chs_sym_grid_international" surface.on_load = function (old_surface) surface.explicit_inline = old_surface.explicit_inline surface.inline_strategy = old_surface.inline_strategy surface.resolve_mode = old_surface.resolve_mode surface.display_candidate_code = old_surface.display_candidate_code if old_surface.param ~= nil then surface.switch_tab(old_surface.param, true) end end surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.support_mode = ct.NUMBER + ct.MATH surface.extra_elements = { "jap_sym_types", "popup_revert", "popup_explicit", "top_bar=none", } surface.ROWS_COUNT = 4 surface.COLUMNS_COUNT = 4 surface.MAX_RECENT_SYMBOL_COUNT = surface.ROWS_COUNT * surface.COLUMNS_COUNT local symbol_punc_eng = { { {".", ",", "?", "!"}, {"'", "@", "…", ":"}, {";", "\"", "/", "_"}, {"-", "+", "`", {"()",1}}, {"(", ")", "=", "\\"}, {"~", "^", "#", "*"}, {"%", "&", "|", {"{}",1}}, {"{", "}",{"[]",1}, {"<>",1}}, {"<", ">", "$", "¥"}, {"£", "€", "¿", "¡"}, {"•", "", "", ""}, } } local symbol_punc_cn = { { {",", "。", "?", "!"}, {"、", "@", ":", ";"}, {"……", {"“”", 1}, {"‘’", 1}, "~"}, {{"()", 1}, {"《》", 1}, ".", "-"}, {"%", "——", "&", "#"}, {{"<>",1}, {"[]", 1}, {"{}", 1}, {"〔〕", 1}}, {{"「」",1}, {"『』",1}, {"【】",1}, {"〖〗",1}}, {"*", "_", "¥", "$"}, {"“", "”", "‘", "’"}, {"(", ")", "《", "》"}, {"<", ">", "[", "]"}, {"{", "}", "〔 ", "〕"}, {"「", "」", "『", "』"}, {"【", "】", "〖", "〗"} } } local symbol_number = { { {"1", "2", "3", "."}, {"4", "5", "6", ","}, {"7", "8", "9", "%"}, {"*", "0", "#", "-"} } } local symbol_emotion = { { {":-)", ":-(", ":-D", ":-P"}, {";-)", "=-O", ":-*", ":O"}, {"B-)", ":-$", ":-!", ":-["}, {"O:-)", ":-\\", ":'(",",-)"}, {":-C", ":-I", ":-O",">:-<"}, {"Orz","~zZ", "@_@", "^o^"}, {"^v^", "^ω^", "←_←", "→_→"}, {"-.-", "?_?", "π_π", "-O-"}, {"O_o", "555~", "e_e", "haha~"}, {"(>_<)", "~_~", ">o<", "-O-"}, {"-_-", "-_-#", "-_-||", "-_-b"}, {"hehe~", "oh~", "Yeah~", "Q_Q"}, {"T_T", "::>_<::", "(-.-)", "≥﹏≤"}, {"#^_^#", "^_^", "*^_^*", "*^o^*"}, {"^v^", "(^-^)", "(^o^)", "(^3^)"}, {"\\^O^/", "^o^", "+_+", "⊙_⊙"}, {"⊙▽⊙", "⊙ω⊙", "$_$", ">_<"}, {"(>_<)", "(>﹏<)", "(~o~)", "( ̄. ̄)"}, {"(*>.<*)", "(?o?)", "(ˇˍˇ)", "(⊙o⊙)"}, {"(≥3≤)", "(╯3╰)", "(°ο°)", "(☆_☆)"}, {"*^÷^*", "*^◎^*", "*^o^*", "╭∩╮"}, {"^_^¦¦¦", "^=_=^", "﹌○﹌", "~>_<~"}, {"~T_T~", "~w_w~", ">_<¦¦¦", ">o<"}, {"y^o^y", "Y(^_^)Y", "y∩__∩y", "╰_╯"}, {"╯﹏╰", "╯▂╰", "〒_〒", "~^o^~"}, {"~_~", "~`o`~", "=^_^=", "=_="}, {"≡^ˇ^≡", "≥﹏≤", "●﹏●", "●︿●"}, {"●▂●", "◑▂◐", "(*^@^*)", "(*^﹏^*)"}, {"(=^.^=)", "(=^ω^=)", "*^____^*", "@(一-一)@"}, {"^-_-^", "=@~@=", "= ̄ω ̄=", "↖(^ω^)↗"}, {"└(^o^)┘", "(ˉ(∞)ˉ)", "`(+﹏+)′", "(#\")凸"}, {"(* ̄︶ ̄*)", "`(*∩_∩*)′"}, {"~(*+﹏+*)~", "~@^_^@~"}, {"~~\(^_^)/~~", "~~~^_^~~~"}, {"~~O(∩_∩)O~~", "<(-︿-)>"}, } } local symbol_web = { { {"http://", {"www..com", 4}, "https://"}, {"ftp://", "www.", ".cn", ".com"}, {".org", "wap.", "blog.", "bbs."}, {":", ".", "/", "@"}, {"@sina.com", "@sina.cn"}, {"@hotmail.com", "@live.cn"}, {"@gmail.com", "@qq.com"}, {"@163.com", "@sohu.com"}, } } local symbol_maths = { { {"+", "-", "×", "÷"}, {"=", "≈", "≤", "≥"}, {"°", "%", "℃", "℉"}, {"‰", "㎎", "㎏", "㎜"}, {"㎝", "㎞", "㎡", "㏄"}, {"㏑", "㏒", "⊙", "∠"}, {"⊥", "∫", "∮", "∝"}, {"∞", "º", "¹", "²"}, {"³", "½", "¾", "¼"}, {"<", ">", "≮", "≯"}, {"±", "≡", "≠", "№"}, {"§", "≦", "≧", "≌"}, {"∽", "∷", "/", "∧"}, {"∨", "∏", "∪", "∩"}, {"∈", "∵", "∴", "⌒"}, {"√", "∑", "Ψ", "¤"}, {"‖", "¶", "", ""}, } } local symbol_serial = { { {"①", "②", "③", "④"}, {"⑤", "⑥", "⑦", "⑧"}, {"⑨", "⑩", "㈠", "㈡"}, {"㈢", "㈣", "㈤", "㈥"}, {"㈦", "㈧", "㈨", "㈩"}, {"⑴", "⑵", "⑶", "⑷"}, {"⑸", "⑹", "⑺", "⑻"}, {"⑼", "⑽", "⒈", "⒉"}, {"⒊", "⒋", "⒌", "⒍"}, {"⒎", "⒏", "⒐", "⒑"}, {"壹", "贰", "叁", "肆"}, {"伍", "陆", "柒", "捌"}, {"玖", "拾", "佰", "仟"}, {"万", "ⅰ", "ⅱ", "ⅲ"}, {"ⅳ", "ⅴ", "ⅵ", "ⅶ"}, {"ⅷ", "ⅸ", "ⅹ", "Ⅰ"}, {"Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ"}, {"Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ"}, {"Ⅹ", "Ⅺ", "Ⅻ", ""}, } } local symbol_radical = { { {"丶","丷","丿","乚"}, {"丨","丄","丅","亅"}, {"亻","忄","犭","扌"}, {"亠","宀","冖","乛"}, {"艹","厂","疒","礻"}, {"讠","衤","刂","阝"}, {"卩","钅","饣","丬"}, {"冫","氵","灬","彡"}, {"纟","爫","囗","辶"}, {"廴","冂","凵","丆"}, {"丌","丩","巜","乀"}, {"乁","乂","乄","乆"}, {"乊","亇","亍","亼"}, {"亽","兯","冎","勹"}, {"匚","匸","卂","卄"}, {"卍","卐","卝","卪"}, {"厃","厶","夂","夊"}, {"豸","釒","尐","屮"}, {"屵","廾","彐","彑"}, {"爿","牜","糹","罒"}, {"訁","耂","襾","覀"}, } } local symbol_pinyin = { { {"ā", "á", "ǎ", "à"}, {"ō", "ó", "ǒ", "ò"}, {"ē", "é", "ě", "è"}, {"ī", "í", "ǐ", "ì"}, {"ū", "ú", "ǔ", "ù"}, {"ǖ", "ǘ", "ǚ", "ǜ"}, {"ü", "", "", ""}, } } local symbol_russia = { { {"а", "б", "в", "г"}, {"д", "е", "ж", "з"}, {"и", "й", "к", "л"}, {"м", "Н", "о", "п"}, {"р", "с", "т", "у"}, {"ф", "х", "ц", "ч"}, {"ш", "щ", "ъ", "ы"}, {"ь", "э", "ю", "я"}, {"ё", "А", "Б", "В"}, {"Г", "Д", "Е", "Ж"}, {"З", "И", "Й", "К"}, {"Л", "М", "Н", "О"}, {"П", "Р", "С", "Т"}, {"У", "Ф", "Х", "Ц"}, {"Ч", "Ш", "Щ", "Ъ"}, {"Ы", "Ь", "Э", "Ю"}, {"Я", "Ё", "", ""}, } } local symbol_greek = { { {"α", "β", "γ", "δ"}, {"ε", "ζ", "ν", "ξ"}, {"ο", "π", "ρ", "σ"}, {"η", "θ", "ι", "κ"}, {"λ", "μ", "τ", "υ"}, {"φ", "χ", "ψ", "ω"}, {"Α", "Β", "Γ", "Δ"}, {"Ε", "Ζ", "Η", "Θ"}, {"Ι", "Κ", "Λ", "Μ"}, {"Ν", "Ξ", "Ο", "Π"}, {"Ρ", "Σ", "Τ", "Υ"}, {"Φ", "Χ", "Ψ", "Ω"}, } } local symbol_latin = { { {"Ä", "Æ", "Å", "À"}, {"Á", "Â", "Ã", "Ç"}, {"È", "É", "Ê", "Ë"}, {"Ð", "Ì", "Í", "Î"}, {"Ï", "Ö", "Ø", "Ò"}, {"Ó", "Ô", "Õ", "Ñ"}, {"Ù", "Ú", "Û", "Ü"}, {"Ý", "Þ", "ä", "æ"}, {"å", "à", "á", "â"}, {"ã", "ç", "è", "é"}, {"ê", "ë", "ð", "ì"}, {"í", "î", "ï", "ö"}, {"ø", "ò", "ó", "ô"}, {"õ", "ñ", "ù", "ú"}, {"û", "ü", "ý", "þ"}, } } local symbol_kata = { { {"ア", "イ", "ウ", "エ"}, {"オ", "ァ", "ィ", "ゥ"}, {"ェ", "ォ", "カ", "キ"}, {"ク", "ケ", "コ", "ガ"}, {"ギ", "グ", "ゲ", "ゴ"}, {"サ", "シ", "ス", "セ"}, {"ソ", "ザ", "ジ", "ズ"}, {"ゼ", "ゾ", "タ", "チ"}, {"ツ", "テ", "ト", "ダ"}, {"ヂ", "ヅ", "デ", "ド"}, {"ッ", "ナ", "ニ", "ヌ"}, {"ネ", "ノ", "ハ", "ヒ"}, {"フ", "ヘ", "ホ", "バ"}, {"ビ", "ブ", "ベ", "ボ"}, {"パ", "ピ", "プ", "ペ"}, {"ポ", "マ", "ミ", "ム"}, {"メ", "モ", "ャ", "ヤ"}, {"ュ", "ユ", "ョ", "ヨ"}, {"ラ", "リ", "ル", "レ"}, {"ロ", "ワ", "ヽ", "ヾ"}, {"ヲ", "ン", "ヴ", "ヵ"}, {"ヶ", "", "", ""}, } } local symbol_hira = { { {"あ", "い", "う", "え"}, {"お", "ぁ", "ぃ", "ぅ"}, {"ぇ", "ぉ", "か", "き"}, {"く", "け", "こ", "が"}, {"ぎ", "ぐ", "げ", "ご"}, {"さ", "し", "す", "せ"}, {"そ", "ざ", "じ", "ず"}, {"ぜ", "ぞ", "た", "ち"}, {"つ", "て", "と", "だ"}, {"ぢ", "づ", "で", "ど"}, {"っ", "な", "に", "ぬ"}, {"ね", "の", "は", "ひ"}, {"ふ", "へ", "ほ", "ば"}, {"び", "ぶ", "べ", "ぼ"}, {"ぱ", "ぴ", "ぷ", "ぺ"}, {"ぽ", "ま", "み", "む"}, {"め", "も", "や", "ゆ"}, {"よ", "ゃ", "ゅ", "ょ"}, {"ら", "り", "る", "れ"}, {"ろ", "わ", "を", "ん"}, {"ゎ", "", "", ""}, } } local symbol_zhuyin_japan = { { {"ㄅ", "ㄆ", "ㄇ", "ㄈ"}, {"ㄉ", "ㄊ", "ㄋ", "ㄌ"}, {"ㄍ", "ㄎ", "ㄏ", "ㄐ"}, {"ㄑ", "ㄒ", "ㄓ", "ㄔ"}, {"ㄕ", "ㄖ", "ㄗ", "ㄘ"}, {"ㄙ", "ㄧ", "ㄨ", "ㄩ"}, {"ㄚ", "ㄛ", "ㄜ", "ㄝ"}, {"ㄞ", "ㄟ", "ㄠ", "ㄡ"}, {"ㄢ", "ㄣ", "ㄤ", "ㄥ"}, {"ㄦ", "", "", ""}, } } local symbol_icon = { { {"☆", "★", "□", "■"}, {"○", "●", "△", "▲"}, {"▽", "▼", "◇", "◆"}, {"♀", "♂", "※", "╳"}, {"╭", "╮", "╰", "╯"}, {"︽", "︾", "︵", "︶"}, {"﹁", "﹂", "﹃", "﹄"}, {"︹", "︺", "︿", "﹀"}, {"︴", "﹌", "﹉", "﹊"}, {"﹍", "﹎", "﹏", "ˇ"}, {"‥", "︷", "︸", "«"}, {"»", "︵", "︻", "︼"}, {"↓", "↑", "↔", "↖"}, {"↙", "↗", "↘", "←"}, {"→", "↹", "♣", "♠"}, {"♥", "♦", "◣", "◢"}, {"◤", "◥", "卍", "℡"}, {"⊙", "㊣", "®", "©"}, {"™", "Š", "Õ", "‡"}, {"†", "Θ", "Ψ", "卐"}, {"㈱", "囍", "◎", ""}, } } local symbol_emoticon = { { {emo.emoji_code.EMOJI_SMILE, emo.emoji_code.EMOJI_SAD, emo.emoji_code.EMOJI_GRIN, emo.emoji_code.EMOJI_NAUGHTY}, {emo.emoji_code.EMOJI_JOY, emo.emoji_code.EMOJI_CONFUSED, emo.emoji_code.EMOJI_KISS, emo.emoji_code.EMOJI_SURPRISE}, {emo.emoji_code.EMOJI_PLEASED, emo.emoji_code.EMOJI_HEARTSHAPED, emo.emoji_code.EMOJI_WRONGED, emo.emoji_code.EMOJI_CRY}, {emo.emoji_code.EMOJI_ARROGANT, emo.emoji_code.EMOJI_ANGRY, emo.emoji_code.EMOJI_WEEP, emo.emoji_code.EMOJI_DIZZY}, } } for i = 1, #symbol_emotion do for j = 1, #symbol_emotion[i] do for k = 1, #symbol_emotion[i][j] do local new_symbol = {} new_symbol[1] = symbol_emotion[i][j][k] new_symbol["emotion"] = true symbol_emotion[i][j][k] = new_symbol end end end for i = 1, #symbol_emoticon do for j = 1, #symbol_emoticon[i] do for k = 1, #symbol_emoticon[i][j] do local new_symbol = {} new_symbol[1] = symbol_emoticon[i][j][k] new_symbol["emotion"] = true symbol_emoticon[i][j][k] = new_symbol end end end local symbol = { number = symbol_number, punc_eng = symbol_punc_eng, punc_cn = symbol_punc_cn, emoticon = {}, web = symbol_web, maths = symbol_maths, serial = symbol_serial, radical = symbol_radical, pinyin = symbol_pinyin, russia = symbol_russia, greek = symbol_greek, latin = symbol_latin, kata = symbol_kata, hira = symbol_hira, zhuyin_japan = symbol_zhuyin_japan, icon = symbol_icon } local sym_types_name = { number = "数字", punc_eng = "英文", punc_cn = "中文", emotion = "表情", emoticon = "表情图", web = "网络", maths = "数学", serial = "序号", radical = "部首", pinyin = "拼音", russia = "俄语", greek = "希腊", latin = "拉丁", kata = "片假", hira = "平假", zhuyin_japan = "注音", icon = "图形", recent = "最近" } function surface.update_recent_symbols(new_recent_symbols) symbol.recent = new_recent_symbols end local recent_symbols = sym.get_japanese_recent_symbols() surface.update_recent_symbols(sym.layout_symbol_list(recent_symbols, surface.ROWS_COUNT, surface.COLUMNS_COUNT)) function surface.set_recent_symbols(symbols) sym.set_japanese_recent_symbols(surface, symbols) end function surface.get_recent_symbols() return sym.get_japanese_recent_symbols() end if si.input_type() == ct.NUMBER or si.input_type() == ct.PASSWORD then surface.sym_current_tab = "number" else surface.sym_current_tab = "recent" end surface.sym_current_page = 1 --si.get_setting_value(si.settings.SYMBOL_CURRENT_PAGE, si.settings_type.SETTING_INT) si.set_setting_value(si.settings.SYMBOL_CURRENT_TAB_CHS, surface.sym_current_tab, si.settings_type.SETTING_STRING) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) surface.switch_tab = function(symbol_tab, is_ignore_accessibility) surface.sym_current_tab = symbol_tab surface.sym_current_page = 1 if not is_ignore_accessibility then si.set_accessibility_string("@string/accessibility_symbol_" .. symbol_tab) end si.set_setting_value(si.settings.SYMBOL_CURRENT_TAB_CHS, surface.sym_current_tab, si.settings_type.SETTING_STRING) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) surface.update_lock_status(symbol_tab) sym.reload_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) end surface.update_lock_status = function(symbol_tab) if symbol_tab == "number" then local locked = si.get_setting_value(si.settings.SYMBOL_LOCK_STATUS, si.settings_type.SETTING_INT) if locked >= 4 then locked = locked - 4; end if locked < 2 then locked = locked + 2; end si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, locked, si.settings_type.SETTING_INT) else local locked = si.get_setting_value(si.settings.SYMBOL_LOCK_STATUS, si.settings_type.SETTING_INT) if locked >= 4 then locked = locked - 4; end if locked >= 2 then locked = locked - 2; end si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, locked, si.settings_type.SETTING_INT) end end surface.prev_page = function() if table.getn(symbol[surface.sym_current_tab]) == 1 then si.set_accessibility_string("@string/accessibility_next_page_only_one") return end surface.sym_current_page = surface.sym_current_page - 1 if surface.sym_current_page < 1 then surface.sym_current_page = table.getn(symbol[surface.sym_current_tab]) end si.set_accessibility_string("@string/accessibility_next_page&" .. surface.sym_current_page) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) sym.reload_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) end surface.next_page = function() if table.getn(symbol[surface.sym_current_tab]) == 1 then si.set_accessibility_string("@string/accessibility_next_page_only_one") return end surface.sym_current_page = surface.sym_current_page + 1 if surface.sym_current_page > table.getn(symbol[surface.sym_current_tab]) then surface.sym_current_page = surface.sym_current_page - table.getn(symbol[surface.sym_current_tab]) end si.set_accessibility_string("@string/accessibility_next_page&" .. surface.sym_current_page) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) sym.reload_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) end surface.lock = function() local locked = si.get_setting_value(si.settings.SYMBOL_LOCK_STATUS, si.settings_type.SETTING_INT) if locked < 2 then if locked == 0 then si.set_accessibility_string("@string/accessibility_lock_on") si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, 1, si.settings_type.SETTING_INT); else si.set_accessibility_string("@string/accessibility_lock_off") si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, 0, si.settings_type.SETTING_INT); end else si.set_accessibility_string("@string/accessibility_lock_disabled") end end surface.on_slip_up = surface.next_page surface.on_slip_down = surface.prev_page surface.update_lock_status(surface.sym_current_tab) sym.setup_chs_symbol(surface, symbol) for k, v in _G.pairs(symbol) do surface.softkeys["sk_" .. k].main_title = sym_types_name[k] end sym.load_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) return surface PK n5:QKV5assets/japanese.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("JP", "Japanese") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.japanesev5 .. "japanese_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.japanesev5 .. "japanese_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "jap_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "jap_soft_abc.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, surface_layout = si.surface_layout.QW, }, { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more_japanese.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.japanesev5 .. "japanese_traits.trt.png" lng.statistic_alias = "japanese" lng.categories[si.language.category.FASTSWITCH] = "japanese" lng.categories[si.language.category.SUBTYPE] = "japanese" lng.categories[si.language.category.CELLDICT] = "japanese" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.USERWORD] = "japanese" lng.categories[si.language.category.LAYOUT] = "japanese" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.FORWARDPREDICTION] = "japanese" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.JPN) lng.dictionary.files = { { file_name = pkg.japanesev5 .. "japanese.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "japanese.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PKk5:Q5assets/japanese.usrUT  n_ n_ n_ w@TГw@TГw@TГ*+-.R(5304RH52045020f& ` X/cW_"O,PK_CS7PK n5:Qq5 %5assets/japanese_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pi = si.pending_input local ca = si.candidates local s = sf.new_phonepad_keyboard( "japanese_soft_phonepad", kb.japanese_phonepad_main, nil, si.TITLE_CASE.LOWER, 0, nil, kb.japanese_phonepad_slide, kb.japanese_phonepad_multi_toggle) s.template = "japanese_soft_phonepad_international" s.statistic_alias = "phonepad" s.precise_input_type = si.input_mode.PREDICT s.support_predict_evidence_input = true s.support_delete_char_segment = true s.support_sentence_userword = true s.support_pending_input_revert = true s.pending_input_mode=si.pending_input_mode.SENTENCE s.ocean_precise_input = true s.ocean_precise_item_pos = si.ocean_precise_item_position.BACK s.default_nextword = true s.touch_correct = false s.explicit_strategy = nil s.multi_input_type = si.input_mode.MULTITAP s.multitap_timer = false s.inline_strategy = { si.inline_strategy.PENDING_SENTENCE, si.inline_strategy.OCEAN_PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.PRECISE_INPUT, } s.additional_candidate = nil s.after_load = function() si.set_setting_value(si.settings.WORD_PREDICTION, true, si.settings_type.SETTING_BOOL) si.timer_id = -1 end if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function close_timer() if si.timer_id ~= nil then si.close_timer(si.timer_id) end si.timer_id = -1 end function start_timer() si.timer_id = si.start_timer() end s.softkeys["sk_sp"] = ck.sk_sp_jap_pad s.softkeys["sk_sep"] = ck.sk_sep_abc_jap s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_jap s.softkeys["sk_bk"] = ck.sk_bk_jap s.softkeys["sk_lng_key"] = ck.sk_lng_jap_phonepad s.softkeys["sk_sym"] = ck.sk_sym_jap_phonepad s.softkeys["sk_revert"] = ck.sk_revert_jap_phonepad s.softkeys["Comma"] = ck.sk_comma_jap s.softkeys["Dot"] = ck.sk_dot_jap s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng local sk_left = si.new_softkey() sk_left.mistyping_tolerant = true sk_left.on_click = function(sk, key_name) if not pi.empty() then pi.pending_cursor_left_offset() end end local sk_right = si.new_softkey() sk_right.mistyping_tolerant = true sk_right.on_click = function(sk, key_name) if not pi.empty() then local input_mode = pi.get_current_pending_mode() if input_mode == si.pending_input_mode.SENTENCE then pi.pending_cursor_right_offset() else pi.multitap_toggle_input(si.multitap_toggle.END) end end end s.softkeys["sk_left"] = sk_left s.softkeys["sk_right"] = sk_right s.compound_word_input = lc.compound_word_input return s PK n5:Qy: #5assets/japanese_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pi = si.pending_input local template local alt_inputs local shift_inputs local main_inputs = kb.japanese_full_qwerty_main local input_type = si.input_type() template = "japanese_soft_qwerty_international" alt_inputs = kb.japanese_full_qwerty_alt_international local s = sf.new_full_keyboard( "japanese_soft_qwerty", main_inputs, alt_inputs, shift_inputs, false, si.TITLE_CASE.LOWER, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PREDICT + si.input_mode.PRECISE s.support_predict_evidence_input = true s.support_delete_char_segment = true s.support_sentence_userword = true s.pending_input_mode=si.pending_input_mode.SENTENCE s.ocean_precise_input = true s.ocean_precise_item_pos = si.ocean_precise_item_position.BACK s.default_nextword = true s.touch_correct = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PENDING_SENTENCE, si.inline_strategy.OCEAN_PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.PRECISE_INPUT, } s.additional_candidate = nil s.after_load = function() si.set_setting_value(si.settings.WORD_PREDICTION, true, si.settings_type.SETTING_BOOL) end if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sp"] = ck.sk_sp_jap s.softkeys["sk_sep"] = ck.sk_sep_abc_jap s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_jap s.softkeys["sk_bk"] = ck.sk_bk_jap s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_jap s.softkeys["Comma"] = ck.sk_comma_jap s.softkeys["Dot"] = ck.sk_dot_jap s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng local sk_left = si.new_softkey() sk_left.mistyping_tolerant = true sk_left.on_click = function(sk, key_name) if not pi.empty() then pi.pending_cursor_left_offset() end end local sk_right = si.new_softkey() sk_right.mistyping_tolerant = true sk_right.on_click = function(sk, key_name) if not pi.empty() then pi.pending_cursor_right_offset() end end s.softkeys["sk_left"] = sk_left s.softkeys["sk_right"] = sk_right s.compound_word_input = lc.compound_word_input return s PK n5:QF@@5assets/japanese_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = "" traits.case_sensitive = false local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return ct.is_japanese_character(c) end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif ct.is_japanese_character(c) then return true elseif (c >= 0xff00 and c <= 0xffef) then return true else return false end end function traits.is_userword_character(c) return ct.is_japanese_character(c) or (c >= 0xff00 and c <= 0xffef) or (c >= 0x4e00 and c <= 0x9fff) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_japanese_character(c) or traits.is_latin_character(c) or (c >= 0xff00 and c <= 0xffef) or (c >= 0x4e00 and c <= 0x9fff) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_japanese_character(c) or traits.is_latin_character(c) or (c >= 0xff00 and c <= 0xffef) or (c >= 0x4e00 and c <= 0x9fff) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_japanese_character(c) or traits.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:QWD5assets/javanese.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("JA", "Javanese") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.javanesev5 .. "javanese_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.javanesev5 .. "javanese_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.javanesev5 .. "javanese_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.javanesev5 .. "javanese_traits.trt.png" lng.statistic_alias = "javanese" lng.categories[si.language.category.FASTSWITCH] = "english" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "javanese" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "javanese" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q6 #5assets/javanese_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "eng_soft_azerty_international_without_dict" local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then alt_inputs = kb.eng_full_azerty_alt_international else alt_inputs = kb.eng_full_azerty_alt_curve_international shift_inputs = kb.eng_full_azerty_shift_international end local s = sf.new_full_keyboard( "englishgb_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q$ #5assets/javanese_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "eng_soft_qwerty_international_without_dict" local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then alt_inputs = kb.eng_full_qwerty_alt_international else alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "englishgb_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q #5assets/javanese_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "eng_soft_qwerty_international_without_dict" local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then alt_inputs = kb.eng_full_qwerty_alt_international else alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "englishgb_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qۿ~ee5assets/javanese_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local traits = si.new_language_traits() local ct = common_traits traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "ā", "ą", "æ", "ç", "č", "ć", "è", "é", "ê", "ë", "ē", "ė", "ę", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "ù", "û", "ü", "ú", "ū", "ñ", "ń", "ß", "ś", "š", "ÿ", "ÿ", "ž", "ź", "ż", "ĺ", "ľ", "ł", "ď", "đ", "ŕ", "ř", "ť", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Ā", "Ą", "Æ", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ē", "Ė", "Ę", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "Ù", "Û", "Ü", "Ú", "Ū", "Ñ", "Ń", "ß", "Ś", "Š", "Ÿ", "Ÿ", "Ž", "Ź", "Ż", "Ĺ", "Ľ", "Ł", "Ď", "Đ", "Ŕ", "Ř", "Ť", } local accent_letter_dictionary = { [string.byte("a")] = "äàâáãåāąæ", [string.byte("c")] = "çčć", [string.byte("e")] = "ëèéêēėę", [string.byte("i")] = "ïîíìīį", [string.byte("o")] = "öôóòõōœø", [string.byte("u")] = "üùûúū", [string.byte("n")] = "ñń", [string.byte("s")] = "ßśš", [string.byte("y")] = "ÿ", [string.byte("z")] = "žźż", [string.byte("l")] = "ĺľł", [string.byte("d")] = "ďđ", [string.byte("r")] = "ŕř", [string.byte("t")] = "ť", [string.byte("A")] = "ÄÀÂÁÃÅĀĄÆ", [string.byte("C")] = "ÇČĆ", [string.byte("E")] = "ËÈÉÊĒĖĘ", [string.byte("I")] = "ÏÎÍÌĪĮ", [string.byte("O")] = "ÖÔÓÒÕŌŒØ", [string.byte("U")] = "ÜÙÛÚŪ", [string.byte("N")] = "ÑŃ", [string.byte("S")] = "ߌŠ", [string.byte("Y")] = "Ÿ", [string.byte("Z")] = "ŽŹŻ", [string.byte("L")] = "ĹĽŁ", [string.byte("D")] = "ĎĐ", [string.byte("R")] = "ŔŘ", [string.byte("T")] = "Ť", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Qagy""5assets/kannada.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("KN", "Kannada") local packagename = pkg.kannadav5 if packagename == nil then packagename = "com.cootek.smartinputv5.language.v5.kannada:" end lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.english .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = packagename .. "kannada_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = packagename .. "kannada_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = packagename .. "kannada_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = packagename .. "kannada_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = packagename .. "kannada_traits.trt.png" lng.statistic_alias = "kannada" lng.categories[si.language.category.FASTSWITCH] = "kannada" lng.categories[si.language.category.SUBTYPE] = "kannada" lng.categories[si.language.category.MIXINPUT] = "kannada" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "kannada" lng.categories[si.language.category.LAYOUT] = "kannada" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = packagename .. "kannada.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q}֎ #5assets/kannada_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs local alt_inputs = kb.kannada_full_alt local main_inputs = kb.kannada_full_main1 local input_type = si.input_type() template = "kannada_soft_full_international" local s = sf.new_full_keyboard( "kannada_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.kannadav5 .. "kannada_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qe½< < #5assets/kannada_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs local alt_inputs = kb.kannada_full_alt local main_inputs = kb.kannada_full_main2 local input_type = si.input_type() template = "kannada_soft_full_international" local s = sf.new_full_keyboard( "kannada_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.kannadav5 .. "kannada_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end for i = 2, 7 do local sk = s.softkeys["sk_1_" .. i] sk.on_long_press_once = nil sk.on_click = function() si.input_string(sk.main_input, false) end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q<=#5assets/kannada_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.kannada_full_qwertz_main local script_inputs = kb.kannada_full_qwertz_script local expand_long_press_inputs = kb.kannada_full_qwertz_expand_long_press_input local input_type = si.input_type() template = "kannada_soft_qwertz_full_international" local s = sf.new_full_keyboard( "kannada_soft_qwertz1", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.kannadav5 .. "kannada_soft_qwertz2.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_zwj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q8l11#5assets/kannada_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.kannada_full_qwertz_main2 local script_inputs = kb.kannada_full_qwertz_script2 local expand_long_press_inputs = kb.kannada_full_qwertz_expand_long_press_input2 local input_type = si.input_type() template = "kannada_soft_qwertz2_full_international" local s = sf.new_full_keyboard( "kannada_soft_qwertz2", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.kannadav5 .. "kannada_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end for j = 1, 10 do local sk = s.softkeys["sk_" .. 3 .. "_" .. j] sk.on_click = full_on_click_commit end local sk_5_3 = s.softkeys["sk_5_3"] local sk_5_4 = s.softkeys["sk_5_4"] local sk_5_5 = s.softkeys["sk_5_5"] sk_5_3.on_click = full_on_click_commit sk_5_4.on_click = full_on_click_commit sk_5_5.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_zwj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q?q&q&5assets/kannada_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0c80 local z_code = 0x0cff local A_code = 0x0c80 local Z_code = 0x0cff local zero_code = 0x0ce6 local nine_code = 0x0ceF local special_semivowel_code = si.u16code("್", 1) local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } local special_semivowel_list = { "್", } local special_vowel_list = { "ಾ", "ಿ", "ೀ", "ು", "ೂ", "ೃ", "ೆ", "ೇ", "ೈ", "ೊ", "ೋ", "ೌ", "ಂ", "ಃ", "಼", } local special_consonant_list = { "ಕ", "ಖ", "ಗ", "ಘ", "ಙ", "ಚ", "ಛ", "ಜ", "ಝ", "ಞ", "ಟ", "ಠ", "ಡ", "ಢ", "ಣ", "ತ", "ಥ", "ದ", "ಧ", "ನ", "ಪ", "ಫ", "ಬ", "ಭ", "ಮ", "ಯ", "ರ", "ಲ", "ವ", "ಶ", "ಷ", "ಸ", "ಹ", "ಳ", "ರ" } local special_script_list = { "್", "ಾ", "ಿ", "ೀ", "ು", "ೂ", "ೃ", "ೆ", "ೇ", "ೈ", "ೊ", "ೋ", "ೌ", "ಂ", "ಃ", "಼", } local special_script_dictionary = { [si.u16code("್", 1)] = "ಅ", [si.u16code("ಾ", 1)] = "ಆ", [si.u16code("ಿ", 1)] = "ಇ", [si.u16code("ೀ", 1)] = "ಈ", [si.u16code("ು", 1)] = "ಉ", [si.u16code("ೂ", 1)] = "ಊ", [si.u16code("ೃ", 1)] = "ಋ", [si.u16code("ೆ", 1)] = "ಎ", [si.u16code("ೇ", 1)] = "ಏ", [si.u16code("ೈ", 1)] = "ಐ", [si.u16code("ೊ", 1)] = "ಒ", [si.u16code("ೋ", 1)] = "ಓ", [si.u16code("ೌ", 1)] = "ಔ", [si.u16code("ಂ", 1)] = "ಂ", [si.u16code("ಃ", 1)] = "ಃ", [si.u16code("಼", 1)] = "಼", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(5) if not si.is_empty(last_text_from_user_input) then if traits.is_contain_triple_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local string_len = si.get_string_length(last_text_from_user_input) if string_len > 3 then last_text_from_user_input = _G.string.sub(last_text_from_user_input, string_len-2, string_len) end if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.get_normal_script_main_character(script) local string_len = si.get_string_length(script) if string_len > 1 then return script end local code = si.u16code(script, 1) if traits.is_special_script_case(code) then return special_script_dictionary[code] end return script; end function traits.is_contain_vowel_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true end end return false end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if code_se == special_semivowel_code and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_triple_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 5 then return false end local code_se = si.u16code(str, 2) local code_fo = si.u16code(str, 4) if code_se == special_semivowel_code and code_fo == special_semivowel_code then local code_fr = si.u16code(str, 1) local code_th = si.u16code(str, 3) local code_fi = si.u16code(str, 5) if traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) and traits.is_special_consonant_case(code_fi) then return true end return false end return false end function traits.is_special_script_case(c) for i, v in ipairs(special_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_kannada_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_kannada_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_kannada_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_kannada_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Q>>5assets/kazakh.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("KK", "Kazakh") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.kazakhv5 .. "kazakh_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.kazakhv5 .. "kazakh_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.kazakhv5 .. "kazakh_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.kazakhv5 .. "kazakh_traits.trt.png" lng.statistic_alias = "kazakh" lng.categories[si.language.category.FASTSWITCH] = "kazakh" lng.categories[si.language.category.SUBTYPE] = "kazakh" lng.categories[si.language.category.MIXINPUT] = "kazakh" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "kazakh" lng.categories[si.language.category.LAYOUT] = "kazakh" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.kazakhv5 .. "kazakh.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.kazakhv5 .. "kazakh_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.kazakhv5 .. "kazakh_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q`A7#5assets/kazakh_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "kazakh_soft_phonepad", kb.russian_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q'Ƙ !5assets/kazakh_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.kk_full_main local input_type = si.input_type() if not is_curve_mode then template = "kazakh_soft_full_international" alt_inputs = kb.russian_full_alt else template = "kazakh_soft_full_curve_international" alt_inputs = kb.russian_full_alt_curve shift_inputs = kb.russian_full_shift_curve end local s = sf.new_full_keyboard( "kazakh_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QZR'5assets/kazakh_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "kazakh_soft_qwerty", kb.russian_tplus_left, kb.russian_tplus_right, kb.russian_tplus_alt, si.TITLE_CASE.CHANGE, 3) s.template = "russian_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q1UU5assets/kazakh_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = si.u16code("а", 1) local z_code = si.u16code("я", 1) local A_code = si.u16code("А", 1) local Z_code = si.u16code("Я", 1) local special_lower_list = { "ё", "қ", "ң", "ғ", "ұ", "ү", "і", "ө", "ә", "һ", } local special_upper_list = { "Ё", "Қ", "Ң", "Ғ", "Ұ", "Ү", "І", "Ө", "Ә", "Һ", } local accent_letter_dictionary = { [si.u16code("е", 1)] = "ё", [si.u16code("к", 1)] = "қ", [si.u16code("н", 1)] = "ң", [si.u16code("г", 1)] = "ғ", [si.u16code("у", 1)] = "ұү", [si.u16code("ы", 1)] = "і", [si.u16code("о", 1)] = "ө", [si.u16code("а", 1)] = "ә", [si.u16code("х", 1)] = "һ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_cyrillic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PKk5:Q5assets/kb_banner_config.jsonUT  n_ n_ n_ w@TГw@TГw@TГA 0 W:A=WDJŭKKc쿻UǗ&6@!Mc||,(ZD"0<:P rIa%U`JgV֠Y+Ѱ!1nIہ=['B.e[G/hOjVgPKolPK n5:QB]RR5assets/keyboard.lua.pngUT n_n_n_ WГWГWГlocal P = {} P._G = _G if _REQUIREDNAME == nil then keyboard = P else _G[_REQUIREDNAME] = P end setfenv(1, P) --keyboard phonepad eng_phonepad_main = { {"@", "abc", "def"}, {"ghi", "jkl", "mno", ""}, {"pqrs", "tuv", "wxyz"} } eng_phonepad_alt = { {"1", "2", "3"}, {"4", "5", "6", "0"}, {"7", "8", "9"}, } --keyboard full eng_full_qwerty_main = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l"}, {"z", "x", "c", "v", "b", "n", "m"}, } eng_full_qwerty_upper_case_main = { {"Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"}, {"A", "S", "D", "F", "G", "H", "J", "K", "L"}, {"Z", "X", "C", "V", "B", "N", "M"}, } --- the uppercase setting is now only used for the SimpleCangjie. eng_full_qwertz_main = { {"q", "w", "e", "r", "t", "z", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l"}, {"y", "x", "c", "v", "b", "n", "m"}, } eng_full_azerty_main = { {"a", "z", "e", "r", "t", "y", "u", "i", "o", "p"}, {"q", "s", "d", "f", "g", "h", "j", "k", "l", "m"}, {"w", "x", "c", "v", "b", "n", "'"}, } eng_full_qwerty_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\""}, {"@", "/", "-", "'", "!", "?", ";"}, } chs_full_qwerty_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {"_", ":", "\"", "…", ";", "&", "#", "(", ")"}, {"-", "!", "/", ".", "、", "?", "@" }, } chs_full_qwerty_alt_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, --for draw the "shift_title" of softkey in **curve** template {"_", ":", "\"", "…", ";", "&", "#", "(", ")"}, {"-", "!", "/", ".", "、", "?", "@" }, } chs_full_qwerty_shift_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {}, {}, } eng_full_qwerty_alt_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\""}, {"@", "/", "-", "'", "!", "?", ";"}, } eng_full_qwerty_shift_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {}, {}, } eng_full_qwerty_alt_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\""}, {"@", "/", "-", "'", "!", "?", ";"}, } eng_full_qwerty_alt_curve_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\""}, {"@", "/", "-", "'", "!", "?", ";"}, } eng_full_qwerty_shift_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {}, {}, } eng_full_qwerty_shift_curve_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {}, {}, } eng_full_azerty_alt_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|"}, {"@", "/", "-", "÷", "!", "?", ";"}, } eng_full_azerty_alt_curve_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|"}, {"@", "/", "-", "÷", "!", "?", ";"}, } eng_full_azerty_shift_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {}, {}, } spanish_full_alt_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|"}, {"@", "/", "-", "'", "!", "?", ";"}, } spanish_full_alt_curve_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|"}, {"@", "/", "-", "'", "!", "?", ";"}, } spanish_full_shift_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {}, {}, } --keyboard tplus eng_tplus_qwerty_left = { {"q", "e", "t", "u", "o"}, {"a", "d", "g", "j", "l"}, {"z", "c", "b", "m"}, } eng_tplus_qwerty_right = { {"w", "r", "y", "i", "p"}, {"s", "f", "h", "k", "-"}, {"x", "v", "n", "'"} } chs_tplus_qwerty_right = { {"w", "r", "y", "i", "p"}, {"s", "f", "h", "k", ""}, {"x", "v", "n", ""} } eng_tplus_qwertz_left = { {"q", "e", "t", "u", "o"}, {"a", "d", "g", "j", "l"}, {"y", "c", "b", "m"}, } eng_tplus_qwertz_right = { {"w", "r", "z", "i", "p"}, {"s", "f", "h", "k", "-"}, {"x", "v", "n", "'"} } eng_tplus_azerty_left = { {"a", "e", "t", "u", "o"}, {"q", "d", "g", "j", "l"}, {"w", "c", "b", "m"}, } eng_tplus_azerty_right = { {"z", "r", "y", "i", "p"}, {"s", "f", "h", "k", "-"}, {"x", "v", "n", "'"} } eng_tplus_qwerty_alt = { {"1", "2", "3", "4", "5"}, {"6", "7", "8", "9", "0"}, {"@", "!", "?", ","}, } chs_tplus_qwerty_alt = { {"1", "2", "3", "4", "5"}, {"6", "7", "8", "9", "0"}, {"@", "!", "?", "."}, } eng_tplus_qwerty_alt_international = { {"1", "2", "3", "4", "5"}, {"6", "7", "8", "9", "0"}, {"@", "!", "?", {",", ";"}}, } --wubi tplus keyboard wubi_tplus_left = { {"q", "e", "t", "u", "o"}, {"a", "d", "g", "j", "l"}, {"z", "x", "v", "n"}, } wubi_tplus_right = { {"w", "r", "y", "i", "p"}, {"s", "f", "h", "k", ""}, {"", "c", "b", "m"}, } cangjie_qwerty_main = { {"手", "田", "水", "口", "廿", "卜", "山", "戈", "人", "心"}, {"日", "尸", "木", "火", "土", "竹", "十", "大", "中"}, {"難", "金", "女", "月", "弓", "一"}, } cangjie_tplus_left = { {"手", "水", "廿", "山", "人"}, {"日", "木", "土", "十", "中"}, {"難", "女", "弓",}, } cangjie_tplus_right = { {"田", "口", "卜", "戈", "心"}, {"尸", "火", "竹", "大", ""}, {"金", "月", "一"}, } cht_phonepad_main = { {"ㄅㄉㄚ", "ㄍㄐㄞ", "ㄓㄗㄢㄦ"}, {"ㄆㄊㄛ", "ㄎㄑㄟ", "ㄔㄘㄣㄧ", "123"}, {"ㄇㄋㄜ", "ㄏㄒㄠㄡ", "ㄕㄙㄤㄨ"}, {"ㄈㄌㄝ", "ˇˋˊ˙", "ㄖㄥㄩ"}, } cht_full_main = { {"ㄅ", "ㄉ", "ˇ", "ˋ", "ㄓ", "ˊ", "˙", "ㄚ", "ㄞ", "ㄢ"}, {"ㄆ", "ㄊ", "ㄍ", "ㄐ", "ㄔ", "ㄗ", "ㄧ", "ㄛ", "ㄟ", "ㄣ"}, {"ㄇ", "ㄋ", "ㄎ", "ㄑ", "ㄕ", "ㄘ", "ㄨ", "ㄜ", "ㄠ", "ㄤ"}, {"ㄈ", "ㄌ", "ㄏ", "ㄒ", "ㄖ", "ㄙ", "ㄩ", "ㄝ", "ㄡ", "ㄥ"}, {"ㄦ"} } cht_tplus_left = { {"ㄅ", "ˇ", "ㄓ", "ˊ", "ㄞ"}, {"ㄆ", "ㄍ", "ㄔ", "ㄧ", "ㄟ"}, {"ㄇ", "ㄎ", "ㄕ", "ㄨ", "ㄠ"}, {"ㄈ", "ㄏ", "ㄖ", "ㄩ", "ㄡ"}, {"ㄦ"}, } cht_tplus_right = { {"ㄉ", "ˋ", "ㄚ", "˙", "ㄢ"}, {"ㄊ", "ㄐ", "ㄗ", "ㄛ", "ㄣ"}, {"ㄋ", "ㄑ", "ㄘ", "ㄜ", "ㄤ"}, {"ㄌ", "ㄒ", "ㄙ", "ㄝ", "ㄥ"}, {""}, } russian_phonepad_main = { {"@", "абвг", "дежз"}, {"ийкл", "мноп", "рсту", ""}, {"фхцч", "шщъы", "ьэюя"} } russian_full_main = { {"й", "ц", "у", "к", "е", "н", "г", "ш", "щ", "з", "х", "ъ"}, {"ф", "ы", "в", "а", "п", "р", "о", "л", "д", "ж", "э"}, {"я", "ч", "с", "м", "и", "т", "ь", "б", "ю"}, } russian_azerty_main = { {"й", "ц", "у", "к", "е", "н", "г", "ш", "щ", "з", "х", "ъ"}, {"ё", "ф", "ы", "в", "а", "п", "р", "о", "л", "д", "ж", "э"}, {"я", "ч", "с", "м", "и", "т", "ь", "б", "ю"}, } russian_full_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "(", ")"}, {"\\", "_", "`", "#", "&", "*", "|", "€", "№", "«", "»"}, {"@", "/", "-", "'", "!", "?", "\"", ";", ":"}, } russian_azerty_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "(", ")"}, {"\\", "_", "`", "#", "&", "*", "|", "₽", "№", "«", "»", "÷"}, {"@", "/", "-", "'", "!", "?", "\"", ";", ":"}, } russian_full_alt_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "(", ")"}, {"\\", "_", "`", "#", "&", "*", "|", "₽", "№", "«", "»"}, {"@", "/", "-", "'", "!", "?", "\"", ";", ":"}, } russian_full_shift = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "(", ")"}, {}, {}, } russian_full_shift_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "(", ")"}, {}, {}, } russian_tplus_left = { {"й", "у", "е", "г", "щ", "х"}, {"ф", "в", "п", "о", "д", "э"}, {"я", "с", "и", "ь", "ю"}, } russian_tplus_right = { {"ц", "к", "н", "ш", "з", "ъ"}, {"ы", "а", "р", "л", "ж", "-"}, {"ч", "м", "т", "б", ""}, } russian_tplus_alt = { {"1", "2", "3", "4", "5", "6"}, {"7", "8", "9", "0", "\"", ";"}, {"@", "!", "?", {",",":"}, "/"}, } ger_full_qwertz_german_main = { {"q", "w", "e", "r", "t", "z", "u", "i", "o", "p", "ü", "ß"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "ö", "ä"}, {"y", "x", "c", "v", "b", "n", "m"}, }--QWERTZ(german) ger_full_qwerty_main = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l"}, {"z", "x", "c", "v", "b", "n", "m"}, } ger_full_qwertz_main = { {"q", "w", "e", "r", "t", "z", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l"}, {"y", "x", "c", "v", "b", "n", "m"}, } ger_full_azerty_main = { {"a", "z", "e", "r", "t", "y", "u", "i", "o", "p"}, {"q", "s", "d", "f", "g", "h", "j", "k", "l"}, {"w", "x", "c", "v", "b", "n", "m"}, } ger_full_german_alt_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£", "»"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";"}, }--for qwertz german ger_full_german_alt_curve_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£", "»"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";"}, }--for qwertz german ger_full_german_shift_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£", "»"}, {}, {}, } ger_tplus_qwerty_left = { {"q", "e", "t", "u", "o"}, {"a", "d", "g", "j", "l"}, {"z", "c", "b", "m"}, } ger_tplus_qwerty_right = { {"w", "r", "y", "i", "p"}, {"s", "f", "h", "k", "-"}, {"x", "v", "n", "'"} } ger_tplus_qwertz_left = { {"q", "e", "t", "u", "o"}, {"a", "d", "g", "j", "l"}, {"y", "c", "b", "m"}, } ger_tplus_qwertz_right = { {"w", "r", "z", "i", "p"}, {"s", "f", "h", "k", "-"}, {"x", "v", "n", "'"} } ger_tplus_azerty_left = { {"a", "e", "t", "u", "o"}, {"q", "d", "g", "j", "l"}, {"w", "c", "b", "m"}, } ger_tplus_azerty_right = { {"z", "r", "y", "i", "p"}, {"s", "f", "h", "k", "-"}, {"x", "v", "n", "'"} } ger_tplus_qwertz_german_left = { {"q", "e", "t", "u", "o", "ü"}, {"a", "d", "g", "j", "l", "ä"}, {"y", "c", "b", "m"}, }--QWERTZ(German) ger_tplus_qwertz_german_right = { {"w", "r", "z", "i", "p", "ß"}, {"s", "f", "h", "k", "ö", "-"}, {"x", "v", "n", "'"}, }--QWERTZ(German) ger_tplus_qwertz_german_alt = { {"1", "2", "3", "4", "5", "\""}, {"6", "7", "8", "9", "0", ";"}, {"@", "!", "?", {",",":"}}, } esp_full_qwerty_main = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "ñ"}, {"z", "x", "c", "v", "b", "n", "m"}, }--old spanish qwerty main(for qwerty_spanish & refered languages) esp_full_qwerty_main_new = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l"}, {"z", "x", "c", "v", "b", "n", "m"}, } esp_full_qwertz_main = { {"q", "w", "e", "r", "t", "z", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l"}, {"y", "x", "c", "v", "b", "n", "m"}, } esp_full_azerty_main = { {"a", "z", "e", "r", "t", "y", "u", "i", "o", "p"}, {"q", "s", "d", "f", "g", "h", "j", "k", "l"}, {"w", "x", "c", "v", "b", "n", "m"}, } esp_tplus_qwerty_left = { {"q", "e", "t", "u", "o"}, {"a", "d", "g", "j", "l"}, {"z", "c", "b", "m"}, } esp_tplus_qwerty_right = { {"w", "r", "y", "i", "p"}, {"s", "f", "h", "k", "ñ"}, {"x", "v", "n", "'"} }--old spanish tplus(for qwerty_spanish & refered languages) esp_tplus_qwerty_left_new = { {"q", "e", "t", "u", "o"}, {"a", "d", "g", "j", "l"}, {"z", "c", "b", "m"}, } esp_tplus_qwerty_right_new = { {"w", "r", "y", "i", "p"}, {"s", "f", "h", "k", "-"}, {"x", "v", "n", "'"} } esp_tplus_qwertz_left = { {"q", "e", "t", "u", "o"}, {"a", "d", "g", "j", "l"}, {"y", "c", "b", "m"}, } esp_tplus_qwertz_right = { {"w", "r", "z", "i", "p"}, {"s", "f", "h", "k", "-"}, {"x", "v", "n", "'"} } esp_tplus_azerty_left = { {"a", "e", "t", "u", "o"}, {"q", "d", "g", "j", "l"}, {"w", "c", "b", "m"}, } esp_tplus_azerty_right = { {"z", "r", "y", "i", "p"}, {"s", "f", "h", "k", "-"}, {"x", "v", "n", "'"} } esp_tplus_qwerty_left = { {"q", "e", "t", "u", "o"}, {"a", "d", "g", "j", "l"}, {"z", "c", "b", "m"}, } esp_tplus_qwerty_right = { {"w", "r", "y", "i", "p"}, {"s", "f", "h", "k", "ñ"}, {"x", "v", "n", "'"} } swe_full_qwerty_main = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "å"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "ö", "ä"}, {"z", "x", "c", "v", "b", "n", "m"}, } swe_full_qwerty_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";"}, } swe_full_qwerty_alt_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";"}, } swe_full_qwerty_shift = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", '£'}, {}, {}, } swe_full_qwerty_shift_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", '£'}, {}, {}, } --dannish dan_full_qwerty_main = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "å"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "æ", "ø"}, {"z", "x", "c", "v", "b", "n", "m"}, } --norwegian nor_full_qwerty_main = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "å"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "ø", "æ"}, {"z", "x", "c", "v", "b", "n", "m"}, } --bulgarian bul_full_qwerty_main = { {"я", "в", "е", "р", "т", "ъ", "у", "и", "о", "п", "ч"}, {"а", "с", "д", "ф", "г", "х", "й", "к", "л", "ш", "щ"}, {"з", "ь", "ц", "ж", "б", "н", "м", "ю"}, } bul_full_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";", "`"}, } bul_full_alt_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";", "`"}, } bul_full_shift_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£"}, {}, {}, } bul_full_qwertz_main = { {"у", "е", "и", "ш", "щ", "к", "с", "д", "з", "ц"}, {"ь", "я", "а", "о", "ж", "г", "т", "н", "в", "м", "ч"}, {"ю", "й", "ъ", "ф", "х", "п", "р", "л", "б"}, } bul_full_qwertz_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";", "`", "÷"}, } bul_full_qwertz_alt_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";", "`", "÷"}, } bul_full_qwertz_alt_curve_shift = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {}, {}, } bul_tplus_qwertz_left = { {"/", "у", "и", "щ", "с", "з",} , {"\\", "я", "о", "г", "н", "м", }, {"ю", "й", "ф", "п", "л",}, } bul_tplus_qwertz_right = { {":", "е", "ш", "к", "д", "ц",}, {"ь", "а", "ж", "т", "в", "ч",}, {"", "ъ", "х", "р", "б",}, } bul_tplus_qwertz_alt = { {"\"", "1", "2", "3", "4", "5"}, {"-", "6", "7", "8", "9", "0"}, {"@", "!", "?", ";", {",", "_"}}, } bul_tplus_left = { {"я", "е", "т", "у", "о", "ч"}, {"а", "д", "г", "й", "л", "щ"}, {"з", "ц", "б", "м",}, } bul_tplus_right = { {"в", "р", "ъ", "и", "п","/"}, {"с", "ф", "х", "к", "ш","'"}, {"ь", "ж", "н", "ю"}, } bul_tplus_alt = { {"1", "2", "3", "4", "5", "\""}, {"6", "7", "8", "9", "0", "-"}, {"@", "!", "?", {",",":"}}, } bul_phonepad_main = { {"@", "абвг", "дежз"}, {"ийкл", "мноп", "рсту", ""}, {"фхцч", "шщъ", "ьюя"}, } --greek gre_full_qwerty_main = { {";", "ς", "ε", "ρ", "τ", "υ", "θ", "ι", "ο", "π",}, {"α", "σ", "δ", "φ", "γ", "η", "ξ", "κ", "λ",}, {"ζ", "χ", "ψ", "ω", "β", "ν", "μ",}, } gre_full_qwerty_alt_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\""}, {"@", "/", "-", "'", "!", "?", "€"}, } gre_full_qwerty_shift_curve_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {}, {}, } gre_full_qwerty_alt_curve_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\""}, {"@", "/", "-", "'", "!", "?", "€"}, } gre_tplus_left = { {";", "ε", "τ", "θ", "ο",}, {"α", "δ", "γ", "ξ", "λ",}, {"ζ", "ψ", "β", "μ",}, } gre_tplus_right = { {"ς", "ρ", "υ", "ι", "π"}, {"σ", "φ", "η", "κ", "-"}, {"χ", "ω", "ν", "'"}, } gre_phonepad_main = { {"@", "αβγ", "δεζ"}, {"ηθι", "κλμ", "νξο", ""}, {"πρσς", "τυφ", "χψω"}, } --ukrainian uk_full_qwerty_main = { {"й", "ц", "у", "к", "е", "н", "г", "ш", "щ", "з", "х", "ї", }, {"ф", "і", "в", "а", "п", "р", "о", "л", "д", "ж", "є", "ґ", }, {"я", "ч", "с", "м", "и", "т", "ь", "б", "ю", }, } uk_full_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£", "«"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€", "»"}, {"@", "/", "-", "'", "!", "?", ";", "`", "÷"}, } uk_full_alt_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£", "«"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€", "»"}, {"@", "/", "-", "'", "!", "?", ";", "`", "÷"}, } uk_full_shift_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£", "«"}, {}, {}, } uk_tplus_left = { {"й", "у", "е", "г", "щ", "х",}, {"ф", "в", "п", "о", "д", "є",}, {"я", "с", "и", "ь", "ю", }, } uk_tplus_right = { {"ц", "к", "н", "ш", "з", "ї",}, {"і", "а", "р", "л", "ж", "ґ", }, {"ч", "м", "т", "б", ""}, } uk_tplus_alt = { {"1", "2", "3", "4", "5", "-"}, {"6", "7", "8", "9", "0", "/"}, {"@", "!", "?", "'", {",", ";"}}, } uk_phonepad_main = { {"@", "абвгґ", "дежз"}, {"ийкл", "мноп", "рсту", ""}, {"фхцч", "шщїі", "ьєюя"}, } --arabic ar_full_qwerty_main_classic = { {"ض", "ص", "ث", "ق", "ف", "غ", "ع", "ه", "خ", "ح", "ج", "د"}, {"ش", "س", "ي", "ب", "ل", "ا", "ت", "ن", "م", "ك", "ط", "ذ"}, {"ئ", "ء", "ؤ", "ر", "ى", "ة", "و", "ز","ظ", "آ"}, } ar_full_qwerty_main = { {"ض", "ص", "ث", "ق", "ف", "غ", "ع", "ه", "خ", "ح", "ج"}, {"ش", "س", "ي", "ب", "ل", "ا", "ت", "ن", "م", "ك", "ة"}, {"ء", "ظ", "ط", "ذ", "د", "ز", "ر", "و", "‘"}, }--keyboard modern ar_full_qwerty_expand_long_press_input_classic = { {"١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠"}, {}, {}, } ar_full_qwerty_expand_long_press_input = { {"١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠"}, {}, {"", "", "", "", "", "", "", "", "ـًٌٍَُِّْ"}, } ar_full_alt = { {"١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠", "چ"}, {"$", "&", "ى", "پ", "لا", "أ", "ث", {"(", ")", type="normal"}, {")", "(", type="normal"}, "گ", nil}, {"@", "#", "_", "\"", "!", "؟", "؛", "ؤ", "ً"}, }--alt modern ar_full_alt_classic = { {"١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠", {"(", ")", type="normal"}, {")", "(", type="normal"},}, {"\\", "_", "+", "=", "\"", "$", "&", "#", "*", "%", "^", "~"}, {"@", "/", "-", "'", "!", "؟", "؛", ":", {"،", ";"}, ","}, } ar_full_alt_curve = { {"١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠", {"(", ")", type="normal"}, {")", "(", type="normal"},}, {"\\", "_", "+", "=", "\"", "$", "&", "#", "*", "%", "^", "~"}, {"@", "/", "-", "'", "!", "؟", "؛", ":", {"،", ";"}, ","}, } ar_full_shift_curve_classic = { {"١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠", {"(", ")", type="normal"}, {")", "(", type="normal"},}, {}, {}, } ar_full_shift_curve = { {"١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠", "چ"}, {}, {}, } ar_full_qwerty_expand_long_press_input_num_row_on = { {}, {}, {"", "", "", "", "", "", "", "", "ـًٌٍَُِّْ"}, } ar_full_alt_num_row_off = { {{"1١", "1", type="normal"}, {"2٢", "2", type="normal"}, {"3٣", "3", type="normal"}, {"4٤", "4", type="normal"}, {"5٥", "5", type="normal"}, {"6٦", "6", type="normal"}, {"7٧", "7", type="normal"}, {"8٨", "8", type="normal"}, {"9٩", "9", type="normal"}, {"0٠", "0", type="normal"}, "چ"}, {"$", "&", "ى", "پ", "لا", "أ", "ث", {"(", ")", type="normal"}, {")", "(", type="normal"}, "گ", nil}, {"@", "#", "_", "\"", "!", "؟", "؛", "ؤ", "ً"}, }--alt modern ar_full_alt_classic_num_row_off = { {{"1١", "1", type="normal"}, {"2٢", "2", type="normal"}, {"3٣", "3", type="normal"}, {"4٤", "4", type="normal"}, {"5٥", "5", type="normal"}, {"6٦", "6", type="normal"}, {"7٧", "7", type="normal"}, {"8٨", "8", type="normal"}, {"9٩", "9", type="normal"}, {"0٠", "0", type="normal"}, {"(", ")", type="normal"}, {")", "(", type="normal"},}, {"\\", "_", "+", "=", "\"", "$", "&", "#", "*", "%", "^", "~"}, {"@", "/", "-", "'", "!", "؟", "؛", ":", {"،", ";"}, ","}, } ar_full_alt_curve_num_row_off = { {{"1١", "1", type="normal"}, {"2٢", "2", type="normal"}, {"3٣", "3", type="normal"}, {"4٤", "4", type="normal"}, {"5٥", "5", type="normal"}, {"6٦", "6", type="normal"}, {"7٧", "7", type="normal"}, {"8٨", "8", type="normal"}, {"9٩", "9", type="normal"}, {"0٠", "0", type="normal"}, {"(", ")", type="normal"}, {")", "(", type="normal"},}, {"\\", "_", "+", "=", "\"", "$", "&", "#", "*", "%", "^", "~"}, {"@", "/", "-", "'", "!", "؟", "؛", ":", {"،", ";"}, ","}, } ar_full_shift_curve_classic_num_row_off = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", {"(", ")", type="normal"}, {")", "(", type="normal"},}, {}, {}, } ar_full_shift_curve_num_row_off = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "چ"}, {}, {}, } --arabic for sindhi ar_full_qwerty_main1 = { {"ق", "ص", "ي", "ر", "ت", "ٿ", "ع", "ڳ", "و", "پ", "ڇ"}, {"ا", "س", "د", "ف", "گ", "ه", "ج", "ڪ", "ل", "ک", "ڱ"}, {"ز", "خ", "ط", "ڀ", "ب", "ن", "م"}, } ar_full_qwerty_main2 = { {"ض", "ڙ", "ٽ", "ث", "ٺ", "ھ", "غ", "ڦ", "ڃ", "ڄ", "چ"}, {"آ", "ش", "ڊ", "ڦ", "ح", "ۡ", "۽", "ڏ", "ڌ", "ئ", "ڍ"}, {"ذ", "ّ", "ظ", "ء", "ٻ", "ڻ", "۾"}, } ar_full_alt_for_sindhi = { {"١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠", {"()", 1, type="input_match_symbol"},}, {"ى", "ہ", "ؤ", "ة", "ٰ", "ً", "ٗ", "ٖ","\\", "_", ":",}, {"@", "/", "-", "'", "!", "؟", "؛",}, } ar_full_alt_for_sindhi2 = { {"١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠", {"()", 1, type="input_match_symbol"},}, {"ى", "ہ", "ؤ", "ة", "ٰ", "ً", "ٗ", "ٖ","ۡ", "_", ":",}, {"@", "/", "-", "'", "!", "؟", "؛",}, } sindhi_full_alt = { {}, {"\\", "_", "+", "=", "₹", "&", "#", "*", "%", "^", "|"}, {"@", "/", "-", "'", "!", "?", "\"", ";", ":", "(", ")"}, } ar_full_qwerty_expand_long_press_input_for_sindhi = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ""}, {"", "", "", "", "", "", "", "", "", "", ""}, {"", "", "", "", "", "", ""}, } --Vietnam vietnam_full_qwerty_expand_long_press_input = { {"","","ê","","","","ư","",{"ô", "ơ"},""}, {{"ă","â"},"","đ","","","","","",""}, {}, } --serbian latin se_full_qwerty_main = { {"q", "w", "e", "r", "t", "z", "u", "i", "o", "p", "š", "đ"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "č", "ć"}, {"y", "x", "c", "v", "b", "n", "m", "ž", "-"}, } se_full_alt = { {"1", "2", "3", "4", "5", "6", "7","8", "9", "0", "£", "»"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";", "`", "÷"}, } se_full_alt_curve = { {"1", "2", "3", "4", "5", "6", "7","8", "9", "0", "£", "»"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";", "`", "÷"}, } se_full_shift_curve = { {"1", "2", "3", "4", "5", "6", "7","8", "9", "0", "£", "»"}, {}, {}, } -- turkish tr_full_alt = { {"1", "2", "3", "4", "5", "6", "7","8", "9", "0", "₺", "»"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";", "`", "÷"}, } tr_full_alt_curve = { {"1", "2", "3", "4", "5", "6", "7","8", "9", "0", "₺", "»"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";", "`", "÷"}, } tr_full_shift_curve = { {"1", "2", "3", "4", "5", "6", "7","8", "9", "0", "₺", "»"}, {}, {}, } --turkish azerty tr_full_main = { {"q", "w", "e", "r", "t", "y", "u", "ı", "o", "p", "ğ", "ü"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "ş", "i"}, {"z", "x", "c", "v", "b", "n", "m", "ö", "ç"}, } tr_full_main_fkey = { {"f", "g", "ğ", "ı", "o", "d", "r", "n", "h", "p", "q", "w"}, {"u", "i", "e", "a", "ü", "t", "k", "m", "l", "y", "ş", "x"}, {"j", "ö", "v", "c", "ç", "z", "s", "b",}, } tr_full_alt = { {"1", "2", "3", "4", "5", "6", "7","8", "9", "0", "₺", "»"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€", "÷"}, {"@", "/", "-", "'", "!", "?", ";", "`", }, } --icelandic is_full_qwerty_main = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "ð"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "æ", "þ"}, {"z", "x", "c", "v", "b", "n", "m"}, } --albanian sq_full_qwerty_main = { {"q", "w", "e", "r", "t", "z", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "ë"}, {"y", "x", "c", "v", "b", "n", "m", "ç"}, } sq_full_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|"}, {"@", "/", "-", "'", "!", "?", ";", "`"}, } sq_full_alt_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|"}, {"@", "/", "-", "'", "!", "?", ";", "`"}, } sq_full_shift = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {}, {}, } --tagalog tl_full_main = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "ñ"}, {"z", "x", "c", "v", "b", "n", "m"}, } tl_tplus_qwerty_right = { {"w", "r", "y", "i", "p"}, {"s", "f", "h", "k", "ñ"}, {"x", "v", "n", "'"} } tl_phonepad_main = { {"@", "abc", "def"}, {"ghi", "jkl", "mnño", ""}, {"pqrs", "tuv", "wxyz"} } --macedonian mk_full_main = { {"љ", "њ", "е", "р", "т", "ѕ", "у", "и", "о", "п", "ш"}, {"а", "с", "д", "ф", "г", "х", "ј", "к", "л", "ч", "ќ"}, {"з", "џ", "ц", "в", "б", "н", "м", "ѓ", "ж"}, } mk_full_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";", "`", "÷"}, } mk_alt_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";", "`", "÷"}, } mk_curve_shift = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£"}, {}, {}, } mk_tplus_left = { {"љ", "е", "т", "у", "о", "ш"}, {"а", "д", "г", "ј", "л", "ќ"}, {"з", "ц", "б", "м", "ж"}, } mk_tplus_right = { {"њ", "р", "ѕ", "и", "п", "/"}, {"с", "ф", "х", "к", "ч", "'"}, {"џ", "в", "н", "ѓ", ""}, } mk_tplus_alt = { {"1", "2", "3", "4", "5", "\""}, {"6", "7", "8", "9", "0", "-"}, {"@", "!", "?", ";", {",", ":"}}, } --serbian serbian_full_main = { {"љ", "њ", "е", "р", "т", "з", "у", "и", "о", "п", "ш"}, {"а", "с", "д", "ф", "г", "х", "ј", "к", "л", "ч", "ћ"}, {"џ", "ц", "в", "б", "н", "м", "ђ", "ж"}, } serbian_full_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£", }, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";", "`" }, } serbian_alt_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£", }, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€"}, {"@", "/", "-", "'", "!", "?", ";", "`" }, } serbian_curve_shift = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£", }, {}, {}, } serbian_tplus_left = { {"љ", "е", "т", "у", "о", "ш"}, {"а", "д", "г", "ј", "л", "ћ"}, {"џ", "в", "н", "ђ"}, } serbian_tplus_right = { {"њ", "р", "з", "и", "п", "/"}, {"с", "ф", "х", "к", "ч", "-"}, {"ц", "б", "м", "ж"}, } serbian_tplus_alt = { {"1", "2", "3", "4", "5", "\""}, {"6", "7", "8", "9", "0", "'"}, {"@", "!", "?", {",",":"}}, } --kazakh kk_full_main = { {"й", "ц", "у", "к", "е", "н", "г", "ш", "щ", "з", "х", "ъ"}, {"ф", "ы", "в", "а", "п", "р", "о", "л", "д", "ж", "э"}, {"я", "ч", "с", "м", "и", "т", "ь", "б", "ю"}, } --hindi hi_full_qwerty_main1 = { {"ौ", "ै", "ा", "ी", "ू", "ब", "ह", "ग", "द", "ज", "ड", }, {"ो", "े", "्", "ि", "ु", "प", "र", "क", "त", "च", "ट", }, {"ॉ", "ं", "म", "न", "व", "ल", "स", "य", "़", }, } hi_full_qwerty_main2 = { {"औ", "ऐ", "आ", "ई", "ऊ", "भ", "ः", "घ", "ध", "झ", "ढ", }, {"ओ", "ए", "अ", "इ", "उ", "फ", "ऱ", "ख", "थ", "छ", "ठ", }, {"ऑ", "ँ", "ण", "ऩ", "ळ", "श", "ष", "ृ", "ञ", }, } hi_full_qwerty_expand_long_press_input1 = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£"}, {"","","","","","","ऋॠ","","","",""}, {"ॕ","ॢॣ","ॐ","ङ","","ऌॡॄ","","य़","ॽ॰ऽ"}, } hi_full_qwerty_expand_long_press_input2 = { {}, {"ऑऒ","ऍऎ","","","","","ॢॣ","","","",""}, {"","ॅ","","ऱ","ऴ","","","ॄ",""}, } hi_full_alt = { {"१", "२", "३", "४", "५", "६", "७", "८", "९", "०", {"\"", "~"}}, {"\\", "_", "+", "=", "$", "&", "#", "*", "%", "^", "|"}, {"@", "/", "-", "'", "!", "?", {",", "\""}, ";", ":"}, } --hindi changeable hi_full_qwertz_main1 = { {"अ", "आ", "इ", "ई", "उ", "ऊ", "ए", "ऐ", "ओ", "औ", }, {"क", "ख", "ग", "घ", "च", "छ", "ज", "झ", "ं", "ः", }, {"ट", "ठ", "ड", "ढ", "ण", "त", "थ", "द", "ध", "न", }, {"प", "फ", "ब", "भ", "म", "य", "र", "ल", "व", "श", }, {"ष", "स", "ह", "क्ष", "त्र", "ऋ", "ँ", "़", }, } hi_full_qwertz_script1 = { {"्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", }, {"", "", "", "", "", "", "", "", "ं", "ः", }, {}, {}, {"", "", "", "", "", "ृ", "ँ", "़", }, } hi_full_qwertz_expand_long_press_input1 = { {"्", "ा", {"ि","ऌ","ॡ",}, "ी", "ु", "ू", {"े","ऍ",}, "ै", "ो", "ौ", }, {{"क़","कं","क्र","र्क","कृ",}, "ख़", {"ग़","गं","ग्र","गृ",}, {"घं","घ्र",}, {"चं","र्च",}, {"छं",}, {"जं","र्ज","ज़",}, {"झं",}, "ं", "ः",}, {{"टं","ट्र",},{"ठं"},{"डं","ड़",},{"ढं","ढ़",},{"र्ण",},{"तं","त्त","र्त","त्र","तृ",},{"थं","थ्र",}, {"दं","द्र","दृ","द्","द्य",},{"धं","ध्र","धृ","र्ध",},{"नं","नृ","र्न"},}, {{"पं","प्र","र्प","पृ",},{"फं","फ्र","फ़",},{"बं","ब्र",},{"भं","भ्र","र्भ",},{"मं","में","मैं","र्म","म्र","मृ",},{"यं","र्य",},"र",{"लं",},{"वं","वृ","व्र","र्व",},{"शं","श्र"},}, {{"ष्","र्ष",},{"सं","र्स","स्र",},{"हैँ","ह्म",},{"क्ष"},{"त्रं",},{"ृ","ॠ","ॄ",},{"ँ", "ॢ", "ॣ",},"़",}, } hi_full_qwertz_main2 = { {"अ", "आ", "इ", "ई", "उ", "ऊ", "ए", "ऐ", "ओ", "औ", }, {"ज्ञ", "ङ", "ञ", "श्र", "क्र", "ग्र", "द्र", "ध्र", "ं", "ः", }, {"प्र", "ब्र", "भ्र", "म्र", "फ्र", "व्र", "क्त", "त्त", "ह्म", "र्र", }, {"स्र", "ह्र", "द्द", "द्ध", "द्ब", "द्भ", "द्म", "द्व", "दृ", "श्च", }, {"ळ", "ॐ", "ऽ", "ॅ", "ॉ", "ऋ", "ँ", "़", }, } hi_full_qwertz_script2 = { {"्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", }, {"", "", "", "", "", "", "", "", "ं", "ः", }, {}, {}, {"", "", "", "ॅ", "ॉ", "ृ", "ँ", "़", }, } hi_full_qwertz_expand_long_press_input2 = { {"्", "ा", {"ि","ऌ","ॡ",}, "ी", "ु", "ू", {"े","ऍ",}, "ै", "ो", "ौ", }, {{"ज्ञ",}, {"ङ",}, {"ञ",}, {"श्र",}, {"क्र",}, {"ग्र",}, {"द्र",}, {"ध्र",}, "ं", "ः", }, {{"प्र",}, {"ब्र",}, {"भ्र",}, {"म्र",}, {"फ्र",}, {"व्र",}, {"क्त",}, {"त्त",}, {"ह्म",}, {"र्र",}, }, {{"स्र",}, {"ह्र",}, {"द्द",}, {"द्ध",}, {"द्ब",}, {"द्भ",}, {"द्म",}, {"द्व",}, {"दृ",}, {"श्च",}, }, {{"श्व",}, "ॐ", "ऽ", {"ॅ","ॢ","ॣ","ॕ",}, {"ॉ","ऑ",}, {"ृ","ॠ","ॄ",}, {"ँ", "ॢ", "ॣ",}, "़", }, } --thai thai_full_qwerty_main1 = { {"_", "ๅ", "/", "-", "ภ", "ถ", "ุ", "ึ", "ค", "ต", "จ", "ข", "ช", }, {"ๆ", "ไ", "ำ", "พ", "ะ", "ั", "ี", "ร", "น", "ย", "บ", "ล", "ฃ", }, {"ฟ", "ห", "ก", "ด", "เ", "้", "่", "า", "ส", "ว", "ง", }, {"ผ", "ป", "แ", "อ", "ิ", "ื", "ท", "ม", "ใ", "ฝ", }, } thai_full_qwerty_main2 = { {"%", "+", "๑", "๒", "๓", "๔", "ู", "฿", "๕", "๖", "๗", "๘", "๙", }, {"๐", "\"", "ฎ", "ฑ", "ธ", "ํ", "๊", "ณ", "ฯ", "ญ", "ฐ", ",", "ฅ", }, {"ฤ", "ฆ", "ฏ", "โ", "ฌ", "็", "๋", "ษ", "ศ", "ซ", ".", }, {"(", ")", "ฉ", "ฮ", "ฺ", "์", "?", "ฒ", "ฬ", "ฦ", }, } --hebrew he_full_main = { { "ק", "ר", "א", "ט", "ו", "ן", "ם", "פ", }, {"ש", "ד", "ג", "כ", "ע", "י", "ח", "ל", "ך", "ף", }, { "ז", "ס", "ב", "ה", "נ", "מ", "צ", "ת", "ץ"}, } he_classic_full_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {"\\", "_", {"(", ")", type="normal"}, ":", {")", "(", type="normal"}, "&", "#", "*", "\"", "|"}, {"@", "/", "-", "'", "!", "?", ";", "`", "÷"}, } he_classic_full_alt_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {"\\", "_", {"(", ")", type="normal"}, ":", {")", "(", type="normal"}, "&", "#", "*", "\"", "|"}, {"@", "/", "-", "'", "!", "?", ";", "`", "÷"}, } he_classic_full_alt_shift = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {}, {}, } he_full_alt = { {}, {"\\", "_", {"(", ")", type="normal"}, ":", {")", "(", type="normal"}, "$", "&", "#", {";", "%"}, "\"", }, {"@", "%", "+", "/", "-", "'", "!", "?", {",", ";"}}, } he_full_main1 = { { "'", "-", "ק", "ר", "א", "ט", "ו", "ן", "ם", "פ", }, {"ש", "ד", "ג", "כ", "ע", "י", "ח", "ל", "ך", "ף", }, { "ז", "ס", "ב", "ה", "נ", "מ", "צ", "ת", "ץ"}, } he_full_alt_curve = { {}, {"\\", "_", {"(", ")", type="normal"}, ":", {")", "(", type="normal"}, "$", "&", "#", {";", "%"}, "\"", }, {"@", "%", "+", "/", "-", "'", "!", "?", {",", ";"}}, } he_full_shift_curve1 = { {}, {}, {}, } he_full_qwerty_expand_long_press_input = { { "", "", "", "", "", "", "", "", "", "", }, {"","", {"ג׳"}, "", "",{"ײַ"}, {"ח׳"}, "", "", "", }, { {"ז׳"}, "", "", "", "", "", {"צ׳"}, {"ת׳"}, {"ץ׳"}}, } he_tplus_left = { {"ק", "א", "ו", "ם", "ץ", }, {"ש", "ג", "ע", "ח", "ך",}, {"ז", "ב", "נ", "צ",}, } he_tplus_right = { {"ר", "ט", "ן", "פ", "-"}, {"ד", "כ", "י", "ל", "ף", }, {"ס", "ה", "מ", "ת", }, } he_tplus_alt = { {"1", "2", "3", "4", "5", }, {"6", "7", "8", "9", "0", }, {"@", "!", "?", {",", "'"}, }, } he_phonepad = { {",!?", "והד", "גבא"}, {"נמ", "לכי", "טחז" ,""}, {"תשר", "קצ", "פעס"}, } he_phonepad_expand_long_press_input = { {",!?", "דהו", "אבג"}, {"מםנן", "יכךל", "זחט",""}, {"רשת", "צץק", "סעפף"}, } --Bengali bn_full_main1 = { {"ৌ", "ৈ", "া", "ী", "ূ", "ব", "হ", "গ", "দ", "জ", "ড", "়", }, {"ো", "ে", "্", "ি", "ু", "প", "র", "ক", "ত", "চ", "ট", "ঌ", }, {"ং", "ম", "ন", "ল", "স", "য", "ষ", "ঃ", }, } bn_full_main2 = { {"ঔ", "ঐ", "আ", "ঈ", "ঊ", "ভ", "ঙ", "ঘ", "ধ", "ঝ", "ঢ", "ঞ", }, {"ও", "এ", "অ", "ই", "উ", "ফ", "ঋ", "খ", "থ", "ছ", "ঠ", "ৄ", }, {"ঁ", "ণ", "ু", "ল", "শ", "য়", "ৃ", "ঃ", }, } bn_full_alt = { {"১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯", "০", "(", ")", }, {"৲", "৳", "৴", "৵", "৶", "৷", "৸", "৹", "৺", "৻", "₹", "$" }, {"@", "/", "-", "'", "!", "?", ";", ":", {",", "\""}, }, } bn_probhat_full_main1 = { {"দ", "ূ", "ী", "র", "ট", "এ", "ু", "ি", "ও", "প", "ে", }, {"া", "স", "ড", "ত", "গ", "হ", "জ", "ক", "ল", "ো", "ঌ", }, {"য়", "শ", "চ", "আ", "ব", "ন", "ম", "ৄ", "্", }, } bn_probhat_full_main2 = { {"ধ", "ঊ", "ঈ", "ড়", "ঠ", "ঐ", "উ", "ই", "ঔ", "ফ", "ৈ", }, {"অ", "ষ", "ঢ", "থ", "ঘ", "ঃ", "ঝ", "খ", "ং", "ৌ", "", }, {"য", "ঢ়", "ছ", "ঋ", "ভ", "ণ", "ঙ", "ৃ", "ঁ", }, } bn_probhat_full_alt = { {"১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯", "০", {"()", 1, type="input_match_symbol"}, }, {"৲", "৳", "৴", "৵", "৶", "৷", "৸", "৹", "৺", "৻", "₹", }, {"@", "/", "-", "'", "!", "?", "\"", ";", ":", }, } bn_full_qwerty_expand_long_press_input_full_main1 = { {"", "", "", "", "", "", "", "", "", {"জ্ঞ", type="input_as_whole"}, "", "", }, {"", "", "", "", "", "", {"র্", "্র",}, {"ক্ষ", type="input_as_whole"}, {"ত্র", type="input_as_whole"}, "", "", {"ৢ", "ৣ"}, }, {"", "", "", "", "", "", "", "", }, } bn_full_qwerty_expand_long_press_input_full_main2 = { {"", "", "", "", "", "", "", "", "", "", "", "", }, {"", "", {"অ্যা", type="input_as_whole"}, "", "", "", "", "", "", "", "", {"ৢ", "ৣ"}, }, {"", "", "", "", {"শ্র", type="input_as_whole"}, "", "", "", }, } bn_full_qwerty_expand_long_press_input = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ""}, {{"অ্যা", type="input_as_whole"}, "", "", "", "", "", "", "", "", ""}, {}, } bn_full_qwerty_expand_long_press_input_with_probhat_full_main2 = { {{"ধ", "1"}, {"ঊ", "2"}, {"ঈ","3"}, {"ড়", "4", "র্", "্র",}, {"ঠ", "5"}, {"ঐ", "6"}, {"উ", "7"}, {"ই", "8"}, {"ঔ", "9"}, {"ফ", "0"}, "ৈ", }, {"অ", "ষ", "ঢ", {"থ", "ত্র",}, "ঘ", "ঃ", {"ঝ", "জ্ঞ",}, {"খ", "ক্ষ",}, "ং", "ৌ", }, {"য", {"ঢ়", "শ্র",}, "ছ", "ঋ", "ভ", "ণ", "ঙ", "ৃ", {"ঁ", "ৢ", "ৣ"}, }, } --Bengali changeable bn_full_azerty_main1 = { {"অ", "আ", "ই", "ঈ", "উ", "ঊ", "এ", "ঐ", "ও", "ঔ" }, {"ক", "খ", "গ", "ঘ", "ঙ", "চ", "ছ", "জ", "ঝ", "ঞ" }, {"ট", "ঠ", "ড", "ঢ", "ণ", "ত", "থ", "দ", "ধ", "ন"}, {"প", "ফ", "ব", "ভ", "ম", "য", "র", "ল", "শ", "ষ"}, {"স", "হ", "ড়", "ঢ়", "য়", "ঋ", "্য", ""}, } bn_full_azerty_script1 = { {"্", "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ" }, {}, {}, {}, {"", "", "", "", "", "ৃ", "্য", }, } bn_full_azerty_expand_long_press_input1 = { {"্", "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ" }, {{"ক্ষ", "ক্ত", "ক্র", "ক্য", "ক্স", "ক্ল", "ক্ট", "ক্ষ্য", "ক্ক", "ক্ষ্ম", "ক্ব", "ক্ট্র", "ক্র্য", "ক্ষ্ণ", "ক্ল্য", "ক্ষ্ন", "ক্ফ", }, {"খ্য", "খ্র", "খ্ত", "খ্শ", "খ্ন", "খ্খ", }, {"গ্ট্", "গ্ধ", "গ্ন", "গ্ব", "গ্ৰ", }, {"ঘ্র", "ঘ্য", "ঘ্ন", "ঘ্ত", }, {"ঙ্গ", "ঙ্ক", "ঙ্ক্ষ", "ঙ্খ", "ঙ্ঘ", "ঙ্ক্ত", "ঙ্গ্য", "ঙ্ম", "ঙ্ব", "ঙ্ক্র", "ঙ্চ", "ঙ্ঘ্য", "ঙ্ট", "ঙ্খ্য", "ঙ্র", }, {"চ্ছ", "চ্চ", "চ্ছ্ব", "চ্য", "চ্ছ্র", "চ্র", "চ্ছ্য", "চ্ঞ", "চ্ড", "চ্ল", "চ্ক্য়", "চ্ড়", "চ্চ্চ", }, {"ছ্য", "ছ্ন্দ", "ছ্ছ", "ছ্ন", }, {"জ্ঞ", "জ্জ", "জ্য", "জ্ব", "জ্জ্ব", "জ্র", "জ্ঞ্য", "জ্গ", "জ্দ", "জ্ন্য", "জ্প", "জ্ড", "জ্ল", "জ্ঝ", "জ্জ্য", "জ্জ্জ", "জ্স", "জ্জ্ল", }, {"ঝ্য", "ঝ্ঝ", "ঝ্ত", }, {"ঞ্জ", "ঞ্চ", "ঞ্ছ", "ঞ্ঝ", }, }, {{"ট্র", "ট্ট", "ট্য", "ট্র্য", "ট্স", "ট্ক", "ট্ল", "ট্ট্র", "ট্র্ফ", "ট্চ", }, {"ঠ্য", "ঠ্ব", "ঠ্ল", }, {"ড্র", "ড্য", "ড্ড", "ড্র্য", "ড্ড্র", "ড্স", "ড্থ", }, {"ঢ্য", }, {"ণ্ড", "ণ্য", "ণ্ঠ", "ণ্ণ", "ণ্ট", "ণ্ম", "ণ্ত", "ণ্ড্র", "ণ্ট্র", "ণ্ব", "ণ্ত্র", "ণ্স", "ণ্ধ", "ণ্প", }, {"ত্র", "ত্য", "ত্ত", "ত্ব", "ত্ম", "ত্ত্ব", "ত্ন", "ত্স", "ত্থ", "ত্ক", "ত্প", "ত্র্য", "ত্ম্য", "ত্ক্", "ত্ত্য", "ত্দ", "ত্স্যষ", }, {"থ্য", "থ্ব", "থ্র", "থ্থ", }, {"দ্ধ", "দ্য", "দ্ব", "দ্র", "দ্দ", "দ্ভ", "দ্ম", "দ্র্য", "দ্ব্য", "দ্দ্য", "দ্ঘ", "দ্গ", "দ্ধ্য", "দ্ভ্র", "দ্গ্র", "দ্ট", "দ্দ্ব", }, {"ধ্য", "ধ্ব", "ধ্র", "ধ্ম", "ধ্য়", "ধ্ন্য", "ধ্চ", }, {"ন্ত", "ন্য", "ন্দ", "ন্ন", "ন্ধ", "ন্ট", "ন্ত্র", "ন্ড", "ন্স", "ন্দ্র", "ন্ম", "ন্থ", "ন্ধ্য", "ন্ব", "ন্ঠ", "ন্দ্ব", "ন্ট্র", "ন্ড্র", }, }, {{"প্র", "প্ত", "প্ল", "প্য", "প্ন", "প্ট", "প্প", "প্ল্য", "প্ল্য", "প্স", "প্র্ত", "প্র্র", "প্ণ", }, {"ফ্র", "ফ্য", "ফ্ল", "ফ্ল্য", "ফ্ট", "ফ্ফ", "ফ্র্য", "ফ্ত", "ফ্স", "ফ্য্য", }, {"ব্য", "ব্র", "ব্ল", "ব্দ", "ব্ব", "ব্ধ", "ব্র্য", "ব্ল্য", "ব্জ", "ব্ন", "ব্দ্য", "ব্স", "ব্হ", "ব্ছ", "ব্স্থ", "ব্শ্য", "ব্ক্ত", }, {"ভ্য", "ভ্র", "ভ্ল", "ভ্ন্ন", "ভ্য়", "ভ্ভ", "ভ্ড", }, {"ম্প", "ম্য", "ম্ব", "ম্প্র", "ম্ম", "ম্ভ", "ম্ন", "ম্র", "ম্ভ্র", "ম্প্য", "ম্ল", "ম্ফ", "ম্স", "ম্র্প", "ম্প্ল", "ম্ব্র", "ম্ক", }, {"য্য", "য্ব", "য্দ্ধ", "য্র", "য্ক", "য্য়", }, {"র্ত", "র্য", "র্ম", "র্ব", "র্থ", "র্ক", "র্ণ", "র্ট", "র্শ", "র্জ", "র্ষ", "র্ড", "র্দ", "র্ভ", "র্ন", "র্স", "র্ঘ", "র্ধ", "্র",}, {"ল্ল", "ল্প", "ল্য", "ল্ট", "ল্ড", "ল্ক", "ল্ম", "ল্গ", "ল্ব", "ল্ট্র", "ল্ফ", "ল্ল্য", "ল্স", "ল্থ", "ল্ভ", "ল্ড্র", "ল্ত", "ল্র", }, {"শ্ব", "শ্র", "শ্য", "শ্চ", "শ্ন", "শ্ল", "শ্ম", "শ্ছ", "শ্ত", "শ্ক", "শ্প", "শ্ট", "শ্চ্য়", "শ্খ", "শ্ত্র", "শ্ফ", }, {"ষ্ট", "ষ্ঠ", "ষ্ট্র", "ষ্ক", "ষ্য", "ষ্ণ", "ষ্ট্য", "ষ্প", "ষ্ম", "ষ্ক্র", "ষ্প্র", "ষ্ফ", "ষ্ঠ্য", "ষ্ঞ", "ষ্ন", "ষ্ত", "ষ্ট্ব", }, }, {{"স্ত", "স্থ", "স্ব", "স্ট", "স্য", "স্ক", "স্প", "স্ত্র", "স্ম", "স্ট্র", "স্থ্য", "স্র", "স্ন", "স্ট্য", "স্ক্র", "স্ফ", "স্ল", "স্হ", }, {"হ্য", "হ্ব", "হ্ন", "হ্র", "হ্ম", "হ্ল", "হ্য়", "হ্ণ", "হ্ক", "হ্হ", "হ্জ", "হ্প", "হ্ত", "হ্হ্হ", "হ্স", "হ্দ", "হ্ফ", "হ্ছ", }, {"ড়্গ", "ড়্য", "ড়্গ্য", }, "ঢ়", {"য়্য", "য়্ল", "য়্ন", "য়্ত", "য়্ক্ফ", "য়্ম", "য়্ল্য", "য়্গ", "য়্স", }, "ৃ", {"্য", }, }, } bn_full_azerty_main2 = { {"অ", "আ", "ই", "ঈ", "উ", "ঊ", "এ", "ঐ", "ও", "ঔ" }, {"ক্ষ", "জ্ঞ", "ৰ", "ৱ", "ৠ", "ৡ", "ৢ", "ৣ", "ৄ", "ৗ" }, {"৲", "৳", "৴", "৵", "৶", "৷", "৸", "৹", "৺", "৻" }, {"১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯", "০" }, {"ৎ", "ঃ", "ং", "়", "ঁ", "ঋ", "্য", "" }, } bn_full_azerty_script2 = { {"্", "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ" }, {}, {}, {}, {"", "ঃ", "ং", "়", "ঁ", "ৃ", "্য", }, } bn_full_azerty_expand_long_press_input2 = { {"্", "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ" }, {{"ক্ষ"}, {"জ্ঞ"}, "", "", "", {"ঌ"}, "", "", "", "" }, {}, {}, {"", "ঃ", "ং", "়", "ঁ", "ঋ", {"্য",},}, } --Indian Manipuri manipuri_full_main1 = { {"্", "া", "ি", "ী", "ু", "ূ", "ৃ", "ে", "ৈ", "ো", "ৌ", }, {"ট", "ঠ", "ড", "ঢ", "ণ", "ত", "থ", "দ", "ধ", "ন", "ং", }, {"য", "র", "ল", "শ", "ড়", "ঢ়", "য়", "ৢ", "ঁ",}, } manipuri_full_main2 = { {"অ", "আ", "ই", "ঈ", "উ", "ঊ", "ঋ", "এ", "ঐ", "ও", "ঔ", }, {"ক", "খ", "গ", "ঘ", "ঙ", "চ", "ছ", "জ", "ঝ", "ঞ", "ৎ", }, {"প", "ফ", "ব", "ড", "ম", "ষ", "স", "হ", "ঃ", }, } manipuri_full_alt = { {"১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯", "০", {"()", 1, type="input_match_symbol"}, }, {"\\", "_", "+", "=", "₹", "&", "#", "*", "%", "^", {"\"", "~"}, }, {"@", "/", "-", "'", "!", "?", ";", ":", {",", "\""}, }, } manipuri_meetei_mayek_full_main = { {"ꯧ", "ꯩ", "ꯥ", "꯬", "ꯌ", "ꯕ", "ꯍ", "ꯒ", "ꯗ", "ꯖ",}, {"ꯣ", "ꯦ", "ꯑ", "ꯤ", "ꯎ", "ꯄ", "ꯔ", "ꯀ", "ꯇ",}, {"꯬", "ꯪ", "ꯃ", "ꯅ", "ꯋ", "ꯂ", "ꯁ",}, } manipuri_meetei_mayek_full_main2 = { {"ꯛ", "ꯥ", "₹", "ꯠ", "ꯚ", "ꯉ", "ꯘ", "ꯙ", "ꯓ",}, {"^", "ꯦ", "꯭", "ꯏ", "ꯨ", "ꯐ", "ꯞ", "ꯈ", "ꯊ",}, {"꯫", "ꯝ", "ꯟ", "ꯋ", "ꯜ", "ꯡ",}, } manipuri_meetei_mayek_full_alt = { {"꯱", "꯲", "꯳", "꯴", "꯵", "꯶", "꯷", "꯸", "꯹", "꯰",}, {"\\", "_", "`", "#", "&", "*", "|", "€", "÷", "$",}, {"@", "/", "-", "'", "!", "?", "\""}, } manipuri_meetei_mayek_full_alt2 = { {"꯱", "꯳", "꯴", "꯵", "꯶", "꯷", "꯸", "꯹", "꯰",}, {"\\", "_", "`", "#", "&", "*", "|", "€", "÷", "$",}, {"@", "-", "'", "!", "?", "\"",}, } manipuri_meetei_mayek_full_alt_numrow_on = { {"~", "$", "^", "%", "+", "=", "[", "]", "<", ">", "…"}, {"\\", "_", "`", "#", "&", "*", "|", "€", "÷", "$",}, {"@", "/", "-", "'", "!", "?", "\""}, } manipuri_meetei_mayek_full_alt2_numrow_on = { {"~", "^", "%", "+", "=", "[", "]", "<", ">", "…"}, {"\\", "_", "`", "#", "&", "*", "|", "€", "÷", "$",}, {"@", "-", "'", "!", "?", "\"",}, } -- Persian fa_full_main1= { {"ض", "ص", "ث", "ق", "ف", "غ", "ع", "ه", "خ", "ح", "ج", "چ", }, {"ش", "س", "ی", "ب", "ل", "ا", "ت", "ن", "م", "ک", "گ", "", }, {"ظ", "ط", "ز", "ر", "ذ", "د", "پ", "و", "ئ"}, } fa_full_main2= { {"ْ", "ٌ", "ٍ", "ً", "ُ", "ِ", "َ", "ّ", "ـ", "ح", "ج", "چ", }, {"ؤ", "ئ", "ي", "إ", "أ", "آ", "ة", "ن", "م", "ک", "گ", "", }, {"ك", "ط", "ژ", "ٓ", "ذ", "ٔ", "ء", "و", "ئ", }, } fa_full_alt = { {"۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹", "۰", {"(", ")", type="normal"}, {")", "(", type="normal"}}, {"\\", "_", "+", "=", "\"", "$", "&", "#", "*", "%", "^"}, {"@", "/", "-", "'", "!", "؟", "؛", ":", {"،", ","}, }, } -- urdu ur_full_main1 = { {"ط", "ص", "ھ", "د", "ٹ", "پ", "ت", "ب", "ج", "ح", }, {"م", "و", "ر", "ن", "ل", "ء", "ا", "ک", "ی", }, {"ق", "ف", "ے", "س", "ش", "غ", "ع", }, } ur_full_main2 = { {"ظ", "ض", "ذ", "ڈ", "ث", "ہ", "ة", "ـ", "چ", "خ", }, {"ژ", "ز", "ڑ", "ں", "ۀ", "ء", "آ", "گ", "ي", }, {"ق", "ف", "ے", "س", "ؤ", "ئ", "ع", }, } ur_full_alt = { {"٠", "٩", "٨", "٧", "٦", "٥", "٤", "٣", "٢", "١", }, {"\\", "_", {"(", ")", type="normal"}, ":", {")", "(", type="normal"}, "&", "#", {"؛", "%"}, "\"", }, {"@", "/", "-", "'", "!", "¿", {"،", "؛"}, }, } --Uyghur ug_full_main1 = { {"چ", "ۋ", "ې", "ر", "ت", "ي", "ۇ", "ڭ", "و", "پ", }, {"ھ", "س", "د", "ا", "ە", "ى", "ق", "ك", "ل", "ئ",}, {"ز", "ش", "غ", "ۈ", "ب", "ن", "م", }, } ug_full_main2 = { {"چ", "ۋ", "ې", "ر", "ت", "ي", "ۇ", "ڭ", "و", "پ", }, {"ھ", "س", "ژ", "ف", "گ", "خ", "ج", "ۆ", "ل", "ئ", }, {"ز", "ش", "غ", "ۈ", "ب", "ن", "م", }, } ug_full_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", }, {"\\", "_", {"(", ")", type="normal"}, ":", {")", "(", type="normal"}, "&", "#", "*", "\"", "|"}, {"@", "/", "-", "'", "!", "؟", "؛", }, } --Laotian lo_full_main1 = { {"ົ", "ໄ", "ຳ", "ູ", "ະ", "ິ", "ີ", "ຂ", "ນ", "ຍ", }, {"ັ", "ຫ", "ກ", "໑", "ເ", "້", "່", "າ", "ສ", "ວ", }, {"ຜ", "ປ", "ແ", "ອ", "ໂ", "ຶ", "ທ", "ມ", }, } lo_full_main2 = { {"໌", "ໃ", "ຳ", "ຸ", "ບ", "ຊ", "ງ", "ຄ", "ໜ", "ຽ", }, {"ຣ", "ຮ", "ຈ", "ໆ", "ເ", "໊", "ດ", "ລ", "ຕ", "ຢ", }, {"ຟ", "ຝ", "ພ", "ຼ", "ໍ", "ື", "ຖ", "ໝ", }, } lo_full_alt = { {"໑", "໒", "໓", "໔", "໕", "໖", "໗", "໘", "໙", "໐", }, {"\\", "_", "(", ":", ")", "&", "#", "%", "$", {"\"", "+"}, }, {"@", "/", "-", "'", "!", "?", ";", {",", "\""}, }, } --Burmese my_full_main1 = { {"က", "ခ", "ဂ", "ဃ", "င", "စ", "ဆ", "ဇ", "ဈ", "ဉ", }, {"ည", "ဋ", "ဌ", "ဍ", "ဎ", "ဏ", "တ", "ထ", "ဒ", "ဓ", }, {"န", "ပ", "ဖ", "ဗ", "ဘ", "မ", "ယ", "ရ", "လ", "ဝ", }, {"သ", "ဟ", "ဠ", "အ", "ဢ", "ဣ", "ဤ", }, } my_full_main2 = { {"၀", "၁", "၂", "၃", "၄", "၅", "၆", "၇", "၈", "၉", }, {"ဥ", "ဦ", "ဧ", "ဨ", "ဩ", "ဪ", "ါ", "ာ", "ိ", "ီ", }, {"ု", "ူ", "ေ", "ဲ", "ဳ", "ဴ", "ဵ", "ံ", "့", "း", }, {"္", "်", "ျ", "ြ", "ွ", "ှ", "ဿ", }, } my_full_qz_main1 = { {"၁", "၂", "၃", "၄", "၅", "၆", "၇", "၈", "၉", "၀", }, {"ဆ", "တ", "န", "မ", "အ", "ပ", "က", "င", "သ", "စ", }, {"ေ", "ျ", "ိ", "်", "ါ", "့", "ြ", "ု", "ူ", "း", }, {"ဖ", "ထ", "ခ", "လ", "ဘ", "ည", "ာ", "ယ"}, } my_full_qz_main2 = { {"ဍ", "ဎ", "ဋ", "ၓ", "ၔ", "ၕ", "ရ", "*", "(", ")", }, {"ဈ", "ဝ", "ဣ", "၎", "ဤ", "၌", "ဥ", "၍", "ဿ", "ဏ", }, {"ဗ", "ှ", "ီ", "္", "ွ", "ံ", "ဲ", "ဒ", "ဓ", "ဂ", }, {"ဇ", "ဌ", "ဃ", "ဠ", "ဟ", "ဉ", "၏", "ယ", }, } my_full_qz_alt_expand_long_press_inputs = { {"", "", "", "", "", "", "", "", "", "",}, {"ၦၧ", "ၱၲ", "ႏၷ", "ၼ", "ဤဣ၌", "ၸ", "ၠ", "ႈ", "ႆ", "ဏၥ", }, {"ဗဧ", "ွ", "ီ", "ႎႍႋၤႌ", "ြ", "႔႕ံ", "ဲ", "ဒ", "ဓ", "ၚ", }, {"ၨဇၹ", "ၳၴဌ႒ၭ", "ၡ", "ႅ", "ၻ႓",}, } --SimpleCangjie simplecangjie_qwerty_main_input = { {"手", "田", "水", "口", "廿", "卜", "山", "戈", "人", "心"}, {"日", "尸", "木", "火", "土", "竹", "十", "大", "中"}, {"?", "難", "金", "女", "月", "弓", "一"}, } --Khmer km_full_main1 = { {"ឆ", "ឹ", "េ", "រ", "ត", "យ", "ុ", "ិ", "ោ", "ផ", "ៀ", }, {"ា", "ស", "ដ", "ថ", "ង", "ហ", "្", "ក", "ល", "់", "ើ", }, {"ឋ", "ខ", "ច", "វ", "ប", "ន", "ម", "ុំ", "។", }, } km_full_main2 = { {"!", "ៗ", "ឯ", "៛", "%", "៍", "័", "៏", "៌", "៊", "៎៎", }, {"ឥ", "ឫ", "ឧ", "ឱ", "ឲ", "ឨ", "ឪ", "ឳ", "ឭ", "ឮ", "៝", }, {"៙", "ឰ", "ឩ", "៚", "ឞ", "ឝ", "៖", "ឦ", "៕", }, } km_alt_full1 = { {"ឈ", "ឺ", "ែ", "ឬ", "ទ", "ួ", "ូ", "ី", "ៅ", "ភ", "ឿ", }, {{"ាំ", type="input_as_whole"}, "ៃ", "ឌ", "ធ", "អ", "ះ", "ញ", "គ", "ឡ", "៉", {"ោះ", type="input_as_whole"}, }, {"ឍ", "ឃ", "ជ", {"េះ", type="input_as_whole"}, "ព", "ណ", "ំ", {"ុះ", type="input_as_whole"}, "៘", }, } km_alt_full2 = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", {"()", type="input_as_whole"}, }, {"១", "២", "៣", "៤", "៥", "៦", "៧", {"៨៏", type="input_as_whole"}, "៩", "០", "", }, {"", "", "", "", "", "គ", "ៈ", "", "ៜ",}, } km_alt_full_num_row_on = { {"~", "$", "^", "+", "-", "=", "[", "]", "<", ">", {"()", type="input_as_whole"}, }, {"១", "២", "៣", "៤", "៥", "៦", "៧", {"៨៏", type="input_as_whole"}, "៩", "០", "", }, {"", "", "", "", "", "គ", "ៈ", "", "ៜ",}, } --bosnian cyrillic --bosnian should use serbian's main title, this needs to be removed next update. bs_cyrillic_full_main = { {"я", "в", "е", "р", "т", "ъ", "у", "и", "о", "п", "ч"}, {"а", "с", "д", "ф", "г", "х", "й", "к", "л", "ш", "щ"}, {"з", "ь", "ц", "ж", "б", "н", "м", "ю", }, } bs_cyrillic_alt_full = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£", }, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€",}, {"@", "/", "-", "'", "!", "?", ";", "`", } } bs_cyrillic_alt_curve = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£", }, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€",}, {"@", "/", "-", "'", "!", "?", ";", "`", }, } bs_cyrillic_alt_shift = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "£", }, {}, {}, } --bosnian should use serbian's tplus title & alt, next three templates need to be removed next update. bs_cyrillic_tplus_left = { {"я", "е", "т", "у", "о", "ч"}, {"а", "д", "г", "й", "л", "щ"}, {"з", "ц", "б", "м", }, } bs_cyrillic_tplus_right = { {"в", "р", "ъ", "и", "п", "/"}, {"с", "ф", "х", "к", "ш", "'"}, {"ь", "ж", "н", "ю", }, } bs_cyrillic_tplus_alt = { {"1", "2", "3", "4", "5", "\""}, {"6", "7", "8", "9", "0", "'"}, {"@", "!", "?", {",",":"}}, } --bosnian latin bs_full_main = { {"q", "w", "e", "r", "t", "z", "u", "i", "o", "p", "š", "đ"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "č", "ć"}, {"y", "x", "c", "v", "b", "n", "m", "ž", "-"}, } --Tamil ta_full_main1 = { {"ா","ீ","ூ","ே","ள","ற","ன","ட","ண","ச","ஞ",}, {"அ","ி","ு","ை","ெ","க","ப","ம","த","ந","ய",}, {"ௌ","ோ","ொ","வ","ங","ல","ர","ழ","்",}, } ta_full_main2 = { {"ஆ","ஈ","ஊ","ஏ","௳","௴","௵","௶","௷","௸","௹",}, {"அ","இ","உ","ஐ","எ","௺","௱","௲","ஶ","ௐ","ஃ",}, {"ஔ","ஓ","ஒ","ஜ","ஷ","ஸ","ஹ","க்ஷ","ஶ்ரீ",}, } ta_alt_full = { {"௧", "௨", "௩", "௪", "௫", "௬", "௭", "௮", "௯", "௦", "௰", }, {"", "இ", "உ", "ஐ", "எ", "௺", "௱", "௲", "ஶ", "ௐ", "ஃ",}, {"ஔ", "ஓ", "ஒ", "ஜ", "ஷ", "ஸ", "ஹ", {"க்ஷ", type="input_as_whole"}, {"ஶ்ரீ", type="input_as_whole"},}, } ta_full_expand_long_press_input = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {}, {}, } --Tamil changeable ta_full_qwertz_main = { {"அ", "ஆ", "இ", "க", "ங", "ச", "ஞ", "ட", "ண"}, {"ஈ", "உ", "ஊ", "த", "ந", "ப", "ம", "ய", "ர"}, {"எ", "ஏ", "ஐ", "ல", "வ", "ழ", "ள", "ற", "ன"}, {"ஒ", "ஓ", "ஔ", "ஷ", "ஸ", "ஜ", "ஹ", "க்ஷ"}, } ta_full_qwertz_script = { {"்", "ா", "ி", "", "", "", "", "", ""}, {"ீ", "ு", "ூ", "", "", "", "", "", ""}, {"ெ", "ே", "ை", "", "", "", "", "", ""}, {"ொ", "ோ", "ௌ", "", "", "", "", ""}, } ta_full_qwertz_expand_long_press_input = { {"அ்ஂ", "ஆா", "இி", {"க்", "க்க", "க்கி", "க்கு"}, {"ங்", "ங்க", "ங்கு"}, {"ச்", "ச்ச"}, {"ஞ்", "ஞ்ச"}, {"ட்", "ட்ச", "ட்ட"}, {"ண்", "ண்ண", "ண்ட"}}, {"ஈீ", "உு", "ஊூ", {"த்", "த்த", "த்து", "த்தி"}, {"ந்", "ந்த", "ந்து"}, {"ப்", "ப்ப", "ப்பா"}, {"ம்", "ம்ப", "ம்ம", "ம்பு"}, {"ய்", "ய்ய", "ய்யா"}, {"ர்",}}, {"எெ", "ஏே", "ஐை", {"ல்", "ல்ல", "ல்லு"}, {"வ்", "வ்வ"}, "ழ்", {"ள்", "ள்ள", "ள்ளி"}, {"ற்", "ற்ற", "ற்றி"}, {"ன்", "ன்ன", "ன்ற"}}, {"ஒொௐ", "ஓோ", "ஔௌௗ", {"ஷ்", "ஷ்வ", "ஷ்ஷ"}, {"ஸ்", "ஸ்வ", "ஸ்ஸ", "ஶ"}, {"ஜ்", "ஜ்ஜி"}, {"ஹ்", "ஹ்ர"}, "",}, } --Telugu te_full_main1 = { {"ౌ","ై","ా","ీ","ూ","బ","హ","గ","ద","జ","డ","ఞ",}, {"ో","ే","్","ి","ు","ప","ర","క","త","చ","ట","ె",}, {"ొ","ం","మ","న","వ","ల","స","ష","య",}, } te_full_main2 = { {"ఔ","ఐ","ఆ","ఈ","ఊ","భ","ఙ","ఘ","ధ","ఝ","ఢ","ఞ",}, {"ఓ","ఏ","అ","ఇ","ఉ","ఫ","ఱ","ఖ","థ","ఛ","ఠ","ఎ",}, {"ఒ","ఁ","ణ","న","వ","ళ","శ","ష","య",}, } te_alt_full = { {"౧", "౨", "౩", "౪", "౫", "౬", "౭", "౮", "౯", "౦", "(", ")", }, {"\\", "_", "+", "=", "₹", "&", "#", "*", "%", "^", "\"", "-", }, {"@", "/", "'", "!", "?", ";", ":", {",", "~"}, "»", }, } te_full_qz_main1 = { {"్","ా","ి","ీ","ు","ూ","ృ","ౄ","ె","ే","ై","ొ","ో",}, {"ౌ","ం","ః","క","ఖ","గ","ఘ","ఙ","చ","ఛ","జ","ఝ","ఞ",}, {"ట","ఠ","డ","ఢ","ణ","త","థ","ద","ధ","న","ప","ఫ","బ"}, {"భ","మ","య","ర","ల","వ","శ","ష","స","హ"}, } te_full_qz_main2 = { {"అ", "ఆ", "ఇ", "ఈ", "ఉ", "ఊ", "ఋ", "ౠ", "ఎ", "ఏ", "ఐ", "ఒ", "ఓ",}, {"ఔ", "ఌ", "ౡ", "ౢ", "ౣ", "ఁ", "ౕ", "ౖ", "॓", "ళ", "క్ష", "ఱ", ""}, {"ఠ్య", "డ్డ", "త్ర", "థ్య","ద్య", "ధ్య", "న్న", "ప్ర", "ఫ్య", "బ్బ","భ్య", "మ్మ", "య్య"}, {"వ్య", "స్త", "౸", "౹", "౺", "౻", "౼", "౽", "౾", "౿", }, } te_qz_alt_full = { {"౧", "౨", "౩", "౪", "౫", "౬", "౭", "౮", "౯", "౦",}, {}, {}, } --Telugu changeable te_full_azerty_main1 = { {"అ", "ఆ", "ఇ", "ఈ", "ఉ", "ఊ", "ఋ", "ౠ", "ఎ", "ఏ", }, {"ఐ", "ఒ", "ఓ", "ఔ", "ం", "ః", "క", "ఖ", "గ", "ఘ", }, {"చ", "ఛ", "జ", "ఝ", "ట", "ఠ", "డ", "ఢ", "ణ", "త", }, {"థ", "ద", "ధ", "న", "ప", "ఫ", "బ", "భ", "మ", "య", }, {"ర", "ల", "వ", "ళ", "శ", "ష", "స", "హ"}, } te_full_azerty_script1 = { {"్", "ా", "ి", "ీ", "ు", "ూ", "ృ", "ౄ", "ె", "ే", }, {"ై", "ొ", "ో", "ౌ", "ం", "ః", }, {}, {}, {}, } te_full_azerty_expand_long_press_input1 = { {"్్ౕఽ", "ా", "ి", "ీ", "ు", "ూ", "ౢృఌ", "ౄౡ", "ెె", "ే", }, {"ైౖ", "ొ", "ో", "ౌ", "ఁ", "ః", {"క్ట", "క్త", "క్గ", "క్ష్య", "క్య", "క్స్క", "క్ట్స్", "క్చ", "క్మ", "క్బ", "క్ప", "క్ర", "క్క", "క్ట్ర", "క్ష", }, {"ఖ్య", "ఖ్ద్మ", "ఖ్ఖ", "ఖ్మ", "ఖ్న", "ఖ్వ", "ఖ్", }, {"గ్ట", "గ్డ", "గ్ష", "గ్త", "గ్ద", "గ్ధ", "గ్భ్ర", "గ్క", "గ్జ", "గ్మ", "గ్వ", "గ్స్", "గ్న", "గ్ల", "గ్య", "గ్", "గ్ర", }, {"ఙ", "ఘ్న", "ఘ్ర", "ఘ్", "ఘ్ట్య్", }, }, {{"ౘ", "చ్డ్", "చ్న", "చ్క", "చ్ఛ్", "చ్ర", "చ్స", "చ్డ", "చ్గ", "చ్స", "చ్చ", "చ్", "చ్చ్", "చ్ఛ", "చ్ల", "చ్య", }, {"ఛ్చ", "ఛ్ఛ", }, {"ౙ", "జ్ల", "జ్మ", "జ్న", "జ్క", "జ్భ", "జ్ప", "జ్", "జ్ఞ", "జ్య", "జ్జ", "జ్ర", "జ్వ", }, "ఞ", {"ట్ప", "ట్త", "ట్స్క", "ట్గ", "ట్న", "ట్క", "ట్మ", "ట్య", "ట్స", "ట్వ", "ట్ట", "ట్ర", "ట్", "ట్ల", "ట్స్", }, {"ఠ్య", "ఠ్", }, {"డ్బ", "డ్జ్", "డ్మ", "డ్గ", "డ్చ", "డ్ద", "డ్త", "డ్క", "డ్వ", "డ్ప", "డ్య", "డ్న", "డ్స్", "డ్జ", "డ్ల", "డ్ర", "డ్", "డ్డ", }, {"ఢ్", }, {"ణ్డ", "ణ్వ", "ణ్మ", "ణ్త", "ణ్న", "ణ్క", "ణ్ర", "ణ్య", "ణ్", }, {"త్య్ర", "త్త్వ", "త్మ్య", "త్ఫ", "త్థ", "త్మ", "త్న", "త్ప", "త్క", "త్ల", "త్ర్య", "త్ర", "త్త", "త్య", "త్వ", "త్", "త్స",}, }, {{"థ్స", "థ్స్", "థ్ల", "థ్య", "థ్", "థ్ర", "థ్వ", }, {"ద్ష", "ద్న", "ద్ల", "ద్ర్య", "ద్ఘ", "ద్య్ర", "ద్భ", "ద్మ", "ద్గ", "ద్ధ్య", "ద్క", "ద్బ", "ద్ద", "ద్ర", "ద్య", "ద్ధ", "ద్వ", "ద్", }, {"ధ్న", "ధ్బ", "ధ్ధ", "ధ్వ", "ధ్య", "ధ్ర", "ధ్", }, {"న్త", "న్ఫ", "న్ప", "న్ర", "న్ష", "న్స్ట", "న్డ", "న్న", "న్ట", "న్వ", "న్మ", "న్క", "న్గ", "న్య", "న్స్", "న్ల", "న్", "న్స", }, {"ప్డ", "ప్ష", "ప్స్ర", "ప్మ", "ప్న", "ప్చ్", "ప్ట్", "ప్స", "ప్క", "ప్స్", "ప్ట", "ప్ల", "ప్", "ప్ప", "ప్య", "ప్ర", "ప్త", }, {"ఫ్త్", "ఫ్ఫ", "ఫ్స", "ఫ్జ", "ఫ్గ", "ఫ్ట", "ఫ్ఘ", "ఫ్య", "ఫ్త", "ఫ్ట్", "ఫ్", "ఫ్ల", "ఫ్ర", }, {"బ్ష", "బ్మ", "బ్గ", "బ్క", "బ్స్", "బ్ల్య", "బ్స", "బ్వ", "బ్జ", "బ్ధ", "బ్న", "బ్ద", "బ్", "బ్య", "బ్ల", "బ్ర", "బ్బ", }, {"భ్య", "భ్ర", "భ్", }, {"మ్స", "మ్డ్", "మ్బ", "మ్త", "మ్ద", "మ్ప", "మ్గ", "మ్చ", "మ్మ్", "మ్న", "మ్క", "మ్ల", "మ్స్", "మ్ర", "మ్య", "మ్", "మ్మ", }, {"య్క", "య్స్", "య్ఫ్ర", "య్న", "య్జ", "య్య", "య్", "య్ల", }, }, {{"ఱ", "ర్గ", "ర్ణ", "ర్భ", "ర్ష", "ర్స", "ర్ద", "ర్శ", "ర్ప", "ర్ట", "ర్ల", "ర్థ", "ర్క", "ర్ర", "ర్య", "ర్త", "ర్వ", "ర్మ", "ర్చ", }, {"ల్మ్", "ల్త", "ల్డ్", "ల్ట", "ల్డ", "ల్ఫ", "ల్గ", "ల్చ", "ల్స్", "ల్క", "ల్మ", "ల్వ", "ల్ల", "ల్", "ల్ప", "ల్స", "ల్య", "ల్న", }, {"వ్ణ", "వ్ల", "వ్స్", "వ్న", "వ్శ", "వ్య్ర", "వ్", "వ్య", "వ్గ", "వ్ర", "వ్వ", }, {"ళ్ట", "ళ్ద", "ళ్", "ళ్వ", "ళ్స", "ళ్య", "ళ్ల", "ళ్ళ", "ళ్త", }, {"శ్త", "శ్య", "శ్క", "శ్శ", "శ్శ", "శ్మ", "శ్బ", "శ్చ", "శ్ర", "శ్న", "శ్", "శ్వ", "శ్ల", }, {"ష్క్", "ష్ష", "ష్ల", "ష్ప్ర", "ష్ర", "ష్ట్య", "ష్బ", "ష్ర్ట", "ష్ప", "ష్ఠ", "ష్మ", "ష్త", "ష్య", "ష్క", "ష్ణ", "ష్", "ష్ట్ర", "ష్ట", }, {"స్ర", "స్క్ర", "స్ల", "స్ట్ర", "స్మ", "స్న", "స్స", "స్ట్", "స్త్ర", "స్క", "స్య", "స్ప", "స్ట", "స్వ", "స్థ", "స్", "స్త",}, {"హ్మ్", "హ్న", "హ్హ", "హ్", "హ్ల", "హ్వ", "హ్య", "హ్ర",}, }, } te_full_azerty_main2 = { {"అ", "ఆ", "ఇ", "ఈ", "ఉ", "ఊ", "ఋ", "ౠ", "ఎ", "ఏ", }, {"ఐ", "ఒ", "ఓ", "ఔ", "ం", "ః", "హ", "ఱ", "ఙ", "ౘ", }, {"౧", "౨", "౩", "౪", "౫", "౬", "౭", "౮", "౯", "౦", }, {"౸", "౹", "౺", "౻", "౼", "౽", "౾", "౿", "ౠ", "ౡ", }, {"₹", "ౢ", "ౣ", "ౕ", "ౖ", "ఽ", "ఁ", }, } te_full_azerty_script2 = { {"్", "ా", "ి", "ీ", "ు", "ూ", "ృ", "ౄ", "ె", "ే", }, {"ై", "ొ", "ో", "ౌ", "ం", "ః", }, {}, {}, {"", "", "", "", "", "ఽ", "ఁ", }, } te_full_azerty_expand_long_press_input2 = { {"్", "ా", "ి", "ీ", "ు", "ూ", "ృ", "ౄ", "ె", "ే", }, {"ಒ", "ಓ", "ಔ", "ಂ", "ಃ", {"స్ర", "స్క్ర", "స్ల", "స్ట్ర", "స్మ", "స్న", "స్స", "స్ట్", "స్త్ర", "స్క", "స్య", "స్ప", "స్ట", "స్వ", "స్థ", "స్", "స్త", }, {"హ్మ్", "హ్న", "హ్హ", "హ్", "హ్ల", "హ్వ", "హ్య", "హ్ర", }, "ఱ", "ఙ", "ౙ", }, {"౧", "౨", "౩", "౪", "౫", "౬", "౭", "౮", "౯", "౦", }, {"౸", "౹", "౺", "౻", "౼", "౽", "౾", "౿", "ౠ", "ౡ", }, {"₹", "ౢ", "ౣ", "ౕ", "ౖ", "ఽ", "ఁ", }, } --Korean kr_full_main1 = { {"ㅂ","ㅈ","ㄷ","ㄱ","ㅅ","ㅛ","ㅕ","ㅑ","ㅐ","ㅔ",}, {"ㅁ","ㄴ","ㅇ","ㄹ","ㅎ","ㅗ","ㅓ","ㅏ","ㅣ",}, {"ㅋ","ㅌ","ㅊ","ㅍ","ㅠ","ㅜ","ㅡ",}, } kr_full_main2 = { {"ㅃ","ㅉ","ㄸ","ㄲ","ㅆ","ㅛ","ㅕ","ㅑ","ㅒ","ㅖ",}, {"ㅁ","ㄴ","ㅇ","ㄹ","ㅎ","ㅗ","ㅓ","ㅏ","ㅣ",}, {"ㅋ","ㅌ","ㅊ","ㅍ","ㅠ","ㅜ","ㅡ",}, } --Tibetan bo_full_main1 = { {"ཤ", "ཝ", "ེ", "ར", "ཏ", "ཡ", "ུ", "ི", "ོ", "པ"}, {"ཨ", "ས", "ད", "ང", "ག", "ཧ", "ཇ", "ཀ", "ལ"}, {"ཟ", "ཙ", "ཅ", "འ", "བ", "ན", "མ"}, } bo_full_main2 = { {"ྴ", "ྪ", "ྖ", "ྲ", "ྟ", "ྱ", "ཾ", "ྙ", "ྑ", "ྤ"}, {"ྸ", "ྶ", "ྡ", "ྔ", "ྒ", "ྷ", "ྗ", "ྐ", "ླ"}, {"ྗ", "ྩ", "ྕ", "ཱ", "ྦ", "ྣ", "ྨ"}, } bo_full_alt1 = { {"ཥ", "ྭ", "ཻ", "", "ཊ", "ཐ", "ཋ", "ྀ", "ཽ", "ཕ"}, {"", "ཞ", "ཌ", "༜", "༼", "༕", "༴", "ཁ", "༄"}, {"ཛ", "ཚ", "ཆ", "", "ཉ", "ཎ", ""}, } bo_full_alt2 = { {"ྵ", "", "", "", "ྚ", "ྠ", "ྛ", "", "", "ྥ"}, {"", "ྮ", "ྜ", "༜", "༼", "༕", "༴", "ྑ", "༄"}, {"ྫ", "", "", "", "ྙ", "ྞ", ""}, } bo_expand_long_press_inputs1 = { {"༡1", "༢2", "༣3", "༤4", "༥5", "༦6", "༧7", "༨8", "༩9", "༠0"}, {"ཨ", "", "", "༛༚༟༝༞࿏", "༽()༺༻", "༖༗༘༙༾༿", "༵྾༶༸", "࿂࿁࿀࿃࿄࿅", "༅༆༇༈༂༃༉༊"}, {"", "", "", "འ", "", "", "མ"}, } bo_expand_long_press_inputs2 = { {"༡1", "༢2", "༣3", "༤4", "༥5", "༦6", "༧7", "༨8", "༩9", "༠0"}, {"ྸ", "", "", "༛༚༟༝༞࿏", "༽()༺༻", "༖༗༘༙༾༿", "༵྾༶༸", "࿂࿁࿀࿃࿄࿅", "༅༆༇༈༂༃༉༊"}, {"", "ྩ", "ྕ", "ཱ", "", "", "ྨ"}, } --Marathi mr_full_main1 = { {"ौ", "ै", "ा", "ी", "ू", "ब", "ह", "ग", "द", "ज", "ड", "़", }, {"ो", "े", "्", "ि", "ु", "प", "र", "क", "त", "च", "ट", "ॆ", }, {"ं", "म", "न", "व", "ल", "स", "ष", "य", "ॅ",}, } mr_full_main2 = { {"औ", "ऐ", "आ", "ई", "ऊ", "भ" , "ङ", "घ", "ध", "झ", "ढ", "ञ", }, {"ओ", "ए" , "अ", "इ", "उ", "फ", "ऱ", "ख", "थ", "छ", "ठ", "ऎ" }, {"ँ", "ण", "ऩ", "ऴ", "ळ", "श", "ष", "य़", "ॕ",}, } mr_full_qwerty_expand_long_press_input1 = { {"", "", "", "", "", "", "", "", "", "", "", "",}, {"", "", "", "", "", "", "", "", "", "", "", "",}, {"", "", "", "", "", "", "", "", {"ॄ", "ॢ", "ॣ",},}, } mr_full_qwerty_expand_long_press_input2 = { {"", "", "", "", "", "", "", "", "", "", "", "",}, {"", "", "", "", "", "", "", "", "", "", "", "",}, {"", "", "", "", "", "", "", "", "",}, } mr_alt_full = { {"१", "२", "३", "४", "५", "६", "७", "८", "९", "०", "(", ")", }, {"\\", "_", "+", "=", "$", "&", "#", "*", "%", "^", "\"", "-", }, {"@", "/", "'", "!", "?", ";", ":", {",", "~"}, "॰",}, } --Marathi changeable mr_full_qwertz_main1 = { {"अ", "आ", "इ", "ई", "उ", "ऊ", "ए", "ऐ", "ओ", "औ", }, {"क", "ख", "ग", "घ", "च", "छ", "ज", "झ", "ं", "ः", }, {"ट", "ठ", "ड", "ढ", "ण", "त", "थ", "द", "ध", "न", }, {"प", "फ", "ब", "भ", "म", "य", "र", "ल", "व", "श", }, {"ष", "स", "ह", "क्ष", "त्र", "ळ", "ँ", "़", }, } mr_full_qwertz_script1 = { {"्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", }, {"", "", "", "", "", "", "", "", "ं", "ः", }, {}, {}, {"", "", "", "", "", "", "ँ", "़", }, } mr_full_qwertz_expand_long_press_input1 = { {"्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", }, {{"कं","क्र","र्क","कृ",}, "ख़", {"गं","ग्र","गृ",}, {"घं","घ्र",}, {"चं","र्च",}, {"छं",}, {"जं","र्ज","ज़",}, {"झं",}, "ं", "ः", }, {{"टं","ट्र",},{"ठं"},{"डं","ड़",},{"ढं","ढ़",},{"र्ण",},{"तं","त्त","र्त","त्र","तृ",},{"थं","थ्र",}, {"दं","द्र","दृ","द्","द्य",},{"धं","ध्र","धृ","र्ध",},{"नं","नृ","र्न"},}, {{"पं","प्र","र्प","पृ",},{"फं","फ्र","फ़",},{"बं","ब्र",},{"भं","भ्र","र्भ",},{"मं","में","मैं","र्म","म्र","मृ",},{"यं","र्य",},"र",{"लं",},{"वं","वृ","व्र","र्व",},{"शं","श्र"},}, {{"ष्","र्ष",},{"सं","र्स","स्र",},{"हैँ","ह्म",},{"क्ष"},{"त्रं",},"ळ","ँ", {"़","ॢ","ॣ",},}, } mr_full_qwertz_main2 = { {"अ", "आ", "इ", "ई", "उ", "ऊ", "ए", "ऐ", "ओ", "औ", }, {"ज्ञ", "ङ", "ञ", "श्र", "क्र", "ग्र", "द्र", "ध्र", "ं", "ः", }, {"प्र", "ब्र", "भ्र", "म्र", "फ्र", "व्र", "क्त", "त्त", "ह्म", "र्र", }, {"स्र", "ह्र", "द्द", "द्ध", "द्ब", "द्भ", "द्म", "द्व", "दृ", "श्च", }, {"श्व", "ॐ", "ऽ", "ॅ", "ॉ", "ऋ", "ँ", "़", }, } mr_full_qwertz_script2 = { {"्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", }, {"", "", "", "", "", "", "", "", "ं", "ः", }, {}, {}, {"", "", "", "ॅ", "ॉ", "ृ", "ँ", "़", }, } mr_full_qwertz_expand_long_press_input2 = { {"्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", }, {{"ज्ञ",}, {"ङ",}, {"ञ",}, {"श्र",}, {"क्र",}, {"ग्र",}, {"द्र",}, {"ध्र",}, "ं", "ः", }, {{"प्र",}, {"ब्र",}, {"भ्र",}, {"म्र",}, {"फ्र",}, {"व्र",}, {"क्त",}, {"त्त",}, {"ह्म",}, {"र्र",}, }, {{"स्र",}, {"ह्र",}, {"द्द",}, {"द्ध",}, {"द्ब",}, {"द्भ",}, {"द्म",}, {"द्व",}, {"दृ",}, {"श्च",}, }, {{"श्व",}, "ॐ", "ऽ", {"ॅ","ॕ",}, "ॉ", {"ृ","ॄ",}, "ँ", {"़","ॢ","ॣ",}, }, } --Punjabi punjabi_full_main1 = { {"੧", "੨", "੩", "੪", "੫", "੬", "੭", "੮", "੯", "੦"}, {"ੳ", "ਅ ", "ੇ ", "ਰ", "ਤ", "ਯ", "ੁ", "ਿ", "ੋ", "ਪ"}, {"ਾ", "ਸ", "ਦ", "੍", "ਗ", "ਹ", "ਜ", "ਕ", "ਲ"}, {"ਙ ", "ੜ", "ਚ", "ਵ", "ਬ", "ਨ", "ਮ"}, } punjabi_full_main2 = { {"ਅ", "ਐ", "ਢ", "ਠ", "ਊ", "ਈ", "ਇ", "ਔ", "ੰ" , "ੱ"}, {"ੲ", "ਆ", "ੈ", "ਏ", "ਥ", "ਟ", "ੂ", "ੀ", "ੌ", "ਫ"}, {"ਓ ", "ਸ਼", "ਧ", "਼", "ਘ", "ਝ", "ਖ", "ਲ਼", "ਉ"}, {"ਹ ", "ਛ", "ਡ", "ਞ", "ਭ", "ਣ", "ਂ"}, } --Punjabi changeable punjabi_full_qwertz_main = { {"ਅ", "ਆ", "ਇ", "ਈ", "ਉ", "ਊ", "ਏ", "ਐ", "ਓ", "ਔ",}, {"ੳ", "ੲ", "ਸ", "ਹ", "ਕ", "ਖ", "ਗ", "ੱ", "ੰ", "ਂ",}, {"ਘ", "ਚ", "ਛ", "ਜ", "ਝ", "ਟ", "ਠ", "ਡ", "ਢ", "ਣ",}, {"ਤ", "ਥ", "ਦ", "ਧ", "ਨ", "ਪ", "ਫ", "ਬ", "ਭ", "ਮ",}, {"ਯ", "ਰ", "ਲ", "ਵ", "ਸ਼", "+ਰ", "+ਹ", "਼",}, } punjabi_full_qwertz_script = { {"੍", "ਾ", "ਿ", "ੀ", "ੁ", "ੂ", "ੋ", "ੈ", "ੇ", "ੌ",}, {"", "", "", "", "", "", "", "ੱ", "ੰ", "ਂ",}, {}, {}, {"", "", "", "", "", "ਰ", "ਹ", "਼",}, } punjabi_full_qwertz_expand_long_press_input = { {"੍", "ਾ", "ਿ", "ੀ", "ੁ", "ੂ", "ੋ", "ੈ", "ੇ", "ੌ",}, {{"ੳ"},{"ੲ"},{"ਸ੍ਹ","ਸ੍ਰ","ਸ੍ਵ","ਸ੍ਯ",},{"ਹ੍ਰ","ਹ੍ਵ","ਹ੍ਯ",},{"ਕ੍ਹ","ਕ੍ਰ","ਕ੍ਵ","ਕ੍ਯ",},{"ਖ੍ਹ","ਖ੍ਰ","ਖ੍ਵ","ਖ੍ਯ",},{"ਗ੍ਹ","ਗ੍ਰ","ਗ੍ਵ","ਗ੍ਯ",},{"ੱ"}, {"ੰ"}, {"ਂ"},}, {{"ਘ੍ਹ","ਘ੍ਰ","ਘ੍ਵ","ਘ੍ਯ",},{"ਚ੍ਹ","ਚ੍ਰ","ਚ੍ਵ","ਚ੍ਯ",},{"ਛ"},{"ਜ੍ਹ","ਜ੍ਰ","ਜ੍ਵ","ਜ੍ਯ",},{"ਝ"},{"ਟ੍ਹ","ਟ੍ਰ","ਟ੍ਵ","ਟ੍ਯ",},{"ਠ"},{"ਡ੍ਹ","ਡ੍ਰ","ਡ੍ਵ","ਡ੍ਯ",},{"ਢ"},{"ਣ"},}, {{"ਤ੍ਹ","ਤ੍ਰ","ਤ੍ਵ","ਤ੍ਯ",},{"ਥ੍ਹ","ਥ੍ਰ","ਥ੍ਵ","ਥ੍ਯ",},{"ਦ੍ਹ","ਦ੍ਰ","ਦ੍ਵ","ਦ੍ਯ",},{"ਧ੍ਰ","ਧ੍ਵ","ਧ੍ਯ",},{"ਨ੍ਹ","ਨ੍ਰ","ਨ੍ਵ","ਨ੍ਯ",}, {"ਪ੍ਹ","ਪ੍ਰ","ਪ੍ਵ","ਪ੍ਯ",},{"ਫ੍ਹ","ਫ੍ਰ","ਫ੍ਵ","ਫ੍ਯ",},{"ਬ੍ਹ","ਬ੍ਰ","ਬ੍ਵ","ਬ੍ਯ",},{"ਭ੍ਹ","ਭ੍ਰ","ਭ੍ਵ","ਭ੍ਯ",},{"ਮ੍ਹ","ਮ੍ਰ","ਮ੍ਵ","ਮ੍ਯ"},}, {{"ਯ"},{"ਰ੍ਹ","ਰ੍ਵ","ਰ੍ਯ",},{"ਲ੍ਹ","ਲ੍ਰ","ਲ੍ਵ","ਲ੍ਯ",},{"ਵ੍ਹ","ਵ੍ਰ","ਵ੍ਯ","ੜ੍ਹ",},{"ਸ਼੍ਹ","ਸ਼੍ਰ","ਸ਼੍ਵ","ਸ਼੍ਯ",},{"ਰ"},{"ਹ"},{"਼"},}, } punjabi_full_qwertz_main2 = { {"ਅ", "ਆ", "ਇ", "ਈ", "ਉ", "ਊ", "ਏ", "ਐ", "ਓ", "ਔ",}, {"ੜ", "ਙ", "ਞ", "ਜ਼", "ਫ਼", "ਖ਼", "ਗ਼", "ੱ", "ੰ", "ਂ",}, {"ਘ", "ਚ", "ਛ", "ਜ", "ਝ", "ਟ", "ਠ", "ਡ", "ਢ", "ਣ",}, {"੧", "੨", "੩", "੪", "੫", "੬", "੭", "੮", "੯", "੦",}, {"₹", "ੴ", "ਲ਼", "ਁ", "ਃ", "ਰ", "ਹ", "਼",}, } punjabi_full_qwertz_script2 = { {"੍", "ਾ", "ਿ", "ੀ", "ੁ", "ੂ", "ੋ", "ੈ", "ੇ", "ੌ",}, {"", "", "", "", "", "", "", "ੱ", "ੰ", "ਂ",}, {}, {}, {"", "", "", "ਁ", "ਃ", "ਰ", "ਹ", "਼",}, } punjabi_full_qwertz_expand_long_press_input2 = { {"੍", "ਾ", "ਿ", "ੀ", "ੁ", "ੂ", "ੋ", "ੈ", "ੇ", "ੌ",}, {{"ੜ੍ਹ"}, "ਙ", "ਞ", "ਜ਼", "ਫ਼", "ਖ਼", "ਗ਼", "ੱ", "ੰ", "ਂ",}, {"ਘ", "ਚ", "ਛ", "ਜ", "ਝ", "ਟ", "ਠ", "ਡ", "ਢ", "ਣ",}, {"੧", "੨", "੩", "੪", "੫", "੬", "੭", "੮", "੯", "੦",}, {"₹", "ੴ", "ਲ਼", "ਁ", "ਃ", "+ਰ", "+ਹ", "਼",}, } --Kannada kannada_full_main1 = { {"೧", "೨", "೩", "೪", "೫", "೬", "೭", "೮", "೯", "೦", "ೃ"}, {"ೌ", "ೈ","ಾ", "ೀ", "ೂ", "ಬ", "ಹ", "ಗ", "ದ", "ಜ", "ಡ"}, {"ೋ", "ೇ", "್", "ಿ", "ು", "ಪ", "ರ", "ಕ", "ತ", "ಚ", "ಟ"}, {"ೆ", "ಂ", "ಮ", "ನ", "ವ", "ಲ", "ಸ", "ಯ", "ೊ",}, } kannada_full_main2 = { {"ಒ","್ರ", "ರ್", "ಜ್ಞ", "ತ್ರ", "ಕ್ಷ", "ಶ್ರ", "ೖ", "ೕ", "ಃ", "ಋ"}, {"ಔ", "ಐ", "ಆ", "ಈ", "ಊ", "ಭ", "ಙ", "ಘ", "ಧ", "ಝ", "ಢ"}, {"ಓ", "ಏ", "ಅ", "ಇ", "ಉ", "ಫ", "ಱ", "ಖ", "ಥ", "ಛ", "ಠ"}, {"ಎ", "ಣ", "ಋ", "ಳ", "ಶ", "ಷ", "ಞ", "ೄ", "|" }, } --Kannada changeable kannada_full_qwertz_main = { {"ಅ", "ಆ", "ಇ", "ಈ", "ಉ", "ಊ", "ಋ", "ಎ", "ಏ", "ಐ", }, {"ಒ", "ಓ", "ಔ", "ಂ", "ಃ", "ಕ", "ಖ", "ಗ", "ಘ", "ಙ", }, {"ಚ", "ಛ", "ಜ", "ಝ", "ಞ", "ಟ", "ಠ", "ಡ", "ಢ", "ಣ", }, {"ತ", "ಥ", "ದ", "ಧ", "ನ", "ಪ", "ಫ", "ಬ", "ಭ", "ಮ", }, {"ಯ", "ರ", "ಲ", "ವ", "ಶ", "ಷ", "಼", "‌", }, } kannada_full_qwertz_script = { {"್", "ಾ", "ಿ", "ೀ", "ು", "ೂ", "ೃ", "ೆ", "ೇ", "ೈ", }, {"ೊ", "ೋ", "ೌ", "ಂ", "ಃ", "", "", "", "", "", }, {}, {}, {"", "", "", "", "", "", "಼", ""}, } kannada_full_qwertz_expand_long_press_input = { {"್", "ಾ", "ಿ", "ೀ", "ು", "ೂ", "ೃ", "ೆ", "ೇ", "ೈ", }, {"ೊ", "ೋ", "ೌ", "ಂ", "ಃ", {"ಕ್ಕ", "ಕ್ಷ", "ಕ್ರ", "ಕ್ಷ್ಮ", "ಕ್ತ", "ಕ್ಯ", "ಕ್ಲ", "ಕ್ಟ", "ಕ್ನ", "ಕ್ವ", "ಕ್ಸ", "ಕ್ಷ್ಯ", "ಕ್ಗ", "ಕ್ಬ", "ಕ್ಟ್ರ", "ಕ್ಮ", }, {"ಖ್ಯ", "ಖ್ವ", "ಖ್ತ", "ಖ್ಖ", "ಖ್ಹ", }, {"ಗ್ಗ", "ಗ್ರ", "ಗ್ಯ", "ಗ್ಲ", "ಗ್ನ", "ಗ್ತ", "ಗ್ಧ", "ಗ್ದ", "ಗ್ವ", "ಗ್ಡ", "ಗ್ಸ", "ಗ್ರ್ಯ", "ಗ್ಲ್ಯ", "ಗ್ಬ", "ಗ್ಳ", }, {"ಘ್ರ", "ಘ್ನ", }, {"ಙ್ಮ", }, }, {{"ಚ್ಚ", "ಚ್ಛ", "ಚ್ಯ", "ಚ್ಡ", "ಚ್ತ", "ಚ್ನ", "ಚ್ಹ", "ಚ್ಛ್ರ", "ಚ್ಪ", "ಚ್ಗ", "ಚ್ಮ", "ಚ್ಸ", "ಚ್ಕ", }, {"ಛ್ಘ", }, {"ಜ್ಯ", "ಜ್ಞ", "ಜ್ಜ", "ಜ್ವ", "ಜ್ರ", "ಜ್ಕ", "ಜ್ಮ", "ಜ್ನ", "ಜ್ಪ", "ಜ್ಗ", "ಜ್ಬ", }, {"ಝ್ಕ", "ಝ್ಡ", }, {"ಞ್ಞ", }, {"ಟ್ಟ", "ಟ್ರ", "ಟ್ಯ", "ಟ್ಲ", "ಟ್ವ", "ಟ್ನ", "ಟ್ಕ", "ಟ್ಸ", "ಟ್ಬ", "ಟ್ಸ್ಪ", "ಟ್ಗ", "ಟ್ರ್ಯ", "ಟ್ಮ", "ಟ್ಸ್ಮ", "ಟ್ಜ", "ಟ್ಪ", "ಟ್ದ", }, {"ಠ್ಯ", "ಠ್ಠ", "ಠ್ಮ", }, {"ಡ್ಡ", "ಡ್ರ", "ಡ್ತ", "ಡ್ಯ", "ಡ್ಕ", "ಡ್ನ", "ಡ್ಲ", "ಡ್ಗ", "ಡ್ವ", "ಡ್ಮ", "ಡ್ಬ", "ಡ್ದ", "ಡ್ಶ", "ಡ್ಸ", "ಡ್ರ್ಯ", "ಡ್ಳ", }, {"ಢ್ಯ", }, {"ಣ್ಣ", "ಣ್ಯ", "ಣ್ಮ", "ಣ್ತ", "ಣ್ವ", "ಣ್ರ", "ಣ್ಗ", "ಣ್ನ", "ಣ್ಕ", "ಣ್ಬ", }, }, {{"ತ್ತ", "ತ್ರ", "ತ್ಯ", "ತ್ವ", "ತ್ನ", "ತ್ಮ", "ತ್ಸ", "ತ್ಪ", "ತ್ಕ", "ತ್ಗ", "ತ್ರ್ಯ", "ತ್ತ್ವ", "ತ್ಪ್ರ", "ತ್ಲ", "ತ್ದ", "ತ್ಚ", "ತ್ಬ", }, {"ಥ್ಯ", "ಥ್ರ", "ಥ್ಲ", "ಥ್ವ", "ಥ್ರ್ಯ", }, {"ದ್ದ", "ದ್ರ", "ದ್ಯ", "ದ್ಧ", "ದ್ವ", "ದ್ಮ", "ದ್ಗ", "ದ್ಲ", "ದ್ಷ", "ದ್ಬ", "ದ್ನ", "ದ್ತ", "ದ್ಕ", "ದ್ಸ", "ದ್ಹ", "ದ್ರ್ಯ", "ದ್ಳ", }, {"ಧ್ಯ", "ಧ್ವ", "ಧ್ಧ", "ಧ್ರ", "ಧ್ಪ", "ಧ್ಗ", "ಧ್ಭ", "ಧ್ಬ", }, {"ನ್ನ", "ನ್ಯ", "ನ್ವ", "ನ್ಲ", "ನ್ಮ", "ನ್ಸ", "ನ್ಗ", "ನ್ಟ", "ನ್ಸ್ಪ", "ನ್ರ", "ನ್ಸ್ಟ", "ನ್ಫ", "ನ್ಶ", "ನ್ಕ", "ನ್ದ", "ನ್ಡ", "ನ್ಪ", }, {"ಪ್ರ", "ಪ್ಪ", "ಪ್ಲ", "ಪ್ಟಪ್ತ", "ಪ್ಯ", "ಪ್ನ", "ಪ್ಸ", "ಪ್ಡ", "ಪ್ವ", "ಪ್ಲ್ಯ", "ಪ್ಗ", "ಪ್ಟ್ನ", "ಪ್ಸ್ಟ", "ಪ್ಣ", "ಪ್ಮ", "ಪ್ಕ", }, {"ಫ್ರ", "ಫ್ಯ", "ಫ್ತ", "ಫ್ಲ", "ಫ್ಟ್ವ", "ಫ್ಟ", "ಫ್ಘ", "ಫ್ಲ್ಯ", "ಫ್ಜ", "ಫ್ಸ", "ಫ್ಬ", "ಫ್ನ", }, {"ಬ್ಬ", "ಬ್ರ", "ಬ್ಯ", "ಬ್ದ", "ಬ್ಲ", "ಬ್ಸ", "ಬ್ಲ್ಯ", "ಬ್ಧ", "ಬ್ನ", "ಬ್ವ", "ಬ್ಜ", "ಬ್ಳ", "ಬ್ರ್ಯ", "ಬ್ಗ", "ಬ್ತ", "ಬ್ಭ", }, {"ಭ್ಯ", "ಭ್ರ", }, {"ಮ್ಮ", "ಮ್ಯ", "ಮ್ರ", "ಮ್ಹ", "ಮ್ಲ", "ಮ್ನ", "ಮ್ಗ", "ಮ್ಕ", "ಮ್ಜ", "ಮ್ಚ", "ಮ್ಸ", "ಮ್ಚ್ಯ", "ಮ್ತ", "ಮ್ದ", "ಮ್ಥ", "ಮ್ಡ", "ಮ್ವ", }, }, {{"ಯ್ಯ", "ಯ್ಕ", "ಯ್ದ", "ಯ್ತ", "ಯ್ಲ", "ಯ್ಸ", "ಯ್ಡ", "ಯ್ವ", "ಯ್ನ", "ಯ್ರ", "ಯ್ಗ", "ಯ್ಬ", "ಯ್ಪ", "ಯ್ಜ", "ಯ್ಲ್ಯ", "ಯ್ಶ", }, {"ರ್", "ರ್ಯ", "ರ್ಮ", "ರ್ಥ", "ರ್ವ", "ರ್ಷ", "ರ್ತ", "ರ್ಕ", "ರ್ನ", "ರ್ಶ", "ರ್ಣ", "ರ್ದ", "ರ್ಗ", "ರ್ಭ", "ರ್ಜ", "ರ್ಧ", "ರ್ಚ", "ರ್ಪ", }, {"ಲ್ಲ", "ಲ್ಪ", "ಲ್ಯ", "ಲ್ಕ", "ಲ್ವ", "ಲ್ಮ", "ಲ್ಗ", "ಲ್ಫ", "ಲ್ದ", "ಲ್ನ", "ಲ್ತ", "ಲ್ಬ", "ಲ್ಡ", "ಲ್ಟ", "ಲ್ಸ", "ಲ್ರ", "ಲ್ಜ", "ಲ್ಶ", }, {"ವ್ಯ", "ವ್ರ", "ವ್ನ", "ವ್ಗ", "ವ್ವ", "ವ್ಹ", "ವ್ಳ", "ವ್ಲ", "ವ್ಟ", "ವ್ತ", "ವ್ದ", "ವ್ಕ", "ವ್ಚ", "ವ್ಪ", "ವ್ಮ", "ವ್ಶ", "ವ್ಡ", }, {"ಶ್ರ", "ಶ್ವ", "ಶ್ಯ", "ಶ್ನ", "ಶ್ಚ", "ಶ್ಲ", "ಶ್ಮ", "ಶ್ಗ", "ಶ್ಟ", "ಶ್ಕ", "ಶ್ಬ", "ಶ್ಣ", "ಶ್ಟ್ರ", "ಶ್ಶ", }, {"ಷ್ಟ", "ಷ್ಟ್ರ", "ಷ್ಣ", "ಷ್ಕ", "ಷ್ಯ", "ಷ್ಠ", "ಷ್ಮ", "ಷ್ಪ", "ಷ್ನ", "ಷ್ಪ್ರ", "ಷ್ಟ್ಯ", "ಷ್ಕ್ರ", "ಷ್ಗ", "ಷ್ವ", "ಷ್ಬ", "ಷ್ರ", }, "಼", }, } kannada_full_qwertz_main2 = { {"ಅ", "ಆ", "ಇ", "ಈ", "ಉ", "ಊ", "ಋ", "ಎ", "ಏ", "ಐ", }, {"ಒ", "ಓ", "ಔ", "ಂ", "ಃ", "ಸ", "ಹ", "ಳ", "ಕ್ಷ", "ಜ್ನ", }, {"೧", "೨", "೩", "೪", "೫", "೬", "೭", "೮", "೯", "೦", }, {"ತ್ತ", "ಥ್ಯ", "ದ್ದ", "ಧ್ಯ", "ನ್ನ", "ಪ್ರ", "ಫ್ರ", "ಬ್ಬ", "ಭ್ಯ", "ಮ್ಮ", }, {"ಯ್ಕ", "ರ", "₹", "ೱ", "ೲ", "ಷ", "಼", "‌", }, } kannada_full_qwertz_script2 = { {"್", "ಾ", "ಿ", "ೀ", "ು", "ೂ", "ೃ", "ೆ", "ೇ", "ೈ", }, {"ೊ", "ೋ", "ೌ", "ಂ", "ಃ", "", "", "", "", "", }, {}, {}, {"", "", "", "", "", "", "಼", "", }, } kannada_full_qwertz_expand_long_press_input2 = { {"್", "ಾ", "ಿ", "ೀ", "ು", "ೂ", "ೃ", "ೆ", "ೇ", "ೈ", }, {"ಒ", "ಓ", "ಔ", "ಂ", "ಃ", {"ಸ್ಥ", "ಸ್ತ", "ಸ್ವ", "ಸ್ಯ", "ಸ್ಸ", "ಸ್ಪ", "ಸ್ಕ", "ಸ್ಟ", "ಸ್ನ", "ಸ್ತ್ರ", "ಸ್ಮ", "ಸ್ಲ", "ಸ್ಟ್ರ", "ಸ್ರ", "ಸ್ಫ", "ಸ್ಗ", "ಸ್ಡ", "ಸ್ಖ", }, {"ಹ್ಮ", "ಹ್ಯ", "ಹ್ನ", "ಹ್ವ", "ಹ್ಲ", "ಹ್ಹ", "ಹ್ತ", "ಹ್ಳ", "ಹ್ಞ", "ಹ್ರ", "ಹ್ಸ", }, {"ಳ್ಳ", "ಳ್ತ", "ಳ್ವ", "ಳ್ಯ", "ಳ್ಮ", "ಳ್ನ", "ಳ್ದ", "ಳ್ಗ", "ಳ್ಕ", "ಳ್ಬ", "ಳ್ಳ್ಯ", "ಳ್ಲ", "ಳ್ರ", }, {"ಕ್ಷ", }, {"ಜ್ನ", }, }, {"೧", "೨", "೩", "೪", "೫", "೬", "೭", "೮", "೯", "೦", }, {{"ತ್ತ", }, {"ಥ್ಯ", }, {"ದ್ದ", }, {"ಧ್ಯ", }, {"ನ್ನ", }, {"ಪ್ರ", }, {"ಫ್ರ", }, {"ಬ್ಬ", }, {"ಭ್ಯ", }, {"ಮ್ಮ", }, }, {{"ಯ್ಕ", }, "ರ", "₹", "ೱ", "ೲ", {"ಷ್ಟ", "ಷ್ಟ್ರ", "ಷ್ಣ", "ಷ್ಕ", "ಷ್ಯ", "ಷ್ಠ", "ಷ್ಮ", "ಷ್ಪ", "ಷ್ನ", "ಷ್ಪ್ರ", "ಷ್ಟ್ಯ", "ಷ್ಕ್ರ", "ಷ್ಗ", "ಷ್ವ", "ಷ್ಬ", "ಷ್ರ", }, "಼", }, } --Malayalam malayalam_full_main1 = { {"അ", "ആ", "ഇ", "ഈ", "ഉ", "ഊ", "എ", "ഏ", "ഐ", "ഒ", "ഓ", "ഔ",}, {"ക", "ഗ", "ങ", "ച", "ജ", "ഞ", "ട", "ഡ", "ണ", "ത", "ദ", "ന",}, {"പ", "ബ", "മ", "്", "യ", "ര", "ല", "ശ", "സ",}, } malayalam_full_main2 = { {"അ", "ാ", "ി", "ീ", "ു", "ൂ", "െ", "േ", "ൈ", "ൊ", "ോ", "ൗ"}, {"ഖ" , "ഘ", "ങ", "ഛ", "ഝ", "ഞ", "ഠ", "ഢ", "ഴ", "ഥ", "ധ", "ന"}, {"ഫ", "ഭ", "ം", "്", "വ", "റ", "ള", "ഷ", "ഹ"}, } malayalam_full_alt = { {"൧", "൨", "൩", "൪", "൫", "൬", "൭", "൮", "൯", "൦", "(", ")"}, {"\\", "_", "+", "=", "$", "&", "#", "*", "%", "^", "|", {"\"", "~"}}, {"@", "/", "-", "'", "!", "?", {",", "\""}, ";", ":"}, } malayalam_full_qwertz_main1 = { {"ൊ", "१", "२", "३", "४", "५", "६", "७", "८", "९", "०",}, {"ൌ", "ൈ", "ാ", "ീ", "ൂ", "ബ", "ഹ", "ഗ", "ദ", "ജ", "ഡ",}, {"ോ", "േ", "്", "ി", "ു", "പ", "ര", "ക", "ത", "ച", "ട",}, {"എ", "റ", "മ", "സ", "ല", "വ", "ന", "ഷ", "യ",}, } malayalam_full_qwertz_main2 = { {"ഒ", "ൺ", "ൻ", "ർ", "ൽ", "ൾ", "ഃ", "ം", "ൗ", "|", "",}, {"ഔ", "ഐ", "ആ", "ഈ", "ഊ", "ഭ", "ങ", "ഘ", "ധ", "ഝ", "ഢ",}, {"ഓ", "ഏ", "അ", "ഇ", "ഉ", "ഫ", "ഋ", "ഖ", "ഥ", "ഛ", "ഠ",}, {"െ", "ൃ", "ഴ", "ണ", "ഞ", "ള", "ശ", "ഷ", "യ",}, } --Gujarati gujarati_full_main1 = { {"અ", "આ", "ઇ", "ઈ", "ઉ", "ઊ", "એ", "ઐ", "ઓ", "ઔ", "ઍ", "ઑ",}, {"ક", "ગ", "ઙ", "ચ", "જ", "ઞ", "ટ", "ડ", "ણ", "ત", "દ", "ન",}, {"પ", "બ", "મ", "ઃ", "ય", "ર", "લ", "શ", "સ",}, } gujarati_full_main2 = { {"્", "ા", "િ", "ી", "ુ", "ૂ", "ે", "ૈ", "ો", "ૌ", "ૅ", "ૉ",}, {"ખ", "ઘ", "ં", "છ", "ઝ", "઼", "ઠ", "ઢ", "ણ", "થ", "ધ", "ઁ",}, {"ફ", "ભ", "વ", "ૃ", "ળ", "ષ", "હ", "ક્ષ", "જ્ઞ",}, } gujarati_full_alt1 = { {"૧", "૨", "૩", "૪", "૫", "૬", "૭", "૮", "૯", "૦", "(", ")"}, {"\\", "_", "+", "=", "₹", "&", "#", "*", "%", {"ત્ર", type="input_as_whole"}, "|", {"\"", "~"}}, {"@", "/", "-", "'", "!", "?", {",", "\""}, ";", ":"}, } gujarati_full_alt2 = { {"૧", "૨", "૩", "૪", "૫", "૬", "૭", "૮", "૯", "૦", "(", ")"}, {"\\", "_", "+", "=", "₹", "&", "#", "*", "%", "^", "|", {"\"", "~"}}, {"@", "/", "-", "'", {"ળ્ય", type="input_as_whole"}, "?", {",", "\""}, ";", ":"}, } --Gujarati changeable gujarati_full_qwertz_main = { {"અ", "આ", "ઇ", "ઈ", "ઉ", "ઊ", "એ", "ઐ", "ઓ", "ઔ",}, {"ક", "ખ", "ગ", "ઘ", "ઙ", "ચ", "છ", "જ", "ં", "ઃ",}, {"ઝ", "ઞ", "ટ", "ઠ", "ડ", "ઢ", "ણ", "ત", "થ", "દ",}, {"ધ", "ન", "પ", "ફ", "બ", "ભ", "મ", "ય", "ર", "લ",}, {"વ", "શ", "ષ", "સ", "હ", "ૠ", "ઌ", "ૡ",}, } gujarati_full_qwertz_script = { {"્", "ા", "િ", "ી", "ુ", "ૂ", "ે", "ૈ", "ો", "ૌ",}, {"", "", "", "", "", "", "", "", "ં", "ઃ", }, {}, {}, {"", "", "", "", "", "ૃ", "ૅ", "ૉ", }, } gujarati_full_qwertz_expand_long_press_input = { {"્", "ા", "િ", "ી", "ુ", "ૂ", "ે", "ૈ", "ો", "ૌ",}, {{"ક્સ","ક્વ","ક્ર","ક્લ","ક્શ","ક્મ","ક્ન","ક્ચ","ક્છ","ક્બ","ક્ય",}, {"ખ્શ","ખ્ર","ખ્વ","ખ્સ","ખ્ય","ખ્ત","ખ્ખ","ખ્જ","ખ્મ",}, {"ગ્સ","ગ્વ","ગ્લ","ગ્ર","ગ્ય","ગ્મ","ગ્પ","ગ્ન","ગ્ધ","ગ્દ",}, {"ઘ્વ","ઘ્ર","ઘ્ય","ઘ્ન","ઘ્ઘ",}, {"ચ્ચ","ચ્છ","ચ્ત","ચ્ય","ચ્ર",}, {"ચ્ચ","ચ્છ","ચ્ત","ચ્ય","ચ્ર",}, {"છ્ય"}, {"જ્વ","જ્ય","જ્ર","જ્ન","જ્ઞ","જ્જ","જ્મ",}, {"અં"}, {"અઃ"},}, {{"ઝ્ડ","ઝ્ય",}, {"ઞ"}, {"ટ્વ","ટ્ર","ટ્લ","ટ્સ","ટ્ઠ","ટ્ક","ટ્ટ","ટ્ય",}, {"ઠ્ઠ","ઠ્ય",}, {"ડ્સ","ડ્વ","ડ્ર","ડ્ય","ડ્ડ",}, {"ઢ્ય","ઢ્ઢ",}, {"ણ્ય"}, {"ત્પ","ત્ય","ત્ર","ત્વ","ત્સ","ત્ક","ત્ખ","ત્ક","ત્ખ","ત્ત","ત્થ","ત્ન","ત્મ",}, {"થ્થ","થ્ય","થ્ર","થ્લ","થ્વ","થ્સ",}, {"દ્મ","દ્ય","દ્ર","દ્વ","દ્લ","દ્ગ","દ્ઘ","દ્દ","દ્ધ","દ્ન","દ્ભ",},}, {{"ધ્ર","ધ્મ","ધ્ધ","ધ્ન","ધ્ય","ધ્વ",}, {"ન્દ્ર","ન્સ","ન્વ","ન્શ","ન્હ","ન્ય","ન્ન","ન્ત","ન્દ","ન્મ","ન્ડ","ન્જ","ન્ક","ન્ગ","ન્ટ",}, {"પ્હ","પ્શ","પ્ર","પ્લ","પ્સ","પ્ય","પ્ન","પ્ટ","પ્ત","પ્પ",}, {"ફ્લ","ફ્ય","ફ્ર","ફ્સ","ફ્ત","ફ્ક","ફ્ટ","ફ્ફ",}, {"બ્હ","બ્સ","બ્વ","બ્લ","બ્ર","બ્ય","બ્બ","બ્ડ","બ્ધ","બ્દ","બ્ન","બ્જ",}, {"ભ્વ","ભ્ર","ભ્ય","ભ્ભ",}, {"મ્પ્ર","મ્હ","મ્સ","મ્લ","મ્ર","મ્ય","મ્મ","મ્બ","મ્પ","મ્ન","મ્ત",}, {"ય્ય"}, {"ર્મ","ર્ય","ર્વ","ર્શ","ર્ષ","ર્સ","ર્ણ","ર્ત","ર્થ","ર્દ","ર્ધ","ર્ભ","ર્ક","ર્ગ","ર્ચ","ર્જ","ર્ટ","ર્ડ",}, {"લ્ય","લ્લ","લ્વ","લ્શ","લ્સ","લ્દ","લ્ધ","લ્પ","લ્ફ","લ્બ","લ્મ","લ્ક","લ્ગ","લ્ચ","લ્થ","લ્ટ","લ્ત",},}, {{"વ્હ","વ્ર","વ્મ","વ્ય","વ્વ",}, {"શ્ર્વ","શ્ય","શ્બ","શ્મ","શ્ર","શ્ર્ન","શ્ડ","શ્ક","શ્ચ","શ્ત","શ્પ",}, {"ષ્ય","ષ્પ","ષ્મ","ષ્વ","ષ્ન","ષ્ઠ","ષ્ક","ષ્ટ","ષ્ણ",}, {"સ્સ","સ્લ","સ્વ","સ્ત્ર","સ્ર","સ્મ","સ્ન","સ્પ","સ્ય","સ્થ","સ્ટ","સ્ક","સ્જ","સ્ત",}, {"હ્ર્દ","હ્હ","હ્વ","હ્લ","હ્ર","હ્ય","હ્મ","હ્ન","હ્દ",}, {"ૃ","ૄ"}, {"ૢ"}, {"ૣ"},}, } gujarati_full_qwertz_main2 = { {"અ", "આ", "ઇ", "ઈ", "ઉ", "ઊ", "એ", "ઐ", "ઓ", "ઔ",}, {"ળ", "ક્ષ", "જ્ઞ", "ળ્ય", "ત્ર", "શ્ર", "શ્ચ", "ટ્ર", "ં", "ઃ",}, {"પ્ર", "સ્ટ", "સ્ત", "સ્થ", "સ્વ", "ન્ય", "ત્ય", "હ્ય", "લ્લ", "વ્ય",}, {"૧", "૨", "૩", "૪", "૫", "૬", "૭", "૮", "૯", "૦",}, {"₹", "ૐ", "૱", "઼", "ઁ", "ૠ", "ઌ", "ૡ"}, } gujarati_full_qwertz_script2 = { {"્", "ા", "િ", "ી", "ુ", "ૂ", "ે", "ૈ", "ો", "ૌ",}, {"", "", "", "", "", "", "", "", "ં", "ઃ", }, {}, {}, {"", "", "", "઼", "ઁ", "ૃ", "ૅ", "ૉ", }, } gujarati_full_qwertz_expand_long_press_input2 = { {"્", "ા", "િ", "ી", "ુ", "ૂ", "ે", "ૈ", "ો", "ૌ",}, {{"ળ્ય"}, {"ક્ષ"}, {"જ્ઞ"}, {"ળ્ય"}, {"ત્ર"}, {"શ્ર"}, {"શ્ચ"}, {"ટ્ર"}, {"અં"}, {"અઃ"},}, {{"પ્ર"}, {"સ્ટ"}, {"સ્ત"}, {"સ્થ"}, {"સ્વ"}, {"ન્ય"}, {"ત્ય"}, {"હ્ય"}, {"લ્લ"}, {"વ્ય"},}, {{"૧"}, {"૨"}, {"૩"}, {"૪"}, {"૫"}, {"૬"}, {"૭"}, {"૮"}, {"૯"}, {"૦"},}, {{"₹"}, {"ૐ"}, {"૱"}, {"઼"}, {"ઁ"}, {"ૃ","ૄ"}, {"ૢ"}, {"ૣ"},}, } --Assamese assamese_full_main1 = { {"ৌ", "ৈ", "া", "ী", "ূ", "ব", "হ", "গ", "দ", "জ", "ড", "়", }, {"ো", "ে", "্", "ি", "ু", "প", "ৰ", "ক", "ত", "চ", "ট", "য",}, {"ং", "ম", "ন", "ৱ", "ল", "স", "জ্ঞ", "ত্র", "য়", }, } assamese_full_main2 = { {"ঔ", "ঐ", "আ", "ঈ", "ঊ", "ভ", "ঙ", "ঘ", "ধ", "ঝ", "ঢ", "ঞ", }, {"ও", "এ", "অ", "ই", "উ", "ফ", "ৰ্", "খ", "থ", "ছ", "ঠ", "ঋ",}, {"ঁ", "ণ", "্র", "ৃ", "ক্ষ", "শ", "ষ", "শ্ৰ", "ঃ", }, } assamese_full_alt = { {"১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯", "০", "(", ")"}, {"\\", "_", "+", "=", "$", "&", "#", "*", "%", "^", "|", {"\"", "~"}}, {"@", "/", "-", "'", "!", "?", {",", "\""}, ";", ":"}, } --Portuguese portuguese_full_qwerty_main = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "ç"}, {"z", "x", "c", "v", "b", "n", "m"}, } portuguese_full_qwerty_alt_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|"}, {"@", "/", "-", "'", "!", "?", ";"}, } portuguese_full_qwerty_alt_curve_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, --for draw the "shift_title" of softkey in **curve** template {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|"}, {"@", "/", "-", "'", "!", "?", ";"}, } portuguese_full_qwerty_shift_curve_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {}, {}, } --Indian Devanagari devanagari_full_qwerty_main1 = { {"ॉ", "१", "२", "३", "४", "५", "६", "७", "८", "९", "०", }, {"ौ", "ै", "ा", "ी", "ू", "ब", "ह", "ग", "द", "ज", "ड", }, {"ो", "े", "्", "ि", "ु", "प", "र", "क", "त", "च", "ट", }, {"़", "ं", "म", "न", "व", "ल", "स", "ष", "य"} } devanagari_full_qwerty_main2 = { {"ऑ", "ॅ", "॓", "ॊ", "ः", "।", "~", "ज", "क", "त", "र", }, {"औ", "ऐ", "आ", "ई", "ऊ", "भ", "ङ", "घ", "ध", "झ", "ढ", }, {"ओ", "ए", "अ", "इ", "उ", "फ", "ऋ", "ख", "थ", "छ", "ठ", }, {"ृ", "ॐ", "ँ", "ण", "ञ", "ळ", "श", "ष", "य"} } devanagari_full_alt = { {}, {"\\", "_", "+", "=", "$", "&", "#", "*", "%", "^", "|"}, {"@", "/", "-", "'", "!", "?", "\"", ";", ":", "(", ")"}, } --Armenian armenian_full_main = { {"է", "թ", "փ", "ձ", "ջ", "ր", "չ", "ճ", "ժ", "ծ",}, {"ք", "ո", "ե", "ռ", "տ", "ը", "ւ", "ի", "օ", "պ",}, {"ա", "ս", "դ", "ֆ", "գ", "հ", "յ", "կ", "լ", "խ",}, {"զ", "ղ", "ց", "վ", "բ", "ն", "մ", "շ",}, } armenian_full_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0",}, {"", "", "", "", "", "", "", "", "", "",}, {}, {}, } -- Georgian georgian_full_main1 = { {"ქ", "წ", "ე", "რ", "ტ", "ყ", "უ", "ი", "ო", "პ", }, {"ა", "ს", "დ", "ფ", "გ", "ჰ", "ჯ", "კ", "ლ", }, {"ზ", "ხ", "ც", "ვ", "ბ", "ნ", "მ", }, } georgian_full_main2 = { {"ქ", "ჭ", "ე", "ღ", "თ", "ყ", "უ", "ი", "ო", "პ", }, {"ა", "შ", "დ", "ფ", "გ", "ჰ", "ჟ", "კ", "ლ", }, {"ძ", "ხ", "ჩ", "ვ", "ბ", "ნ", "მ", }, } georgian_full_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "০", }, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", }, {"@", "/", "-", "'", "!", "?", ";", }, } georgian_full_expand_long_press_input = { {"", "", "ჱ", "", "", "ჸ", "", "ჲ", "", "", }, {"ჺ", "", "", "ჶ", "ჹ", "ჵ", "ჷ", "", "", }, {"", "ჴ", "", "ჳ", "", "ჼ", "", }, } -- tatar tatar_full_main = { {"й", "ө", "у", "к", "е", "н", "г", "ш", "ә", "з", "х", }, {"ф", "ы", "в", "а", "п", "р", "о", "л", "д", "э", "ү", }, {"я", "ч", "с", "м", "и", "т", "җ", "б", "ю", "һ"}, } tatar_full_alt = { {"~", "ц", "^", "%", "ё", "ң", "+", "=", "щ", "(", ")", }, {"\\", "_", "`", "#", "&", "*", "|", "€", "ж", "£", "ъ", }, {"@", "/", "-", "'", "!", "?", "ь", "\"", ";", ":", }, } --Japanese japanese_full_qwerty_main = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "ー"}, {"z", "x", "c", "v", "b", "n", "m"}, } japanese_full_qwerty_alt_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, --for draw the "shift_title" of softkey in **curve** template {"_", ":", "\"", "…", ";", "&", "#", "「", "」", "|"}, {"-", "!", "/", ".", ",", "?", "@" }, } --Azerbaijani az_full_main = { {"q", "ü", "e", "r", "t", "y", "u", "i", "o", "p", "ö", "ğ",}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "ı", "ə",}, {"z", "x", "c", "v", "b", "n", "m", "ç", "ş",}, } az_full_alt = { {"1", "2", "3", "4", "5", "6", "7","8", "9", "0", "(", ")",}, {"\\", "_", "`", "#", "&", "*", "|", "€", "÷", "£", "»",}, {"@", "/", "-", "'", "!", "?", "\"", ";", ":",}, } -- yoruba yoruba_full_qwerty_expand_long_press_input = { {"", "", {"è", "ẹ", "ẹ́", "ẹ̀", "é"}, "", "", "", "", "", {"ò", "ọ́", "ọ̀", "ọ", "ó"}, ""}, {"", "", "", "", "", "", "", "", ""}, {"", "", "", "", "", "", {"m̀", "ḿ"}}, } japanese_phonepad_main = { {"あ", "か", "さ"}, {"た", "な", "は"}, {"ま", "や", "ら"}, {"わ", "、"} } japanese_phonepad_slide = { {"いうえお", "きくけこ", "しすせそ"}, {"ちつてと", "にぬねの", "ひふへほ"}, {"みむめも", "(ゆ)よ", "りるれろ"}, {"をんー", "。?!"}, } japanese_phonepad_multi_toggle = { {"いうえおぁぃぅぇぉ", "きくけこ", "しすせそ"}, {"ちつてとっ", "にぬねの", "ひふへほ"}, {"みむめも", "ゆよゃゅょ", "りるれろ"}, {"をんゎー", "。?!・~"}, } -- Oromo oromo_full_qwerty_main = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", "'"}, {"z", "x", "c", "v", "b", "n", "m"}, } oromo_full_qwerty_alt_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "÷"}, {"@", "/", "-", "'", "!", "?", ";"}, } oromo_full_qwerty_shift_international = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {}, {}, } -- Tigre tigre_full_qwerty_main1 = { {"ሀ", "ለ", "ሐ", "መ", "ሠ", "ረ", "ሰ", "ቀ", "ቐ", "በ", "ተ", "ኀ"}, {"ነ", "አ", "ከ", "ኸ", "ወ", "ዐ", "ዘ", "የ", "ደ", "ገ", "ጠ", "ጰ"}, {"ጸ", "ፀ", "ፈ", "ፐ", "ቈ", "ኈ", "ኰ", "ጐ"}, } tigre_full_qwerty_main2 = { {"ሀ", "ለ", "ሐ", "መ", "ሠ", "ረ", "ሸ", "ቀ", "ቘ", "ቨ", "ቸ", "ኀ"}, {"ኘ", "አ", "ከ", "ዀ", "ወ", "ዐ", "ዠ", "የ", "ጀ", "ጘ", "ጨ", "ጰ"}, {"ጸ", "ፀ", "ፈ", "ፐ", "ቈ", "ⶓ", "ኰ", "ጐ"}, } tigre_full_qwerty_alt_international = { {"፩", "፪", "፫", "፬", "፭", "፮", "፯", "፰", "፱", "፲", "፻", "፼"}, {"\\", "_", "`", "#", "&", "*", "|", "÷", ":", "(", ")", "»"}, {"@", "/", "-", "'", "!", "?", "\"", ";"}, } -- Pashto pashto_full_qwerty_main1 = { {"ض", "ص", "ث", "ق", "ف", "غ", "ع", "ه", "خ", "ح", "ج", "چ"}, {"ش", "س", "ى", "ب", "ل", "ا", "ت", "ن", "م", "ک", "ګ",}, {"ۍ", "ې", "ﺯ", "ر", "ﺫ", "د", "ړ", "و", "ږ"}, } pashto_full_qwerty_main2 = { {"ْ", "ۥ", "ً", "ٍ", "ُ", "ِ", "َ", "ّ", "ځ", "څ", "ٓ", "ٌ"}, {"ښ", "ئ", "ي", "پ", "أ", "آ", "ټ", "ڼ", "ة", "ٰ", "ٖ", "ـ"}, {"ظ", "ط", "ژ", "ء", "ث", "ډ", "ٶ", "ٔ", "ٕ"}, } pashto_full_qwerty_alt_international = { {"۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹", "۰", "(", ")"}, {"\\", "_", "`", "#", "&", "*", "|", "€", "÷", "£", "»"}, {"@", "/", "-", "'", "!", "؟", "\"", "؛", ":"}, } -- Kurdish kurdish_full_qwerty_main1 = { {"ۊ", "و", "ە", "ر", "ت", "ی", "ئ", "ح", "ۆ", "پ",}, {"ا", "س", "د", "ف", "گ", "ً", "ژ", "ک", "ل", "",}, {"ـ", "ز", "خ", "ج", "ڤ", "ب", "ن",}, } kurdish_full_qwerty_main2 = { {"ئ", "وو", "َ", "ڕ", "ط", "ێ", "ء", "ع", "ؤ", "ث",}, {"آ", "ش", "ذ", "إ", "غ", "ٔ", "أ", "ك", "ڵ", ""}, {"ُ", "ض", "ص", "چ", "ظ", "ٰ", "م",}, } kurdish_full_qwerty_alt_international = { {"۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹", "۰"}, {"\\", "_", "`", "#", "&", "*", "|", "€", "٪"}, {"@", "!", "؟", "\"", "؛", ":", "؍"}, } -- Oriya changeable oriya_full_qwertz_main1 = { {"ଅ", "ଆ", "ଇ", "ଈ", "ଉ", "ଊ", "ଋ", "ଏ", "ଐ", "ଓ", }, {"କ", "ଖ", "ଗ", "ଘ", "ଙ", "ଚ", "ଛ", "ଜ", "ଝ", "ଞ", }, {"ଟ", "ଠ", "ଡ", "ଢ", "ଣ", "ତ", "ଥ", "ଦ", "ଧ", "ନ", }, {"ପ", "ଫ", "ବ", "ଵ", "ଭ", "ମ", "ଯ", "ୟ", "ର", "ଳ", }, {"ଲ", "ୱ", "ଶ", "ଷ", "ସ", "ହ", "଼", "ଔ", }, } oriya_full_qwertz_script1 = { {"୍", "ା", "ି", "ୀ", "ୁ", "ୂ", "ୃ", "େ", "ୈ", "ୋ", }, {}, {}, {}, {"", "", "", "", "", "", "଼", "ୌ", }, } oriya_full_qwertz_expand_long_press_input1 = { {"୍", "ା", "ି", "ୀ", "ୁ", "ୂ", "ୃ", "େ", "ୈ", "ୋ", }, {{"କ୍କ", "କ୍ଳ", "କ୍ୟ", "କ୍ତ", "କ୍ନ", "କ୍ୱ", "କ୍ମ", "କ୍ର", "କ୍ଲ", "କ୍ସ", "କ୍ଷ", }, {"ଖ୍ନ", "ଖ୍ୟ", "ଖ୍ର", "ଖ୍ତ", }, {"ଗ୍ନ", "ଗ୍ୟ", "ଗ୍ମ", "ଗ୍ର", "ଗ୍ଲ", "ଗ୍ୱ", "ଗ୍ଧ", "ଗ୍ଳ", }, {"ଘ୍ର", "ଘ୍ୟ", "ଘ୍ନ", }, {"ଙ୍କ", "ଙ୍ଗ", "ଙ୍ଘ", "ଙ୍ଖ", }, {"ଚ୍ର", "ଚ୍ୟ", "ଚ୍ଚ", "ଚ୍ଛ", }, "ଛ", {"ଜ୍ର", "ଜ୍ୱ", "ଜ୍ଜ", "ଜ୍ଞ", "ଜ୍ୟ", }, "ଝ", {"ଞ୍ଚ", "ଞ୍ଛ", "ଞ୍ଜ", "ଞ୍ଝ", }, }, {{"ଟ୍ଟ", "ଟ୍ୟ", "ଟ୍ର", }, {"ଠ୍ୟ", }, {"ଡ୍ଡ", "ଡ୍ର", "ଡ୍ୟ", }, {"ଢ଼", }, {"ଣ୍ଣ", "ଣ୍ଡ", "ଣ୍ୟ", "ଣ୍ଟ", "ଣ୍ଢ", "ଣ୍ଠ", }, {"ତ୍କ", "ତ୍ତ", "ତ୍ନ", "ତ୍ପ", "ତ୍ମ", "ତ୍ୟ", "ତ୍ର", "ତ୍ୱ", "ତ୍ସ", "ତ୍ଥ", }, {"ଥ୍ୟ", "ଥ୍ର", "ଥ୍ୱ", }, {"ଦ୍ଦ", "ଦ୍ଧ", "ଦ୍ନ", "ଦ୍ଭ", "ଦ୍ମ", "ଦ୍ୟ", "ଦ୍ର", "ଦ୍ୱ", "ଦ୍ଗ", "ଦ୍ଘ", }, {"ଧ୍ୟ", "ଧ୍ର", "ଧ୍ୱ", }, {"ନ୍ତ", "ନ୍ଥ", "ନ୍ଦ", "ନ୍ଧ", "ନ୍ନ", "ନ୍ମ", "ନ୍ୟ", "ନ୍ର", "ନ୍ୱ", "ନ୍ସ", "ନ୍ତ୍ର", }, }, {{"ପ୍ତ", "ପ୍ନ", "ପ୍ର", "ପ୍ୟ", "ପ୍ଳ", "ପ୍ପ", "ପ୍ଲ", "ପ୍ସ", }, {"ଫ୍ୟ", "ଫ୍ର", "ଫ୍ଲ", }, {"ବ୍ବ", "ବ୍ୟ", "ବ୍ଳ", "ବ୍ଧ", "ବ୍ର", "ବ୍ଲ", "ବ୍ଦ", }, {"ଵ୍ୟ", }, {"ଭ୍ୟ", "ଭ୍ର", }, {"ମ୍ନ", "ମ୍ପ", "ମ୍ଫ", "ମ୍ବ", "ମ୍ଭ", "ମ୍ମ", "ମ୍ୟ", "ମ୍ର", "ମ୍ଲ", "ମ୍ଳ", }, {"ଯ୍ର", "ଯ୍ୟ", }, {"ୟ୍ଯ", }, {"ର୍ଖ", "ର୍ଘ", "ର୍ଚ", "ର୍ଛ", "ର୍ଝ", "ର୍ଠ", "ର୍ଡ", "ର୍ଦ", "ର୍ଧ", "ର୍ନ", "ର୍ପ", "ର୍ବ", "ର୍ଯ", "ର୍ସ", "ର୍ହ", "ର୍ଗ", "ର୍ଭ", "ର୍ଜ", }, {"ଳ୍ମ", "ଳ୍ପ", "ଳ୍କ", "ଳ୍ୟ", }, }, {{"ଲ୍କ", "ଲ୍ପ", "ଲ୍ୟ", "ଲ୍ଲ", "ଲ୍ମ", "ଲ୍ର", }, "ୱ", {"ଶ୍କ", "ଶ୍ଚ", "ଶ୍ନ", "ଶ୍ମ", "ଶ୍ୟ", "ଶ୍ର", "ଶ୍ଲ", "ଶ୍ଳ", "ଶ୍ୱ", }, {"ଷ୍କ", "ଷ୍ଟ", "ଷ୍ଣ", "ଷ୍ଠ", "ଷ୍ନ", "ଷ୍ପ", "ଷ୍ଫ", "ଷ୍ୟ", "ଷ୍ମ", "ଷ୍ର", }, {"ସ୍କ", "ସ୍ଫ", "ସ୍ତ", "ସ୍ଥ", "ସ୍ନ", "ସ୍ପ", "ସ୍ୟ", "ସ୍ୱ", "ସ୍ମ", "ସ୍ତ୍ର", "ସ୍ର", "ସ୍ଲ", }, {"ହ୍ୱ", "ହ୍ଲ", "ହ୍ୟ", "ହ୍ର", "ହ୍ମ", "ହ୍ନ", }, "଼", "ୌ", }, } oriya_full_qwertz_main2 = { {"ଅ", "ଆ", "ଇ", "ଈ", "ଉ", "ଊ", "ଋ", "ଏ", "ଐ", "ଓ", }, {"ଡ଼", "ଢ଼", "କ୍ଷ", "ଷ୍ଟ", "ଙ୍କ", "ଚ୍ର", "ଽ", "୰", "ୗ", "ୠ", }, {"ଟ୍ଟ", "ଠ୍ୟ", "ଡ୍ର", "ଢ୍ୟ", "ଣ୍ଣ", "ତ୍ର", "ଥ୍ୟ", "ଦ୍ଧ", "ଧ୍ୟ", "ନ୍ତ", }, {"୧", "୨", "୩", "୪", "୫", "୬", "୭", "୮", "୯", "୦", }, {"ଲ୍ଲ", "₹", "ॐ", "ଁ", "ଂ", "ଃ", "଼", "ଔ", }, } oriya_full_qwertz_script2 = { {"୍", "ା", "ି", "ୀ", "ୁ", "ୂ", "ୃ", "େ", "ୈ", "ୋ", }, {"", "", "", "", "", "", "", "", "", "ୄ"}, {}, {}, {"", "", "", "ଁ", "ଂ", "ଃ", "଼", "ୌ", }, } oriya_full_qwertz_expand_long_press_input2 = { {"୍", "ା", "ି", "ୀ", "ୁ", "ୂ", "ୃ", "େ", "ୈ", "ୋ", }, {{"ଡ଼", }, {"ଢ଼", }, {"କ୍ଷ", }, {"ଷ୍ଟ", }, {"ଙ୍କ", }, {"ଚ୍ର", }, "ଽ", "୰", "ୗ", "ୄ", }, {{"ଟ୍ଟ", }, {"ଠ୍ୟ", }, {"ଡ୍ର", }, {"ଢ୍ୟ", }, {"ଣ୍ଣ", }, {"ତ୍ର", }, {"ଥ୍ୟ", }, {"ଦ୍ଧ", }, {"ଧ୍ୟ", }, {"ନ୍ତ", }, }, {"୧", "୨", "୩", "୪", "୫", "୬", "୭", "୮", "୯", "୦", }, {{"ଲ୍ଲ", }, "₹", "ॐ", "ଁ", "ଂ", "ଃ", "଼", "ଔ", }, } tf_full_azerty_main1 = { {"ⴰ", "ⵣ", "ⴻ", "ⵔ", "ⵜ", "ⵢ", "ⵓ", "ⵉ", "ⵄ", "ⵃ", "⵿", }, {"ⵇ", "ⵙ", "ⴷ", "ⴸ", "ⴼ", "ⴳ", "ⵀ", "ⵊ", "ⴽ", "ⵍ", "ⵎ", }, {"ⵡ", "ⵅ", "ⵛ", "ⵖ", "ⴱ", "ⵏ", "⵰", }, } tf_full_azerty_main2 = { {"ⴰ", "ⵥ", "ⵦ", "ⵕ", "ⵟ", "ⵢ", "ⴶ", "ⵑ", "ⵧ", "ⵒ", "⵿", }, {"ⵈ", "ⵚ", "ⴹ", "ⴺ", "ⵤ", "ⴴ", "ⵃ", "ⴵ", "ⴿ", "ⵋ", "ⵌ", }, {"ⵯ", "ⵆ", "ⵞ", "ⵠ", "ⴲ", "ⵐ", "⵰", }, } tf_full_azerty_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", {"()", 1, type="input_match_symbol"}, }, {"\\", "_", "`", "#", "&", "*", "|", "€", "÷", "£", "»", }, {"/", "-", "'", "!", "?", "\"", ";", ":", }, } tf_full_azerty_expand_long_press_input1 = { {"", "", "", "", "", "", "", "", "", "", {"ⵗ", "ⵂ", "ⵘ", "ⴾ"}, }, {"", "", "", "", "", {"ⴳⵯ"}, "ⵁ", "", {"ⴽⵯ"}, "", "", }, {}, } tf_full_azerty_expand_long_press_input2 = { {"", "", "", "", "", "", "", "", "", "", {"ⵗ", "ⵂ", "ⵘ", "ⴾ"}, }, {}, {}, } sinhala_full_qwerty_main1 = { {"්‍ර", "ේ", "ෛ", "ො", "ෝ", "ෞ", "ෟ", "ඈ", "ඏ",}, {"ු", "අ", "ැ", "ර", "එ", "හ", "ම", "ස", "ද", "ච", "ඤ",}, {"්", "ි", "ා", "ෙ", "ට", "ය", "ව", "න", "ක", "ත", }, {"ං", "ජ", "ඩ", "ඉ", "බ", "ප", "ල", "ග",}, } sinhala_full_qwerty_main2 = { {"ර්", "ඕ", "ඟ", "ඬ", "ඒ", "ඳ", "ආ", "ඇ", "෴",}, {"ූ", "උ", "ෑ", "ඍ", "ඔ", "ශ", "ඹ", "ෂ", "ධ", "ඡ", "ඥ",}, {"ෟ", "ී", "ෘ", "ෆ", "ඨ", "්‍ය", "ළු", "ණ", "ඛ", "ථ", }, {"ඃ", "ඣ", "ඪ", "ඊ", "භ", "ඵ", "ළ", "ඝ",}, } sunda_full_qwerty_main = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}, {"a", "s", "é", "d", "f", "g", "h", "j", "k", "l"}, {"z", "x", "c", "v", "b", "n", "m"}, } sunda_full_qwerty_alt = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}, {"\\", "_", "`", "#", "&", "*", "|", "€", "÷", "£"}, {"@", "/", "-", "'", "!", "?", "\""}, } -- Santhali Ol Chiki santhali_full_qwerty_main = { {"ᱧ", "ᱣ", "ᱮ", "ᱨ", "ᱛ", "ᱭ", "ᱩ", "ᱤ", "ᱳ", "ᱯ", "ᱚ"}, {"ᱽ", "ᱟ", "ᱥ", "ᱫ", "ᱝ", "ᱜ", "ᱷ", "ᱦ", "ᱡ", "ᱠ", "ᱞ"}, {"ᱲ", "ᱰ", "ᱪ", "ᱶ", "ᱵ", "ᱱ", "ᱬ", "ᱢ", "ᱴ"}, } santhali_full_qwerty_alt_num_row_off = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "()"}, {"\\", "_", "`", "#", "&", "*", "|", "€", "÷", "₹", "»"}, {"@", "/", "-", "'", "!", "?", "\"", ";", ":"}, } santhali_full_qwerty_alt = { {"~", "$", "^", "%", "+", "=", "[", "]", "<", ">", "…"}, {"\\", "_", "`", "#", "&", "*", "|", "€", "÷", "₹", "»"}, {"@", "/", "-", "'", "!", "?", "\"", ";", ":"}, } santhali_full_qwerty_expand_long_press_input = { {"᱑", "᱒", "᱓", "᱔", "᱕", "᱖", "᱗", "᱘", "᱙", "᱐", ""}, {"", "", "", "", "", "", "", "", "", "", ""}, {"", "", "", "", "", "", "", "", ""}, } --zawgyi zawgyi_full_qwertz_main1 = { {"ဆ", "တ", "န", "မ", "အ", "ပ", "က", "င", "သ", "စ", "ဒ",}, {"ေ", "်", "ိ", "္", "ါ", "့", "ျ", "ု", "ူ", "း", "ဟ",}, {"ဖ", "ထ", "ခ", "လ", "ဘ", "ည", "ာ", "ယ",}, } zawgyi_full_qwertz_main2 = { {"ဓ", "ဉ", "ႏ", "ရ", "ႊ", "႔", "႕", "ႈ", "ဥ", "ဏ", "ဒ",}, {"ဗ", "ွ", "ီ", "ၤ", "ြ", "ံ", "ဲ", "ဳ", "ဴ", "ၚ", "ဂ",}, {"ဇ", "ဌ", "ဃ", "ဠ", "ႀ", "ၿ", "ၾ", "ဝ",}, } zawgyi_full_qwertz_main3 = { {"၁", "၂", "၃", "၄", "၅", "၆", "၇", "၈", "၉", "၀",}, {"ဧ", "ဍ", "႑", "၌", "ဦ", "ဣ", "၎", "ႁ", "ႂ", "ႋ",}, {"ဋ", "၍", "႒", "ၫ", "ဈ", "ၯ", "၏", "ဤ", "ႎ",}, } zawgyi_full_qwertz_main4 = { {"ၠ", "ၡ", "ၢ", "ၣ", "ၥ", "ၨ", "ၩ", "ၬ", "ၭ", "ၰ",}, {"ၵ", "ၶ", "ၷ", "ၸ", "ၹ", "ၺ", "ၻ", "ၼ", "ႅ", "႖",}, {"ၱ", "ၲ", "ၳ", "ၴ", "ၦ", "ၧ", "႓", "ႍ", "ႆ",}, } return P PK n5:Q{}ڛڛ5assets/keyboard_symbol.lua.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "emoji" local P = {} P._G = _G if _REQUIREDNAME == nil then keyboard_symbol = P else _G[_REQUIREDNAME] = P end setfenv(1, P) si = _G.smartinput ck = _G.common_keys emo = _G.emoji normal_symbol_smiley_table = {"♥", "♂", "♀", "♪","✔", "✖", "↑", "↓", "→", "←"} normal_symbol = { {"1", "2", "3", "+", "-", "@", "$", "(", ")"}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "?"}, {"0", "."}, } normal_symbol_2 = { {"[", "]", "{", "}", "<", ">", "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "€", "¥", "£", "¢"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } normal_symbol_alt_table = { ["-"] = "_", ["@"] = "&", ["$"] = "€", ["("] = "<", [")"] = ">", ["("] = "<", [")"] = ">", ["'"] = "‹", ["\""] = "«", ["“"] = "‘", ["”"] = "’", [":"] = ";", [":"] = ";", ["#"] = "%", [";"] = "%", [";"] = "%", ["؛"] = "%", ["!"] = "¡", ["¡"] = "!", ["?"] = "¿", ["¿"] = "?", ["؟"] = "?", ["π"] = "Π", ["^"] = "Δ", ["|"] = "¦", ["•"] = "°", ["¤"] = "Φ", ["₪"] = "€", ["₹"] = "$", ["\\"] = "§", ["₽"] = "€", ["₺"] = "€", ["៛"] = "$", ["€"] = "$", } rtl_symbol_alt_table = { ["-"] = "_", ["@"] = "&", ["$"] = "€", ["("] = {"<", 0, ">"}, [")"] = {">", 0, "<"}, ["("] = {"<", 0, ">"}, [")"] = {">", 0, "<"}, ["'"] = {"‹", 0, "›"}, ["\""] = {"«", 0, "»"}, ["“"] = "‘", ["”"] = "’", [":"] = "؛", [":"] = ";", ["#"] = "%", [";"] = "%", [";"] = "%", ["؛"] = "%", ["!"] = "¡", ["¡"] = "!", ["?"] = "¿", ["¿"] = "?", ["؟"] = "?", ["π"] = "Π", ["^"] = "Δ", ["|"] = "¦", ["•"] = "°", ["¤"] = "Φ", ["₪"] = "€", ["\\"] = "§", } normal_symbol_expand_table = { ["1"] = {{"¹", "½", "⅓", "¼", "⅛"}, 1}, ["2"] = {{"²", "⅔"}, 1}, ["3"] = {{"³", "¾", "⅜"}, 1}, ["5"] = {{"⅝"}, 1}, ["7"] = {{"⅞"}, 1}, ["+"] = {{"±"}, 1}, ["-"] = {{"—", "_", "–"}, 2}, ["*"] = {{"×"}, 1}, ["/"] = {{"÷"}, 1}, ["="] = {{"≈", "≠", "≥", "≤"}, 2}, ["@"] = {{"&"}, 1}, ["$"] = {{"/=", "/-", "₦", "₹", "¢", "£", "¥", "€",}, 8}, ["₪"] = {{"$", "¥", "£", "€", "¢", "₹"}, 3}, ["("] = {{"<", "[", "{", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, [")"] = {{">", "]", "}", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, ["("] = {{"<", "[", "{", "《"}, 1}, [")"] = {{">", "]", "}", "》"}, 1}, ["'"] = {{"‹", "›", "‘", "’", "‚", "‛", {"‘’", 1}}, 1}, ["\""] = {{"“", "„", "”", "«", "»", {"“”", 1}}, 4}, ["“"] = {{"‘", "「", "『"}, 1}, ["”"] = {{"’", "」", "』"}, 1}, [":"] = {{";"}, 1}, [":"] = {{";"}, 1}, ["#"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, ["؛"] = {{"%", "‰"}, 1}, ["!"] = {{"¡"}, 1}, ["¡"] = {{"!", {"¡!", 1}}, 1}, ["?"] = {{"¿"}, 1}, ["¿"] = {{"?", {"¿?", 1}}, 1}, ["؟"] = {{"?"}, 1}, ["π"] = {{"Π"}, 1}, ["^"] = {{"Δ"}, 1}, ["|"] = {{"¦"}, 1}, ["•"] = {{"°"}, 1}, ["¤"] = {{"Φ"}, 1}, ["₹"] = {{"¥", "£", "$", "€", "¢"}, 3}, ["\\"] = {{"§"}, 1}, ["₽"] = {{"€", "$", "¥", "£", "¢", "₹", "₦"}, 1}, ["₺"] = {{"€", "$", "¥", "£", "¢", "₹", "₦"}, 1}, ["៛"] = {{"$", "€", "¥", "£", "¢", "₹", "₦"}, 1}, ["€"] = {{"/=", "/-", "₦", "₹", "¢", "£", "¥", "$"}, 8}, } eur_symbol = { {"1", "2", "3", "+", "-", "@", "€", "(", ")"}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "?"}, {"0", "."}, } eur_symbol_2 = { {"[", "]", "{", "}", "<", ">", "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "€", "¥", "£", "¢"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } russian_symbol = { {"1", "2", "3", "+", "-", "@", "₽", "(", ")"}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "?"}, {"0", "."}, } russian_symbol_2 = { {"[", "]", "{", "}", "<", ">", "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "€", "¥", "£", "¢"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } khmer_symbol = { {"1", "2", "3", "+", "-", "@", "៛", "(", ")"}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "?"}, {"0", "."}, } khmer_symbol_2 = { {"[", "]", "{", "}", "<", ">", "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "€", "¥", "£", "¢"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } urdu_symbol = { {"1", "2", "3", "+", "-", "@", "$", {"(", 0, ")"}, {")", 0, "("}}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "؟"}, {"0", "."}, } urdu_symbol_2 = { {{"[", 0, "]"}, {"]", 0, "["}, {"{", 0, "}"}, {"}", 0, "{"}, {"<", 0, ">"}, {">", 0, "<"}, "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "€", "¥", "£", "¢"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } spanish_symbol_expand_table = { ["1"] = {{"¹", "½", "⅓", "¼", "⅛"}, 1}, ["2"] = {{"²", "⅔"}, 1}, ["3"] = {{"³", "¾", "⅜"}, 1}, ["5"] = {{"⅝"}, 1}, ["7"] = {{"⅞"}, 1}, ["+"] = {{"±"}, 1}, ["-"] = {{"—", "_", "–"}, 2}, ["*"] = {{"×"}, 1}, ["/"] = {{"÷"}, 1}, ["="] = {{"≈", "≠", "≥", "≤"}, 2}, ["@"] = {{"&"}, 1}, ["$"] = {{"¥", "£", "€", "¢", "₹"}, 3}, ["₪"] = {{"$", "¥", "£", "€", "¢", "₹"}, 3}, ["("] = {{"<", "[", "{", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, [")"] = {{">", "]", "}", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, ["("] = {{"<", "[", "{", "《"}, 1}, [")"] = {{">", "]", "}", "》"}, 1}, ["'"] = {{"‹", "›", "‘", "’", "‚", "‛", {"‘’", 1}}, 1}, ["\""] = {{"“", "„", "”", "«", "»", {"“”", 1}}, 4}, ["“"] = {{"‘", "「", "『"}, 1}, ["”"] = {{"’", "」", "』"}, 1}, [":"] = {{";"}, 1}, [":"] = {{";"}, 1}, ["#"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, ["؛"] = {{"%", "‰"}, 1}, ["!"] = {{"¡", {"¡!", 1}}, 1}, ["¡"] = {{"!", {"¡!", 1}}, 1}, ["?"] = {{"¿", {"¿?", 1}}, 1}, ["¿"] = {{"?", {"¿?", 1}}, 1}, ["؟"] = {{"?"}, 1}, ["π"] = {{"Π"}, 1}, ["^"] = {{"Δ"}, 1}, ["|"] = {{"¦"}, 1}, ["•"] = {{"°"}, 1}, ["¤"] = {{"Φ"}, 1}, ["\\"] = {{"§"}, 1} } rtl_symbol_expand_table = { ["1"] = {{"¹", "½", "⅓", "¼", "⅛"}, 1}, ["2"] = {{"²", "⅔"}, 1}, ["3"] = {{"³", "¾", "⅜"}, 1}, ["5"] = {{"⅝"}, 1}, ["7"] = {{"⅞"}, 1}, ["+"] = {{"±"}, 1}, ["-"] = {{"—", "_", "–"}, 2}, ["*"] = {{"×"}, 1}, ["/"] = {{"÷"}, 1}, ["="] = {{"≈", "≠", "≥", "≤"}, 2}, ["@"] = {{"&"}, 1}, ["₪"] = {{"$", "¥", "£", "€", "¢", "₹"}, 3}, ["$"] = {{"¥", "£", "€", "¢", "₹"}, 3}, ["("] = {{{"<", 0, ">"}, {"[", 0, "]"}, {"{", 0, "}"}}, 1}, [")"] = {{{">", 0, "<"}, {"]", 0, "["}, {"}", 0, "{"}}, 1}, ["("] = {{{"<", 0, ">"}, {"[", 0, "]"}, {"{", 0, "}"}, {"《", 0, "》"}}, 1}, [")"] = {{{">", 0, "<"}, {"]", 0, "["}, {"}", 0, "{"}, {"》", 0, "《"}}, 1}, ["'"] = {{"‘", "’", {"‹", 0, "›"}, {"›", 0, "‹"}, "‚", "‛"}, 3}, ["\""] = {{"“", "„", "”", {"«", 0, "»"}, {"»", 0, "«"}}, 4}, ["“"] = {{"‘", {"「", 0, "」"}, {"『", 0, "』"}}, 1}, ["”"] = {{"’", {"」", 0, "「"}, {"』", 0, "『"}}, 1}, [":"] = {{"؛"}, 1}, [":"] = {{";"}, 1}, ["#"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, ["؛"] = {{"%", "‰"}, 1}, ["!"] = {{"¡"}, 1}, ["¡"] = {{"!"}, 1}, ["?"] = {{"¿"}, 1}, ["¿"] = {{"?"}, 1}, ["؟"] = {{"?"}, 1}, ["π"] = {{"Π"}, 1}, ["^"] = {{"Δ"}, 1}, ["|"] = {{"¦"}, 1}, ["•"] = {{"°"}, 1}, ["¤"] = {{"Φ"}, 1}, ["\\"] = {{"§"}, 1} } hindi_symbol = { {"1", "2", "3", "+", "-", "@", "₹", "(", ")"}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "?"}, {"0", "."}, } hindi_symbol_special = { {"१", "२", "३", "+", "-", "@", "₹", "(", ")"}, {"४", "५", "६", "*", "/", "'", "\"", ":", "#"}, {"७", "८", "९", ",", "=", "!", "?"}, {"०", "."}, } hindi_symbol_2 = { {"[", "]", "{", "}", "<", ">", "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "€", "¥", "£", "$"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } hindi_symbol_alt_table = { ["-"] = "_", ["@"] = "&", ["₹"] = "$", ["("] = "<", [")"] = ">", ["("] = "<", [")"] = ">", ["'"] = "‹", ["\""] = "«", ["“"] = "‘", ["”"] = "’", [":"] = ";", [":"] = ";", ["#"] = "%", [";"] = "%", [";"] = "%", ["؛"] = "%", ["!"] = "¡", ["¡"] = "!", ["?"] = "¿", ["¿"] = "?", ["؟"] = "?", ["π"] = "Π", ["^"] = "Δ", ["|"] = "¦", ["•"] = "°", ["¤"] = "Φ", ["₪"] = "€", ["\\"] = "§", } hindi_symbol_expand_table = { ["1"] = {{"¹", "½", "⅓", "¼", "⅛"}, 1}, ["2"] = {{"²", "⅔"}, 1}, ["3"] = {{"³", "¾", "⅜"}, 1}, ["5"] = {{"⅝"}, 1}, ["7"] = {{"⅞"}, 1}, ["+"] = {{"±"}, 1}, ["-"] = {{"—", "_", "–"}, 2}, ["*"] = {{"×"}, 1}, ["/"] = {{"÷"}, 1}, ["="] = {{"≈", "≠", "≥", "≤"}, 2}, ["@"] = {{"&"}, 1}, ["₹"] = {{"¥", "£", "$", "€", "¢"}, 3}, ["₪"] = {{"$", "¥", "£", "€", "¢", "₹"}, 3}, ["("] = {{"<", "[", "{", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, [")"] = {{">", "]", "}", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, ["("] = {{"<", "[", "{", "《"}, 1}, [")"] = {{">", "]", "}", "》"}, 1}, ["'"] = {{"‹", "›", "‘", "’", "‚", "‛", {"‘’", 1}}, 1}, ["\""] = {{"“", "„", "”", "«", "»", {"“”", 1}}, 4}, ["“"] = {{"‘", "「", "『"}, 1}, ["”"] = {{"’", "」", "』"}, 1}, [":"] = {{";"}, 1}, [":"] = {{";"}, 1}, ["#"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, ["؛"] = {{"%", "‰"}, 1}, ["!"] = {{"¡"}, 1}, ["¡"] = {{"!", {"¡!", 1}}, 1}, ["?"] = {{"¿"}, 1}, ["¿"] = {{"?", {"¿?", 1}}, 1}, ["؟"] = {{"?"}, 1}, ["π"] = {{"Π"}, 1}, ["^"] = {{"Δ"}, 1}, ["|"] = {{"¦"}, 1}, ["•"] = {{"°"}, 1}, ["¤"] = {{"Φ"}, 1}, ["\\"] = {{"§"}, 1} } telugu_symbol_expand_table = { ["1"] = {{"¹", "౧", "½", "⅓", "¼", "⅛"}, 1}, ["2"] = {{"²", "౨", "౺", "౽", "⅔"}, 1}, ["3"] = {{"³", "౩", "౾", "౻", "¾", "⅜"}, 1}, ["4"] = {{"౪"}, 1}, ["5"] = {{"౫", "⅝"}, 1}, ["6"] = {{"౬"}, 1}, ["7"] = {{"౭", "⅞"}, 1}, ["8"] = {{"౮"}, 1}, ["9"] = {{"౯"}, 1}, ["0"] = {{"౦", "౸", "౿"}, 1}, ["+"] = {{"±"}, 1}, ["-"] = {{"—", "_", "–"}, 2}, ["*"] = {{"×"}, 1}, ["/"] = {{"÷"}, 1}, ["="] = {{"≈", "≠", "≥", "≤"}, 2}, ["@"] = {{"&"}, 1}, ["₹"] = {{"¥", "£", "$", "€", "¢"}, 3}, ["₪"] = {{"$", "¥", "£", "€", "¢", "₹"}, 3}, ["("] = {{"<", "[", "{", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, [")"] = {{">", "]", "}", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, ["("] = {{"<", "[", "{", "《"}, 1}, [")"] = {{">", "]", "}", "》"}, 1}, ["'"] = {{"‹", "›", "‘", "’", "‚", "‛", {"‘’", 1}}, 1}, ["\""] = {{"“", "„", "”", "«", "»", {"“”", 1}}, 4}, ["“"] = {{"‘", "「", "『"}, 1}, ["”"] = {{"’", "」", "』"}, 1}, [":"] = {{";"}, 1}, [":"] = {{";"}, 1}, ["#"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, ["؛"] = {{"%", "‰"}, 1}, ["!"] = {{"¡"}, 1}, ["¡"] = {{"!", {"¡!", 1}}, 1}, ["?"] = {{"¿"}, 1}, ["¿"] = {{"?", {"¿?", 1}}, 1}, ["؟"] = {{"?"}, 1}, ["π"] = {{"Π"}, 1}, ["^"] = {{"Δ"}, 1}, ["|"] = {{"¦"}, 1}, ["•"] = {{"°"}, 1}, ["¤"] = {{"Φ"}, 1}, ["\\"] = {{"§"}, 1} } gre_symbol = { {"1", "2", "3", "+", "-", "@", "€", "(", ")"}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "?"}, {"0", "."}, } gre_symbol_2 = { {"[", "]", "{", "}", "<", ">", "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "$", "¥", "£", "¢"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } gre_symbol_alt_table = { ["-"] = "_", ["@"] = "&", ["€"] = "$", ["("] = "<", [")"] = ">", ["("] = "<", [")"] = ">", ["'"] = "‹", ["\""] = "«", ["“"] = "‘", ["”"] = "’", [":"] = ";", [":"] = ";", ["#"] = "%", [";"] = "%", [";"] = "%", ["؛"] = "%", ["!"] = "¡", ["¡"] = "!", ["?"] = "¿", ["¿"] = "?", ["؟"] = "?", ["π"] = "Π", ["^"] = "Δ", ["|"] = "¦", ["•"] = "°", ["¤"] = "Φ", ["₪"] = "€", ["\\"] = "§", } gre_symbol_expand_table = { ["1"] = {{"¹", "½", "⅓", "¼", "⅛"}, 1}, ["2"] = {{"²", "⅔"}, 1}, ["3"] = {{"³", "¾", "⅜"}, 1}, ["5"] = {{"⅝"}, 1}, ["7"] = {{"⅞"}, 1}, ["+"] = {{"±"}, 1}, ["-"] = {{"—", "_", "–"}, 2}, ["*"] = {{"×"}, 1}, ["/"] = {{"÷"}, 1}, ["="] = {{"≈", "≠", "≥", "≤"}, 2}, ["@"] = {{"&"}, 1}, ["€"] = {{"¥", "£", "$", "¢", "₹"}, 3}, ["₪"] = {{"$", "¥", "£", "€", "¢", "₹"}, 3}, ["("] = {{"<", "[", "{", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, [")"] = {{">", "]", "}", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, ["("] = {{"<", "[", "{", "《"}, 1}, [")"] = {{">", "]", "}", "》"}, 1}, ["'"] = {{"‹", "›", "‘", "’", "‚", "‛", {"‘’", 1}}, 1}, ["\""] = {{"“", "„", "”", "«", "»", {"“”", 1}}, 4}, ["“"] = {{"‘", "「", "『"}, 1}, ["”"] = {{"’", "」", "』"}, 1}, [":"] = {{";"}, 1}, [":"] = {{";"}, 1}, ["#"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, ["؛"] = {{"%", "‰"}, 1}, ["!"] = {{"¡"}, 1}, ["¡"] = {{"!", {"¡!", 1}}, 1}, ["?"] = {{"¿"}, 1}, ["¿"] = {{"?", {"¿?", 1}}, 1}, ["؟"] = {{"?"}, 1}, ["π"] = {{"Π"}, 1}, ["^"] = {{"Δ"}, 1}, ["|"] = {{"¦"}, 1}, ["•"] = {{"°"}, 1}, ["¤"] = {{"Φ"}, 1}, ["\\"] = {{"§"}, 1} } he_symbol = { {"1", "2", "3", "+", "-", "@", "₪", {"(", 0, ")"}, {")", 0, "("}}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "?"}, {"0", "."}, } he_symbol_2 = { {{"[", 0, "]"}, {"]", 0, "["}, {"{", 0, "}"}, {"}", 0, "{"}, {"<", 0, ">"}, {">", 0, "<"}, "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "€", "¥", "£", "¢"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } he_symbol_expand_table = { ["1"] = {{"¹", "½", "⅓", "¼", "⅛"}, 1}, ["2"] = {{"²", "⅔"}, 1}, ["3"] = {{"³", "¾", "⅜"}, 1}, ["5"] = {{"⅝"}, 1}, ["7"] = {{"⅞"}, 1}, ["+"] = {{"±"}, 1}, ["-"] = {{"—", "_", "–"}, 2}, ["*"] = {{"×"}, 1}, ["/"] = {{"÷"}, 1}, ["="] = {{"≈", "≠", "≥", "≤"}, 2}, ["@"] = {{"&"}, 1}, ["₪"] = {{"$", "¥", "€", "£", "¢", "₹"}, 3}, ["$"] = {{"¥", "£", "€", "¢", "₹"}, 3}, ["("] = {{{"<", 0, ">"}, {"[", 0, "]"}, {"{", 0, "}"}}, 1}, [")"] = {{{">", 0, "<"}, {"]", 0, "["}, {"}", 0, "{"}}, 1}, ["("] = {{{"<", 0, ">"}, {"[", 0, "]"}, {"{", 0, "}"}, {"《", 0, "》"}}, 1}, [")"] = {{{">", 0, "<"}, {"]", 0, "["}, {"}", 0, "{"}, {"》", 0, "《"}}, 1}, ["'"] = {{"‘", "’", {"‹", 0, "›"}, {"›", 0, "‹"}, "‚", "‛"}, 3}, ["\""] = {{"“", "„", "”", {"«", 0, "»"}, {"»", 0, "«"}}, 4}, ["“"] = {{"‘", {"「", 0, "」"}, {"『", 0, "』"}}, 1}, ["”"] = {{"’", {"」", 0, "「"}, {"』", 0, "『"}}, 1}, [":"] = {{"؛"}, 1}, [":"] = {{";"}, 1}, ["#"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, ["؛"] = {{"%", "‰"}, 1}, ["!"] = {{"¡"}, 1}, ["¡"] = {{"!"}, 1}, ["?"] = {{"¿"}, 1}, ["¿"] = {{"?"}, 1}, ["؟"] = {{"?"}, 1}, ["π"] = {{"Π"}, 1}, ["^"] = {{"Δ"}, 1}, ["|"] = {{"¦"}, 1}, ["•"] = {{"°"}, 1}, ["¤"] = {{"Φ"}, 1}, ["\\"] = {{"§"}, 1} } yoruba_symbol = { {"1", "2", "3", "+", "-", "@", "₦", "(", ")"}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "?"}, {"0", "."}, } yoruba_symbol_2 = { {"[", "]", "{", "}", "<", ">", "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "€", "¥", "£", "¢"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } yoruba_symbol_alt_table = { ["-"] = "_", ["@"] = "&", ["₦"] = "€", ["("] = "<", [")"] = ">", ["("] = "<", [")"] = ">", ["'"] = "‹", ["\""] = "«", ["“"] = "‘", ["”"] = "’", [":"] = ";", [":"] = ";", ["#"] = "%", [";"] = "%", [";"] = "%", ["؛"] = "%", ["!"] = "¡", ["¡"] = "!", ["?"] = "¿", ["¿"] = "?", ["؟"] = "?", ["π"] = "Π", ["^"] = "Δ", ["|"] = "¦", ["•"] = "°", ["¤"] = "Φ", ["₪"] = "€", ["₹"] = "$", ["\\"] = "§", } yoruba_symbol_expand_table = { ["1"] = {{"¹", "½", "⅓", "¼", "⅛"}, 1}, ["2"] = {{"²", "⅔"}, 1}, ["3"] = {{"³", "¾", "⅜"}, 1}, ["5"] = {{"⅝"}, 1}, ["7"] = {{"⅞"}, 1}, ["+"] = {{"±"}, 1}, ["-"] = {{"—", "_", "–"}, 2}, ["*"] = {{"×"}, 1}, ["/"] = {{"÷"}, 1}, ["="] = {{"≈", "≠", "≥", "≤"}, 2}, ["@"] = {{"&"}, 1}, ["₦"] = {{"/=", "/-", "₹", "¢", "£", "¥", "$", "€"}, 8}, ["₪"] = {{"$", "¥", "£", "€", "¢", "₹"}, 3}, ["("] = {{"<", "[", "{", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, [")"] = {{">", "]", "}", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, ["("] = {{"<", "[", "{", "《"}, 1}, [")"] = {{">", "]", "}", "》"}, 1}, ["'"] = {{"‹", "›", "‘", "’", "‚", "‛", {"‘’", 1}}, 1}, ["\""] = {{"“", "„", "”", "«", "»", {"“”", 1}}, 4}, ["“"] = {{"‘", "「", "『"}, 1}, ["”"] = {{"’", "」", "』"}, 1}, [":"] = {{";"}, 1}, [":"] = {{";"}, 1}, ["#"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, ["؛"] = {{"%", "‰"}, 1}, ["!"] = {{"¡"}, 1}, ["¡"] = {{"!", {"¡!", 1}}, 1}, ["?"] = {{"¿"}, 1}, ["¿"] = {{"?", {"¿?", 1}}, 1}, ["؟"] = {{"?"}, 1}, ["π"] = {{"Π"}, 1}, ["^"] = {{"Δ"}, 1}, ["|"] = {{"¦"}, 1}, ["•"] = {{"°"}, 1}, ["¤"] = {{"Φ"}, 1}, ["₹"] = {{"¥", "£", "$", "€", "¢"}, 3}, ["\\"] = {{"§"}, 1} } turkish_symbol = { {"1", "2", "3", "+", "-", "@", "₺", "(", ")"}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "?"}, {"0", "."}, } turkish_symbol_2 = { {"[", "]", "{", "}", "<", ">", "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "€", "¥", "£", "¢"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } tamil_symbol = { {"1", "2", "3", "+", "-", "@", "₹", "(", ")"}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "?"}, {"0", "."}, } tamil_symbol_2 = { {"[", "]", "{", "}", "<", ">", "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "€", "¥", "£", "$"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } tamil_symbol_expand_table = { ["1"] = {{"௧", "௰", "¹", "½", "⅓", "¼", "⅛"}, 1}, ["2"] = {{"௨", "௱", "²", "⅔"}, 1}, ["3"] = {{"௩", "௲", "³", "¾", "⅜"}, 1}, ["4"] = {{"௪", "௳"}, 1}, ["5"] = {{"௫", "௴", "⅝"}, 1}, ["6"] = {{"௬", "௵"}, 1}, ["7"] = {{"௭", "௶", "⅞"}, 1}, ["8"] = {{"௮", "௷"}, 1}, ["9"] = {{"௯", "௸"}, 1}, ["0"] = {{"௦", "௺"}, 1}, ["+"] = {{"±"}, 1}, ["-"] = {{"—", "_", "–"}, 2}, ["*"] = {{"×"}, 1}, ["/"] = {{"÷"}, 1}, ["="] = {{"≈", "≠", "≥", "≤"}, 2}, ["@"] = {{"&"}, 1}, ["$"] = {{"/=", "/-", "₦", "₹", "¢", "£", "¥", "€",}, 8}, ["₪"] = {{"$", "¥", "£", "€", "¢", "₹"}, 3}, ["("] = {{"<", "[", "{", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, [")"] = {{">", "]", "}", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, ["("] = {{"<", "[", "{", "《"}, 1}, [")"] = {{">", "]", "}", "》"}, 1}, ["'"] = {{"‹", "›", "‘", "’", "‚", "‛", {"‘’", 1}}, 1}, ["\""] = {{"“", "„", "”", "«", "»", {"“”", 1}}, 4}, ["“"] = {{"‘", "「", "『"}, 1}, ["”"] = {{"’", "」", "』"}, 1}, [":"] = {{";"}, 1}, [":"] = {{";"}, 1}, ["#"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, ["؛"] = {{"%", "‰"}, 1}, ["!"] = {{"¡"}, 1}, ["¡"] = {{"!", {"¡!", 1}}, 1}, ["?"] = {{"¿"}, 1}, ["¿"] = {{"?", {"¿?", 1}}, 1}, ["؟"] = {{"?"}, 1}, ["π"] = {{"Π"}, 1}, ["^"] = {{"Δ"}, 1}, ["|"] = {{"¦"}, 1}, ["•"] = {{"°"}, 1}, ["¤"] = {{"Φ"}, 1}, ["₹"] = {{"¥", "£", "$", "€", "¢"}, 3}, ["\\"] = {{"§"}, 1}, ["₽"] = {{"€", "$", "¥", "£", "¢", "₹", "₦"}, 1}, ["₺"] = {{"€", "$", "¥", "£", "¢", "₹", "₦"}, 1}, ["៛"] = {{"$", "€", "¥", "£", "¢", "₹", "₦"}, 1}, ["€"] = {{"/=", "/-", "₦", "₹", "¢", "£", "¥", "$"}, 8}, } arabic_symbol = { {"1", "2", "3", "+", "-", "@", "$", {"(", 0, ")"}, {")", 0, "("}}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "؟"}, {"0", "."}, } arabic_symbol_2 = { {{"[", 0, "]"}, {"]", 0, "["}, {"{", 0, "}"}, {"}", 0, "{"}, {"<", 0, ">"}, {">", 0, "<"}, "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "€", "¥", "£", "¢"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } hausa_symbol = { {"1", "2", "3", "+", "-", "@", "₦", "(", ")"}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "?"}, {"0", "."}, } hausa_symbol_2 = { {"[", "]", "{", "}", "<", ">", "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "€", "¥", "£", "¢"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } hausa_symbol_alt_table = { ["-"] = "_", ["@"] = "&", ["₦"] = "$", ["("] = "<", [")"] = ">", ["("] = "<", [")"] = ">", ["'"] = "‹", ["\""] = "«", ["“"] = "‘", ["”"] = "’", [":"] = ";", [":"] = ";", ["#"] = "%", [";"] = "%", [";"] = "%", ["؛"] = "%", ["!"] = "¡", ["¡"] = "!", ["?"] = "¿", ["¿"] = "?", ["؟"] = "?", ["π"] = "Π", ["^"] = "Δ", ["|"] = "¦", ["•"] = "°", ["¤"] = "Φ", ["₪"] = "€", ["₹"] = "$", ["\\"] = "§", } hausa_symbol_expand_table = { ["1"] = {{"¹", "½", "⅓", "¼", "⅛"}, 1}, ["2"] = {{"²", "⅔"}, 1}, ["3"] = {{"³", "¾", "⅜"}, 1}, ["5"] = {{"⅝"}, 1}, ["7"] = {{"⅞"}, 1}, ["+"] = {{"±"}, 1}, ["-"] = {{"—", "_", "–"}, 2}, ["*"] = {{"×"}, 1}, ["/"] = {{"÷"}, 1}, ["="] = {{"≈", "≠", "≥", "≤"}, 2}, ["@"] = {{"&"}, 1}, ["₦"] = {{"/=", "/-", "₹", "¢", "£", "¥", "€", "$"}, 8}, ["₪"] = {{"$", "¥", "£", "€", "¢", "₹"}, 3}, ["("] = {{"<", "[", "{", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, [")"] = {{">", "]", "}", {"()", 1}, {"<>", 1}, {"[]", 1}, {"{}", 1}}, 1}, ["("] = {{"<", "[", "{", "《"}, 1}, [")"] = {{">", "]", "}", "》"}, 1}, ["'"] = {{"‹", "›", "‘", "’", "‚", "‛", {"‘’", 1}}, 1}, ["\""] = {{"“", "„", "”", "«", "»", {"“”", 1}}, 4}, ["“"] = {{"‘", "「", "『"}, 1}, ["”"] = {{"’", "」", "』"}, 1}, [":"] = {{";"}, 1}, [":"] = {{";"}, 1}, ["#"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, [";"] = {{"%", "‰"}, 1}, ["؛"] = {{"%", "‰"}, 1}, ["!"] = {{"¡"}, 1}, ["¡"] = {{"!", {"¡!", 1}}, 1}, ["?"] = {{"¿"}, 1}, ["¿"] = {{"?", {"¿?", 1}}, 1}, ["؟"] = {{"?"}, 1}, ["π"] = {{"Π"}, 1}, ["^"] = {{"Δ"}, 1}, ["|"] = {{"¦"}, 1}, ["•"] = {{"°"}, 1}, ["¤"] = {{"Φ"}, 1}, ["₹"] = {{"¥", "£", "$", "€", "¢"}, 3}, ["\\"] = {{"§"}, 1} } keyboard_symbol_table = { [si.currency_type.USD] = {normal_symbol, normal_symbol_alt_table, normal_symbol_expand_table}, [si.currency_type.EUR] = {eur_symbol, normal_symbol_alt_table, normal_symbol_expand_table}, [si.currency_type.GRD] = {gre_symbol, gre_symbol_alt_table, gre_symbol_expand_table}, [si.currency_type.RS_URDU] = {urdu_symbol, rtl_symbol_alt_table, rtl_symbol_expand_table}, [si.currency_type.NAIRA] = {yoruba_symbol, yoruba_symbol_alt_table, yoruba_symbol_expand_table}, [si.currency_type.LIRA] = {turkish_symbol, normal_symbol_alt_table, normal_symbol_expand_table}, [si.currency_type.TAMIL] = {tamil_symbol, normal_symbol_alt_table, tamil_symbol_expand_table}, [si.currency_type.RUR] = {russian_symbol, normal_symbol_alt_table, normal_symbol_expand_table}, [si.currency_type.KHMER] = {khmer_symbol, normal_symbol_alt_table, normal_symbol_expand_table}, [si.currency_type.HAUSA] = {hausa_symbol, hausa_symbol_alt_table, hausa_symbol_expand_table}, [si.currency_type.HEBREW] = {he_symbol, rtl_symbol_alt_table, he_symbol_expand_table}, [si.currency_type.HINDI] = {hindi_symbol, hindi_symbol_alt_table, hindi_symbol_expand_table}, [si.currency_type.HINDI_SP] = {hindi_symbol_special, hindi_symbol_alt_table, hindi_symbol_expand_table}, [si.currency_type.ARABIC] = {arabic_symbol, rtl_symbol_alt_table, rtl_symbol_expand_table}, [si.currency_type.TELUGU] = {hindi_symbol, hindi_symbol_alt_table, telugu_symbol_expand_table}, } keyboard_symbol_table_2 = { [si.currency_type.USD] = {normal_symbol_2, normal_symbol_alt_table, normal_symbol_expand_table}, [si.currency_type.EUR] = {eur_symbol_2, normal_symbol_alt_table, normal_symbol_expand_table}, [si.currency_type.GRD] = {gre_symbol_2, gre_symbol_alt_table, gre_symbol_expand_table}, [si.currency_type.RS_URDU] = {urdu_symbol_2, rtl_symbol_alt_table, rtl_symbol_expand_table}, [si.currency_type.NAIRA] = {yoruba_symbol_2, yoruba_symbol_alt_table, yoruba_symbol_expand_table}, [si.currency_type.LIRA] = {turkish_symbol_2, normal_symbol_alt_table, normal_symbol_expand_table}, [si.currency_type.TAMIL] = {tamil_symbol_2, normal_symbol_alt_table, tamil_symbol_expand_table}, [si.currency_type.RUR] = {russian_symbol_2, normal_symbol_alt_table, normal_symbol_expand_table}, [si.currency_type.KHMER] = {khmer_symbol_2, normal_symbol_alt_table, normal_symbol_expand_table}, [si.currency_type.HAUSA] = {hausa_symbol_2, hausa_symbol_alt_table, hausa_symbol_expand_table}, [si.currency_type.HEBREW] = {he_symbol_2, rtl_symbol_alt_table, he_symbol_expand_table}, [si.currency_type.HINDI] = {hindi_symbol_2, hindi_symbol_alt_table, hindi_symbol_expand_table}, [si.currency_type.ARABIC] = {arabic_symbol_2, rtl_symbol_alt_table, rtl_symbol_expand_table}, } local function symbol_sk_on_click(sk, surface) if sk.input_content == "'" or sk.input_content == "-" then si.input_precise(sk.input_content, "", "", false) elseif emo.is_emoji(sk.input_content) then local emoji_input_content = emo.get_emoji_input_content(sk.input_content) si.input_string(emoji_input_content, sk.input_emotion) else si.input_string(sk.input_content, sk.input_emotion) end if sk.cursor_offset ~= nil and sk.cursor_offset ~= 0 then local i for i = 1, sk.cursor_offset do si.input_keycode(_G.config.L_KEYCODE_EDIT_LEFT) end si.back_to_previous() end surface.input_count = surface.input_count + 1 end local function symbol_sk_on_slide_down(sk, surface) if sk.alt_input == "'" or sk.alt_input == "-" then si.input_precise(sk.alt_input, "", "", false) else si.input_string(sk.alt_input, false) end if sk.alt_cursor_offset ~= nil and sk.alt_cursor_offset ~= 0 then local i for i = 1, sk.alt_cursor_offset do si.input_keycode(_G.config.L_KEYCODE_EDIT_LEFT) end si.back_to_previous() end surface.input_count = surface.input_count + 1 end local function symbol_sk_on_long_press_once(sk, surface, symbol_expand_table) if sk.main_title then local expand_symbol = symbol_expand_table[sk.main_title][1] local default_index = symbol_expand_table[sk.main_title][2] local new_symbol = {} for i = 1, #expand_symbol do new_symbol[i] = expand_symbol[i] end --new_symbol[#expand_symbol + 1] = {sk.main_title, sk.cursor_offset} show_expand_symbols(new_symbol, default_index, sk.longpress_order, surface) end end function show_expand_symbols(symbols, default_index, longpress_order, surface) local expand_sur = si.new_surface("expand.sur") expand_sur.surface_type = si.surface_type.POPUP_EXPAND local index = 1 local default_key = default_index for i = 1, _G.table.getn(symbols) do expand_sur.softkeys[index] = new_expandkey(symbols[i], surface) index = index + 1 end if longpress_order == false then default_key = default_index else default_key = index - default_index --reverse order local half_count = (index - 1) / 2 for i = 1, half_count do local softkey = expand_sur.softkeys[i] expand_sur.softkeys[i] = expand_sur.softkeys[index - i] expand_sur.softkeys[index - i] = softkey end end si.popup_surface(expand_sur) si.set_default_key(default_key) end function new_expandkey(symbol, symbol_sur) local key = si.new_softkey() if _G.type(symbol) == "table" then key.main_title = symbol[1] key.cursor_offset = symbol[2] if symbol[3] == nil then key.main_input = key.main_title else key.main_input = symbol[3] end else key.main_title = symbol key.cursor_offset = 0 key.main_input = key.main_title end key.on_click = function(sk) if sk.main_input == "'" or sk.main_input == "-" then si.input_precise(sk.main_input, "", "", false) else si.input_string(sk.main_input, false) end if sk.cursor_offset ~= nil and sk.cursor_offset ~= 0 then local i for i = 1, sk.cursor_offset do si.input_keycode(_G.config.L_KEYCODE_EDIT_LEFT) end si.back_to_previous() end symbol_sur.input_count = symbol_sur.input_count + 1 end return key end function load_symbol(surface, symbols, symbol_alt_table, symbol_expand_table, enable_slide_symbol) for i, row in _G.pairs(symbols) do for j, title in _G.pairs(row) do local key = si.new_softkey() if _G.type(title) == "table" then key.main_title = title[1] key.cursor_offset = title[2] if title[3] == nil then key.input_content = title[1] else key.input_content = title[3] end if title["emotion"] == nil then key.input_emotion = false else key.input_emotion = title["emotion"] end else key.main_title = title key.input_content = title key.cursor_offset = 0 key.input_emotion = false end key.case_sensitive = false surface.softkeys["sk_" .. i .. "_" .. j] = key key.on_click = function(sk) if si.get_setting_value(si.settings.SLIDE_INPUT_TIP_STATE, si.settings_type.SETTING_INT) == si.condition_state.INIT then si.set_setting_value(si.settings.SLIDE_INPUT_TIP_STATE, si.condition_state.READY, si.settings_type.SETTING_INT) end symbol_sk_on_click(sk, surface) end if enable_slide_symbol then if _G.type(symbol_alt_table[key.main_title]) == "table" then key.alt_title = symbol_alt_table[key.main_title][1] key.alt_cursor_offset = symbol_alt_table[key.main_title][2] if symbol_alt_table[key.main_title][3] == nil then key.alt_input = key.alt_title else key.alt_input = symbol_alt_table[key.main_title][3] end else key.alt_title = symbol_alt_table[key.main_title] key.alt_cursor_offset = 0 key.alt_input = key.alt_title end if key.alt_title then key.on_slide_down = function(sk) symbol_sk_on_slide_down(sk, surface) end end if symbol_expand_table[key.main_title] ~= nil then if j == #symbols[i] then key.longpress_order = true elseif j >= #symbols[i] - 1 and #symbol_expand_table[key.main_title][1] >= 3 then key.longpress_order = true else key.longpress_order = false end key.on_long_press_once = function(sk) symbol_sk_on_long_press_once(sk, surface, symbol_expand_table) end else key.longpress_order = false key.on_long_press_once = nil end end end end end function load_symbol_smiley(surface, row) for j, title in _G.pairs(row) do local key = si.new_softkey() key.main_title = title key.input_content = title key.cursor_offset = 0 key.input_emotion = false key.case_sensitive = false surface.softkeys["sk_sub_1_" .. j] = key key.on_click = function(sk) if si.get_setting_value(si.settings.SLIDE_INPUT_TIP_STATE, si.settings_type.SETTING_INT) == si.condition_state.INIT then si.set_setting_value(si.settings.SLIDE_INPUT_TIP_STATE, si.condition_state.READY, si.settings_type.SETTING_INT) end symbol_sk_on_click(sk, surface) end end end function setup_symbol(s, symbols, symbol_alt_table, symbol_expand_table, page_number, next_page, prev_page, enable_slide_symbol) s.input_count = 0 load_symbol(s, symbols, symbol_alt_table, symbol_expand_table, enable_slide_symbol) load_symbol_smiley(s, normal_symbol_smiley_table) s.on_load = function (keyboard) s.explicit_inline = keyboard.explicit_inline s.inline_strategy = keyboard.inline_strategy s.resolve_mode = keyboard.resolve_mode s.touch_to_save = keyboard.touch_to_save s.softkeys["sk_mo"] = keyboard.softkeys["sk_mo"] s.softkeys["sk_edit"] = keyboard.softkeys["sk_edit"] s.softkeys["sk_clipboard"] = keyboard.softkeys["sk_clipboard"] s.softkeys["sk_url"] = keyboard.softkeys["sk_url"] s.softkeys["sk_voice"] = keyboard.softkeys["sk_voice"] s.softkeys["sk_hw_mask"] = keyboard.softkeys["sk_hw_mask"] setup_ent_key(keyboard.softkeys["sk_ent"]) s.softkeys["sk_bk"] = keyboard.softkeys["sk_bk"] s.softkeys["sk_quick_switcher"] = keyboard.softkeys["sk_quick_switcher"] s.softkeys["sk_clear_candidate"] = keyboard.softkeys["sk_clear_candidate"] setup_space_key(keyboard.softkeys["sk_sp"]) if s.softkeys["sk_back"] == nil then s.softkeys["sk_back"] = ck.sk_back_to_previous end s.softkeys["sk_smile"] = ck.sk_smile s.softkeys["sk_chs_eng"] = ck.sk_chs_eng s.softkeys["sk_locale"] = ck.sk_locale end local sk_next = si.new_softkey() sk_next.main_title = page_number sk_next.on_click = function() local next_number = _G.string.char((_G.string.byte(page_number, 1) - 48) % (_G.string.byte(page_number, 3) - 48) + 49) si.set_accessibility_string("@string/accessibility_next_page&" .. next_number) si.change_surface_by_id(next_page) end s.softkeys["NextPage"] = sk_next function setup_ent_key(original_key) local sk_ent = si.new_softkey() if original_key.on_click then sk_ent.on_click = function() original_key.on_click() if si.input_type() ~= si.editor.NUMBER then if s.input_count > 0 then si.back_to_previous() end end end end if original_key.on_long_press_multi then sk_ent.on_long_press_multi = function() original_key.on_long_press_multi() end end s.softkeys["sk_ent"] = sk_ent end function setup_space_key(original_key) local sk_sp = si.new_softkey() if original_key.on_click then sk_sp.on_click = function() original_key.on_click() end end if original_key.on_long_press_multi then sk_sp.on_long_press_multi = function() original_key.on_long_press_multi() end end if original_key.on_double_click then sk_sp.on_double_click = function() original_key.on_double_click() end end if original_key.on_long_press_once then sk_sp.on_long_press_once = function() original_key.on_long_press_once() end else sk_sp.on_long_press_once = function() ck.show_voice_input_view(nil) end end s.softkeys["sk_sp"] = sk_sp end local sk_comma = si.new_softkey() sk_comma.main_title = "," sk_comma.on_click = function(sk) si.input_precise(sk.main_title, "", "", false) s.input_count = s.input_count + 1 end s.softkeys["Comma"] = sk_comma local sk_dot = si.new_softkey() sk_dot.main_title = "." sk_dot.on_click = function(sk) si.input_precise(sk.main_title, "", "", false) s.input_count = s.input_count + 1 end s.softkeys["Dot"] = sk_dot s.on_slip_left = function() si.change_surface_by_id(next_page) end s.on_slip_right = function() si.change_surface_by_id(prev_page) end end function reload_symbol(surface, symbols, symbol_alt_table, symbol_expand_table) load_symbol(surface, symbols, symbol_alt_table, symbol_expand_table) si.sync_display() end PK n5:QOTT5assets/khmer.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("KM", "Khmer") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.khmerv5 .. "khmer_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.khmerv5 .. "khmer_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.KHMER, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.KHMER, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.khmerv5 .. "khmer_traits.trt.png" lng.statistic_alias = "khmer" lng.categories[si.language.category.FASTSWITCH] = "khmer" lng.categories[si.language.category.SUBTYPE] = "khmer" lng.categories[si.language.category.MIXINPUT] = "khmer" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "khmer" lng.categories[si.language.category.LAYOUT] = "khmer" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.khmerv5 .. "khmer.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QOel l !5assets/khmer_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.km_full_main1 local input_type = si.input_type() template = "km_soft_full_international" alt_inputs = kb.km_alt_full1 shift_inputs = nil local s = sf.new_full_keyboard( "khmer_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.khmerv5 .. "khmer_soft_qwerty2.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local key = s.softkeys["sk_" .. i .. "_" .. j] key.on_click = function(sk, key_name) for c in si.u16_iter(key.main_input) do si.input_precise(si.u16char(c), key_name, key.alt_input, si.is_shift_pressed()) end end end end local sk_1_7 = s.softkeys["sk_1_7"] sk_1_7.on_long_press_once = function() ck.show_expand_symbols({'ូ'}, 1) end local sk_2_9 = s.softkeys["sk_2_9"] sk_2_9.on_long_press_once = function() ck.show_expand_symbols({'ឡ'}, 1) end local sk_2_10 = s.softkeys["sk_2_10"] sk_2_10.on_long_press_once = function() ck.show_expand_symbols({'៉'}, 1) end local sk_3_2 = s.softkeys["sk_3_2"] sk_3_2.on_long_press_once = function() ck.show_expand_symbols({'ឃ'}, 1) end local sk_3_5 = s.softkeys["sk_3_5"] sk_3_5.on_long_press_once = function() ck.show_expand_symbols({'ព'}, 1) end local sk_3_8 = s.softkeys["sk_3_8"] sk_3_8.on_long_press_once = function() ck.show_expand_symbols({'ុះ'}, 1) end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_kh s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q!hCb&&!5assets/khmer_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.km_full_main2 local input_type = si.input_type() local is_num_row_on = si.is_num_line_enabled() template = "km_soft_full_international" if is_num_row_on then alt_inputs = kb.km_alt_full_num_row_on else alt_inputs = kb.km_alt_full2 end shift_inputs = nil local s = sf.new_full_keyboard( "khmer_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.khmerv5 .. "khmer_soft_qwerty1.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local key = s.softkeys["sk_" .. i .. "_" .. j] key.on_click = function(sk, key_name) for c in si.u16_iter(key.main_input) do si.input_precise(si.u16char(c), key_name, key.alt_input, si.is_shift_pressed()) end end end end local sk_1_11 = s.softkeys["sk_1_11"] sk_1_11.on_long_press_once = function() show_expand_symbols_khmer({'()'}, 1) end sk_1_11.on_slide_down = function() si.input_string(sk_1_11.alt_title, false) si.input_keycode(_G.config.L_KEYCODE_EDIT_LEFT); end local sk_2_1 = s.softkeys["sk_2_1"] sk_2_1.on_long_press_once = function() ck.show_expand_symbols({'១'}, 1) end function show_expand_symbols_khmer(symbols, default_index) local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local key for i = 1, _G.table.getn(symbols) do key = si.new_softkey() if _G.type(symbols[i]) == "table" then key.main_title = symbols[i][1] key.main_input = symbols[i][1] key.input_emotion = symbols[i][2] else key.main_title = symbols[i] key.main_input = symbols[i] key.input_emotion = false end key.on_click = function(sk) si.input_string(sk.main_input, sk.input_emotion) si.input_keycode(_G.config.L_KEYCODE_EDIT_LEFT); end sur.softkeys[i] = key end si.popup_surface(sur) si.set_default_key(default_index) end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_kh s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qs5assets/khmer_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x1780 local z_code = 0x17ff local A_code = 0x1780 local Z_code = 0x17ff local special_lower_list = { "ឝ", "៑", "៊", "៝", "៍", "៌", "៎", "្", "ឩ", "ឧ", "ឳ", "ឱ", "ឨ", "ឪ", "ឞ", "ឭ", "ឯ", "ឰ", "ឦ", "ឮ", "ឫ", } local special_upper_list = { "ឝ", "៑", "៊", "៝", "៍", "៌", "៎", "្", "ឩ", "ឧ", "ឳ", "ឱ", "ឨ", "ឪ", "ឞ", "ឭ", "ឯ", "ឰ", "ឦ", "ឮ", "ឫ", } local accent_letter_dictionary = { [si.u16code("ល", 1)] = "ឝ", [si.u16code("់", 1)] = "៑៊៝៍៌", [si.u16code("ខ", 1)] = "ឩឧឳឱឨឪ", [si.u16code("ប", 1)] = "ឞ", [si.u16code("ឥ", 1)] = "ឭឯឰឦឮ", [si.u16code("ឬ", 1)] = "ឫ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_khmer_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_khmer_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_khmer_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_khmer_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Qmq((5assets/kinyarwanda.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("RW", "Kinyarwanda") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.kinyarwandav5 .. "kinyarwanda_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.kinyarwandav5 .. "kinyarwanda_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.kinyarwandav5 .. "kinyarwanda_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.kinyarwandav5 .. "kinyarwanda_traits.trt.png" lng.statistic_alias = "kinyarwanda" lng.categories[si.language.category.FASTSWITCH] = "kinyarwanda" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "kinyarwanda" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "kinyarwanda" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q6 &5assets/kinyarwanda_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "eng_soft_azerty_international_without_dict" local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then alt_inputs = kb.eng_full_azerty_alt_international else alt_inputs = kb.eng_full_azerty_alt_curve_international shift_inputs = kb.eng_full_azerty_shift_international end local s = sf.new_full_keyboard( "englishgb_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q$ &5assets/kinyarwanda_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "eng_soft_qwerty_international_without_dict" local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then alt_inputs = kb.eng_full_qwerty_alt_international else alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "englishgb_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q &5assets/kinyarwanda_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "eng_soft_qwerty_international_without_dict" local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then alt_inputs = kb.eng_full_qwerty_alt_international else alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "englishgb_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qۿ~ee!5assets/kinyarwanda_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local traits = si.new_language_traits() local ct = common_traits traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "ā", "ą", "æ", "ç", "č", "ć", "è", "é", "ê", "ë", "ē", "ė", "ę", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "ù", "û", "ü", "ú", "ū", "ñ", "ń", "ß", "ś", "š", "ÿ", "ÿ", "ž", "ź", "ż", "ĺ", "ľ", "ł", "ď", "đ", "ŕ", "ř", "ť", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Ā", "Ą", "Æ", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ē", "Ė", "Ę", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "Ù", "Û", "Ü", "Ú", "Ū", "Ñ", "Ń", "ß", "Ś", "Š", "Ÿ", "Ÿ", "Ž", "Ź", "Ż", "Ĺ", "Ľ", "Ł", "Ď", "Đ", "Ŕ", "Ř", "Ť", } local accent_letter_dictionary = { [string.byte("a")] = "äàâáãåāąæ", [string.byte("c")] = "çčć", [string.byte("e")] = "ëèéêēėę", [string.byte("i")] = "ïîíìīį", [string.byte("o")] = "öôóòõōœø", [string.byte("u")] = "üùûúū", [string.byte("n")] = "ñń", [string.byte("s")] = "ßśš", [string.byte("y")] = "ÿ", [string.byte("z")] = "žźż", [string.byte("l")] = "ĺľł", [string.byte("d")] = "ďđ", [string.byte("r")] = "ŕř", [string.byte("t")] = "ť", [string.byte("A")] = "ÄÀÂÁÃÅĀĄÆ", [string.byte("C")] = "ÇČĆ", [string.byte("E")] = "ËÈÉÊĒĖĘ", [string.byte("I")] = "ÏÎÍÌĪĮ", [string.byte("O")] = "ÖÔÓÒÕŌŒØ", [string.byte("U")] = "ÜÙÛÚŪ", [string.byte("N")] = "ÑŃ", [string.byte("S")] = "ߌŠ", [string.byte("Y")] = "Ÿ", [string.byte("Z")] = "ŽŹŻ", [string.byte("L")] = "ĹĽŁ", [string.byte("D")] = "ĎĐ", [string.byte("R")] = "ŔŘ", [string.byte("T")] = "Ť", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Qh'5assets/kirghiz.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("KG", "kirghiz") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.kirghizv5 .. "kirghiz_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.kirghizv5 .. "kirghiz_traits.trt.png" lng.statistic_alias = "kirghiz" lng.categories[si.language.category.FASTSWITCH] = "kirghiz" lng.categories[si.language.category.SUBTYPE] = "kirghiz" lng.categories[si.language.category.MIXINPUT] = "kirghiz" lng.categories[si.language.category.CELLDICT] = "kirghiz" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "kirghiz" lng.categories[si.language.category.LAYOUT] = "kirghiz" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "kg" lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qo "5assets/kirghiz_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local ct = si.context local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "kirghiz_soft_full_international" local alt_inputs local shift_inputs local main_inputs = kb.russian_full_main if not is_curve_mode and not is_wave_mode then alt_inputs = kb.russian_full_alt else alt_inputs = kb.russian_full_alt_curve shift_inputs = kb.russian_full_shift_curve end local s = sf.new_full_keyboard( "kirghiz_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) local input_type = si.input_type() s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = ct.DATE + ct.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q5assets/kirghiz_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = si.u16code("а", 1) local r_code = si.u16code("я", 1) local A_code = si.u16code("А", 1) local R_code = si.u16code("Я", 1) local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } local special_lower_list = { "ё", "Ъ", } local special_upper_list = { "Ё", "Ъ", } local accent_dictionary = { [si.u16code("е", 1)] = "ё", [si.u16code("ь", 1)] = "ъ", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= R_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= r_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if char_code >= a_code and char_code <= r_code then return true elseif char_code >= A_code and char_code <= R_code then return true elseif traits.is_special_lower_case(c) then return true elseif traits.is_special_upper_case(c) then return true else return false end end function traits.is_userword_character(c) return ct.is_cyrillic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= r_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= R_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= r_code then return true elseif c >= A_code and c <= R_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_begin_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Q2yQQ5assets/korean.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("KR", "Korean") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.koreanv5 .. "korean_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.koreanv5 .. "korean_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.koreanv5 .. "korean_soft_phonepad_chunjiin.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, surface_layout = si.surface_layout.OTHER, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "chs_soft_abc.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, surface_layout = si.surface_layout.QW, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.koreanv5 .. "korean_traits.trt.png" lng.statistic_alias = "korean" lng.categories[si.language.category.FASTSWITCH] = "korean" lng.categories[si.language.category.SUBTYPE] = "korean" lng.categories[si.language.category.MIXINPUT] = "korean" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "korean" lng.categories[si.language.category.LAYOUT] = "korean" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.koreanv5 .. "korean.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.koreanv5 .. "korean_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.koreanv5 .. "korean_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q3 5assets/korean_qwerty1_layout.pngUT n_n_n_ WГWГWГㅂ 0 0 48 81 ㅈ 48 0 96 81 ㄷ 96 0 144 81 ㄱ 144 0 192 81 ㅅ 192 0 240 81 ㅛ 240 0 288 81 ㅕ 288 0 336 81 ㅑ 336 0 384 81 ㅐ 384 0 432 81 ㅔ 432 0 480 81 ㅁ 24 81 72 162 ㄴ 72 81 120 162 ㅇ 120 81 168 162 ㄹ 168 81 216 162 ㅎ 216 81 264 162 ㅗ 264 81 312 162 ㅓ 312 81 360 162 ㅏ 360 81 408 162 ㅣ 408 81 456 162 ㅋ 72 162 120 243 ㅌ 120 162 168 243 ㅊ 168 162 216 243 ㅍ 216 162 264 243 ㅠ 264 162 312 243 ㅜ 312 162 360 243 ㅡ 360 162 408 243 PK n5:QJ 5assets/korean_qwerty2_layout.pngUT n_n_n_ WГWГWГㅃ 0 0 48 81 ㅉ 48 0 96 81 ㄸ 96 0 144 81 ㄲ 144 0 192 81 ㅆ 192 0 240 81 ㅛ 240 0 288 81 ㅕ 288 0 336 81 ㅑ 336 0 384 81 ㅒ 384 0 432 81 ㅖ 432 0 480 81 ㅁ 24 81 72 162 ㄴ 72 81 120 162 ㅇ 120 81 168 162 ㄹ 168 81 216 162 ㅎ 216 81 264 162 ㅗ 264 81 312 162 ㅓ 312 81 360 162 ㅏ 360 81 408 162 ㅣ 408 81 456 162 ㅋ 72 162 120 243 ㅌ 120 162 168 243 ㅊ 168 162 216 243 ㅍ 216 162 264 243 ㅠ 264 162 312 243 ㅜ 312 162 360 243 ㅡ 360 162 408 243 PK n5:Qso.(.(,5assets/korean_soft_phonepad_chunjiin.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local pi = si.pending_input local ca = si.candidates local main_inputs = { {"ㅣ", "ㆍ", "ㅡ", }, {"ㄱㅋ", "ㄴㄹ", "ㄷㅌ", "",}, {"ㅂㅍ", "ㅅㅎ", "ㅈㅊ",}, {"ㅇㅁ", }, } local alt_inputs = { {"1", "2", "3",}, {"4", "5", "6", "",}, {"7", "8", "9",}, {"0",}, } local expand_long_press_inputs = { {"", "", "",}, {"ㄲ", "", "ㄸ", "",}, {"ㅃ", "ㅆ", "ㅉ",}, {"",}, } local s = sf.new_phonepad_keyboard( "kr_soft_phonepad_chunjiin", main_inputs, alt_inputs, si.TITLE_CASE.CHANGE, 7) s.after_load = function() local ts = si.tri_status ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) if si.editor.PASSWORD ~= si.input_type() then si.set_setting_value(si.settings.WORD_PREDICTION, true, si.settings_type.SETTING_BOOL) else si.set_setting_value(si.settings.WORD_PREDICTION, false, si.settings_type.SETTING_BOOL) end si.timer_id = -1 end s.template = "kr_soft_phonepad_chunjiin" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.multi_input_type = si.input_mode.MULTITAP s.multitap_timer = false s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.ocean_precise_input = true s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end s.extra_elements = { "left_scroll", "typing_speed_bar", } for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_slide_left = nil sk.on_slide_right = nil sk.on_slide_up = nil end end function close_timer() if si.timer_id ~= nil then si.close_timer(si.timer_id) end si.timer_id = -1 end function start_timer() si.timer_id = si.start_timer() end function convert_input_jungseong_i(last_input, def_output) local output = def_output local n, str = si.get_text_before_cursor(1) if n == 1 then local last_input_code = 0 local last_input = pi.get_last_input() if last_input ~= nil then last_input_code = si.u16code(last_input, 1) if last_input_code == nil then last_input_code = 0 end end local arr = si.utf8_to_utf16(str) if (arr[1] == 0x318d) or (last_input_code == 0x318d) then pi.delete_character() output = "ㅓ" elseif (arr[1] == 0xff1a) or (last_input_code == 0xff1a) then pi.delete_character() output = "ㅕ" elseif (arr[1] == 0x3153) or (last_input_code == 0x3153) then pi.delete_character() output = "ㅔ" elseif (arr[1] == 0x3155) or (last_input_code == 0x3155) then pi.delete_character() output = "ㅖ" elseif (arr[1] == 0x314f) or (last_input_code == 0x314f) then pi.delete_character() output = "ㅐ" elseif (arr[1] == 0x3151) or (last_input_code == 0x3151) then pi.delete_character() output = "ㅒ" elseif (arr[1] == 0x3160) or (last_input_code == 0x3160) then pi.delete_character() output = "ㅝ" end end return output end function convert_input_jungseong_araea(last_input, def_output) local output = def_output local n, str = si.get_text_before_cursor(1) if n == 1 then local arr = si.utf8_to_utf16(str) local last_input_code = 0 local last_input = pi.get_last_input() if last_input ~= nil then last_input_code = si.u16code(last_input, 1) if last_input_code == nil then last_input_code = 0 end end if (arr[1] == 0x318d) or (last_input_code == 0x318d) then pi.delete_character() output = ":" elseif (arr[1] == 0xff1a) or (last_input_code == 0xff1a) then pi.delete_character() output = "ㆍ" elseif (arr[1] == 0x3161) or (last_input_code == 0x3161) or (last_input_code == 0x3160) then pi.delete_character() output = "ㅜ" elseif (arr[1] == 0x315c) or (last_input_code == 0x315c) then pi.delete_character() output = "ㅠ" elseif (arr[1] == 0x3163) or (last_input_code == 0x3163) or (0x3151 == last_input_code) then pi.delete_character() output = "ㅏ" elseif (arr[1] == 0x314F) or (last_input_code == 0x314F) then pi.delete_character() output = "ㅑ" end end return output end function convert_input_jungseong_eu(last_input, def_output) local output = def_output local n, str = si.get_text_before_cursor(1) if n == 1 then local arr = si.utf8_to_utf16(str) local last_input_code = 0 local last_input = pi.get_last_input() if last_input ~= nil then last_input_code = si.u16code(last_input, 1) if last_input_code == nil then last_input_code = 0 end end if (arr[1] == 0x318d) or (last_input_code == 0x318d) then pi.delete_character() output = "ㅗ" elseif (arr[1] == 0xff1a) or (last_input_code == 0xff1a) then pi.delete_character() output = "ㅛ" end end return output end function jungseong_i_on_click(sk) local last_input = pi.get_last_input() if last_input == nil then si.input_precise(sk.main_input, "", sk.alt_input, si.is_shift_pressed()) else local output = convert_input_jungseong_i(last_input, sk.main_input) local output_code = si.u16code(output, 1) if output_code == 0x315d then phonepad_on_click("ㅜ", sk.alt_input) phonepad_on_click("ㅓ", sk.alt_input) elseif output_code == 0x3163 then si.input_precise(output, "", sk.alt_input, si.is_shift_pressed()) else phonepad_on_click(output, sk.alt_input) end end end function jungseong_eu_on_click(sk) local last_input = pi.get_last_input() if last_input == nil then si.input_precise(sk.main_input, "", sk.alt_input, si.is_shift_pressed()) else local output = convert_input_jungseong_eu(last_input, sk.main_input) if si.u16code(output, 1) == 0x3161 then si.input_precise(output, "", sk.alt_input, si.is_shift_pressed()) else phonepad_on_click(output, sk.alt_input) end end end function jungseong_araea_on_click(sk) local last_input = pi.get_last_input() if last_input == nil then si.input_precise(sk.main_input, "", sk.alt_input, si.is_shift_pressed()) else local output = convert_input_jungseong_araea(last_input, sk.main_input) phonepad_on_click(output, sk.alt_input) end end function on_long_press_chunjiin_once(sk) local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local default_index = 1 local main_input_code = si.u16code(sk.main_input, 1) if main_input_code == 0x318d then sur.softkeys[1] = si.new_expandkey(si.u16code(sk.alt_input, 1)) sur.softkeys[2] = si.new_expandkey(main_input_code) sur.softkeys[2].on_click = jungseong_araea_on_click elseif main_input_code == 0x3161 then default_index = 2 sur.softkeys[1] = si.new_expandkey(main_input_code) sur.softkeys[1].on_click = jungseong_eu_on_click sur.softkeys[2] = si.new_expandkey(si.u16code(sk.alt_input, 1)) elseif main_input_code == 0x3163 then sur.softkeys[1] = si.new_expandkey(si.u16code(sk.alt_input, 1)) sur.softkeys[2] = si.new_expandkey(main_input_code) sur.softkeys[2].on_click = jungseong_i_on_click end si.popup_surface(sur) si.set_default_key(default_index) end local sk_1_1 = s.softkeys["sk_1_1"] sk_1_1.on_click = jungseong_i_on_click sk_1_1.on_long_press_once = on_long_press_chunjiin_once local sk_1_2 = s.softkeys["sk_1_2"] sk_1_2.on_click = jungseong_araea_on_click sk_1_2.on_long_press_once = on_long_press_chunjiin_once local sk_1_3 = s.softkeys["sk_1_3"] sk_1_3.on_click = jungseong_eu_on_click sk_1_3.on_long_press_once = on_long_press_chunjiin_once function phonepad_on_click(main_input, alt_input) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end if si.get_string_length(main_input) < 2 then si.input_precise(main_input, "", alt_input, si.is_shift_pressed()) else si.input_multi(main_input, alt_input, si.is_shift_pressed()) end end for i = 2, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = function() phonepad_on_click(sk.main_input .. expand_long_press_inputs[i][j] , sk.alt_input) end end end s.softkeys["sk_emoji"] = ck.sk_smiley_open s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_num"] = ck.sk_num_right s.softkeys["sk_abc"] = ck.sk_abc_kr s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qnoi i "5assets/korean_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.kr_full_main1 local is_curve_mode = si.is_curve_layout() local input_type = si.input_type() if is_curve_mode then alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international template = "kr_soft_qwerty_curve_international" else alt_inputs = kb.eng_full_qwerty_alt_international template = "kr_soft_qwerty_international" end local s = sf.new_full_keyboard( "korean_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.koreanv5 .. "korean_soft_qwerty2.sur.png" s.statistic_alias = "qwerty1" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = false s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.PRECISE_INPUT } s.additional_candidate = nil s.ocean_precise_input = true s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end s.precise_input_type = si.input_mode.PREDICT + si.input_mode.PRECISE s.after_load = function() local ts = si.tri_status ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) if si.editor.PASSWORD ~= si.input_type() then si.set_setting_value(si.settings.WORD_PREDICTION, true, si.settings_type.SETTING_BOOL) else si.set_setting_value(si.settings.WORD_PREDICTION, false, si.settings_type.SETTING_BOOL) end end if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qtw-~i i "5assets/korean_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.kr_full_main2 local is_curve_mode = si.is_curve_layout() local input_type = si.input_type() if is_curve_mode then alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international template = "kr_soft_qwerty_curve_international" else alt_inputs = kb.eng_full_qwerty_alt_international template = "kr_soft_qwerty_international" end local s = sf.new_full_keyboard( "korean_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.koreanv5 .. "korean_soft_qwerty1.sur.png" s.statistic_alias = "qwerty2" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = false s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.PRECISE_INPUT } s.additional_candidate = nil s.ocean_precise_input = true s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end s.precise_input_type = si.input_mode.PREDICT + si.input_mode.PRECISE s.after_load = function() local ts = si.tri_status ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) if si.editor.PASSWORD ~= si.input_type() then si.set_setting_value(si.settings.WORD_PREDICTION, true, si.settings_type.SETTING_BOOL) else si.set_setting_value(si.settings.WORD_PREDICTION, false, si.settings_type.SETTING_BOOL) end end if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q]5assets/korean_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x3131 local z_code = 0x3163 local A_code = 0x3131 local Z_code = 0x3163 function traits.is_input_character(c) if c >= 0x3131 and c <= 0x3163 then return true end if (c == 0xff1a) or (c == 0x318d) or (c == 0x3161) or (c == 0x3163) then return true end return false end function traits.is_output_character(c) if c >= 0x3165 and c <= 0xd7a3 then return true end return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return true end function traits.is_append_seperator(c) return false end traits.is_userword_character = traits.is_output_character traits.is_userword_begin_character = traits.is_output_character traits.is_userword_end_character = traits.is_output_character function traits.is_legal_character(c) if traits.is_append_seperator(c) or traits.is_input_character(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true end return false end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end traits.is_contact_character = traits.is_output_character traits.is_ignore_when_candidate_empty = traits.is_input_character local latin_a_code = string.byte("a") local latin_z_code = string.byte("z") local latin_A_code = string.byte("A") local latin_Z_code = string.byte("Z") function traits.to_upper_case(c) if c >= latin_a_code and c <= latin_z_code then return c - latin_a_code + latin_A_code else return c end end function traits.to_lower_case(c) if c >= latin_A_code and c <= latin_Z_code then return c - latin_A_code + latin_a_code else return c end end function traits.is_case_sensitive_character(c) if ct.is_latin_character(c) then return true else return false end end return traits PK n5:Q/{f@@5assets/kurdish.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("KU", "kurdish") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.kurdishv5 .. "kurdish_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.kurdishv5 .. "kurdish_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.EUR, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.EUR, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.kurdishv5 .. "kurdish_traits.trt.png" lng.statistic_alias = "kurdish" lng.categories[si.language.category.FASTSWITCH] = "english" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "kurdish" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "kurdish" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QjiYA  #5assets/kurdish_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "kurdish_soft_qwerty_international_without_dict" local alt_inputs = kb.kurdish_full_qwerty_alt_international local shift_inputs local main_inputs = kb.kurdish_full_qwerty_main1 local expand_long_press_inputs = kb.bn_full_qwerty_expand_long_press_input local input_type = si.input_type() local s = sf.new_full_keyboard( "kurdish_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.match_surface = pkg.kurdishv5 .. "kurdish_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_ps s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q}}#5assets/kurdish_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "kurdish_soft_qwerty_international_without_dict" local alt_inputs = kb.kurdish_full_qwerty_alt_international local shift_inputs local main_inputs = kb.kurdish_full_qwerty_main2 local expand_long_press_inputs = kb.bn_full_qwerty_expand_long_press_input local input_type = si.input_type() local s = sf.new_full_keyboard( "kurdish_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.match_surface = pkg.kurdishv5 .. "kurdish_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), 0) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click end end end s.softkeys["sk_1_2"].on_long_press_once = function() ck.show_expand_symbols({'۲', '2',}, 1) end s.softkeys["sk_1_3"].on_long_press_once = function() ck.show_expand_symbols({'۳', 'ِ', '3',}, 1) end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_ps s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q5assets/kurdish_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local traits = si.new_language_traits() local ct = common_traits traits.separator = " " traits.case_sensitive = true local a_code = 0x0600 local z_code = 0x06FF local A_code = 0x0600 local Z_code = 0x06FF local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { [si.u16code("ً", 1)] = "ٍَّ٘ٔ", [si.u16code("َ", 1)] = "ِ", [si.u16code("ٔ", 1)] = "ٕ", [si.u16code("ٰ", 1)] = "ٖٓ", [si.u16code("ُ", 1)] = "ٌ", [si.u16code("ـ", 1)] = "َّ٘", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or ct.is_arabic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or ct.is_arabic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q>oo5assets/language.lua.pngUT n_n_n_ WГWГWГrequire "string" require "smartinput" local P = {} P._G = _G if _REQUIREDNAME == nil then language = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local string = _G.string local si = _G.smartinput function generate_accent(accent_table, code) local index = -1; for i = 1, #accent_table do local s = accent_table[i] for c in si.u16_iter(s) do if c == code then index = i break; end end end if index ~= -1 then local s = accent_table[index] local ret = "" for c in si.u16_iter(s) do if c ~= code then ret = ret .. si.u16char(c) end end return ret else return nil end end PK n5:Qss5assets/laotian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("LO", "Laotian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.laotianv5 .. "laotian_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.laotianv5 .. "laotian_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.laotianv5 .. "laotian_traits.trt.png" lng.statistic_alias = "laotian" lng.categories[si.language.category.FASTSWITCH] = "laotian" lng.categories[si.language.category.SUBTYPE] = "laotian" lng.categories[si.language.category.MIXINPUT] = "laotian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "laotian" lng.categories[si.language.category.LAYOUT] = "laotian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.laotianv5 .. "laotian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q9g g #5assets/laotian_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.lo_full_main1 local input_type = si.input_type() template = "lo_soft_qwerty_international" alt_inputs = kb.lo_full_alt local s = sf.new_full_keyboard( "laotian_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.laotianv5 .. "laotian_soft_qwerty2.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q~g g #5assets/laotian_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.lo_full_main2 local input_type = si.input_type() template = "lo_soft_qwerty_international" alt_inputs = kb.lo_full_alt local s = sf.new_full_keyboard( "laotian_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.laotianv5 .. "laotian_soft_qwerty1.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QMPP5assets/laotian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = si.u16code("ປ", 1) local z_code = si.u16code("ປ", 1) local A_code = si.u16code("ປ", 1) local Z_code = si.u16code("ປ", 1) local special_lower_list = { "ົ", "ໄ", "ຳ", "ູ", "ະ", "ິ", "ີ", "ຂ", "ນ", "ຍ", "ັ", "ຫ", "ກ", "໑", "ເ", "້", "່", "າ", "ສ", "ວ", "ຜ", "ປ", "ແ", "ອ", "ໂ", "ຶ", "ທ", "ມ", "໌", "ໃ", "ຳ", "ຸ", "ບ", "ວ", "ງ", "ຄ", "ໜ", "ຽ", "ຣ", "ຮ", "ຈ", "ໆ", "ເ", "໊", "ໍ", "ວ", "ຕ", "ຢ", "ຜ", "ຝ", "ພ", "ຼ", "ໍ", "ຶ", "ຖ", "ໝ", } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_laotian_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_laotian_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_laotian_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_laotian_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Qr !5assets/latvian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("LV", "Latvian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.latvianv5 .. "latvian_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.latvianv5 .. "latvian_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.latvianv5 .. "latvian_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.latvianv5 .. "latvian_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.latvianv5 .. "latvian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.latvianv5 .. "latvian_traits.trt.png" lng.statistic_alias = "latvian" lng.categories[si.language.category.FASTSWITCH] = "latvian" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "latvian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "latvian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.latvianv5 .. "latvian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.latvianv5 .. "latvian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.latvianv5 .. "latvian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.latvianv5 .. "latvian_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QN<$5assets/latvian_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "latvian_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qrs "5assets/latvian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "latvian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q@4 "5assets/latvian_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "latvian_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q^^(5assets/latvian_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "latvian_soft_qwerty", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q&]dd(5assets/latvian_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "latvian_soft_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q=1hh5assets/latvian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "ā", "ä", "à", "á", "â", "ã", "å", "æ", "č", "ç", "ć", "ē", "é", "è", "ê", "ë", "ę", "ė", "ģ", "ī", "í", "ï", "î", "ì", "į", "ķ", "ļ", "ł", "ņ", "ń", "ñ", "ŗ", "š", "ś", "ß", "ū", "ü", "ú", "ù", "û", "ž", "ź", "ż", } local special_upper_list = { "Ā", "Ä", "À", "Á", "Â", "Ã", "Å", "Æ", "Č", "Ç", "Ć", "Ē", "É", "È", "Ê", "Ë", "Ę", "Ė", "Ģ", "Ī", "Í", "Ï", "Î", "Ì", "Į", "Ķ", "Ļ", "Ł", "Ņ", "Ń", "Ñ", "Ŗ", "Š", "Ś", "ß", "Ū", "Ü", "Ú", "Ù", "Û", "Ž", "Ź", "Ż", } local accent_letter_dictionary = { [string.byte("a")] = "āäàáâãåæ", [string.byte("c")] = "čçć", [string.byte("e")] = "ēéèêëęė", [string.byte("g")] = "ģ", [string.byte("i")] = "īíïîìį", [string.byte("k")] = "ķ", [string.byte("l")] = "ļł", [string.byte("n")] = "ņńñ", [string.byte("r")] = "ŗ", [string.byte("s")] = "šśß", [string.byte("u")] = "ūüúùû", [string.byte("z")] = "žźż", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Qp65assets/lithuanian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("LT", "Lithuanian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.lithuanianv5 .. "lithuanian_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.lithuanianv5 .. "lithuanian_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.lithuanianv5 .. "lithuanian_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.lithuanianv5 .. "lithuanian_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.lithuanianv5 .. "lithuanian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.lithuanianv5 .. "lithuanian_traits.trt.png" lng.statistic_alias = "lithuanian" lng.categories[si.language.category.FASTSWITCH] = "lithuanian" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "lithuanian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "lithuanian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.lithuanianv5 .. "lithuanian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.lithuanianv5 .. "lithuanian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.lithuanianv5 .. "lithuanian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.lithuanianv5 .. "lithuanian_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qx9'5assets/lithuanian_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "lithuanian_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qt/ %5assets/lithuanian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "lithuanian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QFJ %5assets/lithuanian_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "lithuanian_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q|xaa+5assets/lithuanian_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "lithuanian_soft_qwerty", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q79gg+5assets/lithuanian_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "lithuanian_soft_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qr>( 5assets/lithuanian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "ą", "ā", "ä", "à", "á", "â", "ã", "å", "æ", "č", "ç", "ć", "ę", "ė", "ē", "é", "è", "ê", "ë", "į", "ī", "í", "ï", "î", "ì", "š", "ś", "ß", "ų", "ū", "ü", "ú", "ù", "û", "ž", "ź", "ż", } local special_upper_list = { "Ą", "Ā", "Ä", "À", "Á", "Â", "Ã", "Å", "Æ", "Č", "Ç", "Ć", "Ę", "Ė", "Ē", "É", "È", "Ê", "Ë", "Į", "Ī", "Í", "Ï", "Î", "Ì", "Š", "Ś", "ß", "Ų", "Ū", "Ü", "Ú", "Ù", "Û", "Ž", "Ź", "Ż", } local accent_letter_dictionary = { [string.byte("a")] = "ąāäàáâãåæ", [string.byte("c")] = "čçć", [string.byte("e")] = "ęėēéèêë", [string.byte("i")] = "įīíïîì", [string.byte("s")] = "šśß", [string.byte("u")] = "ųūüúùû", [string.byte("z")] = "žźż", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q2z 5assets/locale.lua.pngUT n_n_n_ WГWГWГreturn ".cn"PK n5:Qis  5assets/lua_calls.lua.pngUT n_n_n_ WГWГWГrequire "smartinput" require "emoji" local P = {} P._G = _G if _REQUIREDNAME == nil then lua_calls = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local si = _G.smartinput local emo = _G.emoji local pi = si.pending_input local ca = si.candidates sync_sk_lng = function() if not si.is_international_version() then return end local s = si.get_current_surface() local lng = s.softkeys["sk_lng"] if lng ~= nil then local old_title = lng.main_title local langs = si.get_enabled_languages() local enabled_language_count = _G.table.getn(langs) local comma_mode = si.get_setting_value(si.settings.LANGUAGE_KEY_COMMA_MODE, si.settings_type.SETTING_BOOL) local related_key_table = si.language_related_key_table local surface = si.get_current_surface() local lng_title = "," if surface ~= nil then local title = surface.language_key_symbol if title ~= nil then lng_title = title end end if enabled_language_count == 1 or comma_mode then lng.main_title = lng_title else lng.main_title = "" end for i, related_key in _G.ipairs(related_key_table) do if lng.main_title ~= "" then if related_key ~= nil then related_key.alt_title = related_key.input_alt_title related_key.alt_input = related_key.alt_title end else if related_key ~= nil then related_key.alt_title = related_key.normal_alt_title related_key.alt_input = related_key.alt_title end end end if old_title ~= lng.main_title then si.sync_display() end end end reverse_alt_title = function() local s = si.get_current_surface() local key1, key2 if s.surface_subtype == si.surface_subtype.KEYBOARD_FULL then key1 = s.softkeys["sk_3_5"] key2 = s.softkeys["sk_3_6"] elseif s.surface_subtype == si.surface_subtype.KEYBOARD_TPLUS then key1 = s.softkeys["sk_3_2"] key2 = s.softkeys["sk_3_3"] end key1.alt_title = "¡" key1.alt_input = "¡" key2.alt_title = "¿" key2.alt_input = "¿" key1.extra_symbol = "!" key2.extra_symbol = "?" si.sync_display() end restore_alt_title = function() local s = si.get_current_surface() local key1, key2 if s.surface_subtype == si.surface_subtype.KEYBOARD_FULL then key1 = s.softkeys["sk_3_5"] key2 = s.softkeys["sk_3_6"] elseif s.surface_subtype == si.surface_subtype.KEYBOARD_TPLUS then key1 = s.softkeys["sk_3_2"] key2 = s.softkeys["sk_3_3"] end key1.alt_title = "!" key1.alt_input = "!" key2.alt_title = "?" key2.alt_input = "?" key1.extra_symbol = "¡" key2.extra_symbol = "¿" si.sync_display() end commit_input = function() if not pi.empty() then pi.commit_input() elseif pi.get_signal_code() ~= 0 then pi.delete_character() end end commit_candidate = function() local default = ca.get_default_index() if (default ~= 0) then ca.confirm_item_2(default) ca.clear() end end clear_candidate = function() if not ca.empty() then ca.clear() end end back_to_previous = function() local default = ca.get_default_index() local input_mode = pi.get_current_pending_mode() if (default ~= 0 and input_mode == si.pending_input_mode.SENTENCE) then si.back_to_previous() end end local function set_title(is_listening) si.voice_recognizing = is_listening local s = si.get_current_surface() local sk = s.softkeys["sk_check"] local old_title = sk.main_title if sk ~= nil then if is_listening == true then sk.main_title = "@string/vi_input_done" else sk.main_title = "@string/vi_input_continue" end end if old_title ~= sk.main_title then si.sync_display() end end voice_recognize_start = function() set_title(true) end voice_recognize_end = function() set_title(false) end update_voice_sym_key = function() local s = si.get_current_surface() if s.update_sym_key ~= nil then s.update_sym_key() end si.sync_display() end compound_word_input = function() ca.clear() local catable = {"-"} ca.add_items_to_front(catable) ca.set_default_index(-1) end get_emoji_display_content = function(emoji_code) return emo.get_emoji_input_content_by_unicode(emoji_code, si.emoji_input_type.UNICODE_UNIFIED) end get_emoji_commit_content = function(emoji_code) return emo.get_emoji_input_content_by_unicode(emoji_code, emo.get_emoji_input_type()) end is_num_line_enabled = function() return si.get_setting_value(si.settings.KEYBOARD_NUMBER_ROW_STYLE, si.settings_type.SETTING_BOOL) end is_update_surface_cached = function() return si.get_setting_value(si.settings.LANGUAGE_SURFACE_CACHED_STATUS, si.settings_type.SETTING_BOOL) end sync_changeable_display = function() local language = si.get_current_language() local surface = si.get_current_surface() local changed = false if language ~= nil and surface ~= nil then for i, key in _G.pairs(surface.softkeys) do local softKey = surface.softkeys[i] if softKey ~= nil and softKey.script_input ~= nil and softKey.script_input ~= "" then local old_main_input = softKey.main_input local new_main_input = softKey.main_input local script_input = softKey.script_input softKey.eat_previous_key = false if surface.force_reset_changeable_display_normal ~= nil and surface.force_reset_changeable_display_normal then new_main_input = language.get_traits().get_normal_script_main_character(script_input) softKey.main_input = new_main_input softKey.main_title = new_main_input else new_main_input = language.get_traits().get_script_main_character(script_input) local normal_main_input = language.get_traits().get_normal_script_main_character(script_input) if script_input ~= new_main_input and normal_main_input ~= new_main_input then softKey.eat_previous_key = true end softKey.main_input = new_main_input softKey.main_title = new_main_input end if old_main_input ~= new_main_input then changed = true end end end if surface.force_reset_changeable_display_normal ~= nil and surface.force_reset_changeable_display_normal then surface.force_reset_changeable_display_normal = false end if changed then si.sync_display() end end end return P PK n5:Q|5assets/macedonian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("MK", "Macedonian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.macedonianv5 .. "macedonian_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.macedonianv5 .. "macedonian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.macedonianv5 .. "macedonian_traits.trt.png" lng.statistic_alias = "macedonian" lng.categories[si.language.category.FASTSWITCH] = "macedonian" lng.categories[si.language.category.SUBTYPE] = "macedonian" lng.categories[si.language.category.MIXINPUT] = "macedonian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "macedonian" lng.categories[si.language.category.LAYOUT] = "macedonian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.macedonianv5 .. "macedonian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.macedonianv5 .. "macedonian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.macedonianv5 .. "macedonian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QF0 %5assets/macedonian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.mk_full_main local input_type = si.input_type() if not is_curve_mode then template = "mk_soft_full_international" alt_inputs = kb.mk_full_alt else template = "mk_soft_full_curve_international" alt_inputs = kb.mk_alt_curve shift_inputs = kb.mk_curve_shift end local s = sf.new_full_keyboard( "macedonian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q0Ͻ+5assets/macedonian_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "macedonian_soft_qwerty", kb.mk_tplus_left, kb.mk_tplus_right, kb.mk_tplus_alt, si.TITLE_CASE.CHANGE, 3) s.template = "russian_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q {CC 5assets/macedonian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = si.u16code("а", 1) local z_code = si.u16code("я", 1) local A_code = si.u16code("А", 1) local Z_code = si.u16code("Я", 1) local special_lower_list = { "ѐ", "ѝ", "й", "љ", "њ", "ј", "ќ", "ѕ", "џ", "ѓ", } local special_upper_list = { "Ѐ", "Ѝ", "Й", "Љ", "Њ", "Ј", "Ќ", "Ѕ", "Џ", "Ѓ", } local accent_letter_dictionary = { [si.u16code("е", 1)] = "ѐ", [si.u16code("и", 1)] = "ѝй", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_cyrillic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Qsz5assets/malagasy.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("MG", "Malagasy") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.malagasyv5 .. "malagasy_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.malagasyv5 .. "malagasy_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.malagasyv5 .. "malagasy_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.malagasyv5 .. "malagasy_traits.trt.png" lng.statistic_alias = "malagasy" lng.categories[si.language.category.FASTSWITCH] = "malagasy" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "malagasy" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "malagasy" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.malagasyv5 .. "malagasy.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.malagasyv5 .. "malagasy_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.malagasyv5 .. "malagasy_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QKW%5assets/malagasy_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "malagasy_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QT؄ј #5assets/malagasy_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "malagasy_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QvO__)5assets/malagasy_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "malagasy_soft_qwerty", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QM5assets/malagasy_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QEI5assets/malayalam.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("ML", "Malayalam") local packagename = pkg.malayalamv5 if packagename == nil then packagename = "com.cootek.smartinputv5.language.v5.malayalam:" end lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.english .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = packagename .. "malayalam_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = packagename .. "malayalam_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = packagename .. "malayalam_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = packagename .. "malayalam_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = packagename .. "malayalam_traits.trt.png" lng.statistic_alias = "malayalam" lng.categories[si.language.category.FASTSWITCH] = "malayalam" lng.categories[si.language.category.SUBTYPE] = "malayalam" lng.categories[si.language.category.MIXINPUT] = "malayalam" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "malayalam" lng.categories[si.language.category.LAYOUT] = "malayalam" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = packagename .. "malayalam.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qn$< %5assets/malayalam_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs local alt_inputs = kb.malayalam_full_alt local main_inputs = kb.malayalam_full_main1 local input_type = si.input_type() template = "malayalam_soft_full_international" local s = sf.new_full_keyboard( "malayalam_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.malayalamv5 .. "malayalam_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q] 2 %5assets/malayalam_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs = nil local alt_inputs = kb.malayalam_full_alt local main_inputs = kb.malayalam_full_main2 local input_type = si.input_type() template = "malayalam_soft_full_international" local s = sf.new_full_keyboard( "malayalam_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.malayalamv5 .. "malayalam_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QFRc c %5assets/malayalam_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template = "malayalam_soft_qwertz_full_international" local alt_inputs local shift_inputs local main_inputs = kb.malayalam_full_qwertz_main1 local input_type = si.input_type() local s = sf.new_full_keyboard( "malayalam_soft_qwertz1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.malayalamv5 .. "malayalam_soft_qwertz2.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_sp_ml s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q5}g g %5assets/malayalam_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template = "malayalam_soft_qwertz_full_international_shift" local alt_inputs local shift_inputs local main_inputs = kb.malayalam_full_qwertz_main2 local input_type = si.input_type() local s = sf.new_full_keyboard( "malayalam_soft_qwertz2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.malayalamv5 .. "malayalam_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QG>>5assets/malayalam_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0d00 local z_code = 0x0d7f local A_code = 0x0d00 local Z_code = 0x0d7f local zero_code = 0x0d66 local nine_code = 0x0d6F local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_malayalam_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_malayalam_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_malayalam_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_malayalam_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Qඤ5assets/malayan.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("MS", "Malayan") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.malayanv5 .. "malayan_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.malayanv5 .. "malayan_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.malayanv5 .. "malayan_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.malayanv5 .. "malayan_traits.trt.png" lng.statistic_alias = "malayan" lng.categories[si.language.category.FASTSWITCH] = "malayan" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "malayan" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "malayan" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.malayanv5 .. "malayan.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.malayanv5 .. "malayan_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.malayanv5 .. "malayan_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QBbb$5assets/malayan_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "malayan_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QoG'  "5assets/malayan_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "malayan_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qe<=!5assets/malayan_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "malayan_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q^'~}5assets/malayan_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Qp5assets/manipuri.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("MN", "Manipuri") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.manipuriv5 .. "manipuri_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.manipuriv5 .. "manipuri_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.manipuriv5 .. "manipuri_traits.trt.png" lng.statistic_alias = "manipuri" lng.categories[si.language.category.FASTSWITCH] = "manipuri" lng.categories[si.language.category.SUBTYPE] = "manipuri" lng.categories[si.language.category.MIXINPUT] = "manipuri" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "manipuri" lng.categories[si.language.category.LAYOUT] = "manipuri" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = nil lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q1 $5assets/manipuri_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local expand_long_press_inputs local main_inputs = kb.manipuri_meetei_mayek_full_main local is_num_row_on = si.is_num_line_enabled() local input_type = si.input_type() template = "manipuri_meetei_mayek_soft_qwerty1" if is_num_row_on then alt_inputs = kb.manipuri_meetei_mayek_full_alt_numrow_on else alt_inputs = kb.manipuri_meetei_mayek_full_alt end local s = sf.new_full_keyboard( "manipuri_meetei_mayek_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.manipuriv5 .. "manipuri_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QS~$5assets/manipuri_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local expand_long_press_inputs local main_inputs = kb.manipuri_meetei_mayek_full_main2 local is_num_row_on = si.is_num_line_enabled() local input_type = si.input_type() template = "manipuri_meetei_mayek_soft_qwerty2" if is_num_row_on then alt_inputs = kb.manipuri_meetei_mayek_full_alt2_numrow_on else alt_inputs = kb.manipuri_meetei_mayek_full_alt2 end local s = sf.new_full_keyboard( "manipuri_meetei_mayek_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.manipuriv5 .. "manipuri_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end -- manipuri -- sk ZWNJ for manipuri sk_zwnj_manipuri = si.new_softkey() sk_zwnj_manipuri.main_title = "‌" if is_num_row_on then sk_zwnj_manipuri.alt_title = "$" else sk_zwnj_manipuri.alt_title = "꯲" end sk_zwnj_manipuri.supportPreviewPopup = "true" sk_zwnj_manipuri.on_click = function () si.input_precise(sk_zwnj_manipuri.main_title, "", "", false) end sk_zwnj_manipuri.on_slide_down = function () si.input_precise(sk_zwnj_manipuri.alt_title, "", "", false) end sk_zwnj_manipuri.on_long_press_once = function () local symbol if is_num_row_on then symbol = {"$"} else symbol = {"꯲"} end ck.show_expand_symbols(symbol, 1) end sk_zwj_manipuri = si.new_softkey() sk_zwj_manipuri.main_title = "‍" sk_zwj_manipuri.alt_title = "/" sk_zwj_manipuri.supportPreviewPopup = "true" sk_zwj_manipuri.on_click = function () si.input_precise(sk_zwj_manipuri.main_title, "", "", false) end sk_zwj_manipuri.on_slide_down = function () si.input_precise(sk_zwj_manipuri.alt_title, "", "", false) end sk_zwj_manipuri.on_long_press_once = function () ck.show_expand_symbols({"/"}, 1) end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = sk_zwnj_manipuri s.softkeys["sk_zwj"] = sk_zwj_manipuri s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q~l8i1i15assets/manipuri_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0xABC0 local z_code = 0xABF9 local A_code = 0xABC0 local Z_code = 0xABF9 local dot_code = si.u16code("।", 1) local special_semivowel_code = si.u16code("্", 1) local special_lower_list = { "ऴ", "ॄ", "ग़", "ड़", "क़", "ऩ", "ॡ", "ऌ", "ढ़", "ऒ", "ऎ", "ऍ", "फ़", "ऎ", "ऍ", "ऎ", "ऍ", "ऋ", "ৌ", "ৈ", "া", "ৗ", "ৃ", "ব", "হ", "গ", "দ", "জ", "ড", "়", "ো", "ে", "্", "ি", "ু", "প", "র", "ক", "ত", "চ", "ট", "ং", "ম", "ন", "ঽ", "ল", "স", "য", "ষ", "ঃ", "ঔ", "ঐ", "আ", "ঈ", "ঊ", "ভ", "ঙ", "য", "ধ", "ঝ", "ঢ", "ঞ", "ও", "এ", "অ", "ই", "উ", "ফ", "র", "ক", "থ", "ছ", "ঠ", "ঁ", "ণ", "ন", "ঽ", "ল", "শ", "য়", "ষ", "ঃ", } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("।", 1)] = "।", } local special_vowel_list = { "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ", "ৃ", "অ", "আ", "ই", "ঈ", "উ", "ঊ", "এ", "ঐ", "ও", "ঔ", "ঋ", } local special_semivowel_list = { "্", } local special_tone_list = { "ঃ", "ং", "়", "ঁ", } local special_consonant_list = { "ক", "খ", "গ", "ঘ", "ঙ", "চ", "ছ", "জ", "ঝ", "ঞ", "ট", "ঠ", "ড", "ঢ", "ণ", "ত", "থ", "দ", "ধ", "ন", "প", "ফ", "ব", "ভ", "ম", "য", "র", "ল", "শ", "ষ", "স", "হ", "ড়", "ঢ়", "য়", } local special_attach_list = { "্", "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ", "ৃ", "ঃ", "ং", "়", "ঁ", } local special_script_list = { "্", "া", "ি", "ী", "ু", "ূ", "ে", "ৈ", "ো", "ৌ", "ঃ", "ং", "়", "ঁ", "ৃ", } local special_script_dictionary = { [si.u16code("্", 1)] = "অ", [si.u16code("া", 1)] = "আ", [si.u16code("ি", 1)] = "ই", [si.u16code("ী", 1)] = "ঈ", [si.u16code("ু", 1)] = "উ", [si.u16code("ূ", 1)] = "ঊ", [si.u16code("ে", 1)] = "এ", [si.u16code("ৈ", 1)] = "ঐ", [si.u16code("ো", 1)] = "ও", [si.u16code("ৌ", 1)] = "ঔ", [si.u16code("ঃ", 1)] = "ঃ", [si.u16code("ং", 1)] = "ং", [si.u16code("়", 1)] = "়", [si.u16code("ঁ", 1)] = "ঁ", [si.u16code("ৃ", 1)] = "ঋ", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif not traits.is_special_attach_case(code) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_last_series_input_special_group_case() then return traits.get_normal_script_main_character(script) elseif traits.is_special_semivowel_case(code) and traits.is_contain_multi_case(last_series_precise_input) then return last_series_precise_input else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(5) if not si.is_empty(last_text_from_user_input) then if traits.is_contain_triple_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local string_len = si.get_string_length(last_text_from_user_input) if string_len > 3 then last_text_from_user_input = _G.string.sub(last_text_from_user_input, string_len-2, string_len) end if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.get_normal_script_main_character(script) local string_len = si.get_string_length(script) if string_len > 1 then return script end local code = si.u16code(script, 1) if traits.is_special_script_case(code) then return special_script_dictionary[code] end return script; end function traits.is_contain_vowel_tone_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true elseif traits.is_special_tone_case(c) then return true end end return false end function traits.is_special_group_case(str) if si.is_empty(str) then return false end if str == "্য" then return true end return false end function traits.is_last_series_input_special_group_case() local precise_input = pi.get_last_series_precise_input() if not si.is_empty(precise_input) then local str_size = si.get_string_length(precise_input) if str_size < 2 then return false end local code_1 = si.u16code(precise_input, str_size) local code_2 = si.u16code(precise_input, str_size - 1) if code_1 == si.u16code("য", 1) and code_2 == special_semivowel_code then return true end end return false end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if code_se == special_semivowel_code and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_triple_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 5 then return false end local code_se = si.u16code(str, 2) local code_fo = si.u16code(str, 4) if code_se == special_semivowel_code and code_fo == special_semivowel_code then local code_fr = si.u16code(str, 1) local code_th = si.u16code(str, 3) local code_fi = si.u16code(str, 5) if traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) and traits.is_special_consonant_case(code_fi) then return true end return false end return false end function traits.is_contain_multi_case(str) local str_size = si.get_string_length(str) if str_size >= 2 then return true end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_tone_case(c) for i, v in ipairs(special_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_script_case(c) for i, v in ipairs(special_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_attach_case(c) for i, v in ipairs(special_attach_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if c == dot_code then return false end if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) if c == dot_code then return false end local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) if c == dot_code then return false end return ct.is_manipuri_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) if c == dot_code then return false end return ct.is_manipuri_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) if c == dot_code then return false end return ct.is_manipuri_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_manipuri_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_punctuation_character(c) if c == dot_code then return true end return false end return traits PK n5:Q\zz5assets/marathi.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("MR", "Marathi") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.marathiv5 .. "marathi_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.marathiv5 .. "marathi_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.marathiv5 .. "marathi_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.marathiv5 .. "marathi_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "hindi_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, { surface_id = "hindi_sp_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI_SP, }, { surface_id = "hindi_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.HINDI, }, { surface_id = "eng_sym_keyboard3.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.marathiv5 .. "marathi_traits.trt.png" lng.statistic_alias = "marathi" lng.categories[si.language.category.FASTSWITCH] = "marathi" lng.categories[si.language.category.SUBTYPE] = "marathi" lng.categories[si.language.category.MIXINPUT] = "marathi" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "marathi" lng.categories[si.language.category.LAYOUT] = "marathi" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.marathiv5 .. "marathi.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q5n  #5assets/marathi_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.hi_full_qwerty_main1 local expand_long_press_inputs = kb.hi_full_qwerty_expand_long_press_input1 local input_type = si.input_type() template = "hindi_soft_full_international" alt_inputs = kb.hi_full_alt shift_inputs = nil local s = sf.new_full_keyboard( "marathi_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.match_surface = pkg.marathiv5 .. "marathi_soft_qwerty2.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_hindi s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q󞵭  #5assets/marathi_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.hi_full_qwerty_main2 local expand_long_press_inputs = kb.hi_full_qwerty_expand_long_press_input2 local input_type = si.input_type() template = "hindi_soft_full_international" alt_inputs = kb.hi_full_alt shift_inputs = nil local s = sf.new_full_keyboard( "marathi_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.match_surface = pkg.marathiv5 .. "marathi_soft_qwerty1.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_hindi s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q~YY#5assets/marathi_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.hi_full_qwertz_main1 local script_inputs = kb.hi_full_qwertz_script1 local expand_long_press_inputs = kb.hi_full_qwertz_expand_long_press_input1 local input_type = si.input_type() template = "hindi_soft_qwertz_full_international" local s = sf.new_full_keyboard( "marathi_soft_qwertz1", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.marathiv5 .. "marathi_soft_qwertz2.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "अ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_hindi s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q; ##5assets/marathi_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.hi_full_qwertz_main2 local script_inputs = kb.hi_full_qwertz_script2 local expand_long_press_inputs = kb.hi_full_qwertz_expand_long_press_input2 local input_type = si.input_type() template = "hindi_soft_qwertz2_full_international" local s = sf.new_full_keyboard( "marathi_soft_qwertz2", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.marathiv5 .. "marathi_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "अ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end local sk_5_2 = s.softkeys["sk_5_2"] local sk_5_3 = s.softkeys["sk_5_3"] sk_5_2.on_click = full_on_click_commit sk_5_3.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_hindi s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_hindi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QhBB+B+5assets/marathi_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0900 local z_code = 0x097F local A_code = 0x0900 local Z_code = 0x097F local zero_code = 0x0966 local nine_code = 0x096F local dot_code = si.u16code("।", 1) local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } local special_vowel_list = { "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", "ॅ", "ॉ", "अ", "आ", "इ", "ई", "उ", "ऊ", "ए", "ऐ", "ओ", "औ", "ऋ", "ऌ", "ॡ", "ऍ", "ॠ", "ॄ", "ॢ", "ॣ", "ॕ", "ऑ", } local special_semivowel_list = { "्", } local special_tone_list = { "ं", "ः", "ँ", } local special_double_tone_list = { "़", } local special_attach_list = { "्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", "ॅ", "ॉ", "ं", "ः", "ँ", "़", } local special_vowel_script_list = { "्", "ा", "ि", "ी", "ु", "ू", "े", "ै", "ो", "ौ", "ृ", } local special_vowel_script_dictionary = { [si.u16code("्", 1)] = "अ", [si.u16code("ा", 1)] = "आ", [si.u16code("ि", 1)] = "इ", [si.u16code("ी", 1)] = "ई", [si.u16code("ु", 1)] = "उ", [si.u16code("ू", 1)] = "ऊ", [si.u16code("े", 1)] = "ए", [si.u16code("ै", 1)] = "ऐ", [si.u16code("ो", 1)] = "ओ", [si.u16code("ौ", 1)] = "औ", [si.u16code("ृ", 1)] = "ऋ", } local special_consonant_list = { "क", "ख", "ग", "घ", "च", "छ", "ज", "झ", "ट", "ठ", "ड", "ढ", "ण", "त", "थ", "द", "ध", "न", "प", "फ", "ब", "भ", "म", "य", "र", "ल", "व", "श", "ष", "स", "ह", "क्ष", "त्र", "ङ", "ञ", "ळ", } local special_upper_list = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("।", 1)] = "।", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_double_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif not traits.is_special_attach_case(code) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_special_semivowel_case(code) and traits.is_contain_multi_case(last_series_precise_input) then return last_series_precise_input else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(3) if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.get_normal_script_main_character(script) local code = si.u16code(script, 1) if traits.is_special_vowel_script_case(code) then return special_vowel_script_dictionary[code] end return script; end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if traits.is_special_semivowel_case(code_se) and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_vowel_tone_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true elseif traits.is_special_tone_case(c) then return true end end return false end function traits.is_contain_double_tone_case(str) local double_tone_num = 0 local code = si.u16code(str, 1) for c in si.u16_iter(str) do if traits.is_special_double_tone_case(c) then double_tone_num = double_tone_num + 1 end end if double_tone_num >= 2 or traits.is_special_double_tone_case(code) then return true end return false end function traits.is_contain_multi_case(str) local str_size = si.get_string_length(str) if str_size >= 2 then return true end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_script_case(c) for i, v in ipairs(special_vowel_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_tone_case(c) for i, v in ipairs(special_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_double_tone_case(c) for i, v in ipairs(special_double_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_attach_case(c) for i, v in ipairs(special_attach_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.is_upper_case(c) local char_code = c return ((char_code >= A_code and char_code <= Z_code) and not traits.is_num_character(c)) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return ((char_code >= a_code and char_code <= z_code) and not traits.is_num_character(c)) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if c == dot_code then return false end if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) if c == dot_code then return false end local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif traits.is_num_character(c) then return false elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) if c == dot_code then return false end return ct.is_marathi_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) if c == dot_code then return false end return ct.is_marathi_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) if c == dot_code then return false end return ct.is_marathi_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_marathi_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_punctuation_character(c) if c == dot_code then return true end return false end return traits PKk5:Q5assets/message_templatesUT  n_ n_ n_ w@TГw@TГw@TГ[nkq},m`8;0`L F~(7EQ")FR%&_{?_ZU@ TwTWZUw/㷿/~GJG~/͗ {v3LFqȌEoM?̳i_Լ¿8㔻Hy>݅<~J:na5[cw,`qVMՍ]J=Fu@1ŬYFٚ Xyk߬[L̴se55j7iͻղe%kê00 u^o78iNsW |lwFG_1jB״Qi91gac7CLPX;N `Yެ&ůoy5ƾlxItj/}<¯Ƽ,hz^I^qjjXM3|^)\?C9SiFܲ9,lMa˫IҾaɌ)5{rp[guRqw}L-C9mugndn x*J/\vgobmzd8boFEaJiod:Z۴9=1B'#X4j 9f}Wt:S _ޚ-U9f.W(մo#='s{|^洛u[g? |m:؟mV,nS ab-{+11vj87i73wESl~n9v %Ѧ%`6eRD1'y ,aAr;(*w,h, 7hg'(zN+ .-ԈeUrtm7 8Ѵ>{sJC2j|eOM}Ύ$ѤZYڎYX\Q7xm>27;R6NO'dmA. DY5s/}-YL$@ɧVC9wpU b5II`.W~TQg8PԏZz}%8Ra!cp e  S"Dt'kF*O˦J({VTN=%YUhwvݠ[w־4GѾXj5 DTV%&1Fƕ [V{6xu6|o*a&&䷓}DcM+zߪn~zEi.,܈~?/nmf)Wf[֋C/yŶ>׎2(z5IFIVӣPR?Qy"IpBzW;hX!UXn ̯x ?!^fYeCPq;*{_QJ@vnøn6.lUTNхfDZ|T/j^uc 2 navE^QMߛyU[ȸ.s#{ Yœ?0˚{=G5Q\<`@1dbu/cx-'U…uekD[!k ~ܝπUb޾̂cHxbPNAeXoi0gHq P.޹>мTw5Y8E-lWa-?KBE9PC,6D[-B 8w~u%äldZhMwә+揗i>6ٺl(4E Ms;4| Paaӝ-siu&,́V\BԆfd>Ю̽ᇹ0q&;%֕:i]ݶ&3 Sxj G}(ϷRGl2ɣKI@RӀq;DLVSiYv;C69c(λ@zX/f "YvA#&EfP4AP~7_ IOl&YMQoUgzːRoDT_܍uS._̭"W 7lt>Y!/m,;ПȋrI[B<79C|V"H$=3i_C AX@lqwD<4 ěHȸmb܀ IЙXJ)[@wčpvz|(olL&`3{HS޲qvx-g~av»P d?|_}Z5 d.fIA`N̅Xuh £07Тnkq7yup HhSݚ K?r$ (¡xLiߖ@uz!2/z,>S;f3Sc{7=Jg0 0 -ϫi[.7_wo_>7g3{ײ|;Xqa-3)-;x] f{~C(:=~i>AM['q/3|XD6yL;6y&5OOޓ; L1F&Rcb;ya$eR>~<}|'807 z= Ɓ Q`CC磉SubS]Fz ]DcyiXEt{qwg :5*ss{fXXkx, aށcb)$)pf4k]b p6#@n=Q J-@"h[ /qm^B= 54%h,5 ?W6򰚷5?C?_-/~X:ҳ,_EۭJ]8p(DZ)FuJ%ȚB,sͩ IHy{-0Yt=vD2 khkm 1nt%*\%~#辉0YW\BwILֆ%TPSg On8X6 09ǯ>"+=UՁRihy)v8E6>ar$yqp>Kn`oX1#IFܞ^pSj3}& 6EӶY8ռ5p/~p$ϕO^ԟvAՙoQE5|t!;$tߙiF6@`f_,dmiw(R}<Z^/:g"JDPy[c4ֻP'lSՌ-?8>鳚.6B LbO?@kMP)Êq6y @M>/9-Q{)CbsaF`yQB >J %^SL7'e8nttح DnXL>vzkb_w{"I<  )d_G?1 MYj57{:rmԙF.h_%Bq#ֻ-O0==bƚ%Y͎yTY8jzn8>LZ+M FI{DJaǙVm+(Z_LM "ecp^M %v82y-C=PQF-&) ތeNaAq]Zt8f#,r4¦ۛPԯ˰2}4KIBkf^Maٯ:" i 9PZ UښfhTӠmn2}5W(d67XJfu&|%Ԕf>ջY*`)twt+7v#65GnzUPL%2M6\&'sdi<(IEThxgl XVm\ 0wڥg"?s|Xo꼒m)+ϵR2!PC\KgxO㑫 $ZAB6Syh1g7O1Mļ2&O5dndžl|a,8O:bPb^~݅Vc'h  D(L3&pH&KV m.~`_!w:Ŏhz\^w.r}JD6+ .{XûSTpisC.(q6Bk4^tL}|Lފjz˺^.by^Xs!ge f7igj,?T?f ." VRR*TFY/p =1%nJjp0.lN1h CL^/B*Kզ(M {TׯcJfpvGЛV~%f64M89g̻%&`0[X9OJL$h@0w67f4\UJ[[AgPf򳚖ize*E rJs଄?H ls17MYM4(櫛&wV01'=e1w$+'4c O|_ܥXIa`}j7q6ϓrQ!ie'G.V>(>> Sه%y&v6t}sނ!9<2yrG"!ޣWAѱco&]mic/w]_7$zGSPUaMX/c©{)O74ȽdV_ NrI_Ӿ|m1?t8>NWM15]B[v?F%uݛ3(2J &1U#3 xHRX"K6ZUPg8H8^"gM]fewF-&uzUQ >H|g:Ï 6%_1~6`W%O!lR,^^mYcaʹ0ՑW{u-{|)J-`l_L}䔯$c #qU<&qsOkBVAe5**1<H#^K|m 29n iwu,@ԄζM*s  T>|jvI)$ud`ABkhyW38C̖41KKwvGQ\ǐj; POQ3Iڌ%>qPxSc3=x7΃+lf9yeVPhøwv/[@\hŖ{7 _||f{x8zǯ,RDJW` ;HeB9uk 3;{e1S{dnķ=7Z@Dr5'*gd +qAwlPO:pᚼ^vt~\VEX,@k7g%^+#>l-|ϽH$0j\|&2~}_M5ި oSM+fÛyp~|`o_ izf^v$^@_:>)aS:քr\NP ƍpQ%O>-ĉs-?!t*x0 {zFmpOɃb|ͻ*fvL{0$lN!xX+VigSp<ixPÑC73nB$2 0 then fl.set_active_index(0) end end surface.softkeys["sk_back"] = sk_back sk_prev = smartinput.new_softkey() sk_prev.on_click = function () smartinput.input_keycode(smartinput._G.config.L_KEYCODE_PREV) smartinput.sync_display() end surface.softkeys["sk_prev"] = sk_prev sk_next = smartinput.new_softkey() sk_next.on_click = function () smartinput.input_keycode(smartinput._G.config.L_KEYCODE_NEXT) smartinput.sync_display() end surface.softkeys["sk_next"] = sk_next surface.on_slip_up = sk_next.on_click surface.on_slip_down = sk_prev.on_click return surface PK n5:Q5assets/more_japanese.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" local surface = smartinput._G.dofile("more.sur.png") surface.template = "more_japanese" surface.extra_elements = { "top_bar=filter_bar", "popup_revert", "popup_revert_inline", "popup_explicit", } return surface PK n5:QRi5assets/more_pinyin.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" local surface = smartinput._G.dofile("more.sur.png") surface.template = "more_pinyin" surface.extra_elements = { "top_bar=filter_bar", "popup_revert", "popup_revert_inline", "popup_explicit", "sk_single_word", } return surface PK n5:Qv5assets/nepali.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("NE", "nepali") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, { surface_id = pkg.nepaliv5 .. "nepali_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.nepaliv5 .. "nepali_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.nepaliv5 .. "nepali_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.nepaliv5 .. "nepali_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.nepaliv5 .. "nepali_traits.trt.png" lng.statistic_alias = "nepali" lng.categories[si.language.category.FASTSWITCH] = "nepali" lng.categories[si.language.category.SUBTYPE] = "nepali" lng.categories[si.language.category.MIXINPUT] = "nepali" lng.categories[si.language.category.CELLDICT] = "nepali" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "nepali" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.nepaliv5 .. "nepali.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qb9b "5assets/nepali_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs local alt_inputs = { {"१", "२", "३", "४", "५", "६", "७", "८", "९", "०", "%",}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€", }, {"@", "/", "-", "'", "!", "?", ";", "ऽ",}, } local main_inputs = { {"ट", "ौ", "े", "र", "त", "य", "ु", "ि", "ो", "प", "इ",}, {"ा", "स", "द", "उ", "ग", "ह", "ज", "क", "ल", "ए", "ॐ",}, {"ष", "ड", "च", "व", "ब", "न", "म", "्",}, } local expand_long_press_inputs = { {{"ॽ","॰","1"}, "2", "3", "4", "5", "6", "7", "8", "9", "0", ""}, {"", "", "", "", "", "", {"ज्ञ",type="input_as_whole"}, "", "", "", "",}, {"", "", "", "", "", "", "", {"त्र", type="input_as_whole"},}, } local input_type = si.input_type() template = "nepali_soft_full_international" local s = sf.new_full_keyboard( "nepali_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.match_surface = pkg.nepaliv5 .. "nepali_soft_qwerty2.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_nepali s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_nepali s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_zwj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q "5assets/nepali_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs local alt_inputs = { {"१", "२", "३", "४", "५", "६", "७", "८", "९", "०", "%",}, {"\\", "_", "(", ":", ")", "&", "#", "*", "\"", "|", "€", }, {"@", "/", "-", "'", "!", "?", "ः", "`",}, } local main_inputs = { {"ठ", "औ", "ै", "ृ", "थ", "ञ", "ू", "ी", "ओ", "फ", "ई",}, {"आ", "श", "ध", "ऊ", "घ", "अ", "झ", "ख", "॥", "ऐ", "ः",}, {"ऋ", "ढ", "छ", "ँ", "भ", "ण", "ं", "ङ",}, } local expand_long_press_inputs = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ""}, {"", "", "", "", "", "", "", "", "", "", "",}, {"", "", "", "", "", "", "ँ़", "",}, } local input_type = si.input_type() template = "nepali_soft_full_international" local s = sf.new_full_keyboard( "nepali_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.match_surface = pkg.nepaliv5 .. "nepali_soft_qwerty1.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_nepali s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_nepali s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_zwj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qڌ "5assets/nepali_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГ require "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs local alt_inputs = { {"१", "२", "३", "४", "५", "६", "७", "८", "९", "०", "औ",}, {"\\", "_", "+", "=", "$", "&", "#", "(", ")", {":", "*"}, "\"", }, {"@", "/", "-", "'", "!", "?", "ः", {",", ":"}, {"रु", type="input_as_whole"},}, } local main_inputs = { {"ट", "ध", "भ", "च", "त", "थ", "ग", "ष", "य", "उ", "इ",}, {"ब", "क", "म", "ा", "न", "ज", "व", "प", "ि", "स", "ु",}, {"श", "ह", "अ", "ख", "द", "ल", "े", "्", "र",}, } local expand_long_press_inputs = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ""}, {"", "", "", "", "", "", "", "", "", "", "",}, {"", "", "", "", "", "", "ऽ", "", {"त्र", type="input_as_whole"},}, } local input_type = si.input_type() template = "nepalitrad_soft_full_international" local s = sf.new_full_keyboard( "nepalitrad_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.match_surface = pkg.nepaliv5 .. "nepali_soft_qwertz2.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_nepali s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_nepali s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qu"5assets/nepali_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs local alt_inputs = { {"ञ", "ई", "घ", "द्ध", "छ", "ट", "ठ", "ड", "ढ", "ण", "ओ",}, {"\\", "_", "+", "=", "$", "&", "#", "(", ")", {":", "*"}, "\"", }, {"@", "/", "-", "'", "!", "?", ";", {",", ":"}, "श्र",}, } local main_inputs = { {"त्त", "ड्ढ", "ऐ", "द्व", "ट्ट", "ठ्ठ", "ऊ", "क्ष", "इ", "ए", "ृ",}, {"आ", "ङ्", "ड्ड", "ँ", "द्द", "झ", "ो", "फ", "ी", "ट्ठ", "ू",}, {"क्", "ह्म", "ऋ", "ॐ", "ौ", "द्य", "ं", "ङ", "ै",}, } local expand_long_press_inputs = { {{"ज्ञ","॥","1"}, "2", "3", "4", "5", "6", "7", "8", "9", "0", ""}, {"", "", "", "", "", "", "", "", "", "", "",}, {"", "", "", "", "", "", "", "", "",}, } local input_type = si.input_type() template = "nepalitrad_soft_full_international_shift" local s = sf.new_full_keyboard( "nepalitrad_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.match_surface = pkg.nepaliv5 .. "nepali_soft_qwertz1.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end si.input_string(sk.main_input, false) end function on_long_press_once(sk) local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end sur.softkeys[1] = si.new_expandkey_by_title(sk.alt_input) if sk.expand_chars ~= nil then index = 2 if _G.type(sk.expand_chars) == "table" then for i = 1, #sk.expand_chars do sur.softkeys[index] = si.get_expand_key_by_title(sk.expand_chars[i]) index = index + 1 end else local exist_char = {} for c in si.u16_iter(sk.expand_chars) do if(not si.exist_in_list(c,exist_char)) then sur.softkeys[index] = si.get_expand_key(c, case) exist_char[index] = c index = index + 1 end end end end si.popup_surface(sur) si.set_default_key(1) end for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_long_press_once = on_long_press_once sk.on_click = full_on_click end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_nepali s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["sk_zwnj"] = ck.sk_zwnj_zwj s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q8~EE5assets/nepali_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = 0x0901 local z_code = 0x097f local A_code = 0x0901 local Z_code = 0x097f local dot_code = si.u16code("।", 1) local case_insensitive_letters = { } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("।", 1)] = "।", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if c == dot_code then return false end if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) if c == dot_code then return false end local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) if c == dot_code then return false end return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) if c == dot_code then return false end return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) if c == dot_code then return false end return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end function traits.is_punctuation_character(c) if c == si.u16code("।", 1) then return true end return false end return traits PKk5:Q5assets/network_error.htmlUT  n_ n_ n_ w@TГw@TГw@TГXn6ߧTtRHv.n3 ֦2M56E@KD&y,Ѵ %s?xvh"au#89}N(`Qyd{-ěSȹ9&rr9IX>!ʨ8 gd "'"&4I[?#,-CX)n~8XK˜g\s5ue)) <&`<Ta-U#<*x6myl2JpAFTR`VraID[Zq8R`EG8aN?#7xi21gl4~4ĿۂI]ezxJey$Ic.Ɍx{~| ܇eXBi[YGAhUvujGǂL=JzPvЎxkHYBltˆzk[LȢ]ߨ 22cg۶6j\ў/7G:tWB/q+ϳBwÄ  au tzCւa7ą_w#'=0_S@\CJ9"vmT*h`#{U@f{\ h-86ʶ sa[*mj=| A]eWTp}8ZA?C7MX fPTbbj裙ߐE9;q 䊫V~j )ޖ9sI;&7Z^/jو{$`ͪ1c jp<+rl'ۖa`]@tCaz6Tc'thrs3|d(NI]#=TSīRhJm*K3jZ9߰t IM;5/y[g(V"`HNVY݊X\6o:?*8>IE@賄/"_`)"d+l nUQ˷ߒ7;eꋫ 5tu"%lWItH2I}g_L_,b+g d v9$?aj+iZYr2%*1Re榨:|C/]wpi! >~8?HHI:A4Fjr [?E6hƩ68 \:_#lb/տ 8AG]0DS`a>D˶*j֝g4m8Ц) j;Vi`|[`jl$ FlckH\ ܚΏ cs7*:5eXWqP-& 0l@܆Ƅ(#l nvwm4/J>'B^NhF+aFԃ 9&0p8U8y>%?RuV]Y0w?h PKQSPK n5:QX5assets/norwegian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("NO", "Norwegian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.norwegianv5 .. "norwegian_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.norwegianv5 .. "norwegian_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.norwegianv5 .. "norwegian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.norwegianv5 .. "norwegian_traits.trt.png" lng.statistic_alias = "norwegian" lng.categories[si.language.category.FASTSWITCH] = "norwegian" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "norwegian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "norwegian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.norwegianv5 .. "norwegian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.norwegianv5 .. "norwegian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.norwegianv5 .. "norwegian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QL>&5assets/norwegian_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "norwegian_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q#Ĺ v v $5assets/norwegian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.nor_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "swedish_soft_full_email_uri_international" else template = "swedish_soft_full_international" end alt_inputs = kb.swe_full_qwerty_alt else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "swedish_soft_full_email_uri_curve_international" else template = "swedish_soft_full_curve_international" end alt_inputs = kb.swe_full_qwerty_alt_curve shift_inputs = kb.swe_full_qwerty_shift_curve end local s = sf.new_full_keyboard( "norwegian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QJ<^^#5assets/norwegian_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "norwegian_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q{5assets/norwegian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "à", "á", "â", "ã", "ä", "ā", "é", "ê", "ë", "è", "ę", "ē", "ė", "ö", "ó", "ò", "ô", "õ", "ō", "œ", "ú", "ü", "ù", "û", "ū", "å", "ø", "æ" } local special_upper_list = { "À", "Á", "Â", "Ã", "Ä", "Ā", "É", "Ê", "Ë", "È", "Ę", "Ē", "Ė", "Ö", "Ó", "Ò", "Ô", "Õ", "Ō", "Œ", "Ú", "Ü", "Ù", "Û", "Ū", "Å", "Ø", "Æ" } local accent_letter_dictionary = { [string.byte("a")] = "åæàáâãäā", [string.byte("e")] = "éêëèęēė", [string.byte("o")] = "óòôõōöœø", [string.byte("u")] = "üúùûū", [string.byte("A")] = "ÅÆÀÁÂÃÄĀ", [string.byte("E")] = "ÉÊËÈĘĒĖ", [string.byte("O")] = "ÓÒÔÕŌÖŒØ", [string.byte("U")] = "ÜÚÙÛŪ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Qr4 4 5assets/number_down.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" local si = smartinput local ck = common_keys local pi = si.pending_input local ca = si.candidates local surface = si.new_surface("number_down") surface.on_load = function (old_surface) surface.explicit_inline = old_surface.explicit_inline surface.inline_strategy = old_surface.inline_strategy surface.resolve_mode = old_surface.resolve_mode surface.softkeys["sk_mo"] = old_surface.softkeys["sk_mo"] surface.softkeys["sk_edit"] = old_surface.softkeys["sk_edit"] surface.softkeys["sk_clipboard"] = old_surface.softkeys["sk_clipboard"] surface.softkeys["sk_url"] = old_surface.softkeys["sk_url"] surface.softkeys["sk_voice"] = old_surface.softkeys["sk_voice"] surface.softkeys["sk_ent"] = old_surface.softkeys["sk_ent"] surface.softkeys["sk_bk"] = old_surface.softkeys["sk_bk"] surface.softkeys["sk_cancel"] = old_surface.softkeys["sk_cancel"] surface.softkeys["sk_quick_switcher"] = old_surface.softkeys["sk_quick_switcher"] surface.softkeys["sk_hw_mask"] = old_surface.softkeys["sk_hw_mask"] surface.softkeys["sk_clear_candidate"] = old_surface.softkeys["sk_clear_candidate"] surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_sp"] = si.new_softkey() surface.softkeys["sk_sp"].on_click = old_surface.softkeys["sk_sp"].on_click surface.softkeys["sk_sp"].on_long_press_multi = old_surface.softkeys["sk_sp"].on_long_press_multi end surface.template = "number_down" surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.touch_correct = false surface.support_mode = si.context.NUMBER + si.context.MATH surface.extra_elements = { "popup_revert", "popup_explicit" } sk_titles = { {"+", "1", "2", "3"}, {"-", "4", "5", "6"}, {"/", "7", "8", "9","#"}, {"*", ".", "0"} } for i, row in _G.pairs(sk_titles) do for j, title in _G.pairs(row) do key = si.new_softkey() key.main_title = title key.on_click = function(key) local default_index = ca.get_default_index() if (not pi.range_exist(pi.L_RANGE_PENDING + pi.L_RANGE_CONFIRM + pi.L_RANGE_CURVE)) and (default_index ~= 0) then if ca.get_item_source(ca.get_item(default_index)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default_index) else ca.clear() end end si.input_string(key.main_title, false) end surface.softkeys["sk_" .. i .. "_" .. j] = key end end surface.softkeys["sk_back"] = ck.sk_back_to_keyboard surface.on_slip_left = nil surface.on_slip_right = nil return surface PK n5:Q!) ) 5assets/number_left.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" local si = smartinput local ck = common_keys local pi = si.pending_input local ca = si.candidates local surface = si.new_surface("number") surface.on_load = function (old_surface) surface.explicit_inline = old_surface.explicit_inline surface.inline_strategy = old_surface.inline_strategy surface.resolve_mode = old_surface.resolve_mode surface.softkeys["sk_mo"] = old_surface.softkeys["sk_mo"] surface.softkeys["sk_edit"] = old_surface.softkeys["sk_edit"] surface.softkeys["sk_clipboard"] = old_surface.softkeys["sk_clipboard"] surface.softkeys["sk_url"] = old_surface.softkeys["sk_url"] surface.softkeys["sk_voice"] = old_surface.softkeys["sk_voice"] surface.softkeys["sk_ent"] = old_surface.softkeys["sk_ent"] surface.softkeys["sk_bk"] = old_surface.softkeys["sk_bk"] surface.softkeys["sk_cancel"] = old_surface.softkeys["sk_cancel"] surface.softkeys["sk_quick_switcher"] = old_surface.softkeys["sk_quick_switcher"] surface.softkeys["sk_hw_mask"] = old_surface.softkeys["sk_hw_mask"] surface.softkeys["sk_clear_candidate"] = old_surface.softkeys["sk_clear_candidate"] surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_sp"] = si.new_softkey() surface.softkeys["sk_sp"].on_click = old_surface.softkeys["sk_sp"].on_click surface.softkeys["sk_sp"].on_long_press_multi = old_surface.softkeys["sk_sp"].on_long_press_multi end surface.template = "number" surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.touch_correct = false surface.support_mode = si.context.NUMBER + si.context.MATH surface.extra_elements = { "popup_revert", "popup_explicit" } sk_titles = { {"+", "1", "2", "3"}, {"-", "4", "5", "6"}, {"7", "8", "9","."}, {"/","*", "0","#"} } for i, row in _G.pairs(sk_titles) do for j, title in _G.pairs(row) do key = si.new_softkey() key.main_title = title key.on_click = function(key) local default_index = ca.get_default_index() if (not pi.range_exist(pi.L_RANGE_PENDING + pi.L_RANGE_CONFIRM + pi.L_RANGE_CURVE)) and (default_index ~= 0) then if ca.get_item_source(ca.get_item(default_index)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default_index) else ca.clear() end end si.input_string(key.main_title, false) end surface.softkeys["sk_" .. i .. "_" .. j] = key end end surface.softkeys["sk_back"] = ck.sk_back_to_keyboard surface.on_slip_left = nil surface.on_slip_right = nil return surface PK n5:QIDs; ; 5assets/number_right.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" local si = smartinput local ck = common_keys local pi = si.pending_input local ca = si.candidates local surface = si.new_surface("number_right") surface.on_load = function (old_surface) surface.explicit_inline = old_surface.explicit_inline surface.inline_strategy = old_surface.inline_strategy surface.resolve_mode = old_surface.resolve_mode surface.softkeys["sk_mo"] = old_surface.softkeys["sk_mo"] surface.softkeys["sk_edit"] = old_surface.softkeys["sk_edit"] surface.softkeys["sk_clipboard"] = old_surface.softkeys["sk_clipboard"] surface.softkeys["sk_url"] = old_surface.softkeys["sk_url"] surface.softkeys["sk_voice"] = old_surface.softkeys["sk_voice"] surface.softkeys["sk_ent"] = old_surface.softkeys["sk_ent"] surface.softkeys["sk_bk"] = old_surface.softkeys["sk_bk"] surface.softkeys["sk_cancel"] = old_surface.softkeys["sk_cancel"] surface.softkeys["sk_quick_switcher"] = old_surface.softkeys["sk_quick_switcher"] surface.softkeys["sk_hw_mask"] = old_surface.softkeys["sk_hw_mask"] surface.softkeys["sk_clear_candidate"] = old_surface.softkeys["sk_clear_candidate"] surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_sp"] = si.new_softkey() surface.softkeys["sk_sp"].on_click = old_surface.softkeys["sk_sp"].on_click surface.softkeys["sk_sp"].on_long_press_multi = old_surface.softkeys["sk_sp"].on_long_press_multi end surface.template = "number_right" surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.touch_correct = false surface.support_mode = si.context.NUMBER + si.context.MATH surface.extra_elements = { "popup_revert", "popup_explicit" } sk_titles = { {"+", "1", "2", "3"}, {"-", "4", "5", "6"}, {".", "7", "8", "9"}, {"/", "*", "0", "#"} } for i, row in _G.pairs(sk_titles) do for j, title in _G.pairs(row) do key = si.new_softkey() key.main_title = title key.on_click = function(key) local default_index = ca.get_default_index() if (not pi.range_exist(pi.L_RANGE_PENDING + pi.L_RANGE_CONFIRM + pi.L_RANGE_CURVE)) and (default_index ~= 0) then if ca.get_item_source(ca.get_item(default_index)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default_index) else ca.clear() end end si.input_string(key.main_title, false) end surface.softkeys["sk_" .. i .. "_" .. j] = key end end surface.softkeys["sk_back"] = ck.sk_back_to_keyboard surface.on_slip_left = nil surface.on_slip_right = nil return surface PK n5:QH@5assets/oriya.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("OR", "oriya") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, { surface_id = pkg.oriyav5 .. "oriya_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.oriyav5 .. "oriya_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.oriyav5 .. "oriya_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.oriyav5 .. "oriya_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.oriyav5 .. "oriya_traits.trt.png" lng.statistic_alias = "oriya" lng.categories[si.language.category.FASTSWITCH] = "oriya" lng.categories[si.language.category.SUBTYPE] = "oriya" lng.categories[si.language.category.MIXINPUT] = "oriya" lng.categories[si.language.category.CELLDICT] = "oriya" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "oriya" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.oriyav5 .. "oriya.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q !5assets/oriya_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "",}, {"", "", "", "", "", "", "", "", "", "", "",}, {"", "", "", "", "", "", "", "", "", "", "",}, {"", "", "", "", "", "", "", "",}, } local shift_inputs local main_inputs = { {"୧", "୨", "୩", "୪", "୫", "୬", "୭", "୮", "୯", "୦", "ୃ",}, {"ୌ", "ୈ", "ା", "ୀ", "ୂ", "ବ", "ହ", "ଗ", "ଦ", "ଜ", "ଡ",}, {"ୋ", "େ", "୍", "ି", "ୁ", "ପ", "ର", "କ", "ତ","ଚ","ଟ",}, {"ୟ", "ଂ", "ମ", "ନ", "ବ", "ଲ", "ସ", "ଯ",}, } local input_type = si.input_type() template = "oriya_soft_full_international" shift_inputs = nil local s = sf.new_full_keyboard( "oriya_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.oriyav5 .. "oriya_soft_qwerty2.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_bn s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_oriya s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return sPK n5:QA A !5assets/oriya_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "",}, {"", "", "", "", "", "", "", "", "", "", "",}, {"", "", "", "", "", "", "", "", "", "", "",}, {"", "", "", "", "", "", "", "",}, } local shift_inputs local main_inputs = { {"୍", "ର", "ର୍", "ଜ୍ଞ", "ତ୍ର", "କ୍ଷ", "ଶ୍ର", "ଃ", "ଋ", "ଞ", "଼",}, {"ଔ", "ଐ", "ଆ", "ଈ", "ଊ", "ଭ", "ଙ", "ଘ", "ଧ", "ଝ", "ଢ",}, {"ଓ", "ଏ", "ଅ", "ଇ", "ଉ", "ଫ", "ର", "ଖ", "ଥ", "ଛ", "ଠ",}, {"ୱ", "ଁ", "ଣ", "ଳ", "ଶ", "ଲ", "ଷ", "ଯ଼",} } local input_type = si.input_type() template = "oriya_soft_full_international" shift_inputs = nil local s = sf.new_full_keyboard( "oriya_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.oriyav5 .. "oriya_soft_qwerty1.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end local sk_1_3 = s.softkeys["sk_1_3"] sk_1_3.on_long_press_once = function() ck.show_expand_symbols({'3'}, 1) end local sk_1_4 = s.softkeys["sk_1_4"] sk_1_4.on_long_press_once = function() ck.show_expand_symbols({'4'}, 1) end local sk_1_5 = s.softkeys["sk_1_5"] sk_1_5.on_long_press_once = function() ck.show_expand_symbols({'5'}, 1) end local sk_1_6 = s.softkeys["sk_1_6"] sk_1_6.on_long_press_once = function() ck.show_expand_symbols({'6'}, 1) end local sk_1_7 = s.softkeys["sk_1_7"] sk_1_7.on_long_press_once = function() ck.show_expand_symbols({'7'}, 1) end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_bn s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_oriya s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QB~l55!5assets/oriya_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.oriya_full_qwertz_main1 local script_inputs = kb.oriya_full_qwertz_script1 local expand_long_press_inputs = kb.oriya_full_qwertz_expand_long_press_input1 local input_type = si.input_type() template = "oriya_soft_qwertz_full_international" local s = sf.new_full_keyboard( "oriya_soft_qwertz1", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.template = template s.match_surface = pkg.oriyav5 .. "oriya_soft_qwertz2.sur.png" s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_bn s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_oriya s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return sPK n5:Q?rhh!5assets/oriya_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.oriya_full_qwertz_main2 local script_inputs = kb.oriya_full_qwertz_script2 local expand_long_press_inputs = kb.oriya_full_qwertz_expand_long_press_input2 local input_type = si.input_type() template = "oriya_soft_qwertz2_full_international" local s = sf.new_full_keyboard( "oriya_soft_qwertz2", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.template = template s.match_surface = pkg.oriyav5 .. "oriya_soft_qwertz1.sur.png" s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end function on_long_press(sk) if si.handwrite_mask_visible() then return sk.on_click(sk) end local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local key1 = si.new_softkey() key1.main_title = sk.main_title key1.main_input = sk.main_input key1.on_click = full_on_click_commit sur.softkeys[1] = key1 si.popup_surface(sur) end for j = 1, 10 do local sk = s.softkeys["sk_" .. 1 .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end for j = 1, 6 do local sk = s.softkeys["sk_" .. 2 .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end for j = 7, 9 do local sk = s.softkeys["sk_" .. 2 .. "_" .. j] sk.on_click = full_on_click_commit sk.on_long_press_once = on_long_press end local sk_2_10 = s.softkeys["sk_2_10"] sk_2_10.on_click = full_on_click sk_2_10.support_expand_char_type = si.expand_char_type.EXPAND_INPUT for j = 1, 10 do local sk = s.softkeys["sk_" .. 3 .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end for j = 1, 10 do local sk = s.softkeys["sk_" .. 4 .. "_" .. j] sk.on_click = full_on_click_commit sk.on_long_press_once = on_long_press end local sk_5_1 = s.softkeys["sk_5_1"] sk_5_1.on_click = full_on_click sk_5_1.support_expand_char_type = si.expand_char_type.EXPAND_INPUT for j = 2, 3 do local sk = s.softkeys["sk_" .. 5 .. "_" .. j] sk.on_click = full_on_click_commit sk.on_long_press_once = on_long_press end for j = 4, 8 do local sk = s.softkeys["sk_" .. 5 .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_bn s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_oriya s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q,,5assets/oriya_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = 0x0b01 local z_code = 0x0b71 local A_code = 0x0b01 local Z_code = 0x0b71 local special_semivowel_code = si.u16code("୍", 1) local case_insensitive_letters = { } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("।", 1)] = "।", } local special_semivowel_list = { "୍", } local special_vowel_list = { "ା", "ି", "ୀ", "ୁ", "ୂ", "ୃ", "େ", "ୈ", "ୋ", "ୄ", "ଁ", "ଂ", "ଃ", "ୌ", "ଅ", "ଆ", "ଇ", "ଈ", "ଉ", "ଊ", "ଋ", "ଏ", "ଐ", "ଓ", "ୠ", "ଔ", } local special_consonant_list = { "କ", "ଖ", "ଗ", "ଘ", "ଙ", "ଚ", "ଛ", "ଜ", "ଝ", "ଞ", "ଟ", "ଠ", "ଡ", "ଢ", "ଣ", "ତ", "ଥ", "ଦ", "ଧ", "ନ", "ପ", "ଫ", "ବ", "ଵ", "ଭ", "ମ", "ଯ", "ୟ", "ର", "ଳ", "ଲ", "ୱ", "ଶ", "ଷ", "ସ", "ହ", } local special_double_tone_list = { "଼", } local special_script_list = { "୍", "ା", "ି", "ୀ", "ୁ", "ୂ", "ୃ", "େ", "ୈ", "ୋ", "ୄ", "ୌ", } local special_script_dictionary = { [si.u16code("୍", 1)] = "ଅ", [si.u16code("ା", 1)] = "ଆ", [si.u16code("ି", 1)] = "ଇ", [si.u16code("ୀ", 1)] = "ଈ", [si.u16code("ୁ", 1)] = "ଉ", [si.u16code("ୂ", 1)] = "ଊ", [si.u16code("ୃ", 1)] = "ଋ", [si.u16code("େ", 1)] = "ଏ", [si.u16code("ୈ", 1)] = "ଐ", [si.u16code("ୋ", 1)] = "ଓ", [si.u16code("ୄ", 1)] = "ୠ", [si.u16code("ୌ", 1)] = "ଔ", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_double_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(5) if not si.is_empty(last_text_from_user_input) then if traits.is_contain_triple_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local string_len = si.get_string_length(last_text_from_user_input) if string_len > 3 then last_text_from_user_input = _G.string.sub(last_text_from_user_input, string_len-2, string_len) end if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.get_normal_script_main_character(script) local string_len = si.get_string_length(script) if string_len > 1 then return script end local code = si.u16code(script, 1) if traits.is_special_script_case(code) then return special_script_dictionary[code] end return script; end function traits.is_contain_vowel_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true end end return false end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if code_se == special_semivowel_code and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_triple_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 5 then return false end local code_se = si.u16code(str, 2) local code_fo = si.u16code(str, 4) if code_se == special_semivowel_code and code_fo == special_semivowel_code then local code_fr = si.u16code(str, 1) local code_th = si.u16code(str, 3) local code_fi = si.u16code(str, 5) if traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) and traits.is_special_consonant_case(code_fi) then return true end return false end return false end function traits.is_contain_double_tone_case(str) local double_tone_num = 0 local code = si.u16code(str, 1) for c in si.u16_iter(str) do if traits.is_special_double_tone_case(c) then double_tone_num = double_tone_num + 1 end end if double_tone_num >= 2 or traits.is_special_double_tone_case(code) then return true end return false end function traits.is_special_script_case(c) for i, v in ipairs(special_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_double_tone_case(c) for i, v in ipairs(special_double_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_oriya_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_oriya_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_oriya_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_oriya_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end function traits.is_punctuation_character(c) if c == si.u16code("।", 1) then return true end return false end return traits PK n5:QCss5assets/oromo.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("OM", "oromo") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.oromov5 .. "oromo_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.oromov5 .. "oromo_traits.trt.png" lng.statistic_alias = "oromo" lng.categories[si.language.category.FASTSWITCH] = "english" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "oromo" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "oromo" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QⲴ^ 5assets/oromo_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "oromo_soft_qwerty_international_without_dict" local alt_inputs = kb.oromo_full_qwerty_alt_international local shift_inputs = kb.oromo_full_qwerty_shift_international local main_inputs = kb.oromo_full_qwerty_main local s = sf.new_full_keyboard( "oromo_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qۿ~ee5assets/oromo_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local traits = si.new_language_traits() local ct = common_traits traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "ā", "ą", "æ", "ç", "č", "ć", "è", "é", "ê", "ë", "ē", "ė", "ę", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "ù", "û", "ü", "ú", "ū", "ñ", "ń", "ß", "ś", "š", "ÿ", "ÿ", "ž", "ź", "ż", "ĺ", "ľ", "ł", "ď", "đ", "ŕ", "ř", "ť", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Ā", "Ą", "Æ", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ē", "Ė", "Ę", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "Ù", "Û", "Ü", "Ú", "Ū", "Ñ", "Ń", "ß", "Ś", "Š", "Ÿ", "Ÿ", "Ž", "Ź", "Ż", "Ĺ", "Ľ", "Ł", "Ď", "Đ", "Ŕ", "Ř", "Ť", } local accent_letter_dictionary = { [string.byte("a")] = "äàâáãåāąæ", [string.byte("c")] = "çčć", [string.byte("e")] = "ëèéêēėę", [string.byte("i")] = "ïîíìīį", [string.byte("o")] = "öôóòõōœø", [string.byte("u")] = "üùûúū", [string.byte("n")] = "ñń", [string.byte("s")] = "ßśš", [string.byte("y")] = "ÿ", [string.byte("z")] = "žźż", [string.byte("l")] = "ĺľł", [string.byte("d")] = "ďđ", [string.byte("r")] = "ŕř", [string.byte("t")] = "ť", [string.byte("A")] = "ÄÀÂÁÃÅĀĄÆ", [string.byte("C")] = "ÇČĆ", [string.byte("E")] = "ËÈÉÊĒĖĘ", [string.byte("I")] = "ÏÎÍÌĪĮ", [string.byte("O")] = "ÖÔÓÒÕŌŒØ", [string.byte("U")] = "ÜÙÛÚŪ", [string.byte("N")] = "ÑŃ", [string.byte("S")] = "ߌŠ", [string.byte("Y")] = "Ÿ", [string.byte("Z")] = "ŽŹŻ", [string.byte("L")] = "ĹĽŁ", [string.byte("D")] = "ĎĐ", [string.byte("R")] = "ŔŘ", [string.byte("T")] = "Ť", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q2bb5assets/packages.lua.pngUT n_n_n_ WГWГWГrequire "smartinput" local P = {} P._G = _G if _REQUIREDNAME == nil then packages = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local si = _G.smartinput if si.is_international_package() then pinyin = "com.cootek.smartinputv5.language.chs:" stroke = "com.cootek.smartinputv5.language.chs:" handwrite = "com.cootek.smartinputv5.language.chs.handwrite:" pinyinv5 = "com.cootek.smartinputv5.language.v5.chs:" strokev5 = "com.cootek.smartinputv5.language.v5.chs:" handwritev5 = "com.cootek.smartinputv5.language.v5.chs.handwrite:" pinyin_oem = "com.cootek.smartinputv5.language.oem.chs:" stroke_oem = "com.cootek.smartinputv5.language.oem.chs:" handwrite_oem = "com.cootek.smartinputv5.language.oem.chs.handwrite:" else pinyin = "" stroke = "" handwrite = "" pinyinv5 = "" strokev5 = "" handwritev5 = "" pinyin_oem = "" stroke_oem = "" handwrite_oem = "" end --the same as the app id of the specific language default_path = { ENGLISH = "cootek.smartinput.android.language.english/", PINYIN = "cootek.smartinput.android.language.pinyin/", --same with pinyin STROKE = "cootek.smartinput.android.language.pinyin/", HANDWRITE = "cootek.smartinput.android.language.handwrite/", } english = "com.cootek.smartinputv5.language.english:" wubi = "com.cootek.smartinputv5.language.wubi:" cangjie = "com.cootek.smartinputv5.language.cangjie:" cht = "com.cootek.smartinputv5.language.cht:" dutch = "com.cootek.smartinputv5.language.dutch:" french = "com.cootek.smartinputv5.language.french:" german = "com.cootek.smartinputv5.language.german:" italian = "com.cootek.smartinputv5.language.italian:" polish = "com.cootek.smartinputv5.language.polish:" portuguesebr = "com.cootek.smartinputv5.language.portuguesebr:" portuguesept = "com.cootek.smartinputv5.language.portuguesept:" russian = "com.cootek.smartinputv5.language.russian:" spanish = "com.cootek.smartinputv5.language.spanish:" swedish = "com.cootek.smartinputv5.language.swedish:" turkish = "com.cootek.smartinputv5.language.turkish:" indonesian = "com.cootek.smartinputv5.language.indonesian:" croatian = "com.cootek.smartinputv5.language.croatian:" czech = "com.cootek.smartinputv5.language.czech:" slovak = "com.cootek.smartinputv5.language.slovak:" slovenian = "com.cootek.smartinputv5.language.slovenian:" hungarian = "com.cootek.smartinputv5.language.hungarian:" malayan = "com.cootek.smartinputv5.language.malayan:" romanian = "com.cootek.smartinputv5.language.romanian:" danish = "com.cootek.smartinputv5.language.danish:" finnish = "com.cootek.smartinputv5.language.finnish:" norwegian = "com.cootek.smartinputv5.language.norwegian:" bulgarian = "com.cootek.smartinputv5.language.bulgarian:" greek = "com.cootek.smartinputv5.language.greek:" ukrainian = "com.cootek.smartinputv5.language.ukrainian:" englishgb = "com.cootek.smartinputv5.language.englishgb:" englishus = "com.cootek.smartinputv5.language.englishus:" arabic = "com.cootek.smartinputv5.language.arabic:" thai = "com.cootek.smartinputv5.language.thai:" vietnam = "com.cootek.smartinputv5.language.vietnam:" vietnamsimple = "com.cootek.smartinputv5.language.vietnamsimple:" albanian = "com.cootek.smartinputv5.language.albanian:" catalan = "com.cootek.smartinputv5.language.catalan:" estonian = "com.cootek.smartinputv5.language.estonian:" icelandic = "com.cootek.smartinputv5.language.icelandic:" kazakh = "com.cootek.smartinputv5.language.kazakh:" latvian = "com.cootek.smartinputv5.language.latvian:" lithuanian = "com.cootek.smartinputv5.language.lithuanian:" macedonian = "com.cootek.smartinputv5.language.macedonian:" serbian = "com.cootek.smartinputv5.language.serbian:" serbianlatin = "com.cootek.smartinputv5.language.serbianlatin:" tagalog = "com.cootek.smartinputv5.language.tagalog:" hindi = "com.cootek.smartinputv5.language.hindi:" basque = "com.cootek.smartinputv5.language.basque:" galician = "com.cootek.smartinputv5.language.galician:" malagasy = "com.cootek.smartinputv5.language.malagasy:" hebrew = "com.cootek.smartinputv5.language.hebrew:" bengali = "com.cootek.smartinputv5.language.bengali:" persian = "com.cootek.smartinputv5.language.persian:" urdu = "com.cootek.smartinputv5.language.urdu:" uyghur = "com.cootek.smartinputv5.language.uyghur:" laotian = "com.cootek.smartinputv5.language.laotian:" burmese = "com.cootek.smartinputv5.language.burmese:" simplecangjie = "com.cootek.smartinputv5.language.simplecangjie:" khmer = "com.cootek.smartinputv5.language.khmer:" bosnian = "com.cootek.smartinputv5.language.bosnian:" bosnianlatin = "com.cootek.smartinputv5.language.bosnianlatin:" tamil = "com.cootek.smartinputv5.language.tamil:" telugu = "com.cootek.smartinputv5.language.telugu:" korean = "com.cootek.smartinputv5.language.korean:" tibetan = "com.cootek.smartinputv5.language.tibetan:" spanishlatin = "com.cootek.smartinputv5.language.spanishlatin:" spanishus = "com.cootek.smartinputv5.language.spanishus:" marathi = "com.cootek.smartinputv5.language.marathi:" hinglish = "com.cootek.smartinputv5.language.hinglish:" zulu = "com.cootek.smartinputv5.language.zulu:" irish = "com.cootek.smartinputv5.language.irish:" punjabi = "com.cootek.smartinputv5.language.punjabi:" kannada = "com.cootek.smartinputv5.language.kannada:" malayalam = "com.cootek.smartinputv5.language.malayalam:" gujarati = "com.cootek.smartinputv5.language.gujarati:" assamese = "com.cootek.smartinputv5.language.assamese:" afrikaans = "com.cootek.smartinputv5.language.afrikaans:"; amharic = "com.cootek.smartinputv5.language.amharic:"; azerbaijani = "com.cootek.smartinputv5.language.azerbaijani:" zawgyi = "com.cootek.smartinputv5.language.zawgyi:" swahili = "com.cootek.smartinputv5.language.swahili:" hausa = "com.cootek.smartinputv5.language.hausa:" belarusian = "com.cootek.smartinputv5.language.belarusian:" nepali = "com.cootek.smartinputv5.language.nepali:" nepalitrad = "com.cootek.smartinputv5.language.nepalitrad:" sinhala = "com.cootek.smartinputv5.language.sinhala:" uzbek = "com.cootek.smartinputv5.language.uzbek:" oriya = "com.cootek.smartinputv5.language.oriya:" hindilatin = "com.cootek.smartinputv5.language.hindilatin:" indianbodo = "com.cootek.smartinputv5.language.indianbodo:" indianmanipuri = "com.cootek.smartinputv5.language.indianmanipuri" indiandogri = "com.cootek.smartinputv5.language.indiandogri:" indiankashmiri = "com.cootek.smartinputv5.language.indiankashmiri:" indiankonkani = "com.cootek.smartinputv5.language.indiankonkani:" indiankonkanikn = "com.cootek.smartinputv5.language.indiankonkanikn:" indianmaithili = "com.cootek.smartinputv5.language.indianmaithili:" indiansanskrit = "com.cootek.smartinputv5.language.indiansanskrit:" indiansanthali = "com.cootek.smartinputv5.language.indiansanthali:" indiansindhi = "com.cootek.smartinputv5.language.indiansindhi:" armenian = "com.cootek.smartinputv5.language.armenian:" georgian = "com.cootek.smartinputv5.language.georgian:" kirghiz = "com.cootek.smartinputv5.language.kirghiz:" javanese = "com.cootek.smartinputv5.language.javanese:" tatar = "com.cootek.smartinputv5.language.tatar:" japanese = "com.cootek.smartinputv5.language.japanese:" yoruba = "com.cootek.smartinputv5.language.yoruba:" kinyarwanda = "com.cootek.smartinputv5.language.kinyarwanda:" oromo = "com.cootek.smartinputv5.language.oromo:" tigre = "com.cootek.smartinputv5.language.tigre:" pashto = "com.cootek.smartinputv5.language.pashto:" kurdish = "com.cootek.smartinputv5.language.kurdish:" tifinagh = "com.cootek.smartinputv5.language.tifinagh:" basesunda = "com.cootek.smartinputv5.language.basesunda:" somali = "com.cootek.smartinputv5.language.somali:" santhali = "com.cootek.smartinputv5.language.santhali:" manipuri = "com.cootek.smartinputv5.language.manipuri:" englishv5 = "com.cootek.smartinputv5.language.v5.english:" wubiv5 = "com.cootek.smartinputv5.language.v5.wubi:" cangjiev5 = "com.cootek.smartinputv5.language.v5.cangjie:" chtv5 = "com.cootek.smartinputv5.language.v5.cht:" dutchv5 = "com.cootek.smartinputv5.language.v5.dutch:" frenchv5 = "com.cootek.smartinputv5.language.v5.french:" germanv5 = "com.cootek.smartinputv5.language.v5.german:" italianv5 = "com.cootek.smartinputv5.language.v5.italian:" polishv5 = "com.cootek.smartinputv5.language.v5.polish:" portuguesebrv5 = "com.cootek.smartinputv5.language.v5.portuguesebr:" portugueseptv5 = "com.cootek.smartinputv5.language.v5.portuguesept:" russianv5 = "com.cootek.smartinputv5.language.v5.russian:" spanishv5 = "com.cootek.smartinputv5.language.v5.spanish:" swedishv5 = "com.cootek.smartinputv5.language.v5.swedish:" turkishv5 = "com.cootek.smartinputv5.language.v5.turkish:" indonesianv5 = "com.cootek.smartinputv5.language.v5.indonesian:" croatianv5 = "com.cootek.smartinputv5.language.v5.croatian:" czechv5 = "com.cootek.smartinputv5.language.v5.czech:" slovakv5 = "com.cootek.smartinputv5.language.v5.slovak:" slovenianv5 = "com.cootek.smartinputv5.language.v5.slovenian:" hungarianv5 = "com.cootek.smartinputv5.language.v5.hungarian:" malayanv5 = "com.cootek.smartinputv5.language.v5.malayan:" romanianv5 = "com.cootek.smartinputv5.language.v5.romanian:" danishv5 = "com.cootek.smartinputv5.language.v5.danish:" finnishv5 = "com.cootek.smartinputv5.language.v5.finnish:" norwegianv5 = "com.cootek.smartinputv5.language.v5.norwegian:" bulgarianv5 = "com.cootek.smartinputv5.language.v5.bulgarian:" greekv5 = "com.cootek.smartinputv5.language.v5.greek:" ukrainianv5 = "com.cootek.smartinputv5.language.v5.ukrainian:" englishgbv5 = "com.cootek.smartinputv5.language.v5.englishgb:" englishusv5 = "com.cootek.smartinputv5.language.v5.englishus:" arabicv5 = "com.cootek.smartinputv5.language.v5.arabic:" thaiv5 = "com.cootek.smartinputv5.language.v5.thai:" vietnamv5 = "com.cootek.smartinputv5.language.v5.vietnam:" vietnamsimplev5 = "com.cootek.smartinputv5.language.v5.vietnamsimple:" albanianv5 = "com.cootek.smartinputv5.language.v5.albanian:" catalanv5 = "com.cootek.smartinputv5.language.v5.catalan:" estonianv5 = "com.cootek.smartinputv5.language.v5.estonian:" icelandicv5 = "com.cootek.smartinputv5.language.v5.icelandic:" kazakhv5 = "com.cootek.smartinputv5.language.v5.kazakh:" latvianv5 = "com.cootek.smartinputv5.language.v5.latvian:" lithuanianv5 = "com.cootek.smartinputv5.language.v5.lithuanian:" macedonianv5 = "com.cootek.smartinputv5.language.v5.macedonian:" serbianv5 = "com.cootek.smartinputv5.language.v5.serbian:" serbianlatinv5 = "com.cootek.smartinputv5.language.v5.serbianlatin:" tagalogv5 = "com.cootek.smartinputv5.language.v5.tagalog:" hindiv5 = "com.cootek.smartinputv5.language.v5.hindi:" basquev5 = "com.cootek.smartinputv5.language.v5.basque:" galicianv5 = "com.cootek.smartinputv5.language.v5.galician:" malagasyv5 = "com.cootek.smartinputv5.language.v5.malagasy:" hebrewv5 = "com.cootek.smartinputv5.language.v5.hebrew:" bengaliv5 = "com.cootek.smartinputv5.language.v5.bengali:" persianv5 = "com.cootek.smartinputv5.language.v5.persian:" urduv5 = "com.cootek.smartinputv5.language.v5.urdu:" uyghurv5 = "com.cootek.smartinputv5.language.v5.uyghur:" laotianv5 = "com.cootek.smartinputv5.language.v5.laotian:" burmesev5 = "com.cootek.smartinputv5.language.v5.burmese:" simplecangjiev5 = "com.cootek.smartinputv5.language.v5.simplecangjie:" khmerv5 = "com.cootek.smartinputv5.language.v5.khmer:" bosnianv5 = "com.cootek.smartinputv5.language.v5.bosnian:" bosnianlatinv5 = "com.cootek.smartinputv5.language.v5.bosnianlatin:" tamilv5 = "com.cootek.smartinputv5.language.v5.tamil:" teluguv5 = "com.cootek.smartinputv5.language.v5.telugu:" koreanv5 = "com.cootek.smartinputv5.language.v5.korean:" tibetanv5 = "com.cootek.smartinputv5.language.v5.tibetan:" spanishlatinv5 = "com.cootek.smartinputv5.language.v5.spanishlatin:" spanishusv5 = "com.cootek.smartinputv5.language.v5.spanishus:" marathiv5 = "com.cootek.smartinputv5.language.v5.marathi:" hinglishv5 = "com.cootek.smartinputv5.language.v5.hinglish:" zuluv5 = "com.cootek.smartinputv5.language.v5.zulu:" irishv5 = "com.cootek.smartinputv5.language.v5.irish:" punjabiv5 = "com.cootek.smartinputv5.language.v5.punjabi:" kannadav5 = "com.cootek.smartinputv5.language.v5.kannada:" malayalamv5 = "com.cootek.smartinputv5.language.v5.malayalam:" gujarativ5 = "com.cootek.smartinputv5.language.v5.gujarati:" assamesev5 = "com.cootek.smartinputv5.language.v5.assamese:" afrikaansv5 = "com.cootek.smartinputv5.language.v5.afrikaans:"; amharicv5 = "com.cootek.smartinputv5.language.v5.amharic:"; azerbaijaniv5 = "com.cootek.smartinputv5.language.v5.azerbaijani:"; zawgyiv5 = "com.cootek.smartinputv5.language.v5.zawgyi:"; swahiliv5 = "com.cootek.smartinputv5.language.v5.swahili:"; hausav5 = "com.cootek.smartinputv5.language.v5.hausa:"; belarusianv5 = "com.cootek.smartinputv5.language.v5.belarusian:"; nepaliv5 = "com.cootek.smartinputv5.language.v5.nepali:"; nepalitradv5 = "com.cootek.smartinputv5.language.v5.nepalitrad:"; sinhalav5 = "com.cootek.smartinputv5.language.v5.sinhala:"; uzbekv5 = "com.cootek.smartinputv5.language.v5.uzbek:"; oriyav5 = "com.cootek.smartinputv5.language.v5.oriya:"; dutchbev5 = "com.cootek.smartinputv5.language.v5.dutchbe:" frenchbev5 = "com.cootek.smartinputv5.language.v5.frenchbe:" frenchcav5 = "com.cootek.smartinputv5.language.v5.frenchca:" frenchchv5 = "com.cootek.smartinputv5.language.v5.frenchch:" germanchv5 = "com.cootek.smartinputv5.language.v5.germanch:" italianchv5 = "com.cootek.smartinputv5.language.v5.italianch:" hindilatinv5 = "com.cootek.smartinputv5.language.v5.hindilatin:" indianbodov5 = "com.cootek.smartinputv5.language.v5.indianbodo:" indianmanipuriv5 = "com.cootek.smartinputv5.language.v5.indianmanipuri:" indiandogriv5 = "com.cootek.smartinputv5.language.v5.indiandogri:" indiankashmiriv5 = "com.cootek.smartinputv5.language.v5.indiankashmiri:" indiankonkaniv5 = "com.cootek.smartinputv5.language.v5.indiankonkani:" indiankonkaniknv5 = "com.cootek.smartinputv5.language.v5.indiankonkanikn:" indianmaithiliv5 = "com.cootek.smartinputv5.language.v5.indianmaithili:" indiansanskritv5 = "com.cootek.smartinputv5.language.v5.indiansanskrit:" indiansanthaliv5 = "com.cootek.smartinputv5.language.v5.indiansanthali:" indiansindhiv5 = "com.cootek.smartinputv5.language.v5.indiansindhi:" armenianv5 = "com.cootek.smartinputv5.language.v5.armenian:" georgianv5 = "com.cootek.smartinputv5.language.v5.georgian:" kirghizv5 = "com.cootek.smartinputv5.language.v5.kirghiz:" javanesev5 = "com.cootek.smartinputv5.language.v5.javanese:" tatarv5 = "com.cootek.smartinputv5.language.v5.tatar:" japanesev5 = "com.cootek.smartinputv5.language.v5.japanese:" yorubav5 = "com.cootek.smartinputv5.language.v5.yoruba:" kinyarwandav5 = "com.cootek.smartinputv5.language.v5.kinyarwanda:" oromov5 = "com.cootek.smartinputv5.language.v5.oromo:" tigrev5 = "com.cootek.smartinputv5.language.v5.tigre:" pashtov5 = "com.cootek.smartinputv5.language.v5.pashto:" kurdishv5 = "com.cootek.smartinputv5.language.v5.kurdish:" tifinaghv5 = "com.cootek.smartinputv5.language.v5.tifinagh:" basesundav5 = "com.cootek.smartinputv5.language.v5.basesunda:" somaliv5 = "com.cootek.smartinputv5.language.v5.somali:" santhaliv5 = "com.cootek.smartinputv5.language.v5.santhali:" manipuriv5 = "com.cootek.smartinputv5.language.v5.manipuri:" english_oem = "com.cootek.smartinputv5.language.oem.english:" wubi_oem = "com.cootek.smartinputv5.language.oem.wubi:" cangjie_oem = "com.cootek.smartinputv5.language.oem.cangjie:" cht_oem = "com.cootek.smartinputv5.language.oem.cht:" dutch_oem = "com.cootek.smartinputv5.language.oem.dutch:" french_oem = "com.cootek.smartinputv5.language.oem.french:" german_oem = "com.cootek.smartinputv5.language.oem.german:" italian_oem = "com.cootek.smartinputv5.language.oem.italian:" polish_oem = "com.cootek.smartinputv5.language.oem.polish:" portuguesebr_oem = "com.cootek.smartinputv5.language.oem.portuguesebr:" portuguesept_oem = "com.cootek.smartinputv5.language.oem.portuguesept:" russian_oem = "com.cootek.smartinputv5.language.oem.russian:" spanish_oem = "com.cootek.smartinputv5.language.oem.spanish:" swedish_oem = "com.cootek.smartinputv5.language.oem.swedish:" turkish_oem = "com.cootek.smartinputv5.language.oem.turkish:" indonesian_oem = "com.cootek.smartinputv5.language.oem.indonesian:" croatian_oem = "com.cootek.smartinputv5.language.oem.croatian:" czech_oem = "com.cootek.smartinputv5.language.oem.czech:" slovak_oem = "com.cootek.smartinputv5.language.oem.slovak:" slovenian_oem = "com.cootek.smartinputv5.language.oem.slovenian:" hungarian_oem = "com.cootek.smartinputv5.language.oem.hungarian:" malayan_oem = "com.cootek.smartinputv5.language.oem.malayan:" romanian_oem = "com.cootek.smartinputv5.language.oem.romanian:" danish_oem = "com.cootek.smartinputv5.language.oem.danish:" finnish_oem = "com.cootek.smartinputv5.language.oem.finnish:" norwegian_oem = "com.cootek.smartinputv5.language.oem.norwegian:" bulgarian_oem = "com.cootek.smartinputv5.language.oem.bulgarian:" greek_oem = "com.cootek.smartinputv5.language.oem.greek:" ukrainian_oem = "com.cootek.smartinputv5.language.oem.ukrainian:" englishgb_oem = "com.cootek.smartinputv5.language.oem.englishgb:" englishus_oem = "com.cootek.smartinputv5.language.oem.englishus:" arabic_oem = "com.cootek.smartinputv5.language.oem.arabic:" thai_oem = "com.cootek.smartinputv5.language.oem.thai:" vietnam_oem = "com.cootek.smartinputv5.language.oem.vietnam:" vietnamsimple_oem = "com.cootek.smartinputv5.language.oem.vietnamsimple:" albanian_oem = "com.cootek.smartinputv5.language.oem.albanian:" catalan_oem = "com.cootek.smartinputv5.language.oem.catalan:" estonian_oem = "com.cootek.smartinputv5.language.oem.estonian:" icelandic_oem = "com.cootek.smartinputv5.language.oem.icelandic:" kazakh_oem = "com.cootek.smartinputv5.language.oem.kazakh:" latvian_oem = "com.cootek.smartinputv5.language.oem.latvian:" lithuanian_oem = "com.cootek.smartinputv5.language.oem.lithuanian:" macedonian_oem = "com.cootek.smartinputv5.language.oem.macedonian:" serbian_oem = "com.cootek.smartinputv5.language.oem.serbian:" serbianlatin_oem = "com.cootek.smartinputv5.language.oem.serbianlatin:" tagalog_oem = "com.cootek.smartinputv5.language.oem.tagalog:" hindi_oem = "com.cootek.smartinputv5.language.oem.hindi:" basque_oem = "com.cootek.smartinputv5.language.oem.basque:" galician_oem = "com.cootek.smartinputv5.language.oem.galician:" malagasy_oem = "com.cootek.smartinputv5.language.oem.malagasy:" hebrew_oem = "com.cootek.smartinputv5.language.oem.hebrew:" bengali_oem = "com.cootek.smartinputv5.language.oem.bengali:" persian_oem = "com.cootek.smartinputv5.language.oem.persian:" urdu_oem = "com.cootek.smartinputv5.language.oem.urdu:" uyghur_oem = "com.cootek.smartinputv5.language.oem.uyghur:" laotian_oem = "com.cootek.smartinputv5.language.oem.laotian:" burmese_oem = "com.cootek.smartinputv5.language.oem.burmese:" simplecangjie_oem = "com.cootek.smartinputv5.language.oem.simplecangjie:" khmer_oem = "com.cootek.smartinputv5.language.oem.khmer:" bosnian_oem = "com.cootek.smartinputv5.language.oem.bosnian:" bosnianlatin_oem = "com.cootek.smartinputv5.language.oem.bosnianlatin:" tamil_oem = "com.cootek.smartinputv5.language.oem.tamil:" telugu_oem = "com.cootek.smartinputv5.language.oem.telugu:" korean_oem = "com.cootek.smartinputv5.language.oem.korean:" tibetan_oem = "com.cootek.smartinputv5.language.oem.tibetan:" spanishlatin_oem = "com.cootek.smartinputv5.language.oem.spanishlatin:" spanishus_oem = "com.cootek.smartinputv5.language.oem.spanishus:" marathi_oem = "com.cootek.smartinputv5.language.oem.marathi:" hinglish_oem = "com.cootek.smartinputv5.language.oem.hinglish:" zulu_oem = "com.cootek.smartinputv5.language.oem.zulu:" irish_oem = "com.cootek.smartinputv5.language.oem.irish:" punjabi_oem = "com.cootek.smartinputv5.language.oem.punjabi:" kannada_oem = "com.cootek.smartinputv5.language.oem.kannada:" malayalam_oem = "com.cootek.smartinputv5.language.oem.malayalam:" gujarati_oem = "com.cootek.smartinputv5.language.oem.gujarati:" assamese_oem = "com.cootek.smartinputv5.language.oem.assamese:" afrikaans_oem = "com.cootek.smartinputv5.language.oem.afrikaans:"; amharic_oem = "com.cootek.smartinputv5.language.oem.amharic:"; azerbaijani_oem = "com.cootek.smartinputv5.language.oem.azerbaijani:"; zawgyi_oem = "com.cootek.smartinputv5.language.oem.zawgyi:"; swahili_oem = "com.cootek.smartinputv5.language.oem.swahili:"; hausa_oem = "com.cootek.smartinputv5.language.oem.hausa:"; belarusian_oem = "com.cootek.smartinputv5.language.oem.belarusian:"; nepali_oem = "com.cootek.smartinputv5.language.oem.nepali:"; nepalitrad_oem = "com.cootek.smartinputv5.language.oem.nepalitrad:"; sinhala_oem = "com.cootek.smartinputv5.language.oem.sinhala:"; uzbek_oem = "com.cootek.smartinputv5.language.oem.uzbek:"; oriya_oem = "com.cootek.smartinputv5.language.oem.oriya:"; dutchbe_oem = "com.cootek.smartinputv5.language.oem.dutchbe:" frenchbe_oem = "com.cootek.smartinputv5.language.oem.frenchbe:" frenchca_oem = "com.cootek.smartinputv5.language.oem.frenchca:" frenchch_oem = "com.cootek.smartinputv5.language.oem.frenchch:" germanch_oem = "com.cootek.smartinputv5.language.oem.germanch:" italianch_oem = "com.cootek.smartinputv5.language.oem.italianch:" hindilatin_oem = "com.cootek.smartinputv5.language.oem.hindilatin:" indianbodo_oem = "com.cootek.smartinputv5.language.oem.indianbodo:" indianmanipuri_oem = "com.cootek.smartinputv5.language.oem.indianmanipuri:" indiandogri_oem = "com.cootek.smartinputv5.language.oem.indiandogri:" indiankashmiri_oem = "com.cootek.smartinputv5.language.oem.indiankashmiri:" indiankonkani_oem = "com.cootek.smartinputv5.language.oem.indiankonkani:" indiankonkanikn_oem = "com.cootek.smartinputv5.language.oem.indiankonkanikn:" indianmaithili_oem = "com.cootek.smartinputv5.language.oem.indianmaithili:" indiansanskrit_oem = "com.cootek.smartinputv5.language.oem.indiansanskrit:" indiansanthali_oem = "com.cootek.smartinputv5.language.oem.indiansanthali:" indiansindhi_oem = "com.cootek.smartinputv5.language.oem.indiansindhi:" armenian_oem = "com.cootek.smartinputv5.language.oem.armenian:" georgian_oem = "com.cootek.smartinputv5.language.oem.georgian:" kirghiz_oem = "com.cootek.smartinputv5.language.oem.kirghiz:" javanese_oem = "com.cootek.smartinputv5.language.oem.javanese:" tatar_oem = "com.cootek.smartinputv5.language.oem.tatar:" japanese_oem = "com.cootek.smartinputv5.language.oem.japanese:" yoruba_oem = "com.cootek.smartinputv5.language.oem.yoruba:" kinyarwanda_oem = "com.cootek.smartinputv5.language.oem.kinyarwanda:" oromo_oem = "com.cootek.smartinputv5.language.oem.oromo:" tigre_oem = "com.cootek.smartinputv5.language.oem.tigre:" pashto_oem = "com.cootek.smartinputv5.language.oem.pashto:" kurdish_oem = "com.cootek.smartinputv5.language.oem.kurdish:" tifinagh_oem = "com.cootek.smartinputv5.language.oem.tifinagh:" basesunda_oem = "com.cootek.smartinputv5.language.oem.basesunda:" somali_oem = "com.cootek.smartinputv5.language.oem.somali:" santhali_oem = "com.cootek.smartinputv5.language.oem.santhali:" manipuri_oem = "com.cootek.smartinputv5.language.oem.manipuri:" return P PK n5:Qh3665assets/pashto.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("PS", "pashto") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.pashtov5 .. "pashto_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.pashtov5 .. "pashto_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.EUR, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.EUR, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.pashtov5 .. "pashto_traits.trt.png" lng.statistic_alias = "pashto" lng.categories[si.language.category.FASTSWITCH] = "english" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "pashto" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "pashto" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q   "5assets/pashto_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "pashto_soft_qwerty_international_without_dict" local alt_inputs = kb.pashto_full_qwerty_alt_international local shift_inputs local main_inputs = kb.pashto_full_qwerty_main1 local expand_long_press_inputs = kb.bn_full_qwerty_expand_long_press_input local input_type = si.input_type() local s = sf.new_full_keyboard( "pashto_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.match_surface = pkg.pashtov5 .. "pashto_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_ps s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q-Ė "5assets/pashto_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "pashto_soft_qwerty_international_without_dict_shift" local alt_inputs = kb.pashto_full_qwerty_alt_international local shift_inputs local main_inputs = kb.pashto_full_qwerty_main2 local expand_long_press_inputs = kb.bn_full_qwerty_expand_long_press_input local input_type = si.input_type() local s = sf.new_full_keyboard( "pashto_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.match_surface = pkg.pashtov5 .. "pashto_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_ps s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q|}}5assets/pashto_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local traits = si.new_language_traits() local ct = common_traits traits.separator = " " traits.case_sensitive = true local a_code = 0x0600 local z_code = 0x06FF local A_code = 0x0600 local Z_code = 0x06FF local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q! 5assets/persian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("FA", "Persian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.persianv5 .. "persian_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE , }, { surface_id = pkg.persianv5 .. "persian_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE , }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.ARABIC, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.ARABIC, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", currency_type = si.currency_type.ARABIC, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.persianv5 .. "persian_traits.trt.png" lng.statistic_alias = "persian" lng.categories[si.language.category.FASTSWITCH] = "persian" lng.categories[si.language.category.SUBTYPE] = "persian" lng.categories[si.language.category.MIXINPUT] = "persian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "persian" lng.categories[si.language.category.LAYOUT] = "persian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.persianv5 .. "persian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QzDZ #5assets/persian_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template local alt_inputs = kb.fa_full_alt local shift_inputs local main_inputs = kb.fa_full_main1 local input_type = si.input_type() template = "fa_soft_full_international" local s = sf.new_full_keyboard( "persian_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.persianv5 .. "persian_soft_qwerty2.sur.png" s.template = template s.language_key_symbol = "،" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_arabic s.softkeys["Dot"] = ck.sk_dot_arabic s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QPC #5assets/persian_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template local alt_inputs = kb.fa_full_alt local shift_inputs local main_inputs = kb.fa_full_main2 local input_type = si.input_type() template = "fa_soft_full_international" local s = sf.new_full_keyboard( "persian_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.persianv5 .. "persian_soft_qwerty1.sur.png" s.template = template s.language_key_symbol = "،" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_arabic s.softkeys["Dot"] = ck.sk_dot_arabic s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q@h8OO5assets/persian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false traits.right_to_left = true local a_code = si.u16code("چ", 1) local z_code = si.u16code("چ", 1) local A_code = si.u16code("چ", 1) local Z_code = si.u16code("چ", 1) local special_lower_list = { "ض", "ص", "ث", "ق", "ف", "غ", "ع", "ه", "خ", "ح", "ج", "چ", "ش", "س", "ی", "ب", "ل", "ا", "ت", "ن", "م", "ک", "ظ", "ط", "ز", "ر", "ذ", "د", "پ", "و", "ئ", "ْ", "", "ٍ", "ً", "ُ", "ِ", "َ", "ّ", "خ", "ح", "ج", "چ", "ؤ", "ئ", "ي", "إ", "أ", "آ", "ة", "ن", "م", "ک", "گ", "ك", "ط", "ژ", "ٓ", "ذ", "ٔ", "ء", "و", "ئ", } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_arabic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_arabic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_arabic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_arabic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:QΠA 5assets/phone_special.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" local si = smartinput local ck = common_keys local surface = si.new_surface("phone_special") surface.on_load = function (keyboard) surface.explicit_inline = keyboard.explicit_inline surface.inline_strategy = keyboard.inline_strategy surface.resolve_mode = keyboard.resolve_mode surface.touch_to_save = keyboard.touch_to_save surface.softkeys["sk_mo"] = keyboard.softkeys["sk_mo"] surface.softkeys["sk_edit"] = keyboard.softkeys["sk_edit"] surface.softkeys["sk_clipboard"] = keyboard.softkeys["sk_clipboard"] surface.softkeys["sk_url"] = keyboard.softkeys["sk_url"] surface.softkeys["sk_voice"] = keyboard.softkeys["sk_voice"] surface.softkeys["sk_ent"] = keyboard.softkeys["sk_ent"] surface.softkeys["sk_bk"] = keyboard.softkeys["sk_bk"] surface.softkeys["sk_cancel"] = keyboard.softkeys["sk_cancel"] surface.softkeys["sk_quick_switcher"] = keyboard.softkeys["sk_quick_switcher"] surface.softkeys["sk_clear_candidate"] = keyboard.softkeys["sk_clear_candidate"] surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_sp"] = si.new_softkey() surface.softkeys["sk_sp"].on_click = keyboard.softkeys["sk_sp"].on_click surface.softkeys["sk_sp"].on_long_press_multi = keyboard.softkeys["sk_sp"].on_long_press_multi surface.softkeys["sk_back"] = si.new_softkey(); surface.softkeys["sk_back"].on_click = function() si.back_to_keyboard() end end surface.template = "phone_special" surface.surface_type = si.surface_type.SOFT_SPECIAL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.support_mode = si.context.PHONE sk_titles = { {{"W", ";"}, "1", "2", "3", "-"}, {{"P", ","}, "4", "5", "6", "+"}, {"N", "7", "8", "9", "(", ")"}, {"*", "0", "#", "."} } for i, row in _G.pairs(sk_titles) do for j, title in _G.pairs(row) do key = si.new_softkey() if _G.type(title) == "table" then key.main_title = title[1] key.output_string = title[2] else key.main_title = title key.output_string = title end key.on_click = function(sk) si.input_string(sk.output_string, false) end surface.softkeys["sk_" .. i .. "_" .. j] = key end end surface.on_slip_left = nil surface.on_slip_right = nil return surface PK n5:Q둦5assets/pinyin_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q5assets/polish.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("PL", "Polish") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.polishv5 .. "polish_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.polishv5 .. "polish_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.polishv5 .. "polish_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.polishv5 .. "polish_traits.trt.png" lng.statistic_alias = "polish" lng.categories[si.language.category.FASTSWITCH] = "polish" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "polish" lng.categories[si.language.category.CELLDICT] = "polish" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "polish" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "pl" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.polishv5 .. "polish.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { -- QWERTY { file_name = pkg.polishv5 .. "polish_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, { file_name = pkg.polishv5 .. "polish_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q둦5assets/polish_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Qԋ_*#5assets/polish_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "polish_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q_I" " !5assets/polish_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "polish_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QP;NZZ 5assets/polish_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "polish_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q*FJJ5assets/polish_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local special_lower_list = { "à", "á", "â", "ã", "å", "ä", "æ", "ą", "ā", "é", "ê", "ë", "è", "ę", "ē", "ė", "ł", "ö", "ó", "ò", "ô", "õ", "ō", "œ", "ø", "ç", "ć", "č", "ń", "ñ", "ś", "š", "ß", "ź", "ż", "ž", } local special_upper_list = { "À", "Á", "Â", "Ã", "Å", "Ä", "Æ", "Ą", "Ā", "É", "Ê", "Ë", "È", "Ę", "Ē", "Ė", "Ł", "Ö", "Ó", "Ò", "Ô", "Õ", "Ō", "Œ", "Ø", "Ç", "Ć", "Č", "Ń", "Ñ", "Ś", "Š", "ß", "Ź", "Ż", "Ž", } local accent_dictionary = { [string.byte("a")] = "ąàáâãåäæā", [string.byte("e")] = "ęéêëèēė", [string.byte("l")] = "ł", [string.byte("o")] = "óöòôõōœø", [string.byte("c")] = "ćçč", [string.byte("n")] = "ńñ", [string.byte("s")] = "śšß", [string.byte("z")] = "źżž", [string.byte("A")] = "ĄÀÁÂÃÅÄÆĀ", [string.byte("E")] = "ĘÉÊËÈĒĖ", [string.byte("L")] = "Ł", [string.byte("O")] = "ÓÖÒÔÕŌŒØ", [string.byte("C")] = "ĆÇČ", [string.byte("N")] = "ŃÑ", [string.byte("S")] = "ŚŠß", [string.byte("Z")] = "ŹŻŽ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q:(5assets/portuguese_br.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("BR", "portuguesebr") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.portuguesebrv5 .. "portuguesebr_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.portuguesebrv5 .. "portuguesebr_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.portuguesebrv5 .. "portuguesebr_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.portuguesebrv5 .. "portuguesebr_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.portuguesebrv5 .. "portuguesebr_traits.trt.png" lng.statistic_alias = "portuguesebr" lng.categories[si.language.category.FASTSWITCH] = "portuguese_br" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "portuguese_br" lng.categories[si.language.category.CELLDICT] = "portuguese_br" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "portuguese_br" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "pt-br" lng.categories[si.language.category.EMOJI] = "portuguese" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.portuguesebrv5 .. "portuguese_br.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { -- QWERTY { file_name = pkg.portuguesebrv5 .. "portuguese_br_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.portuguesebrv5 .. "portuguese_br_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, { file_name = pkg.portuguesebrv5 .. "portuguese_br_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q5assets/portuguese_pt.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("PT", "portuguesept") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.portugueseptv5 .. "portuguesept_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.portugueseptv5 .. "portuguesept_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.portugueseptv5 .. "portuguesept_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.portugueseptv5 .. "portuguesept_traits.trt.png" lng.statistic_alias = "portuguesept" lng.categories[si.language.category.FASTSWITCH] = "portuguese_pt" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "portuguese_pt" lng.categories[si.language.category.CELLDICT] = "portuguese_pt" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "portuguese_pt" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "pt" lng.categories[si.language.category.EMOJI] = "portuguese" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.portugueseptv5 .. "portuguese_pt.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { -- QWERTY { file_name = pkg.portugueseptv5 .. "portuguese_pt_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, { file_name = pkg.portugueseptv5 .. "portuguese_pt_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q둦%5assets/portuguesebr_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q )5assets/portuguesebr_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "portuguesebr_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q9i2   '5assets/portuguesebr_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "portuguesebr_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qg/!K K '5assets/portuguesebr_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.portuguese_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "portuguese_soft_qwerty_email_uri_international" else template = "portuguese_soft_qwerty_international" end alt_inputs = kb.portuguese_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "portuguese_soft_qwerty_curve_email_uri_international" else template = "portuguese_soft_qwerty_curve_international" end alt_inputs = kb.portuguese_full_qwerty_alt_curve_international shift_inputs = kb.portuguese_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "portuguesebr_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QF ``&5assets/portuguesebr_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "portuguesebr_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q^Ҵ"5assets/portuguesebr_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "à", "á", "â", "ã", "å", "ä", "æ", "ª", "ç", "ć", "č", "é", "ê", "ë", "è", "ę", "ē", "ė", "í", "ì", "î", "ï", "ī", "į", "ó", "ò", "ô", "õ", "ō", "ö", "œ", "ø", "º", "ú", "ü", "ù", "û", "ū", } local special_upper_list = { "À", "Á", "Â", "Ã", "Å", "Ä", "Æ", "ª", "Ç", "Ć", "Č", "É", "Ê", "Ë", "È", "Ę", "Ē", "Ė", "Í", "Ì", "Î", "Ï", "Ī", "Į", "Ó", "Ò", "Ô", "Õ", "Ō", "Ö", "Œ", "Ø", "º", "Ú", "Ü", "Ù", "Û", "Ū", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } local accent_dictionary = { [string.byte("a")] = "àáâãåäæª", [string.byte("A")] = "ÀÁÂÃÅÄÆª", [string.byte("c")] = "çćč", [string.byte("C")] = "ÇĆČ", [string.byte("e")] = "éêëèęēė", [string.byte("E")] = "ÉÊËÈĘĒĖ", [string.byte("i")] = "íìîïīį", [string.byte("I")] = "ÍÌÎÏĪĮ", [string.byte("o")] = "óôõòōöœøº", [string.byte("O")] = "ÓÔÕÒŌ֌غ", [string.byte("u")] = "úüùûū", [string.byte("U")] = "ÚÜÙÛŪ", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q둦%5assets/portuguesept_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Qе)5assets/portuguesept_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "portuguesept_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QNMi( ( '5assets/portuguesept_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "portuguesept_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QC``&5assets/portuguesept_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "portuguesept_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QIM"5assets/portuguesept_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "à", "á", "â", "ã", "å", "ä", "æ", "ª", "ç", "ć", "č", "é", "ê", "ë", "è", "ę", "ē", "ė", "í", "ì", "î", "ï", "ī", "į", "ó", "ò", "ô", "õ", "ō", "ö", "œ", "ø", "º", "ú", "ü", "ù", "û", "ū", } local special_upper_list = { "À", "Á", "Â", "Ã", "Å", "Ä", "Æ", "ª", "Ç", "Ć", "Č", "É", "Ê", "Ë", "È", "Ę", "Ē", "Ė", "Í", "Ì", "Î", "Ï", "Ī", "Į", "Ó", "Ò", "Ô", "Õ", "Ō", "Ö", "Œ", "Ø", "º", "Ú", "Ü", "Ù", "Û", "Ū", } local accent_dictionary = { [string.byte("a")] = "àáâãåäæª", [string.byte("A")] = "ÀÁÂÃÅÄÆª", [string.byte("c")] = "çćč", [string.byte("C")] = "ÇĆČ", [string.byte("e")] = "éêëèęēė", [string.byte("E")] = "ÉÊËÈĘĒĖ", [string.byte("i")] = "íìîïīį", [string.byte("I")] = "ÍÌÎÏĪĮ", [string.byte("o")] = "óôõòōöœøº", [string.byte("O")] = "ÓÔÕÒŌ֌غ", [string.byte("u")] = "úüùûū", [string.byte("U")] = "ÚÜÙÛŪ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QFvVV5assets/punjabi.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("PA", "punjabi") local packagename = pkg.punjabiv5 lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.english .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = packagename .. "punjabi_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = packagename .. "punjabi_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = packagename .. "punjabi_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = packagename .. "punjabi_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = packagename .. "punjabi_traits.trt.png" lng.statistic_alias = "punjabi" lng.categories[si.language.category.FASTSWITCH] = "punjabi" lng.categories[si.language.category.SUBTYPE] = "punjabi" lng.categories[si.language.category.MIXINPUT] = "punjabi" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "punjabi" lng.categories[si.language.category.LAYOUT] = "punjabi" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = packagename .. "punjabi.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qj #5assets/punjabi_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs = kb.punjabi_full_alt local shift_inputs = nil local main_inputs = kb.punjabi_full_main1 if main_inputs == nil then main_inputs = { {"੧", "੨", "੩", "੪", "੫", "੬", "੭", "੮", "੯", "੦"}, {"ੳ", "ਅ ", "ੇ ", "ਰ", "ਤ", "ਯ", "ੁ", "ਿ", "ੋ", "ਪ"}, {"ਾ", "ਸ", "ਦ", "੍", "ਗ", "ਹ", "ਜ", "ਕ", "ਲ"}, {"ਙ", "ੜ", "ਚ", "ਵ", "ਬ", "ਨ", "ਮ"}, } end local input_type = si.input_type() template = "punjabi_soft_full_international" local s = sf.new_full_keyboard( "punjabi_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.punjabiv5 .. "punjabi_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_pa s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QTW #5assets/punjabi_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs = nil local alt_inputs = kb.punjabi_full_alt local main_inputs = kb.punjabi_full_main2 if main_inputs == nil then main_inputs = { {"ਅ", "ਐ", "ਢ", "ਠ", "ਊ", "ਈ", "ਇ", "ਔ", "ੰ" , "ੱ"}, {"ੲ", "ਆ", "ੈ", "ਏ", "ਥ", "ਟ", "ੂ", "ੀ", "ੌ", "ਫ"}, {"ਓ ", "ਸ਼", "ਧ", "਼", "ਘ", "ਝ", "ਖ", "ਲ਼", "ਉ"}, {"ਹ ", "ਛ", "ਡ", "ਞ", "ਭ", "ਣ", "ਂ"}, } end local input_type = si.input_type() template = "punjabi_soft_full_international" local s = sf.new_full_keyboard( "punjabi_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.punjabiv5 .. "punjabi_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = false s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_pa s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q <<#5assets/punjabi_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.punjabi_full_qwertz_main local script_inputs = kb.punjabi_full_qwertz_script local expand_long_press_inputs = kb.punjabi_full_qwertz_expand_long_press_input local input_type = si.input_type() template = "punjabi_soft_qwertz_full_international" local s = sf.new_full_keyboard( "punjabi_soft_qwertz1", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.punjabiv5 .. "punjabi_soft_qwertz2.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function is_enable_full_on_click(sk, key_name) if key_name == "sk_5_6" and sk.main_input ~= nil and sk.main_input == "+ਰ" then return false end if key_name == "sk_5_7" and sk.main_input ~= nil and sk.main_input == "+ਹ" then return false end return true end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end if is_enable_full_on_click(sk, key_name) then local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "ਅ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_punjabi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q"#5assets/punjabi_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.punjabi_full_qwertz_main2 local script_inputs = kb.punjabi_full_qwertz_script2 local expand_long_press_inputs = kb.punjabi_full_qwertz_expand_long_press_input2 local input_type = si.input_type() template = "punjabi_soft_qwertz2_full_international" local s = sf.new_full_keyboard( "punjabi_soft_qwertz2", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.match_surface = pkg.punjabiv5 .. "punjabi_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = false s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function is_enable_full_on_click(sk, key_name) if key_name == "sk_5_6" and sk.main_input ~= nil and sk.main_input == "+ਰ" then return false end if key_name == "sk_5_7" and sk.main_input ~= nil and sk.main_input == "+ਹ" then return false end return true end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end if is_enable_full_on_click(sk, key_name) then local input_precise_key = true local language = si.get_current_language() if language ~= nil and sk.script_input ~= nil and sk.script_input ~= "" and key_name == "sk_1_1" then local last_series_precise_input = language.get_traits().get_last_series_precise_text() if last_series_precise_input ~= nil and last_series_precise_input == sk.main_input and sk.main_input ~= "ਅ" then input_precise_key = false s.force_reset_changeable_display_normal = true lc.sync_changeable_display() end end if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end for j = 1, 10 do local sk = s.softkeys["sk_" .. 4 .. "_" .. j] sk.on_click = full_on_click_commit end local sk_5_1 = s.softkeys["sk_5_1"] local sk_5_2 = s.softkeys["sk_5_2"] sk_5_1.on_click = full_on_click_commit sk_5_2.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_changeable_hi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_changeable_punjabi s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q0w))5assets/punjabi_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0a00 local z_code = 0x0a7f local A_code = 0x0a00 local Z_code = 0x0a7f local zero_code = 0x0A66 local nine_code = 0x0A6F local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("।", 1)] = "।", } local special_vowel_list = { "ਾ", "ਿ", "ੀ", "ੁ", "ੂ", "ੋ", "ੈ", "ੇ", "ੌ", "ਁ", "ਃ", } local special_semivowel_list = { "੍", } local special_tone_list = { "ੱ", "ੰ", "ਂ", "਼", } local special_alone_consonant_list = { "ੳ", "ੲ", } local special_generate_double_consonant_list = { "ਰ", "ਹ", } local special_attach_list = { "੍", "ਾ", "ਿ", "ੀ", "ੁ", "ੂ", "ੋ", "ੈ", "ੇ", "ੌ", "ੱ", "ੰ", "ਂ", "ਰ", "ਹ", "ਁ", "ਃ", "਼", } local special_consonant_list = { "ਸ", "ਹ", "ਕ", "ਖ", "ਗ", "ਘ", "ਚ", "ਛ", "ਜ", "ਝ", "ਟ", "ਠ", "ਡ", "ਢ", "ਣ", "ਤ", "ਥ", "ਦ", "ਧ", "ਨ", "ਪ", "ਫ", "ਬ", "ਭ", "ਮ", "ਯ", "ਰ", "ਲ", "ਵ", "ਸ਼", "ੜ", "ਙ", "ਞ", "ਜ਼", "ਫ਼", "ਖ਼", "ਗ਼", "ਘ", "ਚ", "ਛ", "ਜ", "ਝ", "ਟ", "ਠ", "ਡ", "ਢ", "ਣ", "ਲ਼" } local special_script_list = { "੍", "ਾ", "ਿ", "ੀ", "ੁ", "ੂ", "ੋ", "ੈ", "ੇ", "ੌ", "ਰ", "ਹ", } local special_script_dictionary = { [0x0A4d] = "ਅ", [0x0A3E] = "ਆ", [0x0A3F] = "ਇ", [0x0A40] = "ਈ", [0x0A41] = "ਉ", [0x0A42] = "ਊ", [0x0A4B] = "ਏ", [0x0A48] = "ਐ", [0x0A47] = "ਓ", [0x0A4C] = "ਔ", [0x0A30] = "+ਰ", [0x0A39] = "+ਹ", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif not traits.is_special_attach_case(code) then return traits.get_normal_script_main_character(script) elseif traits.is_special_generate_double_consonant_case(code) then if traits.is_generate_double_consonant_case(last_series_precise_input) then local semivowel_char = "੍" return last_series_precise_input..semivowel_char..script else return traits.get_normal_script_main_character(script) end elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_special_semivowel_case(code) and traits.is_contain_multi_case(last_series_precise_input) then return last_series_precise_input else return last_series_precise_input..script end end function traits.get_normal_script_main_character(script) local code = si.u16code(script, 1) if traits.is_special_script_case(code) then return special_script_dictionary[code] end return script; end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(3) if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if traits.is_special_semivowel_case(code_se) and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_multi_case(str) local str_size = si.get_string_length(str) if str_size >= 2 then return true end return false end function traits.is_generate_double_consonant_case(str) local str_size = si.get_string_length(str) if str_size >= 2 then return false end local code = si.u16code(str, 1) if str_size == 1 and traits.is_special_consonant_case(code) then return true end return false end function traits.is_contain_vowel_tone_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true elseif traits.is_special_tone_case(c) then return true elseif traits.is_special_alone_consonant_case(c) then return true end end return false end function traits.is_special_script_case(c) for i, v in ipairs(special_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_tone_case(c) for i, v in ipairs(special_tone_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_attach_case(c) for i, v in ipairs(special_attach_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_alone_consonant_case(c) for i, v in ipairs(special_alone_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_generate_double_consonant_case(c) for i, v in ipairs(special_generate_double_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_punjabi_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_punjabi_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_punjabi_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_punjabi_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_punctuation_character(c) if c == si.u16code("।", 1) then return true end return false end return traits PK n5:Qff5assets/refresh.pngUT n_n_n_ WГWГWГPNG  IHDR11sAtEXtSoftwareAdobe ImageReadyqe<#iTXtXML:com.adobe.xmp ÕIDATx]HQǟT. ¶Ļ.T,")M~̊ n!32$0@ r3D+;0fvgfgv2̙ͼs1@@X|_Nր<|`:HC;oc|v1Y?)? l`Ś4 M ߆/q*p~J7""| 8E-B  1].KPV8Tk ׬-AH|s&j(@{Pm:m48䔈Mtm0ۃ(_HR^Š^?X/H=Cϖ\Wkwim17$D1Y_`0#H|LBYD4;RR)@/fi.X!]Xp]s:TM?19i9*IAE,< ƇKgP"2tGfX>D,o<6Rת\ODaql9&N=)RaD!myoR~!)=1bVȈe\4̓k@D/b8` JWz"s~DFVbd23چ]a #S)~*s;Gk̬'*v?\1(Rj0 T 6Eڰ"gҍV7 ZCjK6ܐH%,Y% (KlY2/ud̈́ ݠ)nwv)'2ĬX:ˉR+^eQaֈj 18wn~.Yk24ީK9S ۅ-oQ&LÙe 'r +B8l`lxͪ߸ sܷRϱu 8uJTDT[+u4nIENDB`PK n5:Qňz|5assets/romanian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("RO", "Romanian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.romanianv5 .. "romanian_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.romanianv5 .. "romanian_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.romanianv5 .. "romanian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.romanianv5 .. "romanian_traits.trt.png" lng.statistic_alias = "romanian" lng.categories[si.language.category.FASTSWITCH] = "romanian" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "romanian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "romanian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.romanianv5 .. "romanian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.romanianv5 .. "romanian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.romanianv5 .. "romanian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q`!5assets/romanian_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q:H3%5assets/romanian_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "romanian_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qw #5assets/romanian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "romanian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q+]]"5assets/romanian_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "romanian_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QMu %%5assets/romanian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local special_lower_list = { "ă", "â", "á", "ä", "å", "à", "ã", "ā", "æ", "î", "í", "ì", "ï", "ī", "į", "ş", "ș", "š", "ś", "ß", "ţ", "ț", } local special_upper_list = { "Ă", "Â", "Á", "Ä", "Å", "À", "Ã", "Ā", "Æ", "Î", "Í", "Ì", "Ï", "Ī", "Į", "Ş", "Ș", "Š", "Ś", "ß", "Ţ", "Ț", } local accent_letter_dictionary = { [string.byte("a")] = "ăâ", [string.byte("i")] = "î", [string.byte("s")] = "ș", [string.byte("t")] = "ţ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Qp5assets/russian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("RU", "russian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.russianv5 .. "russian_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.russianv5 .. "russian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.russianv5 .. "russian_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.russianv5 .. "russian_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_layout = si.surface_layout.QW, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.RUR, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.RUR, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.russianv5 .. "russian_traits.trt.png" lng.statistic_alias = "russian" lng.categories[si.language.category.FASTSWITCH] = "russian" lng.categories[si.language.category.SUBTYPE] = "russian" lng.categories[si.language.category.MIXINPUT] = "russian" lng.categories[si.language.category.CELLDICT] = "russian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "russian" lng.categories[si.language.category.LAYOUT] = "russian" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "ru" lng.categories[si.language.category.EMOJI] = "russian" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.russianv5 .. "russian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { -- QWERTY { file_name = pkg.russianv5 .. "russian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.russianv5 .. "russian_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, { file_name = pkg.russianv5 .. "russian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q5:** 5assets/russian_qwerty_layout.pngUT n_n_n_ WГWГWГй 0 0 40 81 ц 40 0 80 81 у 80 0 120 81 к 120 0 160 81 е 160 0 200 81 н 200 0 240 81 г 240 0 280 81 ш 280 0 320 81 щ 320 0 360 81 з 360 0 400 81 х 400 0 440 81 ъ 440 0 480 81 ф 20 81 60 162 ы 60 81 100 162 в 100 81 140 162 а 140 81 180 162 п 180 81 220 162 р 220 81 260 162 о 260 81 300 162 л 300 81 340 162 д 340 81 380 162 ж 380 81 420 162 э 420 81 460 162 я 69 162 107 243 ч 107 162 146 243 с 146 162 184 243 м 184 162 223 243 и 223 162 261 243 т 261 162 300 243 ь 300 162 338 243 б 338 162 376 243 ю 376 162 415 243 PK n5:QqiD "5assets/russian_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local ct = si.context local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.russian_azerty_main if not is_curve_mode and not is_wave_mode then template = "russian_soft_azerty_international" alt_inputs = kb.russian_azerty_alt else template = "russian_soft_azerty_curve_international" alt_inputs = kb.russian_azerty_alt shift_inputs = kb.russian_full_shift_curve end local s = sf.new_full_keyboard( "russian_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) local input_type = si.input_type() s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = ct.DATE + ct.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QV$5assets/russian_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "surface_factory" require "keyboard" require "common_keys" require "lua_calls" local si = smartinput local sf = surface_factory local kb = keyboard local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "russian_soft_phonepad", kb.russian_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "russian_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.explicit_strategy = nil s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QX cW "5assets/russian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local ct = si.context local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.russian_full_main if not is_curve_mode and not is_wave_mode then template = "russian_soft_full_international" alt_inputs = kb.russian_full_alt else template = "russian_soft_full_curve_international" alt_inputs = kb.russian_full_alt_curve shift_inputs = kb.russian_full_shift_curve end local s = sf.new_full_keyboard( "russian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) local input_type = si.input_type() s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = ct.DATE + ct.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qi!5assets/russian_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "russian_soft_tplus", kb.russian_tplus_left, kb.russian_tplus_right, kb.russian_tplus_alt, si.TITLE_CASE.CHANGE, 3) s.template = "russian_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q5assets/russian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = si.u16code("а", 1) local r_code = si.u16code("я", 1) local A_code = si.u16code("А", 1) local R_code = si.u16code("Я", 1) local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } local special_lower_list = { "ё", "Ъ", } local special_upper_list = { "Ё", "Ъ", } local accent_dictionary = { [si.u16code("е", 1)] = "ё", [si.u16code("ь", 1)] = "ъ", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= R_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= r_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if char_code >= a_code and char_code <= r_code then return true elseif char_code >= A_code and char_code <= R_code then return true elseif traits.is_special_lower_case(c) then return true elseif traits.is_special_upper_case(c) then return true else return false end end function traits.is_userword_character(c) return ct.is_cyrillic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= r_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= R_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= r_code then return true elseif c >= A_code and c <= R_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_begin_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Qö5assets/santhali.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("SA", "Santhali") local packagename = pkg.santhaliv5 if packagename == nil then packagename = "com.cootek.smartinputv5.language.v5.santhali:" end lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.english .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = packagename .. "santhali_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.TAMIL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.TAMIL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = packagename .. "santhali_traits.trt.png" lng.statistic_alias = "santhali" lng.categories[si.language.category.FASTSWITCH] = "santhali" lng.categories[si.language.category.SUBTYPE] = "santhali" lng.categories[si.language.category.MIXINPUT] = "santhali" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "santhali" lng.categories[si.language.category.LAYOUT] = "santhali" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = nil lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qs5g#5assets/santhali_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local ts = si.tri_status local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local is_num_row_on = si.is_num_line_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.santhali_full_qwerty_main local expand_long_press_inputs = kb.santhali_full_qwerty_expand_long_press_input local input_type = si.input_type() template = "santhali_soft_full_international" if is_num_row_on then alt_inputs = kb.santhali_full_qwerty_alt else alt_inputs = kb.santhali_full_qwerty_alt_num_row_off end local s = sf.new_full_keyboard( "santhali_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end if not is_num_row_on then local sk_1_11 = s.softkeys["sk_1_11"] sk_1_11.on_long_press_once = function() show_expand_symbols_santhali({'()'}, 1) end sk_1_11.on_slide_down = function() si.input_string(sk_1_11.alt_title, false) si.input_keycode(_G.config.L_KEYCODE_EDIT_LEFT); end end function show_expand_symbols_santhali(symbols, default_index) local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local key for i = 1, _G.table.getn(symbols) do key = si.new_softkey() if _G.type(symbols[i]) == "table" then key.main_title = symbols[i][1] key.main_input = symbols[i][1] key.input_emotion = symbols[i][2] else key.main_title = symbols[i] key.main_input = symbols[i] key.input_emotion = false end key.on_click = function(sk) si.input_string(sk.main_input, sk.input_emotion) si.input_keycode(_G.config.L_KEYCODE_EDIT_LEFT); end sur.softkeys[i] = key end si.popup_surface(sur) si.set_default_key(default_index) end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_sa s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_sa s.softkeys["Dot"] = ck.sk_dot_sa s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QoԱcc5assets/santhali_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" require "common_keys" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = 0x1C50 local z_code = 0x1C7E local A_code = 0x1C50 local Z_code = 0x1C7E local zero_code = string.byte("0") local nine_code = string.byte("9") local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_santhali_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_santhali_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_santhali_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_santhali_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Qlgee5assets/serbian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("SR", "Serbian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.serbianv5 .. "serbian_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.serbianv5 .. "serbian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.serbianv5 .. "serbian_traits.trt.png" lng.statistic_alias = "serbian" lng.categories[si.language.category.FASTSWITCH] = "serbian" lng.categories[si.language.category.SUBTYPE] = "serbian" lng.categories[si.language.category.MIXINPUT] = "serbian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "serbian" lng.categories[si.language.category.LAYOUT] = "serbian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.serbianv5 .. "serbian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.serbianv5 .. "serbian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.serbianv5 .. "serbian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QzL "5assets/serbian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.serbian_full_main local input_type = si.input_type() if not is_curve_mode then template = "serbian_soft_full_international" alt_inputs = kb.serbian_full_alt else template = "serbian_soft_full_curve_international" alt_inputs = kb.serbian_alt_curve shift_inputs = kb.serbian_curve_shift end local s = sf.new_full_keyboard( "serbian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QQa>(5assets/serbian_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "serbian_soft_qwerty", kb.serbian_tplus_left, kb.serbian_tplus_right, kb.serbian_tplus_alt, si.TITLE_CASE.CHANGE, 3) s.template = "bulgarian_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qu5assets/serbian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = si.u16code("а", 1) local z_code = si.u16code("я", 1) local A_code = si.u16code("А", 1) local Z_code = si.u16code("Я", 1) local special_lower_list = { "љ", "њ", "ј", "ћ", "ѕ", "џ", "ђ", } local special_upper_list = { "Љ", "Њ", "Ј", "Ћ", "Ѕ", "Џ", "Ђ", } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_cyrillic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:QeVff5assets/serbianlatin.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("SE", "Serbianlatin") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.serbianlatinv5 .. "serbianlatin_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.serbianlatinv5 .. "serbianlatin_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.serbianlatinv5 .. "serbianlatin_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.serbianlatinv5 .. "serbianlatin_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.serbianlatinv5 .. "serbianlatin_traits.trt.png" lng.statistic_alias = "serbianlatin" lng.categories[si.language.category.FASTSWITCH] = "serbianlatin" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "serbianlatin" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "serbianlatin" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.serbianlatinv5 .. "serbianlatin.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.serbianlatinv5 .. "serbianlatin_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.serbianlatinv5 .. "serbianlatin_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.serbianlatinv5 .. "serbianlatin_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q\)5assets/serbianlatin_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "serbianlatin_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qu u '5assets/serbianlatin_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.se_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "serbianlatin_soft_full_email_uri_international" else template = "serbianlatin_soft_full_international" end alt_inputs = kb.se_full_alt else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "serbianlatin_soft_full_email_uri_curve_international" else template = "serbianlatin_soft_full_curve_international" end alt_inputs = kb.se_full_alt_curve shift_inputs = kb.se_full_shift_curve end local s = sf.new_full_keyboard( "serbianlatin_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q+7'''5assets/serbianlatin_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_inter_mode = si.is_international_version() local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local input_type = si.input_type() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main if is_inter_mode then --international if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end else --mainland if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI then template = "eng_soft_qwerty_email_uri_mainland" else template = "eng_soft_qwerty_mainland" end alt_inputs = kb.eng_full_qwerty_alt else if input_type == si.context.URI then template = "eng_soft_qwerty_curve_email_uri_mainland" else template = "eng_soft_qwerty_curve_mainland" end alt_inputs = kb.eng_full_qwerty_alt_curve shift_inputs = kb.eng_full_qwerty_shift_curve end end local s = sf.new_full_keyboard( "eng_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_smiley"] = ck.sk_smiley_open s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open if not is_inter_mode then s.softkeys["sk_dict"] = ck.sk_dict s.softkeys["sk_num"] = ck.sk_num_down end s.sync_sk_lng = lc.sync_sk_lng s.commit_input = lc.commit_input s.compound_word_input = lc.compound_word_input return s PK n5:QMZcc-5assets/serbianlatin_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "serbianlatin_soft_qwerty", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q޾"5assets/serbianlatin_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "č", "ç", "ć", "đ", "š", "ś", "ß", "ž", "ź", "ż", } local special_upper_list = { "Č", "Ç", "Ć", "Đ", "Š", "Ś", "ß", "Ž", "Ź", "Ż", } local accent_letter_dictionary = { [string.byte("c")] = "čćç", [string.byte("d")] = "đ", [string.byte("s")] = "šśß", [string.byte("z")] = "žźż", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QN''5assets/shuangpin_jj.cfg.pngUT n_n_n_ WГWГWГzero sheng mu=addadd2 a=a b=b ia=b ua=b c=c uan=c d=d ao=d e=e f=f an=f g=g ang=g h=h iang=h uang=h sh=i i=i j=j ian=j k=k iao=k l=l in=l m=m ie=m n=n iu=n o=o uo=o p=p ou=p q=q ing=q er=q r=r en=r s=s ai=s t=t eng=t ch=u u=u zh=v ui=v v=v w=w ei=w x=x ue=x ve=x uai=x y=y ong=y iong=y z=z un=z PK n5:Q]--5assets/shuangpin_ms.cfg.pngUT n_n_n_ WГWГWГextra key=` zero sheng mu=o b=b c=c ch=i d=d f=f h=h g=g j=j k=k m=m n=n l=l r=r p=p q=q s=s sh=u t=t w=w x=x y=y z=z zh=v a=a ai=l an=j ang=h ao=k e=e ei=z en=f eng=g er=r i=i ia=w ian=m iang=d iao=c ie=x in=n ing=` iong=s iu=q o=o ong=s ou=b u=u ua=w uai=y uan=r uang=d ue=t ui=v un=p uo=o v=y ve=v PK n5:QJo--5assets/shuangpin_sg.cfg.pngUT n_n_n_ WГWГWГextra key=` zero sheng mu=o b=b c=c ch=i d=d f=f h=h g=g j=j k=k m=m n=n l=l r=r p=p q=q s=s sh=u t=t w=w x=x y=y z=z zh=v a=a ai=l an=j ang=h ao=k e=e ei=z en=f eng=g er=r i=i ia=w ian=m iang=d iao=c ie=x in=n ing=` iong=s iu=q o=o ong=s ou=b u=u ua=w uai=y uan=r uang=d ue=t ui=v un=p uo=o v=y ve=t PK n5:QB/  5assets/shuangpin_xh.cfg.pngUT n_n_n_ WГWГWГzero sheng mu=crane a=a b=b in=b c=c ao=c d=d ai=d e=e f=f en=f g=g eng=g h=h ang=h ch=i i=i j=j an=j k=k uai=k ing=k l=l iang=l uang=l m=m ian=m n=n iao=n o=o uo=o p=p ie=p q=q iu=q r=r uan=r s=s iong=s ong=s t=t ue=t ve=t sh=u u=u zh=v ui=v v=v w=w ei=w x=x ia=x ua=x y=y un=y z=z ou=z PK n5:QI--5assets/shuangpin_zg.cfg.pngUT n_n_n_ WГWГWГextra key=` zero sheng mu=o b=b c=c ch=a d=d f=f h=h g=g j=j k=k m=m n=n l=l r=r p=p q=q s=s sh=i t=t w=w x=x y=y z=z zh=u a=a ai=p an=r ang=s ao=q e=e ei=k en=w eng=t er=j i=i ia=x ian=f iang=g iao=b ie=d in=y ing=` iong=h iu=j o=o ong=h ou=z u=u ua=x uai=y uan=l uang=g ue=n ui=n un=m uo=o v=v ve=n PK n5:QcD!!5assets/shuangpin_zn.cfg.pngUT n_n_n_ WГWГWГzero sheng mu=o b=b c=c ch=e d=d f=f h=h g=g j=j k=k m=m n=n l=l r=r p=p q=q s=s sh=v t=t w=w x=x y=y z=z zh=a a=a ai=l an=j ang=h ao=k e=e ei=q en=f eng=g er=r i=i ia=d ian=w iang=t iao=z ie=x in=c ing=y iong=s iu=r o=o ong=s ou=b u=u ua=d uai=c uan=p uang=t ue=m ui=m un=n uo=o v=v ve=v PK n5:QLqXk%%5assets/shuangpin_zr.cfg.pngUT n_n_n_ WГWГWГzero sheng mu=crane a=a b=b ou=b c=c iao=c d=d uang=d iang=d e=e f=f en=f g=g eng=g h=h ang=h ch=i i=i j=j an=j k=k ao=k l=l ai=l m=m ian=m n=n in=n o=o uo=o p=p un=p q=q iu=q r=r uan=r er=r s=s iong=s ong=s t=t ue=t ve=t sh=u u=u zh=v ui=v v=v w=w ua=w ia=w x=x ie=x y=y uai=y ing=y z=z ei=z PK n5:QKˑ (5assets/simplecangjie_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local sk_main_inputs = kb.simplecangjie_qwerty_main_input local alt_inputs local shift_inputs alt_inputs = kb.eng_full_qwerty_main shift_inputs = kb.eng_full_qwerty_upper_case_main local s = sf.new_full_keyboard( "cangjie_soft_qwerty", sk_main_inputs, alt_inputs, shift_inputs, false, si.TITLE_CASE.NO_CHANGE, 0) if si.is_international_version() then s.template = "simplecangjie_soft_full_international" else s.template = "simplecangjie_soft_full" end s.statistic_alias = "qwerty" s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PREDICT s.additional_candidate = nil s.inline_strategy = nil s.on_handwrite = true s.handwrite_mask = true s.explicit_strategy = { si.inline_strategy.PRECISE_INPUT, } s.extra_elements = { "top_bar=function_bar/candidate_bar/handwrite_half_filter_bar", "popup_revert", "popup_explicit", "sk_ent_explicit", "typing_speed_bar", } local main_title = kb.eng_full_qwerty_main for i = 1, #sk_main_inputs do for j = 1, #sk_main_inputs[i] do local key = s.softkeys["sk_" .. i .. "_" .. j] key.on_long_press_once = nil end end -- simple cangjie only has one layout, slip operation is not supported. s.on_slip_left = nil s.on_slip_right = nil --softkeys s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_chs s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_chs s.softkeys["sk_voice"] = ck.sk_voice_chs s.softkeys["sk_sp"] = ck.sk_sp_cangjie s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_cht s.softkeys["sk_bk"] = ck.sk_bk_chs s.softkeys["sk_lng"] = ck.sk_lng_chs s.softkeys["sk_sym"] = ck.sk_sym_chs s.softkeys["sk_num"] = ck.sk_num_left s.softkeys["sk_que"] = ck.sk_que s.softkeys["Dot"] = ck.sk_dot_chs s.softkeys["sk_place"] = ck.sk_place s.softkeys["Comma"] = ck.sk_comma_chs s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_hw_mask"] = ck.sk_hw_mask s.commit_input = lc.commit_input return s PK n5:Q1QQ#5assets/simplecangjie_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" local si = smartinput local traits = smartinput.new_language_traits() traits.case_sensitive = false traits.commit_input_size = 5 traits.max_candidate_length = 16 traits.chinese_charset = smartinput.chinese_charset.TRADITIONAL local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") function traits.is_upper_case(c) local char_code = c return char_code >= A_code and char_code <= Z_code end function traits.is_lower_case(c) local char_code = c return char_code >= a_code and char_code <= z_code end function traits.is_input_character (c) zhuyin_chars = { {"手", "田", "水", "口", "廿", "卜", "山", "戈", "人", "心"}, {"日", "尸", "木", "火", "土", "竹", "十", "大", "中"}, {"難", "金", "女", "月", "弓", "一"}, } for i, row in _G.pairs(zhuyin_chars) do for j, zy_ch in _G.pairs(row) do if c == si.u16code(zy_ch, 1) then return true end end end return false end function traits.is_output_character(c) local char_code = c if char_code >= 0x4e00 and char_code <= 0x9fff then return true else return false end end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else return c end end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else return c end end function traits.is_case_sensitive_character(c) if c >= a_code and c <= z_code then return true elseif c >= A_code and c <= A_code then return true else return false end end traits.is_userword_character = traits.is_output_character function traits.is_word_begin_character (c) return true end function traits.is_word_middle_character (c) return true end traits.is_contact_character = traits.is_output_character return traits PK n5:Qڦڝ5assets/sinhala.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("SI", "Sinhala") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, { surface_id = pkg.sinhalav5 .. "sinhala_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.sinhalav5 .. "sinhala_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.sinhalav5 .. "sinhala_traits.trt.png" lng.statistic_alias = "sinhala" lng.categories[si.language.category.FASTSWITCH] = "sinhala" lng.categories[si.language.category.SUBTYPE] = "sinhala" lng.categories[si.language.category.MIXINPUT] = "sinhala" lng.categories[si.language.category.CELLDICT] = "sinhala" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "sinhala" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = nil lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qr #5assets/sinhala_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.sinhala_full_qwerty_main1 local input_type = si.input_type() template = "sinhala_soft_full_international" alt_inputs = nil shift_inputs = nil local s = sf.new_full_keyboard( "tamil_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.sinhalav5 .. "sinhala_soft_qwerty2.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = false s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end local sk_1_1 = s.softkeys["sk_1_1"] sk_1_1.on_long_press_once = nil sk_1_1.on_click = function() if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end si.input_string(sk_1_1.main_input, false) end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_clipboard"] = ck.sk_clipboard s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q96J #5assets/sinhala_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.sinhala_full_qwerty_main2 local input_type = si.input_type() template = "sinhala_soft_full_international" alt_inputs = nil shift_inputs = nil local s = sf.new_full_keyboard( "tamil_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.sinhalav5 .. "sinhala_soft_qwerty1.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.multi_input_type = si.input_mode.FUZZY s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = false s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end local sk_3_6 = s.softkeys["sk_3_6"] sk_3_6.on_long_press_once = nil sk_3_6.on_click = function() if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end si.input_string(sk_3_6.main_input, false) end local sk_3_7 = s.softkeys["sk_3_7"] sk_3_7.on_long_press_once = nil sk_3_7.on_click = function() si.input_string(sk_3_7.main_input, false) end local sk_1_1 = s.softkeys["sk_1_1"] sk_1_1.on_click = function() si.input_string(sk_1_1.main_input, false) end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_clipboard"] = ck.sk_clipboard s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QaNrr5assets/sinhala_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = 0x0d82 local z_code = 0x0df4 local A_code = 0x0d82 local Z_code = 0x0df4 local case_insensitive_letters = { } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_sinhala_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_sinhala_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_sinhala_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_sinhala_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q]fe$||5assets/slovak.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("SK", "Slovak") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.slovakv5 .. "slovak_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.slovakv5 .. "slovak_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.slovakv5 .. "slovak_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.slovakv5 .. "slovak_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.slovakv5 .. "slovak_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.slovakv5 .. "slovak_traits.trt.png" lng.statistic_alias = "slovak" lng.categories[si.language.category.FASTSWITCH] = "slovak" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "slovak" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "slovak" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.slovakv5 .. "slovak.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.slovakv5 .. "slovak_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.slovakv5 .. "slovak_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.slovakv5 .. "slovak_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q5K#5assets/slovak_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "slovak_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QEd !5assets/slovak_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "slovak_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q> !5assets/slovak_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "slovak_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QjդXX 5assets/slovak_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "slovak_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qم6nee'5assets/slovak_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "slovak_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qq5assets/slovak_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local special_lower_list = { "á", "ä", "ā", "à", "â", "ã", "å", "æ", "č", "ç", "ć", "ď", "é", "ę", "ė", "ē", "è", "ê", "ě", "ë", "í", "į", "ī", "ï", "î", "ì", "ĺ", "ľ", "ł", "ň", "ń", "ñ", "ó", "ô", "õ", "ö", "ò", "ō", "œ", "ø", "ŕ", "ř", "š", "ś", "ß", "ť", "ú", "ů", "ū", "ü", "ù", "û", "ý", "ÿ", "ž", "ź", "ż", } local special_upper_list = { "Á", "Ä", "Ā", "À", "Â", "Ã", "Å", "Æ", "Č", "Ç", "Ć", "Ď", "É", "Ę", "Ė", "Ē", "È", "Ê", "Ě", "Ë", "Í", "Į", "Ī", "Ï", "Î", "Ì", "Ĺ", "Ľ", "Ł", "Ň", "Ń", "Ñ", "Ó", "Ô", "Õ", "Ö", "Ò", "Ō", "Œ", "Ø", "Ŕ", "Ř", "Š", "Ś", "ß", "Ť", "Ú", "Ů", "Ū", "Ü", "Ù", "Û", "Ý", "Ÿ", "Ž", "Ź", "Ż", } local accent_letter_dictionary = { [string.byte("a")] = "áäāàâãåæ", [string.byte("c")] = "čçć", [string.byte("d")] = "ď", [string.byte("e")] = "éęėēèêěë", [string.byte("i")] = "íįīïîì", [string.byte("l")] = "ĺľł", [string.byte("n")] = "ňńñ", [string.byte("o")] = "óôõöòōœø", [string.byte("r")] = "ŕř", [string.byte("s")] = "šśß", [string.byte("t")] = "ť", [string.byte("u")] = "úůūüùû", [string.byte("y")] = "ýÿ", [string.byte("z")] = "žźż", [string.byte("A")] = "ÁÄĀÀÂÃÅÆ", [string.byte("C")] = "ČÇĆ", [string.byte("D")] = "Ď", [string.byte("E")] = "ÉĘĖĒÈÊĚË", [string.byte("I")] = "ÍĮĪÏÎÌ", [string.byte("L")] = "ĹĽŁ", [string.byte("N")] = "ŇŃÑ", [string.byte("O")] = "ÓÔÕÖÒŌŒØ", [string.byte("R")] = "ŔŘ", [string.byte("S")] = "ŠŚß", [string.byte("T")] = "Ť", [string.byte("U")] = "ÚŮŪÜÙÛ", [string.byte("Y")] = "ÝŸ", [string.byte("Z")] = "ŽŹŻ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QTӕ5assets/slovenian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("SL", "Slovenian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.slovenianv5 .. "slovenian_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.slovenianv5 .. "slovenian_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.slovenianv5 .. "slovenian_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.slovenianv5 .. "slovenian_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.slovenianv5 .. "slovenian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.slovenianv5 .. "slovenian_traits.trt.png" lng.statistic_alias = "slovenian" lng.categories[si.language.category.FASTSWITCH] = "slovenian" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "slovenian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "slovenian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.slovenianv5 .. "slovenian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.slovenianv5 .. "slovenian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.slovenianv5 .. "slovenian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.slovenianv5 .. "slovenian_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qx}&5assets/slovenian_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "slovenian_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q? $5assets/slovenian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "slovenian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q|{ $5assets/slovenian_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "slovenian_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qh'l[[#5assets/slovenian_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "slovenian_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q2hh*5assets/slovenian_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "slovenian_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qi 5assets/slovenian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "č", "ć", "š", "ž", "đ", "á", "ä", "â", "ă", "ą", "é", "ę", "ě", "ë", "ú", "ů", "ü", "ű", } local special_upper_list = { "Č", "Ć", "Š", "Ž", "Đ", "Á", "Ä", "Â", "Ă", "Ą", "É", "Ę", "Ě", "Ë", "Ú", "Ů", "Ü", "Ű", } local accent_letter_dictionary = { [string.byte("c")] = "čć", [string.byte("s")] = "š", [string.byte("z")] = "ž", [string.byte("d")] = "đ", [string.byte("a")] = "äáâăą", [string.byte("e")] = "ëéęě", [string.byte("u")] = "üúůű", [string.byte("C")] = "ČĆ", [string.byte("S")] = "Š", [string.byte("Z")] = "Ž", [string.byte("D")] = "Đ", [string.byte("A")] = "ÄÁÂĂĄ", [string.byte("E")] = "ËÉĘĚ", [string.byte("U")] = "ÜÚŮŰ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Qv'R%nn5assets/smartinput.lua.pngUT n_n_n_ WГWГWГrequire "bit" local P = {} P._G = _G if _REQUIREDNAME == nil then smartinput = P else _G[_REQUIREDNAME] = P end setfenv(1, P) if _G.config == nil then _G.config = {} --main package _G.config.L_MAIN_PACKAGE_NAME="com.cootek.smartinputv5" _G.config.L_KEYCODE_ENTER = 131213 _G.config.L_KEYCODE_SPACE = 131200 _G.config.L_KEYCODE_BACKSPACE = 131080 _G.config.L_KEYCODE_LANGUAGE = 3145761 _G.config.L_KEYCODE_PREDICT = 3145729 _G.config.L_KEYCODE_FUN_SWITCH_LAST_LANG = 3145791 _G.config.L_KEYCODE_FUN_SWITCH_NEXT_LANG = 3145792 _G.config.L_KEYCODE_PINYIN_DISABLED = 3145793 _G.config.L_KEYCODE_FUN_SWITCH_ENG_TO_CHS = 3145795 _G.config.L_KEYCODE_FUN_SWITCH_CHS_TO_ENG = 3145796 _G.config.L_PATH = "" _G.config.L_KEYCODE_CLOSE = 3145740 _G.config.L_KEYCODE_DOUBLE_SPACE = 3145764 _G.config.L_KEYCODE_BACK = 3145765 _G.config.L_KEYCODE_FUN_CANDIDATE_UP = 3145768 _G.config.L_KEYCODE_FUN_CANDIDATE_DOWN = 3145769 _G.config.L_KEYCODE_FUN_CANDIDATE_LEFT = 3145770 _G.config.L_KEYCODE_FUN_CANDIDATE_RIGHT = 3145771 _G.config.L_KEYCODE_FUN_HARD_SYMBOL_TAB_LEFT = 3145772 _G.config.L_KEYCODE_FUN_HARD_SYMBOL_TAB_RIGHT = 3145773 _G.config.L_KEYCODE_FUN_HARD_SYMBOL_TAB_MODE = 3145775 _G.config.L_KEYCODE_FUN_QUICK_SWITCHER_NO_SETTING_PROMPT = 3145784 _G.config.L_KEYCODE_FUN_DELWORD = 3145787 _G.config.L_KEYCODE_FUN_CUSTOM_SYMBOL_ZH = 3145788 _G.config.L_KEYCODE_FUN_CUSTOM_SYMBOL_EN = 3145789 _G.config.L_KEYCODE_FUN_HANDWRITE_PAOPAO = 3145790 _G.config.L_KEYCODE_FUN_DEL_AROUND_WORD = 3145794 --************************************** -- EDIT _G.config.L_KEYCODE_EDIT_KEY_BEGIN = 3211265 _G.config.L_KEYCODE_EDIT_COPY = 3211265 _G.config.L_KEYCODE_EDIT_COPY = 3211265 _G.config.L_KEYCODE_EDIT_PASTE = 3211266 _G.config.L_KEYCODE_EDIT_CUT = 3211267 _G.config.L_KEYCODE_EDIT_UP = 3211268 _G.config.L_KEYCODE_EDIT_DOWN = 3211269 _G.config.L_KEYCODE_EDIT_LEFT = 3211270 _G.config.L_KEYCODE_EDIT_RIGHT = 3211271 _G.config.L_KEYCODE_EDIT_PDOWN = 3211272 _G.config.L_KEYCODE_EDIT_PUP = 3211273 _G.config.L_KEYCODE_EDIT_HOME = 3211274 _G.config.L_KEYCODE_EDIT_END = 3211275 _G.config.L_KEYCODE_EDIT_SELECT = 3211276 _G.config.L_KEYCODE_EDIT_DEL = 3211277 _G.config.L_KEYCODE_EDIT_SELECTALL = 3211278 _G.config.L_KEYCODE_EDIT_SPACE = 3211279 _G.config.L_KEYCODE_EDIT_DONE = 3211280 _G.config.L_KEYCODE_EDIT_ADD_NEW_WORD = 3211281 _G.config.L_KEYCODE_EDIT_OPEN_OPERATION = 3211282 _G.config.L_KEYCODE_EDIT_KEY_END = 3211282 --************************************** --************************************** -- UI _G.config.L_KEYCODE_VOICE = 3276801 _G.config.L_KEYCODE_CANCEL_VOICE = 3276802 _G.config.L_KEYCODE_VOICE_STOP = 3276803 _G.config.L_KEYCODE_FUN_SHOW_AUTO_SPACE_TIP_DIALOG = 3276804 _G.config.L_KEYCODE_FUN_SHOW_VOICE_MASK = 3276805 _G.config.L_KEYCODE_FUN_OPEN_SMILEY_PANEL = 3276806 _G.config.L_KEYCODE_FUN_CLOSE_SMILEY_PANEL = 3276807 _G.config.L_KEYCODE_PREV = 3276808 _G.config.L_KEYCODE_NEXT = 3276809 _G.config.L_KEYCODE_FUN_GUESS_EMOJI = 3276810 --************************************** end function new_softkey() local key = {} key.case_sensitive = false key.eat_previous_key = false key.support_expand_char_type = expand_char_type.ALL_INPUT_CHAR return key end function new_expandkey(title_code, input_code) local title = u16char(title_code) local input if input_code == nil then input = u16char(title_code) else input = u16char(input_code) end return generate_expandkey(title, input) end function new_expandkey_by_title(key_title) return generate_expandkey(key_title, key_title) end function generate_expandkey(key_title, key_input) local key = new_softkey() key.main_title = key_title key.main_input = key_input key.on_click = function (sk, key_name) local pi = pending_input local ca = candidates if not pi.range_exist(pi.L_RANGE_PENDING + pi.L_RANGE_CURVE + pi.L_RANGE_CONFIRM) then local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() end for c in u16_iter(key.main_input) do input_precise(u16char(c), key_name, "", is_shift_pressed()) end end return key end function new_hardkey() return {} end function new_surface(name) local surface = {} surface.name = name surface.softkeys = {} surface.hardkeys = {} surface.default_nextword = true surface.shortcut_input = true return surface end function u16_iter (str) local i = 0 return function () i = i + 1 return u16code(str, i) end end function is_split_keyboard () local orientation = get_setting_value(settings.SCREEN_ORIENTATION, settings_type.SETTING_INT) return get_setting_value(settings.KEYBOARD_SPLITTED, ui.category.CATEGORY_SCREEN_ORIENTATION, orientation, settings.TYPE_BOOLEAN) end function is_curve_layout () return not is_split_keyboard() and is_curve_ready() end function is_empty(str) if str == nil then return true end return #str == 0 end function get_accents(code) local accents = "" local cur = get_current_language() if cur.get_traits().get_accent_letters == nil then return accents end local str = cur.get_traits().get_accent_letters(code) if str ~= nil then accents = _G.string.format("%s%s", accents, str) end local mix = get_mixed_languages() for i, v in _G.ipairs(mix) do local lang = get_language(v) if lang.get_traits().get_accent_letters == nil then return accents end local str = lang.get_traits().get_accent_letters(code) if str ~= nil then accents = _G.string.format("%s%s", accents, str) end end -- print ("code = ", code, "accent letters", accents) return accents end function new_language(short_name, full_name) local l = {} l.short_name = short_name l.full_name = full_name l.categories = {} -- _G.setmetatable(l, language.mt) return l end function new_engine(engine_t, dict_t) local engine = {} engine.engine_type = engine_t engine.dict_type = dict_t return engine end function new_language_traits() return {} end function keycode_on_click(keycode) input_keycode(keycode) end title_case = { LOWER = 1, UPPER = 2, CHANGE = 3, NO_CHANGE = 4; } surface_type = { SOFT_KEYBOARD = 1, SOFT_SYMBOL = 2, SOFT_FULLCANDIDATE = 3, SOFT_SPECIAL = 4, HARD_KEYBOARD = 5, HARD_SYMBOL = 6, POPUP_EXPAND = 7 } surface_subtype = { KEYBOARD_PHONEPAD = 1, KEYBOARD_FULL = 2, KEYBOARD_TPLUS = 3, KEYBOARD_OTHER = 4, KEYBOARD_HARD = 5, } surface_layout = { QW = 1, AZ = 2, QZ = 3, CU1 = 4, CU2 = 5, CU3 = 6, OTHER = 7, } context = { OTHER = 0, TEXT = 0, NUMBER = 1, PHONE = 2, URI = 4, EMAIL = 8, DATE = 16, PASSWORD = 32, MATH = 64, } input_mode = { FUZZY = 1, MULTITAP = 2, PREDICT = 4, PRECISE = 8, AUTO_DISABLE_PREDICT = 16, OCEAN_PRECISE = 32, } inline_strategy = { NONE = 0, DEFAULT_CANDIDATE = 1, PREDICT_EVIDENCE = 2, RANDOM_INLINE = 3, PRECISE_INPUT = 4, DEFAULT_CURVE = 5, SHUANGPIN_EVIDENCE = 6, EXTENDED_CANDIDATE = 7, OCEAN_PRECISE_INPUT = 8, OCEAN_PRECISE_EVIDENCE = 9, PENDING_SENTENCE = 10, PENDING_EDIT = 11, } transform_input_strategy = { NONE = 0, INLINE = 1, EVIDENCE = 2, } surface_input_mode = { NONE = 0, TELEX = 1, } pending_input_mode = { NONE = 0, SENTENCE = 1, EDIT = 2, } additional_item_source = { PRECISE = 1, RANDOM = 2, } additional_item_position = { FRONT = 1, EMPTY = 2, } ocean_precise_item_position = { FRONT = 0, BACK = 1, } keyboard_type = { HARD_KEYBOARD = 1, SOFT_KEYBOARD = 2, } multitap_toggle = { START = 1, END = 2, } expand_char_type = { NONE = 0x0000, EXPAND_INPUT = 0x0001, MAIN_INPUT = 0x0002, ALT_INPUT = 0x0004, SLIDE_INPUT = 0x0008, LEFT_RIGHT_INPUT = 0x0010, ACCENT_CHAR = 0x0020, ALL_INPUT_CHAR = 0xFFFF, } currency_type = { USD = 1, EUR = 2, GRD = 3, RS_URDU = 4, NAIRA = 5, LIRA = 6, TAMIL = 7, RUR = 8, KHMER = 9, HAUSA = 10, HEBREW = 11, HINDI = 12, ARABIC = 13, HINDI_SP = 14, TELUGU = 15, } pending_input = { empty = function () return not pending_input.range_exist(pending_input.L_RANGE_CURVE + pending_input.L_RANGE_PENDING + pending_input.L_RANGE_CONFIRM) end; L_RANGE_CURVE = 1024, L_RANGE_PENDING = 2048, L_RANGE_CONFIRM = 4096, L_RANGE_COMMMIT = 8192, } compare_type = { COMPARE_TYPE_EQUAL_TO = 0, COMPARE_TYPE_GREATER_THAN = 1, COMPARE_TYPE_GREATER_THAN_OR_EQUAL_TO = 2, COMPARE_TYPE_LESS_THAN = 3, COMPARE_TYPE_LESS_THAN_OR_EQUAL_TO = 4, } candidates = { confirm_item_2 = function (index) if get_cache_input() > 0 then set_transaction(TRANSACTION_END) end if (index ~= 0) then candidates.confirm_item(index) end end; SOURCE_EXTERNALCAND = 106, SOURCE_TOUCHCORRECTCAND = 108, SOURCE_CONSTSYMBOL = 116, } -- when click handwrite mask key on function bar, call this method set_handwrite_mask_manually = function (cmd) set_handwrite_mask(cmd) if cmd == HANDWRITE_MASK_SHOW and handwrite_mask_visible() then local times = get_setting_value(settings.MANUALLY_ENTER_HANDWRITE_MASK_TIMES, settings.TYPE_INTEGER) set_setting_value(settings.MANUALLY_ENTER_HANDWRITE_MASK_TIMES, times + 1, settings.TYPE_INTEGER) end end -- when click softkey on keyboard, call this method set_handwrite_mask_auto = function (cmd) set_handwrite_mask(cmd) if cmd == HANDWRITE_MASK_HIDE then local times = get_setting_value(settings.AUTO_LEAVE_HANDWRITE_MASK_TIMES, settings.TYPE_INTEGER) set_setting_value(settings.AUTO_LEAVE_HANDWRITE_MASK_TIMES, times + 1, settings.TYPE_INTEGER) end end current_focus = { NONE = 0, FILTER = 1, CAND = 2, BACK = 3, } dictionary = {} dictionary.load_mode = { PURE_FILE = 1, PURE_ARRAY = 2, COMP_ARRAY = 3, MMAP_ARRAY = 4, } dictionary.dict_type = { WESTERN = 0, CHS_PINYIN = 1, CHS_STROKE = 2, CHT_BOPOMOFO = 3, JPN = 4, CHS_ASPECT = 5, HINDI = 6, } dictionary.image_type = { ROM = 1, RAM = 2, USR = 3, CELL = 4, BIGRAM = 5, CURVEDATA = 6, CURVECONF = 7, SHUANGPINCONF = 8, } dictionary.image_tag = { QWERTY = 1, AZERTY = 2, QWERTZ = 4, CUSTOM1 = 4194304, CUSTOM2 = 8388608, CUSTOM3 = 16777216, SIMPLIFIED = 8, TRANDITIONAL = 16, PHONEPAD = 128, FULL = 256, TPLUS = 512, ZR = 1024, JJ = 2048, XH = 4096, ZN = 8192, MS = 16384, SG = 32768, ZG = 65536, USER = 131072, DICT_MAIN = 262144, DICT_MIX = 524288, ORDINARY_DICT_TYPE = 1048576, SUPER_DICT_TYPE = 2097152, } dictionary.engine_type = { OCEAN = 1, CURVE = 2, HANDWRITE = 1001, MULTIHW = 1002, CLOUDHW = 1003, PENPOWER = 1004, } file = { NONE = 0, READ = 1, WRITE = 2, READWRITE = 3, } curve_dict = {} curve_dict.engine_type = { CHS_PINYIN = 0, JPN = 1, WESTERN = 2, } tri_status = { CAPSLOCK = 0, SEPERATOR = 1, SURLOCK = 2, NORMAL = 1, TOGGLED = 2, LOCKED = 3, NEXT = 4, AUTO = 5, } word_filter = { ALL = 0, SINGLE = 1, MULTI = 2, } editor = { NUMBER = 0x1; PASSWORD = 0x20; } emoji_input_type = { UNICODE_UNIFIED = 1; UNICODE_SOFTBANK = 2; } emoji_version = { FULL = 1; } OKINAWA_MAX_SETTING = 75 settings = { TYPE_BOOLEAN = 1, TYPE_INTEGER = 2, TYPE_STRING = 3, WORD_PREDICTION = 1, PREDICT_NEXT_WORD = 2, DOWNSLIDE_SYMBOL = 7, CURRENT_LANGUAGE = 10, PREUSED_LANGUAGE = 11, HANDWRITE_RECOG_RANGE = 29, CURVE_ENABLED = 31, SPACE_GET_NEXTWORD = 36, AUTO_SPACE = 37, WAVE_ENABLE = 53, AUTO_CORRECTION = 59, CANDIDATE_SHOW_CONTACT_ITEM = 73, SYMBOL_CURRENT_TAB = OKINAWA_MAX_SETTING + 22, SYMBOL_CURRENT_PAGE = OKINAWA_MAX_SETTING + 23, QUICK_SWITCHER_LANGUAGE = OKINAWA_MAX_SETTING + 36, QUICK_SWITCHER_LAYOUT = OKINAWA_MAX_SETTING + 37, QUICK_SWITCHER_DICT = OKINAWA_MAX_SETTING + 38, SYMBOL_KEYBOARD_LAYOUT = OKINAWA_MAX_SETTING + 39, HARD_SYMBOL_CURRENT_TAB = OKINAWA_MAX_SETTING + 40, HARD_SYMBOL_TAB_FOCUSED = OKINAWA_MAX_SETTING + 41, SAVED_LANGUAGE_HISTORY = OKINAWA_MAX_SETTING + 43, SYMBOL_LOCK_STATUS = OKINAWA_MAX_SETTING + 56, SYMBOL_CURRENT_TAB_CHS = OKINAWA_MAX_SETTING + 67, QUICK_SWITCHER_PREV_LANGUAGE = OKINAWA_MAX_SETTING + 69, QUICK_SWITCHER_PREV_LAYOUT_P = OKINAWA_MAX_SETTING + 70, QUICK_SWITCHER_PREV_LAYOUT_L = OKINAWA_MAX_SETTING + 71, SCREEN_ORIENTATION = OKINAWA_MAX_SETTING + 72, API_INPUT_CONNECTION_DISABLED = OKINAWA_MAX_SETTING + 82, MANUALLY_ENTER_HANDWRITE_MASK_TIMES = OKINAWA_MAX_SETTING + 83, AUTO_LEAVE_HANDWRITE_MASK_TIMES = OKINAWA_MAX_SETTING + 86, PRODUCT_TYPE = OKINAWA_MAX_SETTING + 91, PACKAGE_TYPE = OKINAWA_MAX_SETTING + 111, LANGUAGE_KEY_COMMA_MODE = OKINAWA_MAX_SETTING + 115, SYMBOL_DISPLAY_EMOTICON = OKINAWA_MAX_SETTING + 131, ONE_HANDED_LAYOUT = OKINAWA_MAX_SETTING + 141, IS_KEYBOARD_ZOOMING_AT_LEFT = OKINAWA_MAX_SETTING + 142, SHOW_AUTO_SPACE_TIP = OKINAWA_MAX_SETTING + 149, CURRENT_SMILEY_TAB = OKINAWA_MAX_SETTING + 154, CURRENT_EMOJI_INPUT_TYPE = OKINAWA_MAX_SETTING + 156, SLIDE_INPUT_TIP_STATE = OKINAWA_MAX_SETTING + 159, USE_LITE_EMOJI = OKINAWA_MAX_SETTING + 203, CURRENT_SMILEY_CATEGORY = OKINAWA_MAX_SETTING + 204, RECENTLY_USED_EMOJI = OKINAWA_MAX_SETTING + 205; RECENTLY_USED_SYMBOLS = OKINAWA_MAX_SETTING + 220; VOICE_INPUT_LANGUAGE = OKINAWA_MAX_SETTING + 222; EMOJI_VERSION = OKINAWA_MAX_SETTING + 238; ANDROID_VERSION = OKINAWA_MAX_SETTING + 256; LANG_KEY_ENABLED = OKINAWA_MAX_SETTING + 264; HAS_EMOJI_FONT = OKINAWA_MAX_SETTING + 275; SUPPORT_AUTO_CHANGE_TITLE_CASE = OKINAWA_MAX_SETTING + 315; KEYBOARD_NUMBER_ROW_STYLE = OKINAWA_MAX_SETTING + 322; KEYBOARD_SPLITTED = OKINAWA_MAX_SETTING + 329; SHOULD_CHS_SYM_SHOW_GRID_KEYBOARD = OKINAWA_MAX_SETTING + 341; LANGUAGE_SURFACE_CACHED_STATUS = OKINAWA_MAX_SETTING + 378; RECENTLY_USED_SYMBOLS_JAP = OKINAWA_MAX_SETTING + 384; CURRENT_SYM_KEYBOARD_PAGE = OKINAWA_MAX_SETTING + 519; OPEN_SYMBOL_KEYBOARD_CLEAR_CAND = OKINAWA_MAX_SETTING + 551; } condition_state = { INIT = 0, READY = 1, SHOWN = 2, } symbol_keyboard = { TWELVE_KEYS = 0, FULL_KEYS = 1, DEFAULT = 2, } settings_type = { SETTING_BOOL = 1, SETTING_INT = 2, SETTING_STRING = 3, } handwrite_recog = { RECOG_RANGE_ZH = 0x3ff00; RECOG_RANGE_LETTER = 0x6; RECOG_RANGE_NUMBER = 0x1; RECOG_RANGE_SYMBOL = 0x8; RECOG_RANGE_ALL = 0x3ff0f; RECOG_RANGE_LETTER_NUMBER = 0x7; RECOG_RANGE_NUMBER_SYMBOL = 0x9; RECOG_RANGE_ZH_LETTER = 0x3ff06; } hard_keycode = { HARD_KEYCODE_DPAD_UP = 19, HARD_KEYCODE_DPAD_DOWN = 20, HARD_KEYCODE_DPAD_LEFT = 21, HARD_KEYCODE_DPAD_RIGHT = 22, HARD_KEYCODE_DPAD_CENTER = 23, } language = {} language.mt = {} language.mt.__newindex = function (t, k, v) if k == "surfaces" then --[[ s_meta_set = {} i = 1 mode = 0 _G.table.insert(v, "url_navigator.sur.png") for _, s_id in _G.pairs(v) do local s = _G.dofile(s_id) local meta = {} meta.surface_type = s.surface_type meta.surface_subtype = s.surface_subtype meta.surface_layout = s.surface_layout meta.support_mode = s.support_mode meta.surface_id = s_id meta.surface_display_name = s.name s_meta_set[i] = meta if (meta.support_mode ~= nil) then mode = _G.bit:_or(mode, meta.support_mode) end i = i + 1 end _G.rawset(t, k, s_meta_set) _G.rawset(t, "support_mode", mode) --]] else _G.rawset(t, k, v) end end language.category = { FASTSWITCH = 0, SUBTYPE = 1, MIXINPUT = 2, CELLDICT = 3, NEXTWORD = 4, CURVE = 5, USERWORD = 6, MISTYPING = 7, RECOGRANGE = 8, LAYOUT = 9, SPEED = 10, SENTENCE = 11, ADTLEARNING = 12, PRIORITY = 13, SPGETNEXTWORD = 14, CLOUDINPUT = 15, EMOJI = 16, FORWARDPREDICTION = 17, CANDIDATESHOWCONTACT = 18, PENDINGINPUT_FORWARDPREDICTION = 19, } OKINAWA_MAX_CATEGORY = 19 ui = {} ui.category = { CATEGORY_SMILEY_CATEGORY = OKINAWA_MAX_CATEGORY + 6, CATEGORY_SCREEN_ORIENTATION = OKINAWA_MAX_CATEGORY + 20, CATEGORY_SYM_KEYBOARD = OKINAWA_MAX_CATEGORY + 43, } chinese_charset = { NONE = 0, SIMPLIFIED = 1, TRADITIONAL = 2, } screen_orientation = { UNDEFINED = 0, PORTRAIT = 1, LANDSCAPE = 2, SQUARE = 3, } product_type = { PRODUCT_TYPE_INTERNATIONAL = 1; PRODUCT_TYPE_MAINLAND = 2; } v4_usr_file = { ENG_USR = "eng_usr.img", CHS_USR = "chs_usr.img", CHT_USR = "cht_usr.img", ENG_BAK = "eng_TouchPal_USR.bak", CHS_BAK = "chs_TouchPal_USR.bak", CHT_BAK = "cht_TouchPal_USR.bak", } TITLE_CASE = { LOWER = 1, UPPER = 2, CHANGE = 3, NO_CHANGE = 4; } SYM_KEYBOARD = { DEFAULT = 1, SPECIAL = 2; } app_package_name = { APP_WECHAT = "com.tencent.mm"; } MIN_SDK_VERSION_FOR_EMOJI_SINCE_6 = "23" MIN_VERSION_RELEASE_EMOJI_SINCE_6 = "6.0.1" TRANSACTION_BEGIN = 1 TRANSACTION_END = 2 HANDWRITE_MASK_SHOW = 1 HANDWRITE_MASK_HIDE = 2 function is_international_version() return true end function is_international_package() return true end function is_mainland_version() return false end function is_mainland_package() return false end function is_wave_enabled() return get_setting_value(settings.WAVE_ENABLE, settings_type.SETTING_BOOL) and input_type() ~= context.PASSWORD end function is_num_line_enabled() return get_setting_value(settings.KEYBOARD_NUMBER_ROW_STYLE, settings_type.SETTING_BOOL) end local chinese_lng_statistic_alias = { "pinyin", "bihua", "zhuyin", "cangjie", "simplecangjie", "wubi", "handwrite", } function is_current_chinese_language() local current_language = get_current_language().statistic_alias for index = 1, #chinese_lng_statistic_alias do if current_language == chinese_lng_statistic_alias[index] then return true end end return false end function update_expand_key_title(key,case) if case == TITLE_CASE.UPPER then key.main_title = to_upper_case(key.main_title) elseif case == TITLE_CASE.LOWER then key.main_title = to_lower_case(key.main_title) elseif case == TITLE_CASE.CHANGE then if tri_status.get_tri_status(tri_status.CAPSLOCK) ~= tri_status.NORMAL then key.main_title = to_upper_case(key.main_title) else key.main_title = to_lower_case(key.main_title) end end return key end function get_expand_key(code, case) return get_expand_key_with_input(code, code, case) end function get_expand_key_with_input(title_code, input_code, case) local key = new_expandkey(title_code, input_code) return update_expand_key_title(key, case) end function get_expand_key_by_title(keyname, case) local key = new_expandkey_by_title(keyname) return update_expand_key_title(key,case) end function get_keycount_of_expand_sur(sk) local count = 0 if sk.main_input then for c in u16_iter(sk.main_input) do count = count + 1 local accents = get_accent_letters(c) count = count + _G.string.len(accents) / 2 end end if sk.left_input then for c in u16_iter(sk.left_input) do count = count + 1 local accents = get_accent_letters(c) count = count + _G.string.len(accents) / 2 --u16len = utf8len/2 end end if sk.right_input then for c in u16_iter(sk.right_input) do count = count + 1 local accents = get_accent_letters(c) count = count + _G.string.len(accents) / 2 end end if sk.alt_input and get_setting_value(settings.DOWNSLIDE_SYMBOL) == true then for c in u16_iter(sk.alt_input) do count = count + 1 end end if sk.expand_chars then if _G.type(sk.expand_chars) == "table" then count = count + #sk.expand_chars else for c in u16_iter(sk.expand_chars) do count = count + 1 local accents = get_accent_letters(c) count = count + _G.string.len(accents) / 2 end end end -- print ("accent_count: " .. count) return count end local expand_sur = new_surface("expand") expand_sur.surface_type = surface_type.POPUP_EXPAND function get_expand_sur(sk) expand_sur.softkeys = {} local case = sk.title_case local index = 1 local default_index = 1 local has_accent = false local exist_char = {} if sk.input_match_symbol_mode ~= nil and sk.input_match_symbol_mode then local key = new_expandkey_by_title(sk.alt_input) key.on_click = function () input_string(sk.alt_input, false) input_keycode(_G.config.L_KEYCODE_EDIT_LEFT) end expand_sur.softkeys[index] = key index = index + 1 elseif sk.input_as_whole ~= nil and sk.input_as_whole then local key = new_expandkey_by_title(sk.alt_input) key.on_click = function () input_series_precise(sk.alt_input, "", "", false, 0) end expand_sur.softkeys[index] = key index = index + 1 else -- alt input first if sk.alt_input and get_setting_value(settings.DOWNSLIDE_SYMBOL) == true and support_expand_type(sk, expand_char_type.ALT_INPUT) then local alt_title local alt_input local alt_index = 0 for c in u16_iter(sk.alt_input) do alt_index = alt_index + 1 if(not exist_in_list(c,exist_char)) then alt_title = u16code(sk.alt_title, alt_index) alt_input = c expand_sur.softkeys[index] = get_expand_key_with_input(alt_title, alt_input, case) exist_char[index] = alt_input index = index + 1 end end if sk.extra_symbol then for c in u16_iter(sk.extra_symbol) do if(not exist_in_list(c,exist_char)) then expand_sur.softkeys[index] = get_expand_key(c, case) exist_char[index] = c index = index + 1 end end end end end -- for long press key expand chars if sk.expand_chars and support_expand_type(sk, expand_char_type.EXPAND_INPUT) then if _G.type(sk.expand_chars) == "table" then for i = 1, #sk.expand_chars do expand_sur.softkeys[index] = get_expand_key_by_title(sk.expand_chars[i], case) index = index + 1 end else for c in u16_iter(sk.expand_chars) do if(not exist_in_list(c,exist_char)) then expand_sur.softkeys[index] = get_expand_key(c, case) exist_char[index] = c index = index + 1 end end end end --phonepad keyboard if sk.main_input and support_expand_type(sk, expand_char_type.MAIN_INPUT) then if sk.slide_input or get_string_length(sk.main_input) > 1 then local main_title local main_input local main_index = 0 for c in u16_iter(sk.main_input) do main_index = main_index + 1 if(not exist_in_list(c,exist_char)) then main_title = u16code(sk.main_title, main_index) main_input = c expand_sur.softkeys[index] = get_expand_key_with_input(main_title, main_input, case) exist_char[index] = main_input index = index + 1 end end end end --slide input if sk.slide_input and support_expand_type(sk, expand_char_type.SLIDE_INPUT) then local complement_slide_title local complement_slide_input local complement_slide_index = 0 for c in u16_iter(sk.slide_input) do complement_slide_index = complement_slide_index + 1 if(not exist_in_list(c,exist_char)) then complement_slide_title = u16code(sk.slide_title, complement_slide_index) complement_slide_input = c expand_sur.softkeys[index] = get_expand_key_with_input(complement_slide_title, complement_slide_input, case) exist_char[index] = complement_slide_input index = index + 1 end end end if sk.spec_longpress_order then if sk.longpress_order_bak == nil then sk.longpress_order_bak = sk.longpress_order end if get_setting_value(settings.ONE_HANDED_LAYOUT, settings_type.SETTING_BOOL) then if get_setting_value(settings.IS_KEYBOARD_ZOOMING_AT_LEFT, settings_type.SETTING_BOOL) then sk.longpress_order = false else sk.longpress_order = true end else sk.longpress_order = sk.longpress_order_bak end end if sk.left_input and support_expand_type(sk, expand_char_type.LEFT_RIGHT_INPUT) then for c in u16_iter(sk.left_input) do if(not exist_in_list(c,exist_char)) then expand_sur.softkeys[index] = get_expand_key(c, case) exist_char[index] = c index = index + 1 end end end if sk.right_input and support_expand_type(sk, expand_char_type.LEFT_RIGHT_INPUT) then for c in u16_iter(sk.right_input) do if(not exist_in_list(c,exist_char)) then expand_sur.softkeys[index] = get_expand_key(c, case) exist_char[index] = c index = index + 1 end end end -- accent letters last if sk.main_input and support_expand_type(sk, expand_char_type.ACCENT_CHAR) then for c in u16_iter(sk.main_input) do local accents = get_accent_letters(c) for c in u16_iter(accents) do has_accent = true if(not exist_in_list(c,exist_char)) then expand_sur.softkeys[index] = get_expand_key(c, case) exist_char[index] = c index = index + 1 end end end end if sk.left_input and support_expand_type(sk, expand_char_type.ACCENT_CHAR) then for c in u16_iter(sk.left_input) do local accents = get_accent_letters(c) for c in u16_iter(accents) do has_accent = true if(not exist_in_list(c,exist_char)) then expand_sur.softkeys[index] = get_expand_key(c, case) exist_char[index] = c index = index + 1 end end end end if sk.right_input and support_expand_type(sk, expand_char_type.ACCENT_CHAR) then for c in u16_iter(sk.right_input) do local accents = get_accent_letters(c) for c in u16_iter(accents) do has_accent = true if(not exist_in_list(c,exist_char)) then expand_sur.softkeys[index] = get_expand_key(c, case) exist_char[index] = c index = index + 1 end end end end if sk.longpress_order == false then default_index = 1 else default_index = index - 1 --reverse the order if sk.alt_input or has_accent == true then local half_count = (index - 1) / 2 for i = 1, half_count do local softkey = expand_sur.softkeys[i] expand_sur.softkeys[i] = expand_sur.softkeys[index - i] expand_sur.softkeys[index - i] = softkey end end end -- print("default_index: " .. default_index); expand_sur.default_index = default_index return expand_sur end function exist_in_list(c,exist_char) if exist_char then for i = 1, #exist_char do if exist_char[i] == c then return true end end end return false end function support_expand_type(sk, current_type) if sk.support_expand_char_type == nil then return false end local type = _G.bit:_and(sk.support_expand_char_type, current_type) if type == current_type then return true end return false end function get_reversed_accent_dictionary(tb) local rtb = {} for l, as in _G.pairs(tb) do for a in u16_iter(as) do if rtb[a] == nil then rtb[a] = u16char(l) else rtb[a] = rtb[a] .. u16char(l) end end end return rtb end function get_string_length(str) local length = 0 for c in u16_iter(str) do length = length + 1 end return length end function is_system_verion_since_6() local system_version = get_system_version() if system_version >= MIN_SDK_VERSION_FOR_EMOJI_SINCE_6 then return true else return false; end end function get_cur_sym_keyboard(language) local cur_sym_keyboard = get_setting_value(settings.CURRENT_SYM_KEYBOARD_PAGE, ui.category.CATEGORY_SYM_KEYBOARD, language, settings.TYPE_INTEGER) if cur_sym_keyboard == nil or cur_sym_keyboard == "" then set_cur_sym_keyboard(language, SYM_KEYBOARD.DEFAULT) cur_sym_keyboard = SYM_KEYBOARD.DEFAULT end return cur_sym_keyboard end function is_open_symbol_keyboard_clear_cand() return get_setting_value(settings.OPEN_SYMBOL_KEYBOARD_CLEAR_CAND, settings_type.SETTING_BOOL) end function set_cur_sym_keyboard(language, value) set_setting_value(settings.CURRENT_SYM_KEYBOARD_PAGE, value, ui.category.CATEGORY_SYM_KEYBOARD, language, settings.TYPE_INTEGER) end --Global Variable voice_recognizing = false language_related_key_table = {} return P PK n5:Q\5assets/smiley.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "grid_symbol" require "common_keys" require "emoji" require "lua_calls" require "emoji_full" require "emoji_selected" require "emotion" require "emojiArt" local si = smartinput local ck = common_keys local ct = si.context local pi = si.pending_input local sym = grid_symbol local emo = emoji local lc = lua_calls local ef = emoji_full local es = emoji_selected local surface = si.new_surface("smiley") local temp_tab = "" surface.MAX_KEY_COUNT = 260 surface.MAX_TAB_COUNT = 10 surface.MAX_RECENT_SYMBOL_COUNT = 40 local SDK_VERSION = si.get_setting_value(si.settings.ANDROID_VERSION, si.settings_type.SETTING_INT) local has_emoji_font = si.get_setting_value(si.settings.HAS_EMOJI_FONT, si.settings_type.SETTING_BOOL) if has_emoji_font then surface.template = "smiley_pad_with_emojiart" else surface.template = "smiley_pad" end surface.on_load = function (old_surface) surface.softkeys["sk_bk"] = old_surface.softkeys["sk_bk"] surface.softkeys["sk_guess_emoji"] = si.new_softkey() surface.softkeys["sk_guess_emoji"].on_click = function() si.input_keycode(_G.config.L_KEYCODE_FUN_GUESS_EMOJI) end end surface.always_lock = true surface.surface_type = si.surface_type.SOFT_SPECIAL surface.support_mode = ct.NUMBER + ct.MATH surface.touch_correct = false surface.extra_elements = { "smiley_pad", "popup_revert", "popup_explicit", "top_bar=none", } local symbol_emotion = emotion.get_smiley_table() local emoji_version = emo.get_emoji_version() local symbol_emojiArt = emojiArt.get_smiley_table() local symbol_emoticon if SDK_VERSION > 15 and SDK_VERSION < 19 then symbol_emoticon = es.get_smiley_table() else symbol_emoticon = ef.get_smiley_table() end local symbol = { emotion = symbol_emotion, emojiArt = symbol_emojiArt, emoticon = symbol_emoticon, } if has_emoji_font then local symbol = { emotion = symbol_emotion, emojiArt = symbol_emojiArt, emoticon = symbol_emoticon, } else local symbol = { emotion = symbol_emotion, emoticon = symbol_emoticon, } end surface.get_recent_symbols = function() if emo.get_emoji_version() ~= si.emoji_version.LITE then local emoji_string = si.get_setting_value(si.settings.RECENTLY_USED_EMOJI, si.settings_type.SETTING_STRING) if 0 == string.len(emoji_string) then return symbol_emoticon["recent"] end return sym.symbols_from_string(emoji_string) end return {} end if emo.get_emoji_version() ~= si.emoji_version.LITE then local recent_emojis = surface.get_recent_symbols() symbol_emoticon["recent"] = sym.layout_emoji_list(recent_emojis) end symbol["emoticon"] = symbol_emoticon local function filter_recent_emojis(symbols) local result_emojis = {} local index = 1 for i = 1, #symbols do if _G.type(symbols[i]) == "table" and emoji.is_emoji_unicode(symbols[i][1]) then result_emojis[index] = symbols[i] index = index + 1 end end return result_emojis end surface.set_recent_symbols = function(symbols) if emo.get_emoji_version() ~= si.emoji_version.LITE then local recent_emojis = filter_recent_emojis(symbols) local emoji_string = sym.symbols_to_string(recent_emojis) si.set_setting_value(si.settings.RECENTLY_USED_EMOJI, emoji_string, si.settings_type.SETTING_STRING) local recent_category = sym.layout_emoji_list(recent_emojis) if symbol["emoticon"]["recent"] ~= nil then symbol["emoticon"]["recent"] = recent_category end end end local smiley_types_name = { emotion = "@string/smiley_tab_title_emoticon", emojiArt = "@string/smiley_tab_title_emojiArt", emoticon = "@string/smiley_tab_title_emoji", } local function get_setting_category_value(current_tab) if current_tab == "emoticon" then if emo.get_emoji_version() == si.emoji_version.LITE then return "emoticon_lite" else return "emoticon_full" end else return current_tab end end local function record_category(current_tab, category) si.set_setting_value(si.settings.CURRENT_SMILEY_CATEGORY, category, si.ui.category.CATEGORY_SMILEY_CATEGORY, get_setting_category_value(current_tab), si.settings.TYPE_STRING) end local function get_category(symbol, current_tab) local category = si.get_setting_value(si.settings.CURRENT_SMILEY_CATEGORY, si.ui.category.CATEGORY_SMILEY_CATEGORY, get_setting_category_value(current_tab), si.settings.TYPE_STRING) if category == nil or category == "" or symbol[current_tab][category] == nil then local tab = symbol[current_tab] category = tab.default_category record_category(current_tab, category) end return category end surface.switch_category = function(category) surface.smiley_current_category = category record_category(surface.smiley_current_tab, category) local category_table = symbol[surface.smiley_current_tab][surface.smiley_current_category] sym.reload_smiley(surface, category_table) end surface.switch_tab = function(symbol_tab) surface.smiley_current_tab = symbol_tab si.set_setting_value(si.settings.CURRENT_SMILEY_TAB, surface.smiley_current_tab, si.settings_type.SETTING_STRING) local current_category = get_category(symbol, symbol_tab) sym.reload_smiley(surface, symbol[surface.smiley_current_tab][current_category]) sym.setup_emoji_surface_category(surface, symbol[surface.smiley_current_tab]) end surface.smiley_current_tab = si.get_setting_value(si.settings.CURRENT_SMILEY_TAB, si.settings_type.SETTING_STRING) if surface.smiley_current_tab == nil or surface.smiley_current_tab == "" then surface.smiley_current_tab = "emoticon" si.set_setting_value(si.settings.CURRENT_SMILEY_TAB, surface.smiley_current_tab, si.settings_type.SETTING_STRING) end surface.smiley_current_category = get_category(symbol, surface.smiley_current_tab) sym.load_smiley(surface, symbol[surface.smiley_current_tab][surface.smiley_current_category]) --hard code for the category keys because the surface need to know all the category keys first sym.setup_emoji_surface_category(surface, symbol["emoticon"]) sym.setup_emoji_surface_category(surface, symbol_emojiArt) sym.setup_smiley_tab(surface, symbol) for k, v in _G.pairs(symbol) do surface.softkeys["sk_" .. k].main_title = smiley_types_name[k] end return surface PK n5:QV{{5assets/somali.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("SO", "Somali") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.somaliv5 .. "somali_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.somaliv5 .. "somali_traits.trt.png" lng.statistic_alias = "somali" lng.categories[si.language.category.FASTSWITCH] = "english" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "somali" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "somali" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q$ !5assets/somali_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "eng_soft_qwerty_international_without_dict" local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then alt_inputs = kb.eng_full_qwerty_alt_international else alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "englishgb_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qۿ~ee5assets/somali_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local traits = si.new_language_traits() local ct = common_traits traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "ā", "ą", "æ", "ç", "č", "ć", "è", "é", "ê", "ë", "ē", "ė", "ę", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "ù", "û", "ü", "ú", "ū", "ñ", "ń", "ß", "ś", "š", "ÿ", "ÿ", "ž", "ź", "ż", "ĺ", "ľ", "ł", "ď", "đ", "ŕ", "ř", "ť", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Ā", "Ą", "Æ", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ē", "Ė", "Ę", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "Ù", "Û", "Ü", "Ú", "Ū", "Ñ", "Ń", "ß", "Ś", "Š", "Ÿ", "Ÿ", "Ž", "Ź", "Ż", "Ĺ", "Ľ", "Ł", "Ď", "Đ", "Ŕ", "Ř", "Ť", } local accent_letter_dictionary = { [string.byte("a")] = "äàâáãåāąæ", [string.byte("c")] = "çčć", [string.byte("e")] = "ëèéêēėę", [string.byte("i")] = "ïîíìīį", [string.byte("o")] = "öôóòõōœø", [string.byte("u")] = "üùûúū", [string.byte("n")] = "ñń", [string.byte("s")] = "ßśš", [string.byte("y")] = "ÿ", [string.byte("z")] = "žźż", [string.byte("l")] = "ĺľł", [string.byte("d")] = "ďđ", [string.byte("r")] = "ŕř", [string.byte("t")] = "ť", [string.byte("A")] = "ÄÀÂÁÃÅĀĄÆ", [string.byte("C")] = "ÇČĆ", [string.byte("E")] = "ËÈÉÊĒĖĘ", [string.byte("I")] = "ÏÎÍÌĪĮ", [string.byte("O")] = "ÖÔÓÒÕŌŒØ", [string.byte("U")] = "ÜÙÛÚŪ", [string.byte("N")] = "ÑŃ", [string.byte("S")] = "ߌŠ", [string.byte("Y")] = "Ÿ", [string.byte("Z")] = "ŽŹŻ", [string.byte("L")] = "ĹĽŁ", [string.byte("D")] = "ĎĐ", [string.byte("R")] = "ŔŘ", [string.byte("T")] = "Ť", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QR'a a 5assets/spanish.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("ES", "spanish") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.spanishv5 .. "spanish_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.spanishv5 .. "spanish_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.CU1, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.spanishv5 .. "spanish_soft_qwerty_spanish.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.spanishv5 .. "spanish_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.spanishv5 .. "spanish_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.spanishv5 .. "spanish_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.CU1, }, { surface_id = pkg.spanishv5 .. "spanish_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.spanishv5 .. "spanish_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, { surface_id = pkg.spanishv5 .. "spanish_soft_tplus_qwerty_spanish.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "spanish_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "spanish_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "spanish_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "spanish_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.spanishv5 .. "spanish_traits.trt.png" lng.statistic_alias = "spanish" lng.categories[si.language.category.FASTSWITCH] = "spanish" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "spanish" lng.categories[si.language.category.CELLDICT] = "spanish" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "spanish" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "es" lng.categories[si.language.category.EMOJI] = "spanish" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.spanishv5 .. "spanish.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.spanishv5 .. "spanish_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.spanishv5 .. "spanish_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.spanishv5 .. "spanish_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.spanishv5 .. "spanish_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY_SPANISH { file_name = pkg.spanishv5 .. "spanish_curve_cu.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.CUSTOM1 + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QFI 5assets/spanish_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q둦5assets/spanish_cu1_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q踲 5assets/spanish_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 0 81 48 162 s 48 81 96 162 d 96 81 144 162 f 144 81 192 162 g 192 81 240 162 h 240 81 288 162 j 288 81 336 162 k 336 81 384 162 l 384 81 432 162 ñ 432 81 480 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q&[ 5assets/spanish_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:QRW? ? "5assets/spanish_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local ct = si.context local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.esp_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "spanish_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = ct.URI + ct.EMAIL + ct.DATE + ct.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Q\   $5assets/spanish_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local pi = si.pending_input local ca = si.candidates local lc = lua_calls local s = sf.new_phonepad_keyboard( "spanish_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QˑL L "5assets/spanish_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local ct = si.context local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.esp_full_qwerty_main_new local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "spanish_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "cu1" s.surface_layout = si.surface_layout.CU1 s.support_mode = ct.URI + ct.EMAIL + ct.DATE + ct.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:QeQ Q *5assets/spanish_soft_qwerty_spanish.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local ct = si.context local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.esp_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "spanish_soft_qwerty_spanish", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = ct.URI + ct.EMAIL + ct.DATE + ct.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Q I I "5assets/spanish_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local ct = si.context local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.esp_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "spanish_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = ct.URI + ct.EMAIL + ct.DATE + ct.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Q!5assets/spanish_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "spanish_soft_tplus_qwerty", kb.esp_tplus_qwerty_left_new, kb.esp_tplus_qwerty_right_new, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Q+(5assets/spanish_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "spanish_soft_tplus_azerty", kb.esp_tplus_azerty_left, kb.esp_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Que.05assets/spanish_soft_tplus_qwerty_spanish.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "spanish_soft_tplus_qwerty_spanish", kb.esp_tplus_qwerty_left, kb.esp_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.CU1 s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Q-(5assets/spanish_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "spanish_soft_tplus_qwertz", kb.esp_tplus_qwertz_left, kb.esp_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:QUgy&y&5assets/spanish_sym_grid.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "grid_symbol" require "emoji" local si = smartinput local ck = common_keys local ct = si.context local pi = si.pending_input local sym = grid_symbol local emo = emoji local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "eng_sym_grid_international" else surface.template = "chs_sym_grid" end surface.on_load = function (old_surface) surface.explicit_inline = old_surface.explicit_inline surface.inline_strategy = old_surface.inline_strategy surface.resolve_mode = old_surface.resolve_mode surface.touch_to_save = old_surface.touch_to_save if old_surface.param ~= nil then surface.switch_tab(old_surface.param, true) end end surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.support_mode = ct.NUMBER + ct.MATH surface.touch_correct = false surface.extra_elements = { "eng_sym_types", "popup_revert", "popup_explicit", "top_bar=none" } surface.ROWS_COUNT = 4 surface.COLUMNS_COUNT = 4 surface.MAX_RECENT_SYMBOL_COUNT = surface.ROWS_COUNT * surface.COLUMNS_COUNT local symbol_punc_eng = { { {".", ",", {"¿?", 1}, {"¡!", 1}}, {"'", "@", "…", ":"}, {";", "\"", "/", "_"}, {"-", "+", "`", {"()",1}}, {"(", ")", "=", "\\"}, {"~", "^", "#", "*"}, {"%", "&", "|", {"{}",1}}, {"{", "}",{"[]",1}, {"<>",1}}, {"$", "¥", "£", "€"}, {"•", "", "", ""}, } } local symbol_number = { { {"1", "2", "3", "."}, {"4", "5", "6", ","}, {"7", "8", "9", "%"}, {"*", "0", "#", "-"} } } local symbol_emotion = { { {":-)", ":-(", ":-D", ":-P"}, {";-)", "=-O", ":-*", ":O"}, {"B-)", ":-$", ":-!", ":-["}, {"O:-)", ":-\\", ":'(",",-)"}, {":-C", ":-I", ":-O",">:-<"}, } } local symbol_web = { { {"http://", {"www..com", 4}, "https://"}, {"www.", ".com", ".org", "wap."}, {":", "_", ".", "/"}, {"@", "", "", ""} } } local symbol_maths = { { {"+", "-", "×", "÷"}, {"=", "≈", "≤", "≥"}, {"°", "%", "℃", "℉"}, {"‰", "㎎", "㎏", "㎜"}, {"㎝", "㎞", "㎡", "㏄"}, {"㏑", "㏒", "⊙", "∠"}, {"⊥", "∫", "∮", "∝"}, {"∞", "º", "¹", "²"}, {"³", "½", "¾", "¼"}, {"<", ">", "≮", "≯"}, {"±", "≡", "≠", "№"}, {"§", "≦", "≧", "≌"}, {"∽", "∷", "/", "∧"}, {"∨", "∏", "∪", "∩"}, {"∈", "∵", "∴", "⌒"}, {"√", "∑", "Ψ", "¤"}, {"‖", "¶", "", ""}, } } local symbol_greek = { { {"α", "β", "γ", "δ"}, {"ε", "ζ", "ν", "ξ"}, {"ο", "π", "ρ", "σ"}, {"η", "θ", "ι", "κ"}, {"λ", "μ", "τ", "υ"}, {"φ", "χ", "ψ", "ω"}, {"Α", "Β", "Γ", "Δ"}, {"Ε", "Ζ", "Η", "Θ"}, {"Ι", "Κ", "Λ", "Μ"}, {"Ν", "Ξ", "Ο", "Π"}, {"Ρ", "Σ", "Τ", "Υ"}, {"Φ", "Χ", "Ψ", "Ω"} } } local symbol_latin = { { {"Ä", "Æ", "Å", "À"}, {"Á", "Â", "Ã", "Ç"}, {"È", "É", "Ê", "Ë"}, {"Ð", "Ì", "Í", "Î"}, {"Ï", "Ö", "Ø", "Ò"}, {"Ó", "Ô", "Õ", "Ñ"}, {"Ù", "Ú", "Û", "Ü"}, {"Ý", "Þ", "ä", "æ"}, {"å", "à", "á", "â"}, {"ã", "ç", "è", "é"}, {"ê", "ë", "ð", "ì"}, {"í", "î", "ï", "ö"}, {"ø", "ò", "ó", "ô"}, {"õ", "ñ", "ù", "ú"}, {"û", "ü", "ý", "þ"}, } } local symbol_emoticon = { { {emo.emoji_code.EMOJI_SMILE, emo.emoji_code.EMOJI_SAD, emo.emoji_code.EMOJI_GRIN, emo.emoji_code.EMOJI_NAUGHTY}, {emo.emoji_code.EMOJI_JOY, emo.emoji_code.EMOJI_CONFUSED, emo.emoji_code.EMOJI_KISS, emo.emoji_code.EMOJI_SURPRISE}, {emo.emoji_code.EMOJI_PLEASED, emo.emoji_code.EMOJI_HEARTSHAPED, emo.emoji_code.EMOJI_WRONGED, emo.emoji_code.EMOJI_CRY}, {emo.emoji_code.EMOJI_ARROGANT, emo.emoji_code.EMOJI_ANGRY, emo.emoji_code.EMOJI_WEEP, emo.emoji_code.EMOJI_DIZZY}, } } for i = 1, #symbol_emotion do for j = 1, #symbol_emotion[i] do for k = 1, #symbol_emotion[i][j] do local new_symbol = {} new_symbol[1] = symbol_emotion[i][j][k] new_symbol["emotion"] = true symbol_emotion[i][j][k] = new_symbol end end end for i = 1, #symbol_emoticon do for j = 1, #symbol_emoticon[i] do for k = 1, #symbol_emoticon[i][j] do local new_symbol = {} new_symbol[1] = symbol_emoticon[i][j][k] new_symbol["emotion"] = true symbol_emoticon[i][j][k] = new_symbol end end end local symbol = { number = symbol_number, punc_eng = symbol_punc_eng, emoticon = {}, web = symbol_web, maths = symbol_maths, greek = symbol_greek, latin = symbol_latin, } local sym_types_name = { number = "数字", punc_eng = "英文", emotion = "表情", emoticon = "表情图", web = "网络", maths = "数学", greek = "希腊", latin = "拉丁", recent = "最近" } function surface.update_recent_symbols(recent_symbols) symbol.recent = recent_symbols end local recent_symbols = sym.get_recent_symbols() surface.update_recent_symbols(sym.layout_symbol_list(recent_symbols, surface.ROWS_COUNT, surface.COLUMNS_COUNT)) function surface.set_recent_symbols(symbols) sym.set_recent_symbols(surface, symbols) end function surface.get_recent_symbols() return sym.get_recent_symbols() end function surface.update_recent_symbols(new_recent_symbols) symbol.recent = new_recent_symbols end local recent_symbols = sym.get_recent_symbols() surface.update_recent_symbols(sym.layout_symbol_list(recent_symbols, surface.ROWS_COUNT, surface.COLUMNS_COUNT)) if si.input_type() == ct.NUMBER or si.input_type() == ct.PASSWORD then surface.sym_current_tab = "number" else surface.sym_current_tab = "recent" end surface.sym_current_page = 1 --si.get_setting_value(si.settings.SYMBOL_CURRENT_PAGE, si.settings_type.SETTING_INT) si.set_setting_value(si.settings.SYMBOL_CURRENT_TAB, surface.sym_current_tab, si.settings_type.SETTING_STRING) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) surface.switch_tab = function(symbol_tab, is_ignore_accessibility) --si.print("#################surface.switch_tab: " .. symbol_tab) surface.sym_current_tab = symbol_tab surface.sym_current_page = 1 if not is_ignore_accessibility then si.set_accessibility_string("@string/accessibility_symbol_" .. symbol_tab) end si.set_setting_value(si.settings.SYMBOL_CURRENT_TAB, surface.sym_current_tab, si.settings_type.SETTING_STRING) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) surface.update_lock_status(symbol_tab) sym.reload_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) end surface.update_lock_status = function(symbol_tab) if symbol_tab == "number" then local locked = si.get_setting_value(si.settings.SYMBOL_LOCK_STATUS, si.settings_type.SETTING_INT) if locked >= 4 then locked = locked - 4; end if locked < 2 then locked = locked + 2; end si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, locked, si.settings_type.SETTING_INT) else local locked = si.get_setting_value(si.settings.SYMBOL_LOCK_STATUS, si.settings_type.SETTING_INT) if locked >= 4 then locked = locked - 4; end if locked >= 2 then locked = locked - 2; end si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, locked, si.settings_type.SETTING_INT) end end surface.prev_page = function() if table.getn(symbol[surface.sym_current_tab]) == 1 then si.set_accessibility_string("@string/accessibility_next_page_only_one") return end surface.sym_current_page = surface.sym_current_page - 1 if surface.sym_current_page < 1 then surface.sym_current_page = table.getn(symbol[surface.sym_current_tab]) end si.set_accessibility_string("@string/accessibility_next_page&" .. surface.sym_current_page) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) sym.reload_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) end surface.next_page = function() if table.getn(symbol[surface.sym_current_tab]) == 1 then si.set_accessibility_string("@string/accessibility_next_page_only_one") return end surface.sym_current_page = surface.sym_current_page + 1 if surface.sym_current_page > table.getn(symbol[surface.sym_current_tab]) then surface.sym_current_page = surface.sym_current_page - table.getn(symbol[surface.sym_current_tab]) end si.set_accessibility_string("@string/accessibility_next_page&" .. surface.sym_current_page) si.set_setting_value(si.settings.SYMBOL_CURRENT_PAGE, surface.sym_current_page, si.settings_type.SETTING_INT) sym.reload_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) end surface.lock = function() local locked = si.get_setting_value(si.settings.SYMBOL_LOCK_STATUS, si.settings_type.SETTING_INT) if locked < 2 then if locked == 0 then si.set_accessibility_string("@string/accessibility_lock_on") si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, 1, si.settings_type.SETTING_INT); else si.set_accessibility_string("@string/accessibility_lock_off") si.set_setting_value(si.settings.SYMBOL_LOCK_STATUS, 0, si.settings_type.SETTING_INT); end else si.set_accessibility_string("@string/accessibility_lock_disabled") end end surface.on_slip_up = surface.next_page surface.on_slip_down = surface.prev_page surface.update_lock_status(surface.sym_current_tab) sym.setup_chs_symbol(surface, symbol) for k, v in _G.pairs(symbol) do --si.print("#################setup_chs_symbol: " .. "sk_" .. k) --si.print("#################name: " .. sym_types_name[k]) surface.softkeys["sk_" .. k].main_title = sym_types_name[k] end sym.load_symbol(surface, symbol[surface.sym_current_tab], surface.sym_current_page) return surface PK n5:Q"r$5assets/spanish_sym_keyboard1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "keyboard_symbol" local si = smartinput local ck = common_keys local sym = keyboard_symbol local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "eng_sym_keyboard1_international" else surface.template = "eng_sym_keyboard1" end local symbol = { {"1", "2", "3", "+", "-", "@", "$", "(", ")"}, {"4", "5", "6", "*", "/", "'", "\"", ":", "#"}, {"7", "8", "9", ",", "=", "!", "?"}, {"0", "."}, } local enable_slide_symbol = true surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.touch_correct = false surface.extra_elements = { "popup_revert", "popup_explicit", } sym.setup_symbol( surface, symbol, sym.normal_symbol_alt_table, sym.spanish_symbol_expand_table, "1/2", "spanish_sym_keyboard2.sur.png", "spanish_sym_keyboard2.sur.png", enable_slide_symbol) surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_back"] = ck.sk_back_to_previous_abc return surface PK n5:Qff$5assets/spanish_sym_keyboard2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "keyboard_symbol" local si = smartinput local ck = common_keys local sym = keyboard_symbol local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "eng_sym_keyboard2_international" else surface.template = "eng_sym_keyboard2" end local symbol = { {"[", "]", "{", "}", "<", ">", "&", "_", "%", "√"}, {"|", "\\", "~", "•", "`", "...", "€", "¥", "£", "¢"}, {"α", "β", "^", "®", "©", "™", "π", "¤"} } local enable_slide_symbol = true surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.touch_correct = false surface.extra_elements = { "popup_revert", "popup_explicit", } sym.setup_symbol( surface, symbol, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table, "2/2", "spanish_sym_keyboard1.sur.png", "spanish_sym_keyboard1.sur.png", enable_slide_symbol) surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_back"] = ck.sk_back_to_previous_abc return surface PK n5:Q.Ng $5assets/spanish_sym_keyboard3.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" require "keyboard_symbol" require "emoji" local si = smartinput local ck = common_keys local sym = keyboard_symbol local emo = emoji local surface = si.new_surface("symbol") if si.is_international_version() then surface.template = "eng_sym_keyboard3_international" else surface.template = "eng_sym_keyboard3" end local symbol = { {{":-)", emotion=true}, {";-)", emotion=true}, {":-D", emotion=true}, {":-P", emotion=true}, {":-[", emotion=true}, {":'(", emotion=true}, {"=-O", emotion=true}}, {{":-(", emotion=true}, {"B-)", emotion=true}, {":-$", emotion=true}, {":O", emotion=true}, {":-*", emotion=true}, {":-!", emotion=true}, {":-\\", emotion=true}}, {"http://", "www.", ".com", ".net", ".org"} } local symbol_emoticon = { { {emo.emoji_code.EMOJI_SMILE, emotion=true}, {emo.emoji_code.EMOJI_JOY, emotion=true}, {emo.emoji_code.EMOJI_GRIN, emotion=true}, {emo.emoji_code.EMOJI_NAUGHTY, emotion=true}, {emo.emoji_code.EMOJI_CRY, emotion=true}, {emo.emoji_code.EMOJI_WEEP, emotion=true}, {emo.emoji_code.EMOJI_CONFUSED, emotion=true}, }, { {emo.emoji_code.EMOJI_SAD, emotion=true}, {emo.emoji_code.EMOJI_PLEASED, emotion=true}, {emo.emoji_code.EMOJI_HEARTSHAPED, emotion=true}, {emo.emoji_code.EMOJI_SURPRISE, emotion=true}, {emo.emoji_code.EMOJI_KISS, emotion=true}, {emo.emoji_code.EMOJI_WRONGED, emotion=true}, {emo.emoji_code.EMOJI_ANGRY, emotion=true}, }, {"http://", "www.", ".com", ".net", ".org"} } surface.surface_type = si.surface_type.SOFT_SYMBOL surface.surface_subtype = si.surface_subtype.SYMBOL_NUMBER surface.touch_correct = false surface.extra_elements = { "popup_revert", "popup_explicit", } local enable_slide_symbol = true if si.get_setting_value(si.settings.SYMBOL_DISPLAY_EMOTICON, si.settings_type.SETTING_BOOL) then sym.setup_symbol( surface, symbol_emoticon, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table, "3/3", "spanish_sym_keyboard1.sur.png", "spanish_sym_keyboard2.sur.png", enable_slide_symbol) else sym.setup_symbol( surface, symbol, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table, "3/3", "spanish_sym_keyboard1.sur.png", "spanish_sym_keyboard2.sur.png", enable_slide_symbol) end local sk_emo = si.new_softkey() sk_emo.on_click = function() local display_emoticon = si.get_setting_value(si.settings.SYMBOL_DISPLAY_EMOTICON, si.settings_type.SETTING_BOOL) si.set_setting_value(si.settings.SYMBOL_DISPLAY_EMOTICON, not display_emoticon, si.settings_type.SETTING_BOOL) if not display_emoticon then sym.reload_symbol( surface, symbol_emoticon, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table) else sym.reload_symbol( surface, symbol, sym.normal_symbol_alt_table, sym.normal_symbol_expand_table) end end surface.softkeys["sk_emo"] = sk_emo surface.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley surface.softkeys["sk_smiley_open"] = ck.sk_smiley_open surface.softkeys["sk_back"] = ck.sk_back_to_previous_abc return surface PK n5:Q$5assets/spanish_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "á", "à", "ã", "â", "å", "ä", "ą", "ā", "æ", "ª", "é", "è", "ê", "ë", "ę", "ē", "ė", "í", "ì", "î", "ï", "ī", "į", "ñ", "ń", "ó", "ò", "ô", "õ", "ö", "ō", "œ", "ø", "º", "ú", "ü", "ù", "û", "ū", "ç", "ć", "č", } local special_upper_list = { "Á", "À", "Ã", "Â", "Å", "Ä", "Ą", "Ā", "Æ", "ª", "É", "È", "Ê", "Ë", "Ę", "Ē", "Ė", "Í", "Ì", "Î", "Ï", "Ī", "Į", "Ñ", "Ń", "Ó", "Ò", "Ô", "Õ", "Ö", "Ō", "Œ", "Ø", "º", "Ú", "Ü", "Ù", "Û", "Ū", "Ç", "Ć", "Č", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } local accent_dictionary = { [string.byte("a")] = "áàãâåäąāæª", [string.byte("A")] = "ÁÀÃÂÅÄĄĀÆª", [string.byte("e")] = "éèêëęēė", [string.byte("E")] = "ÉÈÊËĘĒĖ", [string.byte("i")] = "íìîïīį", [string.byte("I")] = "ÍÌÎÏĪĮ", [string.byte("n")] = "ñń", [string.byte("N")] = "ÑŃ", [string.byte("o")] = "óòôõöōœøº", [string.byte("O")] = "ÓÒÔÕÖŌŒØº", [string.byte("u")] = "úüùûū", [string.byte("U")] = "ÚÜÙÛŪ", [string.byte("c")] = "çćč", [string.byte("C")] = "ÇĆČ", } local reversed_accent_dictionary = si.get_reversed_accent_dictionary(accent_dictionary) function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.get_original_letters(c) return reversed_accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q- 5assets/spanishlatin.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("ES", "spanishlatin") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.spanishlatinv5 .. "spanishlatin_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.spanishlatinv5 .. "spanishlatin_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.CU1, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.spanishlatinv5 .. "spanishlatin_soft_qwerty_spanishlatin.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.spanishlatinv5 .. "spanishlatin_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.spanishlatinv5 .. "spanishlatin_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.spanishlatinv5 .. "spanishlatin_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.CU1, }, { surface_id = pkg.spanishlatinv5 .. "spanishlatin_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.spanishlatinv5 .. "spanishlatin_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, { surface_id = pkg.spanishlatinv5 .. "spanishlatin_soft_tplus_qwerty_spanishlatin.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "spanish_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "spanish_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "spanish_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "spanish_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.spanishlatinv5 .. "spanishlatin_traits.trt.png" lng.statistic_alias = "spanishlatin" lng.categories[si.language.category.FASTSWITCH] = "spanish" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "spanishlatin" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "spanishlatin" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "es-la" lng.categories[si.language.category.EMOJI] = "spanish" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.spanishlatinv5 .. "spanishlatin.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.PURE_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.PURE_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.spanishlatinv5 .. "spanishlatin_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.spanishlatinv5 .. "spanishlatin_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.spanishlatinv5 .. "spanishlatin_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.spanishlatinv5 .. "spanishlatin_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY_SPANISHLATIN { file_name = pkg.spanishlatinv5 .. "spanishlatin_curve_cu.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.CUSTOM1 + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QFI%5assets/spanishlatin_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q둦"5assets/spanishlatin_cu1_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q踲%5assets/spanishlatin_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 0 81 48 162 s 48 81 96 162 d 96 81 144 162 f 144 81 192 162 g 192 81 240 162 h 240 81 288 162 j 288 81 336 162 k 336 81 384 162 l 384 81 432 162 ñ 432 81 480 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q&[%5assets/spanishlatin_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:QRW? ? '5assets/spanishlatin_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local ct = si.context local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.esp_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "spanish_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = ct.URI + ct.EMAIL + ct.DATE + ct.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Q\   )5assets/spanishlatin_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local pi = si.pending_input local ca = si.candidates local lc = lua_calls local s = sf.new_phonepad_keyboard( "spanish_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QˑL L '5assets/spanishlatin_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local ct = si.context local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.esp_full_qwerty_main_new local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "spanish_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "cu1" s.surface_layout = si.surface_layout.CU1 s.support_mode = ct.URI + ct.EMAIL + ct.DATE + ct.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Q= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.get_original_letters(c) return reversed_accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q y y 5assets/spanishus.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("ES", "spanishus") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.spanishusv5 .. "spanishus_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.spanishusv5 .. "spanishus_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.CU1, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.spanishusv5 .. "spanishus_soft_qwerty_spanishus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.spanishusv5 .. "spanishus_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.spanishusv5 .. "spanishus_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.spanishusv5 .. "spanishus_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.CU1, }, { surface_id = pkg.spanishusv5 .. "spanishus_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.spanishusv5 .. "spanishus_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, { surface_id = pkg.spanishusv5 .. "spanishus_soft_tplus_qwerty_spanishus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "spanish_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "spanish_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "spanish_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "spanish_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.spanishusv5 .. "spanishus_traits.trt.png" lng.statistic_alias = "spanishus" lng.categories[si.language.category.FASTSWITCH] = "spanish" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "spanishus" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "spanishus" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "es-us" lng.categories[si.language.category.EMOJI] = "spanish" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.spanishusv5 .. "spanishus.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.PURE_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.PURE_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.spanishusv5 .. "spanishus_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.spanishusv5 .. "spanishus_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY { file_name = pkg.spanishusv5 .. "spanishus_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.spanishusv5 .. "spanishus_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY_SPANISHUS { file_name = pkg.spanishusv5 .. "spanishus_curve_cu.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.CUSTOM1 + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QFI"5assets/spanishus_azerty_layout.pngUT n_n_n_ WГWГWГa 0 0 48 81 z 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 q 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 w 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q둦5assets/spanishus_cu1_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q踲"5assets/spanishus_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 0 81 48 162 s 48 81 96 162 d 96 81 144 162 f 144 81 192 162 g 192 81 240 162 h 240 81 288 162 j 288 81 336 162 k 336 81 384 162 l 384 81 432 162 ñ 432 81 480 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:Q&["5assets/spanishus_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 z 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 y 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:QRW? ? $5assets/spanishus_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local ct = si.context local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.esp_full_azerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "spanish_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = ct.URI + ct.EMAIL + ct.DATE + ct.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Q\   &5assets/spanishus_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local pi = si.pending_input local ca = si.candidates local lc = lua_calls local s = sf.new_phonepad_keyboard( "spanish_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QˑL L $5assets/spanishus_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local ct = si.context local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.esp_full_qwerty_main_new local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "spanish_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "cu1" s.surface_layout = si.surface_layout.CU1 s.support_mode = ct.URI + ct.EMAIL + ct.DATE + ct.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Q,S S .5assets/spanishus_soft_qwerty_spanishus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local ct = si.context local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.esp_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "spanish_soft_qwerty_spanishus", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = ct.URI + ct.EMAIL + ct.DATE + ct.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Q I I $5assets/spanishus_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local ct = si.context local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.esp_full_qwertz_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "spanish_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = ct.URI + ct.EMAIL + ct.DATE + ct.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Q#5assets/spanishus_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "spanish_soft_tplus_qwerty", kb.esp_tplus_qwerty_left_new, kb.esp_tplus_qwerty_right_new, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Q+*5assets/spanishus_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "spanish_soft_tplus_azerty", kb.esp_tplus_azerty_left, kb.esp_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:QcՄ45assets/spanishus_soft_tplus_qwerty_spanishus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "spanish_soft_tplus_qwerty_spanishus", kb.esp_tplus_qwerty_left, kb.esp_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.CU1 s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Q-*5assets/spanishus_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "spanish_soft_tplus_qwertz", kb.esp_tplus_qwertz_left, kb.esp_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.extra_elements = { "reverse_alt_title", "typing_speed_bar", } s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_spanish s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_spanish s.sync_sk_lng = lc.sync_sk_lng s.reverse_alt_title = lc.reverse_alt_title s.restore_alt_title = lc.restore_alt_title s.compound_word_input = lc.compound_word_input return s PK n5:Q$5assets/spanishus_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "á", "à", "ã", "â", "å", "ä", "ą", "ā", "æ", "ª", "é", "è", "ê", "ë", "ę", "ē", "ė", "í", "ì", "î", "ï", "ī", "į", "ñ", "ń", "ó", "ò", "ô", "õ", "ö", "ō", "œ", "ø", "º", "ú", "ü", "ù", "û", "ū", "ç", "ć", "č", } local special_upper_list = { "Á", "À", "Ã", "Â", "Å", "Ä", "Ą", "Ā", "Æ", "ª", "É", "È", "Ê", "Ë", "Ę", "Ē", "Ė", "Í", "Ì", "Î", "Ï", "Ī", "Į", "Ñ", "Ń", "Ó", "Ò", "Ô", "Õ", "Ö", "Ō", "Œ", "Ø", "º", "Ú", "Ü", "Ù", "Û", "Ū", "Ç", "Ć", "Č", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } local accent_dictionary = { [string.byte("a")] = "áàãâåäąāæª", [string.byte("A")] = "ÁÀÃÂÅÄĄĀÆª", [string.byte("e")] = "éèêëęēė", [string.byte("E")] = "ÉÈÊËĘĒĖ", [string.byte("i")] = "íìîïīį", [string.byte("I")] = "ÍÌÎÏĪĮ", [string.byte("n")] = "ñń", [string.byte("N")] = "ÑŃ", [string.byte("o")] = "óòôõöōœøº", [string.byte("O")] = "ÓÒÔÕÖŌŒØº", [string.byte("u")] = "úüùûū", [string.byte("U")] = "ÚÜÙÛŪ", [string.byte("c")] = "çćč", [string.byte("C")] = "ÇĆČ", } local reversed_accent_dictionary = si.get_reversed_accent_dictionary(accent_dictionary) function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.get_original_letters(c) return reversed_accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QƓOO5assets/surface_factory.lua.pngUT n_n_n_ WГWГWГrequire "string" require "smartinput" require "common_keys" local P = {} P._G = _G if _REQUIREDNAME == nil then surface_factory = P else _G[_REQUIREDNAME] = P end setfenv(1, P) local string = _G.string local si = _G.smartinput local pi = si.pending_input local ca = si.candidates local ck = _G.common_keys alt_input_num_sub = {"~", "$", "^", "%", "+", "=", "[", "]", "<", ">"} local function smart_alt_title(key, regular, special) _G.table.insert(si.language_related_key_table, key) key.input_alt_title = special key.normal_alt_title = regular local comma_mode = si.get_setting_value(si.settings.LANGUAGE_KEY_COMMA_MODE, si.settings_type.SETTING_BOOL) if _G.table.getn(si.get_enabled_languages()) == 1 or comma_mode then key.alt_title = special else key.alt_title = regular end key.alt_input = key.alt_title end local function parse_alt_inputs(key, regular) _G.table.insert(si.language_related_key_table, key) key.alt_title = regular[1] key.extra_symbol = regular[2] key.alt_input = key.alt_title end local function setup_surface_slide(surface) if not si.is_international_version() then surface.on_slip_left = ck.surface_on_slip_left surface.on_slip_right = ck.surface_on_slip_right end end local function get_num_title(index) local num_title if index <= #alt_input_num_sub then num_title = alt_input_num_sub[index] end return num_title; end local function shouldChangeNumLineSubTilte(surface, line) return line == 1 and si.is_num_line_enabled() and surface.surface_subtype == si.surface_subtype.KEYBOARD_FULL end local function setup_alt_title(surface, key, alt_input, line, row, supportChange) if alt_input and alt_input[line] then if _G.type(alt_input[line][row]) == "table" then alt_title_tmp = alt_input[line][row] if alt_title_tmp.type == "normal" then key.alt_title = alt_title_tmp[1] key.alt_input = alt_title_tmp[2] elseif alt_title_tmp.type == "input_match_symbol" then key.input_match_symbol_mode = true parse_alt_inputs(key, alt_title_tmp) elseif alt_title_tmp.type == "input_as_whole" then key.input_as_whole = true parse_alt_inputs(key, alt_title_tmp) else smart_alt_title(key, alt_title_tmp[1], alt_title_tmp[2]) end else if supportChange and shouldChangeNumLineSubTilte(surface, line) then local num_title = get_num_title(row) if num_title then key.alt_title = get_num_title(row) key.alt_input = get_num_title(row) else key.alt_title = alt_input[line][row] key.alt_input = alt_input[line][row] end else key.alt_title = alt_input[line][row] key.alt_input = alt_input[line][row] end end end end local function setup_shift_title(surface, key, shift_input, line, row, supportChange) if shift_input and shift_input[line] then local input_value = shift_input[line][row] if input_value then if _G.type(input_value) == "table" then if input_value.type == "normal" then key.shift_title = input_value[1] key.shift_input = input_value[2] end else if supportChange and shouldChangeNumLineSubTilte(surface, line) then local num_title = get_num_title(row) if num_title then key.shift_title = get_num_title(row) key.shift_input = get_num_title(row) else key.shift_title = input_value key.shift_input = input_value end else key.shift_title = input_value key.shift_input = input_value end end end end end local function get_real_title_case(title_case) if title_case == si.TITLE_CASE.CHANGE then if not si.get_setting_value(si.settings.SUPPORT_AUTO_CHANGE_TITLE_CASE, si.settings_type.SETTING_BOOL) then return si.TITLE_CASE.UPPER end end return title_case end function new_full_keyboard(name, main_input, alt_input, shift_input, has_mistyping, title_case, longpress_flag, expand_sur_table, script_inputs) local real_title_case = get_real_title_case(title_case) local surface = si.new_surface(name) local is_curve_mode = si.is_curve_layout() surface.surface_type = si.surface_type.SOFT_KEYBOARD surface.surface_subtype = si.surface_subtype.KEYBOARD_FULL surface.multi_input_type = si.input_mode.FUZZY surface.precise_input_type = si.input_mode.PREDICT + si.input_mode.PRECISE + si.input_mode.AUTO_DISABLE_PREDICT si.language_related_key_table = {} -- origin keyboard if main_input then slide_down_index = #main_input end setup_surface_keyboard_sub(surface, main_input, alt_input, shift_input, has_mistyping, title_case, longpress_flag, expand_sur_table, script_inputs, 1, slide_down_index, "sk_") add_num_row_surface(surface) setup_surface_slide(surface) ck.setup_dpad_keys(surface) return surface end function need_change_input(input) local input_num_len = 1 if input then local first_input = input[1] if first_input then for i = 1, #first_input do if first_input[i] and _G.tonumber(first_input[i]) then input_num_len = input_num_len + 1 end if input_num_len > 4 then return true end end end end return false end function setup_surface_keyboard_sub(surface, main_input, alt_input, shift_input, has_mistyping, title_case, longpress_flag, expand_sur_table, script_input, slide_up_index, slide_down_index, keyname, row_index) local real_title_case = get_real_title_case(title_case) local is_curve_mode = si.is_curve_layout() local support_change_alt_input = need_change_input(alt_input) local support_change_shift_input = need_change_input(shift_input) if main_input then for i = 1, #main_input do for j = 1, #main_input[i] do local key = si.new_softkey() key.mistyping_tolerant = has_mistyping -- main title & input key.main_input = main_input[i][j]; if real_title_case == si.TITLE_CASE.UPPER then key.main_title = si.to_upper_case(key.main_input) elseif real_title_case == si.TITLE_CASE.LOWER then key.main_title = si.to_lower_case(key.main_input) else key.main_title = key.main_input if real_title_case == si.TITLE_CASE.CHANGE then key.case_sensitive = true end end -- script title & input if script_input and script_input[i][j] and script_input[i][j] ~= "" then key.script_title = script_input[i][j] key.script_input = script_input[i][j] end -- alt title & input setup_alt_title(surface, key, alt_input, i, j, support_change_alt_input) -- shift title & input setup_shift_title(surface, key, shift_input, i, j, support_change_shift_input) -- long press key expand chars if expand_sur_table and expand_sur_table[i] and expand_sur_table[i][j] then key.expand_chars = expand_sur_table[i][j] end -- long press order flag if j == #main_input[i] and longpress_flag % 2 == 1 then key.longpress_order = true else key.longpress_order = false end -- special for the key who has more than 3 accent letters local expand_key_count = si.get_keycount_of_expand_sur(key) if j >= #main_input[i] / 2 + 2 and expand_key_count >= 3 then key.longpress_order = true end -- title case for expand key key.title_case = real_title_case -- full keyboard mistyping if has_mistyping and (key.main_input == "'" or key.main_input == "‘") then key.mistyping_tolerant = false end -- op function key.on_click = full_on_click if not is_curve_mode or i == slide_up_index then key.on_slide_up = full_on_slide_up end if key.alt_input and (not is_curve_mode or i == slide_down_index) then key.on_slide_down = on_slide_down end if expand_key_count > 1 then key.on_long_press_once = on_long_press_once else key.on_long_press_once = nil end if row_index then surface.softkeys[keyname .. row_index .. "_" .. j] = key else surface.softkeys[keyname .. i .. "_" .. j] = key end end longpress_flag = longpress_flag / 2 end end end function new_tplus_keyboard(name, left_input, right_input, alt_input, title_case, longpress_flag) local surface = si.new_surface(name) local real_title_case = get_real_title_case(title_case) surface.surface_layout = si.surface_layout.QW -- set default as QW surface.surface_type = si.surface_type.SOFT_KEYBOARD surface.surface_subtype = si.surface_subtype.KEYBOARD_TPLUS surface.multi_input_type = si.input_mode.FUZZY + si.input_mode.MULTITAP surface.precise_input_type = si.input_mode.PREDICT + si.input_mode.PRECISE si.language_related_key_table = {} if longpress_flag == nil then longpress_flag = 0 end for i = 1, #left_input do for j = 1, #left_input[i] do local key = si.new_softkey() -- left/right title & input key.left_input = left_input[i][j] key.right_input = right_input[i][j] if si.is_empty(key.left_input) or si.is_empty(key.right_input) then key.main_title = key.left_input ..key.right_input if real_title_case == si.TITLE_CASE.UPPER then key.main_title = si.to_upper_case(key.main_title) elseif real_title_case == si.TITLE_CASE.LOWER then key.main_title = si.to_lower_case(key.main_title) else key.main_title = key.main_title if real_title_case == si.TITLE_CASE.CHANGE then key.case_sensitive = true end end else if real_title_case == si.TITLE_CASE.UPPER then key.left_title = si.to_upper_case(key.left_input) key.right_title = si.to_upper_case(key.right_input) elseif real_title_case == si.TITLE_CASE.LOWER then key.left_title = si.to_lower_case(key.left_input) key.right_title = si.to_lower_case(key.right_input) else key.left_title = key.left_input key.right_title = key.right_input if real_title_case == si.TITLE_CASE.CHANGE then key.case_sensitive = true end end end -- alt title & input setup_alt_title(surface, key, alt_input, i, j, false) -- long press order flag if j == #left_input[i] and longpress_flag % 2 == 1 then key.longpress_order = true else key.longpress_order = false end -- special for the key who has more than 4 accent letters local expand_key_count = si.get_keycount_of_expand_sur(key) if j >= #left_input[i] - 1 and expand_key_count > 4 then key.longpress_order = true end -- title case for expand key key.title_case = real_title_case -- op function key.on_click = tplus_on_click key.on_slide_up = tplus_on_slide_up if key.alt_input then key.on_slide_down = on_slide_down end if not (si.is_empty(key.left_input) or si.is_empty(key.right_input)) then key.on_slide_left = tplus_on_slide_left key.on_slide_right = tplus_on_slide_right key.on_slide_upleft = tplus_on_slide_upleft key.on_slide_upright = tplus_on_slide_upright end key.on_long_press_once = on_long_press_once surface.softkeys["sk_" .. i .. "_" .. j] = key end longpress_flag = longpress_flag / 2 end setup_surface_slide(surface) ck.setup_dpad_keys(surface) return surface end function new_phonepad_keyboard(name, main_input, alt_input, title_case, longpress_flag, expand_sur_table, slide_input, multi_toggle_input) local real_title_case = get_real_title_case(title_case) local surface = si.new_surface(name) surface.surface_type = si.surface_type.SOFT_KEYBOARD surface.surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD surface.surface_layout = si.surface_layout.QW -- set default as QW surface.multi_input_type = si.input_mode.FUZZY + si.input_mode.MULTITAP surface.precise_input_type = si.input_mode.PREDICT + si.input_mode.PRECISE si.language_related_key_table = {} for i = 1, #main_input do for j = 1, #main_input[i] do local key = si.new_softkey() -- main title & input key.main_input = main_input[i][j]; if real_title_case == si.TITLE_CASE.UPPER then key.main_title = si.to_upper_case(key.main_input) elseif real_title_case == si.TITLE_CASE.LOWER then key.main_title = si.to_lower_case(key.main_input) else key.main_title = key.main_input if real_title_case == si.TITLE_CASE.CHANGE then key.case_sensitive = true end end -- alt title & input setup_alt_title(surface, key, alt_input, i, j, false) -- slide title & input if slide_input and slide_input[i][j] then key.slide_title = slide_input[i][j] key.slide_input = slide_input[i][j] end -- multi toggle title & input if multi_toggle_input and multi_toggle_input[i][j] then key.multi_toggle_title = multi_toggle_input[i][j] key.multi_toggle_input = multi_toggle_input[i][j] end -- long press key expand chars if expand_sur_table and expand_sur_table[i][j] then key.expand_chars = expand_sur_table[i][j] end -- long press order flag if j == #main_input[i] and longpress_flag % 2 == 1 then key.longpress_order = true else key.longpress_order = false end -- special for Row2 Col3 if i == 2 and j == 3 and longpress_flag % 2 == 1 then key.longpress_order = true end -- special for Col2 in one-handed layout if j == 2 or j == 3 then key.spec_longpress_order = true end -- special for the key who has more than 5 letters local expand_key_count = si.get_keycount_of_expand_sur(key) if (j == #main_input[i] or (i == 2 and j == 3)) and expand_key_count > 5 then key.longpress_order = true end -- title case for expand key key.title_case = real_title_case -- op function key.on_click = phonepad_on_click key.on_slide_up = phonepad_on_slide_up if key.alt_input then key.on_slide_down = on_slide_down end key.on_long_press_once = on_long_press_once -- slide op function if key.slide_input then key.on_slide_up = complement_on_slide_up key.on_slide_down = complement_on_slide_down key.on_slide_left = complement_on_slide_left key.on_slide_right = complement_on_slide_right end surface.softkeys["sk_" .. i .. "_" .. j] = key end longpress_flag = longpress_flag / 2 end setup_surface_slide(surface) ck.setup_dpad_keys(surface) return surface end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end function full_on_slide_up(sk, key_name) if sk.shift_input == nil then si.input_precise(sk.main_input, key_name, sk.alt_input, not si.is_shift_pressed()) else ck.clear_default_nextword() si.input_precise(sk.shift_input, key_name, "", si.is_shift_pressed()) end end function tplus_on_click(sk) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end if si.is_empty(sk.left_input) or si.is_empty(sk.right_input) then si.input_precise(sk.left_input .. sk.right_input, "", sk.alt_input, si.is_shift_pressed()) else si.input_multi(sk.left_input .. sk.right_input, sk.alt_input, si.is_shift_pressed()) end end function tplus_on_slide_up(sk) if si.is_empty(sk.left_input) or si.is_empty(sk.right_input) then si.input_precise(sk.left_input .. sk.right_input, "", sk.alt_input, not si.is_shift_pressed()) else si.input_multi(sk.left_input .. sk.right_input, sk.alt_input, not si.is_shift_pressed()) end end function tplus_on_slide_left(sk) if si.get_string_length(sk.left_input) < 2 then si.input_precise(sk.left_input, nil, nil, si.is_shift_pressed()) else si.input_multi(sk.left_input, nil, si.is_shift_pressed()) end end function tplus_on_slide_upleft(sk) si.input_multi(sk.left_input, nil, not si.is_shift_pressed()) end function tplus_on_slide_right(sk) if si.get_string_length(sk.right_input) < 2 then si.input_precise(sk.right_input, nil, nil, si.is_shift_pressed()) else si.input_multi(sk.right_input, nil, si.is_shift_pressed()) end end function tplus_on_slide_upright(sk) si.input_multi(sk.right_input, nil, not si.is_shift_pressed()) end function phonepad_on_click(sk) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end if sk.multi_toggle_input then si.input_multi_toggle(sk.main_input, sk.multi_toggle_input, sk.alt_input, si.is_shift_pressed()) elseif si.get_string_length(sk.main_input) < 2 then si.input_precise(sk.main_input, nil, sk.alt_input, si.is_shift_pressed()) else si.input_multi(sk.main_input, sk.alt_input, si.is_shift_pressed()) end end function phonepad_on_slide_up(sk) if si.get_string_length(sk.main_input) < 2 then si.input_precise(sk.main_input, "", sk.alt_input, not si.is_shift_pressed()) else si.input_multi(sk.main_input, sk.alt_input, not si.is_shift_pressed()) end end function on_slide_down(sk, key_name) if si.get_string_length(sk.alt_input) < 2 then ck.clear_default_nextword() si.input_precise(sk.alt_input, key_name, "", false) else si.input_string(sk.alt_input, false) if sk.input_match_symbol_mode ~= nil and sk.input_match_symbol_mode then si.input_keycode(_G.config.L_KEYCODE_EDIT_LEFT) end end end function on_long_press_once(sk) if si.handwrite_mask_visible() then return sk.on_click(sk) end expand_sur = si.get_expand_sur(sk) si.popup_surface(expand_sur) si.set_default_key(expand_sur.default_index) end function complement_on_slide_up(sk, key_name) if si.get_string_length(sk.slide_input) >= 2 then local input_code = "" input_code = si.u16char(si.u16code(sk.slide_input, 2)) si.input_precise(input_code, key_name, "", not si.is_shift_pressed()) end end function complement_on_slide_down(sk, key_name) if si.get_string_length(sk.slide_input) >= 4 then local input_code = "" input_code = si.u16char(si.u16code(sk.slide_input, 4)) si.input_precise(input_code, key_name, "", not si.is_shift_pressed()) end end function complement_on_slide_left(sk, key_name) if si.get_string_length(sk.slide_input) >= 1 then local input_code = "" input_code = si.u16char(si.u16code(sk.slide_input, 1)) si.input_precise(input_code, key_name, "", not si.is_shift_pressed()) end end function complement_on_slide_right(sk, key_name) if si.get_string_length(sk.slide_input) >= 3 then local input_code = "" input_code = si.u16char(si.u16code(sk.slide_input, 3)) si.input_precise(input_code, key_name, "", not si.is_shift_pressed()) end end function add_edit_surface(surface) sk_editors = {"copy", "paste", "cut", "up", "down", "left", "right", "pdown", "pup", "home", "end", "select", "del", "selectall", "space", "done", "edit_addword", "edit_op"} for i, title in _G.pairs(sk_editors) do key = new_softkey() key.main_title = "@string/edit_" .. title key.case_sensitive = false surface.softkeys["sk_" .. title] = key function key.on_click() input_keycode(_G.config.L_KEYCODE_EDIT_KEY_BEGIN + i - 1) end end surface.softkeys["sk_up"].main_title = nil surface.softkeys["sk_down"].main_title = nil surface.softkeys["sk_left"].main_title = nil surface.softkeys["sk_right"].main_title = nil end function add_num_row_surface(surface) sk_num = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"} for i, title in _G.pairs(sk_num) do local key = si.new_softkey() key.main_title = title key.main_input = title key.on_click = full_on_click surface.softkeys["sk_num_" .. (i-1)] = key end end PK n5:Qm-665assets/swahili.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("SW", "Swahili") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, { surface_id = pkg.swahiliv5 .. "swahili_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.swahiliv5 .. "swahili_traits.trt.png" lng.statistic_alias = "swahili" lng.categories[si.language.category.FASTSWITCH] = "swahili" lng.categories[si.language.category.SUBTYPE] = "swahili" lng.categories[si.language.category.MIXINPUT] = "swahili" lng.categories[si.language.category.CELLDICT] = "swahili" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "swahili" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.swahiliv5 .. "swahili.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.swahiliv5 .. "swahili_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.swahiliv5 .. "swahili_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q'"5assets/swahili_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local ca = si.candidates local ts = si.tri_status local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() template = "eng_soft_qwerty_international" alt_inputs = kb.eng_full_qwerty_alt_international local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "swahili_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end --process special key function new_expandkey(title) local key = si.new_softkey() key.main_title = title key.main_input = title key.on_click = function () local pi = si.pending_input local ca = si.candidates if not pi.range_exist(pi.L_RANGE_PENDING + pi.L_RANGE_CURVE + pi.L_RANGE_CONFIRM) then local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() end si.input_string(key.main_input, false) end return key end local sk = s.softkeys["sk_2_5"] sk.on_long_press_once = function() local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end if ts.get_tri_status(ts.CAPSLOCK) == ts.NORMAL then sur.softkeys[1] = new_expandkey(si.to_lower_case(sk.main_input)) sur.softkeys[2] = new_expandkey("g'") else sur.softkeys[1] = new_expandkey(si.to_upper_case(sk.main_input)) sur.softkeys[2] = new_expandkey("G'") end sur.softkeys[3] = new_expandkey(sk.alt_input) si.popup_surface(sur) end sk_s = s.softkeys["sk_2_2"] sk_s.on_long_press_once = function() local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end if ts.get_tri_status(ts.CAPSLOCK) == ts.NORMAL then sur.softkeys[1] = new_expandkey(si.to_lower_case(sk_s.main_input)) sur.softkeys[2] = new_expandkey("ß") else sur.softkeys[1] = new_expandkey(si.to_upper_case(sk_s.main_input)) sur.softkeys[2] = new_expandkey("SS") end sur.softkeys[3] = new_expandkey(sk_s.alt_input) si.popup_surface(sur) end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QcZ555assets/swahili_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "ā", "æ", "ç", "è", "é", "ê", "ë", "ē", "î", "ï", "í", "ì", "ī", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "ù", "û", "ü", "ú", "ū", "ñ", "ß", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Ā", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ē", "Î", "Ï", "Í", "Ì", "Ī", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "Ù", "Û", "Ü", "Ú", "Ū", "Ñ", } local accent_letter_dictionary = { [string.byte("a")] = "äàâáãåāæ", [string.byte("c")] = "ç", [string.byte("e")] = "èéêëē", [string.byte("i")] = "ïîíìī", [string.byte("o")] = "öôóòõōœø", [string.byte("u")] = "üùûúū", [string.byte("n")] = "ñ", [string.byte("A")] = "ÄÀÂÁÃÅĀÆ", [string.byte("C")] = "Ç", [string.byte("E")] = "ÈÉÊËĒ", [string.byte("I")] = "ÏÎÍÌĪ", [string.byte("O")] = "ÖÔÓÒÕŌŒØ", [string.byte("U")] = "ÜÙÛÚŪ", [string.byte("N")] = "Ñ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q\ʣ&&5assets/swedish.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("SV", "Swedish") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.swedishv5 .. "swedish_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, }, { surface_id = pkg.swedishv5 .. "swedish_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.swedishv5 .. "swedish_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, surface_layout = si.surface_layout.QW, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.swedishv5 .. "swedish_traits.trt.png" lng.statistic_alias = "swedish" lng.categories[si.language.category.FASTSWITCH] = "swedish" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "swedish" lng.categories[si.language.category.CELLDICT] = "swedish" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "swedish" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.swedishv5 .. "swedish.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { -- QWERTY { file_name = pkg.swedishv5 .. "swedish_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, { file_name = pkg.swedishv5 .. "swedish_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q| 5assets/swedish_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 44 81 w 44 0 87 81 e 87 0 131 81 r 131 0 174 81 t 174 0 218 81 y 218 0 261 81 u 261 0 305 81 i 305 0 348 81 o 348 0 392 81 p 392 0 435 81 å 435 0 479 81 a 0 81 44 162 s 44 81 87 162 d 87 81 131 162 f 131 81 174 162 g 174 81 218 162 h 218 81 261 162 j 261 81 305 162 k 305 81 348 162 l 348 81 392 162 ö 392 81 435 162 ä 435 81 479 162 z 87 162 131 243 x 131 162 174 243 c 174 162 218 243 v 218 162 261 243 b 261 162 305 243 n 305 162 348 243 m 348 162 392 243 PK n5:Qt3~$5assets/swedish_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local pi = si.pending_input local ca = si.candidates local lc = lua_calls local s = sf.new_phonepad_keyboard( "swedish_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q5X5assets/tagalog.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("TL", "Tagalog") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.tagalogv5 .. "tagalog_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.tagalogv5 .. "tagalog_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.tagalogv5 .. "tagalog_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.tagalogv5 .. "tagalog_traits.trt.png" lng.statistic_alias = "tagalog" lng.categories[si.language.category.FASTSWITCH] = "tagalog" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "tagalog" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "tagalog" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.tagalogv5 .. "tagalog.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.tagalogv5 .. "tagalog_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.tagalogv5 .. "tagalog_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q:$5assets/tagalog_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "tagalog_soft_phonepad", kb.tl_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qi} } "5assets/tagalog_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.tl_full_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.spanish_full_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_curve_email_uri_international" else template = "eng_soft_azerty_curve_international" end alt_inputs = kb.spanish_full_alt_curve_international shift_inputs = kb.spanish_full_shift_international end local s = sf.new_full_keyboard( "tagalog_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QߴluZZ(5assets/tagalog_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "tagalog_soft_qwerty", kb.eng_tplus_qwerty_left, kb.tl_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QPo@5assets/tagalog_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "ñ", } local special_upper_list = { "Ñ", } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q=5assets/tamil.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("TA", "Tamil") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.tamilv5 .. "tamil_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.tamilv5 .. "tamil_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.tamilv5 .. "tamil_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.TAMIL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.TAMIL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.tamilv5 .. "tamil_traits.trt.png" lng.statistic_alias = "tamil" lng.categories[si.language.category.FASTSWITCH] = "tamil" lng.categories[si.language.category.SUBTYPE] = "tamil" lng.categories[si.language.category.MIXINPUT] = "tamil" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "tamil" lng.categories[si.language.category.LAYOUT] = "tamil" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.tamilv5 .. "tamil.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QDU !5assets/tamil_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.ta_full_main1 local expand_long_press_inputs = kb.ta_full_expand_long_press_input local input_type = si.input_type() template = "tamil_soft_full_international" alt_inputs = kb.ta_alt_full shift_inputs = nil local s = sf.new_full_keyboard( "tamil_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.match_surface = pkg.tamilv5 .. "tamil_soft_qwerty2.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_3_8"].on_slide_down = function() si.input_series_precise("க்ஷ", "", "", false, 0) end s.softkeys["sk_3_9"].on_slide_down = function() si.input_series_precise("ஶ்ரீ", "", "", false, 0) end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_tamil s.softkeys["Dot"] = ck.sk_dot_changeable_tamil s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QY Y !5assets/tamil_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.ta_full_main2 local input_type = si.input_type() template = "tamil_soft_full_international" alt_inputs = nil shift_inputs = nil local s = sf.new_full_keyboard( "tamil_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.tamilv5 .. "tamil_soft_qwerty1.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_3_8"].on_click = function(sk) si.input_series_precise(sk.main_title, "", "", false, 0) end s.softkeys["sk_3_9"].on_click = function(sk) si.input_series_precise(sk.main_title, "", "", false, 0) end local expand_sur = si.new_surface("expand") expand_sur.surface_type = si.surface_type.POPUP_EXPAND function on_long_press_once(sk) expand_sur.softkeys = {} local key = si.new_expandkey_by_title(sk.main_title) key.on_click = function () si.input_series_precise(sk.main_title, "", "", false, 0) end expand_sur.softkeys[1] = key si.popup_surface(expand_sur) end s.softkeys["sk_3_8"].on_long_press_once = on_long_press_once s.softkeys["sk_3_9"].on_long_press_once = on_long_press_once s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_tamil s.softkeys["Dot"] = ck.sk_dot_changeable_tamil s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q2/g**!5assets/tamil_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.ta_full_qwertz_main local script_inputs = kb.ta_full_qwertz_script local expand_long_press_inputs = kb.ta_full_qwertz_expand_long_press_input local input_type = si.input_type() template = "tamil_soft_qwertz_full_international" alt_inputs = nil shift_inputs = nil local s = sf.new_full_keyboard( "tamil_soft_qwertz1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.template = template s.match_surface = nil s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local input_precise_key = true local language = si.get_current_language() if input_precise_key then local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end local sk_4_8 = s.softkeys["sk_4_8"] sk_4_8.on_long_press_once = nil sk_4_8.on_click = function() si.input_series_precise(sk_4_8.main_input, "", "", si.is_shift_pressed(), 0) end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_tamil s.softkeys["Dot"] = ck.sk_dot_changeable_tamil s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q[HNN5assets/tamil_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0b80 local z_code = 0x0bff local A_code = 0x0b80 local Z_code = 0x0bff local zero_code = 0x0be6 local nine_code = 0x0bef local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { [si.u16code("ஆ",1)] = "ா", [si.u16code("இ",1)] = "ி", [si.u16code("ஈ",1)] = "ீ", [si.u16code("உ",1)] = "ு", [si.u16code("ஊ",1)] = "ூ", [si.u16code("எ",1)] = "ெ", [si.u16code("ஏ",1)] = "ே", [si.u16code("ஐ",1)] = "ை", [si.u16code("ஒ",1)] = "ொ", [si.u16code("ஓ",1)] = "ோ", [si.u16code("ஔ",1)] = "ௌ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } local special_consonant_list = { "க", "ங", "ச", "ஞ", "ட", "ண", "த", "ந", "ப", "ம", "ய", "ர", "ல", "வ", "ழ", "ள", "ற", "ன", "ஷ", "ஸ", "ஜ", "ஹ", "ஶ", } local special_vowel_script_list = { "்", "ா", "ி", "ீ", "ு", "ூ", "ெ", "ே", "ை", "ொ", "ோ", "ௌ", } local special_vowel_script_dictionary = { [0x0BCD] = "அ", [0x0BBE] = "ஆ", [0x0BBF] = "இ", [0x0BC0] = "ஈ", [0x0BC1] = "உ", [0x0BC2] = "ஊ", [0x0BC6] = "எ", [0x0BC7] = "ஏ", [0x0BC8] = "ஐ", [0x0BCA] = "ஒ", [0x0BCB] = "ஓ", [0x0BCC] = "ஔ", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_tone_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif not traits.is_attach_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.is_special_vowel_script_case(c) for i, v in ipairs(special_vowel_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.get_normal_script_main_character(script) local code = si.u16code(script, 1) if traits.is_special_vowel_script_case(code) then return special_vowel_script_dictionary[code] end return script; end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_contain_vowel_tone_case(str) if str == "க்ஷ" then return false end for c in si.u16_iter(str) do if traits.is_special_vowel_script_case(c) then return true end end return false end function traits.is_attach_case(str) local length = si.get_string_length(str) local last_text = _G.string.sub(str, length-2, length) local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then return true elseif traits.is_special_vowel_script_case(code) then return false end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.is_upper_case(c) local char_code = c return ((char_code >= A_code and char_code <= Z_code) and not traits.is_num_character(c)) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return ((char_code >= a_code and char_code <= z_code) and not traits.is_num_character(c)) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif traits.is_num_character(c) then return false elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_tamil_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_tamil_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_tamil_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_tamil_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PKk5:Q5assets/tark_ad_init_config.jsonUT  n_ n_ n_ w@TГw@TГw@TГMK1E+VJi.,+ъ7k/$3 7uCl{y/9LJ2H oOA7u& b@C&ylVǧuYҴ<1N&5y[HIdb m'o>vuIRњ9$"@*~GZk x㒣(~PKK;FPK n5:QG:c~~5assets/tatar.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("TA", "tatar") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.tatarv5 .. "tatar_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.tatarv5 .. "tatar_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "chs_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.tatarv5 .. "tatar_traits.trt.png" lng.statistic_alias = "tatar" lng.categories[si.language.category.FASTSWITCH] = "tatar" lng.categories[si.language.category.SUBTYPE] = "tatar" lng.categories[si.language.category.MIXINPUT] = "tatar" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "tatar" lng.categories[si.language.category.LAYOUT] = "tatar" lng.categories[si.language.category.SPEED] = "western" lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QYͮc c 5assets/tatar_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local ct = si.context local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "kirghiz_soft_full_international" local alt_inputs local shift_inputs local main_inputs = kb.russian_full_main if not is_curve_mode and not is_wave_mode then alt_inputs = kb.russian_full_alt else alt_inputs = kb.russian_full_alt_curve shift_inputs = kb.russian_full_shift_curve end local s = sf.new_full_keyboard( "russian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) local input_type = si.input_type() s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = ct.DATE + ct.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q߳* * 5assets/tatar_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local ct = si.context local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "tatar_soft_full_international" local alt_inputs = kb.tatar_full_alt local shift_inputs local main_inputs = kb.tatar_full_main local expand_long_press_inputs = kb.bn_full_qwerty_expand_long_press_input local s = sf.new_full_keyboard( "tatar_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) local input_type = si.input_type() s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = ct.DATE + ct.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QګFKK5assets/tatar_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = si.u16code("а", 1) local r_code = si.u16code("я", 1) local A_code = si.u16code("А", 1) local R_code = si.u16code("Я", 1) local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } local special_lower_list = { "ё", "Ъ", "ө", "ә", "ү", "ң", "җ", "һ", } local special_upper_list = { "Ё", "Ъ", "Ө", "Ә", "Ү", "Ң", "Җ", "Һ", } local accent_dictionary = { [si.u16code("е", 1)] = "ё", [si.u16code("ь", 1)] = "ъ", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= R_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= r_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if char_code >= a_code and char_code <= r_code then return true elseif char_code >= A_code and char_code <= R_code then return true elseif traits.is_special_lower_case(c) then return true elseif traits.is_special_upper_case(c) then return true else return false end end function traits.is_userword_character(c) return ct.is_cyrillic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= r_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= R_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= r_code then return true elseif c >= A_code and c <= R_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_begin_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:QO&775assets/telugu.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("TE", "Telugu") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.teluguv5 .. "telugu_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.teluguv5 .. "telugu_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.teluguv5 .. "telugu_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.teluguv5 .. "telugu_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.teluguv5 .. "telugu_soft_azerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.DATE, }, { surface_id = pkg.teluguv5 .. "telugu_soft_azerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", currency_type = si.currency_type.TELUGU, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.teluguv5 .. "telugu_traits.trt.png" lng.statistic_alias = "telugu" lng.categories[si.language.category.FASTSWITCH] = "telugu" lng.categories[si.language.category.SUBTYPE] = "telugu" lng.categories[si.language.category.MIXINPUT] = "telugu" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "telugu" lng.categories[si.language.category.LAYOUT] = "telugu" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.teluguv5 .. "telugu.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qx8"5assets/telugu_soft_azerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.te_full_azerty_main1 local script_inputs = kb.te_full_azerty_script1 local expand_long_press_inputs = kb.te_full_azerty_expand_long_press_input1 local input_type = si.input_type() template = "telugu_soft_azerty_international" local s = sf.new_full_keyboard( "telugu_soft_azerty1", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.template = template s.match_surface = pkg.teluguv5 .. "telugu_soft_azerty2.sur.png" s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_zwj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QF"5assets/telugu_soft_azerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.te_full_azerty_main2 local script_inputs = kb.te_full_azerty_script2 local expand_long_press_inputs = kb.te_full_azerty_expand_long_press_input2 local input_type = si.input_type() template = "telugu_soft_azerty2_international" local s = sf.new_full_keyboard( "telugu_soft_azerty2", main_inputs, nil, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs, script_inputs) s.template = template s.match_surface = pkg.teluguv5 .. "telugu_soft_azerty1.sur.png" s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then local eat_previous_keycode_size = 0 if sk.script_input ~= nil and sk.script_input ~= "" and sk.eat_previous_key then local script_input_len = si.get_string_length(sk.script_input) if main_input_len > script_input_len then eat_previous_keycode_size = main_input_len - script_input_len end end si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), eat_previous_keycode_size) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end for j = 1, 10 do local sk = s.softkeys["sk_" .. 1 .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end for j = 1, 9 do local sk = s.softkeys["sk_" .. 2 .. "_" .. j] sk.on_click = full_on_click sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT end local sk_5_6 = s.softkeys["sk_5_6"] sk_5_6.on_click = full_on_click sk_5_6.support_expand_char_type = si.expand_char_type.EXPAND_INPUT local sk_5_7 = s.softkeys["sk_5_7"] sk_5_7.on_click = full_on_click sk_5_7.support_expand_char_type = si.expand_char_type.EXPAND_INPUT function full_on_click_commit(sk, key_name) if not pi.empty() then pi.commit_input() si.input_string(sk.main_title, true) else local default = ca.get_default_index() if default ~= 0 and ca.get_item_source(ca.get_item(default)) == ca.SOURCE_EXTERNALCAND then ca.confirm_item_2(default) end ca.clear() si.input_string(sk.main_title, true) end end function on_long_press(sk) if si.handwrite_mask_visible() then return sk.on_click(sk) end local sur = si._G.dofile("expand.sur") if (sur == nil) then sur = si.new_surface("expand.sur") sur.surface_type = si.surface_type.POPUP_EXPAND end local key1 = si.new_softkey() key1.main_title = sk.main_title key1.main_input = sk.main_input key1.on_click = full_on_click_commit sur.softkeys[1] = key1 si.popup_surface(sur) end for j = 1, 10 do local sk = s.softkeys["sk_" .. 3 .. "_" .. j] sk.on_click = full_on_click_commit sk.on_long_press_once = on_long_press end for j = 1, 10 do local sk = s.softkeys["sk_" .. 4 .. "_" .. j] sk.on_click = full_on_click_commit sk.on_long_press_once = on_long_press end for j = 1, 5 do local sk = s.softkeys["sk_" .. 5 .. "_" .. j] sk.on_click = full_on_click_commit sk.on_long_press_once = on_long_press end local sk_2_10 = s.softkeys["sk_2_10"] sk_2_10.on_click = full_on_click_commit sk_2_10.on_long_press_once = on_long_press s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_zwj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q:U  "5assets/telugu_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.te_full_main1 local input_type = si.input_type() template = "telugu_soft_qwerty_international" alt_inputs = kb.te_alt_full shift_inputs = nil local s = sf.new_full_keyboard( "telugu_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.teluguv5 .. "telugu_soft_qwerty2.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q:_~ ~ "5assets/telugu_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.te_full_main2 local input_type = si.input_type() template = "telugu_soft_qwerty_international" alt_inputs = kb.te_alt_full shift_inputs = nil local s = sf.new_full_keyboard( "telugu_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.teluguv5 .. "telugu_soft_qwerty1.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q md d "5assets/telugu_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template = "telugu_soft_qwertz_international" local alt_inputs = kb.te_qz_alt_full local shift_inputs = nil local main_inputs = kb.te_full_qz_main1 local input_type = si.input_type() local s = sf.new_full_keyboard( "telugu_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.teluguv5 .. "telugu_soft_qwertz2.sur.png" s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q  "5assets/telugu_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template = "telugu_soft_qwertz2_international" local alt_inputs = kb.te_qz_alt_full local shift_inputs = nil local main_inputs = kb.te_full_qz_main2 local input_type = si.input_type() local s = sf.new_full_keyboard( "telugu_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.teluguv5 .. "telugu_soft_qwertz1.sur.png" s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end function full_on_click(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local main_input_len = si.get_string_length(sk.main_input) if main_input_len > 1 then si.input_series_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed(), 0) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.on_click = full_on_click end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q')')5assets/telugu_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0c00 local z_code = 0x0c7f local A_code = 0x0c00 local Z_code = 0x0c7f local zero_code = 0x0c66 local nine_code = 0x0c6f local special_semivowel_code = si.u16code("్", 1) local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } local special_semivowel_list = { "్", } local special_vowel_list = { "ా", "ి", "ీ", "ు", "ూ", "ృ", "ౄ", "ె", "ే", "ై", "ొ", "ో", "ౌ", "ం", "ః", "ఽ", "ఁ", "అ", "ఆ", "ఇ", "ఈ", "ఉ", "ఊ", "ఋ", "ౠ", "ఎ", "ఏ", "ఐ", "ఒ", "ఓ", "ఔ", } local special_consonant_list = { "క", "ఖ", "గ", "ఘ", "చ", "ఛ", "జ", "ఝ", "ఞ", "ట", "ఠ", "డ", "ఢ", "ణ", "త", "థ", "ద", "ధ", "న", "ప", "ఫ", "బ", "భ", "మ", "య", "ర", "ల", "వ", "ళ", "శ", "ష", "హ", "ఱ", "ఙ", } local special_script_list = { "్", "ా", "ి", "ీ", "ు", "ూ", "ృ", "ౄ", "ె", "ే", "ై", "ొ", "ో", "ౌ", "ఽ", "ఁ", } local special_script_dictionary = { [si.u16code("్", 1)] = "అ", [si.u16code("ా", 1)] = "ఆ", [si.u16code("ి", 1)] = "ఇ", [si.u16code("ీ", 1)] = "ఈ", [si.u16code("ు", 1)] = "ఉ", [si.u16code("ూ", 1)] = "ఊ", [si.u16code("ృ", 1)] = "ఋ", [si.u16code("ౄ", 1)] = "ౠ", [si.u16code("ె", 1)] = "ఎ", [si.u16code("ే", 1)] = "ఏ", [si.u16code("ై", 1)] = "ఐ", [si.u16code("ొ", 1)] = "ఒ", [si.u16code("ో", 1)] = "ఓ", [si.u16code("ౌ", 1)] = "ఔ", [si.u16code("ఽ", 1)] = "ఽ", [si.u16code("ఁ", 1)] = "ఁ", } local special_commit_list = { "ౘ", "౸", "౹", "౺", "౻", "౼", "౽", "౾", "౿", "ౠ", "ౡ", "₹", "ౢ", "ౣ", "ౕ", "ౖ", } function traits.get_script_main_character(script) local last_series_precise_input = traits.get_last_series_precise_text() local code = si.u16code(script, 1) if si.is_empty(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_contain_vowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) elseif traits.is_end_with_semivowel_case(last_series_precise_input) then return traits.get_normal_script_main_character(script) else return last_series_precise_input..script end end function traits.get_last_series_precise_text() local last_text_from_user_input = pi.get_last_text_from_user_input(5) if not si.is_empty(last_text_from_user_input) then if traits.is_contain_triple_consonant_case(last_text_from_user_input) then return last_text_from_user_input end local string_len = si.get_string_length(last_text_from_user_input) if string_len > 3 then last_text_from_user_input = _G.string.sub(last_text_from_user_input, string_len-2, string_len) end if traits.is_contain_double_consonant_case(last_text_from_user_input) then return last_text_from_user_input end end local precise_input = pi.get_last_series_precise_input() if pi.empty() or si.is_empty(precise_input) then local n, str = si.get_text_before_cursor(1) if n == 1 then local code = si.u16code(str, 1) if traits.is_special_consonant_case(code) then precise_input = str end end end return precise_input end function traits.get_normal_script_main_character(script) local string_len = si.get_string_length(script) if string_len > 1 then return script end local code = si.u16code(script, 1) if traits.is_special_script_case(code) then return special_script_dictionary[code] end return script; end function traits.is_contain_vowel_case(str) for c in si.u16_iter(str) do if traits.is_special_vowel_case(c) then return true end end return false end function traits.is_contain_double_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 3 then return false end local code_fr = si.u16code(str, 1) local code_se = si.u16code(str, 2) local code_th = si.u16code(str, 3) if code_se == special_semivowel_code and traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) then return true end return false end function traits.is_contain_triple_consonant_case(str) if si.is_empty(str) then return false end local str_size = si.get_string_length(str) if str_size ~= 5 then return false end local code_se = si.u16code(str, 2) local code_fo = si.u16code(str, 4) if code_se == special_semivowel_code and code_fo == special_semivowel_code then local code_fr = si.u16code(str, 1) local code_th = si.u16code(str, 3) local code_fi = si.u16code(str, 5) if traits.is_special_consonant_case(code_fr) and traits.is_special_consonant_case(code_th) and traits.is_special_consonant_case(code_fi) then return true end return false end return false end function traits.is_special_script_case(c) for i, v in ipairs(special_script_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_vowel_case(c) for i, v in ipairs(special_vowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_end_with_semivowel_case(str) local str_size = si.get_string_length(str) local code = si.u16code(str, str_size) return traits.is_special_semivowel_case(code) end function traits.is_special_semivowel_case(c) for i, v in ipairs(special_semivowel_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_consonant_case(c) for i, v in ipairs(special_consonant_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_num_character(c) local char_code = c return char_code >= zero_code and char_code <= nine_code end function traits.is_special_commit_case(c) for i, v in ipairs(special_commit_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return ((char_code >= A_code and char_code <= Z_code) and not traits.is_num_character(c) and not traits.is_special_commit_case(c)) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return ((char_code >= a_code and char_code <= z_code) and not traits.is_num_character(c) and not traits.is_special_commit_case(c)) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif traits.is_num_character(c) then return false elseif traits.is_special_commit_case(c) then return false elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_telugu_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_telugu_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_telugu_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_telugu_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Q ՙDD5assets/thai.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("TH", "Thai") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.thaiv5 .. "thai_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.thaiv5 .. "thai_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.thaiv5 .. "thai_traits.trt.png" lng.statistic_alias = "thai" lng.categories[si.language.category.FASTSWITCH] = "thai" lng.categories[si.language.category.SUBTYPE] = "thai" lng.categories[si.language.category.MIXINPUT] = "thai" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "thai" lng.categories[si.language.category.LAYOUT] = "thai" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.thaiv5 .. "thai.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QIo o 5assets/thai_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.thai_full_qwerty_main1 local input_type = si.input_type() template = "thai_soft_qwerty_international" alt_inputs = nil shift_inputs = nil local expand_long_press_inputs = { {"%", "+", "๑", "๒", "๓", "๔", "ู", "฿", "๕", "๖", "๗", "๘", "๙", }, {"๐", "\"", "ฎ", "ฑ", "ธ", "ํ", "๊", "ณ", "ฯ", "ญ", "ฐ", ",", "ฅ", }, {"ฤ", "ฆ", "ฏ", "โ", "ฌ", "็", "๋", "ษ", "ศ", "ซ", ".", }, {"(", ")", "ฉ", "ฮ", "ฺ", "์", "?", "ฒ", "ฬ", "ฦ", }, } local s = sf.new_full_keyboard( "thai_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.match_surface = pkg.thaiv5 .. "thai_soft_qwerty2.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = false s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.precise_input_type = si.input_mode.PREDICT + si.input_mode.PRECISE s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end -- not correct mistyping for symbol s.softkeys["sk_1_1"].mistyping_tolerant = false s.softkeys["sk_1_3"].mistyping_tolerant = false s.softkeys["sk_1_4"].mistyping_tolerant = false s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QW 5assets/thai_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs local shift_inputs local main_inputs = kb.thai_full_qwerty_main2 local input_type = si.input_type() template = "thai_soft_qwerty_international" alt_inputs = nil shift_inputs = nil local s = sf.new_full_keyboard( "thai_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.match_surface = pkg.thaiv5 .. "thai_soft_qwerty1.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = false s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.precise_input_type = si.input_mode.PREDICT + si.input_mode.PRECISE if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end -- not correct mistyping for symbol s.softkeys["sk_1_1"].mistyping_tolerant = false s.softkeys["sk_1_2"].mistyping_tolerant = false s.softkeys["sk_2_2"].mistyping_tolerant = false s.softkeys["sk_2_12"].mistyping_tolerant = false s.softkeys["sk_3_11"].mistyping_tolerant = false s.softkeys["sk_4_1"].mistyping_tolerant = false s.softkeys["sk_4_2"].mistyping_tolerant = false s.softkeys["sk_4_7"].mistyping_tolerant = false s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QƊ5assets/thai_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = "" traits.case_sensitive = false local a_code = 0x0E00 local z_code = 0x0E7F local A_code = 0x0E00 local Z_code = 0x0E7F local thai_letter_level_1 = 1 local thai_letter_level_2 = 2 local thai_letter_level_3 = 3 local thai_letter_level_4 = 4 local thai_letter_level_special = 5 local thai_letter_other = 6 local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local thai_letter_level_one_list = { "ุ","ู","ฺ", } local thai_letter_level_two_list = { "ก","ข","ฃ","ค","ฅ","ฆ","ง","จ","ฉ","ช", "ซ","ฌ","ญ","ฎ","ฏ","ฐ","ฑ","ฒ","ณ","ด", "ต","ถ","ท","ธ","น","บ","ป","ผ","ฝ","พ", "ฟ","ภ","ม","ย","ร","ฤ","ล","ฦ","ว","ศ", "ษ","ส","ห","ฬ","อ","ฮ","ฯ","ะ","า","ำ", "฿","เ","แ","ๅ","ๆ","๐","๑","๒","๓","๔", "๕","๖","๗","๘","๙", } local thai_letter_level_three_list = { "ั","ิ","ี","ึ","ื","ํ", } local thai_letter_level_four_list = { "็","่","้","๊","๋","์", } local thai_letter_level_special_list = { "ฯ","า","เ","แ","โ","ไ","ๅ","ๆ","ใ", } function traits.is_thai_level_one_character(c) for i, v in ipairs(thai_letter_level_one_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_thai_level_two_character(c) for i, v in ipairs(thai_letter_level_two_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_thai_level_three_character(c) for i, v in ipairs(thai_letter_level_three_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_thai_level_four_character(c) for i, v in ipairs(thai_letter_level_four_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_thai_level_special_character(c) for i, v in ipairs(thai_letter_level_special_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.get_thai_letter_level_character(c) if traits.is_thai_level_special_character(c) then return thai_letter_level_special elseif traits.is_thai_level_one_character(c) then return thai_letter_level_1 elseif traits.is_thai_level_three_character(c) then return thai_letter_level_3 elseif traits.is_thai_level_four_character(c) then return thai_letter_level_4 elseif traits.is_thai_level_two_character(c) then return thai_letter_level_2 else return thai_letter_other end end function traits.is_thai_primary_level(level) return level == thai_letter_level_special or level == thai_letter_level_2 end function traits.is_thai_parasite_level(level) return level == thai_letter_level_1 or level == thai_letter_level_3 or level == thai_letter_level_4 end function traits.is_ignore_parasite_character(level) local input_length, user_input = si.get_text_before_cursor(3) if user_input then for i = 1, input_length do local char = si.u16code(user_input, input_length + 1 - i) if char then local thai_level = traits.get_thai_letter_level_character(char) if thai_level == level then return true elseif thai_level == thai_letter_level_special then return true elseif thai_level == thai_letter_level_2 then return false elseif thai_level == thai_letter_other then return true end else return true end end return true end return true end function traits.is_ignore_input_character(c) local thai_level = traits.get_thai_letter_level_character(c) if traits.is_thai_parasite_level(thai_level) then return traits.is_ignore_parasite_character(thai_level) end return false end local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_thai_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_thai_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_thai_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_thai_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Q0gyqq5assets/tibetan.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("BO", "Tibetan") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.tibetanv5 .. "tibetan_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.tibetanv5 .. "tibetan_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.tibetanv5 .. "tibetan_traits.trt.png" lng.statistic_alias = "tibetan" lng.categories[si.language.category.FASTSWITCH] = "tibetan" lng.categories[si.language.category.SUBTYPE] = "tibetan" lng.categories[si.language.category.MIXINPUT] = "tibetan" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "tibetan" lng.categories[si.language.category.LAYOUT] = "tibetan" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.tibetanv5 .. "tibetan.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QB #5assets/tibetan_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs = kb.bo_full_alt1 local shift_inputs = nil local main_inputs = kb.bo_full_main1 local expand_long_press_inputs = kb.bo_expand_long_press_inputs1 local input_type = si.input_type() template = "tibetan_soft_qwerty_international" local s = sf.new_full_keyboard( "tibetan_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.match_surface = pkg.tibetanv5 .. "tibetan_soft_qwerty2.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT + si.expand_char_type.ALT_INPUT end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_bo s.softkeys["Dot"] = ck.sk_dot_bo s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qܿg #5assets/tibetan_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local alt_inputs = kb.bo_full_alt2 local shift_inputs = nil local main_inputs = kb.bo_full_main2 local expand_long_press_inputs = kb.bo_expand_long_press_inputs2 local input_type = si.input_type() template = "tibetan_soft_qwerty_international" local s = sf.new_full_keyboard( "tibetan_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.match_surface = pkg.tibetanv5 .. "tibetan_soft_qwerty1.sur.png" s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end if main_inputs then for i = 1, #main_inputs do for j = 1, #main_inputs[i] do local sk = s.softkeys["sk_" .. i .. "_" .. j] sk.support_expand_char_type = si.expand_char_type.EXPAND_INPUT + si.expand_char_type.ALT_INPUT end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_bo s.softkeys["Dot"] = ck.sk_dot_bo s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QO555assets/tibetan_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x0F00 local z_code = 0x0FFF local A_code = 0x0F00 local Z_code = 0x0FFF local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { [si.u16code("བ", 1)] = "༠༡༢༣༤", [si.u16code("བྷ", 1)] = "༥༦༧༨༩", [si.u16code("མ", 1)] = "༪༫༬༭༮", [si.u16code("ཙ", 1)] = "༯༰༱༲༳", [si.u16code("ཚ", 1)] = "༴༵༶༷༸", [si.u16code("ཛ", 1)] = "༹༺༻༼༽", [si.u16code("ཛྷ", 1)] = "༾༿ཱཱཱིུ", [si.u16code("ཝ", 1)] = "ྲྀཷླྀཻཽ", [si.u16code("ཞ", 1)] = "ཾཿཱྀྀྂ", [si.u16code("ཟ", 1)] = "྄ྃ྅྆྇", [si.u16code("འ", 1)] = "ྈྉྊྋ", [si.u16code("ཏ", 1)] = "ༀ༁", [si.u16code("ཐ", 1)] = "༂༃༄༅༆", [si.u16code("ད", 1)] = "༇༈༉༊༏", [si.u16code("ི", 1)] = "༐༑༒༓༔", [si.u16code("ུ", 1)] = "༕༖༗༘༙", [si.u16code("ེ", 1)] = "༚༛༜༝༞", [si.u16code("ོ", 1)] = "༟࿀", [si.u16code("༌", 1)] = "࿁࿂࿃࿄࿅", [si.u16code("དྷ", 1)] = "࿆࿇࿈", [si.u16code("ན", 1)] = "࿉࿊", [si.u16code("པ", 1)] = "࿋࿌", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_tibetan_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_tibetan_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_tibetan_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_tibetan_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Q0dd5assets/tifinagh.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("TF", "Tifinagh") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.tifinaghv5 .. "tifinagh_soft_azerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.DATE, }, { surface_id = pkg.tifinaghv5 .. "tifinagh_soft_azerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", currency_type = si.currency_type.HINDI, surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.tifinaghv5 .. "tifinagh_traits.trt.png" lng.statistic_alias = "tifinagh" lng.categories[si.language.category.FASTSWITCH] = "tifinagh" lng.categories[si.language.category.SUBTYPE] = "tifinagh" lng.categories[si.language.category.MIXINPUT] = "tifinagh" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "tifinagh" lng.categories[si.language.category.LAYOUT] = "tifinagh" lng.categories[si.language.category.SPEED] = "western" lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QPm9 9 $5assets/tifinagh_soft_azerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local main_inputs = kb.tf_full_azerty_main1 local alt_inputs = kb.tf_full_azerty_alt local expand_long_press_inputs = kb.tf_full_azerty_expand_long_press_input1 local input_type = si.input_type() template = "tifinagh_soft_azerty_international" local s = sf.new_full_keyboard( "tifinagh_soft_azerty1", main_inputs, alt_inputs, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs ) s.template = template s.match_surface = pkg.tifinaghv5 .. "tifinagh_soft_azerty2.sur.png" s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwj"] = ck.sk_zwj_zwnj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q{n n $5assets/tifinagh_soft_azerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ca = si.candidates local pi = si.pending_input local template local main_inputs = kb.tf_full_azerty_main2 local alt_inputs = kb.tf_full_azerty_alt local expand_long_press_inputs = kb.tf_full_azerty_expand_long_press_input2 local input_type = si.input_type() template = "tifinagh_soft_azerty2_international" local s = sf.new_full_keyboard( "tifinagh_soft_azerty2", main_inputs, alt_inputs, nil, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs ) s.template = template s.match_surface = pkg.tifinaghv5 .. "tifinagh_soft_azerty1.sur.png" s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } s.after_load = lc.sync_changeable_display s.on_update_selection = lc.sync_changeable_display if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_zwnj"] = ck.sk_zwnj_zwj s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q5assets/tifinagh_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local pi = si.pending_input local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x2D30 local z_code = 0x2D7F local A_code = 0x2D30 local Z_code = 0x2D7F local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return ((char_code >= A_code and char_code <= Z_code) and not traits.is_num_character(c) and not traits.is_special_commit_case(c)) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return ((char_code >= a_code and char_code <= z_code) and not traits.is_num_character(c) and not traits.is_special_commit_case(c)) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or ct.is_tifinagh_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or ct.is_tifinagh_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or ct.is_tifinagh_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or ct.is_tifinagh_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Q>[5assets/tigre.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("TG", "tigre") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.tigrev5 .. "tigre_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.tigrev5 .. "tigre_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.tigrev5 .. "tigre_traits.trt.png" lng.statistic_alias = "tigre" lng.categories[si.language.category.FASTSWITCH] = "english" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "tigre" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "tigre" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q3am m !5assets/tigre_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "tigre_soft_qwerty_international_without_dict" local alt_inputs = kb.tigre_full_qwerty_alt_international local shift_inputs local main_inputs = kb.tigre_full_qwerty_main1 local input_type = si.input_type() local s = sf.new_full_keyboard( "tigre_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.tigrev5 .. "tigre_soft_qwerty2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q Y G G !5assets/tigre_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "tigre_soft_qwerty_international_without_dict" local alt_inputs local shift_inputs local main_inputs = kb.tigre_full_qwerty_main2 local input_type = si.input_type() local s = sf.new_full_keyboard( "tigre_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.match_surface = pkg.tigrev5 .. "tigre_soft_qwerty1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QX5assets/tigre_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local traits = si.new_language_traits() local ct = common_traits traits.separator = " " traits.case_sensitive = true local a_code = 0x1200 -- unicode range: Ethiopic & Ethiopic Supplement local z_code = 0x139F local A_code = 0x2D80 -- unicode range: Ethiopic Extended local Z_code = 0x2DDF local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { [si.u16code("ሀ", 1)] = "ሁሂሃሄህሆ", [si.u16code("ለ", 1)] = "ሉሊላሌልሎሏ", [si.u16code("ሐ", 1)] = "ሑሒሓሔሕሖሗ", [si.u16code("መ", 1)] = "ሙሚማሜምሞሟፙ", [si.u16code("ሠ", 1)] = "ሡሢሣሤሥሦሧ", [si.u16code("ረ", 1)] = "ሩሪራሬርሮሯፘ", [si.u16code("ሰ", 1)] = "ሱሲሳሴስሶሷ", [si.u16code("ቀ", 1)] = "ቁቂቃቄቅቆቋ", [si.u16code("ቐ", 1)] = "ቑቒቓቔቕቖ", [si.u16code("በ", 1)] = "ቡቢባቤብቦቧ", [si.u16code("ተ", 1)] = "ቴትቶቷ", [si.u16code("ኀ", 1)] = "ኁኂኃኄኅኆኋ", [si.u16code("ነ", 1)] = "ኑኒናኔንኖኗ", [si.u16code("አ", 1)] = "ኡኢኣኤእኦኧ", [si.u16code("ከ", 1)] = "ኩኪካኬክኮኳ", [si.u16code("ኸ", 1)] = "ኹኺኻኼኽኾ", [si.u16code("ወ", 1)] = "ዉዊዋዌውዎ", [si.u16code("ዐ", 1)] = "ዑዒዓዔዕዖ", [si.u16code("ዘ", 1)] = "ዙዚዛዜዝዞዟ", [si.u16code("የ", 1)] = "ዩዪያዬይዮ", [si.u16code("ደ", 1)] = "ዱዲዳዴድዶዷ", [si.u16code("ገ", 1)] = "ጉጊጋጌግጎጓ", [si.u16code("ጠ", 1)] = "ጡጢጣጤጥጦጧ", [si.u16code("ጰ", 1)] = "ጱጲጳጴጵጶጷ", [si.u16code("ጸ", 1)] = "ጹጺጻጼጽጾጿ", [si.u16code("ፀ", 1)] = "ፁፂፃፄፅፆ", [si.u16code("ፈ", 1)] = "ፉፊፋፌፍፎፏፚ", [si.u16code("ፐ", 1)] = "ፑፒፓፔፕፖፗ", [si.u16code("ቈ", 1)] = "ቊቋቌቍ", [si.u16code("ኈ", 1)] = "ኊኋኌኍ", [si.u16code("ኰ", 1)] = "ኲኳኴኵ", [si.u16code("ጐ", 1)] = "ጒጓጔጕ", [si.u16code("ሸ", 1)] = "ሹሺሻሼሽሾሿ", [si.u16code("ቘ", 1)] = "ቝቛቜቚ", [si.u16code("ቨ", 1)] = "ቩቪቫቬቭቮቯ", [si.u16code("ዀ", 1)] = "ዂዃዄዅ", [si.u16code("ⶓ", 1)] = "ⶔⶕⶖ", [si.u16code("ጀ", 1)] = "ጁጂጃጄጅጆጇ", [si.u16code("ዠ", 1)] = "ዡዢዣዤዥዦዧ", [si.u16code("ጨ", 1)] = "ጩጪጫጬጭጮጯ", [si.u16code("ኘ", 1)] = "ኙኚኛኜኝኞኟ", [si.u16code("ጘ", 1)] = "ጙጚጛጜጝጞጟ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true elseif ct.is_latin_character(c) then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Qf5assets/touch_play.pngUT n_n_n_ WГWГWГPNG  IHDR22?tEXtSoftwareAdobe ImageReadyqe<iiTXtXML:com.adobe.xmp 3IDATxZ]KQgDӔ(.{$/ ~@]h [jA@ۊ BҺ='i93g9;yyyyN[^wtf(J|wEpV/7gE[yF4 ΂˶e$30!>N&dlʈh2wiH򞀯.fpֆ<ppmfC f6:f ?2{u nFD}3߲*޳V:cBZkleDmU ^[& hr[b ΅؆vdw f{"'wNk- hً7kpXҼ1cdV*B0Xoc~1'`7=8b?і#"S`dB#)NS(2@{(!ڽa徢 Ya FKǒ}خlS@] x ۼn*~BV 2AE&' c"19F BiDV-PZZXmr]YFʜ+l`Vu+irS4ХMQ镖Z'pҲi12Uk>pSt$?Z,ċ&JxB^4߀p;B |͢svl/)X(DЌ4[b ~ 0bD"IENDB`PK n5:Qӡ 5assets/touch_play_settings.pngUT n_n_n_ WГWГWГPNG  IHDR>>sDtEXtSoftwareAdobe ImageReadyqe<!iTXtXML:com.adobe.xmp eZX?IDATx[ilUQ UX0"FDHZ"$҈0@TL4 X؀D- @EҪEFyIμYw]s4vSrՆn!c{U DA[\8>J3@=g]LxvQ^Ch5@ܳ<_Hے\#TCm G"!ophwSS($ 3x~nlY+&Τ'7 шnSՉ,eu~Cn̅.da3[M8pa8=Ǩy39*IףG#36VnHp|]n_c{LՏKa]B>~-1'kҀuG&ƷFFrsH;K̏LBڑȥ3a`b7ι~Z_lp+ZoX x'QVpOKgeq9Sh9e#CU,-Ɍڜuwjjp=#*̠(L45Oâ^!cq3)i_ǬZ E~ڍpoLY_#HYMriP8ATfIAr_}Ȗٽna} Ehľ'M^arT5:[~30KT9 !5<'9ĮonF:,ʙBzpD]pi[DdWH= 71 U&EXxkRMB=D^4ff! XB 'z<5*;`.z<^1_Ǚ u <<7g};֒{TivN`FXq+ #0~$ >?sremesǫnzw?a DrVߏVh]V,iʘL gi̢T :Q6ΔMR6yuy hii3 `ZnT!llۜ[h.Pٴ Zgkp!Dn[xUڬ7Я_g]hצD{ƈ3!1#i2+^OcH]I*Ǩ7'~^_¶K֙/< xCCO\)<:Oo_ ɽ8w?^71q"Ov,P$<'ѯ2 *!.8= EAĈ`|Q R"aS:IF g)kO҈`Ӄ,d2& }_hLG(p-샜^Lt/!g9$%=B3 j\c6[қ_Nak5D活FfU`/S(Es3Lcm,8cz'lCAw6PKcȚm~PKk5:Q5assets/tp_configUT  n_ n_ n_ w@TГw@TГw@TГA0Et ;o X .-"vu~(k*UxK9J PiNGO (<5T(hB]˜П%,;/"UX#0RM0(%Wآl ם[[HLhd yUm[.@R`ۿ.BkݙlŒJPVQ82FfRjYݔO@.>0ڋs2GPK" PKk5:Q5assets/tp_promo.xmlUT  n_ n_ n_ w@TГw@TГw@TГMo0r=W^]>@ۓ NkP}mH m-gfe:=Sx:O G`'ػ9w(G(%$Km:ΪF8^'7/$p{//#>RiӏgE?-P.6_faPKUPK n5:QWC5assets/turkish.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("TR", "Turkish") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.turkishv5 .. "turkish_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.turkishv5 .. "turkish_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.turkishv5 .. "turkish_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.turkishv5 .. "turkish_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.turkishv5 .. "turkish_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.LIRA, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.LIRA, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.turkishv5 .. "turkish_traits.trt.png" lng.statistic_alias = "turkish" lng.categories[si.language.category.FASTSWITCH] = "turkish" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "turkish" lng.categories[si.language.category.CELLDICT] = "turkish" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "turkish" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.CLOUDINPUT] = "tr" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.turkishv5 .. "turkish.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { -- QWERTY { file_name = pkg.turkishv5 .. "turkish_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.turkishv5 .. "turkish_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- AZERTY (F-Key layout) { file_name = pkg.turkishv5 .. "turkish_curve_az.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.AZERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, { file_name = pkg.turkishv5 .. "turkish_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q` 5assets/turkish_qwerty_layout.pngUT n_n_n_ WГWГWГq 0 0 48 81 w 48 0 96 81 e 96 0 144 81 r 144 0 192 81 t 192 0 240 81 y 240 0 288 81 u 288 0 336 81 i 336 0 384 81 o 384 0 432 81 p 432 0 480 81 a 24 81 72 162 s 72 81 120 162 d 120 81 168 162 f 168 81 216 162 g 216 81 264 162 h 264 81 312 162 j 312 81 360 162 k 360 81 408 162 l 408 81 456 162 z 72 162 120 243 x 120 162 168 243 c 168 162 216 243 v 216 162 264 243 b 264 162 312 243 n 312 162 360 243 m 360 162 408 243 PK n5:QzJ 5assets/turkish_qwertz_layout.pngUT n_n_n_ WГWГWГq 0 0 40 81 w 40 0 80 81 e 80 0 120 81 r 120 0 160 81 t 160 0 200 81 y 200 0 240 81 u 240 0 280 81 ı 280 0 320 81 o 320 0 360 81 p 360 0 400 81 ğ 400 0 440 81 ü 440 0 480 81 a 20 81 60 162 s 60 81 100 162 d 100 81 140 162 f 140 81 180 162 g 180 81 220 162 h 220 81 260 162 j 260 81 300 162 k 300 81 340 162 l 340 81 380 162 ş 380 81 420 162 i 420 81 460 162 z 60 162 100 243 x 100 162 140 243 c 140 162 180 243 v 180 162 220 243 b 220 162 260 243 n 260 162 300 243 m 300 162 340 243 ö 340 162 380 243 ç 380 162 420 243 PK n5:Q: "5assets/turkish_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs = kb.tr_full_alt local shift_inputs local main_inputs = kb.tr_full_main_fkey local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "turkish_soft_full_international" else template = "turkish_soft_full_international" end else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "turkish_soft_full_curve_international" else template = "turkish_soft_full_curve_international" end shift_inputs = kb.tr_full_shift_curve end local s = sf.new_full_keyboard( "turkish_soft_custom1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "custom1" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QƘ$5assets/turkish_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "turkish_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qv" " "5assets/turkish_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "turkish_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q "5assets/turkish_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template local alt_inputs local shift_inputs local main_inputs = kb.tr_full_main local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "serbianlatin_soft_full_email_uri_international" else template = "serbianlatin_soft_full_international" end alt_inputs = kb.tr_full_alt else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "serbianlatin_soft_full_email_uri_curve_international" else template = "serbianlatin_soft_full_curve_international" end alt_inputs = kb.tr_full_alt_curve shift_inputs = kb.tr_full_shift_curve end local s = sf.new_full_keyboard( "turkish_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qԡdd!5assets/turkish_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "turkish_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q&f5assets/turkish_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local special_lower_list = { "â", "i", "î", "ı", "ö", "ü", "û", "ç", "ş", "ğ", } local special_upper_list = { "Â", "İ", "Î", "I", "Ö", "Ü", "Û", "Ç", "Ş", "Ğ", } local accent_dictionary = { [string.byte("a")] = "â", [string.byte("i")] = "îı", [string.byte("o")] = "ö", [string.byte("u")] = "üû", [string.byte("c")] = "ç", [string.byte("s")] = "ş", [string.byte("g")] = "ğ", [string.byte("A")] = "Â", [string.byte("İ")] = "ÎI", [string.byte("O")] = "Ö", [string.byte("U")] = "ÜÛ", [string.byte("C")] = "Ç", [string.byte("S")] = "Ş", [string.byte("G")] = "Ğ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end --special for turkish function traits.to_upper_case(c) if c ~= string.byte("i") and c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QGxx5assets/ukrainian.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("UK", "Ukrainian") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.ukrainianv5 .. "ukrainian_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.ukrainianv5 .. "ukrainian_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.ukrainianv5 .. "ukrainian_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.MATH + si.context.PHONE + si.context.NUMBER lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.ukrainianv5 .. "ukrainian_traits.trt.png" lng.statistic_alias = "ukrainian" lng.categories[si.language.category.FASTSWITCH] = "ukrainian" lng.categories[si.language.category.SUBTYPE] = "ukrainian" lng.categories[si.language.category.MIXINPUT] = "ukrainian" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "russian" lng.categories[si.language.category.LAYOUT] = "ukrainian" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.ukrainianv5 .. "ukrainian.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.ukrainianv5 .. "ukrainian_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.ukrainianv5 .. "ukrainian_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QwTW77"5assets/ukrainian_qwerty_layout.pngUT n_n_n_ WГWГWГй 0 0 40 81 ц 40 0 80 81 у 80 0 120 81 к 120 0 160 81 е 160 0 200 81 н 200 0 240 81 г 240 0 280 81 ш 280 0 320 81 щ 320 0 360 81 з 360 0 400 81 х 400 0 440 81 ї 440 0 480 81 ф 0 81 40 162 і 40 81 80 162 в 80 81 120 162 а 120 81 160 162 п 160 81 200 162 р 200 81 240 162 о 240 81 280 162 л 280 81 320 162 д 320 81 360 162 ж 360 81 400 162 є 400 81 440 162 ґ 440 81 480 162 я 60 162 100 237 ч 100 162 140 237 с 140 162 180 237 м 180 162 220 237 и 220 162 260 237 т 260 162 300 237 ь 300 162 340 237 б 340 162 380 237 ю 380 162 420 237 PK n5:Q&5assets/ukrainian_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "ukrainian_soft_phonepad", kb.uk_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QE[ $5assets/ukrainian_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.uk_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then template = "ukrainian_soft_full_international" alt_inputs = kb.uk_full_alt else template = "ukrainian_soft_full_curve_international" alt_inputs = kb.uk_full_alt_curve shift_inputs = kb.uk_full_shift_curve end local s = sf.new_full_keyboard( "ukrainian_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q^I#5assets/ukrainian_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "ukrainian_soft_tplus", kb.uk_tplus_left, kb.uk_tplus_right, kb.uk_tplus_alt, si.TITLE_CASE.CHANGE, 3) s.template = "russian_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q$M5assets/ukrainian_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = si.u16code("а", 1) local z_code = si.u16code("я", 1) local A_code = si.u16code("А", 1) local Z_code = si.u16code("Я", 1) local special_lower_list = { "ґ", "є", "і", "ї", } local special_upper_list = { "Ґ", "Є", "І", "Ї", } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_cyrillic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_cyrillic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Q]775assets/urdu.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("UR", "Urdu") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.urduv5 .. "urdu_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.urduv5 .. "urdu_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.urduv5 .. "urdu_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.RS_URDU, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.RS_URDU, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.urduv5 .. "urdu_traits.trt.png" lng.statistic_alias = "urdu" lng.categories[si.language.category.FASTSWITCH] = "urdu" lng.categories[si.language.category.SUBTYPE] = "urdu" lng.categories[si.language.category.MIXINPUT] = "urdu" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "urdu" lng.categories[si.language.category.LAYOUT] = "urdu" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.urduv5 .. "urdu.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q 5assets/urdu_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template local shift_inputs local main_inputs = { {"ق" , "و", "ع", "ر", "ت", "ے", "ء", "ی", "ہ", "پ",}, {"ٹ", "ا", "س", "د", "ف", "گ", "ھ", "ج", "ک", "ل",}, {"ص", "ز", "ش", "چ", "ط", "ب", "ن", "م",}, } local alt_inputs = { {"١", "٢", "٣", "۴", "٥", "٦", "۷", "٨", "٩", "٠", }, {}, {}, } local expand_long_press_inputs = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0",}, {}, {}, } local input_type = si.input_type() template = "ur_soft_qwerty_international" local s = sf.new_full_keyboard( "urdu_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.language_key_symbol = "،" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_arabic s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q"xx& 5assets/urdu_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = { {"ق", "و", "ع", "ر", "ت", "ے", "ء", "ی", "ہ","پ",}, {"ا", "س", "د", "ف", "گ", "ح", "ج", "ک", "ل",}, {"ز", "ش", "چ", "ط", "ب", "ن", "م",}, } alt_inputs = { {"١", "۲","٣","۴","٥", "٦","۷","۸","۹", "۰",}, {}, {}, } local expand_long_press_inputs = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0",}, {}, {}, } local input_type = si.input_type() template = "ur_soft_qwertz_international" local s = sf.new_full_keyboard( "urdu_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.language_key_symbol = "،" s.match_surface = pkg.urduv5 .. "urdu_soft_qwertz2.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_urdu s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QPhY 5assets/urdu_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = { {"ْ", "ؤ", "ٰ", "ڑ", "ٹ", "ِ", "أ", "ئ","ۃ", "ۂ",}, {"آ", "ص", "ڈ", "ً","غ", "ھ", "ض", "خ", "ُ",}, {"ذ", "ژ", "ث", "ظ", "َ", "ں", "ّ",}, } alt_inputs = { {"١", "۲","٣","۴","٥", "٦","۷","۸","۹", "۰",}, {}, {}, } local expand_long_press_inputs = { {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0",}, {}, {}, } local input_type = si.input_type() template = "ur_soft_qwertz_international" local s = sf.new_full_keyboard( "urdu_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.language_key_symbol = "،" s.match_surface = pkg.urduv5 .. "urdu_soft_qwertz1.sur.png" s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_urdu s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qb)5assets/urdu_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x637 local z_code = 0x637 local A_code = 0x637 local Z_code = 0x637 local special_lower_list = { "ق" , "و", "ع", "ر", "ت", "ے", "ء", "ی", "ہ", "پ", "ٹ", "ا", "س", "د", "ف", "گ", "ھ", "ج", "ک", "ل", "ص", "ز", "ش", "چ", "ط", "ب", "ن", "م", "ؤ", "غ", "ۓ", "ھ", "ئ", "أ", "آ", "ذ", "ڈ", "خ", "ح", "ح", "ض", "ژ","ڑ", "ظ", "ث", "ٹ", "ں", } local special_upper_list = { } local accent_head = { "و", "ع", "ے", "ء", "ی", "ا", "د", "ج", "ص", "ز", "ط", "ب", "ن", } local accent_tail = { "ؤ", "غ", "ۓ", "ھ", "ئ", "أآ", "ذڈ", "خحح", "ض", "ژڑ", "ظ", "ثٹ", "ں", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_arabic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) for i, v in _G.pairs(accent_head) do if si.u16code(v, 1) == c then return accent_tail[i] end end return nil end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_arabic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_arabic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_arabic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:Q O //5assets/url_navigator.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" local si = smartinput local ck = common_keys local surface = si.new_surface("url_navigator") surface.template = "url_navigator" surface.surface_type = smartinput.surface_type.SOFT_SPECIAL surface.touch_correct = false surface.extra_elements = { "url_navigator_view", } surface.on_load = function (old_surface) surface.softkeys["sk_url"] = ck.sk_back_to_previous surface.softkeys["sk_back"] = ck.sk_back_to_previous surface.softkeys["sk_voice"] = old_surface.softkeys["sk_voice"] surface.softkeys["sk_hw_mask"] = old_surface.softkeys["sk_hw_mask"] surface.softkeys["sk_edit"] = old_surface.softkeys["sk_edit"] surface.softkeys["sk_clipboard"] = old_surface.softkeys["sk_clipboard"] surface.softkeys["sk_quick_switcher"] = old_surface.softkeys["sk_quick_switcher"] surface.softkeys["sk_ent"] = old_surface.softkeys["sk_ent"] end sk_prev = smartinput.new_softkey() sk_prev.on_click = function () smartinput.input_keycode(smartinput._G.config.L_KEYCODE_PREV) end surface.softkeys["sk_prev"] = sk_prev sk_next = smartinput.new_softkey() sk_next.on_click = function () smartinput.input_keycode(smartinput._G.config.L_KEYCODE_NEXT) end surface.softkeys["sk_next"] = sk_next return surface PKk5:Q5assets/usage_strategy.xmlUT  n_ n_ n_ w@TГw@TГw@TГn08C"Mݦ &kYCЮWKLc)(qx9iPB-(996Qʞw',,)3'b6]d1St.&ND*eT>Hʥ]C%7`,Xu~f~KŝԾ\C9u@/0Qo}qqxH%,d$`/tg֦*YYfgӪVkXKyCUn##7VDul>aYg@} 2i*3i+b'c3h61_7Ϫ,CQa4q} TA&O@N; jv z+fP|gpT9Y'YQfj<]VQ^E2`ќ-Rb2NSa0=8e:ؿwɭi z_#<1;`bmɆ?-!yv;9:;LQoy}GȶJ̛^u,&?\2@wjl:DT42d!', <#|lyl3 -ߣz\Dzʳ= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_arabic_character(c) end function traits.is_input_character(c) if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_arabic_character(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_arabic_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_arabic_character(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_arabic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_arabic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_arabic_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end return traits PK n5:QR<==5assets/uzbek.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("UZ", "Uzbek") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, { surface_id = pkg.uzbekv5 .. "uzbek_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.uzbekv5 .. "uzbek_traits.trt.png" lng.statistic_alias = "uzbek" lng.categories[si.language.category.FASTSWITCH] = "uzbek" lng.categories[si.language.category.SUBTYPE] = "uzbek" lng.categories[si.language.category.MIXINPUT] = "uzbek" lng.categories[si.language.category.CELLDICT] = "uzbek" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "uzbek" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = nil lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QWs 5assets/uzbek_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local template local shift_inputs local alt_inputs = kb.eng_full_qwerty_alt_international local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() if not is_curve_mode and not is_wave_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international_without_dict" else template = "eng_soft_qwerty_international_without_dict" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international_without_dict" else template = "eng_soft_qwerty_curve_international_without_dict" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "uzbek_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = false s.touch_correct = true s.on_curve = false s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Qr^^5assets/uzbek_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q,|5assets/vietnam.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("VI", "Vietnam") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.vietnamv5 .. "vietnam_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.vietnamv5 .. "vietnam_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.vietnamv5 .. "vietnam_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.vietnamv5 .. "vietnam_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.vietnamv5 .. "vietnam_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.vietnamv5 .. "vietnam_traits.trt.png" lng.statistic_alias = "vietnam" lng.categories[si.language.category.FASTSWITCH] = "vietnam" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "vietnam" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "vietnam" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.EMOJI] = "vietnam" lng.categories[si.language.category.PENDINGINPUT_FORWARDPREDICTION] = "vietnam" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.vietnamv5 .. "vietnam.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.vietnamv5 .. "vietnam_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.vietnamv5 .. "vietnam_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.vietnamv5 .. "vietnam_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:QDb $5assets/vietnam_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "vietnam_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "vietnam_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.disable_spell_check = true s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } s.after_load = function() local ts = si.tri_status ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) local enable_prediction = (si.input_type() ~= si.context.PASSWORD) si.set_setting_value(si.settings.WORD_PREDICTION, enable_prediction, si.settings_type.SETTING_BOOL) end local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.main_title = ck.sk_num_right.main_title sk_2_4.on_click = ck.sk_num_right.on_click sk_2_4.on_slide_up = nil sk_2_4.on_slide_down = function(sk) si.input_precise(sk.alt_input, "", "", false) end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["sk_num"] = ck.sk_num_right s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q4"33"5assets/vietnam_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local expand_long_press_inputs = kb.vietnam_full_qwerty_expand_long_press_input local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "vietnam_soft_qwerty_email_uri_international_without_dict" else template = "eng_soft_qwerty_international_without_dict" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "vietnam_soft_qwerty_curve_email_uri_international_without_dict" else template = "eng_soft_qwerty_curve_international_without_dict" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "vietnam_soft_qwerty", main_inputs, alt_inputs, shift_inputs, false, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.ocean_precise_input = true s.touch_correct_recover_rawinput = false s.transform_input_type = si.transform_input_strategy.INLINE s.disable_spell_check = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.PRECISE_INPUT } s.additional_candidate = nil s.input_mode = si.surface_input_mode.TELEX if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end if si.input_type() == si.context.PASSWORD then s.transform_input_type = si.transform_input_strategy.NONE s.input_mode = si.surface_input_mode.NONE end s.after_load = function() local enable_prediction = (si.input_type() ~= si.context.PASSWORD) si.set_setting_value(si.settings.WORD_PREDICTION, enable_prediction, si.settings_type.SETTING_BOOL) end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_vietnam s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qd33"5assets/vietnam_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local expand_long_press_inputs = kb.vietnam_full_qwerty_expand_long_press_input local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "vietnam_soft_qwerty_email_uri_international_without_dict" else template = "eng_soft_qwerty_international_without_dict" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "vietnam_soft_qwerty_curve_email_uri_international_without_dict" else template = "eng_soft_qwerty_curve_international_without_dict" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "vietnam_soft_qwertz", main_inputs, alt_inputs, shift_inputs, false, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.ocean_precise_input = true s.touch_correct_recover_rawinput = false s.transform_input_type = si.transform_input_strategy.INLINE s.disable_spell_check = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.PRECISE_INPUT } s.additional_candidate = nil s.input_mode = si.surface_input_mode.TELEX if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end if si.input_type() == si.context.PASSWORD then s.transform_input_type = si.transform_input_strategy.NONE s.input_mode = si.surface_input_mode.NONE end s.after_load = function() local enable_prediction = (si.input_type() ~= si.context.PASSWORD) si.set_setting_value(si.settings.WORD_PREDICTION, enable_prediction, si.settings_type.SETTING_BOOL) end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_vietnam s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q3P(5assets/vietnam_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "vietnam_soft_qwerty", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "vietnam_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.disable_spell_check = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.after_load = function() local ts = si.tri_status ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) local enable_prediction = (si.input_type() ~= si.context.PASSWORD) si.set_setting_value(si.settings.WORD_PREDICTION, enable_prediction, si.settings_type.SETTING_BOOL) end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q/(5assets/vietnam_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "vietnam_soft_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "vietnam_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.disable_spell_check = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.after_load = function() local ts = si.tri_status ts.set_tri_status(ts.CAPSLOCK, ts.NORMAL) local enable_prediction = (si.input_type() ~= si.context.PASSWORD) si.set_setting_value(si.settings.WORD_PREDICTION, enable_prediction, si.settings_type.SETTING_BOOL) end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng_without_dict s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QO5assets/vietnam_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "ă", "â", "ặ", "ậ", "ấ", "ầ", "ả", "ắ", "ẵ", "ẳ", "ằ", "ẫ", "ẩ", "á", "à", "ạ", "ã", "đ", "ê", "ẹ", "ệ", "ề", "ể", "ễ", "ẽ", "ế", "ẻ", "é", "è", "ọ", "ô", "ơ", "ộ", "ớ", "ờ", "ố", "ồ", "ở", "ổ", "ỗ", "ỡ", "õ", "ợ", "ó", "ò", "ỏ", "ư", "ự", "ủ", "ụ", "ừ", "ứ", "ữ", "ử", "ũ", "ú", "ù", "í", "ì", "ỉ", "ị", "ĩ", "ỳ", "ỷ", "ỹ", "ý", "ỵ", } local special_upper_list = { "Ă", "Â", "Ặ", "Ậ", "Ấ", "Ầ", "Ả", "Ắ", "Ẵ", "Ẳ", "Ằ", "Ẫ", "Ẩ", "Á", "À", "Ạ", "Ã", "Đ", "Ê", "Ẹ", "Ệ", "Ề", "Ể", "Ễ", "Ẽ", "Ế", "Ẻ", "É", "È", "Ọ", "Ô", "Ơ", "Ộ", "Ớ", "Ờ", "Ố", "Ồ", "Ở", "Ổ", "Ỗ", "Ỡ", "Õ", "Ợ", "Ó", "Ò", "Ỏ", "Ư", "Ự", "Ủ", "Ụ", "Ừ", "Ứ", "Ữ", "Ử", "Ũ", "Ú", "Ù", "Í", "Ì", "Ỉ", "Ị", "Ĩ", "Ỳ", "Ỷ", "Ỹ", "Ý", "Ỵ", } local accent_letter_dictionary = { [string.byte("a")] = "ăâặậấầảắẵẳằẫẩáàạã", [string.byte("d")] = "đ", [string.byte("e")] = "êẹệềểễẽếẻéè", [string.byte("o")] = "ọôơộớờốồởổỗỡõợóòỏ", [string.byte("u")] = "ưựủụừứữửũúù", [string.byte("i")] = "íìỉịĩ", [string.byte("y")] = "ỳỷỹýỵ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif traits.is_upper_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return nil end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q*:bb5assets/vietnamsimple.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("VI", "Vietnamsimple") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.vietnamsimplev5 .. "vietnamsimple_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.vietnamsimplev5 .. "vietnamsimple_soft_tplus_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.vietnamsimplev5 .. "vietnamsimple_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.vietnamsimplev5 .. "vietnamsimple_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.vietnamsimplev5 .. "vietnamsimple_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.vietnamsimplev5 .. "vietnamsimple_traits.trt.png" lng.statistic_alias = "vietnamsimple" lng.categories[si.language.category.FASTSWITCH] = "vietnamsimple" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "vietnamsimple" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "vietnamsimple" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.EMOJI] = "vietnam" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.vietnamsimplev5 .. "vietnamsimple.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.curve = si.new_engine(si.dictionary.engine_type.CURVE, si.curve_dict.engine_type.WESTERN) lng.curve.files = { { file_name = pkg.vietnamsimplev5 .. "vietnamsimple_layout.rom.png", file_type = si.dictionary.image_type.CURVECONF, file_tag = si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTY { file_name = pkg.vietnamsimplev5 .. "vietnamsimple_curve_qw.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTY + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, -- QWERTZ { file_name = pkg.vietnamsimplev5 .. "vietnamsimple_curve_qz.rom.png", file_type = si.dictionary.image_type.CURVEDATA, file_tag = si.dictionary.image_tag.QWERTZ + si.dictionary.image_tag.FULL, open_mode = si.file.READ, }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qv*5assets/vietnamsimple_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "vietnamsimple_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QY7O (5assets/vietnamsimple_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "vietnamsimple_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q;` (5assets/vietnamsimple_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if not is_curve_mode then if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international else if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_curve_email_uri_international" else template = "eng_soft_qwerty_curve_international" end alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "vietnamsimple_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q23Yaa.5assets/vietnamsimple_soft_tplus_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "vietnamsimple_soft_qwerty", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qgg.5assets/vietnamsimple_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "vietnamsimple_soft_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qd#5assets/vietnamsimple_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local special_lower_list = { "ă", "â", "ặ", "ậ", "ấ", "ầ", "ả", "ắ", "ẵ", "ẳ", "ằ", "ẫ", "ẩ", "á", "à", "ạ", "ã", "đ", "ê", "ẹ", "ệ", "ề", "ể", "ễ", "ẽ", "ế", "ẻ", "é", "è", "ọ", "ô", "ơ", "ộ", "ớ", "ờ", "ố", "ồ", "ở", "ổ", "ỗ", "ỡ", "õ", "ợ", "ó", "ò", "ỏ", "ư", "ự", "ủ", "ụ", "ừ", "ứ", "ữ", "ử", "ũ", "ú", "ù", "í", "ì", "ỉ", "ị", "ĩ", "ỳ", "ỷ", "ỹ", "ý", "ỵ", } local special_upper_list = { "Ă", "Â", "Ặ", "Ậ", "Ấ", "Ầ", "Ả", "Ắ", "Ẵ", "Ẳ", "Ằ", "Ẫ", "Ẩ", "Á", "À", "Ạ", "Ã", "Đ", "Ê", "Ẹ", "Ệ", "Ề", "Ể", "Ễ", "Ẽ", "Ế", "Ẻ", "É", "È", "Ọ", "Ô", "Ơ", "Ộ", "Ớ", "Ờ", "Ố", "Ồ", "Ở", "Ổ", "Ỗ", "Ỡ", "Õ", "Ợ", "Ó", "Ò", "Ỏ", "Ư", "Ự", "Ủ", "Ụ", "Ừ", "Ứ", "Ữ", "Ử", "Ũ", "Ú", "Ù", "Í", "Ì", "Ỉ", "Ị", "Ĩ", "Ỳ", "Ỷ", "Ỹ", "Ý", "Ỵ", } local accent_letter_dictionary = { [string.byte("a")] = "ăâặậấầảắẵẳằẫẩáàạã", [string.byte("d")] = "đ", [string.byte("e")] = "êẹệềểễẽếẻéè", [string.byte("o")] = "ọôơộớờốồởổỗỡõợóòỏ", [string.byte("u")] = "ưựủụừứữửũúù", [string.byte("i")] = "íìỉịĩ", [string.byte("y")] = "ỳỷỹýỵ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end function traits.is_input_character(c) if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:Q   5assets/voice.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_keys" local si = smartinput local ck = common_keys local ca = si.candidates local surface = si.new_surface("voice") surface.on_load = function (old_surface) surface.softkeys["sk_bk"] = old_surface.softkeys["sk_bk"] end surface.template = "voice" surface.surface_type = smartinput.surface_type.SOFT_SPECIAL surface.predict_nextword = false surface.touch_correct = false surface.extra_elements = { "voice_view", "sk_check", } local sk_back = si.new_softkey() sk_back.on_click = function () si.set_accessibility_string("@string/accessibility_voice_cancel") si.back_to_previous() si.input_keycode(_G.config.L_KEYCODE_CANCEL_VOICE) end sk_back.main_title="@string/vi_input_cancel" surface.softkeys["sk_back"] = sk_back local sk_voice = si.new_softkey() sk_voice.on_click = function() si.set_accessibility_string("@string/accessibility_back_to_previous") si.back_to_previous() si.input_keycode(_G.config.L_KEYCODE_CANCEL_VOICE) end surface.softkeys["sk_voice"] = sk_voice local sk_check = si.new_softkey() sk_check.on_click = function() if si.voice_recognizing == true then si.input_keycode(_G.config.L_KEYCODE_VOICE_STOP) si.set_accessibility_string("@string/accessibility_voice_done") else if not ca.empty() then local default = ca.get_default_index() if default ~= 0 then ca.confirm_item_2(default) else ca.clear() end end si.input_keycode(_G.config.L_KEYCODE_VOICE) si.set_accessibility_string("@string/accessibility_voice_continue") end end sk_check.main_title = "@string/vi_input_done" surface.softkeys["sk_check"] = sk_check local chinese_voice_sym = { {",", ","} , {"。", "。"}, {"?", "?"}, {"!", "!"} ,{"␣", " "}, } local western_voice_sym = { {",", ","} , {".", "."}, {"?", "?"}, {"!", "!"} ,{"␣", " "}, } local chs_voice_lang = { "zh_CN", "zh_HK", "zh_TW", } surface.update_sym_key = function() local voice_sym = western_voice_sym local is_chs_lang_input = si.is_current_chinese_language() local voice_input_lang = si.get_setting_value(si.settings.VOICE_INPUT_LANGUAGE, si.settings_type.SETTING_STRING) if voice_input_lang ~= "" then is_chs_lang_input = false for index = 1, #chs_voice_lang do if voice_input_lang == chs_voice_lang[index] then is_chs_lang_input = true break end end end if is_chs_lang_input then voice_sym = chinese_voice_sym end for index = 1, #voice_sym do local sym_key = si.new_softkey() if index ~= #voice_sym then -- space key uses its keyIcon. sym_key.main_title = voice_sym[index][1] end sym_key.main_input = voice_sym[index][2] sym_key.on_click = function() si.input_string(sym_key.main_input) end surface.softkeys["sk_voice_sym_" .. index] = sym_key end end surface.update_sym_key() surface.softkeys["sk_edit"] = ck.sk_edit surface.softkeys["sk_clipboard"] = ck.sk_clipboard surface.softkeys["sk_url"] = ck.sk_url surface.softkeys["sk_hw_mask"] = ck.sk_hw_mask surface.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher surface.softkeys["sk_mo"] = ck.sk_mo surface.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate return surface PK k5:Q5assets/webpages/UT  n_ n_ n_ w@TГw@TГw@TГPKk5:Q5assets/webpages/pages.zipUT  n_ n_ n_ w@TГw@TГw@TГ|C& Ф۶m۶5m۶m۶m[Ӷocڶ{/{يȼTsK*ʂJ_ d`g`Ϩ Jz?r;ߦs t $< lm-\--&n4v 6hd6q !#$Oa;j(>ߟ&SJ+Y3W9)hLs:m/d/ B>teY&RsZS-7ïtsaMk^i^!猴qmmR>Ɵ.!FM,Ll: >b\6u[+oԔR!!2 ѓY(&\,\L9ݠ a8=f8%X!K Ŵɸ LI~^a<6NTjq~ HL5d|F5K3USJLIN Oh >S8JI񍝢A=R9׏9vB':.uF'>ҳ95ʷKBnpXͲ?q8SN"qNd|ąz:86ڵ7SJ rK74bmj w_txEܠ)] 5׌%q>2*nd1\+k>x*Ţju@[M j3cP*śd|ʖ;xjȝ&<:|_]ym0ྲX6M{$ᓁМcR@gD3uVH 1u 祵#FOb#5 3'BPvs`xu4 K"5;JJ o#GdM0tl;^QͲ7NIe=[K|*4h-9:'R!OAk`usG.SgV2j )Bjkak*[5Cv*afvJ5Ҡp,疘*O~c9tf9dМ!O}7t8Z!x*ڛٮq磵_#K!sSbqc`N2TV&(%AnZcJi)5K'O"JdN 0>c_BN6a?7v^L6׼5J|$;4H;*VQ;l*9 W0.)S</ Q4ce&KiAv0InBMv9 js9*eBVW ?Cgpw;6H= ciD8]0d`T{DJ:™kS,ki6 j+"Ԃ2n K31`zp~x׼ 堩iӭdM  mؔ1s LUFk b™Wm(===zװ9,Dd3wzOH6&2-_ CD6u>bsaS|G,XH +U1 c`0k$88a2۷}w7B=*89@kFXmv _▓πa*:Ҁy uJ̰K*V4%_ ~'h"[%[+$%+^HkD6Q(k_&%}+N;cOK5ep)A>4Dh-FӕY֊S 7yqnjC*Z019:ț ؝X8"f\ ˨4%zr c;ڗIP %_Gd%P\ k.a4JFkB#C@$p|‰T2xV|/5APr Kc, uMmGPkVCS~BE +˼f^w/u@+!#ʥnj!]qRjrZx8tv>u]ǃh%Ӻ|!5B*5 'bu A/ e tW켲`;s_`ui\Vb$4^KV nӁ {vv)#u@ O3s[(3<  YCdᚵ(5 V?jUlps/;ߞZ"Z&M_$v[l;ې+EaHESJ\P;R,.PD0ʉ؇VV|cQ)([ 1=)a FI"I hW{;HRI#ի|ۮrbQX.}ȿE9CV8FYBS_%dW^ϸ糑Аr>͸?_% 믩$A nAM֨#R|޸A\UqGzbXP],dKQ7%Z <͕҅ O[!vI$@o=%"H3UWuS""o9a/ i |.әebߌjDэ^y@+ȸw(mu`s$Bُ50,|γkYQQWPY*іd P|0DwP?&=/؆3;R{;L7mKiFvevW`UlZ."i_R-Z± Bl gi+A{Sfn/p8܊хt3R #i˰5#0~8R9XlŊvc4tӳg=зbMЙR ,f=g K5| u =+z_z?or])= ֫~%j5xك{YuOό)El,Ma=]qJo>=ˡa|FٔD7x˚ ` ӰFRG誧#) !&v#H)˨H-3 -2! Z9;|iK^ e,yr?hzS>RTk݇y!nr w?sخ}#6`l V0FO) (i53h4/r5]f)IK|N S xb?.Ӓ 9hB\K-tnb:q.BS5*xC-:/.I)/4SrC_qt/T&[?"=Wɪ6:n9#̩uq2J0"-GrpDvIl@Jq 50Y$h~ޙ"cE/m~HYg;CNRR?|&v-eͪ Q{ i /Ј1\5hAt(Zi6|pNJ`f? 7 Fj_E4܂'@hq*X׼kul$ffVGҖk~s_+&{a}ޜf Z9 ]jU[.Q 5s(T,BwBcs)Ds!TD%Zў0dRA˅, 2OC*`Jl`bZRע@m3oͫɋz62U1h2(;#7T~{7qقkTC>z=ڳ4σQs L HS~ˊ 5Kա#ѡ{_-=Nʸ/ZW/y}BЂlTF`rȈ/];ڱM 0nAcܺiq/D:5b^Bw N텪>!jáxH?m4j{>]|Lk XN큼NJ^#YvݻW+j:Dn/ʂm(FT-fB1$P (g:( l3EhDPmZt)Tbχ]ֲB 3jgm2.D e\dITgeYσj(RPUbAnNi_?OFM8nH;Eݽg1k!6&ߩn7._[~b6;a1h]DzZ;G2'O29N5:v_̾N )JEf<\NKA`ĺ:޻ ϻFP 1k ɱ1{hӀ@+KTNcd"@F"NOY!s7j3'|ia @dB&/'u^^u"*jYw5/q.OWYԩ?5v :ߨ G?x(W0C_Zjo_LNǖo_q;: Uuغ?-6TKx4|;AxYB'ަcʌ\9X `<-%+`ok]!,фB 5NCГv2(F[>0-!d>v+FlB7 >J=99E'M'C ^Nc}z|{l !-M ){1TnO!6%3w F)) 6"w*Ί `v %ö|*i p+QG=MDGIVC-GE+TRg `5vd"},vɆ`qw< lUÕD1>!샊P©TkݎI)so_~y{`6Ël)xWuW^%i8=v Q\TpLC{B?Yȹ|aյogZhs{0"p:gcK`JR G3mVTQzvrcQ_K{ 0KWw b1z;;ܷm,ݹLziK[kjWO_WN4!Ӯ* 9!bhi6zbp0d/~{3N?9b OBhG3dб|ҠPLhp禞2d/Ht}Yp-myx1'-LV{M[G'ϑF!"0/kEؚ<Ob_B}ޣ:ڊ{}T1FiZ3 0xR1e79?4Ըj1C/@LTG {+. YN{1hLB#PA8 $$iBSVJ.:{ol|ػy<I kl7cԽpUƑt8?)uŷ#!%rG0 1j,ZPvQ.VͶI8$QA:z pn>}+Yx/-?˭wرH8^e͐l_NջY_oWy)Ǩܩ!dcegƤCmK%, =* nfq_ρpP;Wf2-_i0jҧżoHZqNRʡdsti=:e z4 oAN" =7-'RZ?h\*C&8,SU$>ܰdl>%^ -o󋁐pgxv{Wʓpk|fJC 6pn֔vgCt*Iر6݂*~ibI:_K2{ -OXZM9Y@mEL[ݝ{8kkt씤%f~_o!~t}Nn`;O$@&Vzr!"180 a"@5=%;@\`;q1?6ࣁqw2+  _<[洸Q"ߙ 3`ש[(!lC.4%6 :a6ss D,, e_8Ŭ)LuwqM9'86l!? I{M:t:D;RdG 0 f-˰:?UqY˓cwK-M<0b~;*/k`]bK2 '>{ꍖ3r (Lk!/pqeJ9V;`ދ{.r2Ģ*@ZEou!yʻ45XTU-зB-$!ypOhɲǡ=K!-rşrW[VF ǯrCa2ӫ IqB֬?>0&u> iD1#qy$lDEI9PәF*W`aq 뗗)>, p)jx=MyA:$Y`m[LǤn88/Hn{R96(.hݑzn!Q+ݵٕ-„T:.s&0f#ېqx-5:!0jA2* XLQ=> Zāh#g"ј3!,DɽhbBZU1a@:6mM&S+&!P1AuYquG UZ Ps ah!&DqHׇ&Ha.# aU"o5P4l@/h12މB^(сcR$/mM.-'8)unlEs_V?L}qš rև ix l"9b` XK Qd4j۟1ng.ts8#s*KZ󠭋Bפ-,K;Ŧ5?/b6 )NTF9t9k9qQs:޿^sفb ı e1AL٬ѯ2I*7ⱵVT&8֦n zeKLSQƞ/M'C %#`6[C=afk={~=e,wSAѰb&m)p%T\yĎJw=Zz\IC½(LsnL]@jY_e;y_/[oWo UF})7 B\(x]qRa >Cpdazb^DbRv[K6YA끃$kӷ.@mH|NBJG!)#gp|rTerLi뜏nB?wHT5VY+3/xqR 3 3ݿ/&C8yZ@)z%&Zs(4bb.WN'1g_7"KcCSjtFe+UGe3a~C#9!t 9Uhl*dԝ_1 ވcSY›Ս3sFjMG*>6xH:nf仐~PT]:|I?2)$>21fqǚc{Be|V^$I$9CtHg Ioԑ!l(0P-R2Dqu1ZeK\]65Ѽ^vNE׈j[)k8R-Ĺ4s;,hav>D'̞X҆1B,H$.PRPMSNz@Vg NSqL]#ݱJ/yTW;~~ NjUΞ9AQny|~K/}'3 cr>z>ȧ䳝{ιFR 4Ž,3rie7QhFB#)KjZ...s&SP0^ib a + a+JSsHj'H޴I7BZgs)Qc㕑20,3\Ud&;ƚ,mī |=qঈ}cϸˌWn #.rcoT_B("&;f5s WR3^nt69HRD(V|أiY0wo8XPDo^\"{i_2 sUeVV6ɇm;.TK3KXzؗ %S>i2`.Wxꞓ8޺p)Ld2yH5N>@+f4.'_kwވhfߋ}˘?"a++(hGV3YPdbpbMjH&RvqM+m/ ` mJ_?:*lLIZ<-6rI](fC|.R^Ǵ>Օh H@ސhC[ps쎳dGw2]vwxUD(ߎ/dT BfQHqK(D]M+5DL3]cbqYzł/U:W 6ׁUaELqqVT4|J̔YBoV$'T,GJWC3$oAӎ~#iL#ƟvQ5OƘFh'X׳;D XcYɈZ{z&@k -5 .dQ[_NWpyY Nm`Z@j¿Ҹ7*>xHbWobF>shNgA>Aʆਖ਼f?}u4:nTQ_7˧č0o/_?zW`f%TBK+*{[nS3/.Bm92b~_R݁{>imڧ¬آl򙤄NyTzLj^N#zAɋsbg^|?ן%R-E# ׌";.BYuhowsNi!/0;pri$Yazxf2 $.v^۱²x+YK0 G`L1>uJub=u| *귷_[ʖy~K, #[jy7֍I#dsV$mԸu~hyΔ+{Áv;} w+7yZX!&RcKseF1\=A{D_,5.?1VB'ƮOm5mr(OU2xՒ\Icg{:L}eۻn Z^:Y-uk3)t1Gm2gH@N[ W~,뻌]OzZ~^8VnՎX2L9" hϪfD>{=WRs+@7whȼ8Ӧܨ[K}iU~;.KƢZ2SMezT2>潌K]_=xzQy X& 9I'JE- :6Ϫk.Ʋ~$ b̰e 9.6/ydxS lzM<,#Bnw[o DVw j!dļx"L[$ktr2>0E{eG2%hUm teeV=u0רIIInK^*εʛ%"JPh9ݎW"6~c ,Mݷ<ۤٝ=?=.oqo _?O==Cޤ$zV<w:y=:?/ ߯?O#/e/Z 5/ݟ#zXȚZׄW{ q:%b{ ?M-=ɽ r,vawNRЏ\Ѷ,O&=&N5f滓,:8g_ (3*uFF mO&\"2 $d6uufP"{[V';<춃ɊoO)E&+ fvԱ=S 8(%o@}Fy!o-LJt#p,8a8/6uG s{в*>wvC NL*LFčxTHC|RbdBL~Ѯ2gUj ɞ xg$= ާѿgU~ /"~ɹExf(j^'%Bm\#=-3`-bRSӝ(~\TV0YyA/2XTL^1}.2AHALF62Ǒ@vRՇ (=DeoTR[)RXV>ߏ~aeNhMqqsmP$jSɂ:&RP ±^U_2$Oٱy5fճ-Γ^B-HF>JXy#xlծP+;0- "Ū~Gb␌0uA+% [;0;-IHpjY=40/=0ۈ7 \,dEm2h`{لAZ&rn3_rPeȫ:6wz?T% "$x r:p;~AO hj]#ՍҬ# ^O.PpCfuJ(ܜ0?WT#Q*x|NARk⨷*B8(ѓG n)(roU9p_=Z1P؏y|:Ql^6\&Vvu;n3H#D5}!aGdx)Zś53ds EG&ܪBNꪜ!c:ҟtqx7*憱?b~ Y>?WB&孊!2> ėޏ(=&mEz[U( ]cvN厹oe'ٮDSR(揵 #0V! u]R!Mp`x,IIHs#BFrEME#6q( 7&kJ7) pxXʣ^ߌREEA|KU)ҫ-othR7- c^>x:3I`<*/"ꮒ))drFs³G="a%X`Apu<,\.Ö:EXՌSJEux:hb[ _:5W!ee1ZkU۷Kd1eAqϘL?/\7N>gWkeXES pXy`Pw.pt$9OOKs~v8LcE G/IF`'(|ٕdENURBY.< 9=MP3‚a>r6V| k"I\\T{ u.=r*^Ϋ&`L N\{#.TKa; tG|J3 +: 7LJ”OO{afx_]Y벅`kW34E1)"LupsV 3[=Ӽ<6(KD?vc°\TJUtN]5xD?BM˼*"%l=fl3VA)K]o܄?zJ} i̋! &;HeXVOy u{l4.p`kA)/5q[FF^*Ъ-ci{aΥ@\y;Z5nw*A;ԙ=\X@Rz̀ r;ݍe) n"gѭۏld$'1fjJ@n49;'=u~%cL@:\UT}Р+\=^?ӟsnӂY tM3Wҥ9ho֟'W yKjN.@3Me''_#=9KNĨޛ0iV˃$4+û JUΖ&ҞzSb^'pػK_%|VQhm!9\^:ʨA"*s m4S{Ox0x"{N%Cc[:B~"c ةa:/+KmJ: ]gpКnRC'E?5m&u^9/_s_7CU~I2;3 [ %/s> +i԰IEjP6 VyCSƱz&GG<5! ENB5쌮{d+SEr`jQG<l[$7A5],y u$"vV柫*k0xH}_W38j\gkA1/ݛ>,`qK}Ń,YdM@3"=[;1e'Rۻٟ_k@}.K>w @Rh>e3T;fWg+jϗhvU:UuKiI#[n:w/ u[f'?'[Bft H IwrtLG@/l!^L$}-S|qfƥҮ<|YR!(ޟ>_b6K>5|FD~GXȥU4RE㯚V: c6qFk6rq1f⼝>(PfOIx/TE;Dݚ:e۶m۶m[l)۶me߽zi2' I(c9_p+aw {5/$^Y+!kDkT`SIϳ1qjxp] xne?[m5bW"iAf5zP-.GݒfDe gt!O5N)?pWT#!Qze>=g}mXTexVkq 5@h\6AAQ2O%k*K!.l7&&7d7H'k\m7;0וf#^;qor ihj=<6M-Q|FB |8?"QNA˿ 3$]r<[ՕÈH!fҴ6i/ַD%55e7 l[5 K~ѦjvphBW׍E8- B 9`c;`4ڶoȸ`8uKA6oidO}g~32hpּFw"!`seczekCDk{Ƈ 0k?2͏.׆΢j#f?5($R\;9eׁ0h,:k.:b`خT,1ôi<@+W&"'k E!kf'GMW nXb84c NZ.OV.&[s7^ ҏ;{xYy;ħ_q ?; Bi/U2e^G u[Z_GصF}n/P&9|ˆ(VڱRļR[ ރѧ:Q(JSDPBw`%J UJ\Ah#LøMFGlf棩݋1CXYȄȉ gp~ G q2e!Bw}c;V)͔ǗZIp O-vvmIeOT\OUDps%KQ gt31d߯N.ЇKOSA~(B}/wO~EF1j)COAء[$e#]\K ?a{zOXpĽKU</S^˩ЯҐZnX w!#-ikLUž*qmD-˖Ma]l*+ } RE@9Nauj N%Qzʦ'n2-r"k/eتU" c#;, `AW6VJ""wt-.4!t>g?ޜ59wpR07,Rwh`y:9.|'  !j6Ynce ;F@m?t^ & n=!:ݷZ?ڤg^!ki.tα 0ߦ~|\=B߬Bgu~:ES8_{b%׆4"x/jfxfo'.(r='B7VNXiӧ̧A8BSgZ{O3gvR7$HA {լ2k& q\}Z) b@mݎxXxYF7yHE, B,{h ap:z*"CKDBu*#vDŽa -]puWp˅6'Kwgi};( "+QI-X} a⏟8w}VxwiXYU ܯ1ZatHҌ~W=\, .1c8gBZ>bo|}ՙk+84.lt+))˂DdU"O`GXI #CB7%+4zY?b(jB;kVM4Ȋm0:fY`I]Z_ƃ9/`4iӵ"rrHљ?6!K:R>$doC`V3Y:Q畜z6=>p_*zlE-Ȱx!v5,e^u@GO 1@Ey4G6AE@h~aɫ`[WX2g;>GG${F-ӜKc߹_W},SdL/g*ix\&Cm}lqtX4i+ ¿RCBi mYP ElȮVl.i٭$FIպEJc;;z׃c9eܩt[ðatvnt(˴WΓ|>iVĪر{K{*PWG'!/çX>;mՄ1GI|Fai'5/b ށ伺8&JÏ׾K6D yyaP='5fJ@EmBrVΩ/޸ .e|سp.ge"DزR\?/}g7 XY*a -Z VSv~"vL|Z~*xF_7ڒ?53)f-!Y4YPAp>LC=H짢mg]kxa9z`Sl{lff9{ut!`2VQFoqy[{عRPqkN TSGNG<'SaOQ3p^SSz(O~ɼgiܙ ¾ 3d ?Mx 'e͟t,NKG4KO96QhG+#fSxt_Ω_ կQ9ۊ=g⑤}Q0neQq0r5&+Y`6AQIV%{r+g d n h(: ƆJw9U i3k74rix77Yj\ܐylMӞy{1NͩpbvɻF-PiN:5Ue DmN?66)3kkSkkUj\O*<\FZ $wHfl#Hri$)SGc3ZdG}Q cؚ>Kt6.G $- zt 8PLgWycշwbdhQOU< r&K iDpc%" 3-}]KȬ8wۓ*(s~GęX!0^c\"З` * 3ɞ[[W~XrZpgw~1q&pIEƴ5V&G i ^Sז8C&S[dOFH|A`L_mON+\3?؈l p#fwF3PrW2K+@>p:$z, {W҂E*ɭfCm`uw>rJݨCl4ُzQJ}I2"0O^v&HCj `xjdé+ҡ$OMDȾ2@Ec D8s%`&-d Q*KI\A>Z+lOYNfq8+` 0oy*t3e3H ДMk0T#'@Nl/g%. bjmԳ߉rΰ>qwrc[xk]- }+֪FD$Vُ+ZLûCv2nC邰\aN.oh2<y=,^+M~ޢr]& ҈߁ҩYi ]դ&p;%)Sq@_kÍ肧kr_Cv=-]6S!hIJ|r:fY;>%Vh/(Dyx\,4?LT|DISv u]$(-bscvѤp-d, L)¥-c7.rAKfIO}1iN8뵭(ߋ\9[1r 819 mOBO$|jKM墲D7/Ddž1z⬢ҳ\&s$ɑm9h+LI$jq`z@.$Y^\{KP Ǵwk- 1&֩Vͣ +NOAjS(:LaSf}BPӑM(aW0-g2E{sCɀQ:e_f![}GB 0=Gݗ0d'g?QR{>MyAy䧩åx6 >1SV eABWis7>_D҃QaZҞ4 ׶ 6ΫXAq5!-'  G6-+3gUvҒ0hE;enzyE{# oN: dBIS8-F%Q=hN [NVqUkg%O8|g'I:0ftoiVWQy-8F FQLd()C3pzLQ4es5AarZˆe XCM_ kLjW|$\z_z<͑1{֧}BpgxXKݑgltXB>?wVow/¥r@h[-UsﳃUSʥ@:cQlAѨZ-ص)7\0,ۼw5ۋ#W pnT%}P!)p ;{1zɓA- @6 ۀUe%iDB_GT>D>" , f"P7&S]|=2mb0vDn wnbqh(./#<2Y,tjv{cp>TB1bhG*H |)!ь_ϾT=E<{{ iR [\$CoS۞ btQI3PX?.$:M5kA^ PdZ͹3T\2(*W!< jH)Ssd_?/3eʬ![u/nnVo[qp~nx֏q/2|9 YZ*Vv"zGHyÔ S/meB#hx3X> eu%@*Ф󍵢Fv>X*R,ʳy.#>l(xl4xki!sO~6 jt>v@u}ϛ )sw@3Opū4[(/K-ֽ͙mZ>B|p!-ȫrݟG6[=f fu9 ^uʗ cf9{B=t "\4Q頏'BxRッ/'r|M!xk\,d ^Fqݑ\Z:p|LXBv_8-+:ctkjEi*PM|ذ8"M7QnG A+pt 11+`>W[x/tSTe,s泥dkYқOe5ŵ QpӭT0AӀ~mT,1&ɔ afzCHN M-/ ƷfLG-Q|k0e'`jX)b>="E>@K'$JȞtӖ2w'Xc=I p!gs]=8D+1ٳmYʞ|(h0p@< 5h} F#{60mKn%&HmJ'RpɫŌC5S!D^؃؞ z!G]/sMh11q,BbG3(` EyNCY?՞lV:#Yf^*Z(b>(T2A RuF*F 'W7(:_ (ׂHB Q[pv_pMP_N=/83=A3ji*_^碧эʛfiۑn,r*W,fS#Kp$I(?5Z1 +0 {e%A=ϔ'?q=L #(c*|(-QQxG )e8 \Ԑ+PՀ0|d"w,,Iny=fQ 1R&./hS+_߰Aܵ k0aZѢnA6M#uMhꈓnZumⴃ'@؁ oq ,p2oKLWrA^\|@)aqP(3ᥟKNPt%Ֆ#;~k? Eߙ~fsuP:ReFQB2/e/SfK#h8x8&rO8!D>&3&@ZF7= v\-FbLewx}??Ň^W~CS}q OobRIVE$Gئѥyg񦱲8~5~>Bj6$E8☜r>~iВSX~F-~Ioe$|~>js[@IL 8%tsĚ?zʒ@߇OOeL$'b^!"QC~́""re΅l՛]G~ ne'u~e"[2g $WR0%N7EN 1 F*_\m$3' 3̨)eP/ bT3yjjN~fᔹY| O:*Ur?El><*d,>6̯qKvۖm@}FLՐ ;šIJEHPV́FkT_5 8c6h^cqe`5 出g̟[4E0sxW`QyD;3wt2mC 8ԀHliqD|]!kwHW`NU>WM3sM(ܪUMݒ9S;6m)ġ@_/r$<#I @9m-}Jaf^b)3}D+Y + ^lʙAO X2([e[6e<}3unza ZP.aп?Խҁ\|k#vNTCH_̕^̂Ò^wlePCZlc%'@@{gS3ƿ\-%AD?^cK:ˈdЩbjLH̢\@渘_׽ X7uٍ&5'FZthR9iqHvg W^X_o(^۵sN}J)FìU[- uݍ/mn﷤ݭ䐰Qu2e1S %`' }@;LÆ'BknLsnI.zzcIq{s*tw[:{ͼt&ko$7<oE-sS72EW@-s4<.I@6nFq T`Vʔ!8ިW D;r:?(?{OWZ͈Vlt'7h ]ES뮆U6Gn*׳}6=yie&JwY69O-=+`KsFO`Ib.<_=e+p'V|.Qb^+n6R1;Ҽ < D|i/Q)鹍~z.bc۲JcԦ"b2%ZqGXofNGGU#l핮 gxvx1,pz:%ĭ5Hޛ,d0ANuckg3;+NUƞQoiH>S@L 'SBdp5HJCPY|z|"KoW7Vu^,ikCic}@Lg-gbt!~=F?eM'k=__DYW©\܏?Z ۶<Џy9OfwW&UeLMkoE:=Y3bÜCI5ۿOս{' ֭s`,s95*M$u*pa؀SKX1*W6h# ef 8#pl3{]6W6/th\S>Zh<2H1`$@vr"?jF2R`7!TLW d3T;D0ȅ&8.5L.eڡ 4ݱ|PV;QYObpp}Q <X?  3y0h)f"-("PVQ‹4ɓ?9ՉE,!t.(Ȍ5s,# /yT%ܸ.I<%qw]oպ\tFiq*,9y2 w :j+p"f,JyM{B71!WHxXZ|So r4HTMFUzN#ba_;%>ֵ_Po|~3 zu~f*NO_QZN =`C BME.MOF%Q|}>oh1nyq 0n!#-qT>)~}.]g+Q 8P9~(~‹U_? xbJemY@Gyżͤ6zՏWڵn_cEe׵/-r]4DbBJЩ&Vnm^] nfJiv*OQʪkŒ+5/oէ}@_r&}n@':zQ{?ێ-;OެbY)5l #?Bs̭[2)nY?^@jie>usV~.m  (}dqt t[u8j}Ask-X;Hǹtb6\=7F]E~JN}HyNU 2&'q\.v,K lyB%7, `Xi&akmJ<(Kd缵l}\ N"=^G$b z?|dcK%Spi3 Zy8d2!)+S6sz3{38* Fn_,=dX\,%uR8#QtC6XHRJ"?0^x0d.x/ u k4я>{=eQF ŽTAv^+;U]E-^'RzU?CMKp^)Q> gj"Qxzs};P"!&[z#mj;I:\_~Ku,3թRex/9DP|ԙ^9O4Q7R#:v3gsƊ3^D蟂P!;L)$Eӛx}CD JxBi_1JqEL 8AOD[xQ}Fu_\yQq"? nvpSibD̽3(.dZ(F&eJBB&vv?p=_o9-C.a}cu^l0**ٯ B&`()`;ggwY=mm? _. V_8\;i'>K#Z}AiRHOߋ*ؐ%GeC2C=U%OLkmwqr)Ue޺Ұ@u[czYu XC8ZQˁMQf@)瘿 c~8><]r/5zVcxU?e.ҧafHAe*{SSq5y8'`Amݲme۶mtٶm۶m˶m"n̍Ε[;FLO|;z8p(4 ;wչ ٰiΏ;of) .A]Z$w0nu eʋ΍V?蚣hm= h-Z?P4YQz!͛hndj>ڋ| Acpu-;ۺ#5H\UݍL*U?у3NW{!`Eh!x#Mfjs#2*R?!/YD )hb` ƯQؿiANxCZ\Q@`vqt  C}>W75(.(ᶛJ\E);3˃: 񩎞< l#1^${TgD}Y9 0kyYȸE}. #C4.C\4c,; )EYXFdI<95SU<ӭib v"C(2:4#%x]?n.6bbZߵC O!пG'8- zL=*qB ZX+Gg,ugi1˯s G\ɋ؀Ek 5J1ȱssZT=誢M[Zx'BDcm}V[O[~"z8l.ߞ!}_#>R#/ԖZ$:+$Q~ʹ?ʹ[~Y 118JJ;B$9B*[e3V4x0}X&ݚܾjO(0UsrQH:Pq&Qf7ɸ$Q7YN]ȺL2('yuCz͐ir\@uH`t #:fQ^!>m8>0t;CZx3m,}/pV[Y1͹dZjo` \~teDv [Cr'$ϜE@fso֧Kդ $j\Wh  s£۝;-Rg(*EV'o]$&}F4uLĝHcjOa!qD%L(И͠W = Ao$6RgDx5/7C`bF)m= /LQ5DzX}sY}D$N4mFIJ-#o=gC|(nr$ۍWfk% 'fRBIy|{jw1$b Mo XmF&.OoONӠ9 BNEcLgSO-Xc A MG}@Gj;).e@.|hg3 KAJ_2J"Ir -yؙſ,u o'98G s^ZtĞ50.e(c h(=^ob2̧1z+*oÜݞ1.Aߤ@->/t#嚆dvk>h9'4 `'վ!rK>؟|!iOb/%ip\pS'媟0涧|e9 m~g%!G]?1fcb`d+M焒 'TF. ran懶g;^ᦾ} ޏ3b| 7zz l;JƂ]?=\~?3{;~1txg\fvaͩeνMq|<%HZk@q!Qqj_t $+R k7ǯ$Io kB;2\ėLJv~d(IP(~N] - Y{q `ܵpY0ja3y 9uSH_UX]Y@Og3ٜP,&WšO&ZΨT ͌* Rs9s'ZhU>| в,[RNrǘ9tc)Ǧ9r=ViX~9.jZ!63ul|]`?>B l Zfȇp-f%m`CY>!L,SMAA|eEo/QRs72pUUdCE&[!!`:SD]2nNC9UA;XE ""aeTֵF"uCF!Ku]ĉ뾗$El 900DX|lÍZ"źMamaKUeW$(MD wa4tټ"Mǽ=(KP bظi-)~i!|J\R0 C A쮜׀_&U8-|0-NNKh:s6f,7RZs+7!H>ND%MJXHFiL)/F"PSkbdw .bkFOwJXYĿZ&8a1<UB$$gg$"r{^K:AwY!H(n BS' ŻBXQN+b~r':{V4C#zBj>Rg pg)cn֡ZO$k#EogoMeN0ā.eXF١'; Tdnݘm}o #ʢ-пBv8˿,w_9&]L+EJHʿCGYeLE}]{ %+ȺhA_ 9zzpj-gi,,%3gBqBW**ou1CE08%s韟3/:wBiK^*m?XD-Sg Ou jĵ.dA>\bDpM$ \.VMH Y^ġDJ>߮Ot=Z!N7H_1M{|ɲt!XrrO<   r0[Y{tH oPN?!{!(h] M\A3rc(&o$Whbn:+o`!xlwь4_b//x3.HI3^BP+/[;STsS^jɕ7b7>ڏ>l.Fw^K>uEW쾛6.zeͳ"oGF? XE |)K>f. =ݔӕ(:.?4&[hR)l]lÁ{z4j-w=۬Xr2Z>y6%O/M%#/rg3hVoXo88+_~n"]—bkt<,{k]Xh%ohU\o ɉn}噮=IЪUJ<AsO +t^N[b/͟)U %kWONbv[yw1AWJ׃h, bFE.7oJ2 W//Kʨ2*E(r[MyJ[ !Y)4(# / 0 T졘dt+졵h!M5#s8>Zb UA{IxLqH,ގ D=hz@ x*N^BJ_Ivg;: Zf!+ǨA!e()~ϓ eNB} Q}ÏATO3t*ls! !JIu,,}䇱PLmxCp~z06}e޶6QÇdRQ2 Ѵ~[IX}q aIgiQ+#ۦ]䬱)RE (B< TFb=lNhK?('ۓm7z#'D~JG?W/!#q&=" Gs2+м:; W 2N.9>w>'Y< GWE'%N;/=SBHk@Tװt{A;*kk|kkvADIߌa0eh qh2۰lt#ns23O"pױɢGm,M{FzE^e ׬H(9Wk#B7q2+ī^BW;ÜIB WD|\ɿ8VRAƠ"q25NDfhX41&w=bt9uɕd$ ','A9<1}xUSI49eA[U5~ Ql'zʢ$4{蒵buqXFV2%[+ONnC>Ȏ_]O]ϑu]{Hi@[_3wusPgDH upi3͢(]I/a-aPߪI(AGwfwx9j1 :LT(١Z dLqިV;󐃳OU2Ӵ;vp#ڦ "FshKFv%:e~TaL:,@CM~Pٞ/鴏:zmDzdH dЇ<:W!3+9cC'g58bZmSI9?H_2seys"oƾg7 vrmLC=#Qۮ?~П91*i&NB^/ ޺Z XR̿t 4R&9viqX?0ė&tN78 8i{Z!8^EjDS($f2½TVӂ5ãM__ Ktsu`3|!@CU *^|T#Ii҄R&^VN>sʧ@7A]EN.'"K]8*NY.@aRuKws Ul^2/Km [}7cUUY0O$ɢc Ԋz;*~AV=7,ư}ʽ `{npBH Lx}F WYunAGkh(3GòOF_gI/TZ:tȓ(<]F_$M.9Dc%vۿz/I.E4P5E\&\ˉ:/GHh_`k =6SLScr#"{iDF"mh -uDn)W0!0|o_O \K]ADH~uBAFa ^L GJ#]>9f+tW| |o܂FE؉˄( ls 6r t ttJ쫧qrLCkP$E J]OriDRYD:* ;G;-4B;d ѷӈڹ >ebrp@/R>ֆ+kcASʇR$+Yxk:;;u 9lB4v$S{hCi|.ΤW׷DT'a]W zKmChNͰjdȺ;©4ee* E\VD!G ]Ki(䩂s5łׯaDvS]ћc)Άmhee|#L\RG%jP{%/S/\U 8Ef셒-2InpL^f/OܙL+dlIXg!í `ND2$"ÄraaX{|Μ$_XpPa\ #ieY6((˰M k>CcmR y(K?(an'D41Euˣ99B}aܠ]@,8pD]>zbM3AM!q cWr9#gZp\xmq0#aƶ+8=V|Hǿ~I]]qp 5Dkh2?cK]ZU_a_.W)*|F(2KU藝佁 @?# LF@ԋ@#Do f w_lf DTs6 "' 0&" *%Qa(gLE,xSw˟ &͘FL hGjx ,X_쨆ꪚ$g6uՉe6KA^~\&)Zr?ӏ6x.YD*\<+l|] k|^7Mk@p~A*>ĴO["!Ll:ur[`DgVtnkzwS!'*ilW5㕁{ z ZX-H k-,^AaPm13v~I5FVE5 ZMnaV0*68(X\CkDwaŲ0msKe͸sn]dAW31=8'ݱYCg8F>YZ:$Gnl +V`OInkm'mĄ P( %ńGO$?&dAYtuTWݼEcQ*-v- "( 9XBg =d>l `Z;4sW21su9#u[ޟr{Lhkluy`K9lwlh{8]>?N ,';;'R3'7ZzOl~x|<ְ Mgi?e*|Nh|,ֲٰd}%:<|qvtu 4^Dn`h߄b4>*kJy{vtsĻ O$/>ܖ­7֛Đn`KD7(ZiكLʥdXn{do.L&?48hzݺrGtGME=LHK Zc*u_+t'k 0a4YAIot hTI55t6_{sJP:%:@NXNjKsN8G$^wQQZS}9DV٫WT ie77C5qp1TM`u $56g '{ETS$py2e.?%XMe mۧk.3R&_+/v '*/[ܕwR |[KT90AaՁ$/3IdA`x8P%IZ u qqgA,$PliU-eRW!q('8`@Eq !T|?L. }:;MQH-Uԝ],9f)Be** J,L ?qŸĬG ;"/4pǕy%jj ดN9 tobs[c=tLK)~n(.h$A.OHT gxBxǭiQ͎:[a;1^ aj,) "["#=9V A8S;,)c%ZiM_g)y$RHGA G##&8$#'w_oʻ$7eDզد-Lp%`jM]VǠCˡ8<0nxyFZ tY\⷇ZY:ۂle([XTA{ߵ9͝Ĩ~J%*kG C*WKb)Ok/*Zy"c3"{UJH 6BJy̰(>fTVd=J/$$ ۵I]N@eF8j<ĆF^2^dtM{$E1ƈElaaL% $DF)C!xxbJlT8;9Y *8P 1c/ #Xg:i rً_H ':!s&(m"*˸.s:Hdl DK`d.!-w״*ߗh1И0a=hWsعU%G R)3:JH'gWǻU*?QD\'oW>b?IdNU3"ڢtt~HD}=IN!ENvCAxO>)֢Dk3Q ^N)>6'Cyg0p4X陒kd=a˭]Lv,tr^h'>zPdO yj4ࢫ%*DxTc@Na0Gxrxqsˡ@ TQ2ãi.lw$,Obs ABpƄp'g!d|pC1PIaL)PAp1,OV~Яd^FbHyOb+)KЖn;5 ;%,F'|7mjNҗor U}6rְҫg M wjZPyп3v! |_|yݎ,mO*zuJXWr-*qn$Zvý-H`mY6 DY ^s4Et:yW* /\'T'@zk~}&qrQmsy58&yV,ӵ7$g)`h)*c8H-ފ@n~Rʕׅ6ɬ`δ4-21GZ6)\ߝAmq Je_V8- fWjVK3_|;gS. Pgx 醤uNVD48D)"3B2ĥDOrKhJDu B>Dͳe'jAs߃U"n?%tmFdW*h5&~1ySr0D[X 4U:I~:J5Ia*]H2(MQ(oFɈI3G5옸WO- IJgW'~r~IN@9ETfU9; nA'XG `4v~}XE3bw:vrh~L?V׷7 zQOYTh=RXXrauX@)`Nԍ8(:wFZ}sV\RQa0 TXv\z~y޺hKk,&T'u2 WD%qԣ9/>!|4m tx?WrhGZTA$F0'87pMC? I>Eȍ,\ Ͷ M1 3["NT18_]69Bu^;,ׄ^c#(ԘF6s~5b![ xwDm[fbٰ310TD(1yYa"wh@w[+p]9o`ct9_c@, 6>O*"*s4r [>7D(N<$1ϔՎzx*@441J*2k0p2tPv Ӕyܟ.I}=Gli-Zc]woO{OG 60ڿjm755-fXy}l%Rɒ.0D[x2" &&9B5eOrnOi4s]b.zV?|җ7&(^ h b3 >c5o5L2sA'~SbxXW}{v={2"m DkZ V*K; خ.-˳$eԈvK)m5 lʘv9 Vh!FCBU0~WșE'8F!>0> nZ=zu8N+Pv1:"\# (zʂg"VIJ@5qhRUׯQI9diA$4s!(Hi-8eÎ0O5Z}:R|'==nz8`<Ͼ2΄WNqkyzC;5;G* '0 )YiiOmRK^BPV71Xm DyE*[K^dy*9>"@A@S"T :$2@ZKz2?O:!ČUBݯ==ވ)|GDӯ,\ۈjEQ>Y'TTPBJzK<NYaxd#9TljxZqO\D/6h5 icWkD% uLJJ0֮;yN$E:gcgfQ*0B=a$+OMNҝ#ZS%S`%0?͸kȮ0M!_fr#/05ɨ¦e S|HKI =0r>f0+_~ic'Ռx2X n-9sr2LS/̎$"x~R¡}5o,XИJJ^?o[m98&)tąJ[5g8h"ΦO/rnKL]Kr~0j,ZN&cRB>R,nǜp+2fD#GKJ WɥO%I}<懌R<(T0)/Fݮ"ZsgQ#NT?L˖KYj/o"$J295۷F_Kܖ`DjR{R8n7Ò t"U갥cXosj, R+4$[:DBϴR3rkm}hl?2nAލZans&~F[ ^e$ʞeѸg/e n~Gv,OW6,m^~i8gyXFe5ڻ,^ߚ, g}=P3}H|͎x דy/Ա5:^#Fd#F=1}9l%qDǺ4b_L([8F1^3?d\llX˼]lgtTYj~Rt<"+=1hat/IZ:` 0O7RJF$awrfBکgjSvx4j2i䁨yYg]۬`^a޴!F/ E K0,+|adqnMKYF0aroG gUvHs6<],0'{ҊXAI{&!-3u?)A^wb0$V-i#JZ8S~rFeC;vX^|~(v Fqo*42M;6=KMAhyڅ~;Ktjj끺 U;31?#Zr|牜?N>;\7lAWE\iJqm)[4O'DQO3j_>rO׉Nf<XRqF-^5}%ttg`JU{l@xI %2jXyjky+zS*.vO~Dx#I+_Qy!`kUb@cڑ;UY&OE{5*!x)w$B Ts|%]>hY ߸1B4RSW?P TP{}0 橵uWKy6֛7³i$56k W*D6W}xzr P4߅xrtXA%ˌH(_ +]Fђ՞iIwxz(8_wΜN&a*gTC"}'JC?Ep et(D dߒ=t}PYӪ밽\oԸ;eɣ^0$ kOucut(]郰BDi򨍵8:eFt5^R=$6݈3քdoU&\6we%G#MIAJ-g'qne&%P@\mS,;9xYf` MT Mn5Xm͎*A#)LKAho17B~wP9܄WGV$88@)TH+{QYq}'f_RQPMM \Т-8/WVpm%5M/߼jFl,2{<3BԤ`Kڼ4y&XH9*+No1șI᪥bWNݼ"5ΐ55fnW`MW ~3@ܫ2eK/`gxgW_wn bBuV<,} h:v 9{H~~9|sۺ^'5*x4aHѽ^ؼE 8 L*,{I C:IŠRt;0Dн09w" 3ϻ?0?Ww o~{Ր2(]QCc'zկ!A¾-i>>Q#۾?~ʺzJzypX|[nz{ "G㈊A ƧmM}Xא᭚ԁ$t kRfUȻb™0-2IfŇ 5,W)0z,;!QU8bb5FsWO.&IzHl7[-(%o#\Z]/TP(LZjrΓ=!ԞH 㰧?=.~&Nr̉t\Ջv@e?!M1īޞPI)#Ǒ΅Ѩ8A@B1Fz}"Q]7|uHgǀUuQzGWKg;kWg׋wrڂ/D}ύ ݇_z4ʯSWБWSۣY]"|srsrszuԅѠ9 ǿ"{i8GyڗDJ|WpUuF ʺ{ݓۅtYYDϾˇkk7[T ߧrݻʟ'I~LP"9L9m&Po#UX& SУ _΁[Le韷VT.|)x*Ƕޣx.W3.K&AZYΞ}[CS"Tk\]aI,l{Œd;;1Uȧ_v8iDSh{2ɼϾI]r~;/1m__^wt\^d[X &xLijłpnDk{j?E~85߫_է~gOZ}icEuQ%>o"a6a F |IY:4\>M]߭}J $bܦT =m>Ls.;$R 9[ؘ210221W,z&FδnXY:_Z57Gv]kفX) u:\=O'jVeKm_H{>sSX;$uY8mK3 tzՍY-?Aʥ'ְwoPE%ݎP&NKSqBrJ9Dz^Oux^Oi8TCmZe WF2C.q$_YU<"%HtAX$y5jсZ~\W|W6mѽOw61yߗrMp}1wubб :%5mZr Vsbo:ҒA\OJN7.pIf@`&7km&Xևry%=y܈zsDC*^,;Bom7QU]1>;Q=%TiGV@#1bA\!Q7%S@[&s& Xi BA;uHw:Tߢsk8p]spmϊrmW]"r]﷥s sͮ'(܍ЏC'W"978ꊠE͓%rcf!9ml8g$,5zl*h" VRGQ x`-˺h78R'&tuܿlj ,5@%R0@F ([qc=L>,[ƒS.^;׬f}N/8KtyQF<\/QxO)/z<'5@k-˼Z-.*)1q `B*:/׭xB`K'&"wd$$Y8Bz.tۭKC2 R"^R`Ss`8_l!];~E \MYv#@J8x\\~ EXmF*2 hJ+=iZW>P6W4qD tpqz}=ݐ)GBXr]ci#;<$Um_pV=|tCIa\CDfC:- iͺdUcj!-fBJt]}``k[@ vjݦ%&>BG-ؠku!z`Vu1GbPW%ϊVƺX!x+PR!K{;2OmȌK9;㦞otr޳T㙑(;`w .rwL0uԣ5ݞ^ wniqq"j\1]D*s6> cA2ߐ v ȐyAR!^Z+yIʴRK6 Ab%Jua۾ϲ)mt><*0Cu+9fÈ1q<,`?Q9ЂR|@TM_ nhI0ތX-E. [Y;tT#ɏe}Y:kUR3蕈hÓ=1bQ5K+'ZڠPeUUW_"TTd%l_#)S6>c߿/.~X8/+YUӪ! S,gkGr a/#oc-iŕd*%+hջ%jslyS]lh &=]n{ *8:uɣEf`ŵI)n4s& aGDcDÿS>[XQY{@}`%by)I B8hND$IM@ɛ'i;m \%#3:1t^x2dANgtQJ|=kk3M'ه8 2hVt?w5ݚMkb2(n 賆=g?߬5+=>!u)0OzXnOqX`;<g(1읁3+;9_/Q Gc^"id"1ȒJ.4;Uyo>jK$ޒH\R̥wKL͇ʈV:]dP|| @*MY [MMn0uDu5SV/zjR*(Ҭ[WnjmiCY 7_9kG\Bbq(3i#O4RtaR2ɁEhP;B`qXĽXt# iraBcA$h) zf7Ͼy\g؆P9Ɯ851|+t+1K;'Ot nF]\=*'PƠ_T{@"j0,[.LAdSQ|D|U ݁pp:='|m: Um].zbMPYu\±mn^a*3a^A$T.K5m,ԅkZvn`EC v(^H˟Ul+>Ap!_TR񋢄jgRSou ,ӭ`0)/6Dk1+">GMT{mFi⏘^oN z&'7;ٖ$Az9t\P6w; " Y*.ƴΦtN}-vb"e L| jl_KR偌=VXV6:.,=R|J`V>elWU*Ѫea7~yܞ6n|G;yޑo%c 3 =X*qǫ8C% ` h+n!'b5|+@e}Ѫ3gE?Т6+-5z6m9Q+{K5h.y\&m"3,+ '[3_X4fm(~׈&Tjdh\+t TD`uߪ{sۜgk|RT-H!RVT dՉYOC{Z/jui93aˆ?6}2}¶+b<~|чU\iOY;sCBm7ظA(A֮4_ԔFe?mg2d؈I.%[MABrZ32]Z0U"rdc!l4@kcuAT#]IHƌ1y6GyϹ cZH4!*z*t{YCTڕbIzd6{8˜A, y /6/$ FBN-{NQi(hwd*\@P-BQuPP%aY ¤rU2 L8bYJOŖWG/*/§WlwmJAMű}N.6`Gx|kB9 KY9sӓ<%>ީVc!".c|bl+y`L)eqy [`^ I X-<ĩo(; ձ& Dĉ"*/K7s@Vכl-h!3ud!׾<`7|ʥ|i%R$ˤjw}>yE2H1f2Uи \PPzOlR?TahJhrVUxnwUI+ɼbWF/3{{u $5=^I[Q?jʀ,΁2BkdN9V Vºq5P04`g ̟!R+3q{h j"[2T[ 9In-n}HnYzeԢY (GqB =*꽑vk< Ou0cܢ ʩR̳. ;{u 6 KW N+o8RBC<-rʭnV$PK< ĹS ΤaϏr^Ιmw|xFT՜GKDy&_)}t81#Ase>kќu^`DtM#6t(7)!5{:D2L,їNv'w`d'}_LAT{nz'#PA$&\7V)}!@~%&'q,u]6Zҫ0&%H%xe2ȥۍzL0!4W 2DBdgRuXɸ*hF-Rm6yEzߖZ7hѯ`"%.VIu6,FnuSRyx{~:ep;`{j'nv-PJi盁9\dߓG`3E[w4mX@<}Ip ,d/Cޙ*z),q$ECʀ;$qO?< :M+1Hwڕd؟YMP~*RNIh-}N:__sj"/U~@i Ų';v ,q55lD}V\T7.R2TI>.N`uȎ JrX$,7=&SS k1Z3jƗ5]fqJtE"dJ _P ^{dA?7̘'{2[eb'cQUd 6F_CDF<(R?A.P;h^bOԨTdǗr ?(̓,0X ¨$#X399cp—H?=qǔy~hJr s/e5XBuLf*p$S>ٳRI'YT8ȅRRYbVE<|ا[O%J#zHSC͢H%j8Ad$޳!U@w^JpTǿC@EkCkj>uQ(|gixݳzEO8}AnpzWd\j3OE=^CsDt + VkI]C!#+83WwU,Hx|}4GqVMrfQNKBzF 'h)|uKFe[wZ^{Zgs]HV\.4j>۟F8  I]b&1q-ލem6~=!,*Q/-p4X#!Z1k@/yJ4Rá5/5\g2 &[bg4?t4sީHosW vKLQk@)VI,k|e.-hfV~]` z_J.zV!fNu=fN`jX]/blsu=As VVwI6!BSZ;|v~fy iu %o sx-!\M)`NNOM> J SI ʻaJ# ޵鼢},exr淒KV܄Ara"Bx.0)&!. Z*АUjOՓ<Ppm{+uV2ޮe9@Y\ZG1IՐhf;mߌqr3X4ًABI4uږs# 34Gdvk?WLB~ڛk0lVHsD؎c"L)Ӣ]y%f`$P![Cm3]"GoZ~=OÃLwL$6 (.9!) t:VU&ڍf"7Ʋ/&K*҈( ~r2K mNJQ~Z֫ ߉{)<~?Ox{og–s؃I#ޑSvjݨ׷ZΔ,yZ-q>8dN^&Cltˎڳr4/l8@uAl>kMŷCo;:kף7D:0ُc)HI(9Rٕ"0  _iʿ^)Zs ?@x:Xl0ԕuLT.bǜ0T=CӷgHMȈ~3XK֚6Jk3j{V$ZJ6n)$ZN-J6@K,& >ic/bzFy=$fEDs>7ke%@Layޕ]sX^Hʧo" *2Y5i!"QEGodjHk8ٝCw1"s/2%Z,gŕъ\VP̈PR..gE0^ԓCk)č_D9a& GM4 \e#zݝ^ɴ^4S6ac>&K~l u#=Zc ZeMDL߻f3T]1AҭCނ{Pom(TT]!lI2ĺ1Lrɉ7}ĝ F^-5>SY5gO> )Cnnx.$KQqG-s)>v5',$ʹ?k~0yy|fỏUmlSǢٱo o;kY-xdt>6)5,Up:+% lopVt^Mm) Ty 1~y>Wz'oH ڡ OOY%;R#;O2vՂdwZ3:X92?H/s@AI)KShӬd?new] /&$E3P<85YkC,\EMW3n]X?3v(R_^-AYJ`б,Whx$l*͈{')m6̞'q=N +ߞo.E(|\ x5"S85VAFee^3 ObxplVXu,|s|P$'oBkSJʇFCYox cKR`? 얅k\stAj iy4\PDfJ :^Pָr :fb[5:qom\ӈlBɷQNjN+OKsXK/KdJjKEX\*!3Sv]V>'Se' QOe>]?@o)# ˍ t`PXT"xQDŽ`+MT2/|D褂O9~H U_o>l wL Iޛ-Hgt[: ĹݢUaI~𾣅̇!BK|sz_(U=}ҠV?J"PÖJqa ˡҖB0u~sj=%WnWtLeѶy/åPI '&jnf7hni6[y&3&} RGOa#r̬_R0-|EMT"GnhE-l,ܡf\G;EzM/cs&TJ߶oxEmDFnxQ.ZF5\)␕!6?> Ŕ6@6B*hY[Ϋ,{C4]rY.9gvw JP [S#E=aSD@sWpmŮ*zװh5I \Nh3tpcBp)t!bELa_]:8t ɪA.|MOCBpT9-pbj!6Uᘁ컃pwV1Ѫ?>yv,R ̰WA^~˷~}ctZ{=ң@f-W(ΰu@տgtpgn:rhR[հ ‡ )G5uhT S$. /M+4%_Aܷ6h;4\{"W+_NSiF_O&ъsuL*X쇭tIJ]{qU&glLBF"5k>2۳-dM#:0+*Dl4&0~<='!6Vㆵߚ)R1Cu|f 7Qi;EXuYhP<*vUjIM aղ(Mp; GrתJhJ0j,Aȝ]T}:s3xonsPN:9QW»=orއw/ۻNNYgX`4b1KS\F(k=vm7hƵ0{ W)v%:1 s'|H5'NǏc^hNx'L3E6'0bv D~b$-X!;G[La431KRD7(rDGre̡Sf(2iB"Dk)Z+Y5UTMPba$X{qo>O/?ɥ81i)#{+sү9h4kף]ŞWOŲ}0\"xoޙÛ{H@ ^UM(my-agq^ܝ60e@WZ RB}{+'0H%e&Q /n"Աx64Ts'<^E#\@U{X$={EyxaC1Ss.QpTYYf(ɦkX~琥;._u`788 e.^~WU9X8i.$i%(HZ4lf#g  c/ʭҬ/̠XDi*O). w 8?pN,k_+1Ľ!9\etjc|L#i%wo^_;=b2ɽ;tRݦE͚,Fmw{Үz}=Y H.>g 5JW>E2FIw\@nm`6ks;mY)՝ J.thA"M `5>mR]`& [84ْ84YƆY0еϢ10D=nBߣmƛi?Ocs$XU(ZDlD01)cfu4"ڒFQ :ATq&AED;NУ-^L1cDJE݇.|Qpyo HdL04&ϸ9Ь&0 J!aFNx01 YǷ-/&cV(̭:g'Yw2%>i`"IE&NJ2G4l*Zpty!ȑ01)k01m4YO(^͑@49Aݢ]{3+ \0BCGtwr;_:w't>*{l)4~r$}gGv31yX/CMB(-kgcuTEl纺vjI֘Դs42*׹#f_[eCL9Q2:` 4 d~=Q,D*\N?P\/FG"u  Uml4[C=53^+pTtxP Ь9BQƼsGj%lNbo@FpQ&ioQu7g٢% RZ=jm(te?tq NPI.wW66A-GhL)V?<}}#$qofk3,LpR~~e-{?brJLe#}ck2Fw\rGPX\nՋh%η.Ѧch(>& ǃpk_Sim=SΡQɎpV}}CBRr0tGѷgEÉ`8" vkx]}`ڠۍ gpO@=z'DZTiS1MF(j:34'rG1L6EI}Sy8; ԇLn5ԵDQ0M3} gJdk ?\_.fCx<bs!]Ѣ>ל$'gQ]2ҋ#"<1UIVsw$vɉH|P ،* |@j* /d=X;6X?Ҫb8LNg27 RZ{ `F#e}1|㷲QpäV!qٖ9&S/ i;M23ժSbގ^2 Y;Y6s]W?K-&2Gx*6ש!z07/W> {!=8-#efЙk=]"Ψl: zƁtTAa-]3rxt*0m |e$>Bհ'sFP0ak|xR=~03$Ek&=翌_oF3,PcRqN4l^j ͊6] L~ZzfR5:ݽW^9g_4{h|YFʾT@iAR_BĿ_ ?_Hf~B#e> uwo|EÏRog}D/6Z|K/l3pX/q1l F}e /]{0Ɯ!Ͻ{yjJ0PK '~nB/g^yyn4UQE1l8`_\SI`Zhv8>|J1_|SÍ/9xf^JL9_@'>1Rп@￯ /1wT??q`gr`0Vf}⍬^V[0#VIР4`]Tc3W'6o-s eP3 u߾Զ@X!؝ǥ2bs/|۝Ό "yWQrR{O݅YB>3.l\'&:ydˆߓ٘~\[hj)|I[doq%~J@`AZ+IɐBA(](qw7`/_tU6~o8etVvyGh1oj]כ^?/⹷;hѵJy?bMYɚSG'Ѯlno\BT%)^X*Mw~E'%Tp["E^`/(yLڵoְmWUo?Ơ",T52_{v߷PO hkXjo _~^Ɨ^}^^jǴ%܊ijVzTX# Ly- #*vIu5M!QI:e䎊SA!QF0r7MQXKcHN H&7zbXw7vRCdEy$qzti8WzN,6+QC>g*ORگ]R^p(ցvu:Mv Ǩ/K wB˽Ni0K xI"/JC5 Jl.kkRCt߿zr cTs>>rEݙEʶ˕]g G8(t.ƿ^B>A w~w~ww~ww~w~ΠO"z|Eވ8 Gi/d|X&Bh'"jQ`y]Q@bEL~ v zқS[*UyE}{$te<4EdJ* R+!(g1OZ=yx@3;xo i6CMO<`VrgRR^PKf.xG& _GI6˳r` T @c~Ts Ckh۲PP$k>6J fާ}OLh$SmVQ&p}R_Jhv?BէEr hi",oO@)66ɈBK}gl0i*a٥*xxXfB nn.V6?/P}fYɅg+)Uu}҅'W;rWycMoAn)&2,ːffa# 5an^Aɖ_.Is 4F+jR_zeZ B,G5ƭab؈pO@MɿGH.Xcta&jOmb"G։H,v%;w*7קKg*_(x`[hoNJZs3B02( lSj˾v;fί-uH;C[?]m@<̓q92%DM՟ <}3 L#.ZE=e$I+Ni9z1̬+9r ѥ#4~5F++;\; th)s0yB?j My rGA,Sw@OH?8)ŶFH%z aaG \̝ k4St"5qś;|8@u6?Ix&dءa6wVl}n@rn2AsH+S&bkv#SBekʕp"Xznf3+gU VX]ڗ>c\[tlB#:#k(!߸޼nn7*;Pݹ7dsk᭐T^o|:%`6; '4fǓj;]ky#40B!#4!BGX,hʋ]=Z;ҷHepw[p{; ; ewpGpGp:Ei{˪ImnvO76~k#Å~DZ?dQڤgk9 =i6=芠nɚP5Qr$6`pv=0.{+ dg{iDNRCVZʪ0f ){)Kyc؝~&:g[!ԕ>܍`76'7 %A`e|!]x{pFF&'иp)W]f9%\#BبQK_S-\1mj Re!l7pi 47P \#!)҅WRkWm;%#'_Q=&gZr{hb]|aL8"يI:H!aˍCmv[]y]WAafZFL#_<~Һ .)kd ܧe"!s:{ϖ[l5cxmG"|jBޫ`1aLG (X:.0H T'X 5Ѫ?MP6E. |H)eڟbTq%\aK֢D^ ZDpCWG#•G!9ߥ`LV#-yJn]sPFKB[wy@a]ZNwi^`hR !#4>>UlB64N۵ISrU鶗%+j09Jc\fLZfBS)3`]]A7_S/FoЬjЪM* BY/7tv=#x,x!p'- 1xg𦗛8nu\7C}mf=By>E]C@9%HHdutd䜈F~O< Mn>*ꇮ߷ H!nUеPTjiAQFiWHH_Ce Y Cz6*Z"V%b%}@vfmu݇CQi)]& i : s&=eXN!)! m$^iLbR@rJӞLҷ$Nu%&^5xƭhZ N{\Di!MőR', :<ܽ/IEJ/o&M*6L%$Vo>î2 W{u gLpVxz_qF)TO9FΣqx'!wcc³1 eQh 7b OqV2IB"'6Mm4Hv8h*R+CP`D0۬|tvX~z=rQ/OrM/ UUCUN4IJCUn<1qĔ`}жN-9P*M\6J=c.paS:ЙdegyjUƏ8Y@ýZ~ 7 .QX Ƿ RipvՇW}@? QGQGSyܳ55PR6vE@itY&M6AgnU]qV &{.Gf4n*aP܂VTBzGhN{$T'\} 8.<ޅE`xVl9ؖ:6 ljlfpDDwa驌ޚQNJ3Lki7Ey#s,D;;c[2_Eی "EV#+}ts1F"㸯gYEXWXRiiʛxd_*z>Ge{?&9SR%sAB9_1,S'awbGA5Ak7Øu+oJҐI/m`M9WÌɌV1B=/9]?jv4{ߒ uP*>)dÿ 4L[{ߢgmu-Ph5//{Ƨ7-CM|_tǒ )x5C^[Bk.k>:HTT>_ e{1/kAoˊ}66+nZq-;f;#9 zõ!43$߳ }EB&/ɍIwk_.[6 +`-Qmq-M?7E8v#PhOߤ8*0lS" c8g>Y=d@`e 6)6'_e#=Qk~nvٍčkqQdLц~%[e{'Rlnt$}xޚX'R >]G7~ޟۛ5y H99Q-ʍR)~HPq9Bi& S!DMzF _Z("nt(ѡ;Gg4v&r7,D("(}dyّ!:( BNwȂ7iThT#KkM.=:ĞoZͿ_ MK$Q*KfFY_}Gio{uP,+jejTPrJ?gjlHH, ㅝkGKV8NLBpBosH&j-d x.tsH"یgA 1Z'Oћ?z)z׼ͩ 1z6MlW&W1ULո#YF~ F%oTrM.7?Eց,!$ 〦x d*!+'1[đ䄇`^(^/?5]&\]t9]մB3vT }oҳnkN~\#6O3-˗0 eUy -a量o_}YY=gkΣ l_NhX1 gESa}oo>{&B.?~?R?{}5eo`,_٩s ҫΞo^Z>^OGe\lз6b)wVV`Sl Ifon ɝkpKTkW⚴ vy/![EFݎީ-RORG R\]sokQugc3J,}˒ȶ_gޏ;)+3Z7G+ԇ5rt/KTy  NS8`򾲈rpqL t B_/QUph=sѨt2PXPϢal4Jkt1!9sk`4 jdsy_ƅT;CPA7PDDz*/Y|,1;BU ߵ N-بmI4P<5eprYPkhmGS<[Z4u r4SeX o'aav1'PaB%'?{}'X.X -r]KC ,4 ?u(,ee.\U#b[{AUZ2$†Bp{sQ/`(73d&UgnFЃBpD1}EKp{Z\&VBsC@y֦rh+h0,!ǒwy>wD&cS TqELǼj/1-ȋR{\q #_]&ÙzB>H^) !JfT$P@J=KX\DA83[p7.u is%>1(s;Pd&ʓ>ʁΔ\}LejKmx)u8`bUVq_yZRξXڃ!c]RU}yQUƐ9YkFQ7 ԙ) қ90nîI3V9SGPq냈퀙+*ʀ!]Bp?tX`lj&3Nws/w@'q^r+{=KNv(^8Dqzl?X, ~ݭ Z1+cm5kAgckZhK竀製%&&g8oBٍ3x7n鏘uC`JdެlKR`mewVeflWǯGY,, tTi-I_7b.T#0S )"KN_\p{.M]3[~(s\ظu(hn斳<,}\Ӷ _2Ԥ1uoYq)U7@6ep7A?m '6:׼nc2aIl bA_&c'^?߬J~E3/UB&ʢvwdy} z`ovؿU *u\u$ygmfލ4!:DaxޝÔ㹝_?wAsNkjF>Y-BOhkZB #̣ɨ8-aG2;nPg'vx;סEx>ܿcR"U@gj5z̘pz5xdUܭ7 Ƙg0 $ oOϾdD 1[{ 4׌a{Myb!2]aB`WX!: 1wYsRm 0C!|!gύ)ѦnIr+YDgbשI*s\oiOJK^h='+?5; 3\&TECWK2Bࢱ)Ɣ 7aչ7u:,:wRؕkWWqNKECjpWG 黱DoVh0&!H= r_Y7^[(3%\@ҦKͨS2nfk$಺~OQr{ Q%' NwRtW+ ╡s4K/s5kMG7&.R؊OZ~C,1 )Z] \g1+wXR231z` v\OtZV9'r Vrz$픓GN)1\WƂM3hRZ0k)a`';#ӾEnL~vQv, n`PĹa0RڢXU'kXwhUꉽamcx%H-|:!;7vs24$+3@Wj-ݸ?] !f}H3S4T08LR3S{k @~IK@!wTɆ' BX=Di"ʪ2~-B-/{t0.8pWMN2Ƽ:t!>FQCIW @ػ!y)T}Щ!&2Qhot}QZUG! F<(/-7fe>9jE ?E&D] n@RK.jj( fXT\Td60ƚr LwR '*B{@niG`ʫz6(" UFҘ dLRPH{PGAͳQOc"XsԣSq<|[^q]=7?@ ުzmNK<~ "!"BãwuŤl?8@̉K>,WnomBcX^p PmM|b[ v-7 فۈ]0hm۴5EõոՕD jȾTcqhcGa G kΫsDJ(.q;nP[S'L ̗&Re]'Ni2[ TTr]K9\w Yw4d6c,/A !VY eW*OvmU'-nQd5#Q 3/&+/hQK}JdS#;.5c_{G)5o =T/^k:xoߔ@q  \wy1{ 0.4Vzʊ{nu) Ja=yMULDRYCSos.+Nz@@qTb-^7EհL[93tnWq\^I,":= zD֞<:Oiu2g @d:"D{W]ǤkfB\~ bZ h܋f؈-8˿nsrV6f.ZmnAUĒXҏ Ӻb*!x}Ŋvf~jt#s;·κζ!0G 782S8ZqcxPB2~.:d0 oq&D8F{c2w!E[ceae| TBst}ё #M}2-d"Xu)^Ce?mC:{3NqHH@y(ҁ {#݃oH7(d|d(#_1eE^ՑڼȄJwRoMU}L 9!_q`EGFSC~ 6x7XgxZi, >Bv &luꄜY店 ѓXO{$x [G ᄙH(M6∄nG2Zőә4' >,@-])JG0CcE|>h_TP<#2ڗs3 F-g)*]ױ {o/Ĥxa Q&` 85V:i:bW)PNס9mae5'ĥ`E`<+Yg]}|}FoI OQP<Õ Tq6I ZNoM Nh9Ҭ&LATKab'R:ȷnny-96M4 Q=ISVk= so(ô oDwW$LgvwLLrY'+ ! at-E56P~9@9F+^t c.ʍF;*K5U"-G[<ٍ/d$Z ؀{Ѐ%qV0AGO6n3VDTv'f  [}Ƌ}B)F`Z͆VJ5*m.5թ{C*b8265fHQHݑra$Ȑ#/3cyIhC3U,rq{(SNۄG wG%kX3*Άo+cPkߟ݇i'\R- G3g:=qS.:c=e>Kj҃AvV;гjCt"q ;&69ØuI nQBGG $jHa-xȇII J>x𜂸NٔoU"cM. fJe2.qEx?&8eJ(rs'H]9fN n(ⲒEc9"Eì^+6r$U#1mc_FՌ8zc7'γoBDPnud҅;T3iۛ!yLJwMAqEnqlnY1nb` /JR7z?lHg npA1]K 8V .yΫִ[G͑eRKLJ}╞a1Robw JϜhcPfM?s/5u@Gui,>ر`Lbh}j줴hk0Yx-<5.w^ښ^&dlhf~S2FÖIĈ>8[qLF&={ R­KFz{Vrᅒ2'_ A.Mz Jk!!V$jݫ%+|qJ@L ^e.#3 _^L؁ oVT#k}P a,S}Jz7~ۤ55oaű1JRxsEXvr(.J/9+{ 4UR ɧ 7f?@de I*Ni2KuFt @uPh j`{cbGAr֑~2>B*haJ}'cX: 0o ~ezN[{z=+0٤>_qbF$ğ V:=;OE LyU_.e).%xymH[ {m*:b= b U/y[^xlTډC2y\sa.{wDhYf7H> ;P-j]$O(#A 73'sҶ[ZML;adbYݾ.Yv/C/xBZՏ70Pr Dz^[pػvd mBD(P e\~`R@_JyFd4AKl]'ZJ 4pu+~RهZWBՐ+Q&Sv?-*N$H(;)CB̂^ bgC3"3ê?k=]F7Oߎ}8͌ǀ`<{3 ˟ĿMWoЪN3 2?S`ve!}c{ )ϣC6AYӼzk^$;}\|ڇ`d M3:!C m+"<'dEI#o邬RXp`BWT8.pm>$lgy <-Tp`ǍoÜxk#'B 6Gi+Ȅ7& 2O4Fx &0ةI-V'kfv|݋ ٰ8@=t|n//9=2=2>vأD+Yv_Z<#֬٘ԩ\b_~և-aMvA<= lDSp~uYgI3Ũ<$5*} Q: Ghb0'"JFlRF~OhHE2K_@6,VB8&ߡG>n5|[cv;1 V K60l "=kx5 wжlm7[İ߲zlIƜJH0+B5yyc}|.F ׭>[:@wϖ;4pr'fR7\C(ҍk"Tc +r@nm]_h[r!fH'$m~=sJOhO.ĥ!uS.u#蝵xIssDߢV GW7ϧ'/ic@ }xyf^KGCh#BhY]tXL){f R7W+T?l:BD '~n;vggDqH*fDϼ=F"8WT'gzRd ~hrcC C0ǁʵa|ҫ\ vHB5߮-g ji|׀WEAյ"2_g }%q^{),йy@7viTSf>lE8L*"H 1aƛ3*9zY<$GѐۼChCkA~TySK4'{|Bݩ/1慞nhNd <$`?.gjKI$cZ8 r *g 遨엃)7=x@HyW@ Y\B=>tfr Hqh$ma@x. :g"Xn^s)*9xa:C< F˽?pX}b1dS Kܕee6$/Ɍ:6hzc˪_8FC^]KJ,y?򍸃%D\$mJ 8E)m.uXk𺠎qȝ'G:厽 C,niҋ$lRDUz#ü`'ȩCxjɔ 0;m<ؕjf`NaW( !eL*]7nK}|M1Cq>pyæW~h [@K(='>W\~qd.sY&O3 ~ dYjj">ފW,7"R_M%H^s+NTҔ[bNQ>K+<܁)U%<7ˠT|)JɀxytHE2>z2 ڬ9+;ge,T6M=lBl/$g?N2SR2xmOrWo#eRj׌7 DRHq|~ )V0z3M_fEj'+昜f @QNk@(ȲZb䡯T#B%D3/LK8.tV9=@Ȱzh} 7 3r Fu.O'ǻ KyX=\uՐ-YGU%;_py)`f5O@j#;;[zg{ =W&FVF&ʢhb`LklgCgcaKg餢 L|wq9F~r;e ~ 4"t!qvSV^5\)i1B"b` 𮏼i /ɥWF ) -N$FM/QX+뮠-ln%N%n%.O݊U]}{; 2}|7_HƘ-;WLMn!k_m|R>I3pߢnCZE._&# [ݩQjR8H Jw#D;dH1/QVc54]pN?a昱*-Muz t3+Ctѕ[da5mZw6ĔW4%cC&V:7uBSlG` 'U:~xjePFa%jWٷ@hT:$ӛP4Jӡ@2t'9@Q' 5gH>2nF7Gw՘s݇L>NUDC锨y Z1vV!"B5OvlskYڗ(),#2}h:v7׌]2x8gB_;*,)aM\'2 $ `;.JB '@/W0fXrx|yQ^_p'7f:R{:fTO0MwV 0a3knc (5tфVb.W,pg3$ }ߏޓp;r` k蘸$f%;5J%bL1Օu %ze gN?OZR25Pvd"cS}ܹRbs$ABe\I}lγo11iP7#3ѭVZNjF!S"uveϲWw*3҅t·G4y߰l;UuL^^%nنNg- | hKSu!soYmrg1Sq3Qs+GSi pMVFqfYYbG']B2鷉ӹ989fhJ*#qʉ ubnH^J2VrF&:%%֏GZ\'G}UTd/&+Ĕ o9CHGD4g9#N (ewcz^IАh;wwqZI$^:WY۩RaB-phO<}ό;VKƍC}"An/:dQ/[bYZUS)ꊪҮ|JKtWV+#$Ò~@tȨ5_Fr1k8j~.ng_ m?KU<^E^?՜ kfV;RTm}j:_^y}Xuϓ=`W}}Ex7 ā+TF2NBHCDf$P.R;S'b$dAp/BS>z,lB9D*?-1}u= VH 9zp5WVṆ0hB4|#Sro$|W BI&ٰf%^I֧؟^/,)#UAZ4S@)¨ i=/G:OWذb_ZD6^+)b0$ۜjkJMg %hn|&Sq.x\C7C6 mmS_Q_\ҶBmvП}j:$$F bnJᦅq>e-Ӟ2 7[ǧ.A y3=9$Bʆ+9l Le ^#Vn?Cv# %@2ԯu|#i!!F'A^'UIP&35zΞ3*A7:m6m۶m۶m۶mlkME [#tYbWI&GYysU9GB~cGmn9hOj9l$CY`䥽/|0l 66RPY(:-A!<Y}4 :|<`=ksSvez2?O݊y(Of 9P7E:^:[xnA_s`E_(u l,=|BʑΜ"yFW˒p!ugJ.X`qcJY3D{]+1F6d fu-n.^ߏo-CHȞr+kizd﫳}RG,Jdz>iRpL`S)jb#4\Ib+Qb1fD) C@U݈7vfW ;( # 먘V&*YU Ű48a/DyxTpuR&WUӺRhOAtmLs+xCrIo0#ŎDgMWRaS *}Zm:$ !Nc☖Qb π*A f-8PHYu <`xi+ ks8b,Sqf5ZgU|DEO<4A PzlZs\oPw,k밳fM܃`CڏWa]2S(MbU]Cl'S"v L57VUCpk |C}c] _+9#Q:~4ͺiV̡S>_Hx"]ەkYGȣP\mG:xŌ.^M@M$\:2m-3lH%b߮mV7hҙZg4I m֪GL]l(cӽuXFy"r{G  3 M:I^5jpi{6~xWN}3z1%~Pg8N?7ήkW?W)'< ?$RHww+_).vH0gO =䜸R]E֌NK?|FvS}R}q q=H)E3x`'vT"X,FML'E˸ ::G =/9-ԡ?X:(n) _Q'?],_("oA˥cO|'P-J~'x\R j gȁdOþnp9_yse(8Mbz4+ΰLi-fbPxܟx}i.T> ٺ7?vblMNtq+l(6 _Xp 'y%.JtUQ'RdŤ8.38 RNn;`1ijɆx& ɢ@en>|2sI鶺ڠ|1vTW?i_褲OpvϢGrr.q_ȉE DJsh[NR6 9V Г`p\L!ֽeZ^2wDjN mTݢ cN *x(FcJ\6 IwTy,016N}irq E%, 2q呼x0qo/>+ &ak6/_IiV7H}gB;`OVf#3øq5ߪ/zl aKOL !R)>T{dXTeU)XYW^Tt3^&Q(aXy)}%Z $YsѰ 5=:qY¹J޹M i?*" ց&YQN 5αSٿPDlno5a4ĭ)C$.<,p>ۼu./28 xiRc'm?φ*IB$AY4#8fqͽ#|[Ner;jˑ2PzdS5QiFdz|Vd)bת 32k3,h-v1`k;yxX'D8~(H|,RB12G(ڙ6(ً4{Ś6 (ea ͨ%{>%N'>ָ`"׆J8\] ^g!B39$!~Hhu}\ivv-jrX4cg k:C[ck@uo9x˜=i֞LHq2H|T&Ɛ`Ǹ>y[6qk7Y_Z[Z7%l[W* c㶐dβ6vĐ#3=ur2Ys[W{$+"8k;ygoj b'Zu(eX V2mof`/B'*W;r,;V`wd0z>uP t-DKL³}d~N8s\6j 'yzYT:]t_,Ѿ%plgM4cc/66)gY> Ը?NP~4JxWU=)d` .LH 9oDh DX\ɭk5Iy(sIawyp\gHRr`.Fw-n E,p!-+ڒJ'3FBQIJ5 6hdK!SLrWҌv-mZk OZf[X`U·oV<f/-OSrf0Z=e[K1S[zWԙZvpJ__@zPM.yyjz43Ơܓc33YyOd}>9./tt˸p;<>Dvܡ1L!%(184ݾ; \^r2"0,R c+eh;kpy@GB[7/b)w}L hItVJ #8rycC|ˀ}b@OQ;tvܦ.e7@Bqg:yJqq'»" ״L:* 9Œ@(ܹS_Zho_S uBk0#VX.W.P+>& f7Rԇ2b׮1 3J$ѝs>;w`xɦsuUx:/ɪQO{u~zx@OM/GO>fJR'ykEeeCHnX褧t8%#~/ҵfKQ[B4,D=Wh9ߋ ^=fXxrWdzStN /)`n)M;:e0=mCy֑]w#cLWGP^#kVCɳ,`F?(ixu'#oE'2T 66Ў6?ql#j>$NQ<Ŗ/7sO(^RY, *_fҿYX)fqӝ|ۤ;/ *ïct J`}5J5)i5LЈ9+A lɓDOBR d!n|Pt&pcU@G *If?JU ˇw; Z"zuj)+&naJiJl13AGeg3$YVǤ0-iq( %'lyfдj>L]Lt5w'}ol5}GU@;pu`XiԐRTO:~=JH]$1 C_stz}JJ C߂F.dsw~C /? I$LJ' $ 3DAՀV9^!߅TE☇rmԤ!o:ՠ-6&-;wP 9q5N lmPM.=RfCX~~wh\.w{̀ ጏȴ{},Qz}t/匩vf`#4Z[FK#YdŔG{ 7Eo_QRuݒ_GT 3>3LJs=J6GZ$:xe^(@L#%P*KOyes~`k%ެ 0q"5;!pT=y_eݐct6OR&B'}t*BRg7H=3aȐvM%o]rqwuhKω"O`k(>q ׋7pJsI&nRUuq{1Hjq#w!3>`F ڄiPS*Г$|rF5HTVS%5:V%;6ji;OK2ȏ.ϤVy:~4WZS19[>G6uɒ8-To ?(ɥ',{aںBp l#Jjdѧ?2r0kj" Yr0cB4T@0[cUbDce8GRЕ`5(=4.]Fӿcł+ػˁgγTQx7BYoOopm$LrD(dفJTN>oɼTC3y@0y"eU4N()@5&TK]*]2k+O:a=;T́L\vGV|x8p^2YpG;Nݎ%Y P&<}a51|.'8uMJ}3%/SĴQ" JuΑŌ#-j4_6\WW eYg \l ]A&(VtPPw0;aazo4OU}a:&~wNFOg5KD*MNkӧY"hK$rqY܀n:(@fMDt` b$2o<ޛaf9G*;DN A{ox" * PpO[G֞wfh5GzJc7~]֦ 0+pNIx"9D(W*DIҔm"OjQ+JTIGk&+>EIfkLG¯rff+ ǣHb(M1ƣ+GB_ޢ=erƟJȪ9}x5͛+#ݫBFҙ @)x.m~N ѽ]RaE׺V2Nn*U";}Ssw!d-ް^Vị Kdj~X^$ǖG֡:[` NxDNhāgq K孏@@SؕsܗW'q[Vw⚲3Ms ݸT: YIfn8g77tP``dg@KYN;eku꒲־Pl4GڔE$|Ǐd5=˿q6Z TCV#jTץ(_#%u9|MaÜ!Ģ߮z dM?=R0vƤ}~ij|c@]`=o_wpkǀ)-v|B# ڹx5qfz@S}%nR{]u<5l c&V*Z0~E;L}T6AQŧlqǂϲW%jh]=YMdԏ9 XM(y쀥Һeq90S<Ǧb,զ[GgKG~0Ja&vCC_k[Phr#S&Ϙ0[ DĽUk%gf$W<~x5Id99:W/]W>T(^񐅬h`]OJRq>q~߮n3LIj*0Ͼv^@ ^JZh4!Incp oiEM!PHMbVR cEjۣ;# eJxaVf}ırq$0Du9բ̡}|]H2Y4x[ nM嶈 gBrm _]9}xull=bfHH*rX4QStnq:*;Ʃxj |W*|p56A^#$S(% ѤL ܴ'KFmtB(􄱷1 X:#%,G_r{ͫ=@0fߍ8\+N+U u,Gx+h ՎOGL{pES.+3Uc~;$Ros`g._pȦv{.Lhv Ԧ wzUs(*.}{[HcaLBNufbCuմS[tߖuOm7Rψ e=p'r "j à<̄PdԓG%lTX! &D_(/L,$*WN׀ {5GV'=%+rk.ze`,7:x)g%\ SޟBȂ(LNSX"e\d'&{Q%~^]6z+G Яp1Ѡ!*W((Rb}BQN">`&C8Ģ& Hhl%t>[`;2ɂ,Bj)N7VnIw+(\5= ^Hl_R8Cώ>Vn)(v_ d} &BG/^ԫ6{gݰZ:=TpMupDžGߗh*Rhn,@~9AdbkMi7'RZ X0IcFLHOuX9t5R 1 bUxrdĩn7qSo+u@dmr"cqxk3#8cl{n.#ȓk]'Xuݧf, G"۲n({!6̓Br>*]ɦMAec!yYnN*̒Ja|3p5{-k٧\ҞbT806^{NFQ;I}hopzd7$Q%N$*U=A(ة*PTxKiG2{lD/tR3|rlWiΓpN2U[}m-R7h▿K_~]w1vs"Lf(#R܌Pe@[Nĸԣֵ;L6n_*qdw_EogD@ǚRWxXn:]L*v]ϚfZVK̚ɍ5~|E#aաt,J 'Nk[<]dS4 1uCg~|8B62(qai@:FJS2%G}vt5e YY +8+]?+?uWD<"E !cqir&Tm̷tȧ*:[|pzozb?'k9B͎Hr͜"DH[}bЪm)."Վv=;0Zs~h; |}qAaY x{t{1HA2`'sqm2K?n&5St/Òly=0.1$1?:é Nf$Z0Y:Xb;ir@ͷ\z$:&g\ q0_2GۂֺkT"@rJSl_k7h>$o c%)oD9xۀe'x+bCּLy)ǃÿu;,>q> ,AG+`px*\ s[}%L;r"KȮbxGx/>7EY0D wWwjHu ?e5Ia]UqE.59>9֊](kL~޾D-<`Ȱi}w-{Aq5j*J "Q/x-%/R]5ή`p<@bL^F l:HRd87z}7KkvpӼ1A.[{6Q{?,fz ωf5zy(K%$% !sƆ* VOA`[ز[B! [N0iPpϹ(g5͵;&ѵx0d*y_ E$C$"YXP w`yTHNEsf5Xna4(Ť< 1Nm!%H~qm@6DJ{@p:n̷*Ln9U9~i S1L- F9 F:w{5qR֋'4i^mRe>UƮlrlq@H̢{w˗>,AϹC??0z&րO77Ȟ|׋Aεvᶊn_@[Hh{qqZ˻36[tmCDg1zk w JL"Š5H㢐&;?乶Q Y $֛M5yU:҉,  J 8&87LslT&!vG=PRpu[0kMkgk;Y~ z ٸ>AKM J@_m{0v6=l@yjN$z;%Tac}MFrmKŧaogQ> sJ_ҖRF`㯀A3EUSD_nv䓂< b3vTJQJ-uԻ^bw;8z`-XU%O#]{ڢ;\z{*3:\-K!% YSz)Q#MM$"OFmLid8EГ&/JhBkH|k4q4 o]]n%?s4c-i4N:!"[NnN% ]prIf;0nd"Oj`QѮּ%*eX[3YhIVt͊'?Xң"FHo_xR3UZIo Ejƺ H'5IU[2mS M0L -ǜ+kMix2/Oh1oO%mӖ&֛("w?()6к a7↺ty<5Mdyc=æqd6U1Bg73n;q=Re6[\BMLw"N$ =TozumfhFpT fa"%IV9GThצqs@ϩ:@eQj-u4i'L(vgc qZiٿ,Ŋ!t`Q"XfNLAz Hh䚙#b08!pEIіmǟ8)KcGn1! smڕ }˯ =lW ˈ6G Xqf -$wVط1YTO,sE S*MdG E [{Ln6l[ޫ0Sm㸩uO2Ԉ!{tox`u(5n1%ԾƬoOZv[Z0$>Vx=,1uSǴBnXƿb,Pngv`6ʑ5WA@і+KFL-Uɶ]/7m+b(l=(ϥ  XCco 4v!՟ *P:Kfy xˣz7e?'Cbqv&sjYo}[fx)Ȉ(I >;=^T([qx. X6$-vҋt'7V-)IVJֵ^)J cP4n8g yz J݇2)\ȶ0)(w m ;E;}Qq@TGEQv-S<dP'dn(gd˲emi2hD/ 9*Gh"id4&'S2$T+#Wiռ1&+ߚ'J>d= -Q>m۶m>m۶m۶mvNO:=x;كJvRd}k9y]sgt_Ni?]A1CS<ItXWHwUy[r§f,&qi FZqa18;xZxep,P8ld J٢ ڈj! $d$DM+lB8$D7;uI(:^wxx:FۏK@T$}C'm\aIAc8XbtC OMC?烈H^z}! 9 (+|6agnZ?[>V@X5In=ڡAtJHCnfFgI _%"2cpZsQ#/ \v8}qA eJ07O,Vukn7~Y9*($PFq9{ )ū6F/zRT&zniWIGr]Q1ޅ´%Xa"~,H E$1=-!  u3׿^?e/X= 4Eo .eaE?%Ә9B[+$B%{3mгښ~QnO1e*갴we *Ô ZXON8싯oVDm{xNժkv>qc<_s- |ŵ0CT!f18KnֈvkC]T=!qtޝ~I,~rxx `<P\c5}U\s;c ;zz׸GV8oT26 iE 4SJ5!F 6IOn#PXݱxž e NuKsb! >L|{k.6aTh)CArcrǃt%pNr9u[Xl3Ыp!q DŽ*m̧ɞ)|\HQNݤZ*DFL&ZwAT8>zoÆGB'6,fzSVA^V80[E׸yu39YA%v1Hc)gJ' ]qMĚ&YK4)k'um6s v…XEs[è:m8VL[HGɛBHoiɎ?V4&1mx$T(v:Ap(/sv*s5\97ia,ilk)a6;h0fę&ԄQ^@Xn+VF/^#՞Ƭl }З~zR? 8v )橓'VFrgFI} `8C/ei lť1V8ihʪ 橹 u2ϔ'4,ØJ. ݟ9vQ]yQӡޯTG.SG:D;Mdjh{/Fϸ'aEeL-S?'՚i3}E8mvbGg -Є3GN{@|ťP&%U6L9ݓ7c0>-\IzmQb=1-S# 740פ53jHF*BpX];@2o RGyG\$'zc?W|ff*qK09@xu`Z:W>pbFW>9BHrŊҭ>:s@A\5b'\kSD@ճRk'F!v#b^h+7_mAwFP Ҟn* R2n2䄝/p (>_[y(JW 6zssP`aUh!8h=wH4$1n{NjoZt~G3j'dF, i[?v8ij1aO{bMainQb"Ҍ`r5SS.Mm}zMtH@e8t:L4" 8[kM[BA̼DS>^1Nn6A@BF:DMl\f8 ~F#VbT`/-"]c,YުA3(Io,KjbؖHEz]KfA`]JĴWt hfR)̽Zq 4JGFѥCT8ڀp  b uF|gmZp ?Ae:yU}[qɲf˫r6;qrnf}ąA*p|';En[%JNqx n&z[[Dc'*Z;\qwocgNS'IP ;dclxg@krb~Siz-̇pܟ]j,htWY{-s[}p6>.:hDbA~b \;?zo{^k G8ޔ8v Oppsp}E58+wƕ-bDծ>$1t^_ZH-m)**s4uלf7e)^+L2C w)AetNɠ8YCݗY&?X9IG9ШbJ@hrGB` ق'3Cd/ vT2&6.~g ¶ROyP U)x\GCɥE5Wr%t,T52PPotuo'e`hh,=;FD sӾ3>KٱzՕoG2nT x*u'Kqhm.No?QWivn ?PL+3hC"HÅ4s&YB+!aFjUj1:z7Du4*: HψrG\o,IIypm*t;R֔ Fبub/8HԲsYa Fh {Uo:n7pz$Ȃ5IF~0m` .7ەj%OlzdEp2d@sUWL> _s_#UuEK$$}lr!OBr! [wnwTsYoqO43͑&`"$8#ARt7>N묗Kǥiِr#}8iˎǒ[kUkWCD O 2?z<z8 1oN@h*}$n_зxI/:*H 6S0G!"Pg8 Z48߻P?.r_o~/3!Z PˇiIOKUtw#]<~zIy_֍g,e@fA]I]pa;s_ju3kzsBA ԡCکcRdJ&[;/H 2yD885sDf v}Z!ifiR/.9g&T%-{*;|~~ˌX#~mzH1N>J/PQ㸱/s^"+Fkbr *sp(ZFց.X5PE񘤄cz#167AOjq2H66=%o֎LKuxx!^Y4HB|AsZ峀s7:2TـPMjg;9Ԋ"p[U~V$J@wF!Іv߉)VC)Tܐ0 XKGN.,dOᅡE`cUjX Ok&٣\BIo\#〦)L,Kk-]+X5mـע3ҭK,` T"Vtaf%ܽD-T5qi`zPRfĮG#:Zd;i: )6wc߫uϣ'?ys YXf[4,{OrM% ilI[!JfOu0|>*jh| Lg4K>\oێYupXkˌlC1>Yܚw/?6_]dEB.%M<0i~Q =B2L396 ut3cPQ/6v6|vF홢&Jf 瀣c6ccIcu(+drl]`Z'Oh ~I#E|7h~ş k>ky뺵w{}o Je~r[uIq,'^i6MI{:o8"S.OܚdĚ#Cvy0V L (Vw}Y½Fۄ-N*Zv)%ՖȾU44+o!P`\i%*UKX8ʊEˁWF<%Ĩ(SoJMh[[+#yjc +f;ԁ~3Uw-ue9Է,XrpᶱaC:9c+}Dl-`⮾=J)06H s|oS =л986 &m7BQMG#&-:F-btLV9l`Pei#"35C/Ԓ5]30 ~)v ]I|eCxz<lK aJ[{VPO} >jMbx,. pss3]g6=nїj>{V* .+HVws"MTJ +ggEFT& & YQ&B+*\a-:3 [`.DF-բ*#ܵO?u\xʒHe~ \{SH%Lbaev`A!A7`u[zbDƴ>tm6K ,_]:&޲ILlR"G`kJZ\8x4{ՙiT<9!p6UW4֓+oJJRE] nĩ/>s*s5?8J?:")JJ<)YJÔaI^+=;7McsvNwAv^Þ f)6W](4~u[6Z(p:T@OsPW#VHL򛅓iț17׭UM,moB|Ȉ: F{cFFZe-z )&(_V_,SCkRYKe/_*TߩaIP}xcZ4b8P~RʵݤM S0,̸W# *tħM z˘L S:H>ҧIBWʐ'Tsq&*NGۑC z1L98>f5ƩK@T"(\SEy%K spc T !A%o_Vߛ\S c<|ph}&(됸T+oP~BVT2_RmMW LNZCw#÷| >Sk٧){!J@,M AB UWUkٖk8-[oB1f̋GYU}6\[>H55ș@" Z)kQyE@D#V B/]S'b3[ueBMVQCيYZoSL`T{YwV:M[y O6!#C; _YeNvĬJ-e b \1ow$ #ar\WeC"dz È$rע4Ka|(bn,A Iz(1m6raMYM64a7`ѣ[hm b ќXxfCk63+礓q`2 }QV0X7e M_ŹbIJK5E7ƄN²6Im3JUb=ɲȰ*5A쀜5O*XM3&r(fF ̖0&?~.fȥ̻MeG݁ArHԣd˨vjmɃ X^5=Am>7dTa򋈶!0PFa-qI `ݬ{!>RBPTGE! @#d= 0oCAo.gii3Cz{-7P j_>ܟ@իx 鴪bHlvhaQuMʋRZp;pR8ʰ*a O3n)t*jGt:|-g\B .E%\eѯ t&.S.2]''fwl1U<E^d| 3йR&d_1)}zX3S+pW,H#.BBO놟_lSP|yY\M2ݰ7׻:C4s-# a8wω 4nр=Ȯ'֖I=@㜨ۻ ([6;STN$&=`uM- km83}MFn+!, K۝{Y7gg1=NnV¾w&jj!H*M&, s7R|B/8X0Dl168 2z ^ΖsDiQ^lD-2ԄdOC62إ ++Ti ihss㦋`ݎK&Ƶ0CeHaΩ غ--C/Op WOvT{  lXi|kCLEP>B`'FHz_6wwNW{#2 "Wj;CEj[K/W(`; Pmr$s)wSـ~_Bd@<5iEJZKYz%SCMG ثXH^^K݁UB6*MD {}ldo)Dq?_yP4xOw5A`rldDrT07qSb"/`FW=%2yP]ODE/paZrq]w60~CijXџ)ssL7ىI~=W?U" ǘDUm0ZR&*GR3Ň VDr q8i/qm-ȼM_ll:Ϊv{W?+f??>_=$ s,xN׀ v8;,AGB^[~w-.ik_bNsH|& 3Ia#!񇞻Y%wS_5bTqW֘,! 7:7>Vv>} yd4"!7rxB,PB9i9BԏPIhefk7x5W}O7?D~FeSb%ra=40a_N}xe$v$b1Lŕ&^ɜ$ܢ~ُIE {[- g/-i4 Gt1[j{nn#~x*(0# Q5 Fbp7#ܶ}B [ji{*]wGTuQ4,{}g(% &Z;_h艙[ '1 "ǧq^ǘY[ =/gKue&H`Bn%PKU?'Cl9գuNb}"̢!sNt~㸏̏:DBZ S/M!D={n0r/*!R՞6MRoՎD:kHI]bίDwYORNϩ ,cZIӣśݒM5~ϊPa(Eo_9dPhSa쎧C2P{ 5f]J4iJzzCS.`߰5WeaJd0,c+y&LqGD:x3%({.+kfUٴc#z(Tڽެ_fh.ɘ[%Ƨ. kCNX %˟ezSْޜ煸uX;S5@)+Ѫ(UZQ|w[GQʈN( Qoe0@h^koᦥ JSHVtabΓ>ڟ9. xƼ741+uhyǚ1)̬lcC|]UDxم+TKŭs\[l'p`KlsT-I,fzʖ[bnrZ@7ݷI[gcuħoY2"= -FYP i(=fHF> XQ0nwnB8b]9Y]n) ^@uiUoчi7Nb3-X^f_",Q9$deOT}z yV/R?2jDX. !en:_1Uu8Uێn(}Ʋ榧4^T|b,`[yaDGk#q;~SDt3#%u&}]܃ GQ0@|+nBkjhc'%k4,3zMI`lenGAD:D)Uicc U'9azp|Z#[ȏOlܟIjxR<|lׁE'HRzA(Q Z_=_K睭 nٶ4y2#LvM+YTEGX+JS'Vk봬|&7QKx[M$7f6Kn_~KzّIXA&ܺF9ˎ$|?w5 %>-]נ"?C A)vu*H#&kfebf_|=k Ajz&GYPru0%[M5: P"MhT }X^Uɱ=ao d0I}=ګ\eYY*WWʨ;gԨJ恡~I#0Y_ _js5خáC"># Q7Esh=RUoV PFi|\DWIG EFiΑr^jn>&&2bf,c >9ZnFC.-VUoQêz} U"(Z.EQ :DUԼfFcG46I)4ߎ| b`3g\(!RIoyZ"SuϚB EyHhT/urFܥ9~p @/qTf nN/fOv]N޳ 7tVp ,gDK{3oz:ÅHvfMc>"U1`ByL<%Ĺ*'yvi[}>µ?/} z6!Gz^?['&ˆ0 =U0:0 Og,@BK!w >+~ZHl\Ed8Z@PH@( goZ X0zI(2p(L0CO'QDAGVEN,ć553=p!o2P=&1_3Aٛ @I ;WSG\ 5a @}{.&QY:ҴN)CP2Z*=Q` wzqf_Ǫn?>4o*`3rf"L-c`*yz/%/aq_$@t4܀WBv> ӎeq H,ZzD3$m{ˋLɝ {l'ҙ* F ş1lXE#YαN(ww-M^.o\#zeW(^9Y(09uwpv7BWi3jMG2n.r 𬜇YQϻN:)DqB2YC(/ں.@@VvyL_+ /8T'D0,&Z<ygh_P7VC{8콗L Vɴ1 +E`Va|?yIvl48G)g4. ҼDEKѼg}h> mk)[ ¶ %Mi?J%o}2 p0[+.2g:xvAi A&%! o PLNl۶mvNlNNl۶m۶}aLU?NLuuϘ +a,^SjUZ\\ء!%lf20JW{^O3*]ޞ1Tm_k c5'(ۨ{ ~eELлt4w<чՕLtqxya֖l1'=>Ni؋?.GȼOOѷ ̥VMX_ EfcJ?\Ff7d1`)Y1?Ӕh 2l t 1 i+@<OVUJ< qY&*vT~5yd&oC͉57Ҩ bSVt"O%a)@Ɛ]lzOt8rixQ߃7 =W@APn7k\-ܧAm$"Qc˭#^/KVˋ0X.:XlvRdea|>th]a>hH6gZ=5A!Ba@Te w?o.RMy-`h|3It \Vz9x#LۣsHq5M̛HW{y wRZ'ߜf6.\C\\?kk\X! <=C+]h`@DFJJh(@`V?C0"¡_BG% EMQ _:pxmos'Q_Y"՟F2 ";ɷV($N*[mL?#͘Xfs fl|O%|*H<V:}uѐY}1alvB TmGzc/.0 .§{xa'C`,h %&;t H jå_>?Q>?j!ͪήoy9Bz-] 8,=*!E-^Z_frX;Jm%郎:(L'.ZԨCY&gN'iffBf]2œf%$@X^Cɻx\BDoS5?+~?\=\ݡm{C}g=B3;z)/Rep] gBɽE_L1|{9ٜ-Dqr]Imۦ'*JS3KN6YN'ZIQdwbɋhaMGkbi刭pn<a鴮7^Lb-\ AƒMҶLq!ViHfL..d8 csR/ϹƞU*#HR'qn1&R0bu+SD ۶=F:oFaAm0ĺ k.GČ81&>9ly&gpQ`RpZwGD,OA3,X AUs[~ZH`FQD_++,f^w_\Y; y# d#:[p 8,*vhz%M "U 8)GdzI}b'dX+yMkIr:Bap@k_Q#bx)1WvmY_FE (7֑̎p4[}56)=tmh@.HAQ1M'KO%w?VpS]5t?lpбs@I>ބ/JP)u<(C[].F;4R2ބy9f:Eĕ©q,χ$i34H1Fhd,m51yś)?\?ǨJ`ehoaQufuM)`PH)Ж("Ŀ~y;z<3_"8%h3W W +p!j#*M(ſ^}GW>|ƪ R0hz^(BלpF;@eTg4dâذe dԈBxq"&`BW{06]}[$~/:|Hb *[:d!pD f^p GH)#wp tBI0܆Ábev* 48ZѤwNapt}D4UVg BecENglpWeZïb o l(K }I蘿ZF"_QjF4Gyt8G:З0 J۸Њלr+(5>TK'o,0&Rub zC@L&Fخh+ لd9E u+` [$\UkꝦїed>_ۯG=`#`~!l!ĸ`gV6 i:XxJkFvԙ H>Oހ) ]i*;kVW9\X#>8~l#;Itdi~wDԩFM xoH LSMLʋzV`f 0L7~6 S,yuxC56UHOp?OF nŊ^fu %g:{{PYvaEygUh0eUH~_<&{sS̸_ׇçmcU2 긽BMMVӑD50QWF?ȅ j@9,B>cʱBo +;{:/](yg^vr2yrQ &p;X= 3B΅gXOX$J"x_l(#7mg=yݧsw5.o~l߫g}BwgJTvhQ(h哇C7 ec*mhG|9gSp*~2RRLR #Bn=Vx)Zzmø'wͼnw~`& '/`fE7SkԇV|x O5T3LM9.d/ČƁz +kW~4 KMKRNY~D"x|G0v8E"x%&iqI'(wU8wG<$wQQ69%x7=Dg?ޜA9Qb{?4~{^B nDBb-Ж(Zڋ/tv<lOr40sHjSXiz Tu'SmչLΟ} |ȝ3 O/1*zw76I 8)9TMsskJ1: <2'xHS/A i5Q1K1P[rK A+P+082<_{f\kV#?CkgtT|mbյD?6YW6ۛ4ld!Ӭ3hd٫amjӥ gp1Dk%-9+Œ{2>Z= W+)gt 2Gbji9n E3y3 ?f4 $ c'+)XӅ;T_yBn#Gp]C4W+|o|!"-J,S9}01ROoUΓ6ZʯHsk]jFm[#!e-ϴZ v,qX~2r|t`-β&@|oݽ6|:1@ދ,G`1.AL:$f 2BNpcQRwX/0⻆ɗOgm4JKq1jɩ'+%>/EGB(?8ySch^K51 oJZ^_]d;g!gX(\(eZg/u%dXq!NFmpbmb0j{ZJk֠Wv ZبVuB)a[l {KU)/{EkK"=d5+Xc0}CBIp$ڃ> f9K ʾMCWk@M2w-7U&ͅʸB~Pi^N^d֞blCTKH5ޖ1<Mn.[\t8x,Myp:iYwکZ5HgiGx\#T"VҫC-ZSTYncU=/8ѡDu])έ\"ri>"1Ť8( cݨ^s!Dowqa3hɏsd^`j~hFf/A./ngI/l(N8k[/=kE$(mBfNLz=pfw;౫SP18 Zc/tA7׈ڱycI_WRW4giE zAF\C#WÙo5kP ri *LpJ7>8q*)1"3c5ks.s@=D `=bI)҆]Ll:A%rZtE:#c>VY׃j +@\#uoPa if4zm1!p0WIVh5nV]߿BCyT)]!d 2^RV +O⁳4|<$8K~6~>ogLK&Ů%Gxљ)iOhxwMǐB4|]bn}Ym$NbI+^x\ qqT)rN>VcXCa0g+`Sgӫ' }Ku(1g^X&8aaw+~yA Q]lSMۂbt_f ~G"ZgT݃3uGv{BHrAϺ 8ȡ*ɴ1A;nl#GFJp 6%(SXT`ը{]rRPx\̨BK^g;3aC6Ƞy6Ho>>tlنH6v;x3{v4UHk뢸)s~[_s[TG! 8j5OĶ/iV5N*C(vLQ`c!d\)`Eg2}̯X!m,\DΡwƼig ^\m up_<:<^}W/{sG8A!A("{ Z'u/,iU0GIj;𛖬,sJ h ղ\ǎ[6u>-=0}LՂ9pFIR(,s6*.,,5OkUp6v+)J{%i1&OD$Ս'aDՠ,MzCP=2bf0p_XV8,"($[  ~a~[6q"'nmdf('Fto pebrKJ&(/=<@8!/gvɹa+)֞>︋Y: y8l{tbU\{EgOm,UioprݙT1crMdY+-T AItK'_7&Gz9'O7}9bV[mTQ-p=0|U*CS-z\uM|V Oek`y lg͌ IY͍TiP.󑝝fXeznéuq8/qw[-ӲOƒ`&_g^ت,UsVUFOU.S";'nc!Vy[=~΂jwLi*z6v$y8Ћn}H?fZ 5g#ɕ1@HM{ojBS.?wG;xP3]t;V_lӈjvWݫ6FQ֑^PSRJa9*&#Z)!P]*lT  #-$)s3hbDއݴv'{+Ti ~Fݐ%FAjܟ"HjJ&v |Yh':X.r͚1uU2D'<_0#Xd+?DA{VpҾe Bd}U8I^*8360W;;pwa:);ȃ?lvƕ`|3i`EAb#j *lfA-I!#x 7̧AlYp뙴=ouCdBG3Br>"-,8rלmL7jGn5iL%,,zL.o+ \1.jŢq$펒VsG4o\<^^-Ւf.B B~x?וQt(i0D_P_Х$61.18JIܨٚ€Qz6M?m#w ;g[{xi\{е)i)򭥦/"ghCvm `6r<gFl>  ؜KhnR4Ջ5~Ŏ$?]ƯiI+ {!;v삱e!VD4pk e*Ǟv IiZ>aCa;e,M(DG\ZaM߄D:vO݇6i#dƜN\wV_e~}2s=L>dHbTR(PaazA- +N_J.#>Z`m]ּ;K_fOlsyD! cwA0duƭ0F>'u7Z; -*NeGf$RL96`~d2y†̧|TVED*SSb񬢝wǭ~AR RmO^a6}2FQ9uQ~SS<97Ձs߷#Iμ&@'?<%m؇Ოwyat3QFw-mA%^TCbDm m|Wk|Mb!{@>2ji!)A$,:UEB Soƴ"֒mZa*1虑vmCLn [Bqd/3477uo5_%XT(URҬ.nAQv3ONۅdžf Žž!#g_W3gߺݵN5q 6or"L \?Yn B@I K9ACN0̀ h3DyP[Cz{@BR퍛 ߈"_#3Wa#).ɩeE %Xpߏ)mw[Q`YV1dg !C@-Cp0> I'qC|Uc"a=peC䩩M!NOO@Hq#<Η 'K3J` /@q=B%M[$I0w@^wYxADgB?/%$&lݒ%seݛBiq5dnncnbg"A m5 $hաLD(V)G^O[s)jF^]-<#9>F;A;FDP*/L!ݨtՋA 07DD\<@HexpOڤorN BJG>1>^ODc18Efbs pVGc#+Wgܺe,'M QE鑆:H>]$ʮl,iX2V?e@R}ݭ[13GVWPɢD/%cݭFE/mY 3ꪴBOPј1,xx nϯf~#la/Yn4$IkM&,G:R9NTMyIw3ʺ _s?6}9~&}Ma򠮃ټnlʓVn"wj,e7g %$'I1h$^)gyC!-4 AH#񬌭S}Y]?S23`pHl+ߣi>ͬM;u9ӹm¾ sZ?y>F?&#ߨϧ5?PG}ZMSo1ٸPɃkH7%h%:^m$-,;L+Nju@{;g݊cAh:i4F(]9(4+JbN:'a/N%GA}B4G;(ro~wp<.3xyΖ{!\̈ ľĜ- X6uac:<[Vv d]. Qߚu+й1bX4bلgy +<"sp x=ʵ؆n^:*7>YLrƗ  y2\pwנΊw<^pD1XSGߔE6 @)Ig!ۋ;X4&m9,-*4)z EwT\\\ěmuysTj1aY*h|{1OWڲ9T~WS2SݓnUy偪 +#Aݹa5+P 9tN$/8U8]?úojUM;2>c;4Apt1G{1[MBjs!KrY&(3.aQHe;^Dl#EAYWn4)s\cB_Wea\yhqջ39oEr+|r.p9g3`j 3koKvď<*vF Er^o|\!_an}imY|ēM`Wނ;RMYE%V@8Sygv_ww`ћpE{/刷uyKJ/"q4 4柇!ںR*LjKJ"0_V8 y}{4̝0k-]Ś8Ϫ+P̳HSYJx'#םǐ}N+$1{ᆈmn>M |޽kx ZQq{ckޘi. Iwt)qXyƲXͽ poFU9{xfws#i~J:d|Ngzw X6GqPVfRhs -Ķq ɑZʬ.za;sԢYH ڡE]U^hS WG:7BM GϒmDn>GV4)?5҃ Q7ja<8մ*}9I,Dd  YFQoOKirn4tmcֻKjj9YW.&+װg_k-QaV,=ڣZ&=W 1S+ %4ݚ˸|w(47]5H mp;k н|9`˫@BoZdoi%ʫ4JmPPi2@ʾejbEmP @.!@ͱY5ԩBo^1^=9!ὲ{9Z/Z~D*rrۍbf 4y]9tnjz\ZR6]wЉU[-}$ @\ Rv5xoU(]g!i+ȶI^ut 'Bvt"@V'Z>J TaQNa%@C- !` U~?̈D㉯Pr:' bCO+ k ͓v@3 Iaȱx|S}z!U|*gruxJ4BOF;>;r&իjTǹg}8ӊJ%Է+co 3%yM_4=Jd%$\.2{{BXzpv>L-(ƃXWfN}}'GP9:!f3uE_CXB*%6/yZ8TOeķiL:ctBZìlQ:ʺEU*ϧ~jeF :gR ">m OH־B Eѩg7֟s~UCfAܹ^vcʛ0p>Sov.;9 &?FrއM "0!kЩyaC<#P+Qʽ16q"ʎ38@wgw<*ӬzHk(z3%w^&D k06#H2oh+;Yv2# Hx!c-㝎GXeb㥎fVo6In(cx2|̘֭թWYC.[oFx(\p@;W%dLO; 7v^EGchתL*M_1? Pucnc^?UɳB\^\v BҲ=Paj8mF­Uxg')vABPkÊ=(ۑ#7)Kw^>^~̋NɦXj6jECwD+vq0 u-\+F?reLUW-&3*#<Ou jsLy)҇X@ގ4h!2-t]}p% [W!VspRݡQC9Tw \$w k`X[^π¤ 3k=  մ tVGyKI7HjA= pɐ0 ,c~rp!v#Yc1GWoV6[0}?d=V_̯@j&rO3)b‘MaKk4yzJ0#X!kZOl[ w$lqpK3ʨxz3j>[i`̵T/ΡKIemVm۶moٶm۶=,gsg&@O >Tdè>_O= '5'w}H(kyO-NtK\ƄK ư)DvAJH\,iհ96<}1lX~K4)bVǵtnQIT1$:P3[ET)(rMqtI;Fc<}S{_A4&̑ 1gGjJFIln߉0Ƞ i^en/ ,o[%&\ߏB1ػfғmbȫ) |C%> s#W$>&l -U_`{ϱ5ekLx%S y=1m"Ccr|=qY::pp(T%TqηXG yx 6\7̔B:]RS}Q35&Y^ډ߿S.%VOR{{*$^ScҰnqQeiD,=^Ed6~t -bC?&4Pһq"q@)ctRXiQBT#ˤ?a\TP'"T,wI7ݾd/+ ΢ZIۀM"=&[\(4CE9Ș+.(f G\ O|\1f|+-"+6pe5γY0);h*iWп."1= dvD;׌q>2091뭱ԒupCkRFmT!)HTW2g+h7D#"p@e|͖b->qk̾bϒܔ%5,Rɕ:CB}H8/ cTTIe6%#u2gA4~DuCNml|#>?'ojp:X8 .F_dۯN/$#қk$ҥ 7 Lb)Vy8T?|mE ISKjvXzTY4D/kؿۀNg6=͝K5Pް^e*~J< d5c;yZQ+G撻 .W+ lzOs*1 `PPjagp5Z^`RKi.7Ob/(1u,Q[F't$^3?i}W1{_](\ď:Y9Tw܅j,ci,_p_bN^ȯ@014q}2+KQ a=tl~$] "ċ+~N1[G(!@*t JK7&7WVxF>3bD0}\S(tl{`ʲy1519">H̲"T !+ާe!k| q!i ,Bᴇ;_»S,g2m7Ii714[NkQ"a>j'vny8t0.P 3r‰g/ܟ m66H"i:$;Gq:T $&h.Z1cxtwIܯM?_gٍ!bȭDx(D_Ք;GV{"WEXU_Dl@s_'mN=?:p2 2JkW}tڒt =J!_Kopt%>K-JBJJ6 ˵g0_=,gЦ,RNz*]&ㅅQ8C~:i`3DrĂ m*)s,x@Yx8E؎W r]xE'RR5~i~%kwr ׆c[zX@9(GZZCĹ_H+-7JrI ]XFoY*gwra6RmD(ZT 7WLs{hTwp˰B^^ֱ>so\~OO&Oݎ'91GiV{P%oM#v i fMRȩiUsi<{s/gM- lq9œg~&R9Om*AT!Bw̲Bٔa2 !p-SR[ ƣ\N7FR  ٖ^E\/B*l5+]?<}Yȕ ݪym[?:pbF0;Rjt6I52իKc@$AfӖ-$kRyq9mG} 577ӳ?ґߺI};@'0gOjfKD~s}.~&I+\87^O W=|#y TO[Ax>[JFFn씗D7ZjbzB9M+vQZd^b8!U*pnnf Sk4L nÿ$*pjgssv68C`T{<{_E_0 ,v߈V{yV_tic6c]3w%,wvzҬ I8xkD$㣩Xmj%ɓ^<.'/w=Wk:>L]M-fb7x'}'jF mTNKu⣥ˊe":SOc9Dw^tEM\#vmY3/L`>}]mbXS; 4Z1aэߜMzX #/5Rg¯ibn ЊCtB]-[W>:R]ui0+=_&P Eg){ FB{<`-CJtKA0IypI-b@C(<jX1nr5SgH&\2xנ#pZh02?˜P2!y'!zAH{2a9L[)")iI f`0[~u~l@fZfbEhB|8 Zqia<"5T\Џ/ ^vZ(uϐ2E6s?˰bQǗ44iUd)F,6Zo K[ 6MkآgLɃ.񳬟Otu9ýՊ^gkmvP0{Yț3fV]cx,e2ӏ(^vH!s6ux#jRHACmwvdTԤP9bb! 1k|5r\/,WڈAzn3[&-?,6 pobM>>:N|/JR`8GN8lX{AW>=QaӿyJj~}k"9m3tU=S??q?=uucodsfl!H=CrXBZ7lo ˚9:u}PQꞟqdi~=ѬLK%v5>AN~ $=պ~#S>8=#LY>إXֹ|. Ig8zГvK9]{Av\Cژfk jQH:- oI^W9 h]~|or(~LycXߎW,E%J'Lgq2:n͚((uѤ;6ڟe^:X\X14Ա8ZR:qM`X0'&#z~:QBQYqwwAT_ըI̚ou?,~|~+x}>^axE06CbFP(&)A_t#5V0-sCFG5ĖL'A V{&wfڢgφZ[ٶɟY[!8z, = (ҴI ȥYdaohPpj'׬ ; 2=CtI)o}%GK` !#~-?kTqPOgR'CIXf5PDqɉzRVQ&<;k5O!D_,ѿ29>f,A0IFDoV1 Y9MNeCF!-=M%&Ucİ BڂYB© I0?rWZK oeIFG+kqԗđ[bpId?/DWw>M&'*RtL}S40R=r˺A*ڼr, ĨcUgvbQI3tYBQҹq4BQRբ1z?C9v%{$ǁ:FN UXuxCF߫ڴwР f2X|+?a <=7\ ]u_iʼ]=S*HuY+ jEcr&G澻`%<@Wu60ĶsvC6ޏ_ӝ8M^q&-$- *T þ`:m{5o\TB臻m8PPC0nUς=ɀ` t<ߺ;<#$D I`1 om}Jv [R0 8rmZ4ٖXF,M* fAbcÂx=CF&RʑxPRQ"=}ʶ=R]0k>c6*e`0_?ZلrB5r6#xK.h)^}D@r:`vt lsIR.@*jIۭJA 'Ov=* rY?RMdK9p]!py!,\ލP s2#f&{O]w^"6/S:k姗U7{y7s'ذ$ lsv7I}q,#T m2i+;wGs ʷbCġ n߸$Rk/rvgX#vp-r}01L^`AGwKDRXN ݱ0G87> (] #дZ4 غ;`7,S2!zM^G0͋}V3zv査E- !&V';x`^AFU{NoVo &L"&Y]!Å}MwEC6?}{&TxuWarwSa+SV=`` K K3;nI/4>۸&nq fJocW!by'v/RuGgv`eݻwOqp9*Q~AZiW7lnj!KFW7LTcDZ6f۹u{j]X{s*;LN3XV ky zu-)qnCU5K} ׆_ʸ\+BuW +}UthYj YNPlk+(\7j/R=ATIT:æ*lj0e U+k.u*iXfU o4WT 2\ꍌGb2#x}1&mxWZIVu- ıĜcoǜs?zg>bg ={{m451$O)= \T5z[R~"?~hޑ wէOBu bhoE1AQʿW.)0$zr;95 j:X,t>^/_=49gAo1l=Af:zqx=3,k`WrX!<1%'oF jE}}ݟ>NWF{* u;7/Ӓy9U72[DuDX~?&<4eghmgkgac`fZj,YV~j$Iq(vl4m}(hiuLk%H9edtdh2cQ%節[NJJk#7*qΟ>p}(gtbXlvQB !Bu$,0"4X"t$PCGQ:KU##\Zg&.Jâ2*1ROO"H"k{,"吽R;50~{D%|8t rBS1GQ-P>*SV8cþ*sﱡn+';;(BP>a(9=Q`F;9=0v\NC c-'/A9͵p@橧?aCAEgYqP 2byyfCTUOChu1d0_WF-7N[P\Rg ViW}P厂/˴4{6;<6<25슽g0n#&`JOIm%켜ab)9 Xe@N= >+v„ozӕppW ( \%|628>2112>?xY}{pqU& )=2=<@KH>7T]p4#C#*z0yRnb`lb`fffdn>>cM(:hVz+.]Po{/ !1?&?yTV91d%@v1R6@J.WC@kM|̍R]V_]YV03rtXu-UJ)NK^=>0H}5\Nw\o9Z?G-:t# FO32UѺD-$DwPF]sǠ~Z7D =|T9`5 L'eJpZ2@ knm9'XUU5;[nnh'й֕DUKЖV~m9ԋML f>+X&Z0c'э5Ty_tLZ͡Eh;8mOe3@%<^7USUqYBf4wMnBu-TgrwS??O sOąaZ`7ꬱb56K JЅw(I>Do9}[K#5{w'5۾rRZ.Km8>g u!|'wob'%v:3oosCF谪ۊI9mГG턝y@7e G=% *7Kw'afN[VCkUٸ/h7/<ʵ+pT)~;$ӗ6D_MgI敦)3QY=cCk##;R*|ƞ90S L!dM=ՠwfmC(G<㛥ԉ*Ϳ+jčl(zX ޿vuWeoԉXɶ/$6:es@P]FXߗ!FxAW8@ *}OG[c$H*4c\'٣qvA鯊x*O(-]m<'|4<ݖ9ew t菉 L,aӼEGTgyl;\[l5ŵE%|} KBEkV}qi!jijPV"\ zEI(Wؔ]R>Wdžbk ԀݳxLIp?r\jN>j9W00$/Wu5u}^'@IkgYLEfDǨn mԙ쏌sֈ)r!XТez$fP(?c2|Dm2Dn r@gyz_ n6u[\纞m6X @Zz^$Bg{-r@]JI.Yh=.Y.?)? mK',N9R,332f'fΡ&\\'1z,slϯaZ=jzDz0Lu3 @&M%w[ІxN:ΰC]ÐAb& Xѥvo?@dU7xY!t:=nȁּV1VIe=+|Aя4|220ʣ):E UJɕNu0j ֩ǑZk*Lb%e# M6: PZdvO\\Rwv g L-H+^br;IӢ:X1m@쥀MnNJ-+YFjfDNQGܗtV^X)^j> /x 罣|cjer7,~ws`MKͫa8m]dzC@ n Ƹ(o&lcG,.*mp_d}0o]q2O3PeDrmKt/"̹o5 ۾\U~}kd:^)pr^=hۜgǍ(mA$n;Å)]Skץҕ31ROj% ؓހyf/#lэ]ːH+&RPivoׇ5&` P~Ձyg^sj p:B)l(Um$\#~t:$+\d0Bh)R)ҧf1i- "YN/ˬ~ZVhy:Sd,MOL3?kN_K6/Ŵ hYoA)lρSN'{EMU}+ݘaC,;l&゛ȕ&~S6T7ʠc>/K0z[I)9m}٭,:C>s2-^{P$}1~BYCOƢ-Vclxn{ 7'{D_(lt|AwWi4fE4SЇnsSCy[U5' %)bܟ+ί9_lkWM:*hvOC'9|N\eA?v4jU ~A=T4nsP.O)-cmΗc Y=Wnֱ][ƴF `Zk,Ai}h}wi/S4UD)MHL³sقpr7X- Y'rH~)у}Fi@{.݌rYl?vPIe.."JX ULJ҆vXXγ=p@|rsnl`͗/(Ġ}]?^ьv)Վ(}y}gN{s<,ߨ#*o"r(5s|js8T S;= v*ؿZ&c7w\ c8hMCmam粅:-RDĆ-F}Il)7~jSGvʱL["ꦩy֧`$gP256a8Sp>Q$J R1v h(InB±ߞ򼍊M3\,cOmIZ&TU*sݐŒ:__⺨;N-OGK;g6ZZ+8]啁,zD@h?Otqi6_6wl΅uc۶m۶m۶Zm+m'wu?aרVi\ )&ywC˶'%՛u4FOVKK7ZTڃտ ?9A_yépVx=<rIBR9z*Գ(;A& DnAca} #(27¿9 0VA^<4Y' O& AmTyL1`ZZ$ϰͺ_i5V?e_ \΅G^,3p&WnZ9=[UҸTbT21~rY>OI{JuNv+:ϪN8)ҰSD/E+f[Vm-^38)*\m[O;"Lj,cBTyI?UQ␅ԙ buseCvi}cЗr;"I+2پ^K;X&&^vܕ<)iSPFua1'7>)Cd8?KOyҹWs&?M ʬ;D27b3I$5At(G簥ʰ#7YbyLřprO@ ѷ] !ּ`$j9ȑ{5\]ͭW}zKdu(HL\CU <&/'$1i܉nL|Sܐج+H3 0N@}ðvJU Z ܎'WfK0wmF dcėT7)A@/x>gm`X{osP-Dww4p'='….}0n u).zI˥>Bbyb"oVD @sG۩Xkg < 1'ՆbX·!G޺\`>bM a~`~*@g@_{OcD 7LZ`ngλnK0wl ˰HQC\dOZK !R^Ox4Y/իڌf+2b.v |1Q2[^X~gT͠nYTNm誜?Zq .'0(Roص'l%m,i'XuT±:K1*z )`@1gШ(Cv4e_88ִ}1H0B9i]VkҩR-4aR(Jbbl=V4\Uİu czA3U+\a]%._o#UE ϩ5E隭2oBٱQMŀMtlM ٠TύHbV7 g;18Iuh Z&y`3SZ_4"ge $>183|b^ڏٻ; bJF^ o3b׃|:52J-iCSį*aٓeNuWR" *{lO\-E(!&ɝ>&X?eUd:@Bz3w'+o."iŽ(@Q3EJ:HWm?}fvrRȰOeQezP3-alg+F?8s<_ňܼiTwJޒ';(5Nv)MoRPυӐwKddhV3(W/'&>B78߳E[Oe l=%*>rO[B.hRbw_s_瑍~.xCY:C#b Bq ڻuf!nnڪZ_N4zz]C?P(J3I*S(Hx"4%˵nKOnjL|}2~+W^l) XFYS[% t7Qۖ p 7F7c}12R$Myhq9V S$5j+2O@`"%|8fMWD(zk*Ϯ;ĐVRT1u$#cZN#V̷j2Z P @_:[Db7mK^5uu=X{QK>L|7^{Da)J8ى5o_}̌$ܯn"t_] STs8|wyPG>k!mf{m ? *2 o-dߎ'{^"Ɉ c{Qy"@4vRQNj+f<ӱ4;jVҌF0w@)솆6/FHqc$ܑA F43^O_[xM ()<6rإDJ!4sw~nUwRxA|QTO G)I;ULD$Iv搶qMX{{Ϩ%$99b.2EȹfwU(EJ; dmAK2]JJ,i'G0_xrX#ߝ^o0\帷C54HNρBhF{]w"elح\Ӛ}Zns$2 A_UƣQ;%sTdZnk9ٹU6~:KZ{ƸsxG!XhX88SHq{S\YQcw^?U-zREmǰV]/τr#bI)UXquޑQ:& Y"vV !4% Z ]l!:=ȼ qCiGe9gW8RtQÐ>*1V@X#5l6zmٰM>~Tr&N|Oq俎y4huCRLT\ܝ44\)C/'ڎKpBO?.t% (B$Bai>_ro=l]A,EY'*r}mvuzvz^.n5T[F*kor/Da[@J*<6{,GzӍIU'BRBh==j4,wxQmōaf(zFLդ I4U~Co~mM_hVETm+t$#E&:p< (aK{L(S?,14խ5BvɌ|u,͞/nJ,Nf,0 .9`zA/cA*#jma ]&~Dlq1{B%7 ky{ dn3fP8ёy -7ۣRA} w=v :?頹1v2X?dޏsv|5jkV%U (AvPuYb#N 5CO?A*DA6rZtHd:|s!z̡*L!e%Fe_yIxhQ1B;E2ZD1(.]xN[1aLT ҙn83f8ݡB—+Xa j"Y(+Ո fR$P,2@[0bjo ^Se鿻j [ܶJ,` al1 CzbDne2qGe*FcX?mi M4aЇNjXfǓC{9u`7P#v)9Re;d@X-;{RsL61 w,F恈ued{'ET<$;ISf0O~C-~k ?1X MxطJc'o0Թ&H=VY#/(F->aW.c.s ɻSs)ogp3{9'k%`cp*L  8z6{;O~w0\f Ӓc.Nu$c s܆lKeZbUOWJ+bC1YJ ܭ|D{*CqCb֞@e:>s&{P ʀ~et^~_O08g))4Gt#|>z^\-bvT*'ܚK;B!hԂ)KMa㇍&ZAB^5+vP{DZ} X{GLX+@7pwmݿ8c >%@{&Ǔ.degdtЖ޻=$}\zHϡ 7f!:РegO.+93]TѲOrBL[K|3(YQxݝ$ϬN5g5=W>| BF ڬoږ R#ۯ!CIfQ}r0b-E{&i owFMnwav:;zkøY:0MOrcَ;0by[fsNgyaH'w[bܸ>_iV0@{Ow~shs[, i^ktj.~v"^^xMܒ̟ʑ`[۩ΓiQMSGy| qt78d=UEÔ7T :qk\49~I !s ql]: E\.JUE&|gXkn+ɇ7 ΛkdAÌYrC-Ӱi? :o! +|juJM) Hʬn~bdٸ|'( vH*'| = _ |ؽgǑ}%aԿOT %p`byU}՟HzDtZlQ):Խ A+l`At /LU%^q,;'uxַn5}YXFչ]:Y{"o7[2tzlsT;zI{X"QxMʜh꿎$S6uA#; xP aGr&-55%7=-'ta.l!( N.%MVS,GE 2n>@ Rզۂ\cJ)TBV *Ȩ)S ly/oSޯT߀Oյ EH~J$ 5<^杪mk6CDQ+hUCzs+ vF,"#ŭ_\ Z3fw m%s&Wνt;E?lQo^##\L^L;%k:*)]:m棆A=7ZR~q򔨇=M-=qi @|*t#1(q2]rA7W[ <#Za!aZGs 8S^ bۭP<"9 5 K/ͧQ픸?Yg^'r=J_D9.7$i{?q<؊Ly.>̄0P~D\LR~W* (!ǡ~ ka)TTKn' =T #e}"mǔfi}ya+ B3)<@1$|.I=SA 4"D]EZ ZH1w8e^ZaV䭻l.+ZppݚÖ:RM[gx{mJVexkaJv>BV8ER[ Hh+u+9Sw"Zɷ䥩F$)"SM-n1g^>b"op g6HOe1̏)ХwMW%ᦦ}~&TXK%9PrY0Oyl2LƷѷwx Z:~[MGn ~k;2z5[Q$U@a "3ƅM;z&7@uۺ)@-.[ZzcK54X6ϒ)ݥ3u|{Qç훦aw4ٿ4@8H5b|kNMuL D+MAJӗp-4ЯsR^}t\B~Y!c8qxyBU/s}Y{%tG${D +|p`t^avO52@pA/n(̝jm6hlgUmNaQdٯFLM\5)*_ϿA1{v` ZղPbh(>atIb3۬{ЈCdi#('s N= _\rʲiь-NflUdTl0FMPlO-_A,'~"N'AC(}HlPc{Mok7~0R/% rtUJ'.ǻJp%iNl'hӄI]F%m%|n(-x Nd %$fbZ{-kb bWZ!kB0! @qOiJC! ūVQ7M&c9CAˆ5jlVqyu}*~}Z`)@ 񗴁8r &=&L‡(XC#l|IB%"NX0藒DY<^&D1[0?Joj9V">Y(qD)Ch(WRPO!K-ٹ%@]&Ŋ畳 Pyhǡ{JPPK-!Dn__SQ_#U[9$Oտ^2WgcI}nE.RܽƑh3@-Dz3ez긖 MJnYYDP<S_ZمNoo 4`zT)S4ii@f!_jpW~A⣽_{ݞS'?4BAB6@y#=//x!v!Ё]a\(OY2 n s &n%'&iON='v-n !?s ^ 9|6:{ i'$JͮK>0*Bc`4@Xh0shnRg.Ϯ He3X$0)6CgW',/cXF2HbSniw$ueoHb)[uޅĿ\-oP('4` 7ã\n=+nBTI8,9M7pȝۑJnBկȒ}]ZJBϼ`X [K-r kŰ#חL:gv*p2WW̸Y"E ph]vf'~^gkZ %Eǥǂ ^!ڇdz k|SvlԊsrr8;y3VV tR|L9C:j#C?FN`!]ܟWE*@D+x/pmK^R$&x[87|]\c"ѭe¶sWC И6y:<;ĝɛnQ:V͹vǣVj3A8IPTTq@@04ZVO#B o8C'=f}?wÿUc 3npñ6U'/{߷&':9R+QS>>\n LPl$XT^ZF$ORVj^ |i uCrE6$]؊, `xqG~ZtS6Hfʉ5]@S{}SF^PC,-h?x}kY`R֗w=JYvh>,g8m >B]:56,ٳU5oXťOj:Kk +sq#.z%ՆV袨_T-e6TW"7o;QG/bUmΡ+`YLgE=f0qdВ2ɷIuvHAʼL+%z2\&%[( Gznh"4]toL0*}jF{hЅ;YhX5w2HCl9Yxj@3ܠ!~U&V D-\H3z_Ftw|R]$#ݹ@Y/Hw;K+{ ,8+cb;n!jTKE%ݐ9BrDāwH#lv.URȾb pPp5nYj nPKQ.Ĭ*/+צs@ b=gH)4<96l"ћA`ԱL#נL2FL2C@qH^ ei{o?7\&ͳMƘ}fǼ3axiK_zYwfP%~)+utSdD0[ -ހ1 wTDXЅ3^M$b `0X)SG٦yΥAR$ꇻX*?zCGw>8/pcmu(vӘj^7 $E"zSp6AkEB3S"nO>o9W3?Wj+9n\gO] Nu:'rݳ4DmF"ӡ:M: iS◎DE΢IߦxQQo4:<{B%:ch`@@;?V.մw˃U[A}R˜`FCѣ&sKH#um!HVe>25Gw2xV/W6t ÀؕPa_ץ0ǮpG͕]Kf,4{lؾ՚Ѯ+[ĉcX5Bg@DX4b1M9x睒r魥PXZyYNxq4wyȏ *ϊUQGm)-f> NRA@HG|/PȯMi'Jld4YUMS5]G+{]vA`4A?"p|qxel#GL"%;4ĎCPzn^F?P.8Lq  $5#4Sj"e5qR2밺Mm8FOO * `B#S ' ĚXM{fYNRcj%"9 zFc'GșNl/v)#R:tZc$= 45RKx%-5{l@=0M(iJ6E&c?+Wgޗỷ ObbT,NvJ`SYTez13g+Z3uxRj ؚ*?"!YcVQfq$X%WNj`-w 9mzZ#7@ *4U_vQAxlÆb  a2%L]/Tz§pfZ 9TGgbSJǞE/<0V^W/;;frk.y=)J`oӘߞ4͟\~ūr?鑟1fVZ4_g]Aj˄|ֱˁ^\?~eADأϯSjU~vj{)ՋG4FJ^(~یR1 Ǵ~T]8|nrϾ7Hw5oZa1Ŝd2oBv9aO9ZziwH'yN=T!R5#WU(?aC qK%v$H߸W]4v Pdg[H ʞբ)O]Nyx2rm-} h~^Z)aKå?K#CZj#HdL} r<2UN{,FqeEAn. ܎Lfqu]XKZİ)6m{}  UDAǦYpѩ;ĸ8Z>8NW -r9eNޟpa]-߼J=- Xt *|.W1Fp.6|_[(:nU`.aii/}09WDkuDUDl=bUQ7kMF۸^53 ۉK:;28Ϟ~έTT 9HVFi82?p$"63R컑 X>XBcĶhewTiT2sQS_gWV3ȢCtwy<3Ƒיǻ}6]T }3z/Ach@.Tg:F5EX}{ hv ׅ/T^F28LB2TdP7{M_>&7 R B*D:;NSifۈj [%^7 h̎q‰XՔEr9Z!h=ӑ͖nYDl`fsX GGJjLqZɞn6`t#Q-BQ{ 0m 1HCX30ҫ+ d;_zSInj?KU䇗P;ͫW֨AU6*:Z\x H$:!Gvgq7lqX^el{ yF9Wg{µꚪL !G{ ׯ-4v87I" Cz* >I0E U4ϻIg[WM(2zF94u'>\*'S}ȏ|W.I`nVqEGoy{aPsD5hpK"FbBeƔN*g1IToNG*O'>V ZW2~nNU26צ—plU w7ān2qhiqaFEk,5}o%Wܹt a, 8߇x'9)3O5?`"ؙvP54КJ[l4T=oz&ŹY]kHOF `FoT+X51AUIKpG/MÂFGS|ꗧ/bjYO:RꮽKFh`\UӜuvPON >򕋸Z`1Wc%}MM{n߽&k2&Z]!;R>=(* 5h*B WsSUSz*:Ǯ=H9FdֱKۿ+|VRⰱ ք`۽xFAP ؆+;Jnd@G [p)EEZu<8wM# ry[ `F5Plq7]$ǟJmXHo| tX7D\~)0 M?ߡBF87F-\+ JN:,wOV~=ن׬wv++Z=o Ilmq's";/U]fIߦ}hH4n@Z֓z,NMJXg]!ecHb)Pbf`-:V u6̃ظ%*áy$uMVts;,׬O)}v:ȷ7f<%q%KM4A M4V$ie>LOV-\q 'pWu5]Z{acNm[lg5(Jbv0`JDz2 [ob,Z̄5B* uAhcV=cN7/H[j8[ =Jd~#<A9g9laB'="o5-9Xm(5[H'I^?.xr¬XFBBbfϳbA1ޫJe(+J$}UqH-"q{(,2dX?_^SH0]:"QsdڼމgS墌keoO)ۜQff`4UԆ=JcPl81cY"cIH oI?Nҥzhⴈ??3})4o!j1izk}FwT衍$)(+.mL<_}^\Gf^P5J .UD#3Ok,hH4xs}'8y×q@̆\}d#(Xm{k5L*xQ=Ec}gvߞJ6mdGgAJ+i/OKiNJge3%Db\pAܼ̣vz3^?72Nvnj(06ιSlc텳F?nۏ6agB>ou-+IF͵eIn3YnCHmeșy{w٣kɊZۼmiM 2k<$UDĔqjF^pV&AJ{Avm0'#=!kIJ#oqS߅ FTVB_ [ysvJy7o2!~=h J(T";&xs]%Qyyկ,[T(FP5U.wTw,|ٚZ8qfIU3|>(_Id=[ m{KBN[{*C[#miuu--]k߆u=OC77֣Ȗ]]]jKg AGx S_9da25+C(n{[dHž`!/}6}̿`gTA)a ,BF&tiq,XAG(KBvTȬ>7;Ilё1Cbed%흠@P9ҹʉ)0Hr&ݡ\aA}MYf"L2ho JMBvX'XGdK  ?S&q7"Q:ES,Tf< |&TcP!tK{4.J-n$ jX [&5×փ,v V`3bn[dqȠwʸ6G2H9? Ӊʅ l!ɼj X<*(OTJVggT=g!HC`c r >Pr2kX?P-3F3  Mܓ풗C-yf=#{w.B&1S!:sW GXǡ;k 5iLuuAgUMV$0iioBעm0+:QfDEV6d@6{kp{{&l{OvvCl?Q[?\a js4uqoyovc*au})9<{7lw[?h4gf {'ŏ R`2f3P_Rݯjy״*=C8 U{MOa+eI˼7?nfV4n<}~_ԸnvȤ"[ӟSwBϹƷ< dnԮZUY`ZF8ɆRU0ݷ+.+9B;ncUOt|=X% f0^[H)%P{ꫀ[aP܄ oYv]r5 _u.aL"b[hL%/*| _gՠy-D:},rHj|ʹ_ܲcžfuGDV (bq ? $L5*:gb@'0;x9#8+0[|E~L-N]Nۇvꀨ-;+T:.#[K(km .PѴ#%z@Zu/9 *T3"08ʐ$A5T1`\?5S70l뫊kmA KMϹPak BWbLZ.c]>ZZ+Qذƈ3Fsyf$6s•oY͈nl2P>r fIpKӋ6in>av7?g{> ΂;@_D Lu!*_YdP _{y9$36?H+hdHX8~*j5*Nw}bK+moy|!wU0\? Sd쾂][rp:9q:1z2[=H i"C)_ez#MY$<$5AWw @)(58 R8Aju۟[׎ ()iLnjJ}t߉D$qA -}nҧ f-!A+6A+TP*vG%,_wSu2rGHR\ێf?drT&:̪v/%j tF/[zGIKE82yqWlYŞ`~Z/v0)-'j9;HM!/#9ސe!MG8XN ݎ'\ڎtOa $`9At/PK[# Y@߮_GUdjh3cv#s~R~0dc!< )y(0ZRL!vUȲuTβ`%{g kH$&NỈHhqbvȵ=E/eavaaIvhi{umŮS:g{w6aй)"m5W7)3FAg^ ,6r"OJ Eb)9eߜ~3fCt2ɍ8qROjR!gs퐻!?)/p~UfQ+H<QZ$* /,hQUaDM=nldb3pWKgmHjL l km['ej>2E;{4}ы" D \ʜE/aۧ͆5z}X;Z-YFg 3Myr?ЂϤCsfB4LQН2Ħ+? +c@2 XBUIPl^`iVxD8)hՅG)qnZ 72w8L,V3lI8Jid#0}xYStg|ۂg\gna1)l_n:ɷggO%>wQ,u$,P^Jυ>T7R_ճG|})EvvI+vN>C l@2'f %lɥ}D9+3z1dG'1u/PddB0ɡX;jJu uM%'$ĺ9hLK1CL5@B6:@.;[mo"|q"@/p5=D%Oȁ"5I4"@9U"Pls~ 59ޟ2"F[yFTmQi8/~!cN"H4]]TaN[cmVY|3W_fc1t}gd>CNbV%Ju$a2RS߈O2V\DЇ T6&'_4[ kU>[KB::OF3 ؋6!jVz@gXpu}o5d@RIQxOt.H؇o 8feYpP=ˬpqȍ?yknNBQ߆䘥=yq*&'wbћ8.F15ft/O/7YbA($oH&k!`;%tܽ-7ydc}j}$Cɨ\a*8S4023{dLyMÝzŊN\A$yntPX0;U,'E#glf,З7ZBr%JBU/;zHi.yTo ^>idƏ<8s763Z%;`PxeEFZjWKġE`&-]뻉Wsΰ%0cvvS(-dE;V4wػјvu7!xa=?󬰨F+*:rv-yڹW0=8Syjt^$1씱kKsYc更}[)B/2ݘY +eA\MY4q9aX% NZT-C!IC ?a3c?x;I8ǃALLYk]k?C[9<4Q>% GWnfj^7Fv&: ҽ4_2*=6,GNxCQ W53X/]]k-F{uʗCwe%2D"Jz}!6kYCD[CۊD֗6Q%{Nj+3)-u.Uסv|=}D<,3Z}-JwԁpAEQ`ۭ9sAs)ɲLAt ^a>*S6[z5:!JBS`T\r#ћyrڲ؝dž+uBx+aôi1kHɖE%ΙӴ3eoN#55k/t~ FW6vxstd_U f$s-Иތ;!sVߕ9 lFraWkrnonYxS/^0W+-Wb|Eì=4Ƭ&p.pPX/-݁;D9aexY? B4hqd\[&g`0BlL-n2&5[~((y5] W»k*W }3D",æwXǼkӨ+:m`pi=ۯOLuas%Y,>J~S뾏݀3uynw͎rvAɌxVtlGr{7M\-A4 H5huBE _NhBt{(=f%{сVT|7P!ޜAku0r>,JXE&yhÑ2z]kffr9 }]ֽjd'SȓTJ oj&ћc #HwzDƟ'vMFїjWYsz5Ŋɟ=[cַ}s/_ {CEv <)+N𐗙KWCm$jluVr}G!nZw&Y/o6LY7rE7ײ?Tu:#2.4w<0/|WN-Eq?I=9U.kY72(ű4 '4Hںǽzr%f2@p Nh4Z[2~6̡$pՃLhY,?v C qEM JfD`)%ae-;(WlGHb"˅f5K.ZM iSiqpUWW[&g՘W̙8GFi4{'+}(˞/P-5#[߿+^>jū@aH{ۓ-t|y9::&5.tsE9 |o[1w5]ceEZ]&:pv-vY`yaB0w^irn.`U+!:j"FErYoYb,۳sD)f0@*a%O$)LP0=7s$t< x}Y5R1~KxCVG/40DM$ &F/VD&p9.mgH,m.rɊ}aPjb ̐ϛRDDmU@ZmƮv n%%N)!~*U`Fv2#]~KVnnHMg.=2BG{^tCY`G^Dj!Hz6ܟFZbd%1ei_? j«I Q{>7bQeb;:ȝ9[.Ab/ ydlYP -%YEDZJtEyG|ؤ͇-v>=bow!uA ~s$}fc~IܥgkGTX1 R1Kpz4%ٸ`olTٿV:e.f5 Z񡃜 .ԲT@"޷+DYjMjQZDy{#e!<7ߛgЮ>Jzګu~9[xFdb;P4k%rs!m@'Wjp ,lɮ6Ov z=)#'j,H ɞ^Ǟx'%$}E:,xI} ,']vb7Z& HOlZ$` ~gZr7ښ u _B_sξT*psio=ul ɺ6O9R&P;8"?5?PX9h!x]*!3qߧʵc0<ӉZDy2l;$|ҚRd6%%y΄'>s1N;D1?=-d]L<=Q e[lI~''5a Ȱ O M.I-Zt"7Y؅ >9纥BMT^O3UE}nDH:nMō⭀c|K-,:rNc09iފN%_WM4b43;ÿl۾͜f_ܜrgg]<܇0 BeN!B'aףy_H=lysXh (s)$;l:Y)ӯQeJ{y~9=Ƃ Tg/uQ֒툼_t HK.>?SP5^3I+d4QY,Y$P wtx脩O,nP MW+~;/RX[/J/J\1%﶐`?=^O솲6 մ߭nGJo%Gce}w)JvD9G(V vT?ODzb |d߻#K=q=g7k޳-h W֡5RME4ғ} Er_@TLemaL upX" yNBJFE2Al϶2ԑXewr:`I4PjAYhٞ Bbh;@(@'Q|&54~J4F],KyUWr45mEN\ciAj=#|댰x˘sց[݂Gu##ӊ)B6n.oI1[Md3h@*41U} ,+R= /M$(SBhO=ʮglBsgW&I5vZjJ{iR\>%gInp ><nj B=!}cvAc jE"Eht(`ܯ٦$]_jl}=[#iÁڛ}oQ]Ez/8*/} %rd?5n?ZWkp\͙=RR~xSf-R|opԏ )&ԡ( Jdq;_Ň)RbmS"ۄ_8_ҹigb{LtvK頒e'Y9•e?zz6TTpSK8ƞـK9MlZ0xʶ@C\s?uj"9iu>тU=- TC'llG;V?1̴XM'4&G-/f[6>!8ZĹ;a)/ݛ*G"uGjO F{X>87]!ޣ9>֫NAN:4M&jeB8Y 1[5{~O ڪ7԰`/|cw?Uxx8snQ(-FW v^CL1 V2A"@.eS=l8jsTҺDd/0QTcDx8M4!'6A`͡P(lbWF3הG&dJw^&m&X~o2@~ f@{]57\{eaCBu.UA^ulѨ؊q💒!ng;5 O;ˢS0 HZVILb@L 6M}΀^'`% >h KC%x&F6]K x8D",y?T24q !]e>@HĹ]O3M fN/Nѕl7[ɣjz_e·Ԋ\֖ ȔmUƃރ#3xի @晬Hn9s(D_7" j2]i<_^`@ B˵<+^w\뒹˲XB`}yS@:|t !0k`?5NN]&#W+sM&$S7x̵XgYĆZ Z jنoŸb8' \G+n0?1B8xUE*}ph @*4jkzuH+xU}G,s &\{i!8NQ+$xD}|9{9kYT_a/ijp+Rr|u[/% zwu4KH*nzۆwq{]# Սœ;|P`n\ѧh"A0FU ɶ*^:7< IB$~m N ae"Xƀ̚(yfK=Nqs:T#@XB|H#|#b odSOgYϗ x䗼ɚ ^]r_1>ʯ_H8/ֿCa kzՅs0sIؚ̻Oqf26dླྀiaZ!qp ?\Dr7#f&7IyZARw3x с~J Hd Q lUzZKjȠYdY~R 3^tm ldS1x|6OƖ>bLM9,+Nͣ# y*R@\S2} `* $,R$*`?aS46x|wVNvrv̾˶*eɳC<9*i<"bIBn?F(ԕ?w\Z8RKNC ep3hTL$*phԏX⯕J;8#Q]#pO@|rl▌Y۞m Qbd&3"1rvF HW{;,SW4YQd$(*]wvyk]ߍdVu?¯#*&zޣ3O!LaEy%gvRRjb4~c[.5^'Ԝ*l=ږA+ͬ|#b9sшC$=~Pl>t{h=?8MF7n7M:7u/#uVfD;oz B? R)g 8&΃w┫~xx/^ oϧ{#H6>NP: agԻ}t JPQY2R~g0n0~,!IoB*Ε7AQeZXU:IÏ3`Q԰qƷ*Ý5;{crE׆4T7դXRˁTyuoglLWE@J:v;̂";~omJWn_e@_&UT`17v`ߴ)֩:WNY'mbvB3B,c[# ާRmnRIg"PGצvO{>8XC, p87I0;7k72HHJcg9¬2abEn`:ةM‘jgusx @ kE\SÎۀ,ȣBZFli"U$YpGE!SI$aOW_5j ENI!BBm%sZ U׼yq y/)At,_Hc14Xd4lJ4qK'x$.$#~Q\TwЎb`2C>Y~s,3Yb帲=/: Lum fwH;IMnjS2N@*G9%,Oa?i3 N ^O:1j/N\~n>9zZ$NL^f{$ki[LT;\[9d^(LU(~o9r,YC ͝Q⃩)S-Ksh]ESBp8V?ťFbU-6O}Iނah௣䵭|zAZ邻jY Zu?'%F!niYݬ_Qҷ;\gʲnC-6 DO3E<`5DfQw j//-U¯FߪRQ%>`Ƥ1|&7=kSHWuQmcӴ=wG= vaȒWa~Y%J*{{LzdUe)ً9c&]dv[,VWMb^boe Wt QMJ|}/V MަC!/b<HU:{OwN{R51wv8<;Cf}+ ZQH,Æ{d@ m%ׯݭ%$'ã/n_t[mvx|:v-v: /ff_ξth>~>Qʨ?h0c/k,? pp>P`\6OpO6LJXh+fCvQM,ia؄GPw:֩[ AVԨ-gnA 66Dbl:8+p`3n<08"|;0o#Q \\S$h&ۮ35R}#>^4Sǡv0'6)on7bKssc fWGx<qs!C q|xH $'j| mrrN /6J*_-7v5^f0hCw^hT`Dr/kD{HI8ݠu݇ Râ)Vི9/,@  oJ8;_٬ jtx~l;,yLB:W/*'{F~ݏB+~MϹ=ZWD!S,)j7 Bx!2Gt(bW^DpZV\pVZX&b6\Sb3%t,\ԇII2 uM`fH - =X3rAnllJ\[J>P"?hFrPˑi?]XqL%qI-q#B\}ɦsszء n0DwlCo|ģ{?Pu( @?'xL wDpG,x8 puUpZ>BqƜ%IE{tebɌDV-//ŗ$`}|oh=cTZVbqHHvhtRPeR,2E÷H?iIWˀx",sKaLd+ߤ%Q90H!bժ.! K@,گn7eDũ#B}Au񦞁> яgN+@ ?=J"ъCtqoB8šhh(DiY"OiR)/"OO -ǒ+#]k7?D^OTX;#`Ik9b +};3KSSwdҼ }]?Wq5¼)-qxq@1ᖪ/d(mG-3lp6omN7xj7;qqsG qHӺ@F)UˆBHtzVB3c@Ŋv<ӁH q06/h*љ1*ǹGڙbH2EiGcx U37w 4V̀"\qUCwJPW{}x^$ =𛈰g05:<R`[vJMLecRĦ $ZH{*zP+S*_W @]Ӱj?\ y52a [BHk:)'ÃKQI}9óci`OL^[J +SVEހ$󜯤+>8.X8񿜨<مcxL,u^j}eEc.,WfJ*Ugj5_7Jb xVIiݛ/ݽ+Qh*7HH4!K122R8> 9 03_n\sz벷zt,@}þ3n_9|?giG]ei>S_k1%s0YG^ۈvym s"͎Nҍ1S"v",]J#D˳::2gw ?KI_~psʞFgTEVPO2U)6_T!;eʓZO+6S5`ї]j6rXz}NB;dzDBٛ' |2"k+rGt[\SF(ڢIDXi ƈzCdޥ:@BL1^ !";Wr/a*6`]7kFd~D}fuBݟ38Ώu%X:X+g*IK>vwv,}ݢ wm4_\]iӹ zHx䍠 F3\=zY1eF4Xpme`a=Au>d?,+e^˧DpHu7oZO*mN@sFwSz*IkS We-p5vq-XA_ꮒ#+ZMY|5q$B] *]K$E gFBg)(ЍPV2e-tE״!-.2iAJ|=&qv۴&X~c߬aI6J?&RA:Д)s]KMO&W]yNHz'8|/؈Ep[^lYcê4[\ebj+i$7 zU5@{yltrp)9@6Z=O8n}_YQJ3|)xfPƦB=@)n ٳO³{]F~{3W܆BuS$HXʙ`Sg@[Ǫ O6~dulkoƱ6:vs΋%2FbJwm%+HL ,F#VV=Z۸Cxy$-!VoCZ.^-$R.4R.KH+aOt/gNpaW- "d Lzx&9jƎD  t(nEa\#؝J%{ME&ci\A3cM9frwYs ^@WJR0$"]|2ߨ7*Ie f YR@WhKAt1>TKk<stz*.Pwⲧ 6WO_& D:䑐Q<OlYAwfQBN'( ~ע(n$!yu4fSpiDz\+t&\SxD}gW V)J0Բ WLͱ]lثd[>yÉNDF0H\ըirb``\*UC+U) $~zN`b\3m0m7o/B'ocҞ~z#hȫ0`Ɂ)%9Ԥ5BF0ڡaFؽvo80}Z<-fdkj jA9so팣It8%5jjuj^m9JLc_cGt5*JF{BG?7 D[֐6EVol4ېQSgHV~Di҇0 hZSmmZ3IRO0[wFbh 󁥉'q1f8vgk$Yp;[dM> 3R`$؈sHjB0Z]4"TϿE} 1*!S}PJَfcM5TdȻ"ߥʂNQP}·h˽3m$na]_ĩ V< Q(jyyz~QrP7hg;MZ*J)aXQUSCi22ѰM8Rٺc=$jˆ`)PuE7wdHP@Nیϱ^X3m?)4d?CeՆMwiW5ӷGӋskqr(U|+TSݝ*Z[V2)hy?YlTߒcW>4-yi ,@ j٧ lHc+[k cV }J\[7~'XL ev֬8-|Y@ly<`49쒟BuD r\7l{#\7i~PE]vIްP?b8S{P3Ql8d>WpnuE &mU|I9CGs1.3b[rQ(8Q+ rhupa9.Բ}:]ƫq}8E='jW[c6ϯ'>٪.xH.

E 5ٺtfJ֯Z{` NU ř }i(OSs w(I".P ϗ׫s}\k@r 0aaxH4 lC*ϖb^9y}?7\}5c36jI ρ=Pئ1WvW Y_G 0Btcx^uY [e ybagIWM[а2T ?ߴ̣J󇳠 @"v- DH l5oTY>4X4TSd ZёSғxkEg<77a&(k ]9TDJͻ\\nS iQܹK8:)ISA$+ ;~EF񿘥@l$ Us.ΕԎnг4hֱ>y卥l$wί&^poC`V6_sb3]_e\`kCr/&HKAGtzcDz㚫+^<X arqm|%N&u4fbJ_%kMz@Q5 Ef\cCOPa-&S?[%J.g$#sD1]zSifV? oz-Iuڭՙ{nm?O>oa5- `'ޣт{0Aswve>HqstQ˰2;nT픦zOΝ~3RσA3щ '9)&с _a6޺G6kZI>S]8N޾#̳R$/s:TNE('aꙦ ^%.A}`*ƀ5ڝv = ?d,$& iu4}P^kmK`{9Az WT,ye5De뙉M JHϤТq` Vd^%*Icxl<~mwK;g4N,kR[R[6O-V U rNaD^qN dIt 9\}Rv>W$Zo Yyi+dkV^qVQ}퟉jJͨ&ɨX,X,5DW4aٕQ]EeL8{;&s()w0-Al] Q2N**r} "VtCU\qo@hT2B%VLk/z0|ȿN?ĪKKL xaJ~_/, _ŝ Dh{9k,gt0#1-vtVok"`Z5c6MU!hчSuws1g~aT^.6_z4Ďd $ð ?H{M 6eRZ>ͬJ*"[t'MVTjPL - qmȫepL2S:c=44$fV4IlV@;$2уw+PD#cF){)h ^:u-@:1>技?$*YXzҤ{'ӯ:vcYUܡyW]W:s9<2$jL_$XZ 'z)YA92ߑ*F%O?Egɿ_HbȿUoTv 7;UZ_0/k1~yխ0m{zLn4nb-wTUhբnE ZRv3R@\llڱXe'>)kj`U娶P&o>l0*̫L]'juybި7*'1 B&Yk8DrLܞ> XC_Rs&Y6)L;z.*u>0Tu_q1=Nk2*倬 v 7:,iWW8I'b̒M):4 ~RX}@y'X-\J)Nkd6"ɫ4WuhLߊ.M z&(c& *Գ1o!9Mo4° 0а °^5a:X uq8l*o\*~ n1诒E>HG WSWYM噎]חӬ,ZKC>|j*2WsAn8!#s:{3dpGj޽W,r@)i*'cKXj>!pOPܧU.9uow3?, {C!/gNlqm/2ʄlL@- ebyLqBW&"JAL!U]7\©J۱h6F3MpֵzVPʓ) 3'fh$2O굝jk˞wj- hrX`^;~ s/)Æ ܓ7|50/#"3`&nlcd'"k-$9l t@>RrHhCW r P$RvOhu,S;dlOd[Ƕ%MηMANL0eP74+},e@|Ҥ,Eq- --!ߡeQ7 U\85$&TvCmĦh;`aWIesI* 9S=g%甜WerGo_WtoM"퍛oͥʴG5refi2,遥~R 7Hw_s+*}m7&G2B:$,5+L ?1C/8Jt9]K4"i 0H{vOa2 N]4&BϢ"R}pSU:?E@L_F[7j,4`@b,wr&>(yZ%!hЛ2YGj۴ ҷ[_5 oFիQuSHv3(4ⓋgS/d;`=֞t[p'X]cY98Lmxr]r銺3X˓ :3z& GcD $=n{c({ s'_gcS)wO7I3XXǷmu^ Uڗ) M^*[<:ݼD=~F,Ti֦[5 s1=V_UaGjy4ziRÿ݌`_@+ ݠ-`k@Еj6[oRm*|/Ckbթ1qbL 0WEe]̵㼭5+Pd\XSfsw|autkx̩pM5R@ϸ_UHDQaJ/Ѹ_{9j@g&Q8تPNegӊ֗FQ/ݙ.&9ѮiJVklE-TQ?;2 dL4z jMݶ/+W yHheYCČM}<5 Y0 [ӦZfa'MN[Y9& (aY3LmU'jUUOQ?e,*MQPwkqI3W)i,(`Lxj<?=L-hذaǎ?,* ɉ&#j&- n(V7Oi $@8: H8CȓEp gwP*+b? vlvg8&r_X:DOWVas9 ]/4 B"h{sP g?ケ1 cRZqTyލChձވϤy!("AȎ_ar靟5"/df l7O_@3y>rԑ DULcOʬ28$?E67ogh'cPT%糿3Cu'9}+ZޙL֜1ɵkOe=FSe#:0aMrZ/+{}MG陛%0 CeWJ낲Mq,vi; LDY%7^I'Nvb!B.gm&ؑBd)hkUZqks,8v;ݼr;a\rՈQ횮@̝*#i ė!xT>^)~1.t'2\+(+U&zZRi[Pg*O a ࡴR_$-|B9{r_|pzˢBSڸSdlPٚAKIY߹(lFlf.T DS%%HRC/!=a;? (¢'NL p&} FF$E {̰ާ]քi-bvIJk$ L[%WO ._=sR4ѝ" i-U)l IW:=&`BڧAv:+qؕ ff.Hjk+e2E014-z9R*v" eV<.5SȰXD- U XSHRK 88=Hq|U>pF;e*1ǣy. њJ.=dp)1>t6#Edn^\X?]$ch<`i4Fqٜ_kHJQ#UL`LnHy7Q!C7 [cWkuBOLc< i0Cuu w/~/ :T;`?bo`zº!@2š9T& d?q&CA*Qt"ΕG ݜG֌*o|] ogQx+5L4ǀ-P&ġH|.s>s13KB|*-F-)q[{fqlfI'nYml*idpU]hF-{jM5χRjr6iP >pAm8f[fP^ρ. թ7Cð_jbW{$Cu)XNhW᝞d°'LwڞDY8܈f4cܣ A%.f!7`wiDhms`~!2ZGm5طJ8;0rGDFaw J 2v$}53X@]C5&ˊ7l]F3<";WZp!V퉹݁3Ap` -__4Ձ#" 3A|dem2&R i H {AS<N[ۜluF+q' ߡwһ" (mW~ڃ8ٵ0`:-ßC w勧@ݢ;1(WFi:g ?AP z(؈6iq ((b5`pQ.^gO|5ͻ{ǧ2T9yW\Hl3Cpي ۵@8(zXEXl> *gC3.;|C1 ,l<`8GѮ *Bd l| OA7*掆3^`@S@ Vbnej@8"ud[?b3*|7",?w/ u8"1Ax#aYY %5Swq)}d;79w_q>R{OK`O`Bv;6X]¼j  =#t+v8ʡImk$n 4X$Ie K2ŋ% ""E`p3C<2k'dG,*}@Љ8ϝ6=NR%k&akdGM8֗睂5߮B{]zD4*ϸߊEI>Q_ AL.teH^4 *jxX&ѹfϜ.]Bxkp}ȈZ/ʼ#lM)?e;&.;2KYnlnud Y Lv %ď >18(>Ί??ݭsb&2”H]m}@QtJ@⎐1e\#ղ&N?Hl v Ȕ4$q(3ʙšfq WQ-b5d ޏdAǣ4Q*A6I h} pn(F2ˑ>\JG$ 6[G!%V nFuFB}="PjlhjzwY=ПXX ^WD )Ћ<=]*>ZaY+$pxlytU𧻓6*{xw8X~ 7TBXKH8@\D'Dm]43dgjE6 =LĆrn|Θ % ̅@&VB64 *IHP QI vL3{MPU lfBt jx%[tlIegYzT5]bR@5K+~L]cTUVh)'XڰbR^]J?;lG׽6ʺh !hSMl[cwYO0 \w`ZcUPĞb=a&RЧFClK4%uz'XHδRN2_(>9a!:N"/?5 hC.e$,8SnY9GԱ0|φtXJ G~`3>FDņw`%j/(2K#-P# ~R,Cz+&v\=mf0~Tw[wɪo~f;6U^?iuni t =Zc-GQ{kę+.f @\b`N#<7Eף㍈h~K |R c}c/"[<6]FSp]g4zam߳nRhٕv7^3,*P fa'D֎]drkx_?^u wY(@?l=&ovаlaM[[ᣑmǺͻh_P[^0f2^kemU41FoqokaP# .0.?^..z/ATjA)PwGa0t އ\wND>{zC|hv\)jtJ~d. Wv#wRw <WyO;"/6R* SpY%Mr$tK1YYUneq'(fY@e&,55aެRđy)E1eD*&6,bM)Ѧ\Ws'oZ"L8ã| NNVf3Į?t|seiP;xƩ( ' Dz쫡] N,^W)cK[7#<_'wn@7Lt%_O[[ ](^r.S6گqcwc> BJ.j߿w}Avuγ3SIT/lP7R@C { KN]CpUg3}WAK}z4kdﲬl×Ӏ8 _F ~g) i-S*O}}k2:䢱I%p͔;fOFLrF*Y ð8d[8T6*%1G(+agr"4 wfI@=`0u|6%0GylMLjZrij=漾GmK%ѷqvKIl9ϸ&c+v)u.dpiIk+ ƥjZ&$"F e?%ek|[7ی0ZK=c |2.L1q|81i/j ..1O6NYjzC!|:;3,Ct,[SH ''UM< 829z*&HOC-$y@1H6#g% E% a ggx]:9DHW T6' n0o^F@+{5:7,מIddž {i(;q;=Nn @iĢKˤj7Nǹ8Lzyn}bx@r#-]چխ?ۛVx)k?/խ<ܙY|w o,gy(hAG{Co1u }C*DIJ_{C7~%jc5\TG#}b$w2LdSjk1m-rAxlfp >飡gEɡ_pRAwɯrPϽi'pfZ 1D)Y1M{?H$Tj.1*X%'~\GQ z?>w]PYҔ6"(Sn!]/> /Lif0Szq]}1''p\Q#Ojkm; 22UUg9!9~3(79AyQ8{ / ^iJȸG.^k`B#dBT`D$~?٦ n c~'s 8(cZrk<WXw=Ң$X?@\M`E[1"3-ZQ~K)M F[f8qI% U-Q䗃et,VnK<{eO<>wAў;MœeQLXBhٝ۫3 ICm y,n>f>"?-c{]B8nUO Lx.P8C~.\$Xl\Ҝ5jA4=?bb-  +!WQ. OhA?d>N綳Joe跸a"F+ ėR}AoǠd`xc3'C^mGA(lhdP-!o>b8,mXyi_ʺ'JHQEIJ r/o_< XSs5( l6 d=[\r aC;%8OcwOzWhIV/}EmnG:S+, TQ.*t?$EvH7ԅMvotG]/tЇRWܽV?{j@˟fy+8QéWdˈ] |I05bV棲,3/ V>u(vBA=B/ė&@֛Nc)s\x^:(jH 64/Z_i!L_AW9I(Hzr"R$n]MSZ-ogڐno'E5E- m" D:Hf/D1y,:0,Nȩ$u=.'}DeXA5198kS 3j _~v§b/Ad!ZfV~^>n7;l[$\]AVFF=wVj-_C.+z2` 0-b<[b |1z}.-bŕGt@kѡ@-V f\MTR[C ⻓n15v:\-CCpwox^Aq@=<ӠS pū˝u,oJTƁc!|CJ۹;Seo +ȷ\i3#Mj5SoۘG7#9ZwmEo^Jr`W_"LZlZ)\-+GAkӺײ&0s!j0W\c}Pw½v(_Tڷ9- /g{vUKfFNaLoK|_$:%sTghiӕ=2moPWIKb.esY*y9?],O͍>g2#\lψL?T.fHk8X\w-a7YK]j Ǔꏨd!n0 D{'@qîӍp6VqMeJv)VLj{?JhֳO  ۊ}%85PkE>bsjhMA & W=KhZy|`~H0B(X,^s2T52yb9,K I8J;@u:ZX1pp߀5-@js"Z r₆&X4Pࡋ8ij2ExpPcBzkzC[ âb2 Vɢ$.(cdi ~ęq>ȵl vP`W0ef !C1A,B1>!H&qB|TbD䡋/@0p><7*3QGZ MWBMvI;]5b#w((((I5QRTUTRVVVVY *_NMMN''Ǩ'ǨQH|$նUUUS❝u ]]X( @%`G=p$zV$?I`5z4=v胣d AЪVl/?ճmb:Sڶ,5d>)Qe!lKXA~ \j}5x*Ǹ KI)0:x%h$!7*?/VRbxe|@ř PV' l| |oM,Ͳ Ohjw'~?^vNqSdدLC4פSn ]ςªeNt豠Xe)8$ڛimA|$Lfp7* 8 ͋onT^SzҨ ^MMV嶮c1.D&q6+4כ$(`/oȇ8Z^—E s}'vm:ig)SYfyeyt;3\:ڎbaco J/y>V/6#3|~$8Qammyah u6>vMQ$FѽiW`<8}htK*N>ˊ=fӤ_;PcrX|/;.]/կV>0^G2rNhx.UwJ>ICѸfVӾxJ*:N2/B~6By)Su+AwufA;,#rD+BQRnu!pN& g=QPLcOsn!M;:R^$'g׆_`_myrabk*L ߣl⋜aɅG.DsS? o}H(qi`979.۹^?ʳҵ2 C'LٜG%6 ϳL]Hƛ LnPAC Zz)]j/Q֯Fl 3G[C.9@O_}IPA2]P8=8DS_FEeIAhg]//nZ :g^h8j ϱxPYxuEpʾh=Qd/ީ~Ř,j/9r B߻7z@N##fou`M-{8-In2}4%'PkuW fQWȠ"P:Oٝ.r3sn$eO!VZWԩl7@w^jqWCq9N„Zc?zha{iw8~r$;4c:*x}A68xV&(āfen}mWv2SDڛݏO>l?sao^L)@9̎!B|(Cz>IBt!-I3g}ζ("Ky2G?qB ;z+L˩7yD}]\57Ae:C6}9ݥQm5uVKKKْ#Cw̋F cXʧ$?{'txNy-A'z9[ϜrJ`95my'CPdgj;v,a#m]\sz_;9O3(FH?#*Ǡdm!ĺ+"=AV_#?{?fPJ2YDx\N[5{[oH5i o7uǭ%`s%e-e2{dn/ض vJeljIg,x@\H?0GR)κ+05cа&7Mc~a|gMʪ K~w iP`\ly",hik KSUǼ;xW-oCr&Vt7f8;#)XU]b{phB*%v5O'"ܸN9bиع ZMKVcULJZC4=3=Ǩ3>U|_);L_uŬnOk!qbN\~kNvU~={fBwYx !!ai=›HuOV4M 'oJZCSQxaO`{\XXJd 䤫԰(KB=?|qoI2탘}H)ij~Q?ĕQRΖ5'!-vІ\oi_=q\{({t@zevK醩kӧ+=<( z|p=ezX Ah屉Yܭi}l+~.vإy;$r:(J)cTNV/wH(c\!@,WfJanHDZg5cU/QiA}rtQۅWEB+֭.1o0#ƌkI=/ݾ $rA{2 -ί1"@L2ʆ/,1"]iar!l]nW+:l¨6ǑZ9brNٴ03 FRBey6GtD֦ 8#mԺfN [,^,%bfER:1Ͼ̄|֨协SjE h  AV""S2SQtlVŌ~Yq]o^[ M[Q/;Lb@+]]8 5Z*8z.HBb>;H&Sڠg[Kbvn[%/UfgE4G~z|\ʞM\rت0azP BwF7R y B|,C']^6k; .MRiG$%yثLjsάDl9~&fUwQYl!6jJMvZ#aDZ/w fU_+jv,$ǜ4nnCpax3wd=rv$Toj8+s9(C[}d).Ȕ۾yȕQhDl;F*I|0b# v9"T0VOÃ&e>}̀jCw8pQ$WFyrsC;мzo{zզrP2@GVY#Ҥ pOoyߋcǶØP,r6i[з(G.ɣ{DiXEp݋ͣ[wuc!9Fڻ"W3[-x!JPVR/1֣%ѕg+-wd,ctͼ֙t(&R^jNT{d=GJH'q_ٍ}1Ea)=olYL2_<8w<Չ2NMo$Q}kUU^ijdV{)ʼnaQ͂!a訌‰+hFZѡk 5|X~* UD%m1I+A0Z4uwy)U}h*Z`:lHڗ'8(jIl#\ޢI' f/CPzxNF31g[a9if`Jad IS%j`H+Ry?]\C;6A^t广k, $U `@~~(g~[z!:`S̑&<:Jm{tYdthdӴݼ5+x,O*Z/xrEyFS.Ri(wj~wb ѴwTr'iv7EMLFkQLOqcDsHG(7x\XrMN>7Ŗ;N&< 귛cC$.sS$g5AmbGw ٛFz)?V sBa5&pLYE~R晔HzԀۂ9(Ѭ}8eN(w^I'S5д-f7nQ[t.f;i8!(xl0Xllu|dM0 3Q=[1Z@m@ǝuxDH޼ݿ.ؘ|n3%Q;SxIRD`}8{z7uo< ^~kC#ΓH[ sFablܷg$ 4dە%1Y| *|nrNFLLV&yp+! ԟm(yG+SmD;\&xcܱc۶۶m۶m۶w.\_~V=C> 0f0sˌsHx]rv]JFyW.uf=8bN)"X  ¦͉11CQ\l9OP`K1pPN0|i(l8,|)m6M~PrG79ϺngxABd3fl !3V ;痹u <_C|n}ڒ?PD1& k>=Pu&d'>TQJp.5rjgR>uڦs9U)6M'#@.dӖ)aҟkȤ`#:2Up7ʗ %:D:~1Ωdg*Z62E% 4e`EUBv_/Z}( WFW߱Ö9.x61nʵGGDT$#A_~ˉ2}x9BƟkA920&͇"^Z4RN=؇$ :cXsch#n$'h'M>σM' *Ѹe4=xdQÐC٨nAُV zTx'&:m&'KTD/+\#9s~HN+3FiYš IGMX @R3tJg$[*;4(VZGcqFD'!Emecz8W-*Q)1瀉 Bm@ۂ]y@VsQ˯.ש*dXf 'LpR3X^-M\Q(~PeIJG<2{4` RM8_@QL/!S81mRa_GoSr|[d#څb,Y :]rsrfKo#Eq'^u\[tVvo$AH@ScBaK9Ih\֙="Vxʫm<¯}Ex@fqƂ*09 5-r3'ˢ<@'1s?P+0g?u/R2XlO1 U΃}k~F4?ogCݺd0탗MM7F91FOMP$:18Onu-j~/b| };<;)hn6ockauiogպa~A46K7O [☩#_vtrܱrg -{#q}/b|{% E`:;[nl4SMJh󶁝{^h4ڨR0-ݔ(';8c+v]Mr} _L\_I>K nwsS⪌(0"pY` :& ]9$P8@y_sY_$+nT|(keE: lw`f/?co-ٳx~eZ  r,!H:3| 5,Onk:/u! TݺE߫i~ItogW[)!y։(rIG;p;?WBB^O{[F#7uJZ"`ިUI ?C$̅eQ۠QsF|xb'tr upx5k돎kxKx YR9鎊F5K0B9V—>pC4,!}a7jLS5qChȭ˿7Ԑw/I#rxMpmxR5hsAZN!)C Y/H=_vg-)`Wv^Vfd'kZ坎lwOA%s[;Q̒^$/8 +uަl.ߑ~ 6a6AtT*6*-H{ ;9c,%EI=lb/?k\gKj;O\Mo/_S~m'?<>Qn|X]=+-!@'Q3%+3(,ZCO\$[6 3% Wha^q>$o gI!PZm|9G[כhb13S?qaO2"3v:OQ% Y2}⋘b<$볽ɓ& *sKaaQ*L2 )G(#GWv[LSl7i5a "r&Z$+Uw}.]QuVn R{tyW4uqdj] @\GFzVh|qpuo ׎@5_0N_绰|xv^q{RI#kj!RE/P1ַB~PWlwYa ~JPZqkVD+h2'r( IjYf<%7陖8´ %lTV{WfCJE%9ܚ*%~S1pu PSk.JAW~E_ ס{ _:dTı)A(aSmp0ƪ:Dױ|No7@-.yJOH17Ozn8xB[ZsɠL/ޥ%ذHW?KV$ k6\jmyt3eb4QLHp4GW LZueOkFOf>[Fҏ[s^t>t42b|zҠ9: \TBeEr'¶fz-T?[L0{`xmǁUo[";|Z'3ȹ8өH`.-V2[BtYYJNVf x%S32Xt)ds_+o!KS"6Zhdc=XT;ӡ&&W}Սrzɜ,[yTK+bl5K!Ӛw1էTaҭt0YnPL떀vc !/m;io1\l 쉌 o}UҀ<ߤE!xDi>#J%J3nW쌙TjH3hv.;3C 7*+ Xzd[1^MM5*gGѴ|,G|~(o}lOCAI$+xO7OYh\N=531@9{'KZ,T'6T$@4 0-Blݼ0_q4Xpѓ/me- P^uE`'5R1  R jc,.>+1IL u ,\~7 nAiFT4.?TodQwV9:r!Wol` 8̶H˅9 tS7sYcAuPl$rt ѨCy yP@#es?& A{,0>PZ s*zMՑ30L"?B#ZB쵆nj../~xHEV",收zI˶i?(J5c=uYUN]}06pr!G%OJv/z7{Y15pbiӌ kTilʶ}}2SBef F^NT JVO=@K$%74l}q@>Z+MZKu/dg7EooHNHS׵+T(LLy`|]Z4~Q oP;+fW8"[p'>`2801)ЮT' &baj & <:`{</(5?Nۡ+TyGV85-k<_]7B{2QR:6j;nk}>~[=7lܲ;hr$N̝S[^;B+-_Y m3S7އNֹ~My$yx"ET&ķe, [IWb촄$oDdK4Pqד Wr%IHoFRU@w2J­էW=~ D~oY-bn *<{hQrYTi}J&/VVO5@'MK EZ-)31Wnnde98 /tBuSv;*$g<*+Y3BX)X|w}DGWj:'lRo\6k2j5saE3j<@7O8H6R &uE^t6lˋ!HUVQ䛮L֯N2Fdg0yyTݹg)#sQUF1ð%B]n[N:%%DC1@7<0R[yRx,Jkf7 C+ac錙y>; G̩ TBoC'p-8XQbͤI>ܭAadVuBba as_#Uߤ6_۹R"ٴئsBoo}<0zf9̑ZPO҄Y9W[DYPyT<~菋Pߨh̤//jwLj}l,hRKFyB^/6?hgB0;H#GosVf?q+D6!@lbƃlhV(6+ӱQwÕ|*QVJ4.=/۱XR6҂dG̸)9G3w;h^ Doű7!J b ޒּau13&MP֐M&Oה(Tx;̯%ʼn[iru"$" ECGMPV=dCf7*B8'd돀٠T$-t$`ҝN3M_|  A#O)+˱AKgi-kۢI?פyr 10+wQ4f&EyʤqgDE:oX>N1KdcB̊OzF՝qZݴIiJ.E$_Վm!A _i҆?<ϋh+\y}=26O̽+ !,C$]Uw7-hR7g$ lEzkO~jQG#&0;YP9C G?U#b:@}N4u45۶-DHkvsWԝzA nuP;q)-L&hJJNkfB5y^;j$=z_.ؤG @MGP7lŔ^0]V$e0*Wj\5b/NezmN_C k٦oR ҄ 4h4Kteo=|Z~7濐] k Ǯ $UM*=\CQsf+V/\}eȳ{7I{3+*.#a<0zy^;Z/LR#L cQ2(FH+A}*Gl]&ӅS?~2 ƚ~e+@e"oRW.& #y7cuӻ 3yJ@ɂ/2I$-TXtV_ &5$^7TZ)hg1"Wfr>h>OAH۶hDsj3LvH0yߏ't⬮0v2>mǰ $em!Hهܢk@l8 PWRX6q֯ \Ìo84K6M#^ޏfMU:e%wda-cR@+kn [980<[QU]tAD? \cGݫ6Q)d5JvoBҝ1K$tC| }H\tv '0吚Y'oW Fdm.chJ2;MZwa&0֤%ۭ= vHÜ ([G{n)ݓ. ɚČb c9h}}lL.Q?vyk*cN1lcu[ob;O"M×ی&x'1Gi/8 dZ#>V3/w㡭ঢ়u,w1 dZuiӁ~4f<٧VV{"oD6>1f킖9`UIl;U Ghu]98e݆5@(L6=H</UH }H  f#" 8f.豽FMM eZNnM[G=b?f9ĻKZKSʶFI \_'E#5P_ '*,2eWBh'B]7x疦)_XCH,{ڏ;g=%I^'@^G.k/*4d6>m ^Ô(JaԳHZ:ŷE-ȐnԭC}jQ_SF3@'.Bb4BvƳOG  b, !!-YEzd$Of2>báB]!S]K5XC2@͆[23̧w ֫ GS&T^lPa7=+EZHo:#& c痷RRM\ҟb:72$} $a 67UVof6W8/sߡw^-=iwNT &b\cxKyV#%frָJlݖ?1_$K w"qE*b::z.M|0uIb~`)7bF#s܇ [[sd}ZQ-!,Հ  E7QpZA[WQ8KGS[0E7AK9(f H_MfqRK) R3V0CJ:ɈxeR̔`Lۨ啭%lSE桘@pLߓD V""x$PoE o[h7ť* !O&2~mR6.mVZSR\ y$*+xf.?looHdZDcmOCߢ) 'qᒶn)Otݙ Oˑ {X}Bz/q#Uug#eގpHo %YH9IU]x "4yUQE )=Nu сnU<kSKϒLBճQ Gms E"~IJƿGp+(+5Z"KnHOAy,䕩ZC)l;P+ *ǚ<-t}mNtLښϤ*B N*3Uc,Lz( r.`t9G4l)gMOccT[߫~iq)qHhtndN+R,S4[]_"Kń Xۘ `>&4 g9ըyZhyr.ղوWLZ'w2gw4G ،Pu`iP)c"|1߰6sRhS/+`w3\&yȋ a= OK57?CE툨΀UHErjSUxճgVh]UH;\Rn&)Ƃ xq&]0:a UA4̻XsdRX5-$Z%m}^vT_3.ЛwOeeAǑn§{؎qʂ6O u:5+Z:1Ltt*,6'.sI릷%UZbZ(\J 7^` \^^&Advybwj[ԤyYRQu+h5=" tLr5X-e"cs; n" Y;u'7:#E1k@G͝73nλY-Vw2GII䦒[qwZ39݆^nMXO }%cY<܁:B6>rŷ=U\C}eB 4BB+XxJ8U߸V)*bʦIrjF4!|P'p䁿a:x<b̝"CMq1Q%0Jriu7|Zp 39Mtg2$m5uTvuE.Hrꇆ%gvB?RE~CIO/lhn`c)HM^bGW#|dΕ?"qC"u1 CΠ"MF5@8@}agAiF8^ĶLz$)zZT;HjJa);O̳:(s8YvhN_fh3-EYP~LHׅU5y~U_V\r=eh)pT)GsX8C>ߧ9yVϳyE[*0C~`ΉaCc<.k؈ ,G97v%&L;[̛ZR2 2@NӖ7?´vC'Zɺ>{I)MY]6wќ|Ӧ8}>G= :S-7%$A{,Hzݖ${kGVU | (hD,N%Ѕ*bQ+,d>g'IaE{Ned;FjU@3hZm Q=jj~^%j d9IF1u܌,Wr&>.0I6 9 {,}Qf3/;-ꔼALO'S A\h6SV):}O*ԄWJf3T8J{d0BYc}?a&GD h+C^'fEEi9fM*h`X"ܜ͋iZ41KtsoqgS{P} (GGL-*CM`a%$qGpoXnyZ ҂sqbKSai0Eo7vtʙuQuC&I×[1݄#3O>Mo)>neɉ 3My,j|:v9YV|f#P /01Q>f fb3j4!Ą@SysQ3!n/ Q8=ō^ L%f?p>p M`,2Nfr0%72dM&12xDJFWae'z'rSiID!] e֜F7xOˣ.0ͥ^ nyqV.60Sʏ1ڹi΁;KƎukSyvsjZ'_p Rr-Ech!BDvEN(u\׮;αC?sePa{Y|=^4)4]:fh*vC-z{/*Gt[EaDM,ܩͩ0=[fz:e;#<6ϫ͗,BjV}+yJ!=$ ae>1wBӜ~!쮡KT?m;8EA~6#t<(2ulw"EC|̈́, HAPss34Sbb"a%Q*nPP;xCeA<-'C/׎ |bc@⒅\AO 4R] 6S[C®бo@5-x R*|-UWl_/պgU/ֿdK)R̍+[tc}ē5 U$_J *hڌ7M[}qZi6W#qʲ)gKoת,[~^djevz[9u ۭsjUWl/6o6xTuwml~KU2I6.ckVgJ-Ln0|AZ.m.Iu&}?Ұ{RkV SPlj|9U@{Ϡ6 e"h/-nle4ᮯ\9aı\AI#%נ(rwrf qˏE]DeQ; ev| st %]*܂yn bT`&^Y'ɬp;IPt2o.#*̀10wjpppA84N:93]cI 28++RӉ#f7!?_AZt׏oZq.'=tDGoJkv8"\SO;W#"FW+XB]+\D,̕2;@? BwŒ܆#e^mI;Lmg9nw"E?YC4>)ĚL-ŋkr48yAY:t,DD'{٬$μ@R-O5Ss8ɹVY srUv6{t!y/A`4v9S_3u@&8o:R:;ǁm*anXRMy}k$KK۴~[eJ~wvT|[_,/gk9IP>p IqaK2^XE ͣVi蘾laDe) A֗4kr%R*eGEHU}[2߸"R ?HEmyG_;GN9C}`RSup4pTWWyB2E>ez,avjıDf%m!1s؄#q~.<(=/ K"q:61&yKD5esQv9XSCDe?܍ !̈́+4BԓOZB]CR:^04g.CBA#fё  Ua+A f I 3se*^i5*r[sҊ {5Qd$jmisSAV͏x!!nk"c4pɬ#GS B@N$r'1 ^0/!>[13CyErFOk NJB6694#T\V$Ҕ1X!`;i װGAw:sV;@F2r[ 1p0[F)&VXo lqEz ۑsc /_E umEɨW KxhGL^rrQof`XӎԒ:ڴp ?N{ULuUt~~Q\%2Es2"o&y \~+.ٍz}uvfx\ŰF*öozտ'-6i]&s-:p{Edytƙ};ޞa8Ϥ\5xG*.[FvNviںwt(yRIm`͵-ZEx=D;b]3%m!σO{@<ͫe}e7,};;x9Mֱ/P #*I"8F0Lu;5twg(z9њ@_÷c:2v= LXQ`nΥ^6PSS+Mرفv~@"aI G! a2f?rU?W"HHqwP 0GU(M {GG)Oy$p"esio4s)H;gpa]۶m۶m[m۶m۶mۘ;y4ie{!u30cGvvA E䣅RwxP\XʼnL\")S2Sˡu/a$0X hO+6@YpZZ.gR:fWo@"8uGyw!ZNU>au)#4NşN[f haiFTy\Zz؝'XY_TkO LXWU~"kwZ§^@#"o~dl]ʇӲ_r{-%. R3F)mͻY"FO*hcNy8;B&gָ| MaDT!Os4pjiݹCX5Q@?!jX[Oȣ7zul[DݍyQp |{e@?\ѮvLV:}>ӗFX]on*:]KIBL LMuxu5eʞ / >>EQ1ش Oɺs16Eaa1=ًxqcƠx ?E>LHJq"AQii8{BBu0Ӥ ]*7I"C)nXzQ"Kâ߲?8rx?x$'d=(#벜 p>μc#E]//e\e@KafzGv@G:sqSOawb;3;M%WʜEhP0m]"hkHi6E?^R$~bb7v)5b(gy/7EB"B|`䰉-d ˉ91`9n9=_'ݗY(5wN5-ѦfTt_nL72j)n8B &2E tў$u,l87 9Z=iM]ɜ3RGz[=X/N0%N獱%D,N$TQ(ȣMlnS7ZSj$3#;;ߒ! V5KTVq67OXYu%FSTjb)%$;}q**q56`W)zp♋,]ݼKk4QKx?{Ȍ“G -핺*xT|y3hpH{Kh`Cha:JZ4&C9R=XA)ɉɊUAɧӷQU YĈeEl뜊>j{0E-dM}>ątZpwK鸇&SiWU5[*@X~$Ǭ 5a`X<(DsG!=qeoڟ=]7~i9/{ToqڤWKt! ]_ohZ\96F92ה*hvb"_&(Xj{Ō]Qx8͐W8a1rZ4F;/]l#Za|n#?'t]@1q͹wXy0愊?ceZYKa%FIg܁w҉1=h9qԖq@j.jd5,Ot;$!@ڇ8A^бmJ4,.vegCz9> AD Ǯ:QqwOlJ"ڔv>f /ONזs/As`,-m'@i'S''ڣ+tK6#qL]S.*=땰|yвo Dp YW), -bh@Un.Ԍ~ =1+_7+"]muav":e겊\M)]od`lӢxݚnSګmwϠ=jD~J ʦyBjNqm@`kX vCA0p#LdJ;(-1 aTiMr+,^,FBW:kCr=#:|Hi*%b1Z\-7>EUrny!\sG-FaR*&d=TM& 眏u0@5JƼh y5@Z"Rix + Q|0/)`"V= q!FaHZXUC][YۊWjyJtdOў1.BLp 6yp+Rlu{+tlkZ\uF̮A0;kO՟S)[/,qIl"̞c,pZU<-㐾Cu,eYZ$P(gvlw&v(T {S_-#[COhxz*]\3P_u|qTrg)$rO$ڹ ;slI.`v0L /3[oOޤz?.ӁS7D,Ja̧wmŘ@5xBqP7G%S4#cj0,Y,3V!hZ@܊4YIEcXߪ{P).f(s#q⯳̝e::Eho@O1Vx0J/`'YALC,6n9NGɜ)PR5:d&cӞ ]>݃.+{ Wvٽd,{349Lw,|#ϻAϬfvOuP 0¥8&PW^+F$y+c?YM@Q\ 9|$w=2[V5-h\j Z*Z2<%(-=uX'?!0Xmh`lpTK[05Dn ,5N!`a|[D#$*P6̠\k%ϘhsJ 9 d]n #Ej'H9yQ)\ej/|,%,$g@̎\2BХ݄)MFN'Ho}ZQvI]X["ztZ3pz$G;WD4U;IzX3[jH{BS8 O3YU SÎ9QaYzYh >.O|id$]Qm/)/Mz}k*j=N h}.&O),)dZm:m^. zO[׭|)j6,wh[>p8=uXp4.i3>\emufB ~ Ö~_~:47o4Amݯ7P3ɀ0e]9,2pȀB㈥QN/א "t_̹[N?#ut#Je2LkҠpX)+ }rJ@_ ) HwSy~֧jѺi¨U+VyU>r9< 'N [("~j,V,RE9 ͆ïMC CjH8.Ъ2R46j&Zpy4 ouJB:f7L8F(|h=Pj:>"7['.y\uɹL$!IE7kk!t( 3C]o Wj]Ͽ00ܬٽ44M}֗TuMuϬ`.`_'k|0&[m8eGGGQwZ"2T맻t_"';('cIey3Ip5E GDqpjq0!AsR JO!oq\ӉQ}8Ȯ W/ZIr TD nKq c| ](C!H Ͼ]@i|jֿM, #{%[W%DJ˷52&6@ "ۅ!Y-3r#[2@[PG: ~Օ9RJF{e=R!{D:qr cبPA\ڗз[2y pg(*ga!xelzZw|2}bץixp[^<1Hʦ{pnTxey?rۨô3}@,R+SQ]Yf_vY,Z-4& pbrRlC 44 q@6.~TAtЧڷY~ #Ɛƭ ( n$tR5VyP(q]N_$rԆGB({pȆx&9.YQk[iNڄaCxYj fe#ܣ}Ʋ6S Hj%)<'[9¶UvUKiHA`Sx=DTlCKL;&F`T^g=*o\0@aFo?RFp)р-Ac)01!ú?KՁ*tUN-zR"IvP2!ݍmL~D=A(+o?e ]șF\z!_N$I*(RW.ڰu_ԦythMVgVSa}rs|[&"bm߆4?_^?̽h6+E&0!HbS';1;_d>A[E9]m9j 14lf4| C-'>4}3BMD4O^= YB yl K.j*bՖ޽Y m!xsY3)Ѧ*ʧ21럟inUDJKb0-2VUF.L^v㰡џW@ DMY<`WaV5#rr%zq M#QRQf㯮=PaEP1N $;y guxSU;ϕ9RMf}^?T>} , DTjEfp&/DQBҙj%`hx p0RKbMt314aei.O)h )f*,^lJ,0Zd*1ԉU0fO_neg#3ص|z5WOvM<\]MaWpf}Cy؇>DU6qOI ~ %̦I!3+:anҏ?a3fD h~(΋=$hhVvNp3Iãw&Y8l"li7KzUG0kJ䩂v 6jD$>"A&˲Aaɺ976Dmx, (fQ,] Tg~uX'$gCs-6| ]jpAv|/J3OqY᥍9-(Kܛ_8hGi 粚n jBtNTxtpW [2T03rPF@.HǗ!5ޤeiy1CL*;7[C۔'/ďJfؕ.B,1ͫ7m;fg{ܢ}rHLZ ] G0Vp.+[ik2bzKzBD|H@Yg/?NAo̚=72nߐ9Ie%cqsA5oG' ]=/3ľcfyi@)G!&ƍpjxB_W9='* ՉܴKgJygbL3FlPn(vVWUKYh$kB* L&#{psmx،( xq0_m8>ۥW @a)A5h4 w)v/JJ}Ƙ7G򂪓Lw/\T0O-+\<1;dB^`B-O=K"D~JǎmKcwoǑܷ=k$*D~FJ#â.s(RA4 yR KEw7N״\LFA_V_"zJD>TY=ƩKvl/]/LkMC^C#-2]"aiUn3ZRqZu8BÞuCSZUۡ Xjƹδfm,nߥv`=YzkCXwI!8!)s@ZDk JfFjɆ^L&ELX,yq"tRh8UST kDlԴ郓gmk\AnLqjc]^~1yo{`iUW:: |nvj Pߠ6N-".TU !)l3h10Ȇ?_Bˤ r--wCxو m]4&_~$fOYյI!;vzp2 n<)TZɈE]}#RnڳVYA/>4"b <.3 ]a&a+L#LPh!I̽<Sטr|T=N}&]#/BNb^@??>?WdJ3$9:4Cشlfl$'ZsqZVqz`iL193Ax~!B3BhX?V+Zb7+닌?RbȘGRD^uws9hLAG$*%+ j8x?ӴNLȒG`5?zaM(b^(;h;m`zh=8Cnre;&r-H`Tk/jd㉐7?vS׷CN|QY*[@QUX0kZJtP?i(rѝ ߻D_w O]$h<'stɕgo *+fDӰ˾rd/߫mX!u N޴?u]4K"D#$o Z&BZ&[}tV:n@8>?-<;r]$`u=+M"8 K8hW\z^SKmTUGNd~#L+ɾ>Kҍn$ *:5-UG:+cGJ/g[.d87~:Νۼ7h\8:|L1Br-6Rae|[߃4{iRGN}ʉB|ZqZcAJB";hmGrϏEGG'խ3Ҫ7:>_1+IFc0d rz_6τNl}Y9lch~wsvOtR toc)EVyZhkk#8onb9^P۶&N.tVNv#Sw"aB0zB*TJ&$HW1`^ǻsChv_$G,rq_lfnv'ON~OOzoDFcIW!lºO$2+]Zۡbˊ5s->˷*=FL2 k80`mw{w[`֊EįX)Q<*97<#ncnr+J^t "ߴLVvϿyGl]6!cj+'J%pIV7bUd9t~f:fJ7;%%mYwnqms~co8@XNI3gJQ凴7jW1E96DlB޾X8+,❘%"/}ƟjO O^Uغ+isiR-mŰ'x7ipeSC oZc[Ej68ڊ*jO{* lМ4N9VYٲh;8@CН8Y!$AJOPmҞZU20:G(@QIU 5K h`USD-b9ӗX"H8 H5ұCaJ Eks!ի#\M\"2.S~-[i#' 4蜄G߸lCy-u9Q2Gj^]kLP4 8>h1 RUu6ljq0h ֕]˨X8z6#e}ft9zI63h.'xK0!rBI2U*@ŵeitcЀt퀢WnJT&Q ` et+2&7?!nYDS ]ˏޱ7&61I*(Ёjݱįwҵ r+dI u٢7yoodž2PxdD^ٯن/:P^'җqb,~D%,H\*twDInqtH\hjad#g>ȟx/:?<4BiK*4> &Mhwyfy?I3 Β|+pq2mȣF|ǡpx{$HVb%ST>S)It_^qlDp} GZ8&E: q:l,`' z]YI0 \o ,\X ؝j=sXMR?8lܴRJs[Q` oWܺ]/ȩ vBP"lySCLv$ZwC {euGoH09/fϥPTsO+$Y$b.etc.&ÈNKb=ZQ;s8y8{E&}QXqe̹}Ēvد^u"G;_'׏`f)(ue&VxπNx;ΓR41O5P {sZIжǴ~3t=c}jr'kVk ؿtp. (ޏ "eww ckYpUöus<I9M ZAE=iֹI>_ ?}:wRB:A~]dp3hOL]Η&W )wq/~!_u?]X20ҁ2^&Q(#^ ڱ@~~Qui,6-oP{b|.9 BX4<㈸ՙ)Vb"-Z4aKm1H*uFȌ&W~\yғ\*2ZJ?z6R^nݎŁד[GIewCA8!i5l-c+[[jBf|9%mjT2xԾ;_+ 鉍33<|/rp9k5Fd8`p%BsQ呫sD t(e VΤn]$ =.m:}z.*!EL 7R1$$ U'㵈dsIbSUpL0(C|j$Z!`|73jݙLOb@>s%~j0yN~ '}S6QXgjSE9umvdаܛ+O* ۏU5VUTp=*G#'WDomŧ_I=ޙ ACͮLVG0RZ0ͣb/;ݰ s.pY*hQ@HjC0"_uŜd+d3D8i 1ktwX5dฑ^],4 _B>@6h^&SM'Kk9f M@ V*S8wm]|@sz酋688)Ki~F>] X˪-AjED1$ư"Rr)L3t7aI|?:$r27weVq7UiU/4PyGQWP:1]i0 ^~`aS3yS\xCR/b=F#&TՄ h&oGmXb@\WZlG2o'丛 ~$fF?^s{9YVm{M!UԠu<)"iUyBKLB>BԵ/na]Y4$ʘq eQWۜ~?~N J)kFR a[ۂs}1ALkh; LķW l'Lm͵zSU0)lg7HU3: aܻ_SS"B*C) |{gabh9YP @0^l–0n.lQWۮVlFONoC sN'CIh$:I^tVQSRׅڒyhA~Ht_]B]\tZT,i2 OV믆/ݝce|Wt۾dY8Bƒ5ˀ{P0\&}pOEޅ 85i3B1]F_H"̄t.3h,Tz1fcdPOrھq lac# zpȖU5&nQG1y=mǴI~b=dg͐:99ir$t9QAr*$b8}ᵫ-=>z)D쮯m4;翜 [#%=2E{ɷBBio.Or^㵃 sqC{nV MK5^brb XQ޷ 1?2ӀF ɏmlnQT^ʻ'lLNUV]b#_eWT. ~i~Qȱ\̎=jJ;FejߴpagK]uCZ̄gvM=wBGe ւX3cSTL8׌6)~>9!fIe֝S?P@;qdiL>:sD0._vWI'(UƶjQc-\*bG,Hޚf#$ fo!]q)c\5A@໑%J]&Sg̩X_s$L!}[!usUݤ+Q ȔȜke ~)'1;Z%\f%\SsγhWksSΊڿ6 67@c)w~Ysҟ*V><[[4=Y""5˟BG9ΙEܨnxX R? PG7A޾x)Ŷ*ZA :⓱XV3;$HU@ kUVZpラUHmq> *#d/xZ foذRM AθtWOoJ[4߫⪐' W[Zju44ze8{y.:FG|jSo9 qٙuG+}ZFou”y)Hzüۧ_PCm t=zmg;Ya?طWJ|J{S݌;ב=]&pph|9MOjY&dn1f}Nx&g&K ^0x eDXa eTpFC3q8lKa{¶>  dQ3I1=x8RwRMeG"%!@UpܓbR舍=/Cer!?2 `N|}=I[FQZtF2 ;R&YC^ק)^10\Г8.C \#l&)TG !N)/NO`94FNV7޸ww` AT]Qgk : 3*(胀s.SG㠉}k!Km\m$8[\?B:cYVr," LoykUY.ır .@褆a 7>3fZdbSn M뵩a4!%CT5$!]XYuoqT;2v&)) Y>BȎ)V/.> Yev @LrͲ;kc?Fm@'mu j↿2]3%me`ug-B=jKNtwp?ǔiB䂅SLs4T;OD*E '22+]`=3PfdXjgnz?=#x@DiR}cZ`pB E:W]CK/"f=^ zng z4)d[)cYl><%ӽ$Xjg!|:K$g9tҨh[js7 /stJPK3o 4PKk5:Q5assets/western.usrUT  n_ n_ n_ w@TГw@TГw@TГ+O-.I-+-.R(5304PH52041440c``e``ŀb(a?|PE<,אȃ#?`PKnӐVPK n5:Qj5assets/yoruba.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("YO", "Yoruba") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.yorubav5 .. "yoruba_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.yorubav5 .. "yoruba_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "custom_currency_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.NAIRA, }, { surface_id = "custom_currency_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, currency_type = si.currency_type.NAIRA, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.yorubav5 .. "yoruba_traits.trt.png" lng.statistic_alias = "yoruba" lng.categories[si.language.category.FASTSWITCH] = "yoruba" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.MIXINPUT] = "yoruba" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "yoruba" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qi9 9 !5assets/yoruba_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "eng_soft_qwerty_international_without_dict" local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local expand_long_press_inputs = kb.yoruba_full_qwerty_expand_long_press_input local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then alt_inputs = kb.eng_full_qwerty_alt_international else alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "englishgb_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q: : !5assets/yoruba_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local is_curve_mode = si.is_curve_layout() local is_wave_mode = si.is_wave_enabled() local template = "eng_soft_qwerty_international_without_dict" local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local expand_long_press_inputs = kb.yoruba_full_qwerty_expand_long_press_input local input_type = si.input_type() if not is_curve_mode and not is_wave_mode then alt_inputs = kb.eng_full_qwerty_alt_international else alt_inputs = kb.eng_full_qwerty_alt_curve_international shift_inputs = kb.eng_full_qwerty_shift_curve_international end local s = sf.new_full_keyboard( "englishgb_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.precise_input_type = si.input_mode.PRECISE s.default_nextword = false s.touch_to_save = true s.touch_correct = true s.on_curve = true s.on_wave = true s.smart_spacing = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_custom_currency s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q΋5assets/yoruba_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local traits = si.new_language_traits() local ct = common_traits traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "ā", "ą", "æ", "ç", "č", "ć", "è", "é", "ê", "ë", "ē", "ė", "ę", "ẹ", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "ọ", "ù", "û", "ü", "ú", "ū", "ñ", "ń", "ǹ", "ß", "ś", "š", "ÿ", "ÿ", "ž", "ź", "ż", "ĺ", "ľ", "ł", "ď", "đ", "ŕ", "ř", "ť", "ṣ", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Ā", "Ą", "Æ", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ē", "Ė", "Ę", "Ẹ", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "Ọ", "Ù", "Û", "Ü", "Ú", "Ū", "Ñ", "Ń", "Ǹ", "ß", "Ś", "Š", "Ÿ", "Ÿ", "Ž", "Ź", "Ż", "Ĺ", "Ľ", "Ł", "Ď", "Đ", "Ŕ", "Ř", "Ť", "Ṣ" } local accent_letter_dictionary = { [string.byte("a")] = "áà", [string.byte("i")] = "íì", [string.byte("u")] = "úù", [string.byte("n")] = "ńǹ", [string.byte("s")] = "ṣ", [string.byte("A")] = "ÁÀ", [string.byte("I")] = "ÍÌ", [string.byte("U")] = "ÚÙ", [string.byte("N")] = "ŃǸ", [string.byte("S")] = "Ṣ", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PK n5:QAkk5assets/zawgyi.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("MY", "Zawgyi") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty_no_prediction.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.zawgyiv5 .. "zawgyi_soft_qwerty1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.zawgyiv5 .. "zawgyi_soft_qwerty2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.DATE, }, { surface_id = pkg.zawgyiv5 .. "zawgyi_soft_qwertz1.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.zawgyiv5 .. "zawgyi_soft_qwertz2.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.zawgyiv5 .. "zawgyi_soft_qwertz3.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, { surface_id = pkg.zawgyiv5 .. "zawgyi_soft_qwertz4.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.DATE, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.DATE + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.zawgyiv5 .. "zawgyi_traits.trt.png" lng.statistic_alias = "zawgyi" lng.categories[si.language.category.FASTSWITCH] = "zawgyi" lng.categories[si.language.category.SUBTYPE] = "zawgyi" lng.categories[si.language.category.MIXINPUT] = "zawgyi" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "zawgyi" lng.categories[si.language.category.LAYOUT] = "zawgyi" lng.categories[si.language.category.SPEED] = "western" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.zawgyiv5 .. "zawgyi.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Q_9S  "5assets/zawgyi_soft_qwerty1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template local main_inputs = { {"၁", "၂", "၃", "၄", "၅", "၆", "၇", "၈", "၉", "၀",}, {"ဆ", "တ", "န", "မ", "အ", "ပ", "က", "င", "သ", "စ",}, {"ေ", "်", "ိ", "္", "ာ", "့", "ျ", "ု", "ူ", "း",}, {"ဖ", "ထ", "ခ", "လ", "ဘ", "ည", "ာ", "ယ",}, } local alt_inputs = { {"", "", "", "", "", "", "႐", "ၢ", "", "ဟ",}, {"ဈ", "", "", "", "", "", "", "", "ဦ", "",}, {"ၺ", "ၽ", "ႎ", "ႍ", "", "႕", "ႄ", "ႉ", "ဴ", "ဒ",}, {"ဇ", "ၳ", "ဃ", "ဠ", "ဝ", "၏", "ၚ", "။",}, } local expand_long_press_inputs = { {"1ၮ", "2", "3ဋၬ႗", "4", "5", "6", "7ရ႐", "8ဂၢ", "9", "0ဟ",}, {"ၦၧ", "ၱၲ", "ႏၷၯ", "ၼ", "ႊ", "ၸ", "႕ၠ", "ႈ", "ႆ", "ၰၥဏ",}, {"ဗဧ", "ွႇၽ", "ီႎ", "ႎႍႋၤႌ", "", "ံ႔႕", "ဲၾႃႄ", "ဒ", "ဓ", "ၵဒ",}, {"ဇၹၨ", "ၳၴဌ႒ၭ", "ဃၡၣ", "ဠႅ", "ဝၻ", "၏ဉ", "ၚါ၊", "။"}, } local shift_inputs = alt_inputs local input_type = si.input_type() template = "zawgyi_soft_qwerty_international" local s = sf.new_full_keyboard( "zawgyi_soft_qwerty1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.statistic_alias = "qwerty1" s.match_surface = pkg.zawgyiv5 .. "zawgyi_soft_qwerty2.sur.png" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.precise_input_type = si.input_mode.PREDICT + si.input_mode.OCEAN_PRECISE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.ocean_precise_input = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.OCEAN_PRECISE_INPUT, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = nil s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end if is_curve_mode then for i = 1, 1 do for j = 1, #main_inputs[i] do s.softkeys["sk_" .. i .. "_" .. j].on_slide_down = nil end end for i = 2, #main_inputs do for j = 1, #main_inputs[i] do s.softkeys["sk_" .. i .. "_" .. j].on_slide_up = nil end end end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_zawgyi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_my s.softkeys["Dot"] = ck.sk_dot_my s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QfL"5assets/zawgyi_soft_qwerty2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local is_curve_mode = si.is_curve_layout() local template local alt_inputs local main_inputs = { {"ဍ", "႑", "ဋ", "၎", "ဪ", "ဩ", "ရ", "ဂ", "ဧ", "ဟ",}, {"ဈ", "႒", "ဎ", "ဣ", "ဤ", "ႆ", "၌", "၍", "ဥ", "ဏ",}, {"ဗ", "ွ", "ီ", "ၤ", "ြ", "ံ", "ဲ", "ု", "ဓ", "ဒ",}, {"ဇ", "ဌ", "ဃ", "ဠ", "ဝ", "၏", "၊", "။",}, } local alt_inputs = { {"", "", "", "", "", "", "႐", "ၢ", "", "",}, {"ၦ","", "", "", "", "", "", "", "ဦ", "",}, {"ၺ", "ၽ", "ႎ", "ႍ", "", "႕", "ႄ", "ႉ", "ဴ", "ၵ",}, {"ၹ", "ၳ", "ဃ", "ဠ", "ဝ", "၏", "ၚ", "",}, } local shift_inputs = alt_inputs local input_type = si.input_type() template = "zawgyi_soft_qwerty_international" local s = sf.new_full_keyboard( "zawgyi_soft_qwerty2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.statistic_alias = "qwerty2" s.match_surface = pkg.zawgyiv5 .. "zawgyi_soft_qwerty1.sur.png" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.DATE s.precise_input_type = si.input_mode.PREDICT + si.input_mode.OCEAN_PRECISE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.ocean_precise_input = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.OCEAN_PRECISE_INPUT, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = nil s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end if is_curve_mode then for i = 1, 1 do for j = 1, #main_inputs[i] do s.softkeys["sk_" .. i .. "_" .. j].on_slide_down = nil end end for i = 2, #main_inputs do for j = 1, #main_inputs[i] do s.softkeys["sk_" .. i .. "_" .. j].on_slide_up = nil end end end function full_on_click_commit(sk, key_name) if si.handwrite_mask_visible() then si.set_handwrite_mask_auto(si.HANDWRITE_MASK_HIDE) end local n, str = si.get_text_before_cursor(2) local conversion_rule_str = "လြ" if n == 2 and str == conversion_rule_str then local precise_char_value = "ႊ" si.input_keycode(_G.config.L_KEYCODE_BACKSPACE) si.input_precise(precise_char_value, "", "", si.is_shift_pressed()) else si.input_precise(sk.main_input, key_name, sk.alt_input, si.is_shift_pressed()) end end local sk_3_2 = s.softkeys["sk_3_2"] sk_3_2.on_click = full_on_click_commit s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_zawgyi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_my s.softkeys["Dot"] = ck.sk_dot_my s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QN N "5assets/zawgyi_soft_qwertz1.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ts = si.tri_status local ca = si.candidates local is_curve_mode = si.is_curve_layout() local template local main_inputs = kb.zawgyi_full_qwertz_main1 local alt_inputs = nil local expand_long_press_inputs = nil local shift_inputs = alt_inputs local input_type = si.input_type() template = "zawgyi_soft_qwertz1_international" local s = sf.new_full_keyboard( "zawgyi_soft_qwertz1", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.statistic_alias = "qwertz1" s.match_surface = pkg.zawgyiv5 .. "zawgyi_soft_qwertz2.sur.png" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.precise_input_type = si.input_mode.PREDICT + si.input_mode.OCEAN_PRECISE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.ocean_precise_input = true s.explicit_strategy = nil s.extra_match_surfaces = { pkg.zawgyiv5 .. "zawgyi_soft_qwertz3.sur.png", pkg.zawgyiv5 .. "zawgyi_soft_qwertz4.sur.png" } s.inline_strategy = { si.inline_strategy.OCEAN_PRECISE_INPUT, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = nil s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end if is_curve_mode then for i = 1, 1 do for j = 1, #main_inputs[i] do s.softkeys["sk_" .. i .. "_" .. j].on_slide_down = nil end end for i = 2, #main_inputs do for j = 1, #main_inputs[i] do s.softkeys["sk_" .. i .. "_" .. j].on_slide_up = nil end end end sk_sur_change_to_num_zawgyi = si.new_softkey() sk_sur_change_to_num_zawgyi.main_title = "၁၂၃" sk_sur_change_to_num_zawgyi.on_click = function() si.change_surface_by_id(pkg.zawgyiv5 .. "zawgyi_soft_qwertz3.sur.png") end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_zawgyi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_my s.softkeys["Dot"] = ck.sk_dot_my s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_change"] = sk_sur_change_to_num_zawgyi s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q=vx x "5assets/zawgyi_soft_qwertz2.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ts = si.tri_status local ca = si.candidates local is_curve_mode = si.is_curve_layout() local template local main_inputs = kb.zawgyi_full_qwertz_main2 local alt_inputs = nil local expand_long_press_inputs = nil local shift_inputs = alt_inputs local input_type = si.input_type() template = "zawgyi_soft_qwertz2_international" local s = sf.new_full_keyboard( "zawgyi_soft_qwertz2", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.statistic_alias = "qwertz2" s.match_surface = pkg.zawgyiv5 .. "zawgyi_soft_qwertz1.sur.png" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.precise_input_type = si.input_mode.PREDICT + si.input_mode.OCEAN_PRECISE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.ocean_precise_input = true s.explicit_strategy = nil s.extra_match_surfaces = { pkg.zawgyiv5 .. "zawgyi_soft_qwertz3.sur.png", pkg.zawgyiv5 .. "zawgyi_soft_qwertz4.sur.png" } s.inline_strategy = { si.inline_strategy.OCEAN_PRECISE_INPUT, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = nil s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end if is_curve_mode then for i = 1, 1 do for j = 1, #main_inputs[i] do s.softkeys["sk_" .. i .. "_" .. j].on_slide_down = nil end end for i = 2, #main_inputs do for j = 1, #main_inputs[i] do s.softkeys["sk_" .. i .. "_" .. j].on_slide_up = nil end end end sk_sur_change_to_num_zawgyi = si.new_softkey() sk_sur_change_to_num_zawgyi.main_title = "၁၂၃" sk_sur_change_to_num_zawgyi.on_click = function() ts.set_tri_status(ts.SURLOCK, ts.NORMAL) si.change_surface_by_id(pkg.zawgyiv5 .. "zawgyi_soft_qwertz3.sur.png") end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_zawgyi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_my s.softkeys["Dot"] = ck.sk_dot_my s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_change"] = sk_sur_change_to_num_zawgyi s.sync_sk_lng = lc.sync_sk_lng return s PK n5:QNS S "5assets/zawgyi_soft_qwertz3.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ts = si.tri_status local ca = si.candidates local is_curve_mode = si.is_curve_layout() local template local main_inputs = kb.zawgyi_full_qwertz_main3 local alt_inputs = nil local expand_long_press_inputs = nil local shift_inputs = alt_inputs local input_type = si.input_type() template = "zawgyi_soft_qwertz3_international" local s = sf.new_full_keyboard( "zawgyi_soft_qwertz3", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.statistic_alias = "qwertz3" s.match_surface = pkg.zawgyiv5 .. "zawgyi_soft_qwertz4.sur.png" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.precise_input_type = si.input_mode.PREDICT + si.input_mode.OCEAN_PRECISE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.ocean_precise_input = true s.explicit_strategy = nil s.extra_match_surfaces = { pkg.zawgyiv5 .. "zawgyi_soft_qwertz1.sur.png", pkg.zawgyiv5 .. "zawgyi_soft_qwertz2.sur.png" } s.inline_strategy = { si.inline_strategy.OCEAN_PRECISE_INPUT, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = nil s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end if is_curve_mode then for i = 1, 1 do for j = 1, #main_inputs[i] do s.softkeys["sk_" .. i .. "_" .. j].on_slide_down = nil end end for i = 2, #main_inputs do for j = 1, #main_inputs[i] do s.softkeys["sk_" .. i .. "_" .. j].on_slide_up = nil end end end sk_sur_change_from_num_zawgyi = si.new_softkey() sk_sur_change_from_num_zawgyi.main_title = "ကခ" sk_sur_change_from_num_zawgyi.on_click = function() si.change_surface_by_id(pkg.zawgyiv5 .. "zawgyi_soft_qwertz1.sur.png") end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_zawgyi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_my s.softkeys["Dot"] = ck.sk_dot_my s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_change"] = sk_sur_change_from_num_zawgyi s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q} } "5assets/zawgyi_soft_qwertz4.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" require "packages" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local pkg = packages local ts = si.tri_status local ca = si.candidates local is_curve_mode = si.is_curve_layout() local template local main_inputs = kb.zawgyi_full_qwertz_main4 local alt_inputs = nil local expand_long_press_inputs = nil local shift_inputs = alt_inputs local input_type = si.input_type() template = "zawgyi_soft_qwertz4_international" local s = sf.new_full_keyboard( "zawgyi_soft_qwertz4", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3, expand_long_press_inputs) s.template = template s.statistic_alias = "qwertz4" s.match_surface = pkg.zawgyiv5 .. "zawgyi_soft_qwertz3.sur.png" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.DATE s.precise_input_type = si.input_mode.PREDICT + si.input_mode.OCEAN_PRECISE s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.on_curve = true s.ocean_precise_input = true s.explicit_strategy = nil s.extra_match_surfaces = { pkg.zawgyiv5 .. "zawgyi_soft_qwertz1.sur.png", pkg.zawgyiv5 .. "zawgyi_soft_qwertz2.sur.png" } s.inline_strategy = { si.inline_strategy.OCEAN_PRECISE_INPUT, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = nil s.after_load = function() si.set_setting_value(si.settings.AUTO_CORRECTION, false, si.settings_type.SETTING_BOOL) end if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end if is_curve_mode then for i = 1, 1 do for j = 1, #main_inputs[i] do s.softkeys["sk_" .. i .. "_" .. j].on_slide_down = nil end end for i = 2, #main_inputs do for j = 1, #main_inputs[i] do s.softkeys["sk_" .. i .. "_" .. j].on_slide_up = nil end end end sk_sur_change_from_num_zawgyi = si.new_softkey() sk_sur_change_from_num_zawgyi.main_title = "ကခ" sk_sur_change_from_num_zawgyi.on_click = function() ts.set_tri_status(ts.SURLOCK, ts.NORMAL) si.change_surface_by_id(pkg.zawgyiv5 .. "zawgyi_soft_qwertz1.sur.png") end s.softkeys["sk_sft"] = ck.sk_sft_sur s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_zawgyi s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_my s.softkeys["Dot"] = ck.sk_dot_my s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.softkeys["sk_change"] = sk_sur_change_from_num_zawgyi s.sync_sk_lng = lc.sync_sk_lng return s PK n5:Q5assets/zawgyi_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local ct = common_traits local traits = si.new_language_traits() traits.separator = " " traits.case_sensitive = false local a_code = 0x1000 local z_code = 0x109F local A_code = 0x1000 local Z_code = 0x109F local dot_code = si.u16code("။", 1) local comma_code = si.u16code("၊", 1) local special_lower_list = { } local special_upper_list = { } local accent_letter_dictionary = { } local append_seperators_list = { [string.byte(")")] = ")", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", [si.u16code("။", 1)] = "။", [si.u16code("၊", 1)] = "၊", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if c == dot_code or c == comma_code then return false end if traits.is_lower_case(c) then return true else return false end end function traits.is_output_character(c) if c == dot_code or c == comma_code then return false end local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) if c == dot_code or c == comma_code then return false end return ct.is_burmese_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) if c == dot_code or c == comma_code then return false end return ct.is_burmese_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) if c == dot_code or c == comma_code then return false end return ct.is_burmese_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_burmese_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_punctuation_character(c) if c == si.u16code("။", 1) or c == si.u16code("၊", 1) then return true end return false end return traits PK n5:Q"5assets/zhuyin_qwerty_layout.pngUT n_n_n_ WГWГWГㄅ 0 0 48 60 ㄉ 48 0 96 60 ˇ 96 0 144 60 ˋ 144 0 192 60 ㄓ 192 0 240 60 ˊ 240 0 288 60 ˙ 288 0 336 60 ㄚ 336 0 384 60 ㄞ 384 0 432 60 ㄢ 432 0 480 60 ㄆ 0 60 48 120 ㄊ 48 60 96 120 ㄍ 96 60 144 120 ㄐ 144 60 192 120 ㄔ 192 60 240 120 ㄗ 240 60 288 120 ㄧ 288 60 336 120 ㄛ 336 60 384 120 ㄟ 384 60 432 120 ㄣ 432 60 480 120 ㄇ 0 120 48 180 ㄋ 48 120 96 180 ㄎ 96 120 144 180 ㄑ 144 120 192 180 ㄕ 192 120 240 180 ㄘ 240 120 288 180 ㄨ 288 120 336 180 ㄜ 336 120 384 180 ㄠ 384 120 432 180 ㄤ 432 120 480 180 ㄈ 0 180 48 240 ㄌ 48 180 96 240 ㄏ 96 180 144 240 ㄒ 144 180 192 240 ㄖ 192 180 240 240 ㄙ 240 180 288 240 ㄩ 288 180 336 240 ㄝ 336 180 384 240 ㄡ 384 180 432 240 ㄥ 432 180 480 240 ㄦ 288 240 336 320 ˉ 144 240 240 320 PK n5:Q5?5assets/zulu.lng.pngUT n_n_n_ WГWГWГrequire "smartinput" require "packages" local si = smartinput local pkg = packages local lng = si.new_language("ZU", "Zulu") lng.on_load = function () local pi = si.pending_input local ts = si.tri_status while not pi.empty() do pi.delete_range() end ts.set_tri_status(ts.CAPSLOCK, ts.AUTO) end lng.surfaces = { --hard keyboard { surface_id = pkg.englishv5 .. "eng_hard_qwerty.sur.png", surface_type = si.surface_type.HARD_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --hard symbol { surface_id = "hard_symbol.sur.png", surface_type = si.surface_type.HARD_SYMBOL, surface_subtype = si.surface_subtype.KEYBOARD_HARD, }, --soft keyboard { surface_id = pkg.zuluv5 .. "zulu_soft_phonepad.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_PHONEPAD, }, { surface_id = pkg.zuluv5 .. "zulu_soft_tplus.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QW, }, { surface_id = pkg.zuluv5 .. "zulu_soft_tplus_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.QZ, }, { surface_id = pkg.zuluv5 .. "zulu_soft_tplus_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_TPLUS, surface_layout = si.surface_layout.AZ, }, { surface_id = pkg.zuluv5 .. "zulu_soft_qwertz.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.zuluv5 .. "zulu_soft_qwerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.QW, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, { surface_id = pkg.zuluv5 .. "zulu_soft_azerty.sur.png", surface_type = si.surface_type.SOFT_KEYBOARD, surface_subtype = si.surface_subtype.KEYBOARD_FULL, surface_layout = si.surface_layout.AZ, support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD, }, --soft symbol { surface_id = "smiley.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_grid.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.MATH, }, { surface_id = "eng_sym_keyboard1.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard2.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, { surface_id = "eng_sym_keyboard3.sur.png", surface_type = si.surface_type.SOFT_SYMBOL, }, --special mode { surface_id = "number_right.sur.png", --number from qwerty & tplus surface_type = si.surface_type.SOFT_SYMBOL, support_mode = si.context.NUMBER + si.context.MATH, }, { surface_id = "phone_special.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, support_mode = si.context.PHONE, }, --common surface { surface_id = "more.sur.png", surface_type = si.surface_type.SOFT_FULLCANDIDATE, }, { surface_id = "edit.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "clipboard.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "voice.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, { surface_id = "url_navigator.sur.png", surface_type = si.surface_type.SOFT_SPECIAL, }, } lng.support_mode = si.context.NUMBER + si.context.PHONE + si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD + si.context.MATH lng.support_keyboard = { si.keyboard_type.HARD_KEYBOARD, si.keyboard_type.SOFT_KEYBOARD } lng.traits = pkg.zuluv5 .. "zulu_traits.trt.png" lng.statistic_alias = "zulu" lng.categories[si.language.category.FASTSWITCH] = "zulu" lng.categories[si.language.category.SUBTYPE] = "western" lng.categories[si.language.category.CELLDICT] = "zulu" lng.categories[si.language.category.NEXTWORD] = "western" lng.categories[si.language.category.SPGETNEXTWORD] = "western" lng.categories[si.language.category.ADTLEARNING] = "western" lng.categories[si.language.category.USERWORD] = "western" lng.categories[si.language.category.LAYOUT] = "zulu" lng.categories[si.language.category.SPEED] = "western" lng.categories[si.language.category.SENTENCE] = "western" lng.categories[si.language.category.CLOUDINPUT] = "zulu" lng.dictionary = si.new_engine(si.dictionary.engine_type.OCEAN, si.dictionary.dict_type.WESTERN) lng.dictionary.files = { { file_name = pkg.zuluv5 .. "zulu.rom.png", file_type = si.dictionary.image_type.ROM, open_mode = si.file.READ, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, { file_name = "western.usr", file_type = si.dictionary.image_type.USR, open_mode = si.file.READWRITE, load_mode = si.dictionary.load_mode.MMAP_ARRAY, }, } lng.dictionary.backup = { { file_name = si.v4_usr_file.ENG_USR, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, { file_name = si.v4_usr_file.ENG_BAK, file_type = smartinput.dictionary.image_type.USR, file_tag = smartinput.dictionary.image_tag.VERSION4, open_mode = smartinput.file.READ }, } lng.get_traits = function () if not lng.loaded_traits then lng.loaded_traits = _G.dofile(lng.traits) end return lng.loaded_traits end return lng PK n5:Qq  5assets/zulu_soft_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_azerty_main local input_type = si.input_type() if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_azerty_email_uri_international" else template = "eng_soft_azerty_international" end alt_inputs = kb.eng_full_azerty_alt_international local s = sf.new_full_keyboard( "englishgb_soft_azerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "azerty" s.surface_layout = si.surface_layout.AZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QG!5assets/zulu_soft_phonepad.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_phonepad_keyboard( "englishgb_soft_phonepad", kb.eng_phonepad_main, kb.eng_phonepad_alt, si.TITLE_CASE.CHANGE, 7) s.template = "eng_soft_phonepad_international" s.statistic_alias = "phonepad" s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.resolve_mode = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "popup_revert_inline", "left_scroll", "typing_speed_bar", } local sk_2_4 = s.softkeys["sk_2_4"] sk_2_4.on_click = ck.sk_dict.on_click sk_2_4.on_slide_up= nil s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_cancel"] = ck.sk_cancel_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher ck.setup_emoji_list_eng(s) s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qezf   5assets/zulu_soft_qwerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwerty_main local input_type = si.input_type() if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international local s = sf.new_full_keyboard( "englishgb_soft_qwerty", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwerty" s.surface_layout = si.surface_layout.QW s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Qc  5assets/zulu_soft_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local template local alt_inputs local shift_inputs local main_inputs = kb.eng_full_qwertz_main local input_type = si.input_type() if input_type == si.context.URI or input_type == si.context.EMAIL then template = "eng_soft_qwerty_email_uri_international" else template = "eng_soft_qwerty_international" end alt_inputs = kb.eng_full_qwerty_alt_international local s = sf.new_full_keyboard( "englishgb_soft_qwertz", main_inputs, alt_inputs, shift_inputs, true, si.TITLE_CASE.CHANGE, 3) s.template = template s.statistic_alias = "qwertz" s.surface_layout = si.surface_layout.QZ s.support_mode = si.context.URI + si.context.EMAIL + si.context.DATE + si.context.PASSWORD s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.EXTENDED_CANDIDATE, si.inline_strategy.PRECISE_INPUT, si.inline_strategy.DEFAULT_CANDIDATE } s.additional_candidate = { source = si.additional_item_source.PRECISE, position = si.additional_item_position.FRONT } if input_type == si.context.URI or input_type == si.context.EMAIL then s.extra_elements = { "web_key", "typing_speed_bar", } else s.extra_elements = { "typing_speed_bar", } end s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_place"] = ck.sk_place s.softkeys["sk_email_uri"] = ck.sk_email_uri s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QO EE5assets/zulu_soft_tplus.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "englishgb_soft_tplus", kb.eng_tplus_qwerty_left, kb.eng_tplus_qwerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplus" s.surface_layout = si.surface_layout.QW s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q,RR%5assets/zulu_soft_tplus_azerty.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "englishgb_soft_tplus_azerty", kb.eng_tplus_azerty_left, kb.eng_tplus_azerty_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusazerty" s.surface_layout = si.surface_layout.AZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:QԹIRR%5assets/zulu_soft_tplus_qwertz.sur.pngUT n_n_n_ WГWГWГrequire "smartinput" require "keyboard" require "surface_factory" require "common_keys" require "lua_calls" local si = smartinput local kb = keyboard local sf = surface_factory local ck = common_keys local lc = lua_calls local s = sf.new_tplus_keyboard( "englishgb_soft_tplus_qwertz", kb.eng_tplus_qwertz_left, kb.eng_tplus_qwertz_right, kb.eng_tplus_qwerty_alt_international, si.TITLE_CASE.CHANGE, 3) s.template = "eng_soft_tplus_international" s.statistic_alias = "tplusqwertz" s.surface_layout = si.surface_layout.QZ s.default_nextword = true s.touch_to_save = true s.touch_correct = true s.explicit_strategy = nil s.inline_strategy = { si.inline_strategy.DEFAULT_CANDIDATE, si.inline_strategy.RANDOM_INLINE, } s.additional_candidate = { source = si.additional_item_source.RANDOM, position = si.additional_item_position.EMPTY } s.extra_elements = { "typing_speed_bar", } s.softkeys["sk_sft"] = ck.sk_sft s.softkeys["sk_mo"] = ck.sk_mo s.softkeys["sk_clear_candidate"] = ck.sk_clear_candidate s.softkeys["sk_edit"] = ck.sk_edit_eng s.softkeys["sk_clipboard"] = ck.sk_clipboard s.softkeys["sk_url"] = ck.sk_url_eng s.softkeys["sk_voice"] = ck.sk_voice_eng s.softkeys["sk_sp"] = ck.sk_sp_eng s.softkeys["sk_sur_change_to_smiley"] = ck.sk_sur_change_to_smiley s.softkeys["sk_smiley_open"] = ck.sk_smiley_open s.softkeys["sk_ent"] = ck.sk_ent_eng s.softkeys["sk_bk"] = ck.sk_bk_eng s.softkeys["sk_lng"] = ck.sk_lng_eng s.softkeys["sk_sym"] = ck.sk_sym_eng s.softkeys["Comma"] = ck.sk_comma_eng s.softkeys["Dot"] = ck.sk_dot_eng_inter s.softkeys["sk_quick_switcher"] = ck.sk_quick_switcher s.sync_sk_lng = lc.sync_sk_lng s.compound_word_input = lc.compound_word_input return s PK n5:Q2 5assets/zulu_traits.trt.pngUT n_n_n_ WГWГWГrequire "smartinput" require "common_traits" local si = smartinput local traits = si.new_language_traits() local ct = common_traits traits.separator = " " traits.case_sensitive = true local a_code = string.byte("a") local z_code = string.byte("z") local A_code = string.byte("A") local Z_code = string.byte("Z") local case_insensitive_letters = { "ß", } local function is_insensitive_letter(c) for i, v in ipairs(case_insensitive_letters) do if c == si.u16code(v, 1) then return true end end return false end local function is_number_letter(c) if c >= string.byte("0") and c <= string.byte("9") then return true end return false end local special_lower_list = { "à", "â", "á", "ã", "å", "ä", "ā", "ą", "æ", "ç", "č", "ć", "è", "é", "ê", "ë", "ē", "ė", "ę", "î", "ï", "í", "ì", "ī", "į", "ô", "ó", "ò", "õ", "ō", "ö", "œ", "ø", "ù", "û", "ü", "ú", "ū", "ñ", "ń", "ß", "ś", "š", "ÿ", "ÿ", "ž", "ź", "ż", "ĺ", "ľ", "ł", "ď", "đ", "ŕ", "ř", "ť", } local special_upper_list = { "À", "Â", "Á", "Ã", "Å", "Ä", "Ā", "Ą", "Æ", "Ç", "Č", "Ć", "È", "É", "Ê", "Ë", "Ē", "Ė", "Ę", "Î", "Ï", "Í", "Ì", "Ī", "Į", "Ô", "Ó", "Ò", "Õ", "Ō", "Ö", "Œ", "Ø", "Ù", "Û", "Ü", "Ú", "Ū", "Ñ", "Ń", "ß", "Ś", "Š", "Ÿ", "Ÿ", "Ž", "Ź", "Ż", "Ĺ", "Ľ", "Ł", "Ď", "Đ", "Ŕ", "Ř", "Ť", } local accent_letter_dictionary = { [string.byte("a")] = "äàâáãåāąæ", [string.byte("c")] = "çčć", [string.byte("e")] = "ëèéêēėę", [string.byte("i")] = "ïîíìīį", [string.byte("o")] = "öôóòõōœø", [string.byte("u")] = "üùûúū", [string.byte("n")] = "ñń", [string.byte("s")] = "ßśš", [string.byte("y")] = "ÿ", [string.byte("z")] = "žźż", [string.byte("l")] = "ĺľł", [string.byte("d")] = "ďđ", [string.byte("r")] = "ŕř", [string.byte("t")] = "ť", [string.byte("A")] = "ÄÀÂÁÃÅĀĄÆ", [string.byte("C")] = "ÇČĆ", [string.byte("E")] = "ËÈÉÊĒĖĘ", [string.byte("I")] = "ÏÎÍÌĪĮ", [string.byte("O")] = "ÖÔÓÒÕŌŒØ", [string.byte("U")] = "ÜÙÛÚŪ", [string.byte("N")] = "ÑŃ", [string.byte("S")] = "ߌŠ", [string.byte("Y")] = "Ÿ", [string.byte("Z")] = "ŽŹŻ", [string.byte("L")] = "ĹĽŁ", [string.byte("D")] = "ĎĐ", [string.byte("R")] = "ŔŘ", [string.byte("T")] = "Ť", } local append_seperators_list = { [string.byte(")")] = ")", [string.byte(":")] = ":", [string.byte(";")] = ";", [string.byte("!")] = "!", [string.byte("?")] = "?", [string.byte(".")] = ".", [string.byte(",")] = ",", } function traits.is_special_lower_case(c) for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_special_upper_case(c) for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return true end end return false end function traits.is_upper_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= A_code and char_code <= Z_code) or traits.is_special_upper_case(c) end function traits.is_lower_case(c) if is_insensitive_letter(c) then return false end local char_code = c return (char_code >= a_code and char_code <= z_code) or traits.is_special_lower_case(c) end function traits.is_input_character(c) if is_insensitive_letter(c) then return true end if traits.is_lower_case(c) then return true elseif is_number_letter(c) then return true else return false end end function traits.is_output_character(c) local char_code = c if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif char_code >= a_code and char_code <= z_code then return true elseif char_code >= A_code and char_code <= Z_code then return true else return false end end function traits.is_userword_character(c) return ct.is_latin_character(c) or (c < 127 and c ~= string.byte(" ") and c ~= string.byte("\n")) end function traits.to_upper_case(c) if c >= a_code and c <= z_code then return c - a_code + A_code else for i, v in ipairs(special_lower_list) do if c == si.u16code(v, 1) then return si.u16code(special_upper_list[i], 1) end end end return c end function traits.to_lower_case(c) if c >= A_code and c <= Z_code then return c - A_code + a_code else for i, v in ipairs(special_upper_list) do if c == si.u16code(v, 1) then return si.u16code(special_lower_list[i], 1) end end end return c end function traits.is_case_sensitive_character(c) if is_insensitive_letter(c) then return false end if traits.is_special_upper_case(c) then return true elseif traits.is_special_lower_case(c) then return true elseif c >= a_code and c <= z_code then return true elseif c >= A_code and c <= Z_code then return true else return false end end function traits.is_append_seperator(c) if append_seperators_list[c] ~= nil then return true end return false end function traits.is_no_append_when_eat_seperator(c) return false end function traits.is_word_begin_character(c) return true end function traits.is_word_middle_character(c) return false end function traits.is_ignore_when_candidate_empty(c) return false end function traits.get_accent_letters(c) return accent_letter_dictionary[c] end function traits.is_legal_character(c) if traits.is_userword_separator(c) or traits.is_append_seperator(c) or traits.is_output_character(c) or (c < 127 and c ~= string.byte("\n")) then return true else return false end end function traits.is_userword_separator(c) if c == string.byte(" ") or traits.is_append_seperator(c) then return true end return false end function traits.is_userword_begin_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_userword_end_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) end function traits.is_contact_character(c) return ct.is_latin_character(c) or (c >= string.byte("0") and c <= string.byte("9")) or c == string.byte(".") end function traits.is_no_append_prefix(c) if c == string.byte("'") or c == string.byte("-") then return true else return false end end return traits PKk5:Q5build-data.propertiesUT  n_ n_ n_ w@TГw@TГw@TГSMo WJd)jJc/YlU{ɮ8T9{ Ǝe0K 4rg+? .EGҡݣ fDsHоC',͊XVcẌ%*46k3V5aŭΚ3j0zAB\XS[N: Bʭ ̪%wX.$bB&&D@J.39/ʽCexYvVmqZt.#~; pJƚ7tS%vӝn,CQŎ:ɀ')O*.PW*)AZ27-H[|f6}F65 D%C*4՚0PSo)O X{ /b-gĥCXX. ze8G1j̢`[- ZvwM" WupR_&2Υ]}h]q-P A-6TL&-Xfg ߰&'z65Y_yU_ PKLwGPKk5:Q 5classes.dexUT  n_ n_ n_ w@TГw@TГw@TГ,V0D$DAtwJwwwwwwJw7n?o},̞̩ߠS vb{2g~^gH/7:E@@ ЩjxOQ6Kl-!0r P~dOބ@?~.8JA׈0(J)*RL`'}9QP  IEVJӔ6` [8 艃I@iӄ. c:8EA$% EF 0ɬd#JC|~'(MӉѬ$wyJԤA_II6 S0 b#'y;K4hMlc#(PJԦ-J/1m\67"& |ϯ$2RԤ)Q.-qHN&JB ӗLb ?'#]D7$IN S TA4%,r7˾dE&R,,Wy;O$d6 ưM4CF'M(@sƳ7DOO/f3rR2T%dc26 %Nc:0M߈1(#qIHRx<'\&=|4f XNrgDH@62U1gDqa"۸ERT.$V_-()B^ь f2KiO|wP 1I *Јnd*sYN.g.FT n9ĝ43 @N@,\uiKo1lWyG/%e4Sjp<#H)T汎 s2ԧ Yr5%tb3X*6s+5|bHrrВ.g߈IO.цbkp@z"H_d (F)5D&+`P 1G2Ґ"uE2&)LU3 3l0wxH1 2"!4 1dK1q =f YvqXEթG tbֲa|"\1y@Z%@ Ӛ b$9e| RqyC<b&udְmgmWD,Ib2D-iX_J|*l! H_d#%@uBS:ћg& Y&p-e&5yr8)FiH :ЃX1,gQq<[?$%39)H1JQ!&1b8|&m qIJ2"*4}4气_qǙEJ2uiH :ғa*YVs+5߈rW-t$A(hK73 `x3^(ubD$#N^JD z/#\=HOBbCP3tc3YFpۼџ)IғLb.{8^)J1Ҍ f*~Dx.IJz R ӇI,aK@ b4d0UIKz1,`5Np\.yg¿p%*C<$5,`9]|!K"HL 2hNK:ғf*Y.s<_$&5)JyjҀVtC4泂0]^~/rӊg8 6yJ7z HM6QtØ*Np&["'i泝\a|$;1#)iGEjӔtg9eW'YOIP&teXzs}3d0UGS:яq,`=]~KJPbY^.?RS`Z/2ֳs=?/$'3)Iѓa[9M_8HK6Q Zӕc8.sg%U#'EJF1Elfs3rQZӈ洦+=ÿ fX:vq!n 8j%{ݑ"JCp\?h78= )ip|?SX&8>13Вa #Jp\/wABRS 3<&J_T;˹c1wMa*Lc2M,ďYDQфtÙؒ4UAhGw/Ctlf'G8un ߕKbR(eLMB?C ==O/)gIBo S4 OHR$#ũB- 3l0 Ci5Hr2Ԡ!m0&8y—kl}E5O22T>&2(+IO PԢ1$Wy;"VvdGs:/c26sR%8'7%J(`&0UlKjpW$3)F%jLcZҁc$< '8U| PM}8$ (eL-BhB+:҃ e BVm 7|&BuuC,⑘?IKrQui@s҅ d\M+/x7!HJ*27y)Bi*Q`ӒtC$fc+{8).p{<5_S$"9iLN PrTiF:Ӌ gSbVg-;<&6IBJғ<AhA{їb"32ֲ$s3HE&/E(M%Ӟn c:).p{<5_G܉I\4d&'(N9R4 3a1s):A?0IdYVpS\:xk>u$"9iLN PrTiF:Ӌ gSbVg-;)H>$!%F S F=82Ŭb#;1r[<$w|%R$!%F S F=`F1l87xI())B51ЌL1d0UiL254pg$=D:2),0W/ Lr'|%f#,:M0氉K|Xg~#)I)*J;҇1e Y.s;)HGVrST:MBoF3Ŭb#;8MM[#1, %(O5Ҁ津 3,a5W#^o|LXvswy+>%1Aj2,UM(MiM'z/fl`;8.q<-_w?+td%7(ISC;҇AdәRְ]3TdoRT&4%N?0IdYVpS\:xk>|&&qIDrҐ8Jӌ6t82Ŭb#;1r[<$w|%RLlⓄ'y(L)*R тt/Df0ee 9Is< V>HvJP`Зb"3X.r=߷>d#)EEjD#ZОne0 泌la78yq'#[1#E)CejBZёg(c, #\+(eL-BhB+:҃ e BVm 7|&BGGb$-YEAJPjԥiKz3gsYj6?pD$߉M|d#)EEjD#ZОn c:Xs01)N L:Ӌ gSbVg-;$!%F S F=`F1gknq\.OxGuDST645ɿ c,S"V(gM|!b7?+td(ըKKz1c*sX*6 t#9)@EBiJW2c+Ǹ];:A4F_3`>Xvswy+>#?HM&rB5hDs:ҍ e2V4Wy+}/g8IJ ҐOqP%&- F0)g[1.p;<"|"[, /%(GejP&'L泔Ul`957|>X$ Cq*Q& x2,g-~r !y'kld";(K Ӓ.g$l0'M?HOVrQT#tg4$}^c7HF: A49mD1qLf&Y 3^z%39(DQPZИtc#df0E,g [9i.s'd"Dfl`G89.s{<5JTE)C(3fKYz}.=H>)KejP4A_ulf9Y.q{lF. QԦ4b$ ~od&JġjMГ~ d(f2Ŭ`QNq.xk> ?x$$)IOfrPb&43}F0c%{}^axSJtg$X^qǼ%0¯d 7(EyPPҊ> f|G#!HI(F29,c5[9]|&(G 2R&F#@F3#h&3)L Ptc, V- 95|1x$&C)jӊb;7D$#5Y(@Iӈ f&Xj6=g}D_T# (H)*P ӊ?Cx1%f3;8isk<=I:Q ZЁ g. YFvOLe GxJJ%-"OG u>dwV2{(E31m if|$ w*ђ,OaR f5Ǹ~F(C#z3!fqrR b 'yI9 i(qĘ,ˆ6(MkC<&|6X9>wڦh@q\2CqgZR9C&ІѬyb,$ ;l6s$[&mBFeHIћ)L24_&\qW1J&=K",!e Yh܅AuӉ9a'qh0hBG3U Q{d"/Ds&Zs 7?te si8ăԣ-}6=GQғl6/F jT]6%Fq&ũKG&>okI9юa,d{~켡6]Fp[̕BӃl2ՙ@jБIqStfcYAFz Aq29lf/yJCR(s%NY(@%ЕQex@]-(Jrvs+q<M 3yl8w(ſLf)yb&H0/ϝDN?tf03ydd Xv1r@M d%7%ISz1)g/yEH6 Ğ,TY8%Y%?T6pw:QДd5'Ic%#if+ qLf*ёl털ӈ>c KjT5Zvr/D=w gXQn>m ! =lggxO34%}}!1%JZR`'gx7JJ/1l0ywd5,Vc\>orHIS4fo ^IʟEBi sp89(GƳ .hXzE҇LbN E e:"n`.D] 8pn;R4d3YVn87 ;Jvp<? -xQIacn$ YIz)CT6/s)AsD@3Yn.pX ?AUуALb1GK=6S a yB'r$ՙ&%?-N;0po$|.H%љI o9JІ%pFR~,4㥚!z0 d1'yϯ͋eGyG7ja 8Q~iыY9Ʀ1=bp~S c5yK `6;AOj4g89KϾ(B(Y>Д B\qHh*Кl! 339g 06sCSf/w!BH 358ԡ52H!ы٬,]H >IHA.Jњ c*Y.DE_F(!d(͙js{<q %7O'3`78yQC)Hez0 wxK aXQn_/*ӊLc#[I!$#)BUЛLg1k1"F_&ŨO/氍 D!]^n9Mְ},x7~eoHJ:rQb 3X ?TCYp=b[+BiD9$dfqBHG&%/zg)gq́vLa'OI/$Ѐ!l*K+ƱċCSFo-$Ё<#ysd4L!L4șH|$IbBKư%!Ԣ8}b%gzn9)ASs3$hPdw. =X>!e۸)̓Lb)eH0aK@䯐@y:#r z q{E3F|#EZVLe O1]H 59)IeЂnc/d0]9 D ;E)K}Ʋ|B5#J&@zrSFt/Ø*p{)Ai*Je43XInY9)HRcXn.(Yl1}|p[$|6=T S3"$hF&C\%?d;G]Z3ilC S Ӟc1x7~ΩRZ` X"JR6 b2DQrT }Xf)%E3e6[9U]^yCVJS f:;8}>7QT4cXvrk k@( ֲ"Jg5Cқy'Td-Xs+ G Qfg Ki.󊨅Tm8V< ?6mLw1b+1nPTMmF3ElFyBi`M&UU}T-01eg/^F}#}h&7YE(5/ D *Bgư\%k:OG Z3%^{J чAeK"V$#3%E3 d5{9~7Tn.u͉" i@K1E|b=H J'Q XMЌC3=D U4d }bKGrjL*J ?L$Ișj^50x{DjP/~?=DmnL}1+RBg[kPl!RYWKvT&|{'5%]Xdi? d)u= 4+Y"t_Bh沆 ٞd0KKz0Y,a=GN_Ҕ\&VW{HF70<'nw6=BvsK<#JY iHKz3&ROϒBT"6qgK (I1%(az#)O}3&ǙC Q,:f+9O~5a!H] Y sLYc~(b [ra2g:D*jy2C e,yA򓞬oH6Y%Г F9)C+Fӄ}6AcRLgoI3Vg[MqN3&6@'p/`c7a$hMЗf58X-_ƚL!Rԡ#YQ{24;XNyOrHMNB0ild7xHcJ7ư3%q=x$7h8p9!OD+F3<%Is$-spK52 d,*NƏgJД^e8M><Atf8I.o$="fGҐ`3z@Sz1%$ω~~R*4Yfq;4"A7 q7D$ByZЛ._ItY_6NNRJHtfM$K>= 'ũFG0,e? Z!)K1SJԤ!mpW[<#9)HC:0u*wکB33\ q_JP&a Y nw9(BeiA{1y̟$')M%7f>X >KY2l|+q!(BӅ!La.9u^򞈏͙L沝C\5=Q 8汆C=ўR:0:oL MBhK?* ^zHN6JB?m\ [j҈Vt{"/$!-EL#ZыWy;½u_'iT$x'iLWƱ^S,a L0sK$G''eiB4d[xAM?6o_$սѾQ;YD LGz1),ag{ B:фNeX..M@2 Qzdk8 ~`4SRr/14tb"3X6vsĈBMz3#߅~ 5hrDHBN*ђ1,cyO(C0=Z.{e 6r{|&N$"#K!SJԤ iNk:҃ eyI<$b&9NfStfX@*ќtc0^=5JԦ=2㇬MRrRta$3XNr+f$oRvg}^cKxGSǴәE>R8h },qD/(@L-3Y"7yMBr xE¡d&/(I\6r%r "T5#FNq@QKnJSte"k8#-)L}іe(SXzvp\9Q_Ғ43d泔=o$%iBn S T'&8沒M0'9nRI G{ue5SVTxQ -ΥciX;`9sΙ1H=1qYo1%~y enA!9*8Mr?Q4#nn<2+Đ5R4-2vrh=o(EYёLb>[9}TkwRp:2=[ӕ,`/#s1?S`wH]ӹ1%kDЏl_[|4,6q$”: &=.yCbhJf"~^BAБLf[9bT9vqh/L 9iD6>{~45ilq'PgsnC! b+!yL ~,4cv.ř|EQJSZ43#Vr% ͗!4)"Yn% QO$8O!/jќc8m^nDqjӞ,H4L5ix˼ p$y?#Y~. #%N+2&H,6r$%DijҒa,f{ҎVkJZ2% 83P4- ֲK9) Sd"9-qb"&mW텤#'#PNd$c '=č$&%|I!R@uRf=h3%%\6yI0:td ojф p1aq \OyE0Q iF^ ?+R T&!ԧmL/31Lf+s\.=I=d'/?PJT.hB+:ѝ c S 6Ü";<'d{iB.>3'~*QVt'$沌 57┥*45@F4Mǹ]||Mi0l(!40e+X~n$0!=d5ړo)Im+Vq̔/ )?f,LY֑ tckb7[|G *Ґa63bq ;?RӆtcRswd C9ӗYbGx{ϓd b(0_Д mlI:/XQd=JcyBz&dq[$\)AsF;X 󞏗'g!yE3hPfs+C0< J̿DЉe#ǹMU/:cs)w1N2 ZIuֆߨC&S<%zR0117ŨC'Ʊ<$FP01 &uE-:0K91CY|},L`Qަ@{fqōe<[xCC}XIސu>@[ܥ)K& -$lLvs{_ʴe:M}rߩMW&$/O)N}0\规3%*ڷ46s8Kz'>^hv)CЌ,TDưSĐT cX)bu*ц11d|:h8s81zŨri^tggIZ^Re R6ԡ?9Kw(Nza5 S +KB!h$qBc 77$(Akf$~Д o?$:b!s',,(0$ 6qDB(G;KD0%i |sIh rL|A9Z1 9EC7+$L2e9R75d'ӟEY u< AWfsdLR^0OH8QLe7I򅺢 -Zԓ(F=<#CM3}<"WQo될"Y%cc[Io$} >N3>$(BSƲEorw|^CsƱۤ)d2U\"O!S2D0%/bG Đܧ JE\'l>gt`>H\TDsfrč^ Mc yN&ֆ\ cSgW_HPe{XCPGta=/e9r6Ln`8yJv!AuVoۇ-DւutΠKNN@6{X+>2(Њ7Ӕ!}_5Fw"̅+|_gqqzdhlLI+ Sd^ ΑfMwvlOKsüM.b7Gu?F'l2vd+0='Xsy@q8r^S8ҙC$7I73$O@e 4هܡT&\pluI:ý*tVb"h9d6ys]\{+'ߨ_GI,X3 lvg9we}dݪwFvp;)[HSgfp}Eܧcg)W9N}e&(_OpZ;.!g2R9'=! Qk"~Jte N>Y39 GRWYN;09c? 3Lzac7pN^1<&y3}Ļ c*'xKz= \ҳaEO'Ƙ ޒxJD ͙K4@0M=y!-5Nfp\L ){p$}0&EiX6MΤT 9;?2cH~@'fsdybLҟ%'SXE4ImB .=U$926-X ԗJ/yBO;֒=YmRtb/`([yGޣ?[yI 4(Ek&sBb>'H;4V,*U^ ѐ\$}w|?4hBn;AhP>_&-p$taI6b$IhP Q3Z|,4x?yhP\ ~kZqb)CdN[@РW!MhЉ64r 0H/f83%hR.!ch78ALAUCP&rYĀ,)EiBP 0n-h,#?yg9=4N. Im@|"AEƱW|?KƂriL?M/CO)K[&|ӝE棯œ'7Hc&s$64эI4I]hOof^L(D%Z3eIP#]d5yHߨEư'q!P:ta"k9SR$(E=F?t`xB_B_i(6q4 ehBfd*V.MJPNc%GO⢡ -|vrWջ0j󐤿yEF1*Ѓ&^Р bDh `F?Q6f%xH?!5.bgh'rxERI-1%yi9˿`k9;r%9CQ.Le'7I^_4c9o2+dWЗ< wYGqʩo$*oe>IZA8MŠg.H^I|hH$yE֜, x,Ii0s$&iBI]]_)8[>ی0j+ӗDP 9j[{Z3c:YYUf kFcrz7-Y r90mp9Dfr~"K=k`v<%NBorjh,-J!S#kDu0\"h]f.4q"Ԣ SU6Q0$bA "vsͬ7hrǤm|KZ1՜Y[Ԡ %,R"Ԣ ebROݘvwB,vqmB|'b7HVPzeCvr?i@汏;$n/6A}1%yhs:Ҍa,8OIɹr`9St ,24]\<l];xr2uTEޑ*ZL=`۸HW~RLgT 9} +~$Kc҃cYNq;<'*gM2O_ʄЄv e68-t`0IPd#]uDiѝ,cWxM8~*ݙ.hO$[/ёl:Cԡ'3m#1Y1᨜2f{LNRza;FrԥSEr"ԦSEޑs)UiXVsE딥Pltd{xD3bE8YYbu.4&\2]!鼵!,,q.o% \wzd'GhsxLl_q.`xCz3XIސDCsnd)ov^\{C)1\ CJьQ,01dFCF$+ 9K $/G eKBs&sW{GӝŜ'#pBf$"$O9,\OxvL0 \#sgyON['d.0U\$KtfxAWiP氍 kߩNKdy#Mwf;${۔%YYޓ1N_p'{/T#EbaA~'H+,f,8O؞wtq‚oHkF(^*nX)ũM{F=\-⹏DЕ7H?,(H3$Y ӎIl#UTvq‚/H;L9Й.) M62XRDK|ğ4f0 9]$ >ݘ~42N)ÂD[ư }*s1yS9ʴb( U>Id1$K|KMJ ]Y Qf ҕi&I2ZsЊql$‚4/SYq?=eOO&"qs4M2xEaAaBpGyJW&tI|aA:H^0D0KdX)r|b, a&~jY?KL4?WG e7 GW6_ 'xC/!+Z-ӗ$FvoÂbc7 2\e2CGӆ\%s!a Q),>l&fqX{:,cIU$,(EO6ӻ=*j,9~76pg?ҜHv'd*8KM3DrrK'җzIGX9ivqt/Ԧ7 8F J ` 'yMr f9yGĝF c~Ni1Duο4c:lj_ƺR^lIGVqde}JS^Lc3O^C$HP^%sF bEv+YpdYjҍ+#њqlqx%:$,0H\-,G1B6rU7?!}6.5>n8uSRՒDS)?PԵ0ېݘA9T$, љE.YqESZ1!u=cJ 9 uv5=dkoЅ<@#=5 ӓ"kIqMkO}`pdͬ# {:y gz8- !`?q[eZ0s$n @8JFo?&q$m4gyGa8I'b>H:Ӕ:3"Q'Q=;#Y B]05l-zX?z[d} a3>66IhXL~z'ͤJnsa3σp7CÂ_6 ~)73꘳d>KQtqI\JwVg'f9$o#S$TӴeQ$`}YCM`+O;r^dc7ɦsRN ~KxAi\#tV Ig2#棙Occ<#,5OU:2-\!l$ "f&T$S^ڳ{gԡ/׿h8pT ̃b.yHb*юH6r8̕4` K8 2-6ә)l sF f xFDU:2-\!2)MS%rN]z2=! 24g$8{wНM*=IyV3c5ֈ,k|?F$:'~tfQ97P dH;(BgRnb?H->Ko/>C+><DCp$ĀiMFs7ă.,&YnetgwqKӛu< mg|xV]}%Rg, Xc"0q! q1тUJ:QxPD dKMWM$)!VR6C#r% Ҝli@VoRӸw)}=<'O:2(mjП\#u0 nC l҅FoBÃ,y2X'hd4ndTgYN^e9;>T'KHl1%v ?К.ir?RHN/Aƒblj_ܨ6q,K?.a&wƒvl%}Y2~Kà g3/(q0=JٗA}frR c7kd&<>l)b]x=R~i:b 4g6IcxPq\$W!k,^R's8~v9_+xÃ&L#E8e2ϺЕ!gmmo?y@6bh6p$mŌtayFvzj.SLe>A(XiA>%l6:;jЃ9Y; b9gJь1l*TSMwSwAC0'ew-r=%)#Yyzh pd%'EwOz=Ʋd#4d$9{~kYYۄ2m<"G, i蛴b 5й% gUznzp6rC5g$Cj1fhd4Nyƌa+wI?R>#MRe0kBDm$_R, q)O'fq?т Ǜ3z<ҷE_p|={XsYD7əLb'H;zQ,&w|0Ei8pSiӃy%9sic80!qfJopx<Njڣ;ygs5Lf/O>W.Ђ);͈d':iF$;yHrƌa+ovd(+9KE0t ;~\"oY}>^N9/{Brˍis+g) VZo%l6)V?JWfq'dZ ?K-y֘M:IV?,mrXQn Oɼ^rw`ip8(M3Fho cWIYP6L`+HER~,Xu2oSdtdIþC#$Lez0%T "n}YeO҈Hv{-d9IOOG;d< itv=3&! `WH}X/>c 1.z=*FgAc ڠ&X%P3-'I!# GY/Z0(^|6=^?0qg?(OKF<#Y)OKF 9"*xAS֌f5yC ta۹F‹4]^OQ `>Kh)EC0'e_4eK9cR_q&*NW dpXל/tg۸BRLcWsy,2o+=Y]27|z[2c+kyDz ^ܣ>XU޷_S8o@iA$۹Kڇ#0%#gxA`0M"6}Y)b=W)C; ?K9MDۤzBM%[QL`yKSNLb3~e)J1\&kԡSebqԡSUg]S 1Y<-rAD5hs:hs:h2I'"e gyMOTouсHs7d:5D6r AD"Ԣ L4AB)B-0\"H:EE&K]d/ID9gxKdA:2#%_r?#<"e )XIbȜRlA'& #{jЉlAjsd6s &.i#Ԥ3B4Ed6q#?V^c5+x#:y2 8CASF$|F93%ɳz7ѕE5EiZf*1X9" 9%sFy߹ 6 k^y |4f#֘a\|^R~$?ڰ8G2$"h"^S(>Dr\EuQ><"a}9HA(HeDЊJ8ć_G8Go|}d}#0V}GQ\V_]DTJ:Sn Ys\;{wfΜsfj Tc>/80OTXFt^Qs|/,\#͟j]$+a_ błùFY~*a%ł\9W a1R680D+'[*$K`-+$MB/e XYUI)K"O5fV.֓Z#vwTm Q>U2ו !K@?bNd'|&2 %6a8g&e<#cSk`:2X03$ b H( =b?qY[hnLr-6_Z#&r䭬%Ekqc'IFuR<3O5RegIibMG1 Sp 'X=hLc8@']9Z2]<&ew#ql>_pg)m !XuM?q@o5taGxͷ}Z.s$~CK/ߨA/q8@_#38+ 'Z2Ҏٜ#iqD?R0F'ag6cA=ԥ4IryIy\vr|u,8JbG׃!>~dw4N}8Kf.Hxi|.m9soxCOmFOd`., .z^%Jm2\#pY|)?d۹F)?d۹F  X UsX^I>;=Yybݰ'P6s7A"xϷdK8vO"Ql*1%#X ;m|vpH|4Y1(fn.YiCs@$1TSQLO|^S`6p~38~y|/+L"KHKfs__-9~OLm2V<5Hַurs.*&r_+~Lc|6$P,%Z3Sκib29҇!,?_H` ;?1}D{z0#rBiLg{Akr ӑ\勌!ta97II,jא_a=796~ a/)X0]$"?!bd5W:{&abf #+O?BY ~e7H;I ?;De=oə9y("I?$Ђ5#gg6H\҅B(l%9C?ۤ.`EoVrż b WW<$ f7HP"$ e7HT2$ e׈W{@Vq8 .ڣ6Y2?k$(g.`pxI]˘e L Ƥ6YEbTT7 9SRmTEu@>jӕ)l> *O=D$AUei Vp|](M:19l8w@j Q%IT=$?Qff"{AG1EikAҍɬ9jW&׵CMY-Qc#OIWWjD!*LWF2 󏳗:4s$OR.Lg3xMҟlg+8GF!g,84vnSd*9+674e,;xDʦzh 泋Hޓ%8$Єp>ADuQ" .1%AS:cX~|5DMe:]ak+fKIEF{h,)Qs4;E;1WT!f.T>a `6wt摇 d wr>Ёy$οtf<&VgYKI vr{D#;%Isz2yDp fW{OF PFtd09Kv##ALa9;9=Hݽ-S%=.^dSd, a"yF&%h(,}ā\%i_A-z2g="[ӹEu&@y$_9v`yI_rC K$j`: ,!c@z#OjA&h[HxCi>g)8=$ІE\ IƱ|?:r"I8K'pf;nlL8W<=v$A11< G;fqOdZ dHh&wd[X},56KyFe7&?/V8!bWa;AĎ.,?v&0#Xcf kFF`#IN ]73'eyȗ`s`HI,-o6& ڢ0$*oi&7enffrvȽӾp<nBcsM^<6}9 fH 쀵Ҏ%A&p_W`;~Ep/ XE4gS4` ݟHH}BK$Ik%9g~?e6ig =XU<-Ycҟu'`ꜵОٜ3w&0<$Tr]L".L.l?y_?g3o#R1| UKOpຽ#=hD76X%rO-n{7 +Ù*vs{'}t` Aw'oӃQf-׈O!/Gk0Dp+<%辳E)=\9HBKF=\q]rSb>[8+=2W QL$<%cInАLg=WyN'-T Ør꜡(d>8S?_| md[D}# 7 Qa:xBIE9B,pBQn4>;)M[2e o"BET|Y.A4g5KIJ6R48+(D}zĈY1 "~\=v-^hG*ҍD3xP~,:Jte!g $ N5:3C<&I/. .WCVf I$4/`/yEEЕ,`+yDdKUZ3<'Y6p<:LvpWNHKVJә9,']6OhMh5\3? -T"8m҆Q֌b6k9#};ab |'7BYӇpVr;҅!iLF]\5ɾ FQ*1L 돡286r+&Qd%/RK/Ʋ]6HSh 5)ӅI47xM r__4Y@{9CbLd!ũD+2<ψ d!\ְK<&AF}?(EceKE3Ӆq$ISg(sIu"Ԡ9}:rK\>2,YWu汑51R3Y(HeBGRKF0ɬg+ubs@Sql9x4%m6ޑ>/XiQ#ya;=>?=YO)&aSXvq'(B]3DK1jљ`')  3@z0E$HbT#e  !E)=BԦYIBaZ3YYƹA1*ӌ MX\.ω].4_g9}^sI%B,s?,,6kRVP>"rRF d!'xMuhG72,c=1+So*aJН cޓz$'X!.pǤ w]s;X6saBC yCwĬ)Ba*QӖ^L`:KN$Wd8i(Vs&qmyGIВe*)8uԢ5d6qĮ+g)HIjБLe6Kub3wrPz}3 Q$J]\V:/y!7UhM&(WxDgBԡt\ωoP~ UL6q7$o$B(]g [9Ut5x=JrWi(C;f <`#Qte 9#Bg8 >=L.(沔<#z3kCB$ uhPVq$B}#)J P:_z1%NKT~!/eC z0 1IoS*Мa,fxD)Y@'9cS0z1ewyOj,$(b[ Rђtc YnpWk/Ɵ4% V\%):eT9{FL'Ӽ!m'5AQ4%]D1s~0BmBP9A5T#7xH.j?(Gz3=)QZa 9^e7gU8氂5/ t|ɷd";%iB IoR QC30ya7$IO<UG0L2Elb'9\7B Br<%Zo'#(Auz0%l ǝ,(泉\ KJP津7ӈ(xF~(2T'N b 8%X=/ҞLg [95n`d4b"8E^;P┥]d"|1HQ괢&r'|$`9-rWDtQ$f;9UH=TR2T14#\!=Lmܔ dV~N$9 PъNg$G'G?(?a!"y+F2?@}Zџq4I2YBf RPhk1ƈL}Z҅ALf!n?V㬉 nb ۹Hc;Y9NPL8OI2QN4X.q-&c~.2rDziCW0m9ٚBqjњ^Ld9xO)Guz<I:)4+!wOE3\%tJҏ9> gYFp'S6`QsJAʰS%lk"=y)pVs<9Kk$s JS*',r"<9F1\ 25d.9,.RIcҝ^c(c:rH#"Zҏ,g7xGjBTZЅa`9O$D%$# ?SԦ-YnNs|^P:g,g'S-SO#B=1y&]N>Q:Y@;9B7$6fUTdipKDw~JQӁ.A+PT%\V}xHר/FSe06s< =B&Q4+C6s< yL, P1l47yFz.iHVP4%mpSa(S8Y8(tvşbI_!?iL氖}\ωY/" hH6s/xag17USdLmr }"I]Ҝpֳ<%q%)L%ӑAL`% ;́_(LЁa M>]j>,.)w1$ܣ4沄 \x{{;?Qj4'g!;8]XlG.ѐ0z1"ψ_%'hDG3U,oP|/B6\%3E(G}яpVrD!=4e0#ZqG3I ~$;g['b9=Շ(@氉+D"/`氊=\)A͙_(HuЋ٬d/x+>9IqQ֌f89^(JuBN8k9MHvJ"h f OC2Qѓ,dx_(DщpkDS4;X.n4̛t% I Q4/SY~.rw|sݛ?H-Ӊl&zѝ1,dyFK_@:җY,e7Wxe3!a"yNJԣ5}Bvr'ļe-4Vc\owd$i@{0c#'s+i@+Ʋ=>osX/ӓɬd/yL=)K]:2E"xOMQ2=#{LJ7uiC?YnPԣ|ֳ%3CIЂ~g.8M#ctdsED=Pzd#;8M^OF!QF;"6r{| 3ȷd$(AUщ!Lg%>Z;~hN28WxEo@Qƴg YE\ Hʽ&泃D9'Ԥ=] ֱs<%k=" `X3yBF3 11T5YNg5PUl(Kw?2??'CJvrH^+JD32,g;9 ޓWrP c |>d <3_oO 2rdut"u^0HO*L{1El7xg~wSЃa`/WS HIvPLf9{~(@ij3YDp1NYqč4X!"HXǟԡX>^br0fsDEkd"nX #J3b?yGxa?,%ω"]P009l`/WyG҄bԥ;YvNrJdNo3M 2' hGopOdLbjn.iX 'Is:3٬dGS'[TeKY_P`'a@fӊql&R~y|i&g3Xv9<5iD;06OHJRz3qnL.Pk3YEҥ &0E@o"9(K-z0a 8R dOBlvq@ZcRԡ)#:۰7d +5iP8>/,eh`+<'GV R4}rp731$ RIOF PrT-D_3l8WxSW St7bV'͏Ԥ7rRT.iE_™bVr<3_$_O1StatV2y{gG~4!ta8si7D9,o@.JP:476r|JrQjӇLb+~p{ fư@<'rSڴe(;xCLC.Sf9}H#>fWxC߼ԧ7w5N~LƱ!(:%3Ck1 1=PڴbY!+Ls3,3> :{PZ4= VK)V:tbX (H(c4/HCӊ,4S/7UCcZЉ c"Xj6\!skPLcgxNO#X1n T#CYqnyŁԦ3cX..Ote ;Gj4b3e#CW[|懂a"ԣYiPXgØV.$iHq|?0Udv$Eܵ)K zQ-,ְg,&)?e;AbI!B"q[/A<6s))(O:r(_! `;IPm:e&=YF.o˺P1l,xIr|iD+3YayBғԡ!gl wygbl"yF[F==+S%=NRԠ 4 0]^C*Qft26\/H1=g9E1*yԠݘzq(Uvno@>jӍ, yI*2Q Ёb>KY&vr\&OxO̪z=)HOd!E)G251?_Ԡ%]tVAՍOZT!-`&1l]CL<@/2l+Քd )OMО^Ld 9Yص=DNjӛҎ zc1 ]X~6}Y5u#+9BJnEIkƱǤ &fJ;>yӍ%%[QԤ+}ⷴ^JА.L`=g RT#[BƳglc}4vp$h+Esvrdmot"{렯LOHv+_2| 3DsuA&D]Ws/џeusҊ,d0pWD!Am2"X=ŀzl?hYR?rU`r.hF[\%G'<"9L>Ѕ1' "@L6ИnayCA=4pko1}_(@uZчqb)+~h5RԢ)]TVrSsJфn g[8>A2e$ZN ݝACчq,byM~dL?Ƴ\9fIf??T%tV#l %)GejҖpsw<8ϵ'T/ 9Gga'=_ QV"IiӏYl"/IS]<ωȽ?(Kcz3MA>MIӅeD#Y)Hy¿d:sX~.Kř,FX&ICFUA ЁtgME`%. IפJRz4#(&0b#9I.q˜$&9Hd&!X3%d=aNq[<1V_?22iL Ӆ> e4Vvr\*xGVd (KeАZё d4S 6=!D[-N)КLc{8}>m$IG2\8e?ВtH1,d9>Nq<5V._?OP4 d("ְNsGb$-I)*R4g(lvrDrǼ- z IA~$KaJRZ4 Nf8BV 9#%i@fPT!3&1$.yG`IFғ,UK0H3 Lg!~s<"X7R|ojӜNe3XB8ynDloIo %LmВt/4沌ulg?8enpg[R9GJ3)ld?WxNz ?Q?8wLm|Ajґ_F QrT6 A?0gI]O2m+>g<4:s;yi V\qw{Q:aYVs$m >o Es2--#47sq.(gQёl(+>m4c*yH8)Ed8UhH5lꈹPft?}u.B! ™zNp;HiB'1el<$DQ:43Cd沌 |& :a=}2mZvs&)&=tf(q ͑4 vsW$?#o(H}<$Y9E z0m\"9}Jf6;yWi4f(]_0LbENrOrI]ї%-?\D6rw|uERNg,hJ/氕$jI;fp$&Weg@ei^ڌe۹Sbt#AWF3%Dr$<"(Bi*P҇1e39Ut[-;)L5 %}zw]VHK.pNC=z5??o%oiD.`C8&1Y,`Qp[<9@gjT~&3(LQ`ZҞe#K832p"Ww; ILr(-oڴakl捛m۶&۶횰٘l=q|Osg M!JRZ4Bo3 Le6 XjB~uD Ob~wRA}ӎng\lc9N]/rԦ hǠw΀ś\61>'P a%$GO<=IfqDo? eL6Fܧ8ȿIE=ӌAb3 F75>G (ІM|$gD5jP MhA&,&4у-YD8br$*( BxMژAfo+(0}|p@/qqHlqC8s}h(<L-:}{GcZІcSPp0g|&zE7ġ|ar/X:6 G9Y.psG<%oHAe@Uj҈d)y5a WSSXy>w-}c5ߵ} a& hpVs֕ b4-"47Y^m}.Y1AP2R.L#0gC>=f.o0yl2|NDe%>sSgI<#A3mFN8Appi/3>qZ3%hJ/V09+~ro*]:q$n7hVq }P>L |F4Ts:K ф!,8OJy2-#j{9Ly2:F)29l_HQߡ8Cburפ- N 31u!O$2'cZ.r|!n7ASa2Y&r+<5Q[??,iAg0Y,e85"xK/$3)MuӖ e"sYN(8 If.iME0el[r$!ߑ,iJ&2Pqi@{09,g xH$?wJӈLd5ǹGf3)I#:2I,b-'3/H!ьg43XA.$#3(KsчQb9y pT9]%;Н?(JD0^$N''N :1),gǸ+ oRTmP&0InC|_HN6 Rх!Lc EL&rS4 Lq3'0ԡ3)7iubsIyNrHGS&tr>syAR2ӊi/BQr.pֲS\1ڙ3I)чd;G {$Na*P6bN~r48沒q'*iAoF3LA'IQ*Rtf+ >F*Qʴ }Vr[#d$ EN#z0r#gNnJSz'YjpK"T_R4= 汘 LiΊC>JQ&7Ù\ wyGz)I9Pі b,3 p7Ě6HŸdiH&Jp{')CCZӟg1D%F$% Eӄ6t\ fo3|9FM:39l7ԧ9s"fwS,b7?!T6N$IWZ1#u@:2?/ jѓyl1cXUސ_.$1ы?/4b,/'*җ1 MjэQ; P!,BQ!<_mE]2=$*18M2k3sMb& "֪Q bGOu%)NkC3TSXog)K&|Qod4yD`R.Le#׈j&R)7{'2lqwdWHqo{tbj38 aP `[xFꎅ&.0R햿d,){ݻh:nddN(A#2qN{|Ԡ CZpg5JЁc.kIng (C'f}28YBT 5LΊHK>JPƴ=U"xb^P#Rƴa,sXvr+).E"Fs| %AjҐ 0I,c3'OIx:Dg09c/y+^ч P2Elz=6-X氆C\9QY#S6c Xrֱ < p]N` R6\"DO(FЕg0:r:W~$))M 1]\3>S5iN[z3l$\n+(E0Ctf6q3\${T' 934T)mj.^ 6qZo!HOfrPeXZpO$|>F1҉Lg38 ~o"/I#Пc';k&M$!%(AUѕe=;8]ޓKӋd)9n/d^Ste8 4|-Hf0/̦,MBqn/$T_diEg1٬$GZǯ"?hL;12O6J@VSfAnu ?ӏ e9u 1ByjӒNckq.|HK~JSfe 9]-F@"Ks:14 Zq$:ԣ;S-hZb_HC.QrThA'z0LfYjֳsQci)DZҋq,d9]?N!3wyAi)@5ZНd !l 'J화diH泃K<&Nh }t 8沆&HoďIAPd sX^xL 3!%K/8x7IHInScY@(s߶A22RҔ2uh@s3a9-;}d4UhJ2d;+~HE1К1cb|HN&Qe"a?7)FaPc X!YOYЛ1b k1OI$ )DR d2y"H\T1F1%lbDB_-JP`SYVr'DK"HM>ҎLbsXJI(iAw3Yzvr<%Ă?C)ҚLd{#"wϐԠ\6Kx7|tb*}b6v4| v}T92ֱ0n8MB U^Q`Ʊsjtb(yM2MH_F1l <%JK iCuDme~P_ 1P}тql$)-^SAOp7Vznhg 4 }Le3GxO e5ygbv$Xf&~Ho&PNG$>T-B6;tV >=8c\HE_"NK&ldGsv/(D3}nr8氙#8i)N-DVӄoC=l6xfPr< qz:#Zp%w)AuЍ,"\'t2P?cjs'BcYqnh}6ґT6X< F?+Ԥ5J4`4xĈb9M8OL܁r4d hF3,d-8qsuiM/F2ֲp>m yLsz3*/9D|H1Ё!$S<3 P`1ai F1,c=;8nw|"pd#CYvr3!5h@&317RCj҆a+5(w:Se8L@r4b<m'?zq{!XMІ>Lf1;85^oHPVt$f2E,g ;Qr;&x,VD8H?" iKFul ׈ DC.SesXNpĞdԠ-No3ibd/9Ir+ <)/yG"6Ym${~7td!eA3,f%~Nq)1e7Xjp;|!Tk#5)K=:0a!Y&4AiJJ Qd v=^uIFjza59>poԦ W9_tG#(N]:ЏQf{Lo;K\&vs|"l{$ 9)H9Әc 9).w|;GVgwS?O\IF0^(D-4y}KIZ36i{?%iB >BuO0?.2(JF e(ESz0DgXڴg48me9O'7BX}R,ӓ:(BuDw2l0}^(HKFPԡm`&-~Pԧ)m`&'%zPnLeW1h@gz0, j`"*kq.8MD/V}-GYD/fs]4V+| zT&~Ld%;+`-<p(^nmR} r/Svb{sl>Ԧ=zp<#["EљNqG|"VC"=\*(汑C]arS`F0.wF~JStas1nX;ܑIFn҆>f& q;/(AUӊ d Y^q|HK.R괡7Y@('=s'99(NUz2,bg]"@=r(iBګn;c:n2Q&#!~'3EF32%_d:b63<$AgDb~wRF. Qԡ&1%eG .//g^$5)NF1El:GL#ď$Rg X:}vT?~&9IG&(%)KER4)- =No3fw"4g9#=C2RNt4xWt~'LujSfсaX.O|d%?L=Zҙ csYvq<PtdUE/汒0@:WP4+jr##1")IMZЗq{!c@rrP괢2vp;$C*P4Yn$O8 l6q|Թa +-?'rS a;:NArc8 >ॽRԡ= V0"xGWΔd fPv47SvIFQ45}6&o/R,i@k2$[NR24#=^q|";ϒ#zp I(B6qH2*@r;DJ1 DjP4+\6s>yM8s+DXQ(U@?}%~I5:3lQ,`Sa ;9->@:rR4=Cr6r#,:]ְ3\)g uYvNq|zOm2)bǹ;6EYІ>cC7yF7q%9Y)B=01~ *ИΌ!u\$NaZЃ)lxwCчqg3xNHQXzr%_D:JQa2+Y@d:g='d85hE3:O·)&2QÙ"63bIIS c"q|&^*sTc a+yLrOSz2oIE^ЌAe>;9o{ 7OgFuk(DiЄ^!Q4+ca=+w uf< .qD?Cp ))I2,cgAo*KRґ4;Ùs&F& RbT=lV1#HN6JQc>8i-Z"5K ,qk<'jk$=DC:2,cyK!9(M#2 o)C)ѝ!Lb5O2rR4<ֱ$fduxBy^+"3ŨD#1IcNK+٩DZчby{6Fq*ӌ`3xy)C3l W/o RNf61nDĂԣ5(&2&oߺJqjҘ6te0XL(8u><& 9(L%Еa%-^ )N[&1Q mRbT-@&M$wxMzOyВ '"E|Pr4Ø|ֲ-d-汄}!-fF| A`zs}quD.PgK._KYJQ6 b.)yJܒH4泚 rT)]dHzԥÙJs'F{%9(JM19,!qIO~jі>c.9UHKQ`:ӇlOHX^&+y)Euс!'u 'A5IRc"sYr[<&D-@]:3,c3G;2(6!(E]Z0d  58K<9UU/!5)@҃i,0VM#;%F}3I~jѕ ,ca< 1kJ \s|Ά\Td\9_>DqёvrDɏ(JU$\!W'8CљL$ RWiI9jӎLg!+Q./$24=x汍C/WŊL MD&O$^ϒ1J{cUCIDO1l36cR"4#t\XW22ԣXNp!J= 2AaSZvsk<"Mґt` )n#(OCӟ,b#7DoIEjӉ!Lb)9E#J *P`*-HMV Pff4sX6xD$߷JPfb(S !C\:ȞE1ӊf: XA.6H!*Ґ d!f8-vg'%(O=:0l$yI6iFwư:ڪ?rQ*4 Ø pDM;gFzrR 4#Zsj/AEӊ a .wD 8汚}\1Q:Z/NEZїagy;bw2HEQю~Lg)[9'H}Z3l7D.!(DyЁ!Le "Hjd 7%AcӋQd)4 =t_AaA.&~ y(IMЁLe;8 swQԧ Bs|Ӝ0D_0l|^H!ф a&.wԤ (fM47xD>MR2rԡ4rb 9)Kkz1I,"\Q鋤&iD0rgwdi@Ʋm&3LHf&O>P,T MH氖*=Q dG9QFFrSfe } KHIӌv d,sXNNq|&PgK Q*3bְ0nìLt+5ч!?(C :П,g71G5MNS&tc4 0gy@ajњe5{9]ޑ`24;0"Ńm(fM$WxbIJz Sg 9-"~4# ayGqN~jёQ,Wx7dR6gk9^s<$-)F Z1l!䛉(Keҙg)9񒨓|4"Hf}\?IG!LF0Q.w$(@ӖAd E"BJ QFt`(XnNrDiA *є e%n$W(F-8]*D ϒ24XNsĘ)IFv*P bI,@ PtaFqǼ'l1"5)CMZЎc׈2G ')B%ZЗylĘd,uhK3%"DxxT=}\1CiN)ӛd98S"uXl%=JwO A Љfa""!hAO0r< ?2Ԣ9zr]NZяc=8C>m/&)A9ғLg6!:6]ayF$?,uD/1a9[GxBe΁diJƱ=\ї]~/Prԥ5,c< QW{<2թM[1&wD]e@mу)f)9󞸫HKQ2lc81NqK y{>e&6$A2Rd!y(@JP TuhJWF3Մr+G$~PtaXVNr| Z}Ԧ}lB9#&/eh@Kz0'cכCGq=hZmvd͙Ͷmd5ٞ&[k\9ύg6a׉":gF4A4 =d^ss&MnDK0If;g#s\g"y(JҎLen/6xDAPbio6HZrQ Zҝ!Lb1a"I4*Әte(YFp\^w;5씤"A4iG'z2g..[iJz3"V2hAk0b/׈mXqd!y(LEjт b  氀%d?'SksGR$eHUjSƴ#<#|ӽ\9?2-e3Y-Td3Xe1F/ =@F1,f9;aYq#;⑈/IN2D5jRҖ>bi"o#^d xfUl x{ۤ y)N-ј&1d5i¿`K>q79./ ԧ1 E?F0,f;>sݛ_IIVDc eXAs[DOD?)N|E: P:#r6s%ng"*45=bqǼ#ک|ϟd$?%B7c.r(OHd$;ŨB[1g?b+HNVӐ0`3ygirR*4_3lo{=&iI/&m\&8<Ԧ P3yD/4hD0]8nn~"-y)FhGo氖g]_rIfJPXVk]ᄎ!%(Nyъ.Ld%9mE?LqhI{0,c'9]>CFvJQv f8 񂘏>P 4r{|r uYZrG|"Td$M(4!Dd Lf>99YF22R!Ad a,'sGғa$z|8UiH\ֱ\ ^M*4=,V1Q{ed&ũA[0aǸL$ωڽiC_/HFm@Rd Y~.o?)B>P `8XFrW{{IAzS Ӛތd" ExQz9,< =}2G8yB&+OДB/2,c+'xH?s$#hNoƳ#G*=$f2l8m"y^|&'9A5'~%d&;?$eHUC04沞\=>+)O%F E^[`(K8# BT~ů1CR*Ԡ6iLsiC'1,d)XFyOX! IGaSTm$(;$ 5(G%DЄ/B0!`  氀%` vvÜ%QDoHE*ғb8SXvq<$$G2ylbǹF$OxGx΁d ŨD]Zґ` X6rk#IIIv SzЍLd>kqwI-H~JDSӗd9[8yh _HMNRҝLf!a$WyޓbL/ƲM:/X|IC~*Ј f+Y$IEVQVd X_|O*RgSY.ICLӒf89nJ.'G Ґtgjs DO:$; (CBh氖!7FIEnJQVtg3YN¹Kb}+:5l gsSSL*rP#n a X.NpDbdef$!_4Uh@(\r$&m,!Ns?~To uhE73oxgb$HF:JЈ coL,IFj2ӌ泎-wJЀ,8/&yH@ZJҜ!, w5 wwH@rV N*g"aߦtfԢ.rPP1͜$f Oyх,0&$wtd")NќcYZs\:!OyE&T"ta8|Q|݁(5hHgư<"az1')l"UAmӌ3l(dN2Hi҈:1i,d8>+^oAcr$IB2rS B@&0s<13$#(MMҎ^g8YppnqǼ3I)JR А$tTf2,g5Vp<&vV=0&]D0"Y u@&1l07xLꊼ$ a9u yN Pzd]x;bF&rS q<>Z!'N 3,a= 'Wne*s c?g$ >7_d% ԥ#C*LL~JQ7CL# 鯤&?%A+:2,f{8I?SrS Zғ1`1+. -f\[гNA:җa 8E$ωuRtd$Y>q7WҐT>m$f>oI(HG6R }"sK%IP{@*RzN(b?~'5(OZӟe5;9E)F StgY Ŝ(H92id/3I[?HIjӂN a k8U^yBrrSb SXVqO$.iT!tf XpD/%wNYjҜ f2Kc9 Ei-BF1Y,c;'yqVtf0SXp|$~YC SӃLc { *|rf79(F5ӑ, =!S^ChIg19,g=9mGҐ<iIOF1yg;8mMN A4=d泖sĩ!%C;3!G| qeϑUiAg1,c85<A#=<ֲ !HX{FRz#2vq;< /"+(BMӑe>[9%;')@q*Pd8pk;~ )(D1*ӀPz0f3{8YnwӤ '% 1h氖]9QĮHInR`0,Dk/E1y,g3G8-şdA#vp T$UiF2Ŭa-wĨ+oEDCH汇K$Ī~,2hC2:oU_ ,@_2 wyKg!/C+:2Le8 =~/2bT>mNF(35rBV S=,!HX@*P`:2qa[YXMćT]Lֲ <$aSq Y)H)jАf(3XvNp{ ~3yEA3:3Ld XO8wyI澟?M535C"3(K#1d'bd$5hD0mDF1l$ygk%LIӝ,0yJ! vM"xIu#/%Iz0Lg ;95"yFPA2rQZ4?#RֲDxś\CuBLO3Ef3{xgb”!Hf#$׬#(OMZӍa-8-^'/%B+z0i,ayHqOodUhF'0y,b95io&(EuЊ^f6.q=!'EIKz0 ,a-8GWrќLf6 w2Q*4 dsXvNrDIr T1P&0lǹ^Yod(hAW3lL:h@Ƴ!V_uL2uh@\y|* iEF2f8M9I*2E[3lf/yg ')JeӞLd [9EOȗJ!JSԣ9m8f-&/yOAN: D{z1i,f/gsbdUhGo1ig AqJzrRT-@_F2la =iG9ӝLe9; OLa%?ACBhG0g3FI4B: @2f19{s"%iF!*ђ c,SYD*yOΛԔ6ta$sX^SY(EЕ~ aK).rG<-˷NZrPT.t=O"OQh.H4d(iM0bܥ0 Dfu&xMx됞R45=Xf$7'bN0;tR4k.sě(Nzre$XQg&NnJS$泔5`/yJz )JAS:ӅfX!F aYns+4CZҙ1d#;8uArQԧcXjq%t"24X*vr<gc#b1=J3=Gb;+9"׳y(ECҗQc3YRV&s3\*#'7(E љd2 Yfs<=5HK.PЕl8xCyE5KCҒt82yw퇴%(CEQ-&106 G9.px+h ܃G"[~~'9)IKfrS4! b X6N޹ْԢ CjrD[d/ddiB'0el`7ǹ>bAvJR'NqKYj!q| fud0)MESz4)D沒-< >BSz0icn ?)AAҀngGЛ,"\~BЂc3{9K$I[Ԡ s|=f)BuZНc'xkU/d =I9(@jӁLbLo߽_LYBƳ ψq@,diD'3E/HrYԠ'XZpg8?&eY"N.*Қe[8^uH -2ωvTn#(Bӊ c qn$<^HASt`2UpL7rQZӏ,b 850ICPtb4Ys8mdV!~ߓ4+CRR'?E V#ilT9X!9DqЈLd19Y"x;b5SHFrH ҁLd!8EsjrbOv^tbYu!$ hI_Ʊ"IF&JD+z2l yNK΄>p <#_^{rӆތb&+QI+bBfф`4sYQ%*ҜL`k9E8)Cyуg +>uEFH#0%lcyMjt if=y" )A-:3 \&yK[HHYӒcDX_~%E($p.O|uǽ8況#|!(D-1a#gy{ߕs"/K33lOxOHgEP`z0c-3HM6Sތe69D87xgCS!g>;HQ$x`T%  <d&4&¹;> (Ocz1+xl.\iB[z3),f#9Õ"OHKi*Қ,`= ?#LSƴ?#JqIuhAW1Y,g-E羟_IAfQVa2a"/Bߦ8T6p#KXf5_r.=F.$JЄb>[8Oި%iJ/&#DozB?cD9B~҆ f 9>(uLН\&?)BS2M!$ vҀ>Lg1k~TWd8 qH'q!?U e( YO8O*(CK0e*o" 4 (IC:1u&o-4 )YGƳ#IF^ѐa!9[b HEe:11%ߐ´3u>KЀ<щ ,b'׉;4 +-h&3Ü*<89(L9jцb{8%74 _d!EBuiP&D$&ulgs|M Qje6i7H,B^)KmZЕe%񂀄_?~%=)M=05 wxADߓ iEz39\512R 4-]r|D(M]LG|Eh@Q:ӗc G|)T-=YVNp_y7ߓ" ==Hp" :4 1X^pFHCjўLc9;64 AS=\1wr5hJ[2U < BIGV S цttVvq\#>4K~"-(B0=T'?AqЀeYFǹb?@QjДcZ!OH~*Q3Le[9nx?2R4" g>O8y@~'&MH1,&vRgd$/EN#:1e=D$/~L2S43Q.gOH21Lb.+9񚘿@224?sD87FYѕA`)yąL D[~S.ӈ,<#yh@.jґl D&|=Ku0Y,f/8G/BN+Y)JЖLf G#>/L2rPJԡ%(\11R~ Giф b<1.h~ )NnStfc26r D/;CBOF2el y{Nk/d%JQtbaVј`:їLa!yn(bw$%5 iLk:31&c<5q2%Ґr4=bp>-=HA&rH!te3ind}R&t` cJrD$̬HAz2\R*ԡm F3%a;89/}B/1f+>0HK^*Q`:ЛLf.)n?HMV Q4$d8!.rd/~%T_2Y,gǹsbHKjҒN aI.qD)';PZԧ8DE\)I%3 w֣ hB[1l']^xyh@w&\ R`!;8C2%*9L)ҍ)qh}t` SXVG$#3y)I#/CM8FZPtXvs{D&-y)C}1՜ Ix?hMW3՜oSԝ̔->ӛII6JW35lgJ$UܙdAz3,`%8CHR¹< UiB'2WR?3XNrإ!iJs32[ZY(E}&[EWR4 N g<9kbVRO|/ 3ц>,`{ 񎘕&A;H&u47yLx'IIK.ф6'}$fS'FU5I QЉLd c7G8MEjMZRTB?F /HX]<Df1lf'{8ki Stg,sX nA씣m c\>oHTSQbT },ֱ3\3 j9)M5ZЁAψQ}0UhIg1`'y@:"T-6q\!ĨR*ԧ@&0Մ|Rߣ ;CJq <_dӜL`a ֫IED# D q$'59)H5:ЛLa'x΁J3 OD:rRJ4#,ֱD۸SS& dyEAқɬa߷C1ҒN ` sYB~&cXp;8Mw;!i?6-D?F1%ld? S4IIEVJ_F2<7yJ%)NU &#\b4+cXn e0YV¹ >p!+E(#\1n!-ehBG30s D${243#AD$H!Ҕ aK nXsERZЅqf;8ޒxHZPt`Sv %%BG? Qe$YN.rOY MASzПi%1#~%#PЇI,d'/W2R4=&rD_@1јd" XKO K3`G̥)J5B沊m<7yK2"7i@(ݙbqK<"`|&iBG0l" uG6 SftgY6p[<WP 2qK$WrR3XnNqOľ(^$#;%hB7F2l(g^r7$ Cb6p<"e5_4u #rvs<'KRRԠ)Ʊωs\! D}:3ldG8 $?"ќJ&۶m۶͉m۶m۶m2U}"p|% Lsz0,a+ǸGBs7%%y(GuБq,dxO"w#?hJ[1)d/;?Fb  <3Z#)Eq҂n,bGb@S:2*LMbҐbԤ"V\xKT-\A7b,TmH_ ]@D⒜T:-Ʊ]}$!(HZ3,xE $!=J/f{i@iӕ,g/xw"ҏ(D9jҔ@0= _;FA*PLd-yN&HEa*Ґ`6kI{!#Fx'_M;- ^ H\a?rStc p[<?y)OsF3\?& I3Zсbcrvr\>MHNStccN񈏄bN8iDk:0,a5ANq;< _CȯzQKRґ"5iHK:Ѓ`3Yj# wxPĄh#F>QjԣJ_2ic+]^xSFe69 yd'%CG3Ibrۼ#}A "iMg3g95O"/=$% CQF+d沜McPHDZrPԠp&1El'#&IMv S4%T\9 $$(F%Ёg6YPy,i@g1ck,H`D!6HKa*SNe,ANr|'D8$%/%iL0-E`$'Yzs'a{tN}\)ºIF>JҀN a&[8#,d`@,S:tb8su>!QFe! ~>ddUO;3lgG9e^0r")Bijј`0cYV.s'|a.|"թOg1 b W~<#1yFs2,wJpG*rRtgSXnp|#? OUӟ,d 9klԠ#q> 5d0XVqw"ŨD#3)d+8|%tL RtCvr lD{K5ӉAaY> h$!3E+z2`sr\ iAw16o+d%J#:0Ig9Un|#dH&3UO[0d [9-^-0 +iDz3l0g ~2H|]BpG|"t ArPtasQ1Sne9 oBi҉,d''Bvtd$Ui(=\(JuZ2l6/Ay(Gcz0, O|HNnJSta269E*qIFV StdsY.񊟄K $!hA_ƱK jB9MUz0Ld:XrG|& >KL<XjֳM.K22#Lf;9^Wk%qNYQ g"sX^nI р,bEdz9ujі a4bvq!GO" )O3c-[8U/=D#=ũFz0yI|KF*тNcsX.Npg|#d~&(L)ҁ~ aK.w|!Iqf?A QZ3ɬb ǹ+f S Tdn҈. coMrBTmp,ywB$"(C-ZЕLd>kI`GrQj4#lV\! hE QJ4t.IJ$dC+3,d={9M? HGJQftf jvr<#A␊ hO_F3٬`{9%nW|?1H@ 25h@ ӝ g<әrֳ<׹s Ě )@ PZ43,"7yK>`=щOrғ<թOsF?1ic>qk_5a$'=OqS4'ncuܷL* RV e8u/!d]"9Y(H9jӂ. dYvp\x~,IBR|T]X~5Ĥ&3)Li*Sƴ(&1Eb8).qG@LLl0LmӚNb,M-O"xC$&9(J#Zё d$BV$C^kX$"E!JQZ4@F2a?xi,D3y)!R~(] 0f#QeJR@2,ra MR4#zqi)T> pGa[Rԧ9tSYp3\Ox5R4%m oB3J\(eJ]Җ.ac-g/!d[$%-YKQR4-]09,a [p;< _Cv'*qIJZ*uiJ[Ї!a sX# wx'*qIJZ*uiJ[Ї!a& YFvr\&yG~$HD*2BhD+:ғd"3YJ6"7yK>`O$bTd"(E%jшVt'D汚0m&DG}(! iBP*ԡ mLo3,e9 Bv.ⓆiA2ic9Yn/ART.`&0Ulb8%nW|8Ll0LmӚNb,M-O"xW$&5MaJS45 F1Y,b!Nq[<En d(sX˼ސԧ9t4汌ulc85w|':INz┧:iN 0沅= W?G$%-YKZӉ,`=oOtⓜd'?)OЁbXzpk<;ؤ 9(@ *P=p3,g=qs<= }$'(G5ьvt/CT沔le/Gg~^I&JҀgsY.sO'GE"R\E#Zё d$BV$C^o|"D"(D)*QF#=H&2d#;9I.r#? 6D"HE&rQRThEGz2Ld& YFvr\&yG~lD,L-T沔le/G9U?D\ 3DK3yle/Wxg 6RQ4csG$k!HD*2BhD+:ғd"3YJ6"7yK>PCML* iK0c;9.s'y$)iA*Pt?bV*yOB 7w⑔C :ӟLg1q.s|M$b4 ?D=ҁ fӘJ6Ü6LN NaSF'C\V y;~zF, Ok:җLe+ns<? 5ZIR24C <׸KlX$#(JEҒ.f#t汊m$c^񑀱j$%#y)BӘVt#ֳS\)_1NIDF P4L1 Le.KX>./&dYa 7C{1Ed'95^l}%I9҉La.+9sBNOR fgO(B=3ݜ ѧ*Ӝ,(k{U- 9M_'#ŨL 3qLbKY]BNw&?3T),s #Lq#y(GC3c'{bEu0WxOQ$ 5(C=:0d'y?7GDAӎ c:K9k~ILNR `KQ.`Č$d(u沝+Q-XVs<8I@jR4m9%n]Ԥ9$f3%fgK-.2P4}CjR d< ^Nr7T$#iI_F>o߫)H9jЈ.a!;]p'AQ*PVte0vp< ׈;C%Z҅~LdKar''`XiHrYgSⴧqS<aD$IHGVRt*65_78NQјVt4M(N:0ib/{Bmr&Ʋ4׸[lo4=\pS9a$+9O%QfwxMIBRc!6cdGs:ыaLe>+~~w,uD1f#8١7Td0P沕3<'wz<5P6?eΤ$/eI;0Y,e#v/$1YD}ҍf%8{$d4uh@3y{~fw"uhN1%WyOS$ ũNcZҟd XVNr[_ _| ObEM#ђvth&3-1?%)@ ЄtXm(SB>̇elg78qp!OovT1Bo3QLd*3B`?9yq<%Oqw&*IAВ e!+X6vq<=>MBҐl%@ Дִ =`F0ILg YNr#Mcz9$ )HO.Sa(YJֱÜAM RL`%g+3:hKw0|Rߣ`2ߧIKV S TMtBRLb?oHpV^=뻖H"D.RT5= r&9Cn3?B@@H9l?N@xp€=e9Aq#9INq3E.q+\:7-ns>x#<9/x+^󆷼='>|;?/~D#8!I(B K8_#<H$"D'1M⑀D$& IIFrRT& iIGz2d!+Nr!/O R((NIJS<H%*ST:5I-jSԣ> hH#ӄ49-hI+Zӆ#t#Lҍ'Mҏ ` 2`$2L`"T1d\1,dYRdYZֱ ldVd^9Qq9Yq \Uq]q<ySy[|WC@bM $M&,D "L &M$ !HL %HMZґ d$BV$C^)BQQ e)Gy*RT*ըN jRԡ.O҈4)hN ZҊִ-=H':Ӆt;=I/zӇ? 3 c8#h0qgd0iLg3l0yg Ybe,g+Yjְugfmlg;n}9apc'9ipsepk\7mp{ycg</ykwgo|?os`'! Eh7a ?'DdhD'1Elx' IDbd$')IEjҐt'Dfld'9En|)DaPb%)EiPrDePjT5EmPzԧ iDcДf4-iEkЖvҞtBWѝC_џ dP1dX1 LdT1d\1,dYRb5kX:ֳMlf [vv]f{~p(8 NrӜE.q+\׹Mnq;x#<9/x+^󆷼='>|;?/~󇀤j % AHB0MX@D"(D%щALb#> HHbd$')IEjҐt'Dfld'9En|)DaPb%)EiPrDePjT5EmPzԧ iDcДf4-iEkЖvҞtBWѝC_џ dP1dX1 LdT1d\1,dYRdYZֱ ldVd^9Qq9Yq \Uq]q<ySy[|WC@2uO $M&,D "L &M$ !HL %HMҒd #L 'M (LR┠$(MRT"LRԠ&MR4!hLҌ洠%hMҎ@:БNt ]FwzГ^}G0A fCpF0Qf cx&0ILf Stf0Yfs|E,f KYrVUf kYz6Mlf [vv=c?8!s8'8)Ns<%.s\:7-ns>x#<9/x+^󆷼='>|;?o\#߄%/D$B4bX&qG|D$& IIFrRT& iIGz2Ld& YFvr\&yG~ P((N JRҔ,(O*RT*ըN jRԡ.O҈4)hN ZҊִ-=H':Ӆt;=I/zӇ? 3 c8#(F3c<$&3Lc3l0yg Ybe,g+Yjְugf`' 8r9Yq \Uq]q<ySy[|WC@ M $M&,D "L &M$ !HL %HMҒd #LV$7yK>S0E(J1S4e(K9ST2UJ5SԢ6uK=Ӏ41MhJ3ZВV miG @G:љ.tAOzћ>@1! eHF11eD&1)LeәLf19c> X",c9+X*Vc=&6mlg'0G81sS,%pk]q<ySy[|WC@J5L $M&,D "L &M$ !HL %HMҒd #L 'M (LR┠$(MRT"LRԠ&MR4!hLҌ洠%hMҎ@Ӂt3]J7Ӄ7}K?0A fCpF0Qf cx&0ILf SLf19eYB%,eYJV5eF6-leNv=e9Aq#9INq3E.q+\׹Mnq;yC'<yK^7G>/|O~?R!(NBЄoO"D!*шN b!.O$!)HN RԤ!-HO2d!+Nr!/O R((N JRҔ,(O*R*TթAMjQԣ> hH#ӄ49-hI+Ж@:Љ.t;=I/zӇ? 3`X1 LdT1d\1,dYRb kYz6Mlf [vv]f{~pCG9qNpS g9y.pK\ Wunp[w}G< Oys^W oy{>O| _w~_2AJ0"4a?D"2QJtbX&qG|D$& IIFrRT& iIGz2Ld& YFvr\&yG~ PBE)FqJPR e)Gy*PJT UFujPZԦuG}АF4 MiFsZВV miG @G:љ.tAOzћ>@1! eHF11eD&1)LeәLf19eYB%,eYJV5eF6-le.vc?8!s8'8)Ns<%.s\:7-ns>x#<9/x+^󆷼='>|;?/~4 % AHB0MX@D"(D%щALb8%I@B$$%IAJR4%@F2,d%ANr<%)@A Q")AIJQ2@E*Q*TթAMjQ:ԥi@CфfiC[H{:БNt ]FwzГ^}G0A fCF2ьa,&2La*Ә f2a.,a)X Vլa-X6la+va/r(8 NrӜ,8.r\*׸ nr.<)x ^׼-x>|+~! Z'A NHB0MX@D"(D%щALb8%I@B$$%IAJR4%@F2,d%ANr<%)@A Q")AIJQ2@E*Q*TLҍ'Mҏ `P1dX1 LdT1b6s|E,f KYrVUf kYz6Mlf [vv]f{~pCG9qNpS g9y.pK\ Wunp[w}G< Oys^W oy{>O| _w~_AJ0"4a?D"2QJ4"6qK<Ⓚ$"1IHFrRԤ!-HO2d!+Nr!/O R8%(IiR TJ5SԢ6uG}АF4)hA+Ж@ӑNt ]FwzЋ/2 e(F3c<$&3Lc:3l0yg Y`%Xֲl`#6v=e?9r4g89s\2W5s6w=<1Ox3󂗼5ox;|3_w~! # AHB0MX@D"(D%щALb8%I@"$#9)HEjҒd Jvr!/O Q")AIJQ2@E*Q*TթAMjQԣ> hDcДf4-iEkЖvҞtBWӃ7}K?3A fCpF21e$0iLg32,dKXrV5e&6m`'^q8 Nr3<%.sk\7]q<1Ox3󂗼5ox;|3_77#NBЄoD$2QJ4"6qK<Ⓚ$"1IHJ2"5iHK:ғd"3YJ6"7yK>S0E(J1S4e(K9ST2UJ5SԢ6uK=Ӏ41MhJ3ӂ5mhK;iO:҉t+Nzҋ/2 a(F2ьa,&2La*Ә f2a.,a)X Vլa-X6la+va/r(8 NrӜ,8.r\*׸ nr.<)x ^׼-x>|+~! z'A FpBP& pÿGx"HD& QFtbX&qG|D$& IIFrRT& iIGz2Ld& YFvr\&yG~ PBE)FqJPR e)Gy*PJT UFujPZԦuG}АF4 MiFsZВV miG @G:љ.tAOzћ>?`2`$X1 LdT1d\1,dYRdYZֱ ldV?,xxC*$!B{Wvvvv{gC{?u^}3sS:88)9D".2qWq 1Xm]}<@ #/oH7|$'~76HT 5 -!=2 #2!3 +l ّvȉ\ȍ<ȋ|{@A NpFE18\Qn(R( wAYʣ*PUF D-6.|Q M - m ] ~^>~ @ BcbcFbFc "000S阁<,"`1`)a9V`%B aXuXplFlflVlCcvbvcbN"pgppˈ\5:n&bq qwqqxGx'xgxxKk[C>> "?H?ؔGJi YalȎCNBnA^C~أ Pp3(pCIBi ʢ`!!K ˱+UX5Zzc6b6c b";{ppGpp'p888(\%\F4*!q7[;{C: _C}4@C4Bc4AS4CsD+FE;GtD'tFtE7tG'z7/?11!aQ1@xLDLdLAbcfbf#s00 XXX*a-a=± [ ؎؉]؍=؋}؏8C8#8c88HiYy\@..#Wp븁-=!1)9/ o xO/D|w@~~#`Ss) FE:GdD&dFd-!;r9 ya(Bp@a8 ((+J %Q 2(r@yT@Ex* PPިFԅ/>!1)9Z%Z5ڠ-ڡ=:#:3+;z= }A` P pHhXbc&b&c 00300XX,,2, D(Va5 k ؈M،-؊mvNn^~AaQqIDN ppѸ\ D,n6.> O xWx7xwH{|G|g|W$OD*XiYȆ;D.FE>= '8\P(7D);ʠ,QJ*BUTCuxj|PuPhhhhhhh耎肮?D/FE??` !1C1 1#1 1cq I)TLtLlcbcbBK˰+XX0:G86`#6a3`+!۱; {ppGpp'p888(\%\F4*!q7[;{C: _C}4@C4Bc4AS4Cs@KBkA[C{t@GtBgtAWtCwzz08L$La*a:f`&fa61s1 !X%XeXXPjAb#[؁؅؃؇88888)9D".2qWq 1Xm]}<@ #/oH7|$'~769`AjAZCzd@FdBfdAV"#y((#"(bpAqPP((GT'*2 UQ ZAmA] ZZ ڢڣ:: }  0 (E a<&`"&a2 S1 131 9yXEb,R,rJbVc °؀؄؂؆l.>!1 D$N4,<. q +kuMnOxxxx|'||E";~ ? ?H R# "#2"2# ِ9`ȅȃȇGD!80gAQ %(pGE9x<*"#>3+ I_d_?R",H4HtH ȈLȌ, [dCvr"r#"PpQEQ .(WJJeP򨀊D%TFx*:Q5ڨ_C}4@C4Bc4AS4Cs@KBkA[C{t@GtBgtAWtCwzzcb0C00#01cq I)TLtLlcbcbBK˰+XX0:G86`#6a3`+!۱; {qqqGq q'S838s8 E\eD bp7p۸x8<#<<3!1 D$N4,<. q +kuMnOxxxx|'||E";~ ? ?H R# "#2"2# ِ9`ȅȃȇGD!80gAQ %(pGE9x<*"#>3+ I_d_7?R",H4HtH ȈLȌ, [dCvr"r#"PpQEQ .(WJJeP򨀊D%TFx*:Q5Q >: _C}4@C4Bc4AS4Cs@KBkA[C{t@GtBgtAWtCwzz08L$La*a:f`&fa61s1 !X%XeXXPjAb#[؁؅؃؇88888)9D".2qWq 1Xm]}<@ #/oH7|$'~7658`AjAZCzd@FdBfdAV"#y((#"(bpAqPP((GT'*2 UQ ZAmA] ZZ ڢڣ:: }  0 (E a<&`"&a2 S1 131 9yXEb,R,rJbVc °؀؄؂؆l.>!1 D$N4,<. q +kuMnOxxxx|'||E";~ ? ?H R# "#2"2# ِ9`ȅȃȇGD!80gAQ %(pGE9x<*"> "?H?GJi YalȎCNBnA^C~أ Pp3(pCIBi ʢ`!!K ˱+UX5Zzc6b6c b";{ppGpp'p888(\%\F4*!q7[;{C#>3+ IH?EJ YalȎCNBnA^C~أ Pp3.|Q]=胾 Db8F` 01A`|,",R,rJb5 ؀؄؂؆l.>!1 D$N4,<. q +kuMnOxxxx|'||E";~ ? ?ñH R# "#2"2# ِ9`ȅȃȇGD!80gAQ %(pGE9x<*"#>3+ I_d_M]D*XiYȆ;D.FE>= '8\P(7D);ʠ,QJ*BUTCuxj|PuPhhhhhhhh耎肮?D/FE??` !1C1 1#1c10 Si9X,2@(`+!۱; {qqqGq q'S838s8 E\eD bp7p۸C> "?H?`!!K ˱+UX5Zzc6b6c b";{ppGpp'p888(\%\F4*!q7[;{#;$=>#>3+Ớ6 \tN$mP.loُJgEQ:D=Α,:GꬶVl:ǓCdrc\59ʦ:y;gB;y>bنE:m:s+0>P `Qٍf-ȳ9}h+D"&mQFF=ȶ")`wuQw/`ӳ96oc i+*:/>~Ɯ~sy&.ȹOչ:Σw:(A0y:/>輋z:/~|6uVY6Y )uMjiuN$97t#فQg7rșt%gֹ%9]E΁",2rvE]"9R(cDwE=C1'ʣ3z~mt#"N.{~|Er:%{'U1c:"6Y9_eJ:kAi̧rcuuN}Z̜\8uvv0ŝkl]>zPzs mźDH.iC2D-Tm9?ȕ\8U!W3A1~u3hIaQ?&Y&ZcE=NEN9QlKyYxx0uN<ۓksdɜC/\WK's]ɵ%)ګ '/,#11]b]D=R,%r@Z3Ljeս[1N\%BɘgrcnŌcn!:OGDyȁ5-Hu-0gs{7.Q?$"G#]_g5Y$1NRè+bmE=O]DwQx6"7]E?}DyE!/2D,%|HH>JhD_'DBXWH ڸ.xwQq_T<6mEG䠼G6E}|fa"oyWQpHϊ>E=V81x>AI9Y3뙊ubf?,ڻ!>"7wmDQ&rX6HԃŲ!kloyȇD9JD_3'&Yw/";">CE݋\ȘgSq,6>L@&HԃEmBE=\#D}#;ǼNJ'QOdQ7뙊u;EgQwu#7mZzGDyȁ QQ9\OqF>ޥZ$D+!Nx&ADE}jc*hj_N c^"Pb]E] 2j^CEQDWw,"T>;%3̇ĺΊj'NJ(h(zO孳RxF%W7漄y^\[%hGa"/+a[X ⺝琨G%hZ?z/9Xs:r~m:!M\[c\ژ[7>GoK.h̭X6@ 9~"xD=Jmco;0::tV6ޕm22Gu˺Oުsy.QWvY9ͬNFVv-i%#tun]JmDGR;~ӌEVXc]%mmuϨv˪kpяm".lcVY4Nּ6yt>F6ڨuzSǞu 8,8Xs1_sxڜY{j<*B{Q{]O^@gK)Ut#ٙD/IΤ>:w$ٟR1TDcc^`{:L{'k)e޼z{6XɚiSU}z*G걩ǦrODDKin+}i"6D=H`CJ[޿j *窄5ΏʻD>$Y]oUκO_HQ"q|Wԟ>նIQ9њ;:wuV2wYnj[۫$}_<1.r*;>UVx"ϲbٲWrxT?-Z'kNKEѿʾ*ͬWJ:e+eY}-Y}謾S[kMݭל{sGw3^k:Y0Kc_e{lX6Zuc_,j_tnf=D չjjaHrSQo+rWؿzվW/5y2c>VUfb[mٶM7Fzl*Y͉^G}],;@Q|@Z1HQy/**G7lXvQ-fD2A<H?_/kdտZVHf9JX2q<dzuՏ1zP1z_6*mD010^e=1lIkяGF6sX:zNT o_>9z_=6itR֬gNd{eEMd>% E"?mD_a"$r!".rD>&zgn䳢&Ѣ+r"'(W13'h#ho'";"{a"Af$]_&ڄ6 ucG;>1ڗ>!jc~VYsȧsꝤF Q7 UV~+ٯg_ll~]it.`X1>ژ>sƹvPA=?y9ú]GĶQ=#W폊uU'tjOtmN6< tSzj]rƼPپȮfv.o]z]j[Tv+ofX=ocޫ\sƼWQ;M?|PxTY=nYC9~Qzީ]\VϜY{4rC>Ŭ("GmGmrK=N;UOyxTVzbXAz?^Id:eUnZh%u.o1yUV'tjt{;zʟt{6q澘ګnXz:ϳ*; =q@Wt6m뿂ƶS9OuIe ?4ڻUSo]T&չ)9Qg ϵSz<HN Qc#ycS?h'Rԍ#+XU덯`Tzީ$ƶYC.fUEsOEs~}ݡ+<ʣDG**lWy_e{1*˪w5r7':I:G69αWM=uOxDg}_T˪3S0۫iז}W?u s?mBi38l[ݖd=*YʾߣR*Ȟ:OˆT#DVr/6WΉ*c>FΥ۟mbD?wEjf]}3f@7ŜgHaOfs1y|Ou%Iz<Sdž3I~Umzmz~?hƻq-~ȶGql}1q߮qk:g^3?cZ .osXK{*Gl<Cݧ:k0ߓlsX{3WݏU^_]W?;Q/g'u65wz}*k!"{)㰕؏En#r{7O+[T6%(涓>;}MO~)qw|Hm/Tmz0%Qo};RuC*kqUX9l,2b39}&~H*TNe.k+Heޠ8zm7R\6u9麟j?;~TOnњ]hcd8UnQ{ŀbۊ>'rP9@UFdQ(1oo]f6&DM6_*a'ѢOfmEDY}X/Ʀ0SP9AW9ˬ'lj1>w!P\Ɖsgĵe^6DglΙZ*ψ:cPٹڢ[U=M~wU3Vs8'P׃Ę6*Un[ꚓOzl*9*MOu]3D*>UVO$l87gss5o3Swjz.۸Bbl|f0T9DWkD?aSY}ש\'T9CE9Bs?\ "oUy_Uz06j>#u2yOrLj|W'RhJ?%ڟyF]tb 󚯲V>TNJam5~]{1?)ulfm(ꎢ^"yCլCwX*W^7TVLDrY7U#9ʇYXcu=s"Ζ'SC"W*bDKԫzUQ&*UyyQC)o͔y]Sۨ*Z;FbZl秥hJv"O9X3XwխϏ*?gz>Rׇ2m*UݬV{*n}Px#ƿ(^Ez[6*\U7ΡFg>u 6SGk͇u]Y:uMD*[r^~J@@u)PǢc86^}Fg/Tߊ~ފ(1ؖߢߺuȸKWȑRYzrhc|__=Όc5c*Qx1挩e{,mQ٘{.-*Rkmʜ9chƩ秕[ܧUQSYũgOR+ߊy{pTƳf`fgQWۨޭ/QXxzOgo\%q[[w bxR?|FS]/ƓJ]k=ZOҹX$8)aQO׺}~)iο2s*X̱y\b,>b@Ys_e&TǬrTٸWl\<[6ss,Ha<VXY[Yi1I{'*xukUüzg5b謁йI|Ym/Y̟uQߝQk.ߑQ_/16ߑQ9BԣE!rF3w V9Xԍwο,b"ڄ-+YìKؿz[Ԝ1*R6&ej;IڜjYɚGc;mjVOZя^̾,ߛļ]jY8gjw\@uVUW 380SBDGtPQQqdTLL2TRJLRTTTTLTTtHQQQQQI0xI>zQQz{ެŚo>Ϲ{y~J=aGޑY[ m|de>ZZVue,F<υ^`2e#OD_ץmGN~G؎p΁!V_^϶G.h{ ۾w2^ǣǣ]G;[l, |>yt~>C}8ܟ' D._(l$\YJi³cbr?{t.e'..]vtN/kpƪe[s+> Yha{rXxTr}t}AWUG)\?umד?³z!tFT~&3}p[O?*K۳ a[{]n 6і7"l{#<: e{ ٠,}uXrO+hٓU_(a[o xi u` om[8Y)8O뒹QXGlSd5p g.ԺOx\VˇOG 9զw}G|:z.:17SӘMu3ckW)Gx,q0^cbSW=+WK#,@9X*y _c',ʞ| ߓo^Km\ D^=ztF}/y>NϷ0.F` \8O;+l8<ük?$o1~6)crΞ$G?K.=&CLp15TXrQؾ!<.]Y\L<քgVر i,/׊GݰcW%Ǭl/!/kDGxTZ݄³/@ 3,bgo$қڼW8;]jg$I~;=.x]+}l:Rvvރa{$_ p?%ߣ'<? ݻ%SD{YYJWz[VT]\IWÞA'ymJ̱4>+y^+}nuްΆM=]7̥ƕ_gÚ\Iu!o <>P#V32a~~գ8]WڣTHNvݯV𩁳syX<9>ҟ8W6& ޠܨu%X',br~/}U|~O'pݸ}*=py0|Tސ)Fo<\kU|$~r_hs#lUR?χUGqѪ~\߅GݨKۥZg4_ G}#pڹeG 7`\(9v\lG8[MÛWzLDŽ[7[p=K|]Y:vP.eT. |rqqܮq[y^ WҁԇfnN~^ biI'- }ˁ1W˞+o]̘{Ԏ\dn8.U$l{A¶t7rnnnVxH{Ҝ]wcD܇<\z$< Oh}7I<cZV}<ʯ /l*K-+s;VޚIء}X9qKU#ʩ[n p.`K|33+C.* -q>Wn۵C[#Q[cFs-q-[kpۖxo&[-yM|-/mÕ{PW? --#[c#1Fy:)VUFݱרͬxo$ʓ7 y8$?bR))xr8m[>:E %ޮff邼9>ț!7٢( V95 0cs sl(Q,b;_}g}ޱCW)/Ͻ|$+a{ ayIt>Oc.g0W? ~n_/[>iZZV˳7mGxvW^l^rs56#o-2 g$W!k2ʟ;7Bxh]o0WuD8Ws#&ل=ȳ a{6!l&FUGM۳۫|6混W39cǫ;l 7iAg :ejZVbjHyF.\ j7rnvn=>>U(7Ň_}EQ{+ ܮu wi[~|Q=*_~ ?ac:*G{z٨Px 3vZ½`WӹKGZϲ Zېr{>:/8Q}(@Ya{L69Sؾ3#ܢ ylrK[qZqZq*y έ;CnI\:{9RCלW]\n {ňՉOOOX3fG9jOGp'Dupڿ:k!oX=8ܤ,kKaY[T7s~AXA<O!< . E]\eQve;':۽ D~:8xb"蔜M[;ӹ QyZ9yI91^sg`[m?\{X8 p:o_dLxѶ>|?yGD۞}ɺ6O?Cg .3'ƿU!ܫ,ZZWڗ]xҲ<9Wױ ɞeM3*{Ia;s+lJ¹zmRX#Lg :C x\9<.[< = x R-kE8:q ?8/@W.Y%T;kR7 ;렿WBe3}N..KV;•&\:ف՟ȓȓȓɾڈ؈؈؈n-ua#a#a#a#aq>8u%777?8>۵͟…R]ON vr=.'>|19mD ww=4>X~,@? w]}W+--@? Џcpp4b ڄXmBoB|6!>M&':[6!VM&j| لlB|6!>盐##Qr3^txy</Nr*'C. j]i2eѹ\mWjvտeȯż*6sԎpX޽ (?*op{/l(iEo͘OnI=L$}"p 'dw=/*p#*8ᦓgj-޷U'_U> S{U]ՑMkCj 1^Ǡ^ G)OYֵZ&\fɮ3˦ }\ny?{_6?P8Kښ؟OsO}K>V.v}Aˊ~.X.jEƈXkNᶵ-.d粓kpܚ8n_ m \m9E}gRKYv,6V5kй ˷%&m'z >|FCsO[6 nWu=ǿ2p_\׬Fع:ps ">%Ov}GQx\ߏ8w?Ҳݰ/lNڨgk}Fayiͥg;“i=#-lM;y,1^<dp*8 9=c~CL8v=4:}GFؾq;_<5]l*8{.U;9p=:y]ȋf!oImΑ9:GAg3t6EnBع@H+-_A:5b|seQ;mu ]𻇨1y'!r?a g!!6_Ky !e_A^aʣwםg͐[??GMUsm tށ@`g.tE_@ }r~z߻/ئ\ Vk=?w]],\ѹnpkl /l-Zm<| |,8p x 'OO_bR n߂Xu~o_G B8S> }]G7{(*t^6h ~5x4֧<~~k")o4 BN(sN.o +*˹ie:w;3h?}7t^neީp~YNy~)!$ \.[>> K)l=wi5ag*l 3} yC8Wϖo gxf> s8eBR'??+45`~i\B]U<‡ZP j_">f]SczpΩvScyXb5g_rrrrrؿ}uiWC|h >4Р>HWޫ1^X5Nt!p--'й[VeKX=p(+iPCwC0C(Br$,{5{pRNLʞ9v7dE/,{/;ׁNmQw+rt7ߧ[NSgvA] O}w+Eso¹/lߛn3C_~QX|/+|ˁ+-jSb"l1ٲǰdwojg\yrw>%s)\ w: >|7׬{תBG8Qhzh=g/;qÇAjgtw]w?w%LNtݟu>~w{g_Ys5%pB%l}.>M/}g?bu^㐟evPR=slon՘l({i 5&Eƅ6Lڠ/o#w8/+uCGmq NA] 6FO#>H v}9Bl\}o|rk]|oKYӪvxBmIlj~=zW}Wߗnwk l~eC':_RY9p}G<Jۅ_F]=|!ls{@Ms#&%ydpTTKC:٪r;t}&τ6ȷ!gA~{V:(oCgKey!<9/zA!4'?ÿ/!aOk͞fOOyk‹ڮ}%|z,?ra7wNR\ ^Osw~$/p=/*E]s#pb4c=~ ;S÷w2fm ۳_#G/58qղw6;'l:o׶uޮmܷJR} fkMx@Tŷӝ 5`ͫst7 Zv:?gu=x#U.{.V?#\vz|M18ٮ=>ݹV쀟ϢҺd}輢r)\6_:_:_Q팭'g7k+iCay^ud,cU~'%`] \Cz]/mGYW'945_[KiO\ۑoF τwˊy))U +g^ #}5paN(XgY|wXgloP n}GZ\V}_Z8-Ϲ<Z8 |z?GZ߼޿RTz k]KsEfչ }Ը ­ѻuпjY D SZNs܅ySwQٹwâ.a|yo+yEu`?)=ɴt_r=h\{{] a8>^h[{/; /lq8xWخW{NvCg4]:C=}IYևyl:bۑx(l O<_|YleOղ2gON=RN'x?!p7iKAW0>tޅt~p>C[h?TW۷ф9ׂ39؟9؟9؟9؟#e#r%;)i.E!ǰ1l~ ǰ1l 6 v;ByGyGy16?OЮO`S?OaS?Oa/h_WCp8C׫sy\e@]Hu>oBB8JWy2tրw;eZ>ߞ93pU_خ`l9+^%eй-p fgp봽/g(:ʎnA|xF`+76ˆuaו!#y"ܤvs  g9K^Gn9#= 3gR]½Z} Xux ||36x<+_G{+W~3o&ؼ:йo簰C(0tΣ6O|z&6߁1sO'y88?CԵK ߊ OU ۽3ÿ!l的\|'by ayá'YC 2|,DgY[[-M3|'gy8l lu;?- $jͦ-Чr_l]gS'( ݆nCgA^ y%B.|g|g|g|mu].\@sm*2e]G`EjJ :\:WCޔΐM飭\m\bs:D}o#(sj_ߋ7%2G\6'Jy봩4n X ~pκxPxuq Gg"< f5-@ncć{#+t<|yC ʍڮ5O3mg%yf6=(ky+ x\F`)>P9*!O9"sᜊls 몮@{6!ErӸm6fІz;avlE1~/l}c$jr}{Dx6з)<<kS)A]33?m, 'e,V A?tIȍmۼm([6U.\-wI EOkފNxث\|Of[<oǣGZa#p6+7$7n LCˈc2|Q瑫#W4&@ B8oO_ƒSxx(ti,xN8>c|H:+M/l7a z r-[ȥKo!B.EDᔳN;+\rO8Gg.6m '?Ծ6<+kQ oRxgz 2\pYg?gf3ϊrQNJJPhQo+rU c)qvyg9 l}aɇ)q*Î/NO(~Ox-x-!,k_+菟1m!FDzp[&F}TpO#<;6GuUP1ؙ/Vz}DT6pr9U *'efw|;([ .W#zs߫osx$_^w{|hanؑߚ4?{9Z7ʇs5ps⵱99sΉunƎb~ck^[Es 纟3gsB^qmvT7[7Fmq1^r?FLs}sssssPVuXs]^~0tƪ<&Uϩ/$'{3}/¶sr}@yvu|"mʵ?9:͍67F: p3IvNv4pt쾬OǠX!4MgLcV?¶ la[ ۞pNg2}@A_zRخ½(AYwxFb/ f-?%)Wq]_TQ:Qn`x Tc0jKu<"خY?ݟ!k"ߖ;}o ۜ,Iy.ѼzyՔryz*yeӔ_~=3} {a8/^ ~0¶mm/lk]G^8m=/lcM<:?|a[ :?m/\|^um=/ܱٹ3˹< p5ss-vox?/{h}AԮqv^s~+խϊѿ#yaM]Gq'sl3}=b>}ݰc>Q.>ǠD19ǯDs9>'uBԏO:8f1%; v/9K!>}S[ˮQ*<z1'"۽ ; WF ۳0 rv%J ~ {۝7l%t,5:AKDZcA~WKc{<~w|[LwA&Wҏ2A?O`O3nSxtS<j~߃߭24ӿ${f\8gP0:'Ꙣg9u׷g:Fq~XL?Lҕ _Ʋy9>LQx=pbsJt7yfбήLO3]2\̫10²&R@׊"yZ=]%+r}Ლx,WNRzp#&­w]r{Vxvw_?Yv)s]g3^o6V;22,G-]K^p^pp'u5. 6~2ف|K-/7s"⟝<7g*N_B<;˜c6kQ"P ʵsPsE9pe }tl|y5f_eDe}bns< \˷h^Q}[D`Y,Z ۵IXMw)_66qE2Bm[N¥9oC.g> *~Dk/^#=;-\(D/[lJ"疋1+zwnY˲7Anp/81yTgz$KPxN\fxۋh9v'<|+މ\GU>sۙF{gQW~vHy]DلZst ~T8ms Z'cR.vCWG6edOjUn7N)ڸvl;ȽZn۷#1`gXd:/}91엂/Ff u8܃Nn u\si䝐wC엕0G?<w3L?snxur]+ k4NO|nGt-q(|k4N{yLd i1۞ נȋ`[gFy_fa+έ}?ͨ+C5ytۃڳh tƷc^eyqι>@'t\ P+/kה]h^u?A4.W~byli\ptrya~tl(-²nTm--l²_KӲ|9-Ҳ|I8iY~nj=|[÷m=|[+u-,7M~,o.Q?׫Nwg=c)ξ ʲ%l{\06`_I.q|,F?/sG$np-s;/))RKԾV| Ց1.ܤu~nUC)?sA.yl ~|S 'fYM}4?e$ga+ \nF {[!o~ؾ)tZTnYS.^ aGag.NEc[[᩺X~mϱ3jGx^^T`Gz,Maѿ4.{u[aS~6[_z} 6/uSr/7.RmtLfٗ:mKRv-̘s/۳| ۳|0*!G.кnŗ:^SN=uF.rk͖#\u;/u;зITm@ :7 |eOOa{']XIrW­\Η Rχ~W]Ư<*jm d6 #\yoO W3~V嵐 ^>U3)ئp}my koɜ~G?Ǽ,?k5},/V?:f_Ua_~{U²#k(^O zw|l:ܯ%<6 NmOzmV;lA^ f< lws꿯\|oEEY ۵ ;^3÷Mm/"ȍp9_7j<` @(A!?!pWп,!avj k^MYΦ^~]Y< eRy ȯRܨ<YYHS m+7ʞd(7(/IZ3ߤ .|rq[)WU>ḿoW +.;lw(Kﵸy`@y(T>*! V '#`Qyc,Aq;eWy"תPN rN>O)~Z6VWu[<?oxb˥/Z?g~8AN>9)þd*aڵ^emW,\bRT9Stlͫ`t^lw /*}u*P\ :i9cʭW~glp]/V%+a(xe'"$;&} W6*ZL[9O)\>S4=Щ1[큯W r__y `s<?|uRxepǰ |rQXL_Mr=TÇkz{] lN8y]Ճ3F'fqV!_wNhrwNR% } lpJɅ||, r 엃+ads t o<1 tW:'jw{)GX7y_{y=OHDf?9U Y}y\6>M:`8x :p·?=O/lEl pt=*9s˷<]ۿs~W!+(tsyfqAbp)\ wϚk}]Q6pX괸]1֯qX(@pf7 s)˛/Qvd0ׁNFl6{ [08x*< ||<~k{g+urbc5 ,; qo"nzf/9{#!/rxˠS7#Щ7,i n0B.dcvϙaO@gv_¦޹_ vϙv,!w&.vUE7ᡟ.C\~?OҺ;<ߚ`]<1~](; w,./ڹI5CU {[_}Tw N_um;?Yy۬~#i!Gb{.FGag< ?靾pJxA9%w^. {eЯτ]~Æ.b^mO93CSO5,0v`xŰmA /uՀ0MaoeS3]y4N+NpwǪ~?0|9'eПw9:<wwi=s Ͽ:\~~Ya\m)ę؜f缋7鞪7l8ރ}Hȋ\~V Zp=fiNo;CV;{~d:S\K=4||EMI<^t2dtjЖ| Rp91l/ \G;`^Nuzv! Ng0yBgUk/ z-΃\҉=N6Qى7;3;Ia:5QW'tzPl@!茢8:PӰ9 '< n>_%ilUBނNMY{a>[j}~rvfgR :dL#A'8G y.9pwx.zp#|hϒ,QW/x8]?3S6,|c~?,Vنxr~)6;n[ ;!W#WKwQqs1!'X|<Ls^Dل.\p< r:9Y"p by /ƞX䥛=~yDp%܀͐Byv}=Q' A1N!_Dل1>A}/4:)A!/Wd\pv6P&[m$ؗoW?t!&= xBqL7 OC3\g@'8s0߶~]}<[`!CxCmt& |0VmwK[/A0 3e3Bg< #h"tNyۏ)t"p <'zFz*X?ox?(ۍz!xŚKO|p :qO=wPXG;p9 ˳pzB|+bfظ\1lcq ;tvx۳rߒOnvGv~<G6Eԛ؋w^pyr^{\Wl-Ox!o~s#퐗BwBr?3a(xo ,aOrE]^8bE~@:iA^nfey/V%jL*ߧus"Yn r&XotpK+:lsBX >t}rN~ZiOygW%lWn 6{O\ .+5On~;;~ x< Oy"8i\)4pX?u{KrȫڲkC76Qx-{g`si|?3qg=Z_gvWkPW䍁d g!o9o ԕߏx~ωS Ǚg9T&6B܏oy.zq0w,~v*-6ϣޥ~Oz!>gbMw KV"ϺυY=wNHt*Zp=xM`5C~9 Y^vĪ"/Y +`sYχQGIpJi{³gyc gS!Ogsy^6Y&[;${*ui!͐/Bw.yx=!w6Ǟ5LCy> c0x <Pv/^/~ xVc伀tA%n), sMb /x[PwA:m }qg^o~bUom K˷Y|^Ļ// N#E/ !B:/95N45 ‹M;,/!^KSpx:%/!^oU@.u^@n4f+][A>f~,ԉ8;? y!/\kZܫ7{pt2Gf EO~)([yr֧~6av:=z`secE范$tY9sė1.^|2 Gg藿qzp#^qB;!A}g0'j \`qCY `=y+Xl. _i)t_ЩvQ:.p 搏1'S̽3(;m*W13ta0{Iyx1cj@^ & 贽s2/G! x6G?[>~ x 3?x}4ydC!ϟl`'i#r@\.1^;Zp= 6bp{=q:iB>^'mOz 5 .?k@f@6A}۝ /RSj16_\ ẔֹnFVpvBG/cO3}{@?{´ ]yXS׃NC19/APY:Y ;n Bށw_vBgSm8#9O{nLAg6?N|No+ :*'L4*TT2ԣXTGEE@%&xnTTXTddTddTXTXTT^g?~33g>̹[>ZېGk6֐dP4<KߞHG0S:nks>j/&~Rg֟M}{7ٻ(fתku:;]ufwSڈ:s=9hQƑO"ig2SIZ'|iή3WGkŤKIѺt zo"Bꪃ3Oe)z"Rznm~o1tWtIP$qoӳ?o>L>I'O(SD:R;_IkI *cg]㥴do${%ٛr/>(m0^Jy $^{Zth~ߌ4!߼+;s&7ʘMMB*8I`4V~}TRڦ澑Fב#姙bR]{(u~ƿ̽&9`ޑ̘=@k YA4$wP@/#{y$]'$ZS&-)md]d!mXOLjgDIiwP #A?j0Hkz ޴u"ٴatܤ1K 9d/%{9JդkIדn$\O7c|輸'3͌z3Pڦ4CkL:޽ONҩ3̡КSi_̽й<&OV4'$Qn_J?Y<=t)zi9TI7rZHn@m;(mm̽AGW9A6 cEg,㦘>ptRwdw"ҥ oit}|Asmb6~[H ރ(z͞?!2C4{?!sJBLULR=vd$]Mb֓n7v3O![@ A &5GHGj~Kt*Ҧ3ytlKhF>\?tSKt3峵m<]'uُ4Zt( #]:BJwWtVzvuKYA䡐%HW"]y[F:o D8Pqv;at5G[{5ߥ{ M:]?p;'t/S*3Ig+-t.b_J>I|-9!) P%Zdo|7(E=d"5~#{3%J>i'ޣ"K:Wps|;ޜ'ѾRIgR"YF6$ydkשnzsʏ7(m&ok^GD ݚfuQZ}:^ >J:t(ұ'}|z:ii\>Pߺɧ7ޙO1H'Rdҝ4Rk6v.O7 ?~`*V>oE1+IW%<5|Z(4׵OE3i&* @]M47$qM]J>M }鸐}?(NaTpYyٓi2uUG>t+DR|ӷȿttGg>0}|RҹzHR,# $^`I#E9H[i>${*D HW?uH7ntpY>ACI !ȞDC>tlJ#,9H.%d/ {5ג'F7n%Nt9)f/iߏh9#z.#ZW(MtIQc?$$'-Ԧ3tW ga E)o4Gг0|dKѾ>Hw~dKKqinlﰓ=fZK4uf'Ndϥ}i>~UFyh6eubP6wP.Jk}LǗ|ܤ8BjHvM{>u$8>+&칤?6Bo 2\漻ԎdO`w7O+H9t= yÏ;z)K1oA$Pa#HG%@:tsCc&?:3VB>T Ծt!{H7I϶_FW=fSnJ[A}Kq^ =g.JF:sx'fQ$NQI#,=~#{8 ^DqJH}BkWꭁ|HPyhug:0 ӯWˍ4M0ߗ n1qBɧM G=t,z03:OC>i3y^^ҷB%iw)PnZKԵлe8mT3NZhl1}JcSZO0}&SnP )nN1?}dO%LwydEi '8Լge1F<_C> h-dn꼍|:ɧtts\=NT?NCyq:ҽn'0z%ĒN Di=ͽ+id 6:N %|҅쥤)N%WO-t^n z6wD=ȞGeqO8RG 8J4gw4t"ycf']Jڏ|C~CsIn'Q'VڃQǒ=!4YsHvR.!]FPE|@|zu$1%{w s..w'I:tDɤ+ϧ=t6\J_dρ'%ŕRt 5|r"͍'[-HY-do&{[)~BB;)N-[&I>.ZId#i$%{oM='O-RN}٤[o#i Cy']H)2WP*א#7ѾZA"Vۤ:NҡHG"K:tC4YsHQ命tQiIW( {.́MF>:d^ҁI?IG!]֙'t2TҙI']Hws~HSJWw8>'iAjs;NkQ:n;7sқ}nQ:;*~ʞi׿[ztJft|o/^==OYWҾjH)iy7^O!{K>MJs?}@o~ݞg~n`GuM?9瑽doZu=_MW{?Ȟ4Y+Di곀_BtEyg]I7ni%`WC\ i"Sf.?e梠Sf.r2sQ)3$2t&2sT)S?Lz8E?eZi t'do'ILHvA?]?$G3DH?$GW֔1GSƼ|RH)%]Nq*IאO=MYɿt'Ҿ?'spd3'?IDgҩ?r-w"rh_DqJ~2.'ڟL{ՓO[ɿ|nuŤdͫ=Af,8hE:t$q]f~H${'ync_Lt9$zĵ^"jC-IJ34tҶn8{?S|$ԔB{_tii#]~g@?=oKs֩EeM]ҾJȿ^LiN2+@1CWe^doٔ쁓|/  #Nt? ~sgGeM`3IEs1vbb%g(3G(ǞͳSi=@>9edOJc/r*QY"7w)N&s/湉v?@򏉣9WI'y=Wzҿ5Ϲ'JݑtO Ǥf+}E}QJ% q ==$Փ"]If7&9f,(=n_͸l 塗ovdwvӷM6)Ē0}w#C:tItK9O9nӯjI7O3M"{'ut!|ڬB?4=E!LӎQܒF8L%=tiӴ 4FH0,-Q!9mmHt͙5M.Zjh8mhQzt<(=ɮRO*}]?JӔjof| ]Mt3+Eͷzo+=Ӟe٤f=셤KH"]Kt3t'Ҿ=F&J:t8ISIg璽t12ҕkHדn"Jt7ǜdɷHsұ{Pz=~^dSyOx*`K>2;:i#I<҉v{iޗɿD>do%{&KRzwyF:|bI'~M: IPp7$,:W":i${3塍CvoZM1Nn6qdOO&oC>yd/$]=vG>+)?d#9i"6+z#?#@:?#Iǐ\J$Soiy#$5{˔ڮ7?'v$eKKs`:l okl2yu@:t\:&Nڿ4)~ 5V筜[M#]8ҔCiwyP>uKeP!n5wzoJ#.}M>ÔJ] %$ҩJQ\(m YKi~ŞЮnJk{YOP#x U>ogJ M$!A{"{.fI7T1}s1Ыw8rx;L=DMw2ͥ}no$tWEKH'M6cL~UھRC*KM3Hw8L}vQ3??.= ?V]*sV$+==GiR"O/$]J>Ki+L>V{\8~]ne?K>tOWDviNI19yITھnLTNK>d%O4ڋb+m_,% s}դkٟt#fҭ=RY&ӳ^j ~F|DPa#HG%~f3c*srߑB44}|I7LMP*%J+mcз(M[mo#{}%F$]=tؙ#HǐN 3MWw(:hI=[?)N3M~ɧ[A*fze9o<ѱt=b]iB~| w',{t'XOmߔߌ՟O:t{޾~'{6\+n!/&77cn\J>~ C ^Ii4p\+}*}CzAifs{v{'pYwAѼg\)ms:L5}#<Ν)t8ʼnba=Nγ)|F@(AJC(Љ=J${mCH(.#{.j'B)= QP6ҝ5h?H;JpґLcXdCre+=:ET Sd ]SH7+}]WJOjA~vɴ<S,Jo"ULiKIOVk-kԏsDuCd?NU:S鏡s>]ݬt tҟB*JfA|ݭV>_A(}K}Lڡ}JT$t-tکw{贫3:L:tl ߬!(פXJ{ G$eٮsve U_'擽pN tKI5g7t)G CɧJmC=7NlBvMXw-T?}T?S?iƧiEq ;R^;UZ0_`tͅ)*1ק.'@;h &N(%{bMy+ثX?pOʼnT=K}9:J G1KFr%=t&i&eF:MlYbSvۧPi/o71)f Si~t=&C+m'{vP[8M}Π2k\?k;5\j+IDp*v+}nsM=1&lOޕb{.&g05ʼn 6/]`|*T*C-cAi#L”zn*m]4ǘ~N]{(M̾Z(N!RzV`CكI~Kǘ}SHv~LJY41yT>vVz.8TTRcr*KUJzZl왳So-߶0id 9:֔+wہ=W M 68I"J:ll[HiK: {5SP:ehS@J_z":д{ SDPڱE>TQQf|!7w'e|^C0KRFWt?ML`ӎn>،H}3 Yn|Iࡴt"ix 1q•v}r0NHi )P}>ScG_ey8-1(/X1ĩ8U!q+q9P>;>ߞ[N2+L~!t!09;BܢvTz=P::'ST$GIg7?K꼊;y'nS*K1lijOůR5doT#)?_-{SǞ[BL?iV1ϴ W>(\ Xg}Li{>Q{r*Ce 4L/ 4uX@ySEd { H8Y3>u+(N fLU)%\R:5дit {f_nYZ{<{<bM4qFN,P:P'ts|i-/99fWCyh5S4ǵ!xECxI}HH{+h 5ǗfRQ;vly)L@`SO1MSEm犣fiv8q{|\꫱,=fҶ,6cUk&M7af 3qfqL]%QMpi&?dϦr咽h|)"&f~ZO:/&{Ŭ"{ ꩿ=jC8Bj#dM53!m 7]='2y!NkO|ӼӵtLQ}kFǒO|WpS?,'{őoi}nCITdsx_"[ .tImo_g7F(mKp:SnHvFa_>FF 側|ӭ/}DvQzH˷ F7-ݏ--@vT_y)|+o^ "[4ZUd;_cC9d' h=E6JK kt)qH߱&{C:<-f:7&vF_}rynJA_3Z CM W4k8nJ[G>iGD>q[˻6*Gn)Kχ{OOymBe9^בOŔw+o@3ڏt JE:SHc~xy/yڻwƤ;siy>Ha)H˳$|>ͱ4ƕd!$O׷f~({?܇ַM)w-ןJwM.}QX>ϡTL[okWm-s72Y!j{&tq:t*rvޔG4'lWedPR*K =_fԕy3,41lݩ w)ť狀Z*FmaIh9^nPyYiۧyNMG-y(Nr}-@wMӑCP{G~[vMc%Ft˷bm0FK< -ر#wXKD=vbQ֢^#[5>=މz_}=)hOCW#N&sK6!~'hv!R\Cy kI_GRuۉ 핃v/:m}MsQ~oȿcC;\}P8wR̻H"}{I&}=4^x]B!~t)~cH?N OBK>zRAe.?og׳HW~H@_"2j*+WCBNTJ:7H%]KMu&!}Hm$Z3uXs|PLcHBt+I>Alw{~˷T#=Hw>EG?"3_HJiҿt?HIO/?/ik> K3I'Gz遤"Ol>w)o8S$=0I }>`#eM2Ji$=X.IO Jz"I'vBSI4IA"CK{EP]Bmw)_F:ZƵhX?|fMbs.)m,煔EG1Esc<,&t饤^N: W^I:***K2\I::Io Jz#ww3N'Iz+m"}IgusMw(u47#} HNگhWsIEMRL~jɿCv  z;RS |Pl]uroE}^&Z uΣE˳'`q+Z4PYƙkS ̵r-B.DK&e[ӌݾb|"2Nuw)'}h-CM_t )JW/JE[SnZoi8}B|Eq{;O^a-Vb_VkQkwg6 7oVR!b2`**o]%gqZ(P#F*} . yɶ6^t摛!g*vx3_5/xn=Xo򋱻T?^!+υ<(֫4 Fzvaܟj1^Cڣ֭؞`Ya%jhͳY'|n 6v4 ^m0B_딗S*$2'Mo?gp5,WiS\7mٟ~y> OW+Rz@qK$Y~$M^Pw5֨5VUJk?֢EX#ע\ixC<[K:[omkږGޠžط]F_ =7Vw{:!f}1__)nWJC5/,^&ֻ߫[-lo>j-k} 5kߥ޲U= Z]v /7i S=sB6ݩG߭֎hkuhЮס]C^]vݯPoPi\E\E\EI_(7ܤ#BJƿMVo|w8~|?#.ߺ;ݎBIډ|TxBWq/u/ۻU?bغ{w?VF):r0'P75ާYWu[z8o IoiМeEqj͔|NWͿ^}Tk,bHOQ)rT5DkM/FWwP{o+ ϰ.Foxfm!n~PZ:csU=|<jGZϬe7 7+`ǭU^㥯Wzɕ{nv׏|_SoQ)U/6j~Is6T߅w](Iw梅K <ܲ~Q5Y֯k#4O%[Oأgj{ً4IмumNPoG؞9M)?](o*w2PsBO?4jޝ Vixgu-sո2S'z;RڳE# ^;3_'  >(n}f$.>>!dy83倐oy~m_=>x/)^yb_T|Z%l V)|| <⣏GB9~i'Ǐ#>z?꣏BѾGrO(ǿ&}$>kz+cf^<3PkqGgY§[|(ԧ8sd殱CkBxx}>z9~9߅w}k4 it0^ F(VܤQ.ZpI34u 477w!< ~ W<2X  ր{&CYqb:͓`+FͺMmik4ew_ܢq,_u4G40R~ Rܥ"x<~xJ7B1 Is8jnP<ߑZ2Rs2p9W0\ ^8g$H/k둎^ r@( F:::(^R?J]Q,0 G96zhs4/P #4_>_󡑚Q4;5:o-,kZx}WinZy[ko/3ƶ4s4s4s4s4S(4$zI{4[(-2B.#2ՠ\u\}ԔupxD8>ND8gxljq}h'ljq}h'ljq}$n(TLG}hٖJ8>àp&8ˣg{rk \8)o{t 5rp+ڣc

 .80\y=DK݅ͅzqa>5@5Aq&4Mg2,G5''r)i?Y9|X V5^|| ցo`=x<6}(~~3'Wfd^"G?|+"u.l|+ %BɿP/ %BɿP/ %_(J_(%B;ҏqC*5 G2"Iy"}.u#.s\gr.=pi\d=޿tt ߭A[({{fB>grD{,/>1g,\HtU]}ʿ,UNYf;f;k8BS-PS-| o^-ּ!99޸A+B+B+sy^=^h՞үz}*~ƫkٖuPѸnKe!YGDzuPBYGe!u0 uPXGDcuD4XGv^˵59`4q`zŵbBpю80Kp) \倐ؾ\ !FjGYo@YoDcF4XoDcF4XoDcF45؁z#h7ސmCM?x2~1Gcޏ7~4ј1GcFcޏ7~48FocCM̛bʼ9}.\sObޚb^&xyCR/7yw.m.湹XClPc>J} >Rr>⥾n=׭c0)RBX' ? "o~ Bk.B}-rp,m_yso&m||~< 6oے8C(Gţ㑟x_K0.̓KP%厨Mz;r/AN@ZqZ.CeH a\ype2ea\9/GDU~{"j$O<,۲ٖ'b"D?O1'vy#ĕV|̷oѯd[ '\W ~+JV+NʷzJB=%/ ¸Y7fj}D0Bp8 gǷik>>?,kC߇! kAI(!uoo:PCVooooC`x|t/+k` l?[@)šC;_@I(! ~$%r_pה| ցp8\V)- %40 giC߿$|< ~}I8@Iܮׇkj?|| ցo'G(/ p% \  &M07ao߄ 3oooo-[0~`n݂w -[0~`n݂w -[0~`ccccccccccccf`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`|f`|f`|f`|f`\f`\f`wgS0Bp8 g`x:WS[`&( og[?465KGG`3w,l0Pp+ nb܂. Gؾ!` 8`&<L A230c_{@qx.C{=`E`x x)x `\&pow.^ c'q3t0Rs%4 X> >VσUK9>>C,weIZ:3!` 8`"\ & 0Lؤ\.}6#/<< +$6ͯvpUW^^~f4rq3lO_r'A7Fp5_=0X | SzɗGs4036p;fׂooKr?Y9|"2X րo{ZM-'N3< ǁ ,p6/p.8Ƃ "0l<zu4(M(8\&Ke\GVooooC`x|<~qulO߂7(x4www=``l?-q3lO_7`=  v/:3?x6xx.ǂ.p*N "b0  Rp—jU5 6-`W?i~~ _'v$v_@g٠)+rһ_pf@p(8 ƃ5i("٪y fa!|庩pM(͚iNPz1_SzӁ酚򻈰| ցӬݣ&Z)kԼ 2q I)iC`4g "p8 ǣO瀗N.A;0Y<_n{4}4ejh^ ^׃777`x  igxp ~\?loVѼ7yGz xl}(8x|0 Cj5w<鏃4WWC4 itpxx1^^ ^F3Yl0 ^F1\p8 E`. RpLWW+$p\&k+׃Tp# [t0`xx5x ^ w׃7777y-m`>x;x, ]=`%C#`)_Q1 |||,++/UK`5 *Xk7}`6<փC`x||/_`x'xx7X~;\F&f0 l[xlO߂w`'x  o`'  ZI><gA?p8< Apǂ!z0 ooo;`x'xx7X}V|0 GNp 8 ]8p<8 'ɠ^N it0^^ FLp8瀗` 8cBpƃ%`\.J0 \׀ZJ0P[ő6H"/ULp8瀗` 8cBpƃ%`\.(wWa;W)\7 ]Nl{{"p7xqQ ~<~8?[//6+?v$-~~8?`<v?i7w ><gA?p8< A`p  GA'8 .p8Id N/a4p://#KKHp&8 Fsh0 烱p!0\ . p%Wkdp-x%zuzp`=@@0%6Llr?-Z{ZM-pX  ޙ#0.A?p8< ~So{Dpx\׀ZJg\E`x x)x g(p|]>5_/B2p9H[5`2L=:p=L7`L3Lp+ fW!u`oooFk>X+/U J#h޾%C#`)_Q1 ||bOLޞ 烱D_g gJy `"JJ'Dp8tS `Xߛցo`=x<6wF>xl???c'` )x 坝9?.[ fׁ9z7<&ބܛP{z(>O(xʛm|svw8r|ӑ}/N  `SmN-w݈{c~7K[IV~B ^B yl_!WK}}}]xP %P##.By>r*#|PgByQ(3 WܤPs޸!ܤg/xSבm"zϱۻ٣[ʻy=ݥ~eU?S&Ea|vzfE ., 袠" (9.H2*A(FDD KQ(o=wUuuuuuq$FҮFҮFҮFRo#7.ǰc KջT%h/g\|'w'p>|D1)lLZ܉u:y7ރ}bjW9~ΚöE.E%r\+qMq nmwn܃{qx7j=|oaz_'j=`cg6"tL_석 j|k9Nǯp .eWJ\E0a|G*j=A|ϣCXb석Q)y&|L܅Z#O3ğ Z#G8 87܋j̋&̏f,`a,]+d\zG ZÃO([0>|kxDq).C#51 ;cUs\=#qU wWC7XYlp:@G `A8\+\Kq. W\p=nMP!Ua|Ū>O`u6"/cLL@ !8~<~Z'%+Xo:3lSp*~_t3qER2'KM z)q]OK c`a,E ކ0c |[b'Z/%clZ/ˉF01laclK2W]xOY4_@OYCx7-~?q:+ע[ "LCuQ\PhX ʟ󋰭/_4lv.aw~8G8S _t3qƹ8\+\Kq.x Jx>q|c |š4gYu.ʟ7U>b]!6¦ [b+l/ݰ;Ş 131 q~#֣ujc l162jKp)7F܄!<1NS#jڴ_0sp~ !8hp}A<~Qx^x x'jaoX bY,XCX>U1l16<},u 4g|\ q.Ưpxc#9%[<1xO)x̋)ZW'/a\:;byYC6h8Wj,1,R<>Oj}` .Y8xq~Sp ~Ong#u} u.67j}'܁ӏS>5i1sp0$ʍu.uKԺa[7('iWM#ZG(sU~fj}ጰ/o`|{ao|q_WO`uOSXZ >zX`Cl 6fͱ>-6E| _v ;ag]v |o=>w=131 18?A1~qa8GHq ~c3qNI8?)8i%N8glsqb R\qUZ\qnMq nm31 18?Bƞ {c|ԺK=S#Ɵ gy /EeU_xP.e1F1y̋oě0?x3[0X c ,4ފIXoòX{ao`_|~>~1300sp~#'8PqQ8ۖx+&a b9c2 x7ރ}X0+V*0>bU| V$>5iX`]6F`Sl[s[aklmy|_ėel`a{v.t6Kgtv֗GQa5|Xħ&>|kc>6cl0~pKm?/د; #'8 \Ej\CZp=n sq3Mx]t{ x0# ~G;<߳ ae#(Vǰ>O`uOSXZ >zX`Cl 6fͱ>-6E| _v~?b!+lzX [x}QsCQ߈07܊p;~;p'ݸ>܏(׷wx_?*۵^w6u \p5vp7)a۵W5iϐoClL|l0c l5bU| VO?cZO l 6fumT­ |_—i*vN`Wu_=m쉽7w/K~YA|+c|G*>YZʱ*\kp-7&͸6܎_܉p7<0||6}?X]wn{{֝ zyjJ:y<L>O|Wk޵7h}p?@ǙqsHg~x\3?|&ÓuG8=Nqk|w^Z=?0uën:̄EBo}![NKm_.ױ/ _gu_Egg|VŔ{18|C>{qX>{7{;{1jLϗP.^ZꎯrIo_S2{糜^W/ oE[ouko-i-I:׺:uuqH=nt.\o suGIǗ:VW:[];[Yᅰ[_U[_ߠ~oF}/d=.wWxo/{{8=>a/\֟>sk_/|}a?@~*{z:@NRJ{ |(61:ڏ?qsa?L0Gpx?{pzS(>i's8S))yyďӾ>Owڵw9M>M?Ws]ՏT~G~N9Mf ~O>W>#O>x|Spn^o)o ?P=ŗɧ╿~/̣  |4> O]:OXIiQQI$ M ms[[+cz2-LvFλ ]PTPP󓪿내낁===iړT{P7 k\N|3L2iBBB[:vAסۮP88u(:hTvWkpp56ªm߀ū꿰>ԿT7rU5煃@_/LUNPk?տ=/ǔpMPk?a_aտQ\a0I/<(Xp(jv:A{O ,宓,˴tϿkW_jWikikikҴҁ=fj/IʡҫH"^\?[d$O&nJT{j/J"^K+ڋ3--K]S$IxՋS$6KKGK8zIb^H^+QW`<@@@ =Kct} +P++(U+EcRz<걂 Dݜ9GE_W)E_W vpp_ 2~ uI_vznUڮr|M&BPޔ3RRRSSh |<|U澡2]ecƻ*WaTzwTt>RK 7(G ?O><ۣAA_OUþ>sCV>F9ў  {ݯIW݅S.5| g9޳Y,S>ހ4 Ӏ|O Y***)||jPvO,|]jקS{.L 'ݵ-\9U(s%[[clm/~_"%e zNqฯW\=G{/csS`'{o~|S>a|hR&G܌{p/w:{@]+R5߱+p%ըGsp .܈07<}nq.EewAז4^˨uRIiuR땥'˼Z:dP8Wjz`Y AZ+V`GDk}=oQ 'zoXlzK\+p%ո:1b3L[b+lm-====鿽追追追追追追追追追追追追追追追追追追追追鿽鿽鿽鿽鿽鿽鿽鿽鿽鿽鿽}}}}}}}}}}}}}}}}}}}}}}}}}}ߥG?|~={OOOOOOOOOOOOOO>pSSSSSSb?=~znx=*O??OSSSݖr涖d-5/Y8 WbvM; Ŏ ;n4x_YǤYO /x j۰,dw{w}ssznzayQ&v&5>LJ >Uacp3w5KrU59 \kpnMq BYr>.W wn<߳)<2j|I8/u&5K2/f{}P8WjϠϤ@`GDݟ6/ l^sqy慁 fbqԼ ۡ>#> L.Wj\kqiyGM)6Tl-%ۢ杏x,u\JWOD`_4;}~c\jl?J7ΕCx=|x5ϷS|>+U.rY_s>x;š'&S9&P cBpڗcM(1rHCvO}g"Hy&|NI$?3;&vO .OsI_|)uIekd`oǓ\U|N>98?ٝt:Gǟ=`2~08MLLLL|7ɞIO|`r\}J?RS\9u0ŵcLq)|<5y?>)X ć >ir9EԼ.{RrU59 \kpnMq B|\ q.Ưpx5 <"^FRcߕy3Q?t{C)<\Q|dRԼ.S#j^xI\\q+n5]>܏?XoXb1,%PRs2 lMbsl-65/_B)=مS 6./d)qJDS iRƩrqJV4N- Z4KϝQEs\=l&fm&V7)ϿM=oq=q=q=nKzNySvq;(U]y[ySQq;R{IIIz{K޷ y ~@ޏ` V!r/5lޗ+p%ըy_%WJ\p#n\܌[j?ؼ/\p1~p'ƃyP`<"^FRU}D3;b&BePz8#ȹw~|M`fbq<-QG2Oe><}y(QG2Oe><}}}z"8~ k/ BjwO2.d|:<Q??4h|;Eϡ>Zshϡ)}-9>v}-7xL0˿x}}&ϡޛϡ?{>g݁>>ø{ Oa;|~ 7?kVG3YFt?4at}θIygw|YY{֥S9*Y_~~W摒_x~ҟc8Gs9_Tyy%~+2us22BbಿW9r}u ŗ*_Ϲȃ?}>aH|? ?!b%D, b/ ~e.F>%o>ßԑ~#V?7G>GkW7Gfz9bWjB/*Dk%_X$ӿIVL2O+C>R帍6%S˱KyI磻ˆOj?(uڅx!5^SGyS;#˛cտϐ">w=}zw$_#xD*D>/bT+O=<7mx#ߔH.xRU%DW+QhR'URW9Rݷ*>G#pU*׵jϿj~ϪFUX?SX?GG]XթGl\Q5(ד\5oҿ͚{^ʥjFl<q6MyjSmΧꐮꐮοpuٯ.ey:ՏkK]$ׯj;nYϷ)E3W_f>~3YĞE6V raޚ ?; jM{i[^Z^ZO[O[u^yԆmmɷmd?ދvoڻQvm}v":+wiZUyIޏ` V!GU1^"1b[r9E}*%sX=WjsKp)7F܄!sX="\_2܉ 9K>'Ƌx<&<&O>P߷¨543Qi/e=*\UgP߿Ũ661=l׈}n+|-bgr.vw.܃{qG=us{Γ7c! c,Ű8@=v߈r׾qUZ\G~zޔo&a*6[aklmQϛqV,lޏ` ^.e]K}=|T1Ǽ[&_7 2ݘmyB~{HC׮z|~L⇚ɎERe-.ߊ|neȂ 2-7-!< ɴtHw[t%͑oG^tr.sFBG}#I28F|7R?ſG|HJ+4ŕ?c;{K9;˚ɍClwu^q83:5_7lwpX߼ c,,E׮W_m{!OfX8Fox K_49Ȅ,;,ۯlm e[>mS9f9,u)@7 |9@;е7w qrg ȥpǮ.Ӓ p sq62?A8Pߚ,eZ} 7 x'Fnc6α uyuL~(77\[(Λ7RLMKni岤k;^βX#|;2#t溏tOc4O01ǔ16461zƯiZodm+C.4.JA"2-~l7.'z܆_{:)|y&^',oNLT˶pcoHx l;kvH'c\,.@om9ϣO{^w8߾gz>sM9,TmF(4W9t ym\לT!'D&dʷ{{d=^; \lj_#&dHk9Dw.c7NuU_DEOslt9&2%_S/;} Ön:fDf3>";8gGv%dН9ll!ӒdYe[>ύo*#{iL[ (BO,l9 2˹(r(j~G*>q|›ܱ x}ȟ ^jii%;$M[ ̰rϰr2Sb͢x,!ey,򯃝-]_VA9{9`c]ǿ. ?az/a]zYtV^+R)4> CNb9.g]ҧeH_3.g\]xqt9ro45-g<[θ<+( ʳp1WҏWSnfnZ&O5n{{Z뎷/]y%gmdMC|4_lY,ߗ񵮼~Û#p$8?unpOn\¶}OdwLdwjftnrS{-&or7߻?\+?nL.߹^'|r]>VS.7dZrM9 ŧ-sk=ͪ>jkdro~r|ym>SI *5tUx۾9_Iy"Ȑ&MnEzkOJKemɛl{>3ሾsbAQ7-cïJ˘f9LzM;z*<-{Ñ +\9).#%lǷSgHEdI7>gYl Y=C$5D<gS]|%fS2nDqZlzy˔nsr y2md^|# Fc"Ye#?rƟt_UY7-]b䭞-Wnݒ.>lP,MɛmDD<ҝ *%Dz]y1] MKLimc3WI/>޶_~m;>:?{+-*laMK~{zOX,ySəL;΢Lwq{$eOβVF3IOlow]Uvgs,] wƢsr%W`6s;gA bZٲVhXt% οHW$|[H鯻)i~e.k.• ܃{v]S#Etϭ-E QkOR(!j(!;3-Qq3xo7;^ ?Wlk;meqa8G_t\]֎;956ţأ'z$t*O̰q=x0ϔBE2-~.v]{2]+v7m|Y؎߱ /n4/avp܊eqĻ&毭sxޙ橼GCy]/a6x'w4x2K8i*if&f8,qCݷ䋞.7t?> oZH£y od&s7Fo~0+]sn D }1Pl/IN7O"f}7G^[q ]u͐vP(j=Vzgq+GfE._']mF|5Cd1m:oz[(ZdD(T$?~%[qE_%6qu7/]/+|v[[ da1牒fR̆W_1+F~ȯp7s%x̐ʽ'ŏ1|JQR_ʵ3,WJ%#~O⍄EOF͔yhrGi(/)vW_fBwD#z{ )]Gfr,]shT=!- ]uފQ=Uuc"9}-!-]fϻon.ErK[u#o[ߦyYʵNJ_):MJԞ SDEJhlKPZ)Zk7gߕ㇆B^3OvsBߐBc\xH]uSٕg׮gew}P9jqf[·\n,G}Ūюɡp(~,CV ,K7t Usm'-y Ώ'urqLxtH>}-| EС݇=I}kY o/kz-̦0eyyy-=.~Nv=Noo"CoCςL˧t-P<cs[.~,@ ]ɑWC}!2-  -ʰނ 3m7Y򭨾I|O½9^o{?ߡNhn{_n'Eߏv}?$͓iL7u}xٶ,mVnjki^tf8kl`Lw~ywKܞa9y`rͲpeQĜp6ƥ&[`+lm3v]|1ya# hj>׮?oiNN8 \q.ոzt ~?~?~?~Ӓv3(Z=Aߛy|.z':ԏ3C2Opw 3agGtram/{щ~tߜ)?ď%3?3wIbqlqll0n<&}'}'˧"'='Q~D452KvO%[.͑PI3 O7l?噂Se*_ӈF}L#q1ޡ}̢gQhOY,s+^Yqhr?krkkkU\97"f! c,Ű8RX[,^Yb= !6b3Lţ%xK)p)+F)OOxƹ9>;=ۼ;[ؾ%:0vЅJxm)iTʼ zm~펫#z:5Y,r}a7+~ioѣ.g糗v׵ӳ2oi#lу~~Ad:L08L9P# ͔.cRΣ}G]}8]vO8u+H>oX|wK{}OI=`lqqgquğ$|߰'O)ҝb<>ES?Eϟ\j<:-GZό/?Q%e²f_442\+quCD#Sn|$Cѝ~ٵ8,].#.K;W8Ε9{>x}#}«,Ss_FC[0/&b>.PItIK{\{_(5_ ]=GcVhl,RGycoF c,7c! c,Ű8X K㭘e6,0<ގwxs_o^«miXxb|˯eC6'mg[Λbc]|6fQ,}q-ɒymͱBn\(k{Ǥmzț\/GtR,f!{HM)bslaKl %9n)[j47 cQ xމ}XÆLW5l#v|{c|?c6~p֘ݗ1n-. 5t+]ƥZǜ'0T ccoiɋe9_nW(\?{4s:bK}KL_IJKt}~M'V]y7CK"l/\={]S\"qp1aw|ķ@,9Xv|q~])Ǒcy5RT5Vs+>8>ձFZ i_,yo^7<ՌH8.'|-ӒOqX-bbz~{&֥agc&FcdXl9(> M޼r,kQ;V_[N{Z(xd^O1pq6.U7&͸vwn܃oxZ=PutTSq>?[Om/eޅfY^^~l|+o]UȖvNmOZ{O;XYX؄oG}7`u6⾠ RCXȕ+_5qwT©7._/+`ބނF[_oG80pQAs1,)](mWpKm^KmWcII?~)y7><kY+ҷ%"D|;귝Nv]+̗fBE8)Coy:S*kX.Uw6)ҩ)^}>ڞcm{uH-w }ws6,`v ;co!8 xqί;% 8'dT85.wc\շp4nmln5~ބr4qbWkoX޼OrlTކ8Vl]ߐw+gȼG3,\2Kǵkgpޗw/N }c>5}Yl7FBwדǻWx\[6\1ܶ&"|kdƲc|d@l>t;-'Z@1C MI؟.GCcGBYk'b%aKaK?,F^OvzHkkFĦ&NIŭΑod̾?KZ9FRΑod쵄^+礼1mWoGž MKw.m-uk41?DzxEXY G62Gy?؄Nt?}-?i~m~;ӥ}896)vGǚGzNB9i%N8_j_̉-o;@o嚧_JzCj(8sp.khnnvoenk -c .Jiaz-{( WRX,v+e 7a.nF}ʓ- qQHo  -^}Ilu_|ƅ%si,-72^<.7~W"6=o'|];\l__]Z[sGgd36)^=Vz&yu^Kx=/KN6^Mn·˴ɄPT9Ƙ#ysc%D-?(-B_q>pN}sOCsoC۾ G絑uKOnpnm-/c%vĶĖ,7nnw]_Ǿ;qj4˗6oԸ9 5nmbΝ/ '.XjoZX{ۥ+q\M/"s˫v?v!#Tw=]xi!3:&,#7]OZ}$t2mӆ[mwu]9n<Ȑ˴f\;#8~GoYRvJnXhD\_y;/i3ezZHs=1z|0cCB߻+fH[-;As]xOzfʴW3-|kO4{=1;Ko ]=0,) x7~dnOX,G)05Sͧ-mm, sz=-#nqϊjhhlkK mjZgI4%kkq䯇˼KW^]-){e] vJBjlTbp^b;?OaM|ka]lbslmct*?dϹ[BiQZM(ʾB$%XSFdBhѦRSJE;V7Mz>zz>\>r}sb?,do!ΕY%ڻRcy- OZmW-ʩx;N&Py+`W쇣zcp~~O3ox?O<XG187rX+`EL`1&1ibex<`22j~p~x<_<`lҸ}ģɶ!}w;;Hodt$|q* my۰.ǦM{v[ȷ{פCf;wtwgz-|K桌Ϳ3>g7X9;[2[ZsweߡS!/grvW.Oi=,{{GĹ7j}7O uuc'ݰ;>8P8<b\+qg lȷ6IԶy+?Q;d# ;=s\i,e/'"_?Hil~Q4/SxNؽ{boG=;øWj|Zǣ-X"sWUAu6}7O[Cf!e4üY,] 1vsmny\{m?߿#$̸o_݃ J=ףZ~+M'q;E]ӟr/jẎz|긿v˧S٫]{0HN̾<6k/QTĻrn >0n$y`&ǟLn42Wm<5ˏ{,WMgvNO,93u?dY~}5wO:vWl9neӯ7'v'.Q߽l$ IO8/??]& uWڳs/Ϛqelo쾃qY>spH>غ p ;.\x.\}x?>a! }.1+bClM2l bkqq"NX3q98…KC xn7lz^W~LH+~cBJa,<b5<W.ņex9^-`_'t,y5E8{'ޅ swFča7j8{~X?.VR),o툣p&ƾݥМ=22&8Ql94GwL ɡ9#縣2\o_ئ]>]1˷<۽,wɉlMfi sn:5S.N۝֭:[{Ns-d"_e/̡9Ot7Ιkr5 %nMq[)aM&X6Kʸtu{(GSݚdZxow}jb3-Q"/N(ltK=y(]\{,gxz9,fO{v]90lOO"qYapf'g9l(.5 U}1=/+w'W[QkNn[O [X$g;K%Ÿs8? 7-s&|k;pml W߯-r>>L,|Nll3j!$  [23y>?~z81<,;C'+:SN̾n="(cqÿR]tGvLwdzwzKl=D\p?kBC>+oBޣ88K oҔPZYn*gf8_Tw$s#ݑ8 KZy8{\'O.p&?ǍCI3+b6&x$2񰍻:Y#5֞kBo.7ȿ35&2u |}t*'+[ϔ&$~7/C>?w;O&rR:o I?r'֨ឌ5SPN{ǃ\': g'gzErXeشȗ_A7sha=k؀&|zs7}~=ΟծAG!Q;LDŽ6|龍Oa;O)\&~a?SI'II_Rw,Rw\ʡ;.K|;VZw,ڮ\;. [XG ߱eOT0^eԫ,\^e?^J^Re:|X?ZrOzU*#Ě qY\qYnJc?*_^.Q|4Q68gFsۺsf8+8+8+8+8kڞV3SR[ͦ)Y*ΙѪg8븊M_̨ZrfF9)/gM++++gF%̨nJqWPqTܥgF[3 }+RqWwWܥ.k~LDc"_c3Y.\\T}EZ?+Kշ\%R}E VrxT}+U_ S}[>]*=[tX(*L_E!?(U_U%"+/5M_Em5W%կ^J_I(z/rC95_F/p|kȍ|GE8zTjۊ/ |BjpQm_yHjy\۟sX~e,?|W>+y)%տdmsXeQ3Q kA-o-o</_qo[w~;q~'1׺7XaG<V^Wa+l+-*l ;avg8z(q,WU܊ 7-܁- [clpނ7}Fr\| b?z2l ,™ֿ=^Ex $W#8CKL`%Gz6wi=~t7Vc1 Uqsn.b< x3rױw"]GCǗ [)d7XO!>܌쇕D`4s_ 8`d{%62\+A|W:܈O~22l `f.F?nrE8~ ~7|s!ngB9GsM8oƉx ފSqNǧ%#Q D< {yc#|m B]Ͻ'$}x?[5|&qn <kb-gW-v 9$n§|lEx1^yx)6F`>^M^ͱ^WbK [aklm;av.x5^]v{ao}b@qa88G8 8oqx x3N[VtE8gw]q!ލp1ރKxޏ2\+A|ƕ W#:\܈>)|g9܌ "ne,WU܊ 7K{ LqyxH?8oƉ8 o[q2ކSp*ގ_vu^ o[܇~/x?/+w#ex3x X+b#1)Lc%<+c'`5b] x3NIx ފ6SvqLqyx;.\ŸkvOƚX k)XOź9x,<9x.c/ċbRl16| b3c Ėxb;l#v]jb7='b?,x- v48ν K!62lrl- [U [cl=v 3vw7I"b?,x-]Oz4a,sqށN `1M|C;q~'??9~_K+oq~s{30>x?<9~_V?>D}f|_q /c)B~k0.14Vckx>jjx v{b/}8W^A?NjK!62l8ރ-=>җoCĎ 3vi]M'b?,x-8p8^#p$q4G&f'|5>p#U铰FG_~ggO/b\w"\,x/އ ^]<}^-*lŷøWj|Z\Q܀1|~9\< O3LgXsn~Hoe,WU܊ 7-܎;m|}?ĝ ?q7~Rz-{ [~8 Ǜp'\C*ׄhws4ZD'Eq&qIgǙDj{gD8r91RNnMbL Lධ{q;rM i Mj!/~ ^Ex ~7 Os%Cd{29#.yZϩQϗJ=W:= "n S_7syr#> "[5|&F=7#$n§i|7>~z~(z^H~z>Hy{1瑿zbʷ-y%D="\s-"s+3#dVg|wϘs""VG}O,E}O7y|_- s\>Gkyv.x5^]; {csrGOSu1s0Oἠo~Q:;ZYj~d;~ ;m>]Ͼ| y8vőFŖp,J/-KB\Z|4z+ӳm>_a癥v;o7oTy/{y/½;]oIV*jhwx eP^~ /bEkzR˭.~X{4EUT9E˭\ˢ9I/.R2/,Z?uUu:jοˢLUZסJXi]J].2~//zy!ΪT}곜f,h?G>RYGYSW]AX]PF+?>H{~PlR=R|*ZimXWσwUkC;>kz|-ZƗT}RSIgmtdmtFJQHY=cYK|Ug]z|4-rm`~m#S~c}ʣzlFcXTlT>s''B/B=_68h~DDQDm=2B9TMoDD?hf&(Λ6o61mll= Rh >=?=K;<=ch8l&Λ#f73of~L=g63nf>?ao+hwx{wv||Uvj+Tn vqQ=z{g;:-;';xlw]Xc7nnawaMU!z~nyn곛;-տTR{wOn7O_ <j'',RЏ{{8>'ԾK{8o qU|)>{={-{p>t=\퉆{0g{9O諾ҿҿ ]#o_8(}ѷ6}!N7wow_ϪX۩T}:~?G33쏪xO3s~Ώ (~<)p^Q,aQ:@n8C*q +=>m3Gc`r0,aձ#!?):Ϥa_8/Wկ#qpt4.Mu-3:y?ƹp9B;GB=\ GqGh#џ/p>v8E3~e/eӲhRlͥ9,ḧGqG*|Ɉy9#>j1}\RoQ+?.5ޥ'RU=دWٺ.KpĿ8x3C"K?WUD(xOP_$tlQ{GD="QT6E\RSR*qRGRJN@TqTT!Um-{%5Iw8WRuwY5c?zcW)Q+/UcXX?*2T&ĭ2qL*ʱĭ2qL*7UVL*s+nY>Ȣ|Y!^׸SY?zJ{k0e8TJ(_ˢ|Y,ʗEh,kV\)Vr%ՎRx\\x<`U#j>8UI}>z}>`\~>U&Z\%j >UZ|}> B}Ո{5M5E8Vܫ/Um}j=Z5E5E5^W#Ո{5E8Kf+Rq=̇m+#C=rX*gnm|]nJm'};n.b.K;Ҏiq{&8rf˗r!NZ5ϑzyW6|]]WՅzuawawawawa_8?r=RGa8oϟgul۫ƉY!M!Ma/d)d)$ıB cYH 駅Bi!TW?- ~JS~*OemT?OP!?o@X Pqqvg(G=?0x ȑk$ #NiSIOFh1M{q&TRu41:`hίc¸Ucbuǻ!cC<|,׏c2K=/:\) re| ?56G/Ɔr_ qV1.xs7&rɛ %noyfr|m79~rgOl2_TTa*JRvvogi|O8i|O(g;+iiq-?Z8II@gzs$X?lMg9tv^Op9l?~.~.;yFΧs?m>5wҝ;c}.wvbSqZL=ibS/f\]v[ﯖSsq[A>+\|>w =ŵm?ļCx(WWJ]qWJJʿ򯤽V^+iJk%Jw5]qWǟucGVǿqWOVsձ?j;9j;Ҟӧ>>=c:?jn롗s#VF?I?N cOP'(ϓ ;?sOO~OǛtt\çv=L>?m7/|kܿLJA?ߴop?yH(='Ǝ {N2|,$<9ɠ='2_8.㺦Ve;~YGO(:󌤧?i{2Ió]9+vخG>N'G>#G>N'}I3ގ咙v\2)oy[򖧼)oy[O*ɪv>۫&Oߩ)}^RT]v|I'L|NUiI~zSUکj2UC{,کjrݷj 6VMf}*|6:Zҟ?IXk5iwMڻ&]I{ SkRZS|j%|j%OU+j%Vr}cEE?\kS|)sO&X'͟3Kϙ%}Iʥ&0si\?7߷kץI=W󋜀?Aj=[n?+ZoCaOTy'Oﻤw:?#3:V3~g&3C<|־g3CW/ϻTwn{e$/Ihḽqyr}yK-E-C>cC'&sgdgaxbO߿'wsC~n ۍ۽9<}v{nmoy0%4 Q4%QޡܫC_>˂k~Gκ'ZrARcɍ?P~| ϹU[B;=&'fXU-+A}c?oMnM68 g K_|^-}ܖ:y}毣}}1ݭn1-5_e ܦbw7޴L~[W)5krT0ogR񑊻TRINNS]j ŭu8nqڻǯ*q:Oٿ>gW}ϧҞOItEJ>]yʔ_L9Z:U#==S~kje%65~6hjc#چ5OK|.o!I6q ȯ RoO>vK)?䔟;$9~rϿ':I_'hSܟOq?9'|iSRoWSS!gޓqMYK'+{ISuQWw%]GWѕxt%]S#>lp5uA*OOR~+ˮ{=1Zz^ [{!݇tdKK蟗oԫV~a{GajmWoS q~]&dP_Ryj@<c@@T<TC?qX=r)=(,'mzwpjL UzHXP?~FQN8xd?iѩڶ~LjoLIchR7ؐhcm)~7R پޯ+ǎ|ob o@'P PO?fŤPg$ϤD樂p~_NJl{r{?]Z{lR.O5oH޷x׭U[*dvn2Mf/ma),,})|||)S槞Ȃϔ굀|O1bOc>Zh->)b곘,f$!c%q]nVuw.57˸bnwkp-q|7pݫSqESXKql;F7x7D ;j6«ztV| aIGE<3dzkܕxzWu=+Vv}Ϊ>ex);(cp_[z;Y{e |[;}nWP8Ѹ/;{/q6>OݟVݽ^rgXۯ| \'8B~-扇Sm\>zéb;ʐU_r>W}́9=6d%=6M-!xpMHk6:B#l_~g=]f}~}g VrKg'wkӗ2 hZ@b89p8ǹFi~eϾ,1x%}7x/2K-6KS~ +!8?ܐڐU;'n6?Vlj wTq{Wu`!kq]{IOkp=ōouķ>ht#z#ZqnҊ!Nfa+:A%)'ꏛRO8616qMo3qs9~sZbXwewr8av/vaz>~啳d|}J~~*l ۏ0+<8spֿ*g_cS,m֯Hi[182w}"R-qϷvXCܴ~~GXޟa8wy?o۔m{'=RZ|j:<}[|s#X?Ǚs&晙m~*p=vCL/Gg8џ? qcO'OϏIԥOSZ=?M}dLO>#糰^˿|_r_#̽+M>7oRq8f?׶w!])mon@zlw988Ļp[[wQww1ރK~|rk!}QZef{ߩRoX=H xR3),~đ= RiO.KԧkYSSe|/RrH{s=ws=ws>R^x}ƲPffZ,K}xj)OxjS^u(9J}R(>GQsM}ӌ4Wy"(mW=N}qFרW8II*NRqL{R丙i'v>錴qIcҍ+ic~ǤIIvM*1iOs\ڟ+qrJ"i~\{gH(=/EH\{^$"iI|ҞI{^CiWyVri|ڟ%?_^*O{i/r+<.r+rK<ʭ~-kuoCjAb?~a;O>#oTQGv:-m[?[Iz{LXov:_4HynxB<|\z>3̳v:iK0-աv:׹Jjn&ݧfD{L"Γ?^ϷrJ5%ϫOe{1|'ovNr=\m\ lӟ<9'=']c8|dqs-OZ?o>O| 7џ{ҋ-?|)仔.M/r-M/r-MziRa{}>}[ćs%_W}~σ+NYWV~|VS黬kC|^K^ߐ¤oJ_!®6k^&G iư1m ,1*7B`Ipww^B).  (P{poh m»gٝ=7w--om^[.m_[e6oc{Y>{;ݻgv_)ivw|owﳤ۽kMHK3/+Nwzw^;N굛L}=~~^Դ^?3ݏ,O5Ltv3{ȴ3J$?yH~$ھSwN|eeO1垦ܳw]=g =@?f֟2缸jCE{&e)ϲs&neey'2x2]u]ʹJ]H>n;0Gnޣ]XpUy&i/o/h|`\4/}Sm#5g6s{,@ӷLl{]˻.qw}1ߛs5ߛ>H{癴{iJy޻u7ecge17'ߣl%pf+e>\4x[|-y-먟dg7qG?Y8Yz\[znnw߭i6!7M0dy/dU0\Vv\3l~" +д+ 0K;ۛ;L&[L7$w^/`,JVA}QUԣUԣG}SzH>zb!}MqK%8>yOkIί^Juӣq*c7.kU09-}?WJV% ]ŪbYUfU˦Uhgk'qWig߬bU4a+XxX*a U|,[Iu72W6{˖>Tu'u3U yyYլ9}լ5闚y-6ǵUmU7ǵUÜ79ksf~WK;ksֱjzVL_*)M:o-w&ۃݸwvWyn'9~ޏ[IL{ey?dMCh0 ='5h_5`|lK[/ͼRVq%oVR>=^/jn{=ٟ^mI^}V3s|Iǭ3s|M%_⠥Ҥ[IʤXn[-۱`7,d;Y~o_V=unxzj[wtUu\IV-'/cƁP0+W>k_K Gg^f~[pևs] gp%d 4x1|}d{AnI|b\d4 %-)J|uI}Cݸ ,=aG5zF-}4_k =3יQG~43rH@U9aca_iqfåj u-@-:εPF0XsZ kc0y<޵{OpmVVǺ,}~8 b2L) x/}|vv2cԲXkUk s2Fzo ;+{x3civn{b/ F{>R VǸ"\K;\ ;TlPe#njw=`~qAp8Nb.\Z\qnpn ܅q}A<L]͂Y10?ĪX c 6X>6clzT[ v8p.vGbw쉽1ðxa/T@U>o0 f*C8X xaͰ9l7/%73n=A<SxMEEXs1r2Xo _.ÿ|?}VIW!>w|(A7Nh8g8Ej܌'W^xo ;+{xC|c|_ _|=~h<8RX`Y,VJX`3l-%.8%88G?`_vӟ|/7{ &fL66܎;p'ݸ/xs~K{\[1RaS>VXkam x=ף~n/"XtWo=!>1S|%Azq^ Q;T̓MƻGm~z1 u:&fco8c>(ԘX #1x~3>LLacM1cTuZ{a 0v:!<о^?V`¡ q8p .x\+p%&*\qnxk/?X(^ձ&aK܅gZbqU)/Fb4._/J5 lƛvsLS7u%nxq8DSp'Ƨ `jjLi1=aF&7&Ÿq u cxy2W*^(_&Xxo!>w|O§ K|o q}5:G78wq<'3xy1Cw5f9Ď((}ñ?8 XçY@;,Xv)xz5:qXKai,G _s_k|o?I0)&Sb*Li0-zBL1fL苙`Ṽy1G(pw|O_s_k|o?'I0)&Sb*Li0-zBL1fL苙`V̆1cN̅1 ̇BX`Q,űRX`Y,VJX`UձZX`]X`Cl 6f[`Kl v;`G ;ag]v3ǞL4};x7A-w{L0#fB_̌~b6̎9sb.̍y0/` a>̏ Xb1,%$Xb9,"VXb55&Xb= b#?=΍I7,oF9 [cl=vvb7='썡}/pp 8b58 G788p"N8b$F43p&8b,oq>.p1.p).#SdtJL1 E/Zhg#1b;+석 )YWӥj4ayY,VJX`Uձd+5uyFnͱVغn׆W ;cݰ; C7bñ?8S᤿8GhXGyk܄ɗb<;霘 sc̋Acʟ݊cq~q.8\q ~Kqr\J등`V̆1cN̅1ŀֺ:b= ؀ Wj\Z\qnpn-ڎٞ0?X c,Ű8h;@#GxOiB].يPVSc$ŚzL)GU1zíx_Xe /.WR#Qoc>1<<^x+x\[)1fL苙`VύĞ857pxaƗeeebjD/Sȇ2NV+r]oz~ɟn:T.h__ _[l\ p*\EP EP IFJZ3,H ځ R6.zM ԫ]zI>(*YzX ѯmCaWyU ǣǭ_E"Wwܖz:_*BRnQbQb[+Rv)OWw~*M=K_WiY(7~C~7$-7ۣ}ϕ,b26k|o_V1:X`7_(vB=RϪmU/f8еdgm7/0u[5-bǜ `^ rXa:v-b= [G3dWK毾kù#GǓx O<<^uڨٍSSE}Q=D!Y1cunnzYoth._o|~/^6ַ%esh>o6uS1/'eS0(6uSq]^܇CxO)ʼb0aSlͱV(OQ/5ǥ (xO)y+:BEx/(Vp:rGU>w(GXcpX#Ma9V*X k`Cl+ݰ;H3p&8b,kxe>Hsb ոu7F܌[Pld{q*.GAQ87yELI1#fB_̌076a{0eGV(8zbRL1Wb܄QC|2e~G6M?/xx}|M܏(7aW='F(=(.ŸC+ݱ^}cqF0p>.0z܀q nmwn܃{qxeD1 f Xb55&Xb= b#lM)an<08 1Lsp.<b\q3Ÿ ^kxoM?/xx}| ?_+|o-e:1D/Zh0@,%2Xa3l-%iԅp1.p).x\ W7F3Q3F·mwN܅q^)l>'O>Ǘe3 e31sNGX7Tm EHl.~ׇ©Ou4(QG6L|.%?M}S(C\Klqp+(2xe^1Q>QxeqU7f܎'Q 2_X`Cl-p~F̴s?$š#qO|]b 9:oE1U>gla]G(cp,NɸS|o_PScL|^*nx 9<"^Ɵ ^kxe-FgUCq$~p<~KxOi.-|~܎;PK`I,e X+aeUVXkamuc}l 6&asl5c숝 vn{`O!C1 `_@qk#q18xp2NqY8`,oq>.p1.p).x\+p%&*\k{\p=nn͸6܎;p'ݸ>܏ x(xO)w|O§  _|=~/~/(?>b2L)05E mt0 3/fF?̂Y1p4~cp,8'$Sp*FbNh8g,sp.w|O_s_k|o?$`L09 ScL^Faz̀1bf,av́sañy11a~,"Xaq,%2XayV*Xau5:Xa0aclM6[aklmN`Wݱ̠dΏLy$}Żu og̏bL1 E/Zhgr[߰6a_a']؏̇"K.p1.p).x\+Zi}n?/F$]a05Uz܀܄q ne2߈e1a~,"Xaq,^w!?]l<5{~{F/=ۨ{~FjL1%4h1fD?̂0;bA,Xby VXkamXaSCp(ñ8'D18gl8um8 0a#86g+Sڧ89U3vh{I_2M\cGa> x#3k-hZ^nO0UP5RM#jo&{7y.xMU'N cVD+1Wj!nY #Lr~wSܑ{f.N&3xh*&G˪6!p?IZ;D zIDf^sCs5}[MK#dɦ1Gj>d#)oQnzOUgMĿƩo3FSG^ypeݸi0܉#yI('=_|]cUG}H'G Umuzưإz:ut$!_SQN;]Q1'ܘbbX b!,E(XKb),e,I7f܎;p'}xϪ̦'W^xo ;+{xC|?/|9 |pc~xo-+{xC T-4E ?T۵Qc_a']+v{b/ ab? 8 Cp(F0_p4~cp,8'$Sp*FbNh8g,:۞c=ޓB<%^ϻl$7z;ǮPǽC&pvZh3unK@+Qӱn="uycbc[4Mey#x;O\e8"R:ߞE L{냇r6Oݞ,zNĊqs/qT-Q'1-ZF#˷穚2UӞHM#ձѺ|Sҧ\юen;r.xI_WήPc\;ɭ&yd=5Ѵט/JĐ>8xk5Y.o4U >O:5rGv}hXT8Vߣ!缚 63@\ߒ`6jqTRo`Z7Zj!^\cλG+tҕbH`9bΜUì c | ܏ B9~kHKb2O\j#_@;|މ|I.?r?6JLS;OTrβ^6T^ϳq˽H2Wv~\j5X|f[t̯m26fOY/|MwY~y\祒$YԧxGc{DMqxdeqxdiqxd?8ru#ס\>ru#ס\>QO_IvC埩gH}x36Ȯ4&n u}jűJ{ OM?6=U`'zzy,'J+硿\CQCY.??硿3ܿ;Q՟?E? J=(((((|||4宧~T9Ŝr>trrvr Q?_J:8^Aǜ/r< 9I2wx~ԯ0(+L S"+]wa'~R?Q'J %+#/bWb/F*0(4ǵ[o30n{/򬜯ۮ%oR?5P^Z,F |5Hq$yIOqa@Iw\(6WK t)c3Xי٭oY'WYG?:eig9Gw.算M]c9"ǻ"_щ7;Pщ(DQ[,E9HcEwr%-ǹ[/9Ubհ:p=D UzdyM"]RxZY-g}ިE|֦ڔ[<::zzf}0듮_Z'7`}C KkoFoFoSsM߄TS7M바Ӕ)݌(9ؒkK |!N"LM'KkoW=RNPGrꮗ3P'1N@?C3m23~JCP-ro?x e e e e e e e z)Fq(#Jq!J?b"JQޏ~Lc(Ly(Dy?&1Qޏ~Lcx+c2OXw5Eu:T;Üļ}l`8.2H0 Qb%!ZKFKF/aKF/aKF/aKF/aKF/aK߾NӾpN9i_8 }/=y(S8)i 4v?q(ן\rPr=n'pfp]'\D{Q^%#.d4ǍIr{Q^%E7>j4$#Ľ/q/J܋}}zl"p9="/(,#fp$"$fr%"8OW7FWNt:牯UAJڑ%q<8G(8Ҩ߸˥ư~,Dz~,DZ~8$#HG$#}HQ#(/7Q7(ʋD9Q(ޛD$&Q7IMxo~ 13z-I=cx~%[H=E(1qzNxM3t?3Y8\yDn͸6܎;p'ݸyLYh%a`7|=[}o?g!& c L05E mt0 }13f cǜ sc̋Ac,0X c ,4Xc2VX c 6X>6clͰ9 [cl=vvb7='썡0p0p88 G788p"N8b$F43p&98cq~q.8\;\0 \ W:\wb=b|'1xoyxoyGx>owBJrG❟ryR곜,w5Q곜tU}\sJWRJڹvx%+sJiJiJVvzil'\_ڹ缕N:y9O缕?DyO#{UgDl"NDُ(sVkmlx,1WpN+g'[N$nvr~tvt/)hڵo7cnߤ=~V:p)gCa5й~'δ뀛pu\V5<: 88`ƪFlλAbϤ9U!{ռ?^Ǥ? 53as:a'y?#JsN^qR~";7<_Gsxvʘ~%c|-eXf(1F`1ƾd-ٲ$5kRLĐ-[!eBD21CU_ǹܳs~sg8pU{@>́_R~QK?1n"ȵ OYRjZZZ0ay| k6&M9v{Y$| t5Q=G(fM~vCXuZ1[8 8KO[aE~.lʛ4jCw194uJ7\?~  1,PH^GMԁUŤ^5,}G._[P1,P ?|q߭R5UWv4 _xs&x?âMzs}ދBŸ%~+qq~[p;~;~9|+ae|`UձZ":z1_F`6fV`[|a{Lv.aw=$샯a_|aq7pa8o[m ڄ;\7㷸7b*nQ8uRSu1xo`x opF!E-9?hyd2\_*\) NNT#|l͕$Oz.tG[/k;qkM$^ uAq!b睡b3R~d>gŏZXg5)X585bVq:-W$:IaX íQ ~}|gaIO~ӪU=LsMv~L򵟢ܩZS5^45GYGuJu /F8?eO}#fk'-:Chz+VN*y:"|uTZCSYǸ5Sǫ[GZڪD_jɺ]F?.k|h<:p'Yg=62E|(2U{V]>\|lO!.{/?AԷpE%հ|sfGh>y܎|sdݓċ,)j|my p۬.1z;5 ,>tx va,d3N˚ϓ4^5 p2V%rd=cbUN[Xl/P`= 6Wvwp~q.~~p9~poqn-]iu6c4y^k^z|,$nWosQꯝoޟ$"E̸"UㄻOp`pzyedQ='_PI?loP{(CG7 V~Z(1/9a~~S+n |_%L>fI'Ƌ0̀z0s8ުwe?Q.pJ;SN!kEI Na@k #M|)Wi^ Dhص :WJrvVGENMM)\ e:E;%l8?:[w O8 '\lS)iӭTp+ǩo>c/{։uuvaE5) x }|eaQ ?U!6f {ao7]q Np6y?Å\pxQ q<':X _Xa ƶ*>=| ."u^ 7v4 ;0p9~+RWb6c *>q)xO)y1Qsañy1>v(ObaA] ŢFz (q8t:^4FS4VgV VXkb-u%aclM6xlm-aFq9~>NÛ'cRn|b#lM0bKlH3(N} f ,xh,)|+`8?Op.e9./p~_JWj\k1xxo`p 0:袇Xk`M/bٖj55&1_p &q4Ix?l7w3[x[sbklmq#q N8 8gG1~q..Ÿ?%ոb nT܄;܂[qnǝ w܋?_ X zX§>bE|JX8Gۘcq7x4wX + Xb5!168lͰ6&bG석 v{mu}| SW׸7x^KY{gE{ OPa Xl/cD>ױ8{8}x“ÿ<LW>rw8') ˘X3 X\b\K;k縜U>>.j^̇O`~,$&E4N<:I+e{֊{- ?mkuj 봨SŵQmAYMxCǬ3>gW.SqJO5a{gnk|y~5`ad+d/cecߡ1buwGށaFe n1ьj64ڨByg8-P b)Qzӓ=.Qaf{/2ݾbo@ OR6׏ƈuH1usql WUI7&]񟁺]җgʼ(6 K}#-UIǦׇz!>ׇz!f궖ӗ%ӗvK:⁏#}KF3U;L͸ (m_1oo4?},j}1}үCϡPqC}rPi(4JwZQ ?rI-mbڷ8#>#>#Sޞ_omd)?IvZt~3SmhpUou39ū6=Nxo# DI猼_ٙfIf\M6sSglS)hSΩL54y>:gBxj>'ũs p ~_7x/afcf6}'iitgd=g}g*3㧈I êS(uSl82Wj@{N~ӝbQON$|?N={}}'=xdbi/S1)_>pfйbsdQ$ݙ $QS3MJ^Us~gMgq2qE?e:>c烨f>D&OVGY֧N~se2Y&Ewy.33ljq$QEO#JX'E(_:d5?hY Ts7W[Kڋmy8K?[/먏(>G>:#J}D(Y'bi)c_эj}3.3owF)zϪ5Z 9]\5~{==6} Qg u͸܅q\-FPG;{܉"xy[v.aw=$샯a_|rJ/u+k\eZm4Dtܪm{ZGĔgUF[5;e!5UT ϳQ4-ǻ4tVkP`UFBh/딨i:*U (h1 3^U?J^EcZL]Ryvp``ébM81J|g>3v Gy8?9?9E۩aX qHɩf88M64cVMkG)Q#uJ9r=WO[fOoTSfTԙf!J9Nw( O;qԻ]eس  ok.m-jv}I.eOzus/iv96帠?(r>ΰ3^rr>w~9O|Hw=tNnQ&=v(ts?O'tIW7o?X.;G\7YHgu3f:t\7ӹnJrݴ[uSDn^pm{^KA=3̸zR G*p |zf>`A=3g̠.>SѾWԤ+\6,ʑE{gѯYw9Nʑ:%vUUҹJ:W~QGo0j [`0x7-p\KYԱS3D?Q 3ysKy-?:)j.7}_VwenGnnwݟ=<8EW+޷|]zIX+ߕ~O]K-OWע/_V \_~/K~M>,ve|t$Md|t9rt󰠻֞[B8(l,B{>oۯP^_#Qp*%,]p<pi>9Nת#7îxGq~n#]̻̻̻̻̻̻̻.{Qޏ"QDy?(G(~~K.G BS((qJ?C(J?(J?( vDQ!~BQADϋ:/)MK=i}%(A6 K==R[?u*ִXҍ## WA{ŕq2"ݠ0n# 8tg2"ݷ\n]EHwГq q醻2""H7WHw# q[2"݁''ҝ^ZޓN)$ɉt=9JKqݮh-hNCPR-=5O${${${i'i KGHwmHWkvGZ2"LWY;*DY8t72"=H7hMseEyKY^3KHs^8t2"H:GY)&,*ьhw)˛bz}+}lyOiW gWoosg a[HKEKEWM=_3 =2V&ʤW~\]oW}"I'%Q$Χ$ӏR>Qʗ&!I|Ib'Ob|R$WW:>ɬ:Z/Hr?C!e|$1$}t9^GSk_~^H}@晁&,3_ sL; v\gӏ3? vgh߿ (?/C!7~Fyoy=̴}!t0[7YgE}"ܷ]>æ)-[f\I}G9Nuu9e%~2'Ӟ\wɤL{&s^$s^$O溗lLvR2׽dw+.y)yI2DwɌd]2Nq'FZ루(3>(>111Cz{;հ{ 1K72ǚ%ƛv';Nh ?yi9FZk``AXwqv=?C_' 'y/r/?]RIF>T ]=|? e6vA༛aƻ wo3kY_~hK:3Iw&$ݙ;m;ڦ\)gя8nq\9r)ec),Ǥ 72oeޜ˸kgs\w7םcs/sMF~Fy?O h&lߧB~Fx!2S1v[L33SŬoYu1Ŭ{SL{S|MqGd%9]ʷ(e9sݾO9?3/_=#n#_ A/Lg9s3ylfhv.*c-lKz[_[׷09i Bl}>[J~[o+m%䷕VJ~[o+m%6F~o>I~'J~ۉۉm|)vR*.)|;<wNI;I'$Mq.Mx7nMzY&fvuy3T9~.^7o{I/K{鯽^k/QkrHw}tq^_u9@>8_Aqy1_bHs4fI= ˼'a=~x޷H3{i!wuo^ kurɼ'dKs{4=W4?2凉Sf-yOy/ͬ~xJcF{icF{яi/fc#kX[.(``;Ҙẽ̃̃̃in\22#]bc0 Gϣף|xe'q=iܗ=ܗ=3g:e?###i 9s2Xdɠ2h `eqa z_Mq4CyΤ7fRLʛIy3)o&dgL&y2M;Jy/B KWgWgW80_qqvozM=5WҹFkĻFkF}53>%k|^kU}5S5W枲߯K:?׸uݔC8A9nPf#}XVW7!~sCs(wΡrrh.#Qʝú )nj)w*ue\qs93cg2?5?n7w˽i ;xzߥw]}ze|e^KR.]桻ߤw9_wMwMKr _ ܞ^E^nOw}~O+J}E(WR_Q+J}E(bG~Egהo*,Fs꓇>y<C}y=jIq z<\ z=\ H<\ Rv)sJOzaQGڨ o.?* 3M";{ x.a~<x<'s2x<'s2x<'s2x<'s2~}NEY|D<*)^y˃:Y^ y>" xۭI{{.֚s?$*%i||=x<|=x<|=x<|=x<|=x<|=x<|Wԧi7O@(T}xy+9 _ڣQ^rW$Ex%mHrK(g)O*E>ɧ P2{e> Sė)k#˒O<͊WV$݊{EO9O+{E9MyS/xm [ sY%*^=((J<oԧ/I_ҭ=e=kۣ=mW~c?kۿՠ}j&kn3?jn__"EquzmձGWцcYIJe~e~e~e~e~e~w̏^QQQQQѦ2?2?2?2?2?2?2?2?r>2?PGQX^[p;(v~<e~+%i>q.*'uD,X#bY_Ųe}*U,XWbY_Ųe}*U,XWbY_5`5`5`6`6`6`\7`>h|Ѐׁ\phu;^_}x5 H>xF^cecoL;7΍iƬ{х8^#>CqFmdϟ^3ZX[.-hK ڥ҂viA]Zt$7_ڥ܂~na-sKٵw$M;J9x/mLXm__iǼюڎvlo=vN`L0Sg@DO??v%uי:s\gڳJyRn^W;`z0I#[l71&޷Ol;fïQH5MEI眧{:R\1K¯c?yLǘXC@u@!T| +2CԧpaTӇibp(awVq/j9l L8h:Gۘcqwq_強kFwkx` K~qOTߜ~+qmX}ʃGfaH%fSu2֚Cᶅ/{aseysO)YS+lO?e]+ʺVu(ZQֵk](Zq/ʺVu(ZQֵkEYPֵkEY׊e]+ʺ֖m0c,6!168lͰ9c l5c&b'u(l٬ӳYgNf:=uz6l٬ӳYgNLc^2X>8Lp>ng~M-e':,;;3Z;۶UloQoQoQoۏ((w6MkʷJu8=suWzm*8Q%Jf=wծnxvak]?;CO}d1mz|wkd绻&=3{f)s}q2ү2o?dCKׇOiWz{ޜ(oG\/qx>"G|#[^<9G޼\c/ 5 ?Ƕ{._7k}s(((8Ҫ훛|r}}w!T;r scyk;>y}O^_ QO뗳=/弐W,*E^\r^Gl3KOESXпec!|/dopw}+q%lw*?w|iq8igp}KΞG?zcQ0ѿa(fv.fabq>2${ KP[|KQ+J}K0JP.Q[K|%y~/J!%⶜~Ay#"R'D0#Ay"|#Gv)ėD=e\J2.#|5_,RqWsCH<#iHGw~ynOSʏ/e,Fa9Ng}}}δ3ʛ_+X>UoK.oƯcy_,O;7J;u;*ϸ+oKiEiǧ(Xv`Rg^pE=GFJ6VU !sdU|W<ʸjOU/O5_ע%,kQעEY_wŽ(kQעEY_e}mCY_e}-Z(k[nop]1Xc l aSl1[`Kl v0;EY_[p;Z]8?GY_p>.T<(k2XS4ַXh,7`AyֵAqn'VgKsvZu׋<_mGzզuẓhzԿom,O8hύ%k?!2yٯi ~1?72^/F`Fc{:8åְ=TI^xZdt3K[$|ƛTÓjx2 R-g_݄oB7M& KΗ&/M8_p4|iº KΗ&/M8_|Y7~cQ8s{q~YM8]6m~mF %܂vka>LzR%~ aaomkz-m鏶~֬[moKjrܫ׎pL`{?Xo'0$u@z ~;_/k'@%п o|}7ծ\OE_?'RDE NN%m};^|Љzu+ߕլ%~+㥫YJz]}ioWR߮~'6ߝzwߌ};;MwΛ^NOCgsd/Q/]M{l=v{?ڵ~@ۮLX` @; H@ÁczG}(h#VM#A&,~\o~wX1(G#bj&~Z\}L;Q7$Hm'd?Mx4MEhYRQ?pcCrX_c8c5v|!];~;Τ'dn_ ?W,]J}~I` 5 M[ @?o  >{]y*,J?o/D ~f(FmMɄ%Mvn2H俉&mSm:9;|g߆; q'wZwރ{Ǽ濏|w4Jvx';G|Ay QC/640_ӯYqծK0!#Q.9뭣Q?:|1;=N9S8\'3g9nҳ{:a ) SOx.D+}'I$4%ݓ?eL<ēL&=K,zq,g.gzry,ד\Or=9֗yiߎV}O(Yy,ד~U;r?O'rɼ>O}syGvO}qwxwxĻ[p+nxt/%ҽD6 e$ K ?Ϡ]2V_:hDzޙ~r-O?a7O&__dZwrC>RK/",=_+~-?W,WXM5nF{F=h7;stuҹN:I:\'stn ҹA:7H stnNNNNN$stnMҹI:7I&$[stn-ҹE:H"[stnmҹM:I6&ۤst]ҹK:wI.%st}}}}}}̫W3> _9r=d>x?!>$݇!O? 5 +A!A!r~-ۃB룜((mm\!mz &py %'秜C|?ULLLL@HM$\p0`…"$' &\p"!9〖"/Jҟē, ig[8!C<'Dsv]JXqB%,QR~8vx! '!!!RhАB_4$ݮ㊆ϦN8tC[orI8QK^ ʄ{ )zb ~p=~p#&܌[pO30窋Ű8u)ݸxŸU el`#lM0b3l W쀉`Wݱ^8 op8o|qq8ʼn848?87FLMn w.܍{p/?}ܘ `A B$:a(0,XK`IH, (r>XJVX c |kcq"Np~c?Ź?Å\K W׸u Sqnp nmwwn܃{ xW*V3PY ` )k߈;܊{܅qG܇gaxOx3xstf`&^,+xkxo`[x]>G\`^̇O`~,1 X`tCC0bp,%$F`$XbFc9,OXg">c%/`հ:X _X_ºXc>b|+cæ c< [clb;l #vb7='ޘ}5싯c?p 8 M| GH|qq q8 8'dSqN}g8?Y1~lsq.ER\rWįq5S\[܀17fV܆q]qx_xQ q<'|c,XX蠋Xðcq,%1#2X0ay| >9|+ae|`UձZ":z1_F`6fV`[|a{Lv.aw=$샯a_|aq7pa8o[8Gۘcp,.N8 'p:8?ęgp>.p!.Ÿ2įp%~p5:\܈ 7w6܎;{܉p7p? !L_0xO)Oxx"^ ˘xx x o>>?(07X b0'0:袇>`(0,XK`IH, (rX§>bE|JX_*Xau5u`}26W6&M6xl-6_v&bG석 vn{`O셽1 k_~@ Cq6&(|Gp<p"N84q&~c?8< 3\p1. ?/+\_*\kp-7㷸7b*nn w.܍{Ǐ#209+XfFY&r9fm34f9&穴訲VցZ,RbIu=g}:{}wa)~C?='?#~G+<_7-~{<'OiO3 Y|M_B|_—q kX&[qn.%>]Xn?q} O3<s<~_Q ~qOISxY y,ß/E /F<,2rX`Uau5^C 1 `]FcCl 6f[Ux5V5a ^1;`^v.o aw=>o~Vqax#q188LTqN)8pt3NY83qf]8|\x7ރ9ER\qJp>y!\ka\| |7S4>y܄,%|+*E:o[Xv?܁{XN܅#^܇~?x?Cx%ů~G< ş2_7?^Ŀ`srX/ X/J V+VXkX=1zX`46F`Slͱ^WcKl ^mcu;agox]FLv{ao}f쇉o8oA8PpI8Ghcqގ1S0'Dq N48gL3pLYxy8`6ލ`.{q.% \1!\:\>O§܈ %܂bo6,wp;w=,qn?q} xįk=#3x3"^0yg9,ac%XX c J`u.!6b3l-*ll1x-XqxvN0oƦ)oisSz#szM9w=,q'Rw~{p/Op?9x/(~k8~'$?)O3 Y|M_B|_—q kX&[qnCk՚yxNs<:55@y`yIͳPσz`\&>oK}[Rϫzlg+]ynRѕzߖ޷Ղ -Xyq-x.MxҾ7xҾ7sϿi{Mou+PϿzomHf+Q3j]ms'jUiI~ZV{+݊|%^x}N^>oC8xxzm)kXK=zl=Rϱswgzgz5@ճ,AsW9zޫ&^XJz*M%W,KzbFUU^{XZ|X/>_<QITRcMQˤ|?cX?c뼎;oGo}OKG{OѾ`ы󔯎U{EGuGu' [s1}V޼: 3wδΔkgʵW`b׶◊־7–kg/ٖkg/ަ'vO]3~3~3~3~3~ěxծd5>;{ڕ]IxaU+v ܶo]7)/Z٥_{߄THT{R#U>\#r~OwGQ3{v,vioނxޤڛ‹~O+sFM^7\nK7ҍzFt^Q/Ln&n꥛WrC;wq)gK7ʵFnFFf)_p&? QvOƵ^l>o~Dߝ+I%?n:xr}>yy ? 4V{85Ќj/8{^zM^zw5Ry x^Y{iߛ 1zbW !?ĤWK?qviG[޻?s7 ϽtwgxK<;ČJM8tKӮݶ!!!!!CL~0!]&rAG<>|$Ʊޘ((G= w Xe8o{xϽaW>?w<8ޤ_st 'J%S_ɴd[?M@`Oy_PS)=()B///Fx onIgKgK7ƽtOg|J'tϽ2sI'tI'tҝNT?3YfxL/ndNgY^vE{E2&LouxaY'97g.\ƩSs~=qkr0s'˺c#y3Ec{ΰeǽpY@zp=G*=RwdjY~_dͳX`l}T<ēM<&'sfM<ēuOM>!!!!!!ķ"[D|o-"Eķ"[D|K%w ]B.~%~[B]B.1tIk_ZJKw)2/crrr[NYNYμq4##uS.\MrY7岞e=juS?-nZ7IֳRYL@gֳR\ӟzt)ZnsC7z_sz_܊{s)\7˥r)7:&\].N~].N&].B.B.u.u.u.u.^(r| iy|Gʧg[SN^NmScO9SNS>O̧|r*|)r7$joG_gDg9!oW֐5^ta|~PkHҽƄt~טҽ{ȾK*R^CטO^ SJoh}GOkӷŧնwIsXK?|ǽǬOz[QŹo~>=gEzC㙶5QNE"껈.1^NGG껈yKm"껈?zup^~ߢznmʾpQbq1)|Mx*bq OS썷MoR%ż{b{g |xxU=繆nno>vvg۽"[Jv][;bÌ:_^mym%_B{//0n伝vR;9o'dxqr'Nƛ&|NS/*ߝ7;5U; ?pԎcrQ~v{Ŷz{Þ^^ǹo>>>>uzG^yR9qr '6Q}fwQH}~g[/_:'wpW)5KQ(O'vEW*^xhoOGP9G|7K!;}DmP8j6M;叞)aUOu(Ǻf[ݼ\P_ |7?7"#ꯑ9؆l\ʵ)ڔrmJJoR&w7Yߤ7Mj~ߤ7j~ߤ7GRtc_]+ވ xv{b/}/ތ0-88P&u?Lnb09 GdSq>mSp=>M&/Dw]RlSwq֦{SBR8+5J>I?jgY&YqVFfh|7q|7ߵ[Y_WmA~[mA~[mA~[R߫Mz{ZNh:%S~_Y'Q⻆fv[J5ot㫍1W u^FH_;?^/P1Gb|7oƘ5oj3jԶMySwD7eI#MyR5/J͇گyPj~̓6]Jo >ɶ5rЎch1q 8vC;Ўch1q 8vC;oc1m 6~{Ox-|]KS+ݞ|'w{ݞ|'w{ݞ|'w{ݞ|'߱~rMg+_ŒX}oLEƥHw݁tw Hw݁tw R@;@uKP}i[%U_RՁq/mW֛R&~#oT7qod Qq8M&~?o{0+RG9QqsRG9QqSG(89rq8E"~G9/(5+ ~0V ߹Q}_—q kXw:omLx>Ǟ8 pzX`46{p \%?i#q%އXxp?7H֑q#>;q|'8333w;{~'{ߩ33Lgƙ{ޗpo?ye]:$tœxe)kE{_3 BoB]?oƃ.GB] A.]0(\]IGWѕtt%]IGWߕt9Fοo9Fy y y @ TO 7+m+ ?'ֻ7ΛHM&y鼉tDD=D:QXv#nӝϻ_wKw?+۝xN)&^OweA|=_A<=  COͿR+5JͿ=IGOۓtdғuHO=I?I:zO,T{I{I{I{I{I{I{I{jR wS(Qc/ӋrE\{mT~zQOo7zs^ʭׇC|}8y-__e_}/ߗK%})_A_ʿ/w{tȇ}~Ҷ#L}~؎RJg?ُrG:73ُtc7oDq"8vH;NK#֑RH%uTy$RG"HyP!UR!ZwJ;mUn&]+ވ q7a7='Z+F>(b1꾢q2NFWp=><(a#lʧ NHK%_DW$ڝtSj|ƧDƧDƧDƧDƧDƧDƧDƧDƧDƧ?O~[8O?pq.7ow[|5cƏ;poe|m 5qܠ b<x6u 'J`L8 g0 !|>t %C)7?)3J3b3q086n8n8N7spo?tAIl'g[$O$#IH9GrH#s9tGr'zE8gǒ gѬKF7!}c8~ w !}cHq Ɖ1c|tqb,%3xXKKv>66϶ 0۟޲_/Uo-۟RSMO?ғMzl'ɦ~l'ds]#o G7mHfOmM߽C9C9m|l|yCs:=|_> w3Yh?v4鴿*v&=~w G/4(~W\:j!`!徐뺅d*ΤT)ο9e;?9b3rΎ^VU*=GD*?RYEy2V~l属jRVkJ7R?pwk5 R?Cy~5~2903>瓟|O~O>U>'?Iw$jՔjy5弚j5k5jҵt&]IjҵwYWC5Cw}l?pۏXcq| 3ΗO5}F7ϕ>/ ~},exMd}Bld|-Uӟ{wxϷ7׸N(bo[I[޷rVq[9n+mXغpa ;~TJ}ҏJGRQ)ZJ{-^KGJY+e~-eWʺ^Z>mߵU6_#-ٿ{wy)~=d?ׇO}O?#m;Կ˶OSsSӯURe=rqK8ෳa:@=Aspm=l8}܋2Ca[Fwa0|#Q{97Q?>?J?j[%?گtG])?GQOsԿQ3>fY]"c߸k[_Mm~ n~2_{?AO''XW6P>N|_I~pd~{?p??|"8u:E>h'h'h'ϧϧϧϧϧϧϧO1ϟb?<yi4=MzO3|~r:C9s7wϚm\~YYn:#=H9;GQ~(s9w;GαN::w9*s9{_y{>'}iOw>'=o) }KiOwlxhO[J{BRj.nRTe7bބݰ; {c7c?Lx x+8m8G;;V,F]wQ8'iul|Iu16Wͱ^WcKl ^mcu;agox]1bNt\y&C_g}l#0 G(c p2N0 wb٘s0 ¹8ϱ7A8iO§܈,>&,/K<_Ӝv?LO 8ݱax88c2ށ)p"N8bNt3p&މ8 gc&,p>.pƇp >p=>-_@阁s0 W`.G"o#f:ay +`E+a$V*XjXk`MWbm1{`OCqކ;IVf[`*N[p'Rw~{p/Op?~.l\"\Kp).sq%އ <\Q| _{&܌[U,wp;Ǹ>9x/(~k8~'$2Vt3p&٘w\e3o;^vVHU66x=ހx+8Z~\>W&}.gSMN\>}OF}.KO_)u?L~|gϾ{/& W\x.S.S'ps>xDEλ=/"/H.Onm"߿_D\e%t?+K/B͗R%{D/0pK)gN|W>p-7RU moϫT ؊A {#kDDT2HU*W .t~5_Zj?z߷I]u^ kN [|pj? kkl\n7R+pהOk_Բ hcm}A(SO-FD r~]SH_P7fP7p/TהJg/nZפGn/Y/oO|_}/~P7:Q:k׀|Dy4hS /:p7:A`(hhmlkMpO3iF<('x}a O}aBS~*5KRr@sEzWcKlEZulZn^Ekњ|  sԗ܆pPm(6p\yh|>yģï=16탥+=(.Q۝Nvzvo 7Fm z^Fm zFm nۉFmFmj0A!F ۷=㇛m;`|QG:G3/fܸ=go;db nO4j{r0nO1j{ZfӍڞL30Y|_u f_v9v42222222`vA4+9 )T|YY YReT|YuP3+XW2+8_WrQ,9f;eJF'ۚ 9~!/{9~Q^_LKpiĺre VXWJ_|j>,냘\YbŇu>p'\eG~ Lj1=Qs}!|TyG+6 v{ކ`7Qg87Z vy1pW7 yCJRWFH}olllllld>|u#F操'O62ld>|d#|bD6;5h|RSW@+ ?TeYgV~%gYYYY}89{Ό/:}/y7f7s`ǛYΟ.¹`}3s]p.-( _EzzOWOώS螏+5nJ!_r*~U>KU.m["t<еۈн'"[_#"lnI}>"֡ڇ wSCjѨq\[*?RʏT~##?ȏBG*?B^u=8\)^caH\ڻ>W~ʑa9 +W["}/{>‚P>B 6U B{9m+B @^V >+=B>>D*^*^*^*^*^*mFJiе*f©jClaUN~W3IO5hη#yGuΫny:ߩ ]R ]5C7Z_+tVXӖ|~exJ_&?)(w/tEг0[~gmEZ~j6fy`[l,tM DŽD>bLӟb):&&o ='̶Gwʣ;q='n/E2u|7w'SC!}·CG}L|/^* '.|^.9atk~+|Q?+YW$HáMĐQ^x!JZ>">2(>$ni|7ZuT#D>rH m9%m{L$$scEijIRJ OG?,՟s#)W T>_LivbgnDktuNmKk7_atkT8*r>n=1v3?*#[~cYe6i yN럱Ɔycx8+ذkeo.dž$P7֬wU~:hthbe\8&Lrۃ򲈫dGL}Nn | Vh@n' v ++ wS;L2U$$$Dw$$}Ǝ>D$&1>Lb| P{$ƇI5>L2 s}ɴayɴɌS~}>rx=zjxߩ԰SBpX'1ϧ1ϧ!7gDFx,JuP~{/{{e R}= ;{}W&~;rA;A;31Qόma3X`7u gp'f3CzIv ¶UE{?~F'J@j3Y4LfҮgҮgҮgg&wmN S9nf~qc}!s܌9nF7Te0Vw d ғAz2HO>@pۘG2}~Yw緙gڶoe/2>hh>;Brea,,,;",YwE~gўf1b\eA,S,ƕY|e֫ʯT~gv*^w=of/iiQ~3(}>Oiڇ=ӌKL;gLI3LI3MzU3M=*_&jf3i/ LLSOʿT}L]yw Y!l9̗s/0e2񪼤++t2+2񫼤Kvd=@k2qN9qN&X{L9Y*zAVxc1]]ңgWW:ޥ̢>,3̢>,s)Wuo7̢fhY>3y҆W}j[uT}E롻.w]'γ<Ο|~~>o9*&c:KwĿpӟT :)Z>+lW٬Ȧ]fl\uV6뫻9n;OVw7= 'vtVws8/Gq %|+*>Y{>\s"xOIO]}>h Y/^z'oYh=W>':w5j]g/q;M G$(8!ƙ(L󾫝buuk p_zz e}V3ѩrZ[.&זZփkY>l>tUgm%nѥB[˜[#ʖ㺙u#f/s9Mp=>x-={q$]z ^m5{eJKn;j;/=s7ɰ]g=rϓ_Os6pj67O)?}4f3ϰ#7#*.,s ..,PPP@]{/rׅRׅ\p]u]X`mPPPP麰 \f׃:p^cV`[ׇ:~}޴s G%F[MMO).٥~quuMffHoi,JҥqSj,`,Ѹi7 ,AJJǺ|6|ήS=y'"m?5y g5w` p26*+F\=m?Ըsd))K]dJ~$iu㟶qrwl_<}tnzkb'~ģvlO9 }ps~WH+eax~WhQ+ iBs~W^- Y=yP!=?YH,}JBg!y0~Bg!z!T,}JBg!+>_d^{єG;k/R/yE_}H=H/y/_l*'rb]%|?~I-\mZuP[ධ-U[ƫal->4~.n^ yEvY~\| K4111юHOEE"qll[uiӢ{=];hRԗڱLwՎhJڱ>W;jE"YɏT~^'?78{{qRǽq.or&ǿorw:~uVұtl 󵷚p"vn3qm{F{F<ۨm6c6c66Sm&~6'm~L^f룘s3n>O1YzXhT%)>ڧSԶ+Rbs=0mkRzJ1J1،']ƹx* ֯dܬvso/}/ތ0[画z8:&j5:8~? o7G_R/Q/9 Gd}*isw:OqLqswe=lSqM&TLioy[Gqo[W[Ï /v}l#&N‘\sbƅbk1ZL-}Z:u@1g1g1/{!|og(fPbb.ܦG g;O߻={c{ry}DmXǼc~/,euXGJ/KHG (a-1uF PB=P%C P¸Yo|JꡄzSIքZ6gնꡄ˗%ꡄz(JWs?}QzЭw^]]/ VVy}`ֳR>r8^{=O{=8^/zKz wyoo^aoqzzm/7\k/zkҫz_{͸zgҧt}b>w}Bxo?o>?3;9~h0Zr9NQއ¤r>L: "/{>Ư|WkX|O7/~wy3 m‹Ӆw!].R^)p}Nbx)>/' jv)l\UKf:R¾LjϵNJ¿Cc?6Q=ED}n_vZ.ʥ\Q(Qn|(+5=7'\}Ϭ9O(]ޥ]eޥ]ޥ]ޥƇQ8]>/#TE+}9ۗ]JQW~"Mh~4k~rezzz;P KPȨmQzN^Z/GFL@#zYkR﯐t;Nqn{$j)[dםlk`Snn p=>SKW?(|(w_ 2sdiڧڑT;IV˟QdT;2Gv$ՎdQi#DiW:4KJ{+GEvTX c J+Qn\*/}U}zOԇڧ徿>=ڧGhӣ}zOLgxFҤ%3PBS`A)zEB' jB =4irm(vE *(ERУ`AT3fO9M3})=~T{wrEEqkY&ߢ8888<~~-M7Ce~S}b%L{>%Y.Id\GK2.KzOISկy_I淒ԯinY+IJ2E{h|s4>>4}٧}٧}٧}YT?+G{z|ۧ}ۧ}ۧ}ۧ}ۧ=|ۧ=|ç}ۧ}ۧ}ۧ}ۧ}ۧ}ۧCw@z^I[+0T^72y4K1ݻݯ+?.㕶2,x*m~e|+cK_9yz%֛q"jzx~!֫dI,$ƛҟKҟ#C՟cX3vOQ)?m*ʷmTb,Tbm;Waeڧ2lU~yv*~uPU^TV }ξ&=}z?}Xq^7Ʈ>8~[hGDA^X=@IGѾq87/1 =#_?q8O|`sWQ>3~QFW#o~oF#=ny~OTn-܍(w#ʭ݈ܲr7܍1o1snL5{8j8j%4f5 {su'?q?{<#7C3oMW^:t~Wxx/e[<Oo긏ggow>M8O7?Eէ jhM`N`&iKhA ~H`$ /M_j]lj<5eh״}sݟ6^ͩWson|)_s3T{(esZ2ωZҫeZ.hVx[mE{Zy}V׭h&5ifomrO"?5%^yMy-ћcWuhGu#GG}u&>L}X)D݇%r,և 86 LMa3˴\-H4qw;~Ni}Z u?zX>oOLMv9-C,gyoA%zėrXf'z_zA `XKq!sMd%2D_"e"e"/qquI")J5?%r]u5?u:x)u^t|԰gϫOnu/^K/}޸[]z.zyI~/K/ڥ7yM;z7ףM;6xmdN5~[xռjg[\2zyrmD#KSv*G*ᩴ[9fItIRiTM۩R9IPJ2S社T{*=>/>C0p8yHHHH󑌿A:CоדL9_}o{ ys̟~kl^=;=;M3g7S}&p8s9 &_vʝh& Vy$^:2dx52<;gSʙ8v4k5q9gP̯3_gp~3ΛY?po<bY`,0.i[`_b.ſv]w̫e.3Ǖhe/c,q?<23΢E~{\f%C- _RW2^e|kx5k+]A rW [~+ œҡ}n\ ߄o/oY6~zp5x5yΰzd/fX,~O=S~c?h'vxoW>f~SH{,;{̟ow;sCCCC!??d9˟e{wM=&{"&u=y/Gh##s'Gq#^1 <sWW|ia?!vw>8q8N{=ǍOfk۝5׌ۯykooo(7 ;᭵'$$$>'))SS\Gszܧ)i}KŷSgh,dAGe~s[*G)ʑ}YY/zϱ|缷}s}H=/RKKlqqq{ݼsq~KzS`sK?a6Q\/esa?6!ʟ/fzC?e/UϯўLe7>ywv׽kv7W7 sG]}{n~sw}hpwb[l /Y QB)Dy-O|Oap%|XW-x[.fٿ|qCcg$s0cc XF[W7[p5p wc>,Ύw*k:np\=Y^kɎ -D[dy=b \v-jkUg0 ¸61 v?v}nZ>|;ír } WׯT^.p5iU tyc,swˉ'r˙\=eTC,Gg:>d.K{grvM,ƵO/U]yee7Ow{\[.<7ay?rp"4CS6 Θ/s/ƾ W#(c]9<}1CmQE?9mQ̟E}w+zEL^uRO׽3z>S}'A=z=,Ř#}粑\P$Q'OD=[ [[nQϻE=[>=O#Ii$HǑ#Ms#9Fr!`c6a a"lv=ի}\}n;ݡǍzW;nqRo0[P5r _[IxB `Xt~˷#*0820b|n,/Va˴\G=j7W^ `7)^Q @| j>ӡQA4hY@|`j>rz]`DS <|'ϣ2E3E3EShMg[ށ9H}= we9RiX>/| (_@ݷ/0SN`Q8`>3υ};aðwJa^1#rc܎>,%e}v~9Uu(O%]~hYw37Wj5hA{0A`^GM}NQӔm~_~}AK0x55iW_㺦5M?'Y5k%Jh\Kиֲu-]wWUc-Z-ܵ8?\PPrעܢ-y=״]ց x ?(8=qvKyy=q wc~O~xGK<:` , a^qqc<^i 7߁UV9v1㫮??׳SOOqlhdG~ٯ1󩔻1~:'ӉL'3w:O9_v_;ߙygӎjJ{췳swە,?,wcI,'ܝ,`㥇y]鷵w{6v}/;Y߇>,}~?30կey0=m33Ҳs(w(w_8HF1hXXXy,<~K?ǚN(d뢱\g}I3!u?)~2\~2Ow q~7Ϳ~2Oo?Zi~hOφu?wd~)?48^'@it?t?ft??4+-D^zP_1;վioiiiii\gquF_۾^|yݴ443/%Yk6͏WLKFȴ_Di~Jthy-?xf~}EQ}?;Ėg^OECg_e2k:oނ-gE:Va%Xo?gfh?gfh?gfh?g%?ow&vYg2Ϥf~3iL%;ng3ϙ:MϏdě7o&Lx3fdeL]Ef<D ,8pH9gpr اc_kqE\-^"z-}]1zh_P_`OE3ȿxy^fe}/e?{^aW{ſTmw~+<yşkWYCcy˯[Vr5EǢ㕦:4λ+^˅t]Q]Q]m^yw8˿鼻vYI]V.+iJe%ח+iG+9Vr8ZsQ.jv/j5E1jSdE| "8&f <1@ǂ(!|C<GDGDGDGDGDGo! [B򷐿-o! [BVN[lųV<[lųV<[lų6r}#g9)9)9)9)9^PO~r'w?O~r{ =@r{~Fg~Fg~Fg~Fg~Fg~FAAӃ; 2= ރx9Cx9Cx9Cxx>9|s<x>9sa<sa<sa<s G?B#!ˎ%(G?JQ%(_y_y_y_y_%9_%9_%9_%9_%9_9XVyp(Wx£e= Wxs 1<s 1<s 1<s q888?Nq'8_5_5_5_5_5_/|<7x o|< '?A O ' <'=IIrO{ܓ$$'=I)NwS"y;E)Nww)Ow'>-G~>󑟏|䊺?O~ꓟ>O~Ǘ_~|O~WO<SO<SO<SOA</H~A _$ /H~A _zSO!<SO!<SO!<yσx$A$A$A$A$0-L _&0/L~a _"!E/B~_"!E/JS%(E/J~Q_b#ŨG1<S O1<S O1<SOq<SOq<SOq!|!|!|!|!|! .*G@9Pr#Zu8\ (W@”+///////L~0aK_R"/E~)K_R"?5O <1xb'O Qqzᯇzᯇzᯇzᯇ㯏>㯏>㯏>㯏>s܀~nkO˺@{рr4oC 6oC 6oC 6oC 7_8|qőG~q7"oD~#߈F7"oD~cߘ7&1oL~cߘǓON<9ēOǓON<9MiBNrӄ&4! 9MI 'rI 'rI )֔vkJ5%)MoJ~SnMoJ~Sߌf7#oF~3ߌf7#9oN~sߜ7'9oN~s[߂ -oA~ [߂ %-oI~K[ߒ$%-oI~K[ߊV"oE~+[ߊV"59iMNkrZӚ[kO|/O$?DOx$i 6xi 6xi 6xi-xi-xi-xi-vxivxivxivxi='=oO~{ۓߞw (;߁w @~;ߑw$#H~G;ߑw$hNx:鄧Nx:鄧Nx:鄧3x:錧3x:錧3x:錧3.x邧 .x邧 .x邧 .x銧+x銧+x銧+xy&i&i&irE]/>M~7r׍nu#yF^7r(gD{$D~I'D~푄' Ox鎧;x鎧;x鎧;xz遧xz遧xz遧xz鉧'xz鉧'xz鉧'xz鉧^xz酧^xz酧^xz酧xz鍧7xz鍧7xz鍧7xC~߇>!}C~ߗԣ/%/}K~_E}/x釧~x釧~x釧~x'O2dɝO=E=og>x<9,-n".8۲hUsŸko{~eoy s&7C+C%8t~m?Pn{o J7]^\Cy_{ eQ={&WFԸ1D_K /}\,?;QL-siDЃey"~nq q } qMʽ&S{M(-k(Zَ͸Xg_r1]w)Zw=x76,od&ߐ;;n%-nq#S<k,:W+xH/K/:>AD~[o ma-췕zo3[&tForjn'g;m;m;~ۙoM{߶{`jݔ[Y#v;har3g'ingNʷwQ]lb<UQE{=wўh].snƻv7ޏG.{.{B'jH9{B'?-+gO_'k# !?<>{Cs)_T+ }gBym>wnWy\_KQ/4|ZIK_ϔO)9\|k?9|w t*t^?`}ػ8,?\qh-fAc-t|rr\>q}V2\_}a{yL|s폰?g_'8|rj};W9n\-Y.ؑevx!?C&q{8xqs^Qgg?y8ov8ayNݲ_\-9*oG$$II#GB4OQSӦgk h=Ovt_`Wp\| P3̋gP,y2)?OYo);,I<1nYe\I<'Q?OY?OYw,GFrbVW eE_Q_b~oFTe1NDb:8b~b~||eb|!jv?,s} MA?(1ƲvAYoR,9:g罳!gyQUTTf^R}Ά U}Ά=kYs3W8x98|z9Es1m#0۴lg׻̦?lg63f|f3>g6Տ\wg3.ٌlS^ls>Ը5иݶo4.8KNl֫DWxU=.SeG.3_wvuU*^WCgs븫x^WC^WWCy*u7WMݮ]= 1r|55}r````09/7̸R9oNaWSL,esEiWF o|7BE 3o y&ן7M?o2d~gNhzs8p|p|p|p\p\pپiufUuMTj7Q&nq=*nvU[e-Yxѽ~'] a'nY{|=^,k?ur_y]\9rx˹a ]v}>?gY r!`PȲp/ !<ׇz}(뇚e0vÃQZ?<(Jl?GE{G3G?cX?cX?cG_qf;׳#|ۧ|>'-_tacs Xz!8ޯ ~r}޾oᇴl!}G:CQkuKpЎ-9[Zm{- nNvwPE3dwn1?{i׽k/^3v4gy;`^~g|f+ (~|a}_|,x =k')x:8eseLp2 X3󵣛cZ/K{Cpn ǖ /W8__ /W~U}n~W7MoQ9ʑC^y9#rPs(jpuTNpuTQ9\GpuTױ9\]G*]Kױ9\pu ކ_owx2e˟+g{{X v#x\aw\ k9wxB['ۮv竼%p^aw ;޲*j;Q*_ *_E~N5_~WWdٿUTWQZ Ua7EWTy Uނԯ|0㫶 lۥpAz^/~^/ l"f{5ڮXt-x/o>SN{]T^:T]ӮUTi+ԮUT|_*xu<1PKdmȰ{**\.G\n=_D|"]D'Eϋu?/~^ u?m~yQz]zGۄu?|tUXx_Ѧu?/~^\iNC=].[rE vx?|`Rؿ|ˊ=-| 2-d{oYWoQFwmqǞ]Dez)nr)Gw j܊ƭq+j܊b:Ը5nE[QVԸ5n$q+j܊6w[q@[G}< BT}NjJ}EW ϶*mU۪ghjaw]-쮿1n333j}[Z}ZUZu3_ڰ:yOTyp>SǜoT?QCU:Ặ|<tk<.mcOn=vu9v]3\u*Wݰ{]\Oqy>O6_=ڵZvG79j^ZxgIox&e\3\>iF?6#9Sss^T`O-8Z0Zp_5>_5y//z]lcOei>֫mKA{R|'jkc#rۘQw6{i5+Ww 9`{v wv{lrTΌN몷zw1}lQWfYwrL>6)|I\%ѮIf|]7-]h$ԮI ]ZV&P&ծI=(OìqY,k}/{]/8v}2?9K5TSO奚+op8ՖcH8`[,eya,z eGQQQ,ve2SyFhw 3Ƽ8ƅq,,H W/t8><>|cZ =Yv,q8lѱS|~nv`;!|u&pM<= \Mrח@;?M O<)׊y3IU&Ta$~v)LesxS!a*?10ra{8p plp̄[pHǟG;6~Q82CǫSp71?,Ea1XF(Xyl7q Q~1,#aޅ֋wplı /:05g|x> X#p,  p\ dI8I0> B\%$<u;]n=^Ô>ov U>0Fua$%`IX.ű=;\0 ]0Gkcoxc<<=[xfEx ~{.7d [.sl n;p| _ _P988p pqp*\_[]|n&n[6;.X և `C06 )l[l a0Ljc2倍'\K8΁s<8>".KKe |~ O[s2ko_7;w_F_ǚXց`[`GϯEx ~:oq\ A3q x{c\ASŲ #f,?߱kXaŎ3KG87J&|Wp3 ƿ/;-a+zz+iGL"Lw?J2ƻΩTJ=us㐽iXi&G*"+#[TH8-Rz?_x=Ù&M|w}C)e|GxwwJp  >7xΉy ^~T;1wr7>[: ?p q0>HhXN|9Nd>)i|"_˜ٜW*r_."7K˸+oqWs r=&nn[֕C994؏9 >=-^=?AC<|_<£/q*dSy tY~ȟ'Gx/J3x& ,,"%繹^-YYYUYY5YrfRxMfc}-mَفىم]ٍyo=ؓ؛}xn@ ?p 7q9| иy3'p"3|q'yNTN R^2͓3 <?C=8s _\|\E|unWJ,ūx5K^x=o,òRZu\w[=!s?;3fv֝Yzouž|؟8SXL"4%-OcjT㧦%0Oi7NK{>w?MOG?=mSy'E)-ɕ!ῌ\Ix \iI$\7˸+oqWs s7s r{|Cn~ď wr?n~\Ix/|C9cI؀YlFĽIb6sؘMfcMRțq=n&nVn{IXbÆl~?G_xɿxGy:'3x6 Kr^2,r<+"+2* 2͘o\7˸r?IK^_s^/,,\ȇ=;.,Ȓ,ǡXj<FN,R~8s 2caUXXLF,!8/%̙y\ȗهxĚb6s1ffR fS|?2C #F-$ȡC{5-ɡAG8\<_y8#Y,sxQp{|p;?;o 7s #67-ɷ?`TN;­w<]x/fy KaM|ݼ$_b.a²XXXUXX5Xڬúdf19lFl&l\9[Vd+fe;gvd'vfve7vmwN`Obo]˻y}Ac@>A!|q>'9#99c98O>8Q1?p G(co-;~#x3w?(1x O)<O<y lfeI^+؟8a`#|q>'98OqGrGs rs'2rLc:/᥼%y9,ūx5K^x=o,òx3oayV`EVbeVaUVcu`Mbk3 l!1)sٌyl-ينmَفىC/8_q~ZC + k3XuXXl,f3 ولMfcsp߭ԭmN.}}wLJGrGs rsr;w.~jn_+~=[w?G}y?~؟8a`<|y8>qwaӤ/jt94|8s r_tȗDN:=df5OP,W98qr_wIG9,kx-7 ˶JJk6q=n&nn6>?.~ϸIϗN;>} ?0r =0r NJ)/H-a);1.~G0\(/M/^$7(-a/~#-9!ῌsx $.\e\\ɷ빉[=!s?;r7qF9~>7>7cbC6b'eL6`٘MfcS5q=7p#7q3rcSeaC`-mrj<{{3raMf6P Fn9r0rayd/ƿwY9[#Fn9rXXx\y>rjHy}0ʩx\1F>9O;{70$NnF>9Ƒ +_a",b<9c8y~bVbVe5`-f!p(Gq4p,q<'p"wr#OF~8ٜW98 ^'"#?fZq:cÓy O,x>/e^ofc}S<x:[#y߰#~_K~ůp/1ry#; 3ra#. dz|S8]z.n=ؓ؛}x>|89U<"7K˹+Wq5gWMZ`ma]c}f2aC6bcF7)5O?_sr?f>/QcW3x6 KJaYͼYMؔl|F>3|f~=ኴ$g\3{ qa|or- !g1Âg,$N©8/%Y9|r.q>_."7K˸+oqWs mz ­غs(q8G3}~ȇ0q0>>~ȟ38aΧ8#99c99b1R^ƒWJUy u7FaYr<+"+2*:k&k1YuYb 2͘l[ؚْmَفى#\-GZpuZ# + k3XuXXl,f3 ولMfcsp߭ԭmN.}}wLJGrGs rsr;wWr??'Y  !f>/Qc?g“y Oi,ydABJ$uRK=<y lfD~o^jYYYUYY5Ygpffr<{ucS<'y_ u[c{v`GvbgvaWvcwydd/fžP?~ȇ0qE~o^׸ ^94|8s r_tȗDN/}df5OP,W98qr_wE9,kx-7 ˶JJk6q=n&nn6>?.~ϸ魖K;>} ?0rzkѭ[+G6-ѭ[/7oFMMiof}[NU,عa+{\O'6I pK9%kK9[FtҶ^pEvwӚtI?k7p#7q3p+=F^2M6d#`(SLgOboF2 aQ7ܛXeyfJg'l+|s9p_\%\e\\ɷ?o؆x5obu`Mbk3 l!1龹k #_ f)sٌ{B. j M-ϸLOĽo{poӒpx')HXxND>|S8 c~Ows~/~ýoȟ 3w?(1r~|(|ky+?gÂ?v~ď wrM9!>̡lj|YF=-iI=srn&nn6>?`Ëx1ӘKXװ )ŽM.2. [\\õ|븞p7r7s r{|Cn~ď wr?gͼAق%K\׹+Wq5rQ>I߅NۉӒ~ps dMeyfgVd%VfVe5Vg d-f6.>3ـYf 2͘l[ؚْmؖ؞ؙؑ]ؕ؝v;ك=ًهw/=~>ُ90q0>PpHhXxND>g,$N©8/%Y9|r.q>_."7K&rsW-jZu\wcC9Gp$Gq4#ُ9 >G#{r??'_x+0o?8#ć99Q>Pp>Q1q 9_^4^X ^RW4ᵼ2,˛X7gVd%VfVe5Vg d-f6.>3ـYf 2͘l[ؚْmؖ؞ؙؑ]??IOiIIXUXX5Xڬúdf19lFl&l\6cnnn®W}7q|z$Gq4p,q<'8!sq?NV/%oz~~OAC<|_<£79[Vdka[c{vpIMj?++ k3\/mI#6e.1sPe;gvd'vfve7vmwN`Obo]˻|s;_&k\eG?^49}8QN|9Nd>)i|"_K}8Qc}f'ggrgs_᫜y׸ nD}8a)^ūYZ^yodm\oz mz M-m|}~;?']q7?wч>Ժ3^ûؗs痴gFyOs@?΁KE?N8an*R%\xEo\8)=%q݃{un=(u{a^w؟=8G&5:q&&g8ek~O7WE|.|.|.|.|.|.|.|.:N,q((+quNĆ%8iyokX͛[՚mvȺn!vȺn!vȺn!vȺn!vȺn!vȺn!v8msX0+ cX0+ cu 70+ c[:l[:l[:l[:k&k5ΉwI\l5۳{'soXs r'`/e,S%~ c?؏؏a0c؟؏a0c1a0c1u޹b%#G|?}#>{N=|i4s9{N=|i4s9{N=|i4s9~~=}~޿ﯴR}L폿HH}i_<63xISSғqΩ駤G} '( \kӟ)Ŀ9ċ/L|=/N,8y%opRI/eī/J,(+qKZY5j"K\5\.JݭéװnaF~F8^+g^+Bz>_3c?f'}SHT:>1.^/JqunSuO?9ϙ0W7™qs]7⹮g3O;HͿ<y1.3}JjޙS6l6l6lN?xf'9gPP;co|)kwZɉy&Sonu\u\cywN~4-禮:ĸ[oUߪni>-ͧL2uUzIvч&=M.2. [\\­w۹c~O_8;~>Ρcؐ؉{}a&0ac6e.1WZ?F_u~9/pnFnfn6:u_b6sؐ؃OF?uzNgOboF?uX'98OFsa?ٓ90+73w9~ 0aq<ه7qFs~}a9և\1Fsjr%9؝؛}}$NnFs؍#9YazbEVb56+/el-يٓa.1ѿ'Oi,ْ>~#?9O?n~/%o[\ON͏ى]ؕ؝џ0\p2Ne'OO®=ؓ؛}x>|gp6ʹ| ..2. [\\ϟ79,ūyk3XuXXl,f3 وa3|&l\6c +67p#7q3p+?cwHO;9OqGr4rs'iNY\5.~ϸ ~ɯ5>~?G_xɿxGy3x6 Kr^2,r<+"+2* 2͘o\7˸r?ewLOy/~ýo_x+㟌~ް07J2z q+כ:_āgGa}s-O7qaAd9eƳ(/`9\ʲo'uZFn}*Fm}a&6!8/%̙y\ ;1nÚb6s1nSM3X=8OY|F_m)הz^N)= _fن_9= ȇ9q>7xqFmXg_.zm|}~.F?l[]ғ~^C!i|[.^ċt^ҼmaM75= Gp10%òXXXUXX5Xڬúdf19lFl&l\9[Vd+fe;gvd'vfve7vmwN`Obo]˻y}Ac@>A!|q>'9#99c98O>8QLcc@>ć99Q> ^=?AC<|_<£/qFcx2O<x:,ȳXg0(Kr^|ss| >ɡ|#88c888ї^4^X ^RW4ᵼ2,˛X7gVd%VfVe5Vg d-f6.>3ـYf 2͘l[ؚْmؖ؞ؑ}ғ>İBʤ1*jZ`ma]c}f6d#6f6e.1}RVe;;#;3U{Q1q ~aOq՟ ~ɯ5߫o{x3w?(13Óy Oi,ydABq8۹?q$7ĊjlWyaiF8XXUY5Xl6Q1q ȝ gq6UFn75vd'vaWvcwFn7av\n8s 2rw'ݰ `d/fž>g,$l+|s9󹈯 .R.rJU\3r,ūyk3XuXXb6sؘؐ #o `#/Fozw p>q ȧ9s gq wS~ýO;Gx ,¢,ƒeXx3oayV`6e.1 ;=_+~={/< #Nb:s q#F3uމsGy0a ZF3aIPF35Ey#p)Z k W1a3a|"_˜YDž\M|fؙ}8 k2RF.3u\fe{p(e>#F2ej$_7=_AG8ZAC<[y ^n{; 7s #/y_z e>©3b14aF1I1\1ey˱<+"+2*:k&k1YuYb6sؘؐMؔcslVl6l®>}y7ὼ>~A!|q>'98c884|8s r_tȗ2gp&gq6ʹ| :b.R.rJU\5\˷7p7s r{cΡ!?p G(c o-;~#x3w?(1x/ O)<OgAųYEX%y9`@>G(|Or(q8(8NdËt^KyKr^+YWj5zYeyfʬª fe=g&09lFl&l\6coeKbke;gvd'FN9HOraeVaUVcu`Mbk3 l!1)sٌyl-9ށىم]npHhXxNpCn[w?G//Lc:/᥼%y9,ūx5K^x=o,òx3oayV`EVbeVaUVcu`Mbk3 l!1)sٌyl-ينmَفىم]'qRG|^=?y=yg b!,rQr= ZV`EVbeVaUVcu`MbE>/|^jؔl<6IBݖ؞ؙؑ]ؕ؝v;ك=ًهw/6s!>A|{@>/k\E/|Y>I9S9/p:_Ky|">`}f'ggrgs_᫜y׸ n^XWj5zYe[%[^õ|븞p7r7s r{|Cn~ď wr?goK;>} ?0rxމ}9h~nVDla$d4Pz/RDz $^Dj(C tDT?D|x|9gSv[\w:֏jXFUchKqX8Ŗ5΄}aAx0ò&u=i%Zvݍo~D?;.{> O?Qz'IZ@Oszyz^_KKz~MطGБ4NL}|ҎoP} hڔ-i~?ؘ6Mi3ڜhږ)ISvrzqz(BR'mJmIߦ( J f$~A M ;t:}/+PЪ}V/iMZJbħ@_e\BMM!#ʼb_"̢Kh=N aaZ9Z4)3Jٜ_.5WžF /!CKR4>ҿ)9<{)9ʸ}@:(M,=GIg3Z#֢ui>NQi h]@RLkКMЗh]2O J'Eit:Mй4Σf/%z^_S쳄 j'H7ѭtI~ ߡ+(_NK.C3h=Kћ3M]MKPFéCiڑF;dڙ)s¶mOSI4zSM 4LžNžNؐb_'^W-^5 Qr7hڋo>=B?G1z'i=EO)gCh](gCY}3O΢;Gcڰ*F鋴Ikڴ}֥eZ֧ImH_F1mBf9mA[V5mCv=@;h'L;.+FI{Mڇ[?} :C0:#i EGTFt:D:NS4Nߥ3,:ΡsiGt!ͤb͢Kh6͡t)]F@?&n[6!NwЏt'Ew=t/G?=H4ѣ=NOГ/8^t.AgYt6CR#qNSiCX:D:NS(NoЛGzDަ?;zJ}H?#'M'/~rhSuOBiZE3}%s 44t,G t"D')t*FߡtIgtK3<:. i&tEKS? PFZҲ-O+8OhVheZV:}HkКMЗh]H_h}DІ*mD&)mF%mE[6-mG#}vɴ3Bn;}A{ОMgrLc}6C_ui"}֣im@W諴mLЦmN[ЖmMжmO;Ўw2Ý ڃho^7at8`x6C :Χ Bszc __KKƻ5~KWIOmw/.ޣFGO>O?_}Ц.!CӴ0-Bgh1,-NKhIZ0N4FRCi -CciYZh 4H+J2BjyZ@_5hMZ֦uK.M/z>M hC }6iڔ6i ڒiږiڑF;dڙv]i7ڝNߠ=hOڋ.e~jowjw{=^=Sza2/Ӵ0-Bgh1OiW=@;h'ڙv]i7ڝ|f85hMZ֦uK.M/z>Mb~kq{ mKCs#]i7ڝNߠ=hOڋo>/GߢtHtJMSiCX:=L{_O7-t+"I}m8 BI=ElCsR.yt]^˃'mLЦ4jеt]Oߧt#D7-t+F?dw r<@h=B?G1z'i=EOzz~A//W2 ~Mi3`:i*Mc(l}ygͿϛaD `  3s?\xTj 4HW&I?Gi}#LA'Юj7ڝP:)tC>5Z6 _үhgGBӥt~Kǣ$- ˨[_ЯeJuB+^ZmVmI+WwTN ߇^_Kdžwhe:(f9jv[sgta-ЌKׅ{W#,+erg>Ou.euLg7veI {B51E,"3qAM&>҃H/|R[,eM|_n/7+]prr}P&<i ѿ ѿe~o%ĸ㸄u"TO.! =֑h ߊnkof3c{Zh<~yl<[h'vh'v<<<<<@yNPv<yyyy+x[0ϗ4:b%J΋&?_,k73lllL3k3k3k3k?MG{m6^^?:ٔh/OE{mF{m6Smk+ ?dx;;ďxczߢz*J=WQ[:p~`yxxY~c z_NI?*j>gP㬿XvlvY7~y精\_L)_-EF}`]KlK]}X9uK]}%?ta'%I+/<_(~b}~GY?3klklk\3uد7̈uA|S=ǭ*V4jMw2nqpwF Q:Ŀp\onv/mA6o|??xHgl!M<3qaw(C//&>_I D:0.2|~e>Wwcz===>@{?ôz=S1zc>s}}}SoC9~zvz0\^xy_S!zz=`>k!ÿ?B-R \'~gn| ?=b;=?OOO3OQ?M_&}o_RǦ\?:>f^~xOtv]o">_|rBڿ!80]Ӆ;t=Lt=LbN!Sb:O Lb/Es5V2PQbP a/ Gz_}#N^Q/M| ?`CvpaeX؀>ϔr.ph@}vx'ss?s?s?sOӮMz=ޓz]{~ox~ӈp}yϿg|j@ 0 \:IoכwX`NGx u@y}::׻t#ݔ/t! aq1F縀&?BOrNd>X)q45u;lw.v{;f}A9z'vxG{4Y\ w@Lg}}@??ÛVγ,VVs+˹bncۘ6C>|l7a;G@vp`O%Զ4٧c(7Ӵ( T=_r_̬Pw}\'qc}~I`~gz>ur  =00p _ak/H~x(߬+|+z¨W~)pdM$ ?&ܟ O8Ep~jQܟ O8S~~QܟOGLPˋ  IS=Na1!߅8?Ϙh3\:iOU;y^uLs/ ]:hsfE.Ћ^dy.r]dy.ES.E\w)%%}˦5F։^6t/z!˦Hw2?qp{`\6qp%pY~Ce|wW _y8}q.o_n7Yϛ介bzd=o/7Yϛf7~'M@=q7;Ϗ;D?#^QwG>X7ؔǟsZjSuOBiZ)즖{>qC9b}g;:n \(hw*I<㲸3FwR;T 㫄SA:ђ~(RNI9^ e89ҮaOEsxst} s:xst=F<1`XX7{X!(c<;aR;„QHG>GI),}~ 8COoMIh^mG_4-v/2ZѿoMUV:j0HOe R ~`{BY{V0aY8~wO=!~D9V\qo+k,݊㠕kkc|BO 1>!'3 >Cϒ >վ])Ynz`gjvh`[> b>@(|h熶b>.b>@IoՎiqI;dK8I:u !N6iw\ו㰛q`Ӄ7rflllllll7ޛLsQ~r|)[~ uxc1o1`^?v(Y`^?z qJy:q)T]aOÛ~:Z=~La=R)v3 P[4Ss:r?e5}h3O,7Lo_|X鬒Wo˹oj^ee9=j>j>뜝|A{(k뵁`Σ\~~~Fzmd6^YM&]L=rl}x e -|0b[:i<IM7u"|PZakbl=VQ#]?nq.d;˹ø&綏-@hr4ףv:v:mMkd;n'׻\vrn'׻\v:]w'[ve.nw?C0=Lg=~/Hg!Kizao/^泗e>{Y޽,^泏a>}\?}lO'g?8 4{J|#@O>˛ؖs~泼////////?ss=7P~r0߽߽L}p1IQQ'JsI?8돱=qSΟ$z'ُ<N_yCS+0ECP~(`? CP>2q>v8f;fyN<͸AyNs6FyN;i6sڼ@W uRKuT;{gOz@y.q ,e:̫e%E}ߓrb@L C*i71)X̮2(BGɓq[&̣8b]UFCeLs2˜Roij;)b/ΌcPEKoƪԞ->n5]3fbXVVgJ{XVضM]kc~~K'{T*cPԪjY><3>-_BT\^lg:z4ԧte SG|Ɨԧf±OY#~*OЃ՘F],d}. YghSQr;Z$ ҡO[g% 4F{zJR=ajAT?m١ʪ?L}V uN-l %¬Oa0ۥV1X9'q"V#ڄ6PuG=8"=]E wVc#L=VS];9N 7*ϩ:&թr@kzKY@:ĕ$nKȔzKlq\.>NصTGD1(+EFT7JsK~Q:j>YֽwM=cac#xacL  CMԱ+&.<},&J9cIRk;1lx;ᐨ1y\66v)k[(X#tJ:,Mܖe Ꝙ FM=c/z&0\ÛfE:.vMK'=nO Nrqkh8MʞBi{m_cfUFhѱqCc|abp n397W/[E]a8 8:CM} 24Uq{w/3O3܉%|p'R›qo\bp^B0aQ2_ezSKߦ#}CzЛn3dvZ2  _7_/&65n*ʘ3\9 gVLqkX"2#v,_ ,+T/A,hG˂vd, ROv4U7T~Zb&]zǭ\̃J?ӞUsVެU9o|(]c\Uud/w K4 :,wa=_F!s^amxi DuW p|;dkٚogcׯFW=^:GM`x㡹p+\UAY/q<ץD됫m/ ѿ/3VxĵǔCa=3׻]yp}+,y8 s70f =aRԅxh GpcgC+7b>^d~'1c>'5K*1׳\[c">˂^5zԧZBu1׭Vo_n8kl\Wc WccMn4~uSck`[ɌVȊ bbHIV)(JS\f*Mxv utIgut(&7t mLmkl؂\[v<%xcNb&ƪ*o'i6-)/,o\/ +P'σY]%:;6 d% Fj84yȅ}?%[?|Sw պ^oμ9F wa+]^Wӕwn<ߍ!xL[+=~u1Tޗ[_UR {VZXa߰~t<ރ{Zke4ÿ69I*;{r|z^V*M w^VddyLb̷֝7uGћ{7ۭۭuץJވhzc~otn)G>? mx`2.2.# @^?ld|F]a!7:mMzon# eZH=Z#'=̊r cyuAM ~/no8<> ^?r S.MCgZYlLhܱ>0:2je^q<Ҵ11kzO?VLEgzE0.Ez"ňrFYޣz4:z+AMxcNRYgy<3+xH'*Od^nT&ZAgص)V)/S9^Z;d}gȥ:jyGyjbPͅy3ՔSM Owi,;F~vn=p05!\=e~9#n kH}5餘LouSq&39.fr\xm=|0\~qeg)aU[ٙȺ e e=,a/ğmox^@2B3?ӪF]r]".bEZ5.rOK |^6Ym53sn|_αvWLV5_,׺Q隙ˬ#Sz1k\OyV<=.|3OQ CyyYzR#=~KXc3bЋZ/2걸7~̷eUӻlkw}(=p%]EWT{k_3ނ{[z|XmnZQ 4kY|RΡR4&^t#ܧx(+d(  WyVTqqO<kMO;'\/tvk"aC(zZ5Nƺ~ 68&MT;L'%X?;yRg|ރC|!Yr>Ix7[c _r lA r{S۹"&r_c~]$ p8Z/DY)/.rKg3qN[lMu7[9!Jbn ," )}´vY_f|dw^]8np?pGݥMfwN_/ݓ*2R|Flo%Ra}e;b"u_|A=wY[,cI\Hinh 'lO~vu0HJ|2E+~iz>Q𡬛, 3Oݫ5*܏ 2Wţn,:侹H÷ZM}~X!oYn|G8du'g9xҝ+Z. l; 3W^a? 66͞}Gͼ.4 zC̃gܧǬAU5"&[FIUǭw>xe0qa*\9?7 _4NZ"z?8IEpo?$ɧ>j<#Yz_-ĀgKQGz-=!{i>]`ݰ/C+LtR|bihXX }Y,64:b~kSexӽ]nUrMkpZI9gQ궄Le>g& F¯1)jl}+biVˈ8 jϚD,Lj6͙s>v1Ҫ*W\_/2K.;e+O\/υh8Tz; #Dw  &|c`Cg?8&SS$X$bCS_nK蕭l7޴7! hb"-X>rO.~km:cߙT Xõ߃V,*_6Ԃ`ml)B[3"Dg}MqƊWe:o9__y_7ş}K_ )_QPTlщ^hOX@-U뤷xnmty3yÚ6pK5\}ʮ@3ac'\3d;[g_oXMĻLyTt:&Y3K= hR+6IABp9Za"-˔O.<&' jD]GϺ,oz y?ү|ju,㉃ag=Րbǐ7GV8;t>dL+ Aw7*]ߍ2D*mW.;YZⶄ w{V%z| {ɁsBs K>Rx!>x7W,_70>d;?15F|$>>:m7Dx랦fVυ525~L=ލvgjWbxW1%;uͧZxj; 6 ~9&xM;nQ?p8=2_fCoGuQ?a'[>5jVl{~S9t0Gd[𿢶7}aZPM@O؁z=&7J}`[rc ?׫Z\,e-[$n:/o!vFl87{e{g!ϊ'NƥBַx* ۞z g`i"],~/~"1a&f"9p[aE^Q{OHc#a,hGu3<>|1b.nsΐsyXK3}@[9აRpQ[=*䫑F~%l]KlwOxoxeSrt!VMSs \Lp8kpVHpoOz5x߆&a|fk}͂ͅS3ྸA]K~],j tԅ,wGuOb/aLP)_۹ޛK_G__z3޸f>g)0JWUnn,/~.e}cB'7yߜ oyC?CRĿB4b 3ũ0Ӟx/ ]^n7w{XgGdkL]d^/LJeGeDvA}".+qDQ٧n5FKܥMu_z3 0?yoroO ꧒~9دIwSX3 L,)g׋xMyRMy[ބ^ c}81aijW,UQ@|9N=fOUŹPaٕݣ~;+rӖYVuT7 \UݮU0;=W_GbbP3xUq[B5Qetg8]tgxĿSx}\ڎU;t&yJ=bS^{Fv-yhd,߳̎6+H}Rϖ_QΖv3 ~)u@}(xpVf\V&ԣ5ۆ5~kٖӎ#ՃUޮ =aYc?*0)޽6Glh׊0*>J}LS_cOObyB=H_^-x/{q==Gbߺ\ݶ\}0w;S:@mNf$:4w+z5=7ă V3뉨ɮi8&E ~O?֏m5lo.5v-_ufw6jhjK]~Wo&B]M{ς^_v(]#lkGE=kF&*b.W)W=^jYj'zH|X]֯nvUoۺ]Cn(_w?v>&shj3x0; Eq~|* bvOpmnŗ<`"M&py=M9OTRgjT0M k{ߛ&z|xBh֫`:ǴaW:8ޢW˜+`^Ayƾ쿾v}O>bÿ _g:n}* %DK]h^|$8(9X4ʼnG/b=>^ϗA?`ka( ZYmLj}jn04aRߝnQOM&_*f=gWq\'n/8{#}a|l4q{pum+UozӦ#8C 17GjSe.\Cut== ͂h/UslÓ)}w{ʥkG$ ap3^ yFezNJ1ٚ&N.f{G0O sLk)0lzۚq>d9>9#5S3s\2L..e>y&̸o~S8B[E.{B/xf`r>a<lW!90=j5&dL? u_e=LoLΚ%Z"~Qhܵl8&ju|!o3b濘/f9`e@-bc1˱0gxϜW?ؿ4e3lm6yy$&[KEmlWgv_6jgm٬w6=~Q!U9{~w( 2UQ쫇}nqco. yBd#H 0.uKyRR^-u Aw)k)k)_yL?1 +xx?`_ro/xޔs}67sl5[=1|jg:ߜA4K"R IEAA(=JH &PIn ] HMH'@~{f>_2;;{ڶr@ڙ&(:um 6l"̎5Ekf{NfuoAi ~Ǵ~eK39ِ(Fn wqxIy}Y:Uoq'ajCNly(蓳k%︲UG~?r|v?;n 1to0TGe 87Gcco)S]} y?|GDi ~mc}~= KvčrB:YξWvZ_ٯ>RW^Y7!HD?t`Lw~c7c 91Γ 9|2y;h 9#~y} 﨎}u/p1ǜx;:~:A>w-Z߇ݡwo4VL"_̈́"_+VKȫ~ﷺr](pCP POs,e!?@O_0Ư` Q{L>JdJUp2BFPU-2\s-|ZB?VwVpI32CxJ;VĴ̆,DH"YRN$ˍE(WߧsE=" /lNBHG#SkSšT䛙O"aUS_(W1ޏY3#Q c1 ݅+S`ۥvf]Rf]&SiA`q(uf݈\,˲jFQѯtzΗ~5Xϕ4|0]jN?d%|ϫY\? nد"`2\,5V}TVLJE}}ʓ9itԻ(dJػIć|S~NAv8ql괋 Nn]Q{nV{PP`y5X^ 58kXAfNK_̧&|jZI/Pjk:jK35Q.˫jZ,EkQZ֤UhZW-ZZ're%E4Y~62#ڏV0-9#Isy /cˋcqrfgBd1y,!ɿ[dT8lVDY\r>91QVV}[w{inC"@S_}CX_uO}֫0 b!I=Eﴃ{}ֻ֓L)ԃp{5}5d~ M6y dya2+dK摋d>5Cx z`AsK;i_MG<⯚XߪzןGswz)7MRVkj-tͬ jͬjO,7yCCK#]q`O3γXU@[`GT33+#̪,V O_(/H7c/Qzثy4D98dh?S ~]Gf !X<rT@WG,!?אkm`a ]#h0:LҁoAK}Y/%"iZrPKgjI?$2Sa>e^O$2yJrN rnkz kz~ H|Th$H/Oh͋nr8zDn%_;hrZߵ|Պ㼕ȵxkEko+Q+Ekڬ[[[mu^ln,XU=m8_ b/BIg|} 秶ZN{@߁tg$zt~݁)_ىL$_|{*1;p D?uNrW-A]wgvu@+n_7O7׍ucݘ_7Ӎtg_wݝtg>ݙ;|3l'=h=JxOdxM_M_MMMxIxIz<$+ROUM< c3N+/I[!^I\%藒G^7d/ُOOy9D&$"Cɷwap3r>q~o O33vE*f-?V@\WBO=:n4tc(%ǑxrBN$')To*i\4)l]>?1KSa0؈ ~A~a>Qi.tk;zLөt1z|hZG֯*Dc? ByOgfZ#hL6Cƒqd2K#Ѻ.X>@׫,my5߯PjV}S/OCd2:9wciոN?͵~xzVC-?jD6&M8ߍOh{[xo- C/` X{ B[t n!- >ͰV=3>3>3>qz‘dLdLdLˢY,OE;ʢeюhGY,Q^>c>|}|}|} _f3l|o6f79ou$o/Bg%|ߠgBQ3&#){ |?Sc9XN=[J,a9?,*R8aOWc%Yn}7S8[-\* _yw빂\a5U;]A{Zu kGUWN꽂=uA~F+Yv')B 4]z^fA>+؏+#9={ /}Қ^N깒^iTGD'ȽU$+i+Vq`[)`>7+b?hoE|X1(LyoZeQd8PGGGLJpx0*WO;-b9p][*ruTh;ea)=6iUU*s빊jo*V=U75Xqʩ(!n**U*U=wP=tܭ[qn*ڟ Ok| \YfW9VVs> XY(+€H?j/װ}ЎX"@S.&b~kZ=u]ݤclxZ.a-e]r:_cA&v#~^?nuʕ8mZvkrv?Eo`p EED}wEzrwѯ_ [yPM(_nُi_{yj7{Ygk5k=Oa{$pϺ??oOP:~΄͒9` s'O~cYk;| ä"o;?]?I7OAy 25CJAWyUnp5>+`VWa{;hU8uǀ2O{"O)\&@FSqtc\|zc\sU,a08 (1kgS9q'OD=Nr~儵AxLzz뗓V;Or|uP'{@I=f?E>37-Xw$='=d ")/G, Do?NX#IlS?NYgk4_elg/@Yjy,秳g(Y_;k%x@αh,בBq88qpv)BO8G|YBq~I+@|BB /XE$ߛ~Wu]"]1]|Ybk犭 +6_O 7XC< wŴb.w'sTLZLZv1KLrZ8hE<,юۓJYL+S~ "24 e* ĭeC,NV'kor^0?u%렮[.ѯ]?d}Z^JK\/\?y2˜.sb%.{Z75ޟVd:]9 \Fsq҇e``yᚣ?9LTrYq#r\} 5q~RַԹ~Oi?׭ n+r='eeKڎeVWٝ,}2Oۥ_̺HI("6d&ط^ eܯy/ XfK|/ eVkx6/ߗ+l$a'Yx2ex߯A2%OH!2u_d+:) EV Mܘz/s?yd L\y@,& Qb^(Pf͌Jqʫ($/F~dTwHG˸->, OF'ƽ}:Qn{@Y>4:YFw I% 7oX@/qp֣q`0BdUC2_Y??!-O(7JMg%7M-[-[8x;7n^drx7 's[$-g([f n9z2kF#<|LJwV->Wqpd ` )n91*rc u------^r32 +/Q^ _Z3'yYW'ܭ,YYoa翹_M{Ty663z6wܦݶ"H/E>mBummmP;2w8ߡ^wsawx(˽.wO|p~^^.s]߽ww9}ػ^yX*?N]r_˻w?Erc.w(cJޡc~8G=cgUV;zYiJz J"_#_' {#ȑЫK$e'{Bl~PWqelءjI 5^ScP_Ib,v ;phliw1xWrWJ~B/l&jH3d1y+4mَ:,~:Іڰk؋PkuKEit[KpyGywyٟ@$]I Q^x>^;bXƺ^e]/Ხl NyRB7BaECESEƯh?*gI̷>_FE[%Ŋ} ߍur}\-W/@DH~f! zZ6dìôӇilJJJv!Gۧ}^dBzɪd$Ev "|@JlJlJlܟuSDA/Y"SA; RpT}YOd= b_"2U/d>U%JlH›Ş_ߐߒ˔TvV. aBLnSfo,~=߽'q'NSž+яBY"Sl;lNr_]pIUݹWI#Gh׏;zW8lc=RAb=RmKW]K6|a bA,7V] 'OCA 0y"Ȯ61^ %&EQ ÄG&*1GHI 8ȱ??i㷯E< ڳS2 ;tMA9bwABGS < L~PpN&`5--D+jWˢNg")c>]A߃9ЎC>vb>_] ]Cl)g8ȹ)(яeT#g|yP!6"6yT68Zy2*9B̛lPCC00BkUl gpKSYGTLHL#x7Ux8qqޖ9k^Ir9jNKs~iBqYUQWq~[$'8vmHO$;.GRHG_Њ>Ac`XW4ľ4u#9~GA$\HH{##{( ? E_E:~/Y-J(*Jƅ򽸄wWHn*s(!aWqP_^ZkQ~`h^ڔk#a~1Ƌa{{y]ɋd1Y ^~@ J|~'+cc{-G #$b1τb/p6dG][!ig3\8a{ױ$OQ[[ZYYXWVUTRRPP׳xONԳ{kAs}s}sM{o Xv {i5jz5=H WoKWU^sGt6o@ހ~y'Y'wq?I~aCÆFv=G]Ki;/KƑOa}org!NQ\x߸v{H>p7˺ٓ{7w㺪7ouT7_7q~ɤُ'zOjqӓړvxIN? ~BJWW)Jыo0ޔ{SԿC2^_ߗ'8oٟnܖ\bx2@O_E)BɁ'OZ #: 1f݌?qds;~Il0`逅9T!t=҄12S“`(I?巸{N=z%&!H]r9u41XrL'')Dr9BNe9S)GNc4ɏȏOLr9ϦJ=W:q#q6t Fs,:de̳qޏ=BS3I"y6Kg|y6go8o<7?sөw:8ݞOQ! Owza$nש qN|:A'#D{So'ȧs}nt'96)OqN\5I9^؀5'mnt;VjK6|o*9Rupsy#y\8^Jr]{Oq{%?9S6wOq{E/9MUO-p)ª B^_H>var3xe&3^0 )Ay4/񝾽l]Ȯd7;ٛC'#ȉ0y*'pe/P}9o=ڃp#^p{ ]9vr9ri߹\s.8vKͥ^si\c.1K{̥=siw\[.-K{˥]ҎX</8Og/&1ދ~rݝ$G/.rώt5Q7ȕ<&@N!ۥʝYS1YeCv@6&s.f=ͼ`G1b꿘u±vf8ad)ߑȦ)`3Rx "GrrNη||_>?9d!=%NK8^0%vs/{K&p9/{?' K>N=ܥv /S_}RpY}RK~`!x\r)O9~S>}jۥP)7 8<ž &^} O JSzPG/|Zu XΫGW 8??p^-***Zy~jWWWWΣG%:e9=Gj\\\}(G]ί_  ?c~N~A~I~E~M~C~K~G.# i7+*'~Jn!#Gr6EbzJ_i?J{ +.N8 &O '\ 强"ޣv宦k) >%ܩUh;4?2}Q 둸Y%c>:Z sUl_PT>.Og#?&8 Y͌m6ӿl0 oͼ?7>fg"A0-oŞSWgwx[V淕m}V{w[϶n`s:_jg2&{6mcyX6ncۘvۙ~;oH䷝mu|Ev"`9;X`;iW`;.r=Vr~e}AmGl{깇zwc&v=za}ӑ`(a?/K}]|O{^;D^{&u)w/}μ)Ϲq,w}D'vxo)a1ڞ؋|5j@+1sG$<4M_ԉQªM7?OESGX(<-efLWd#(.ׯWW ?zD_c(yNRG6%x_ݕ|s˼/pَx2e;EEip9F~@N'?$gxq`{~|& ޳lܴ6`6 p2lN{O'sa!\D(E\D ހPL?}\?urG+c?3++m ZB{-^Kh%k ZOJKh%a ĎH )^Jh'%{&9>Jh%'$RB{)3YlrMžJhO%#W줄v$4r9&ao%3i_p. pڛ[ VB*}оJh?%\^y*׫Wrrt*UUrcr)55{k)k)KivRRRU)P)}K9O< 죔P,erQj׉1\~שu1H[fwnel2[톝o0 ƿ7Nuܴ=Xo_|Q`wJqBC36>S$oHll M C Ay彔R#ڡf{[<=)S.GL ȟFF >,'Q< dEW4Xp<y/ VbJ9FŸ(?iEX<~~I)Smd6i729Ș#짧 ?x"#7fxcϰg8~YﳌU=5g5ax71"ycՔ2~Sݔ1iͩGs%Lߜn57Is}`sCsֻ77z(]]s/wANJSQ%ރr6-&ZZPԯԧ9ﳵ0 Lӿt-ޒ-"Ef狌{/E.؃|F O2z~y6 |ՊUkkm8jix nCP6Գ lC=P6Գ lC=P϶̷-mmc;c8/{c홮=ӵ~홮=k=tבud%wGۑzud_G`zKD;c:uD?ىg'Ο8&SHH%+W:ӯt=t1ЅմQRnL tLK/tݘ;ugם3^ax= `דz2^OxIxIxIy}V$WY^5|݋U/׽8_f}P{:9A0oP7WoGck}̛ a |v^2^?Az?ַyGs>u^ggQEh Yޛ[r(69N GGR~U #Nw- mVM m!r5qf g\& ~~{g$Q~3?͙"(|lC?"+(OVT[KYNɦ0fg&§f GC.vƛX}l̊Pgb>8[83v3Nt5,zO2k+f \SJv&"d3XMviS'#Oe?Muۑw% ? y o҅U أ, d y ?+, Hx5l"7{=3+TkqbK}o*U8[Nәt'm!O7K=3_z(?̣Dg\T3%ʝ7}r?4vB8ҝz~x9$<6Ϗu-.U>% ?r}& T+C#Vdap<4)OY/n%g"]tt'y ռ{URYHX98|հm<{i(v@ZT+JeX4m015s>.,7 TTTt%\h>FgXa&<3) =ݦ;E${ξpr@׳~\⥼Ȼg 蔊|!ܚ-,uWWKqH)j_fJ@yܩG > 9qHʣ)O1gREy64sOUFͣ bwB#|fgH!_orRe'k#叞.g&#lf )b^ 3 q3'<!rrgG2{}!gGx  ;& wXtЩ wl #]鱳S~s"~L.}O ??M'wCQTY%9UELʫfix/~[d~+Fj(S"(,Q~G)CCޝs}V變rTV.r_~MGLE^{:3Or'2|29n\s\7|`.19s\7o. x=C9..>2P^D.&es~ں^#qg:+v;y73a/Ey$lZT.ʺgRʄ,k~2!;*w OQ&+{Ol{-d!<Kz ud}sCI̷>η>γ~azG=Y?g):d=jVJpgrNPNVqJCžސ4au)x{*ǒ㼯)ya.ypM'G}SuTW]Y~?̎lM%)'%Syỵs*wY<R 2 ܙd×S o!lE v-(~(~'<~ˣ3CbǦBPb'S._*.%E=R%{N=k5Ӑ_m^A'*{EP>].㸓~#}Ѿ;JR%̣9v5|_ &7#/-vvLw=N1@PaC†!29.r%k) cj3]ȶގ+udx'%3ٍ'Kϧ; 6M!zh) i=JF _L_u1Pd_he@Z͞'CE& ]|sYff'Ld]uV7V;Oɧg???韖p%?/y yK^JZj>>*4r3d {Z2Eʭ(&(?Ny} /0xn'O8vq^4v 5toG {Syƌ|C=GiS@YI9Pbrg44DفP|)"x}( =3|_/q甿0U_y*_Qf_37&Z~ߚI*k&?IaGC45fg,&#*'zQ~zQ¿ѿѿѿѿѿѿ9TWȵJca7vm0H /*_&sx}e%@@"ʳp$|z /7JJQ"S5]%HHHHi!ӟ&A/+E}씩*7zfn,9Kg irz3OƁ# RG8q%+b~~~~\$*oU'+;c HG*19jj~Q )^~ʎa‡^B[kѠ0G ?Ym}ռV>5[>Zk[k^xG)jH O8aPuЅ/  Θ!Q~i!򩜍|8]יUuw٠z깞Sf[S@}?PG9o`꽁zD?$3',{X&<5ao2yn ?Rb1B6mMo2{{JwqѣAB7އts [>[f l-|nm>5T!'i9>/#[|d l-|C9> [d ls-|?>[gH\Wl5}+mf6M)`| 7;萑 3Mb>+PMvy B|eø=O`M(3T *G(xCz#m}#YzWwi03y {)TY ](\Cwx wL.3ttMʻM~i' r&9{a=,ogw g]>|}37Q|(? g}>|(@|(@)OoU_b+_)`^Xu45X0OpDXrʕz`L75ЇtA3<ӏ8|?xȜt8;d.OWu|YOy.FNjRsw{A?t0fLwzeLw2Q;ukώ9sMhtgGeJ?3N ^?뿛N\ݔV _qFSVSOBy8~·q#C2iyD;ԩiʧ)1;RaYe"sӳfNi`[Δz~A8>OS ,"\0p09eRP_STa{lw[98{0ߕppݑ%<zsm ŔͧQ#|.Q_aB_d \9N8-p2Ē/9J<>Q5_tzmw ` ۜQNo3m͟t"K;1O7< j?1r%t|Ǥn%t!D}E.t#xa>E*B 5OA;O^cxx&=oWyrG2!Gc33Q,!锅f!~,)U^!Cɔג-,(ozP'dو%(KIXysTw砾Jo]w YOHc+|_S,a3@5qN?N'7Yޓ yreG8K{k*|AsOy]:J{k!"N6=3Qhf r ]=<,r=,F{7Z uE?|*xy=5W!(:%Qr.#-X9Gi:rN;Dʳ^Wė0+7w#eesdG6Wzӕ,T6A9i!yHe> C~r=J}oA,?鯂S? hpcu3\5w#rnӞܴ㺮?A+ pTVTHd# T0(=*Kۥ 35(2s_]{=[E]rp2π6[M L P/q ΑhU Zh: Tmx Zq?-ZOb-eOP[]IDżXIJ(agdc4󃶽Ӊ/2:Zew4$J"91jq3q h9? V^MjK"Ǒ~H #_ H-s1 ʧʣv|xL{\])i*iשJ+ufNésNJ'g^~ ~!{2^51&&Jy~;3ўx0[`?dS!ץX%"B.T=P%*y(T{@J"vg&>aC^{|TdyfJj>c3uLr<{DwجK-ntK%⺥zBIe>SO5T3}N44Z̬r2o݁HW{;%Z)Jvt|\w#uVJ'ƸZўu`DadbQx[[).L9z|fyR(rJ|I.YA|;hcIp'\g ۨM&Jۺq_[ & LH'.6of7 ~췂v3m)%3/C~iӛbNm: ի dO7<y 8# Hw%zU O&+bKw/ ?awpp<3ӼyJI }T%Xcyԥ&2/qFo*lDG_jzz Q]6xFTOCE"u!RmW.voT=(VV]in2q#ɟoi{%:L#6ISt;s%o; ~:G?P[ %}|HH~?v;>Aw\Œ=HqFL[-f'vqV5oQ>Q%=?J]G#Qպ&寚F:dGhoy._fvh>BH᩶ݣz?O8)}RNNw2L!{OCgԇ0ȉ8;9L}1Fo"~hKqLYǻ`iÅw1fs*Q^y.ʫ_%ʺOѺ>_/>:g}U3>kxH|: uЯoD&q9طدCNpPKK? q8 0z/K^Q(E9sDߠ}KaR9ڶ{,lE,Z[tخ#n fI=D}2qrIϣZG394ℨ3|F<8JU=B,k\`8~G|*3^t@[jRόA1;Ơ~]n3Etdtq)D3rƚubG2'}ُFyN"|)!/W2JVG#O'F{'J?ԧq'^Ʃ>N3Qo:ƣxdK ȟD?M~JFLsz^/H%n)zOBI9=dR&'s=c)h;%)GOII)IQIRT,˲MO IHQ;)!|IϿ9Pa B4c=AiyuTfNWJ2]]Ի~gs5tYd'']ҕ'2zi\fJ9<τ3!/Sv2o'ʄb)TL%8\&iƑv(v2Ջ7S2'.Sw2w~av2L=~'y?g'~Ȅ2L%Ʉ2.Sw2բsDN6[gVl/[G6Ȇ#s 7rsk7?7!( {ĮD?Wr(zB\ =ftO ^a^b<y(CLǙ7fޫ7σf;G*=X(t%2̇|G|W_^g3gj#糈y=㛣i:?r6_TLb@|_裎o"T?ݟxs cDΡ ǏBz㡙\3Y8ɳibƠuA*oWl/Ug{ӈL_[2t_I| A} ~rGg%-f 9f.^+:5S._8LW}r?`:8w&3Iw*2iO/`/"ff"7B a_n%;xA9B;$|D*ыֱf~'zy^7j<}JGO`N'ODb#.@-P l7"/}"5O,Vu2ara fg!։B/T_B5Na[Ȕy]pP,a }Ogo9Q*z_0\;Q?Omz ۊƊd_ӶFk(5R"ԙHeqCf>-5W(<o2/C2/GQw}JoEb&Hx [bP|cKԷ?Vy8/Q K!ꘋpn_^IB5(5Kmh,wў^m{ٻ6e{֯E*D *W^*W!Z}'Ez kV)9UqUc\W5UqUc\W5T ?UDss?;~{5P ;TհC A5(A(# uƷHSgDM׫#33AyM3қfu>2;(lVC[} NĞӉ-a ~b81(آ{- ;nVۊv'xMmS~6%Mq;P~K(Ptt tBzg= ;H>o;WyKKoJ}qzYD,lJvnjߦAo-'&(&c;az+zN;N5QKt4(T g侫NUf!fw!Q֝Pa\.Uhإ~t2d g킼]wgZ#4j1:>։>VOFni|<H@"#A=(ƻG-\i\e"E{dUߣy{LwG#i{ԶpY갯U?>{W=Cj{h q[8SuOְޟ-gF9?W=3RJ}ibo7+'~(RkK}(ߧz;CR.Pw|4F~nr[~g_L#hsr1Q+N0ߩ:'Au^ރ3iz8.pP =?)4S?ݧ8sH]!?@FkFauI7Cða?q##*:.s1uǐ>9!8=y1Fy8yz0FaӼ8yqSfPJ:>~a}NBS*O!}ZݐÐI]OHQ{aHU?`HsHW8} H_@"sQ }墺E֑j+﮿rQ&c.qm-$9gd]6w.eԻ|^Wާ@+8N+8N+f_pU㺊z6߫|;b_.Dn* ~N*U̗/WU63'q\UYj 8;k|K#,fjSTW2$^</P:_zy 9yx)Quu ZdoB\㼡x|7L̵ǯG q;TC?zMz݂[*"nB{c[j/㷿pvn2:Ͻeĩ_&B3UwtlԿJHCϿqKwX;,yamw($hӬْk-rD>KC1O;3OO#?a Yo=)A#zA =GA#zA KG}B)m~ߦ)m~ߦ)m~ߦ/n}/W630h#S 6r:e21_2sْ^gzsݙTYYw F{ S D .~f? [?LˤeRȼ㚰k"rϤbiGJﴂvОb6WKD/̈J]J畒E@ٱJ0,st?N 8 9/'償~rON ?9''䄟~rON ?9''r_N 9/'儿r_N 9/'儿r_N 9/'儿r_N '䂟\ ~q/._\ ~q/._\ ~q/.?\ p.?\ p.?\ p.byGɧ獉tx<k8l8l8l8l8l8lo{c{c{c{c{c{c{c{c{c{c{KG\G\G\G\7qGq9_b*d<46lp|tq@wz壖?χG-< 9ZO92{80EΣ(< 9a=xj֤A\%uHc~nqMH5sS~|{ZNa yE4WIH<:Z|8q @Á1xuWxuWxuWxuWs;|r/r/-g#z$BD=G"H#z$ZH~?Gy8:bI!yŋ(z^;WwhGyBfE6| s]A<'cwb__4mR2w_WjyIpbړ߇|bvKk87|c87|cՔۏ@7FHie#y/MJ${{}}3z2 > ;F[Xhm`y!o,5"zz\VJU2b kUiz?r~uO2Ig}8Ykq,o<=oUʸ[oeӉ*_9ެ;D9z_0;㱎@5Go Sͺf:ižef]#ChƔ,v'7ϖ;Ҏb{o M57SZ|`&Zi?4M̼N3eH>7Q5*`Sٜ4?ӶyOVs~_4 w$&c-ۙ>f?Jv5f=_1Z6ibv:JAu!fB?>ozԟ4x %_1`7zԧӔcAtbg`>1$ )T-L6E\kΌ38IsṐk;9͵y5qj"i;Z*{.kzIo7L{P/O/ 2\ou>2,JՍy绅Аe0P?㟋8Ayo<CEѼ3B> ɧ2}f}~ F{L, = Y(cv@Ƃ=` ssss<';Im:|au"~v_?_Z_NuEWYOgeL<9gS\o?}@7"[kmHpw(ߙYb{oѺ=?9累K"^{yNNDxbgܿ1P3!xL{1> fy,c /gvT0+ 8~_R+&D( zb(oGN#6w$0w>iL9ʳ-v1r8\NMKHXAc(oT6ׇgYða0rv9 ].aðs9~XqnY닶̣1 v"#rx$$G=#֟D1`-)>bHtcҏP{=>n[Qr|w>jEzzOQKxXp7Lӈw5g9nRed9~?]<$|>I>cSy<ώLaFQK_ [*r/aHOr8=niO/񷥐S,S, ̧հֱ}Gf AhVxGI\%6.l<>ku BS) 0SW_SvoN'e恳m秬z$Ӽ:3 (~O0Na^^:@N̯ܽIiRș? -"B釖K}҇9<)r҇3s(Q 56OVW#y^$Յ Xͣg`33333WgggggYqzEgYEgYEgYEg9r{YB9;;B9//9<Ǹc\1y~ݬJ=q|D4I>~}:֭uqtu1:5Z.h^_~~I1ױހo`|70f}s: Tn`?a4KrI_jOz~púxXI}B_#%M'??F1ԛ`C_:aN;߄7&ߴn!B>کVw.Z?ؠuUX}wj6HǘoE-!GWKO$Okė-w B?-s ܂[A_vzm~J?˔~o[v6~oc|mStnu;%ߣ%fX3Or7h7EoC+׈u˅_;VlH} ss׏bw]I;=lZ%3=xmX(͊]w"f>FzZ}1/bvr%6P{TKX r 񙦋g "?Sς< ,ԳPB=ߕעF}5ׇ.F}ekf?5нC (}w~7r{ G~8({N  }+U消 . Ĉ aaCiytN"*ƨX|эu 7>߉nS;TN߃riJen? 07OBK9}_JQz]& k& k& k& ;;;;;;5v 1@O&wQ9&;zB@=g $9]@=Rbnv81@#8@u q9Cy=dfm333[F\dsfĻfAz'b O$J1ޓxaSqO!vxC]Sݏ55#~PAr`}2 y y'rWߗ~g0 6 ]GUH ?}d|N}-tsRa[k#Fw7Y҉>= (bcM_K_.] n^!77rBP/ܫ'z)}!LZ:7Lx26;Lh;N\o7r8h[) n7[m`]7n@>R6}OYs3;O}եfnwZF}仫g;ɼh=! uӎEs$a أ~ѷ%ֱo ;4[D{clӉbSKة%vj ;?Fv~W 2N-;K")YLZnD RAʑ;þzgUc3ȶ(vm9V'>nsgOsus,⥵GCG#߄$ֆ͸LρmA\2Uċڎh$#~3SH?8)7s;0-n $qSf^O﷚G sCˤ|]1QU{+' ]o t2|0+d%\nn Ώh[@<z \2/0~<Ӊ#}M=gVi̳ }BO j~vf= B\fa.`ED2OFmO1[f|3$+x9?%|!OogzgZSJ<z#κQ\aEUR^^f.}~,9DYO̯$gvA.)nU"W]a_v]uID_ Dc<|!gHZ >V^J֥x6tC/!YA|2X' =W#o%ʸbx1^/E\x1/[/ċyEx1oo)r΃@3/̋"Ey.xg/ҋb~;+o-/ y1?S/ԋ^G/aR۝)ɋuϋ8"μzXm?^ĝϋuҋuŋ|bbb"n^įEz{Z܋8"ν?/݋x'&J\ .b1Ei$Yx)cO$J Nb'1I^J%M &q1q S'A ~b?1M X.c>)]/[ *7[g)42G \ n刜O,:CCx<5C@A x 8A c1q 8q8A[m Sg%c1u1oJcJ c1y SNIsE栐Đ̎*|4P\d8\Lb{f/.H\G _ȃ|xsݠYsޘ±`28N_,Ø2oruXAl樐zCGu} `p8]xUI_n򆛅v0lFm `$3 y1 P> /cPoz|O꛺$a+<3֬r`, gF{N }g ϔ KY?7ٱo~6Hac_lCkӅ ɑPfZX\2qfl4'!B;&3q2I'qI7 &<RG{"* /AÈסXNFOdk2ɺ}4}SL~v&GxٟOeNE^Np&zp-3Upd?'Nine [wzdSuJETn7N"  c=bT}5pnpӯRtb]i]c49]ʻ2;_`0dH*SsfJE?%wl.[}#+@ տȕf3U@Q3' G_Tp$B\ nAa#8 *eX==Kc:G˥a3Gtc.wJaw&sHx2I2A`2)`_pC>^G;H Yp}\rWU v*$  iS 瘣CzI?\R)WJשQ%eUR^t9DU2.U7l@wO뷉' nN׍ܘDyNCy)N:"-KGtCz1r2P?FiĎ@ 7dgesg3%>Kx6#-ܩ%?%G5[0\ɷ~Rf >3w] U*C?%N2ZJ)==,H*tBOW0iSH 9OWHs(S)\)2202t^qˢo[4ۙ1ۙX3gzJZ}(vĺHln˗dLfb^g}h}: 4 wl ?9=\g0z?x"X8$K~)DyyӀ-s&ʉ&me{2m3$3,bg}SL\N sWnMLv_WÆ;Փ>sq9y8OT 5vd&f B(Mw >8%*+]ҧ3|d0)[>|g{Jy/ =#Wsh1_7a1+GQD"eoev1)zt`YwWJO/^ $~~Nl/3ŒXyܑ>x1)9iDiy)X,? tQ_KB % `7/0_, b}9LC+c+E9yLT7vlw`=8&sSطaz~H/ ~!/DE"[vn-BEhXOx\uB0pGu"\W-g#I_:fd%z*_BG!5x 5R=  }{,㈝9Ro o2G4x&8Af˾T{'HdvʐvtUWOU;"W鸪ƜO#ΏɌ>8Sp%0J1{z"\H =G'=/y`ݭϪ=`.So8ȯLUXdGP4bEb\,=4wRI~Y&.}eph3p Ӄ)|[&zt.ztJ闘CVJ }H v'dܵ 4|zk]c7~鵈37Q>q-O*$.aW0}oZ~! e7V}7v9^|u| c:z\7|o 2{z6cF{:3u+EVL0}`E4BL,SRqz l?oO<b^L?8SHjWH~(S=3g :#_I溠uKo'9֓T촶X3sDxГ/K W c>{,88swrak |ʷ|ʷCvێzQo;<܁;P@꽥s}Sy̷|6[o۸6/9#&? +0;d'N<ǡ{!8=}?.owc?v.Ԣ~-֓Zk^I9n s2x7Z?Q'jl x Δ8`x}ZVjcd-!>:M3Z}Y .tMqʹSU hfu<х(>ʮ@آ( E.Ei .RECqU4D7(6@{k;w̙3gʝk_`9~o˓jA_G6b >p\/)nF**lS-U>mr[ًc$l8o|q.\ mȏ8LᑁsN]u/O|NlU0AO [0Q(?b9~r[wtn9-əioj?rsgj_r,|Wdyr}HN)<|?fyr,k^`e@'&z9\Jm9N'Kf+|vm *Z%a9ߙ3Uۇ-_{+++KHoW^>o**Jޜ;ظ!kC7&L>RY;&j&j3޻5<[sk/vkm'x-㵌2._{-﵌2^kww' 'xv6Иl=?H>'}7X=v{P3Θk/F 2,ԇE9N]w]!뒯X<'ϝF_rYvb%ܴR̻ˍ;RWK2Wd%weJ>$~;߉FFw߽ø1!wkyn-Zƹsk2e\[˸zj=zy{K3Eg>`C^ߝ("!F٘|z7& _L~h3$UܐQf͌o-<`7}6^)/Ws*__ @+g/2Srf%-h zz7%/'@[WڂP-~Ph%Ͳuqrkaam?N~XK' qv |~n"jG9>zU=Gɷecy9={Qn=n=n=~:ظ!?^i/߮oֳWYO~i?ƳFgöjOɉ*4xe9iiK=ROӞ}Ncb<-pGpqD`YJK`;~z4c#̻W~}iMR~ f(Gg%=KHNm^wr}g/ 3g?-W%$ޗx_ov%52?b%yɣ5>8'p}%Əsm?Wo/3˽qh灯~#D}GQl8 -9܇?p~1i J,}9^Z`|"WLM)?\}q쟴}1ў*'SϨGBJ2?]b"w`QҥC^:x[ҲIźRqzqXkXP&. $؂*ߦV˦~t7Q.nHRZm[hq|Ш^^CK>pq@֥,>_R[5?{ ;?$?MH?ɟx?&ł[M9{3rn so+>.~Ld Gu^!_Þ5o編~>Ég6,9pY(='Ѱ3HĒ&{ooSδtў?L>:qC)cIc)YGoQ;<0G|0W,JZ>Ĕ L طXG{oG!>Akb&?/d}ۈ5q}S2ĚXdrbJ=u5q1u&.M}o5q15~xEI)~1),M}ŵ}ژtQ3~yҿW^"4Bo?B9{#6O:ָ# *s> |>bVeVЫ?xf*lГKqc$Kr'?7r_{ȭMw4QkĞ΅FNzM7|{3KbQcb,$[˿3 65}=~ {h8z#(g9wțs}swٻfLOb uw3C={_MioM]V{*'N gé,8)M4uMq&gr~{֙hꦹY5`R Ko=޵ ?};Nx;N$?'DHv`O"I?'$7s?g({m;e3z3mgbfnd({׌vdţ( baf>o,*K3}hҳ}h^iv ᓝ35_Wݴp9OANqmC?}V)nԼy ~ˇצ;"gj<;]{}mg,ȥEd7?`={fl`'cDݿn8 & q{+ˍ11;KܑzGoc*H彩QqX~̮ ƔGxi 4RЉYGl-`[ŕNFӃtWIǾdp=>UF?x{3]2#{eT&TOe:y&zvC{&g')8t3GPM&#~)cȤ{E^QM&(ɟϱD_?[|Q[<;'ʟy/ʟLL'?>2(?>ӝ[)~1agүe:ccNʤ2ZIe-Tz&p44/לt~;X7w/͝p߰,꺆zۊvъv =l޵BZ0?лVLQz ~I+tH?VvUVִ̐NL0joωqw4li4η嫵885z?5lrfod?BZ}vF6v#)MLM7弖!g11+NםxO7J. ءl3;ecCءlP6v(ecчl!;m+eءlP6v+jdcC=ecOاlS6)}>ecOاlS6}>ecOاlS6)dlCv*;NecSةlT6v*;e׋nv*{eE-.E1.ďZ6-fE9c)zؽl[6 Ag>pm8UYqU.ǭ hk|.ϟ&N n;ΏY9ex !|vnbsWvNi -#_nRuם`'vy0/]ᅰ{x) h~]Z> a7x ^{Ž=Rx ;l a0j\#ۻMŇ4wojkkjj}i;|Q,#_u7MǿnKxkҫ*/]XIƉ:%/t`vv{ j<сD1:Ptqɩ3:D1w(C2j>C4>x/ O)6j׍JtpO?3x'ǁr;A9ޛB`ߴw'*G?tp7)%$;t`c{V+ϋOJHt>:"ػcg:5Zx/rͧ}3>˧=#||o>G1#|䕏˧?ϧϧg-]/;ߝ ÑέqDcfv[f`{>ҟi3z lk6K},0*=wNؐ> m?<5c|6"E}_FɭKžE-կw@gonŢ>eaQbn_o"lda1/ӹ}W_hvȞ7ݗkbE7Pr;/˾#= oW?·ܑLQ\4qwp;oNO'^S퉋?pt\aƏ- ` I/9zҹwI;~xLzz~N;wE=wH.z ލFwnx78:̳ tB9-=L..^C~/^e!?㶇2t Exѳ _yo !Ia}ozy=@^Cxn)3zgJ>9n6zsNݒ s86'BFA# S/&ni$3FHq$-lz\BKHJHJHJHJHy ns## ~ ?,M/Y9i (=/ž%q1+G<֝-Yyڇ=w4Ml#f=@){)~{w(}EGs}4z5yAǠcݽAcsc|Z2A!2w%2wSO'Siӄ  3"L$D0\ w|OrϞF.A^F{5 <|'Sݝ얇&ަ:NNONONONOu+C8LL7/طndȿ f;.,msQ2˽Wǎ^u1vU#}Gf}Q2zG=C󐿱[Q PN(`z?a; Z>-`hhho{ٿnx0?jh;,+.+((M rX=Ƚ)oE/N/3#XݶC\Տsh0g vw@xk2|E_cPW]PFUw[H׫U*_`7(Y^n)J_pWL/ݝPz]@KxIPXqu_Kj_ z%5[ГX^Vr.,uCx7,,,EKRRRy,EK~RRڏGT;ZwK7Pj)j)j)j)~RR7';Y~A^Ζ^F;[F;{oBuO.wr7*y9z8_t9ߍ,gųsKV8}7q s\ gzYA=VP+ c+ˊ/1y`<d%~J)w%]{WޕV_D+J9DзUد7VmI~8܉‘c^O@y5vu{OᢘxRx?V%Rx=+S8YM^-bT[/ iwV?Xvjj?[M?~du47{fڏ:/}gh&>kGf_j'n5 sOfzC 8h#֙WG3Gmy+yY=93f{xM`unAڵҧ` k"}7}^XnծЮװ{n5ٳ5nIٳ< !p5QX~s9x[<'}N sNG ['Kۊk@/Q;NP v<\<?O' y<?O' y<?O'г~=hz=_O'̳%/JhzO' ~}>_O' ~}>_O' ~}>_O' ~針sVdLoߊdHo!6~;ҋ w؏ױ?y`uu}mVndsřu+j]ygj_>jZEkZEkZEkZEkZEokZW֢i-zZ֢_-Wբ_-Wբw]-zWբw]-zWբw]-zWբw]-VբoY-zmyas=z ze׿Ƹ6aFm@6/ۈz#~Fm߲f#vz#~Fi7bo7FxI7'oOވ}݈?y#~FMQ><\8.jW(&64QDy6QMMg2 70|&6lmxܶP~#}>z}}>~̫}s0b0^0\0[2vf 9]أ-أ-g ~-[+Wn܂_r ~o ~-e[wmڂߴi ~-G[m?ڂV?]VVןظc25z϶Fy+߃? NZ|;mkg?;/6ğӪF鯙elS>Hې6位m0k$6E6~QOۜ'Fq6۰ۨm؇mNFE?PY+\m6 "8Pm1ΰ .Smw6nۨmnH8OsF}[Ϙ >UrQ\x/j\.:6MT_jΡ׏ΩP[U*]R.s*şUp}=Y_mefz)z)N%r~v΍_ݎ߰f;vo;~v܎g~ ϙ/w;C}Ǿ;פq 7_Gѷz}nգ_N{|֨;??hW׻+r zylY3 r|<@.;vNtNGwFdn'~NdNg';NU;7;߉?{˗ٛC;wt8Q~79d~gT&.>vbv"{ϽQ%@~ewgWב\_3o?nxOKn8sA y|:ȳ} 7,ȳ} 96 y{ހo78{nkk5!ϙ\_Epqڡ7+[4` wCTg'V~{>ɼ4S2j+}Ln|v}]qSc7cV a7PO߰ ߰%S,@wM#g%beȷe|m4.qrC{8deOTÍ/#?JKphzCz gjRaL8B+yO4ΞxiQ=|{)^{'7vv7Q~A^^~/zߋ/KR{#}E;kQ>js?X87P@?8`ߏO2?3?)~ʳJQi!*~ʳ}J)~ez(w;]ÌwN~tw3} 9/==Oߓ{>JƔ Qt~ H| $IG$I3 e_O0l?R?2H~~tWTze 8@GkLvN}|   />wp:/Pyr(F֐>@PA)A ?HA{pp|$їxO'O')'?II?Ϥ3g3gϴi?~B/ 8Ì/O.΁aO^+ρcvv0~aaaa7%Yaa=?*Oʕ?TiU@ô#AG?B?BAGGG #|&>?8pA>GX?;?P#{Gj@ GsG/\~w:?wߣv|Q~W-pqy<69euJ??{~߇1DfyYEIp=7YGrZT@î-5<P?D2tqC}+ܮRWps`Mt!c(1~T(~c7~c7~y&ob&jmh5a~Į[q̱^Xnq8]կ}KZd%_ $;hk3v^Rq7OhT>}x'?Nl/?Mwo:٧ x*̄g3ax;][+}A \䨾;*Ur2?j'f`=`,\Pɾq#d}w;Um+~Hzqmj87PډRBNeKM!DvA\.A5k3x?X/{_K_\.L?z55O;.IZ8N>p!\SKp*l@oZԼcSX()gR׼I׼IORƧV5djJcX<_ S2+ a|8P( ۫ZH:^֩?e^W{_s'/:?+'x;N乓GâN^N"ݓ57%(֏4iFӌL3f3͢W_mT??_48Cّf4Tx-Tk]Y{|o2+< x*l πg®B 6OCmDux"9 T?ӌ~%۽ȹsɱuiϙ11]k9_+O~Ge,,-`=:=Io܌~Ϭ\"GùEu[3fO|XEkwZױcEuGfGiv6mF̿K6`uyKm+޻@-=;_/:WsvQ}裰 řj~(PP}8Cq8}>X(>_?S6a*l 3a g< v]ᅰ_#6"+ڈ9J x>…P88Yq&W5σ]a= P\Vn69˳Ҷqqq/|5XEqJ.ʿ3 6bFWuq#7o͟4?i͟3~F+WXQ9i=Tp9GԸډěs_o|c\Ԏi7g7fEP~S;ƉGo)C(^ q7呿Ԏv֎~S;vXzb<&kG?oWuvFRBB~/~ѿ(߿(߿ùӹӹS{~~,,hG?3.mϸ= 7 >9t`#|zGOL.faj,׎_{v^:vĮtdБqj' ӉS'NNȣ~`';1ND>:tb~3_ zş#MEɳ ta %M ^uwta$Rw6?0?0?0ϯ r#?y'c⹰Ը4}ǝG7MG=X:bQaaQsx1;c[֯X<֟1<?M~$zc" S1fc|#y|[S?ԏ~u-l~O4?ݸnOFӍG!=h~tMR"b!MRPzGߢ2Ĥ&C'“//:,1~,.߅/-wըخ}o&vc'“9Pn>~n>^WMp|||(=y|k~?j3Oҗ]+[EBlكscg8'5''aaفؕ6P6o+?$̛O_WӟoG~C/$'|yYg7/tC%p[yY%]8L7Ujnlq̋\p9v9#g2W>Bz?@[g}xfҿ, $ן B.0ݸO⭇ϓ#lJ1Eu3kvW9|3_x2Fwv\ ??2a=KQU>|GQ=7;_||5{NTfaQV9A?&HmA|}S&:z~俜 {M&I^<^߃GƓ.Ԯn.(뢩*Xּ5Wzu?QGO_cn3G2P~'&u=B=Xʠga?@>,u7$bJUfί1UJaTY5 oVjY?qmX|`_Q~N s${>k^}[ﴺKC+iWwvebWϮ>;]s]G]+3j?HWtE-~w]]vε+8R_]}B{/?O >nM!~7ՍqK7vcQ7)w3EcwF?ٍL7b迺uC>؇ 9nn؅n}nȯў^!nnaԹO;]!jIIݑ_wӝugwz ={˃׃rW\lڭF[=|AL>-ymp&/ WFG("Py%~Zcg~q˟};^߹`_/y֨A}}LtkA/kr\JUJ@Ӭg?M =Y |)Uƫb㫔δ*[ؾE_{1|죴2N5Z2?'_qe[]T>O~bi+!';2^ߙ0( ?NnE#k؅; X-ڗ__Z~sy7?tؾ@ݟX"N Ls6=/o+O+@ +߲*l~O~ON{URR@(/)]N hص3J d8B~+WĞ$6'gln+cK*UgU¾mUJ?'-'nZm?cc_ 迍_<_z_^N;ѫѫYϿt -^S{~'{D+קb{2_fak=dmOƕ=i=aד]W+ǕJ_+iWR+U*]E?>Gs!^/2/*^̿EɿEͿ^ z1 ^c{az.{1֋y^̃be/bH!zU~B֧ *d^B֣ Y.d=B֣ Y.d=B֣ YW.d]k=B֓ YG.d\zr!Ʌ'Pʅo!zY:s~uB֕ Y?.dh!Ņ> [3`;ΰ+WoaZ*\Gۊ[Ⱥn!I }>M>Z.5UȺn!~qT\u]|[B֝,TQ뾅ZzxuhۣZ;*d=~Z-d]S,d~BE Y-duB2T:m!3-dv[>Bg (dyB Y-d?i!}T;?t֯2^>ojᣴԮ[eaQVa'}c~,+n[b 7]o^'σ9Q77&}:7vgwvs]@a!Foz3g<. "8Plzۼsحx;Gw (Gxw?K*5ݤQSR_qOo>ǭ𹱺n߉O}ڨsz3՛qo{O:bh~իٛ '*=wzhmLɸ&pC<, |8>qq?Qn|DW|5z~4S,ƿ3_C;0q5;>!kk:WZ1T?Z@5uu^N~(W#c'~o=X(K2.*E1U¨a׫/Ax}n\z,R&wAM\|a~#~{o}#io;!xg#;Pom)NN.>~ހߚ+j|k[snaF[Ӎu7Fwc#s&nb&OB7#wn73.fߍfo~~$yQO!~[zX~>Tk_?1Џz&~'J>OЏS?a ~c}?!c÷Rzm6S?x~zHOO靄$|Lw Z{7}ǐ@$=ܿy]C:o y=7:w{z7Ug.= 2A6yڃ{OQoXWD8p As~4Aػ]!|9՞#K_-3ĻclkR7~=&GK_<c&&x+Q>;N4q^!kBy!o(}(z}5Կ Sx.}?ߞ#j~h(09 krJ{^ P. 5{agwCaE~wX_{ӎ# P;% b}~)B9-,v 5ZyG{chGỡbQL>Mo|bULW1*&_䫘|bULW1*߆|yD^%C PB=P%C PB=RRQJ9J)G)(rRRQJ9J)G)(cr{Gߣ:;~yy=qgi_?=FO~?o4牌=M8c 1s 鎡_Ưchoc}chc+[b}McX7~w,XXecicic;v>yȱ,};~׹c:]VvXsz^CmE -+%1q.\=YVu2?Ge|7^\X-c] =xb622m,طؾWgEy22Χ}peKʨ2꧌)c~h21n-chm~hey\ Ǡ3zȷ !O({؟hh7~eEP`xf@ٷq;w6U}8/w>?⛜&ghr6&WD# Gs%(?Fq?,O~~h'C'$S~xן\Os}?+7>ugw c"D5Hxi"㥉tKhMI$Ow'Rv<$3-3gxoL}¸/{lk!{֏CRɜ0s&sdӉzn2߳N7B5h ܄ɼǞeo&31uɬ[Lfq2-Lfq2+`}&%u _1#~.o@1}2qp=uhɌ_&sNd8f2EL漈Ɍk&0y;KT]=P&ۺDLf?_+O5T}u+ߴJL ܝ:#PTȠo|)TF{ܟxQ c ;sqD\>V0?QA{_`=qczYA?ZkGT0ί+@eKO=ym+CTDchhhqIWV0\{ JZI"\z~5Jbs} lq$'+5ZL?UŬ-,,j~g1=3ϳ3߳}rS !5䫆|Ր_kx 5_kx޿/Kx޿/Kx޿/Kx޿/Kxkkkkkkk~W.J?_C? 7ߴM{[ {ue?}/J2?␏eWˢqi˰h8 =7߰ub0?=<)?Q>-2-rAWGCxr~%vx%^雅~{Wq} V͍tN\|XϋXVeiIX|]oZ}_&U4>MObhgFWa;7[ &a=`-ײN}ʕ ^IоQ`(|Q'%yCE}-[ԃE,,j\6vm6};Ѱ=vooc:_x~ϯu%i0~x~`,pC[WM=h۞i1q퓌M{? x9O r=45~࿀a`_Qcӟ ~xF~zU}m-1Mm1֘Pҝ3!6(k_mlHq#ߛPMcLw|/)$7M @)j]TT@邔$:)A\W"%tHWDs>x~_gΜ93;;[D;8[C"lK҃xvJ|0BNj:ny_"!iiso峍9eFl|Q>(m6g;v?ٮlx#轪E^tD; uLwxb_xMjbNOҭNd_;wѽGh2ݻ}{G{;35ˍ}T{߹t׿վDsiv=zua;;@ݿWr>{r۱ {G GzO{}GGzGx_}GzGz'n&9{ppKpKpT(IٗʾP5=TSGG:}W8߽wc:wcԇ /O'G@ I;݅uzwNqo@z/a`9y|(l >@ޏco[$$z*9J/Kwe ??]^oto೓QR7I{:•ioN㴷XpwDtpQGg(3i*3=`sy<{z~q=s; dg52~MY]zkz@ǫr\=_'/8 ﮂ^7$ﮄrߐP |4 i%Ay>hAy>hAA|JAy>sOA<bϋAy>hAJ8s I\'yN9iAyN9iAGA/9iAyN9iAyN9iAyN9^\NV5z^{Pk]w)׽SbAuab>]͋^~u'Ɨr常A o~.V}$/y?+v cȳ$B,س c+Xx7+BѻPk'Cj,0':_ -+[nW-ܫ\ZO?Pw ŪhM'NhIE'CG[=HB'BBخJW%+T(*Yx49kVp$oYC۶~O,o'a;֯i c~a?UQVO~$)>ѝ gb9w}uV$fy[ċQp_"7]$iEZ~ֈP{beHXp?i 7<iFRo b?WqPP임bNq;eQ!E~g4V=ݟf1|[]}_ҋ}K}i~i"iP}k]«x7ikO*d ##A!r_.Y~{t[?^C];֔#alaWO ÄJE;f?&^Q7wV`k+Q/xi[т-n]FemIk-z`R"̯eyK܋gU.Yw>7] Eom~5-~~~WnK]e=Rmφ`՞CrZ3y=U>Cv ceA).O]:ErUo*l0l'#.>Q2PoZ7*nhp]dH )'w["_w)qĪ=`ݩH>^7)Nr =Iq힦3&sLnOg[vJv䂻\뜏tÕ^weY^_yvW{Ŋ6v4WF{uU23S3KSs?)nrjr˵,;_@WRo5"5l*Nv]HktJ|_*ipwd'\\F1(m}m}M.]S?y|a-څ1߾A=dLe+5OGciOZg|Wƹr{<9`5֚e;B84xpUW&Zv&i)l}!Q!oWP0avjap_!9` Z杦PF S>坯|UM1=1\}hANTz(k='^ e8zO=Χ[mUn>UF 3^ \3˺e];Bw!p?Q2³?OKFx~|C=,+JR;)e Q}@25zXba { -ܳSh "a/]2/y$g-}kJɏ+wvSlG'˘n#YFnSFlU!=P"'36ʫ޹y,U~O>9xf qPuWm;˓Q> ^G(S ƟK|(,Tko衷n<^"[dBO~J.f)O+LFJS%EHW?]㕸;Y?vP<%Pb;ȝEhr{lyk1{ň&ݙdӍ.^{MS>hpj"R9?R{K義sPN>9etN"2_8#'k>9{>g/'![| p" $ftoJEm7AHb~&([1rߩ|PMZW\bL׺ p}`\. Xg0`#/g0Y½ J\7n Xߑk1=HuTL> p=zHwn\,g(Na0!/{ȼa_%?#<7\op:"@(ĺ uA\ppXOPso)pğ{`*\S{da^{J,;p`ac_J.Sb>{<'G#h*_A<&>1 nyy'yER$[qzÿKy8Sy!}\:7 翱nzUv< >D>L#&WkȵV)G#cy =['}k] qw￳Rͳ1.K\B d *`ap(KR+ܒR"}R ` )z ~nk\_֫\D؃{k]]݅ߤ+K3vdm yWX8#,=oFW>~p9Y)e^G )[l s&f:G]O\ ;{: h-n.ccd-֙ ʻ餬߶rj)y@y*y0Zg!i֛Jc Z03.5_źAr$6( ~;O^EEk}}O892D"r}]dC+ٍ\=FMV%#H9Izo{MSTN&'?8f6+J-\/m ޜO ;>Jg{䧅HM!t!4g>xEHW^~.B#EH+s=VQ|Ax]H7)t!߃~zLiķ2  6^#Q~^w`My%6e~QI2gS+з2W]f _J\ )ޔQ?$^[쿸+{7^6S^^xbpV1'*_e2\9ŽmF;^8y0F팤=\smh/eNͪABN?V?Ye>pU_rSP]#q? ]Rrvpn=wF VBBpp][ؗ r?.q'-hr ޤ[UeH蟉x Pk-Rb_%(߭+|~t엿Sf00WXIMyXsin|c:3_ܧ1 JܫW} a=ٍ|(4 =` fgsXMS'ĠB cC bbbZWk%@,'ty^;0I878g9nE` ʹO^o~yp Pp~i:$`2`2|.~p;nf)L,(!p#'htn_w/p]8n{ВU*RN % UӅٚNGBYO e[,O,> +>o8Ub_e֧22r%V6bZ+CϛR-s} Yn_ vE ?V®XAXwG{-tI9mQ,E= %lIy2g%oQmnY϶!Ek[2X*rS[}7 R_iBwqɡH;u(79dHcyPp| ' i;m'cpPkGK0K}vs84*ZEKo~^B?L)P3?9'zY.^ +o W]MW0C(`2gH̟QQ#%s<>Ϭ q^3$$R/ag~1w,yN}`gpn磞 U}ꕏz3X8~}DZP}IԷ Oq; Λ|at!?YGF)qN]'$|;~;HKJ譏z+r3xnQ%BoO7[Vg>+g]H;v0$zjQQQ]^r1x.w]Q}1ǰ1 G.vgpۯ5XG ֣[~{ 55X5؏n=㕐M֯&~JM5P2L }iUMʧ&XMCMyLa!‹ >Oٮzkcr6/Ĺ^ch援*.? ?lrWe߰JwrS.~O;iÅ8.KP9~{]^7~~~JՕ??dz~_fGL1)WPo?Ƿ[ʑwkb)q:O=q3q8ęRO<(O9n9ěeP%P' HR ,Q>Kr%%P/  Z" x nhG_8fK g8?&p]@;ØYB _*'P~9C $Pouz$&%6wibWP .Z[3n:ԧ:ԏ:|.v]c]YM*t?%_e2s>KsH>0|p(s0udSg}cLw,'9#Lbh Hr2X'3SdFzwf_ZXa0ye9o !hpHlWJY%M$V!*D75SZ=_c΁9<2imv y|XxN]Lchhh(4#v&cF;y0`4åqKq\qKH|Fyq~j`w Lhi_3Ւ0¬hS L |+'F]H zR?:G19߆9HeCʻ!ݐnS148kHy[Wy!WR^ iy!ߐwI^CXF[hn5jD;ՈvT#)a\{Ϳq ׄ By F(MhOP^u4߄Ԅ߄o(^n&<)qiw2MM'=kuJSc75;ߺ34]:ۙvb]Os \ ];{U] #ޯÑ؍tt{:I٩m:C:ǃpWܧ)t'H/%.F|? %m\3q=׌rj\3qܕo[s<4s92WoZq\2{ӻ #g=>n(V\O:_Uknf:5׵`y Cd{_|ϗa^+2x^ WdB<\a EJq;ȯ WJ9.(a?Ľ Cˇ!*_%y)|n&)x3r  )q"/ _HK8Lz*sNXW +<'e |n+ Gg<Փ2x e|y*22gNRDR|SN> 9 󤬓2ܗR3̸W"W)r^l7% 7fоfp-A^ȋ|7$*F})q{+oo9-XĹZ3xޔaBI̋\fp4[n^Wm oikVZ& }ʹ-#w׏<@;̃t?o4=4 qC2e!r\?lN~L;l2;ݎs;io轗 Gmu{wҞE'`r;܇^G;K H+9q9Ni%, *|*§|sOU;cs>o7h;7#KɟȟNrw8fV]¥ϛdpF ޒ:~/QO_2ك<.low1.& $_64MM҈ p5]O0WT=zͧ=پe~ePcmK7\UwSCǝgk֨5m}i{̣~V?'nVٟ`:hmJ>ϛ76ASD}L}#*J:ݛMZ!E1t]2G?p[O Dx M?XXnA"z 3 ee} j}-1՞U9fM$zop wrXN{yfxe6r;C%ȃ!W0YN!~1&ܬrz{Ƚ>+ygǻ{}!’N7Ce?}ӛW"O=œH'(K4ǝOnj~s\ydKw9s٦vs<ù挮1)[Y#R77>[8ydzw)©Ӕg={ {LT2$-d> ~!-d 7%D؍ҞEE&VRNSKX^ +ay%,S?5$bSE݋ 8nV* %gm7[0uFUp{AY;rb0>rrgr?:Sx9Y)0-π@Ji!(GV-|,٨_9|\YF>{E(i<>U;}2<줬ݷ8+M\"a"WnK -{|oo|q+)`jrbT&}Q~BaV/D?Zʶ1|\ye h؁&d3yG;% .W6בQ/؊x pI>T#~xj&wIụlG&OxXLHdll+fjٔ$y0o_Uni9MݨLdکٮ?RzGG'3lvнԌTvp; ݿн2IܱcI}v$.=8v9e7#vc|q햄a;n/׬'\e{$>gĽU:/"xd*IIwso AY'X!br%J{q̹)ѹd9r G=51%+7M ?N7U FzܜS7F"ޣ''X?'8.N0 ?ڣKL2[yByaU^P^8iwS!YLeϰ_ϘpӯyC)dM*9B[ 3V4Ά{y||lG>Bfj6Fa&ӄL#1]L#]g~zv9Ϲ\9sx;q~/p{]X 3..2EW2<;ݽ& L'M2#a$OVV]4S$EˋV}g|Dy]2eMЫ}ɜWxe~gpw\xWL=+&>cE'bފU+ܟb6C#dIWMwդ VWc;cUA/]5 q`b [xRUS!>$kbyh' 4S\T1]dU2#u`Ty4Hy rX5ߨ_[o#sk5ӁD]3OD_F}zck~p>N=qx|\7) hnQa,? _d>7MG7MWrS0<L oo6&qtӴK[{rS( 3BPP{PtDLA7qw] 8 8p11̎0څ0{,'3ASoQnpn>[no& g*hh7$ۑ5ȿ_}_r*1ʌW^Ek{>Y)T(ylfy6nS6M=};Xv-- u'w2]b] jkUf$`8z 95LfpDž<),ْ#<7y=|~SY2YH+ҾlK&`2B4xa~ٔi(_qc??7q裞V[\-Ic(=ƍ~C6J!w !=^[Qc(rc(=rc(vʥ]]Y.UִqnY~]X;۱~~m^qdwr!'Rmި[~P{ˉc>qLtԫx?~XYjj1k1Z̯ji=jh;k3~mƯ6]N`O`O`Ưc:ى||||||||L@HDv!_&_!_%ȁ$7Ro[oq<9&r8K G1Xr9@Ev~zȮ r t_b78Bf_%8E }0EUp}#nuuM:\:1uuLߺu9?r1^=ƫg7y4Nnw'N/$'s]=D%ۏhda2X2-,l7Sy$UD]ߥ(hv4?[}AO}σ0 ! +*XnMr(4O=OfI198͝?$lq!p˓!y< l|'l4d}wxϹlׇ@sًAȡ@Ckj/yPuxsAgF:m$ݮIƒ~7v7v7v7v7v7v7v7v7v7v7v7v7v7 k:k:k:i:h:e:e:d:d:dk@t;a'i'iiiiim=y~HSsۃ*ۣIةO)K S kaKN"#'Sȩ4}r:9'gdYHr.9vdCad9%G#Qr,9% [$=r2OBZPZ\z؂z؂z ꣤' lA=x$zۂzۂz+@譸A譸Ao ------8ϷT}kikI=mztIh[o3 +ǪimOlm}6hM}D g~N?g?2/ oj}ph 67phy-іhkm6Oz^>x0 C:OGGw +k1L8gɞdMe'R@ȧ) +[ :JIII;\?iAV!IrS!l[ T9>x1s<=oRvfΌי^`ߋ"x/1K%{G.lBywR9/IXy^ξ^a}^a}^v8te= nL׍uc~ߝD_cטuu'd׋z^7f>ׇeח1^?׏яӽto0];6?l7:K~Gf'ku|]GV[ƍėb 1z<&')dk8NFǧ% q.הXb9ٞnzo3La|E{I9e+],?!~Zg=Cڎl;$Co(PT{sX+^i࿊<zI8g8:|S.)\9rJ>z汞yZ<+~_C>G0>'FwAqpyq;;匡gĀ#X7koBl|g9ٟ)3O9ӎg<&-_EyEyL=DJ Ɵm_0 &.]w۽w?]&1$&ٛ4|}Y߳'߳'=tuk2>&3d>Od{K|b/GFG ڛӸx>SDŁj3tƛxoͰ{k;οު}4LtÍ|fxcWͦgK@Կ㮀 퀆]~(k"{ QdG.b=hid9v=e71<ƛq97mp'y܊#1^ۧ3q/` -` 淀,d,d> B泐,d> B泐|d/G1ӽ[d$ȞHEOud Yb?ؽTo>~J}YxXك/>[fzRv6 }ZjsS@7u,uqt=@/k/Mr'7ڿv`iWء {$~Y3W2ߕnzw%?YI{t%Ug=A~,VnvmZ?}?4O={jlo;7ݟ<@r;ǁȉdRҭRvB9=>{=&{'݅D=v]p,9zw7|LAI}oxۻu>ۧ~}>@YV?`_uAd?dǪrs jW{}M=^vhOL]ۥ\rSN;zkc1y1gs̵zzvL(vw{w;g>Ǚqs9iO7iWifg؏g>ߝa>gKFJ,ӝ}9Kd!_=+W}ʯ.?aXυ)ʟS砜(1g{S1%SBY}gͣ>O1dZIsPOrm9q;sRy;oǩ>wv:^..p~s vZ2Οy|.x"ϡ/2˿t4%;dw /k/N/yY_ݺ+|@ 5\ 5\Cɹk\]<+E=RA0D.hO۫4ߜ2 o7k80E]0SYvO{a`2yٔ1jrk}pTv[k]re2 ` `MdMdv?'<qHqf5ǹ@" LW|+8o8ok3;) q k9Y2y_Ӈ:3Ig5ԁ] ug aB/aRU;% u`B))GS#΄9ڞ0z@/ÝW?9 )N+_R~~xUbL_^zu`ϼC:aa`UCV'[E˴?-k9oj)'gƁH8$k35p_ 8j`;VWq^r8HSTa>w1]NAxw1nƿu7n쯪_2aUsMG?###&???Qi$S39Q_Q_D9=QwQNW)QQQQQQR 彁((Sq{ RW⸍⸍⸍rN9?g/򱿢"S4y4y5g v0Tc?Vw^_ng՝/b@U|j:I'cNV2ujuju ar}i'S㧝;hgN-)WGO8^8g=EZnsZZ /SmDh{qSsx(yDu:/e9uY~]:yL,SFVxI_q=']Ktߔ`=H}J>%9okI֍I';jy'$3+ʼnK;չ=W5NW$/7HsC%45M4?o@{ۀo ЙJb<5dx#78mqڈic1ۘ4f> ~`7q.m`_ CY",T{/2ߦoJ}N~ Nw:؎f̯jڍ oLߜ;!l}3!\H%k{\ͯtb$2L#ǫ'I7-gҩ~D.%WCAK-+yؠkopV/--?-Q`9~gKǣ{ e^j y/גPKC-eFޛk~o儩Z9ʤHCڤsR?'79uP/8ā*aۖ밶Zt?,?h}< K^)8/}|tJ4YY0aY;Uly x;c{9wj۱S$c9؟kl"?INiN$qOs;whgS_EPww/BHG)頠?cxT!* -4I(b`~߿י933{{OŖ8[/Bĉ0GĉPD(WJ<_)+|/G켣9b{{% V6P P Ps}eN=~?O=;=z5pk1=]:Az`?J<O;g~ޱ><~JqvBޗNP_c/:f[z<GȩSиߤg}W}W}W3Aӝ]ҹn;v?6Scc'So:tǦoJg$[8ݏMg)݇Mg}tJJ~*ݱB*U:td{ү=Ӟ{Oơ'ܓx}Ye3( z3Dǽ^S/3^Ћur/'E;/zSooތSogoR_o~胞>\Gpu׉>\'pu׉>\':'t-:?ᾎ=7я퇮~deyJ㶿׼oqO;Kƥ?ҟvw;&9!8?qE_E?$Ak@=gL 3H}G(O&$\S$,LUl}x{g1׭bt;z\oxZ<s/vR)xVNFkcjnX y,o2q~~ ]o979o9|[?u _b>G={~i>1|Oqmߺ^S*&JW5qeVخpp͞иM2p*Z"Pz\3rc8l(y|>O4wBq< |nihep'w=p/ _+hN89h3Ja8:*FwFw74~;L0{/y!7Ja8o Oq`iܕ|p?5`| {~(c8c%}|k)golKC<1|Xgyd>K㮤u[ҍqc۸:K4hO%W?|cAMYm|yhz]d&:n>rMҍž)gbEʼ([j-gƮa9KяF[$ ]hK籅{ /72r!rBǾ'B' xBE_DE_mwrνuos@K?Ǿ\˜Cj/#9rKR][y} c+_V8_B;Wp ~V7+)RF^:jB(׋R: ׋R_+׋R\/J6i `{;Nnx ]}~|> u^}EsWo|ޡ|Wl6V@+y@?KG^I"W9tߺUe"92/(kԜլVsΓohZ4mhVGҟ9Ė~\q8M^WXZuukJkY/e_֙oe?,ZOqw;;m"ݵ1>^+q8 e2 <\G;֡֡礞z~7[ffо_ޱ o)irX&6ލp #1?ѧ;`eW4vbtkhhgA\y|,8XMgzw .].."n2.f2.br=b e|9,_YeW(]\ow{. z*S(]NJ2oK=Y\7wns7~M?wӏ=Գ>fγ=w}=R~/:50eM_nqFrzNP|{xK2.{oZ{AwUrY}2./"q3O_ӯ~u?~-rⳜ,'>ˉrⳜ,wj&]z,Nˉrⴜ8-'Nˉrⴜ8-'Nrⴜ8-'Nˉrⴜ8-'Nˉrⴜ8-'Nˉrⴜ8=@? >8i/Arx9kq:@ n7qs9@ n7qsAg}o\Oh!ҿ ҿ_џ~ôK{=t2+7 ;Btzx}֯GhG~]u>>}r5te}hGq(ãQs|IֹU:-&7q.:&u9tIbaaӞgj5h~='vI**~ה\;U?~9s}9):Nu60@Sa-2#|dUU'vz.!3q $Y;n4R6=Fjy]?^; ~v>8;$YqsΘJs*-3rnʧ«9 +ؿ9?Ώjb韗K}/?}xٮpy: x9pxޚskXv0abR^۱mO}o_lKub}Nғ^?x "+5WYW׸vݼƵ2e>k]_|&RN/pm^)'PQ\?*WiVuи\jծ>/@=8z%ߥz\qs;AUA]gTǮN/k׏zgpkYU=s5y- 8IyĿGD3]yE`mXօ`}6FF`jFW#iOc1q՘jL\5&WoЄ6q&nq}׆F{Cw9S3'g7ƃwj}&S)Njqoh0n1/ b܊|ݾѾ R qѸ!~bX{.܍x#`\WWhq뾠qMW,!9G?1~qq)Sē nLpӠ I":9曾D+JNr$%Q.lF;i4sD^5w֛}Iuނ}GfH8kA~K-9~KD_N:IO O'>1EIi'˼/to }KkVx؇Xbex)ا[+׾SʵBO+BO+BO+BO+BO+w[LfE_+Y`4 ۚ~kˁJN{kFkFkFkFkFktFwktFwk׾NFg2:љdt&3LFg2:љdt&3}KF_2Ɵ6nBMvޛ22EY] [jA;(wp|[Ƶ-ۺ}t\2m-ӖqhK}wRϝrwRN݉t{H_bbGĽU$ۓ)U,aװ o 5#Qf#\g4:ԎlG;ڡڡڡڡި4}}vlN)/:ۡ:]չ%RmkG{G{G{G{G{G{Gw{tGw{tGw{t'^ڣ;:;:;:;:;:;:;:;:;:;.Yͧut/$?:2tdё#GG揎?:2tdё#GGo@摎#G:2tBg'ىDv?;џNg'ىDv?;џNg'ى}w3?p7w3?={\ogǝ]wv3tl?@4Hl\ifX8^70rpW`r{V=,,RO4 f4 ǞgV+VW,ށrD`e:@ cE% ?֪%, VN S0P \ȱF7+#+HUn\x/Ek;+uͯre`ruTYөع`uCCCRSZM<ʷ~i \,̌^bp_"S-}BfiSy96oϞ)<,ai܋UQ),l9s S-0|x{vCab{`q{ |> _c?$ɫv=WEOZ3|;&Sx0wm Ka>Ka>Ka>Ka>Kq6000000000I|&\`,y,y,y+**)))=SK)ERR8R۳<K&&%%%xI%>RT#T֛K*J/K*J/K*J/K*J/K*J/K*qJ'I*qJ'I*qJ'I*qJ'I*qJ'I*qJ'ST%xI%^RT%xI%^RT%xI%^RT%xI%^RT%xI#N҈4!xH#҈4!xH#҈4!xH#҈4!xH#҈4!xH#҈4!xH#҈4!xH#҈4!xH#҈4!xH#҈4!xH#҈4!xH#҈4 8H#҈4 8H#҈4 8H#҈4 8H#҈4 8H#^r/%~/}ɍ% "NBI8 '!$Dq"NBI8 '!$Dq"NBI8 '!$Dq"NBI8 '!$Dq"NBI8 '!$Dq"NBI8 '!$Dq"NBI8 '!$Dq"NBI8 '!$Dq"Nҹ+-Eʒy,Y[wreezmY7 =k'd2ȗ7Ό:]hq(UBB?nnoa [U/¨^GY#vػHV0ӱ@iqx\c@/=*wV\[ a/(뗉{'1"򋔯V+3wށa}ʍ( ͱ$t*|x}3pTʬ@-Z\rnV2i.[c߱ƍ?%΅&%_&BI?Wf{XYt/s>}L+?{+烔;1弐o_& 8 P$,|^n>˵W{߽q70KᛁWF+O՚X|+Hy-g ?U=|?Xv}q<Tg_qMly~k痟Q ˝hrs75NQ{mVڹ;ow}Ư~_wfy>p>m>m>m>gs~eՈ S-@_/_ ^ nAPBB /? +x(CPcIt="ø2}$c+NW>_Wk4N_syn[YzFN_y89q[CgU(KxCyMh8Ǟc'h)lRs|П5Ę#9u7+vxK/$ܞGӨ4LEp^oGTؕcܘo(nMDXb GruF{~ ?=sp{qKdQr~(Jû[<(If>ʿnleXtM@Ӊksk ()>ǸUcz g,e]4Xk8ƻբv\3&{ m2}6|+B{_0b(FD{"=DLrkOr'8}r?W5UW], Wv =c伞u僬'qU̼Q̼QFKȟo݂?O%}HFtҧ> }3Iɼ=y{&~3y\2omR,e;L;zf&o&sH={.~sIHy<מc.3v KG|aneMY_(7661 dqe]<ϝ_Ģ"~ -} йyoyS_aN2#)Kl%|2 M+(E*WHP֪bgB8SG)o+A=ՕEnxRRaŤ_PVmvG#,ibfww^;;;;~~)UYqƭM[='YÊxb-vG[o o of|K]Kе]Kе]Kе]Kе]KѪk)ZeZeZeXeXeXeX8ձ݋c9:Eǻx]7?,C'S84pS,]w.zE]xջ+KwzK[R])EO)zJSR==wy=г=+ѳ=+ѳ+ѱ+ѱ+ѱ+ѱ Ic:VUXXX *U2{Ȳr{5W{5W{5Ww z׸%w z׸UEZEZkѱkѱkѱ[;E0>z֡gz֡g:dk?2#Y[u[u[u['B#}޿~~?> V)]x}Ax{KLuCѱޝ~ZVYO?m6O o?3_ k@m@k#:7UFtnt+܄M܄MۄM؄M؄MĸmBftlvgVoFtlAtlAtlAtlAtlAtlAVJ[QoZ )7)vg_a^|B[neݻ][.me>iqZ2M$]W'[r}~ ;XzyªYY%5 O97,c?vhLV8Fo#޶o~2䚟{aL)4 :>qOѱѱNm'Ovy;㼝qێێOX}OkTקہہ;8vwt@tPa~|=M׮okXql{7n2k??}oI]|4¸ R~W=qJMMk WE_87 {werU|9~RaaKط* *Fz+KMW2~m|ܜ\a\k< _`8cNĉg̃.5g/r{^k̃.5g/r@b1铄bz*cQc*DW©p̉rNċpy$< 91=Z}< XIx+ skW;+1֎6փah8RZI7&BG[_ǽ=ZEv(ehuveM}poyk={WOpW$;Or|$;{Ne0.h;Eh)=EW(Oӿi4{=MOs4;M?Oӏii4x~,Y߳O;%-m|ޤS>ss-xy><\vW+ӟ^ =/ýjmU~':(fLpK<" j#&y|?H$|uDAzG@ y^ Z׺|ZUD$~B=-+ EV43?hOQM:nQ^x1MQ^e!OQޔx4o}ʵkc]uhֿuŖ-ǯG}qR+Uj{ _C5$g n 9e{M}ўo}#M7yoy-TEGBG;MHoOnŨtRA%J0^5ɷ|طJz>{֏cr o8gŖPӱީs>lG;h_Igg+n6~984+/x[q?vy O3[CEhwG(<[?yu~[su#8o|eY_-ka}eg[q/6~ ^YEB{x,|i>͊b{g3>Z6γH=r)[{hŖƳNVRh﵎6x3.K<gQqK;jW-3IJ%2N_"Jb>I\T7ļ DNeml;nLbK7wIě-nľB$ϾW%QqD %$ڟD$1IG3w6*gxṪYB8gs94~_Ybgd?(x8ysG{D~ï~nx7{ "x7{߇P>H6~vp`>]dnD+o{|҄NQoM v7C9ʶ 6}ԎO8r VzW~~$lY?e󪗕L}[0`i<,!$*Tܚoo=ؘ{֫h~~y9/y>W罨fF{{+W^Enf4_7u43_7;~ݽ͌P^fF_ ~)aK73_ ~z__נRK~jx{ﯫW{~ŻF_a @e_2E|7ȷ{/}>|O(s\[\﹊-s\=Wa̯Cvʮa#M{_zW3<7{r>x )QF[e<{t9x|-3<{^/v᳦3>~؃/x 9x/xm %3;\Żc|6^./ F;6q["`~thmu]gd}+5>} /=&HoྟL>=~Y*=C λABIz&hYg៍{Erϥ\#=zБǥ㟏>&}CB>yjKü_Ox՛W_c~|۪Qz{د{p{<A#8Gx=/C0ˬ,<¯~B_Z9SG<{4Yfs$^Fޑ^r~{#}}D^Ht;'n|m |y oo[@~#l=y|hth~G=mz%]tJў[PʍƱ]2aaa={Dؓ'a3+:$]Ϻ_sHk+&>)S7JT4Wgii޷wؚ8`s{—< GO•\4M~olӼĚF}I3OsxL3LI7B9yk99%^L4Ӹ.-׃tmgMqݨ4t]יƅpCuc?fx-j-gx'38LQߙ̛GԞfME;qB>)qޤ9sz/ ~WDsRN9/3\ůO'~eʨJ w9".:;ٙaasl.\o'wõOEsi3>mvm\f޽eVqbAqK'7׳ŸE<8|˻IpgŞ=0>Amhq^+ҮysySҍg!.`Z@/,=Z/N ˩o-m{@k wA/F~%0?ǭ<9S㷀Y,qZtyoL ?_?[m9Uy&b%/?xE-oKRej/^=rw~{ +']qK/%=y{qyP$|IaLk߿RJ?>6d]8\]q_ѳJG+YdWs7Lc$cV*Unvo5ڛh7>j]M&NWsԻzp<[j1kX_95h[ew5a]_ṡ5k[5>ֲ{IF}}fF{~}W׾O WKO{gχ:>DLJ̇z@>u8FΓzt\O=Tz 9JzU(YBg6og/|5V]߈F7;&꿉vl6yƗ!w}qD7qL^(cJJ}YmR~vvk3fe.LoA/Jk 㻅t9tl+?YX쥩k F6?{;m'?)|U *[xG9¶ .lVg sg Vݩwxpg;9}VlePe*S}2CqPe܇*ң>(c_Z}2⨌˸_T}2Kv?7/,q.cXq_F~PH;YCo٘W88<}].qQpØ_Oa?i_C`S#dM㕥qLc\aװ#>Ǿ#ϸ#x >Ph|`j\8.{%T;g[ os3ϼUGx1PoLc^ wj}.n-1;oXZ(cYL+}^_=>_`|`\ul+8jCy)zSa=J EnXlc>KKG#WW>ϯ{c_ѮhW++5ՏRQfސ3ȅ=e1~*[8K ˛M$l4-Aס·ܘ1V.I9 bת%Ӎ-}o77~{6f#vg]c\gkmc̳ǼNLaװ:/ϫo m-~Uo===s^/{Hx,2 n|<8HrITxUqOvJpKBeAʮaM/*o.SؼexF'l>W/鸲jķyodmC75V3֘Y$̈vKLg}lX y;~s?Mog 'o?a Sgkj>Gc7߰?/|QFq4'V̓/9=(-t+N5pLu s^ОW 2~B< F__bmyzU_Y)xՃvߥz\Z]pUԫ¼_M37Gt6ޫ_|a˾Mk|~naꚾ)aƯmgPoISǦZ~\E'hE>^D"V<#[>^d7 Ƞ=WđcTp8Qo87pv#=N=NmS89NXB;ӫ¹-Ǚ;_a0%lIz7I=||6]hg_ סf^R <}=Lom+z-$<O3gxVi]/ӯnww:*m[OA{m[/h^ JJ~wo|?B>LiZ_JJJJhPX"8z&(m+Űz&cOӔt?+ e+ ϴ][v֏a(n2MAx e'We*m*pt ھS1冈ޤx87+Oaz7#ru>^Lóy I_6\ eyVrw=37[?ʾ^bg9(F9幕z)+X9/J~عc(7"ߤiEFORTIfϚdӮXX1iY{WyS{*I+I_&C[=67IN~^Fwe S_+$UVMflKi eQ?Xו\~h뇆\orkR~^>kl ֪8*KXׇ7X )mzox+' Ü ~IY8~ ":)Gܭq27ڰZ䵹gBAB;ma5cʷ,8?jI./ '`P+?]Q-XGY3'墨,}8+dqbbb?VlW",>ʯR Ҹ OEn.e/ǞUE6pxԥ1p:|5j,;LrxL NոNdL"^dݟ/'}dFIv$|?r͸?/)bd֌yp߯ [ܛa inS%r\o57NS&Ĵ#l }c_o1Ӣ{tL*7E,ᶈVd8KY,-lʶ>٦o\f_WXo,+ :^y?QЃ["*1aagoZ`nV[o P6Vjn|SɌ{r:8缏dd0{ dɌ}}/UT"TJ(>Zi~=q۹,jS/ōgM:n1Bǜ2O.u<[ _ƑHw*}k>&7^/iȈ5Lulnl-H͡t_.6}4/M# 0f8g>bn 0Bom,rrq/ôI^1&<"eh+\waHck{=^a=_Kmxk$6r FYjØҽv[Ϥ{厷GӍ"ya'x엎L.sK~«:0QK~/Y:տEgvJn-= ƻ#btܛ01[~/{ҽ.PK~/ct엎ұ_:K~/{# wDto;D= sՍ.aŮ. bL`-f8^ 5{Y:נqcQv,ocAܗ4`9{r]aW Ou ʮ :® :® :G/wnYBGJT-R~xs=޳pkmq{i|ǛK,K /s={}򎲋l( .wG 4; N`4; N֞S%~pN5q/]l{Fnv{>/kdc*_-9W΍[gzB!wB{!w~n3PvI3~0HBcy]22K\Fh222" 쑁=2qb;g uv2 o03P `;g 쑁=2P9 }CiPڑ3'~3}0=x4AtlPaG2C}r g.d]ɺ yqz!=gp=b bSLv2Q0 fp  Nϙ9=gi~w?v CØy}nyiLpf<[ZAVČs炌 3xK~f/Y-,/'R1Y^[dya2b///-635/f1/f1/f1/Z:X̯𳬰];v~gY=͟ﲘﲼnAwYwYwYwYwYwYwYwYwYwYwYwY$Gڬvosa~#n=1C..%Xx+0Q>'X:O6i5{dcl쓍fٌ'dclpvfB'dcl쓍}O6>'dclrl#&ۺ#ɶ08>{ލ-PhE0·h8P6Fh9uhuGy4h=:Cu4hoWG{ l7Npp|Ѝ_G3f|1k C{О}IJz>Y~l&86*y,Xq{ڮ-F^JBܱEJnqoKw޳ժ0_|xl &Ns<8cʛx&q ac_W2ۖRvkakUQ7bLT=;d)"'/hww:i^|qC||מX{%֞?'kz j+nE^7/mtkݨvr|걍JFgcb^s =z>ͨY:qa9s)g.3o֙0Noՙ(k=r^s\o\\oLu^g\]j||JԺ+ <=Es<Əy&m߾%☘'~?/7l?]w|wrCN/N/ҽC ƃ7sY{z{k9Q}ǻ{>z\}ўC޲CE~#=OX+=+}~o/B.>(KxE6?|ľ0>H~{Óį,.ljq~ӯ^?ŋ:hz?̺;GzaYgf}aF[gL>v?{$ ?>'}y#^$ u&?ԝS3zkwL;9VwO{tp3#0c6?_'[r!&q|9\q([%/tlr.Ouħ#> _ y}^G=o(>鿣3}Fϼo~ϼ;yDoh9 2;qdy:sw{165{Q>r+T:8?NSo=N=S8縧|3~A_0~/ _2> HR{Ɠ?mvW~K&k;Us ߞy7NѮS5x+P?Ÿwq)7b;vvOE3 ?s8CC&X}p?asӹs:{zs{GRG;nΏ< {_HWW,@w|YqIȟ3<3뮟T1?!F{K=~97-\W+5∵bVPj_iWڿW-MJӮҴ4(ՎҴΩe+@WtJ_2E,*zWW<;_c)?_cQ펥ݖNx $TM||/"ηpyE[[|cx[[ޏ,oǍZ>Kk/ ǽ_9}7ꈯq5\8x_2YͯqQ9d?u9_. jSo \X?QEz.RjWS4'_'Ucb?bj]q]~cēO,^z\8zŲSldQ~b^19/vc9=̯L.Ybf3,^,oe_f\&'mR~ֵQ_( ܸJg)}yNyev<_| ر;e$Ϫ JI̫I~a51&Y&IW^'Tq-`KʱEJk6-lۓcގ:^[*3MW++U^1} Rx8 w|q\N <bex3TwC=OM@oMbHy#-xl/']൥Y~'_ei0:#"y"S&DZZI~g_эGl>L߈I~zImq6'?Fl֏֏>~ďu i0iraḼ~ׯn_nEK˼2Do ?jݛuZ3iF9(V[9(5~yךZ3Anٳ-m܅#;0.unhH|G_~;:NHn~m܏L|gיqd+3.a< k9WאBryW?kO kQTqo7-^lgήogWnP/bx[,Y AI&C[غdW_xc-;ֳ&ֵ_ܛh[k75rkd[Zzqw{-\ ;­p}տخnqzþ[m5メnޮWatBP[R[ ՟;K/ue޳pQ㛅rߴ++r4l|3Yܛ`\W?mו&&}{&:5wޭW?cg_ܿʼ,-aǕydqa[Z=Dװģ%l=l u7)_ͻ|wk7OMQn_]0y̝]aԎqƃ /8RZo|,Gw.Ew"]NNNN~vu׃un=|?Y,ɢكuMNws_?{xnq/'\/?pr/{ߛ>~y'!/};iW՟v=iGlO{>?>77?>>>h ura9g\L?6n >OiI:iQK+$4@4gQ48Q4?zlQz[-FXߥNcUuOF678':AȃejA`!smo◎kċ)< u!~dVIPz? a9a'eLCbdQ¼6uKř>C dgz ӕ0 CBZ(֟s*꾉ɢ2YX~L죇"E/CiO&ᙄg~?3^ 0{8j3 CX/a{1ܯ3@uN8hb;_FGj5SD=W3=T}G.Qẩ8i1+zYOYgfb40a|$Z 5^'&,1w a<뎥<ޯxa~' .D{؜B{MOp=];s[.`l#n(*S ".+Uk9Vxzui徫S}W+OY~Qru1|7";Fd=i2~(y_GU^L~_MŞSTd?Nܩ Si4`1nO#4iWO|꟏G>G>G>E>~?C>?c|읏~toӃ! ?~43^)8Qz7Bo_#Y)9p!\ Z3?f%kIx~SE 0hkBs3ZpmTW7n3x5_lv4Y]g`Web?{_~ڢSO-f?-[uc_/YT%~T"ܭCǡĿ3w ^/ ++KiR_\pqbBQ Y7e쇗7_}eizZek9o9o9o9V~^?+Gq&_@c_9Uk^_{\\qf_}G"yh~f4?[IV?W8yv0~ą&|5ܷ_K~sOky/fvY):߸7;~?\ Dq}1a_?Ylo%nYM-.qkQyny7Jٿ[xZ>q`;?#L/u:>xɏ!o@&?N9'GOЏpObקBO;kz)?ƎOS3gvHٮl<߈Y=,zoYXrLegyo9&|Kd(nb7맛HoZyy;yƯK3늺?;λ`7+r~!0l-;[x.[x.[x.[ϰm[/m n_굝7o&zyuvEysGہ7q /ߝ\wy w|n'a=].?'8dQ]evž҉s=vo'w~.ڹ.rf]si+~dQvsYwC kM=~[gNjz9̫Uw_jOBUg{}vWy^ܵ5/q5ҽNI:^'K?ً=xß7M&ޤ]oos:oQ[s׿ 껫(--}~¿[Ƌ/Sד>/g&nzor^Z ?Gaѕo16^l[VpAEqn%Q>|ε'-!/vwY:q|xĽ_kʋϹyx~s{>_9;}rὒw!AЯA$A}?']ҿK!/7?%{Cs"?WQ򶈽_PO,g B?,?`@'`HR`9rUY*G%jO*[VԼSļSD-"f^*zqP%)o ^]Yl,"ƽ0]r/KE{'wZzg?|i13A|Z}P㐨̬Qܢy(?E}/`׷EV'u]G|V>(\7ytx[/rI,x{^oDfm?]WqMq`OpQ-qҋ'"sp{^oM9gIt={gC?d##E]QeϺ3f\zcᚢw?a;'yxyXi%#l,vGG*i8=;B-c##0^#GS{=E 3qcs?g|ܿlj?/%O/ .I$9}NbO/P!N_5rhcV^1{&ڿ}skh{:LDd2Kk(;=qv=|z =NӾ $v,J?=SpRV_-^"7ѾZ߄IPsv΀*|]8_׳9ȹ-P{^^ua*7idZ=aBِߢon^_7Ҧoяu ~u>q;a9}W yhĂёƷ5st.9]=QΑ;_~/?|^Sܸ=r==wuΏ~7wo#'P$CG53[>~yw+c;O=S<<·q3ϟNC2;Nv=\`s/ GX/^M-Nos.0] .0] .6^.p\@OӅ WA4=]@O/Y_8J)j?FߑEyH.%/-e;ˋNjKbJ;îyx*jY)24xunqͮv]}p7{_.>E@v?lWIQϏ.ז2?}ҋ|}60pQu_ d|m&_/,m}Gv| ?'_/7?E䘨Q}/U"U(5Du?d84^/_Zzӷѝƛ>KE工(TT/]e=\(e]R~ 1Whi\E9WQUQCFoK9%ld.n-&|$\.Fovb( j{uT^{Hю8I73yc99H^?y1R^cqkm=kG9o:T@օ&,,qqX}\H4B}+U^ƆV5bɵbixcZN3P #p̆ ΃ASKNvŸ߰c>9!2*`gXa|4 ޟ O&*+ shV8>T]|X=RNd]g⣍GG&?ƹs'ɢFO?O,jkuWt,A^= A&D1Z]x"ቄWt7c\"EE[1:UbnoݷD9%1Գ1l}3wط1vlBM)i[76NN;hY4؜|ͣ$|'GT?VXmſ[Dw}9- oΓ =Bϭs+ =?ߵm϶e2Y!z·F%nEmO>K'Npvnavؿovړ=m!cE\n}(Yw~&aņA?6x񖊶I; "ݣSܝ}SUe􈶪( ž;RIl.P7W]Qtƣϭ~=0rmz7Y:z7.,t,tMw3=ݍ> ә|={^ȽOz!wpoƿތ7{3nf͸ٛqOtOf_/mG(~ߏQ~W^>~ 7P@yE;e;y Q~Q~Q~Q~G{[<O3nfɽ?:$z3;;hRYQ8!)b^ʭ!Wc4:pnȡáfn~ʸ34PUQRoʌF3q~C\hF0‡>ᄏ |#IH "|"<,³ &<ф&| rݏČ%~,c)gGx> O | HDs!h ϳ#lM!M%|*S FPQ'<??H=,+ g>$|&E,"!"a0: W==B#&|6 >𹤟KC;I7YŸ%YŸ#貔Ή-MLf[߂y+6ۆ;wОgyH"ec'IK/!".߅/^&eҿBW(nw=s0>JWI*_zרku_{@~뼉&[o!Cއ6}y? @~AKw.z?^_=G~?D#䏰G0 ?LDŽL>}ӾO|G?BJ%(G ϰ1u첬v}N ?Nq¿ ¿ K¿$KOP p=@'$IzNF=(Ty']&? _X& Ɩq'u1MT9ˑ\߂ ?&Γ$~y2946.d\<۞[p$tݟU=$'I%_EO^k䯑O!B>|oE z:^Ю3 :C{Ў3 8C;bϳ\l/ݯ8!uXcf㍪/jZF[9=vvzrmErs֕vP+>999wߝ3F>SYz{`q=x{eoc_=vrw?DuP+:WhĻ/N%}'*}5{0@{.{\~ϴhW; _x,.^]>/%_)WJ_c#o(~>o=ҵo>G>HCEy#A%_"%II? =W EWpJea)W\un_{?pM?{G'~RXrMlsdyf//cwֿLOt?_N x,P;J7a%‹i6dȽQ2-\\,^Z(s暈iWR:RT *ȯJSԣtP/Ht^.`@v).W:(df>&}fc4d>Lkhkk]W7 +ӕW!_:96"W#_|M𨓯!$X7=Ҹ@/]\W.ocb@v D}\>~_.ݧMז>֨qnF1݌f7hv}_о}5^Z칌shEoa&{'_TvKR]>%˲/G/&-z#s@=OO t_71z 1\BTM ,~$~[$z'1É'1{5WH >,++'=o\V #AJe *2^*Ier+ӿ7QuWƗ5?6xBP*?Uc`{, PFUAUЧWAUw70U vV ږZC\ZoIS?I4^MկLu]ŽW2ޢdǹb!+(O ko{~W5oCr5ddՑs8o6=!=!رFP}R#'NIصFsj`F,5ܸv8Y#ؒ /nJe'6q?ثm;E}af?nD5`f~} 57k0n>о5w7bGT&vZcM|J)ku:O%}*uU@z3z_ro Js3`wT)7q)Vٱ>4u_g]R{QvxW+^oZ{ ?kAVA ig'kq=px8SPiHjHjH[08^L_ء8&E<*Kܸ0X/EhyQZGx%Թ W@X9 N b~Q=p;7bZ?4}W&[4Y~Nzgp}W__->V\+ϺSnwANPAi7=X`:vةvf]/8Y WO\Rr;w!I~yuX`VL Ҏ'l:צgеOz&)bTdގ'()Jo=[ %Uy1^_Õ3XZVLIkygw'&)_d1Ό.Q4J=qu11zw t~O{wb%QdQi/]z7Yfޛ}ZЯ_9o77ڮ~QޡF4]u*3({zcLL>l{E/}K``$7YTۗ oSN tNǀ)pw@н N*^Y8{.L'Pun9}@=/xO1 weXq{913AT迢D}2zZ\섘}wݴ`ic҃"G}=E-3L_>v׿q|8, _?,]gq_oX=ϰ+$.4IqQ):?Xg^#?`4a#Ƞ`P BdWH)">uhdpu]!. ͭSFүLqb$~=6F2?ux}=@_O\(옅prvsFۜ<yLp 88y,8q#O@pYnP8M'?1nbhǂOִkbwՉj_qc$\KxnP z\/7x]/Cr&n2y􏼠='<2PO j@/SJġn<5Ц:ajQG 9iai C`9-O>g$irwet-#G |uณ"/b|[ u뢠{=QL- tb-z\e񋃑pOO:~75Yz1*X̺zq`mbsZwX|iFu@-f=8gƉ:\G{殷@@9hPr2r-0c9Q-f甋YߛK/K sAhχpSA PxXZGS~ O)@?<-@OR^ Kz)@00 ? WsB0{<. !NB+Gy|3,\9| 7<1ڨ YN+D=BX c!z,D09 r*7 $#B 3Jnkz޽,دr<_,YŖD{9rj9wz/ǟ+VpA׬z+IJu3;~N|blZw[D‹[Ƌ:W{8+g똼*/]8cM}&wLоcZ uR:u)o=G?Jc1X0܍:`]},ĭ7oCP~`;gl 쫌 .k,<zÏS'D? [+'yd󰞢ygQt 8@"EHgf$THPR)D:!HMU44EW|`DQ" "RH E$oϜ;\߯:3gΜ;+E {B^P-E {B^P]hEA~_DI9%R$\]_BcQhۗ.⾯~UD* #( uRVj+b+bXxTeP߇* 䯼gq[}a<(L\Byn!Byn! A=' î^WP+B z ޟy#ߥxh=7&-䷐F~w^}+C9?WOTx]<]I^<JB`|}B㢕]:t:4*}z WjVr)_p}d5tR.)[:@w52 Wj]|):#YЄY*>j+WW3w`V;0ޒrw u> ;e~kMkkB'縆S৵kCP&p|Rӭ 9񵡣 Ǡىʷ=IW!NڠR_kCZ<^K}]D.Z_:aH!|?o]:uJz]!}ugcuqRױq7O?A^O'䳞}O$?O3?#37yN <%w# HWM\C7;~ߵu岔k揯?5סXy> ͡?]-[6O܆?6mzFm޶Qo߄N:0olqѿro'䳝|vN>)Ϸ]/'#AA;)N ߍTNVs gO;y^341Z Z7:zs]CowЧn;4qw0^E#vnycCTU&S&a>ڃ=<tc =G#y/>~޷sdϸ?@su%λb>։!-וO)~2 Y*<*Ŭ yˊC$_Wz˵˟C}]%XI_/zFu8ì9J{8r+rvΑwz~,HwȅST1n.PqGBё]n}t}Gw}Gw}Gw}Gw4w4;c;c;c;c;ם;=zHT~*t秌Sh?̋n_3|I'OgmPЕzPuz렷z렷N`꿎ygbOk*?q{qG~qw%GqG/u)_]K׺׺.;Ŏk~-O=u=z<œ_<œ_<~'}<"~qv_gt>^ 񠾙}tae\o~[ u}AEo }i/ύyk`u N_a҇r EaK6Y.}h $Uywzr=܀s QdwJx9y#v$t狌~O@Н/ oĮK7^%}]恔r=fS=#TpJX[hfWoWPI`5[+_J|w<]LTeߔfjXSΕQo͂v5}r|Jri3|[mQ/4-GlʟwU:|xR ~_2HnC*/~/92͂a=fFӑkh=>ȵa5z~?kxϫ sp%Վ;/h_Pض`X)%W2k|Q9&M̗7ў~qfSj93hA?jAi:i >3[_ k䣜ւv,ЭZP-[u \,7yap᪤j/lIn}-ͯ=햔%CK<<ܝ2J% .?.jBiȿb|ix ;Z=?VfY=l:~N}N 2B5BóV̛%\oe9@+O"tu]AxJ͹JVIRn%O_]n1fJr_K7)IYs$RRWWWU G̬( Wj 쫪ӁQZn@YKڅ}uGCCCGݑz[o=܆|稝;k?R)9|;׻"wz7nStt7[_ûtxlz}bᷱq߃=agosvV(  wE݁=Mm'4uZKz*}i/ {mUk;7ߋ~Ӌ}^T_Ћ^ϐĺi4p5ޔ}L=Y%>< +B]2a,w/'}L nMstpyʪ`}i}hPE_sRg5o| B}׬ J]us_QIY?ZɍQݗ}f.ׄžRM%J?kVPx/ex/dL_Pu_r՗~w?]&^O{Lо.aeIH-?ğX B`scw#C{o!?C2~P^,Y,my8Ÿ<8Ed1g1fQ/YYFcżż,]rrrtV0{K|m~s[6R6!q2+fnf6}ls6ϦB)}\?}pqj4\pϓ&ܪ*Q+3_&NAT䩦屎3PW_y/,x:!,K=/"bZ Ox2"}f' LR߻*0U;/0~U,oU•SI%iӱg:nS_*iJW)7(5Z~#RۓJw"+uEd<3<}s?`^vϧ0SAӃF?ȸ^4cWn:@ 3R t}gp0 ԭCfJo_~]zgk{m3whg`_e?g\r%z>`=-?K>ҟ9C!~;fr}&gr}&gYifJJ?4٤Měއa?!G5ԣȏ}#qo v'z7v7,w&01]9?"K;cF4R~투؝Y评󑥽J)VHcJjHpߐpYoߐr! 'S'O[i䧑Rs k.s\3̍?hG}3݃g,,r}k?..$~!W9 _JSo j>o)lcbi3ڧ|6Ru>;}3Oza>|o>PM(69wyPCޓ_foj:/0E p6P#9F,4zF9Eq׭̅ʛʖVH"0_uwPkMs'>DwAnGسδp_>67;cO?A'=ѳzoRǃFEYzO{=zY e{>e>ԼOH7}fd~ggۦ*ϰ3tbg3s3 6|goz7 x9v~N{ܼ]Vv4T_/s?7I||R)fffi;JڌWb3oؽ7p6cfsB[;%-D;PJ>BgѶކK>[g \y2ln {wo#oG[h˯rwfvhyNϏ}PKvae|꼳';`w>wA;sO#ʰA=`hE;)@ϋ3z{=Ί\vrD."."."?7 M k?仗K2{I*[9UNK>{͊$淗н+^3ڵ}}}~a>3s}.>:`ϏQ?m\?EOVfß)ǧ*bx~rۏۏۏۏۏ;;;;;;;;;;C;C;C;C;C;b]1zA_b/{4C'>G}~Y[ϦOU>W3ň_:q-)Jaf;l,~6պ.Y~e]+##wr#fAwXG=Ta9|^xGxOyz8/(;GLa?8j=1/=o?WRGc ̗*%\r&)u_(>f _~Nqs}IM;5BY9n;+!rn  ̓}qVvNU6ISj{srA?gN⧓f[2MTne?ENQ;mtg/ΠբWm_K30us)U{ 8zggXJr[ $'gL?gSSg5\r7ߔoxsQ(v Ů15]n_ٿi_Ҿγpt}'/γPR/_]xTRKI_F1oQjeO9m3~V.HT[2T(OeYfιjzz/9xW+*CRee2֟e,z-ʂqPy{ gH2/ ڟu٧,c}2#؏ WH;H}\..ⷋ%3Dϣӏ/я/Ӟ#,ɭMgB"D̰RM(GX"$\PK=HWޮU]V]V']ucuV={\5ȿkP_55G ^5_ W԰: ugBgBgVkє+r.<|MTƥZKwkQapyƎ5B_BvLX㜱c@/jԃx{v~?z7QQ8gosɐ˷KV>vV׷>קJv򵤻t/7x;wu#YPۧ\Wrÿ1Έu.~G(Oɷ>'譏o`'t W)ga2\M) l ;a{MR筰}!B,ѧL)W~ WG¥IRש.~pe_"+u?Tde=Y9=7YvPdeصC= "+Wp0:J:JA? vrX9 $\}^O}^O}@}ހlݖ.. sVΆ s7#ѪQ~l:?%?H;sΆv!v6DLDDDe牌㉬Y$2&2'2&aWm${ T$iaD#H9E+u\Mz-$gJ$$ʑ:L(JyN>EO,M'1h$0;'3btNP?);uB}Pc)?&|S444(Lnjs*sFvldǺ}ƤkL9'Ƭ3IӔ']ml$)u]SјA9I6& $q0Le}`_hbŕbW }qB-ghJ)iJ9RM)OSojGzb_Sͦv7aW3h͂x;* ;7㜿o 7|Vj=¾V Za_+;Os-軅B[(ē&}kekFOkFOkFOkM:za7m(oۆ|ڐOiC>mȧ Ƕmmma_;ҷ#^;hGv;2HA d`G2З eYڙP5 uPGkO>;;`Wt }w }G/Pt$눾xEE ;::1^w"Ļ|n%迕tbﭤnsf:f(}>JgGgÝY,z; vtys ] vu.Jz vNۉ;o'[W/tcFnnnv|aNQoݰ_);%ݰ힦T;%_W7{ٝݰl7n̳Xtcۍ~ЍJ/|܍;=WO;W㧞'iBCOݓ\=)WO{=I9z~"; ]. {g\>&~o]7vƞwׯzܾ\C}חrY.sߏȿ#~ߏ.~O]s߅geXϙ ?`OEco v D e`Dϣc`Ǝ1;c`lq;?M>w=.!8"B~Co !!70d~dddI J=C'PJ~CI?|_W,dٟ\lN#~%w\&llK)60q;);iJ7lEvyM9fٝolƩlOI2/g+yY}ojQak*\(05 ð{þaø_ƺa8^pGpGҍr]ɺ`$zGw$Fn$Fw"(ҍ"(ҍ"hҍ&h&h!Xs.t9!]9u~9e9AzαRhgPy|ʙOi?i<si_ ȯF%)97M+QMz9'z} ֭$gM:{D~о5ğ?fωf7]` SZ3ODU5U9՝ÝD 8Izq~13x>/t {`^Pƛg:x*Zx1δe53ywNLWfZLfZ=%;T{ 7ˮpe߀oAf[{lY6YOQ9Y5 ͲP훅?gYY= %e7!wٶ ϦͶ+JݖSRۮ̦Ͷj6vSQw_g߇'}؆ ?(ȏ!?8AO ?$9O!?4s"c>G<[!Qx_ nl͞A3367?C}=ø * ?f>v}X>SO|>֏ /Y`:N.)5Tn]vX]Es'/b<\\9瑟G^bs٤/pER/K/>/%f 3+ȯX=*ʹe=MW*~箱5F]}l] /"u_'u—rʹyo i7j[\oۯ|5;\_i+J;7WkXtH.=F~>O?xmQSrNnsҤ[ װny-S'h\ʇVϡ|DGD눷x눷x]vQ},M.km8>hgX G^>)q}Mws紛/u߾D;6"oDʾgWm6O_㧯fg}Cnf|}f{6o^Χ^НOzv3O/2?ni3573mfŮr܂߷Ҟmۨm6{}C}n'v]n"wWH;d}N擝ܗoqwQ/Oervg +A=NOT> |6w <7*Kn|:O>.*u])_NOwҮv+J}fF /bW•Ϻ+yJ/YE `ivSݼgwS)nʹt{H^f}=7]=Gksv~^e]u^hhhhoG죝dwyIJ'[=G9BO(_mXeuw ڦpGXf_:SjRo^yr5^NWCŁs^k8,~=8t=hpy{3?W_.=?j%8WLREaL kgV>ܰ\" _) ](1阍r8f_OTovn8.>s?Ǚ3gJ=繮R'( Vqx=H{x~ ߬|\uuo''UO'zO/0'1T{N>O 'O)9e+|NSSv ,uqN1ޟ%5%SN~iiuOsY៎4YםƝ SC#S5MeukTйUIc 73g[ 8cNT&63Jzӎΰsy Y9bYSX]g,vŮubY:]gYžY;}gi_gROgﳜ/8gO9?z5%_%< ?%\ǗoKWBR/\/չ^OڃaRGa(qGf;Z쳖>k{*`~+ (u_f;3e2ϲ`qJu;Gw}w}w}w}w}w}w}w}w}w}HwtHwtHwtY\frue-˴O]w۷cVs^19\O!=/\Wj~r]}'N…_9MuuTĎ׊W*y:VݹKW=󖤋Bo.^ +UO"SlQPY<xu>{|P"t:8upMOǝ|j^Z~ǭ!E9kyyAgS> kyKZWRZa"SZZZZZZZ^\ߤW ގ_3Ȇz/wO;PNUƹ_{_rٝK +9ݙp۵s7 )({|xz]ڠ\njx9`=Ɵz^ȵOZzyn<[TKvWX }0=z:?ҰR/a f.Dv=}8 731J]%xX{Ӕ( 4 sTQNsޯ9O!r"r:rדc2Kt4=]%d$dawWRSП,q2> @΍ўR'Ż=MC#u䣼E+nΗawJnm)O˅2xz_9c/BYw|(mR~o~[wQϭM5yg芬A.1 כ~jЄ݄y)ԫ껩s2_ znԛیՌYdی$oIt7&DmN{kNjN5h<]g6]%珛 ے|[[KoI-ɯwYO[Z_kfsJͿ5&ߚEC 9ti`WsMoEoڷP]mbw[Okkm-v^gW;d g`gvf`gvf`gvf`gvǾm}=vǮ:xH#vuĮՉ:t"NӉ|:ϭ^%V݆|F>OgLә|:OgL>i']H 0N{;N]ɷ+ϮߕWJݼ(#w'םSݩsw;ܝzvz`_w0NrvDO/^ ;{a^ewNћSo=7ƞ+}*NoE}/v_}W__zaW?]vUuEh7 ]?v @?@HA<|`yn֥w{#ݾ}7{{>C>!CPC(ƿ!kBP.W&dRLe&d^ͤ|"+fR&IgR>ΤHOP9 #3y$$ߑ;|G"Q3|Fh/M1cg !399Wd-oq^M8"bG.vbxO7ƓxO~{I?rwN ߉;to"M$7&>DɌ7٫V6\xvREp%ˎUӔ:9Դ>/ VLSVa: vLa/4PLpK>?⍄+*9O>?})Oa\|&2 e845(k*SWytWyMPn,'e ])mByz#">mW7m2Mb㢤q1J>ϛ= gWB-_>˧|^!"+p^NC>xJK>ϧ>Pʟ|/D^Pr,J޿47Mîi3 / ~ _@/Nc:{3ߧ^|RNGt, U(N:Oty hbީc]z9A^}'@~(W䇐gza'dg,٤MI08G7aQ|=!?YN~OrInp?yN~ ]?.iE\yލNgX'?g-/D.D9y>/_ :N^пy1:9?<_uKzN^`헼uf=KZaD{e}KLP2/?2/^_fK{ =?9/5{D / +'̇^^&}e_xNkP_Leؿ a2_Ƹr=bϫ^rL< ΞWIΞakȯ1|vFk{E)_Q/E"O)E^eVIVO-#yRw"oהt t7Dv (9G,b@+EgKKyVI""""OQ|R|RD=qr?^\9rOkZMR.=n`!? Yԯ[A>+g7Eb `wuR&ntoҾ7zto᏷6op;A0ğ+=}cJoзB*/1 Uk570Uv=/ɕ_( _kאp_KZ}jGؿ#OO0aF O{jca#5ިQ …|r|K_ᑇ5yO?h'=iQiN4"bZx;3/oUHS9`)^@Kʽ=Wț7!ʪ~}Ao!űbȻGR$l\da;EU}p@yX⸷x_8xq/ Tϰ`~5w쵄oT;7{^}>?!l7^:{(w {u]:Vxx^Ā¡+x@:vM#|{>} 9g? O~~$  ?D!^Lx1ńLτL/B/&0 _ #!G ?JQ~c'8 ?A O*%*o#_џ+nr7ok_{%5~gwkO"SƟv'O㟴Ǔwq$$~똤G:$dgg&߿:{k+Ut:ߝu?1rLR?BαoxsWcNt?^+Wx_2xѪ 7<qkՔz{s?z&(onyN' WEKs)R]Kw).ϥRZ}u)-ݗRTJK)~)/e ˰ . L7\TVU)`C \_ LS ]?@;{KMS?/ ~\ֹyP_.!_B%Nj|Pϐ|ދy/>(I/1x_Ӕy_"|+|k}~_PSST38UT$(NTj9*:~U`'*P.vW*۸ ѧ%vWc*(R)JyDbO}@%J7D7s~F(߷m"v/cA"8 #}# ʻS/%H_#Hr?"}}?)DH_ ~ɇROKkB}.;h?P)1;%r]["{%r]S"$QX(?W!W>*z>*2~?+2~*2~*ʔ2L*S1Ra4\S{U|}1?r*jW=|5ru#tr _3~Mx41~/Cx 5kMY?ď5cMWo5&~u"ZwDž_CxC2ԯ.] kP; vPz5cCc(rYRzQ/>)wm M:'!^\x,G?GW+/qq'8(o]˿.KyRk{kZG"S!N}]gm9FN@Nuz?7"7zC'99I~G''ao2Z$3~'d?ӥOA_*r*rrZ`FG1ܘznL=7Sύ{CRpj]bxoB,v>G&*5\ 9=uPϠ]?8jp,rYi*K?D:aP09ّXX쯁,:~I+ߌ}%9ǵ_̸7qo?!Aޟ39Se)OjhX0n x7zۿn?=A?V?!hd{ {MU\$pGPLdRd7.d76;2}} kbW)''(@3;LʑɺYҕ3i/e2e2_dI Y(U"_seߖ9N2}//VdJ ?<'\7M@M[+E߽MPgQ?YCttWT~/Y,?vM폫 X%M[9IX^;MϺSy yC}#|i g + ~RJ3? ] = އSé>μ8;^G`wM>8Bx$?;B'FCl@#E, P3/$>Ko|e1<3 Fd'#/"; K~]Q#((n7ϣ:G1]¯NX_yn0&єw4z4z4z4z4zERrҏa3{Ǡg zưC1KK{Dw|U; /ŲKeETT\A !HH% A#B$"AusO̝[=2w`O}S_/dyVw6Hx2^Rۓ''ϓÓ@=4).c͵W>9X;AoO2x28t}x}O0 ~~~K __ROnn DA~ڟz8?zojQf'I.|ƓF?q:KJ;*ܡBc|?C<]>=Ca tĝد4|v7 ܰR6 z;>}sw`Gaı<`3͎dJ'$N|@_Xf}%n H׫z^Lt Xhf0Ϊ+?e2_ n l}2YGDov]0Y2i7?dz::@o\-~^ rŅp[LDϙFwfP%B_y=lź.N^պ-+Mx]V08c=}q?( fϬ`tcQO,1 ;0+0d8L?Y) =e'KǪkz^,5 {N,4 ;f|:E6lIEI F Bd]75I Kd\;JLNwz*I!ޓq ^Oۗmd0O]k_H?$s='s=[z)ߦ$N=ޓ=s9swqzʡsWsM=sh9?u&  Dga>/|.%\C.\{63)p<σ4vMo|V<s0v8 {?0=gBsp𰷷 Qz{WX~?"-;Џk3 nB1AW?ÿ/C}z?o8z 1οo %ѱKcce\<8;8oca bo,7O>xc' \@ߙ@MLLO'b_$Ox~FQdlr_+O[?Aޜ.pr0X|S(7%L <[lc g m5i Լ`9ƽA={W/26IkU$"ݷm*z:TjX?[ul4qt4v2=ZSNf{?{rQp3B8^*n =aԺLgt6vMrҋ=s/ =_glvfo1GW,-(,5̢?XvbZ|'|.p+ \A0cZ) )=үO=C72ޟn+,c 'TJT>/r`_u`/\: Η?w _E䜂؎E_8g+s Ggq3M?/`_WqpnO5.F+9l]b'O%6_$:3}̧ŬVz|1: o 'bab9Ōs^^vr"es^\Iq~Νd0-+WWW񚪙/5XGt'zJ{ճzw4;˸,ɯgƮ)qWJa_d/!< +~ob.("x~q{1nq- %"K}$gK}$gKW|?ji| U˂YPXF_9q8NDNT;]eY8QqYrMvqG,c\v, kʱFG/c2'7j&OFVvjeK˂5}@^5{,ޠlڣ|4_WKPsvlϢK>sqe#˘,Ζcg,g\8e9vV ¯.Vb+Y'YɺJ?$JƱv}3+JWK1jq\UcG"_ת Wao/OhT>WU[^^FUUY?iӌ[0yY^V@֠5~uk 5?Y֢絴-a%%[`?%O W%S %%A}Ϡ$ WB`_%//a=z,nKm _'U%s \:Z v[BZF(c nuJO\Gq㺸l`~}6]< mib'ucc5QN||ghO|}u~d w@~7 w@~7 w@~7 w@~7 w@~7 wH6o#H6o#H6o#H6o#H6o#ۄ>7ve/c{ND߽)W?ĺQ"I*>.fmFW׭\y}A羙z3o ` c c c ` ` ` [laj}o)KE/Ş\ q <%Ƣ/ YtvRxUߥbה?S=۝?U]Ȼdо(e\RJVJVJfe,׭+ $DV?`BuVQ?DqbwMq?1틱uR浥X|ӔC[Һ!KO>/jYJ?^J?^|6i5wc6Foc6ۼz۫q.|8~))[g[5>qm=Kmm3vvi,WseWm`^gGs1vmjI5T7Wᬝ]eM2>Թ&v.g9)0<.}A&Ô:G}x]-:O@P*+l׃VCu~^0 jv|/j|:灼x`aq= <i^۠E̊8^^s=`C~#(wzHpM R_Z>}}5,G>~\fç&7|gccݾ>:/x+ן-[|W~<ǑOzn|N ?A7/$Oό^q)>u~ǞǞ>݇\x>>~ϱ,參y1~1'1O=>O˧ȟ"|9ٟs9ٟspg-g(-gg_ar}g75ZkjK4MN{t'YGpsC>Gx$G"?x'opȗAGqTQ9]qz%x iﯬ$Ĵn  r]!o7ʟvtSBwUL90ҩ4~1V 5fUx}Uuk&>-.Ϗ:_fFGU7:ͯZ6^6^d{=xɮxj+MxgIo~/;IQγr/#^#WG>\Q/\p>F\N[/1Kjuld[/1پ1پC jP5'q~k^jP^zZ o˂5 LOBWWԹ'v굆rNs 7׳+mr%-b<p5ܓ^pӞ5Q*Y6Q߁\NOS_v_y)VkJ7h\ gTmj˺.KyR.K.?pѹX= =@zwqmv> $pT!wH=?BRz)OH9BR!R!R!R!R{W|Q(_= !Yz~X=W`=%.WvQKx⹄r]By.<&[FR"KR⽔xt;ǡ INw le/!̍+*H2܆bt_;e)?Ruύ1Z4tG7tzKCw>5wx6"ߍi]S#n?Fw#Y5޹))[}<.wꈊrCPU_n4߸KOZD=v.a/˭Gk5zi^Z֮{vQi~Z뼔6q}q ULI8v`ωc[jml]qk1W\M\oSa{h=,}{xQo ޛaj"D̶C[-v}Xwmѯ3E~=umwr[=Em)uڧԖuwԖ?$ںَrҞ|'o{g>N_Yu՞ʒ> alUc'{ߞN\O{O{K{}\ $y<Ӭ}T NcG{{śMhz).shT9o7Qx_7ʞ:;POGyGat_4Z'u؅O9tO἟舟H=.Z۟Ht/wN:b'EG8?L~#~'.aOl#ܑތnf^qVi n Z2jps\pnH⻅zzŝ߂߾%>Fg~îk8/}O[ou#s*[wN䧓p~jbE_:q""h(~X~wr749ur[i<wbi58 6gҫ[)~MoM8 Q(~Xxͮk4ʞ:я?9{VOԺ]g;`$b'؉uNNm] ں`'s'e' NhuB%8e4VS1H<;ܿwr.;3LήzS1Sg4{L<>ο7+١q~sg7wvw7~no_~C{=OSp;I;'1{nIhIvq;s,rhYMf'F/?{Fvݯ=COC!N01[NG5s{a#ȏ8m k·nڗa4?sbc$,q:8(M̅o 'wGO^ {njBw5qcO =yn.ٛ{Gzt(iH~rv?79ҽ n`ze'$.wZr矢܏i䧑3 +AfP_3/fP \^^^^^^^^Zx^h~A~u+++8g zz@X/~uzq$N:}7t@ t.EtIM]sj&7[?X>ēHJ9hIEҽ&.v_|?~ЮW|0$iGvݟt.f2'?"Ųٙɕ4{K'foF$nPmG~hh~4{z~4~x5Z?j/X?`_9no9n$\UKbzx.Ts&sY5p⿽ˡ>s$~[rP/hsE~y0vG\/g&ϝ*yq1{GyY~9|Ga'v=ٯI‰~dV^h5]ͮfW$4=|9WVz cgvm~ :&/2vM4v,㆔DztΡ&W'9Ʒ9dq>3[@\27ڋs"ϽA""> ^t*7χgq5Ip PE WxQ~|&8uDsf~m&Lm&LɟjzId=q&c~|{v3y6rW>r BBaz-eG~_\y.~}.3____ϥ˸{.빌2z.\sǞwg|9wnyT~wק'_ϻ3Z=Os?|>8^ _p(_D~ɍ9Q؍r1_F~WH"b.f?b|dz}<>f+>W$=5],!%tYB:KHg ,!%tRYJ:K˸-ږ#/'夳t ­tO59O^Wb'+odJ ++ӫ*]Ewfeۯfjjf5eY_bVsQl>0}`VsQ#/YZ>Ppd1VvV/FcxMz\נ5q z\&pk pk p%\/ak XKدZ~;YRY::^\M wL>09L>a=LI0= o#[ 6ktyu:'{j|xe~vqQuyǛ{ŧ$UM w ~Q1t #ct }C_1:^zq[Oi/Y::q֡Nu~~x~; 5O>Z=7NP~v]T`'oK}&o;pf~.yl??I|FNNNN2~>I9sM}hxV^=.O)))9E?s|rowy}xYxxNE5E~)=9Q~~Ix } =kOOOoz*noIO]}_o}:Hl?~ȍm։>?Bh.fkGG~8#|ߟc}L 'ȟOe>*i|}=i4;M=wqiyfqQO}iwfqqigq|yP(g3g33׫Eugg .;<;6/O?Cϲo[U=̃κuE',>YgWe>aD͗L6{{>=e^qyYgO|?g_T/^lW_]-_kgQVo_~7oG7o| 7|C9Rߺ~[w鿇?8tǏNxtuM>˸鿿_W|ٍr&:<+IR+e{g֣L̺=ovb.fF///i^g~q6sgO|ÿª__\__S____,o㔰SBwӽ\%>^UC tA(Z-U U qZj~Q-evmZZ~zXsHpM@>/PA[z5҄q`P]ޟCP \+,wpG>|jS^GKP~h0>??,_p5.f=>^Qm뫞x%ur_czO̧ _ _EFk}AVOĮ5e@qa3<NX=x N.u~ GSdb.\ȳ]Cć=?Ly xoM;3?][Թ&<!})w: ?+5%/aբ g(_<4{(_+x:Sp< ߜpWZ?ehPo[$\l-Nx~3۟m;0T?saz|Q|߮_.vESѾ."?"?bŴӋC6>{S(GV' p#7-De"aEXX^*j7.k[s1s]/K,cx1+O,_~&'by߯k.m)m}J>źnL}J&ׇO66X:vp=^Ņ?0T7@axm %loma;x;›-6뼍p'<+=a?w˟v7[pWB 5ryq_B|=Q)s;!xrG?#ܑ}< 5~2?NDP& d?{5ٟ¸# 52ٟBG7:?Ǹ^88]Ը%KƢ%Kh.N/N듏_}~TQS=Gу_54`א2k!n!㻆Zh8!㼆2k84FFK#jD7|(Z;>lӿ^O9'?-%e8e8 ?-7-7-+-֩b[ߨ%zP-dωZ+[= 2֟_oZ2omjeΖ-76isxo@ ogx <>U v=F7"矠ua[?KB5~5zkZZ֔5k^Z6aG_6wN/  UmxkxoC[kX>yq&^oB}Co[;Co[;. *Л='JoD|+|HN>ۡvU;ycxۍ=}>V_< aۇԞfCGoLV5>ooǏ[>z^Ssk{ah8}ssL\tS4=u1޴$ O >iq?I||d_FM='\'Kn~S&}w`NTLT: v@ov@ov@kv@Ы64+O.oP.kM}}%vPWv U6GuQ.C`]va^%|# { p/]"߇|nݐG!/?> 򃴃^Px"F~A}zU/{g{WЃyYSGF~ P PA$\O qǑ@~wXKn0.Ca'\Px}_ GA>d>>ؑZ|>:Fxh~O ^>E}?|;x*ίOQ!?4rrD߻3?{D/ ɕץL$eLs&Ly2LKi`ǧ?0,%l8;\uلN}ޕaCmaחlHd7'={%˄#a #>s$Ûv7N{Ļ3ٳ 1_J,}sĞ8<Uyv}١u|v8x~#=M5w*>뽑 /|xLs݅)1s?\6e~r%D{캨} TMsBv7f=-~&]<5lu؄?ew&lmm&:эnupZ܄'þ$$/'|_~nP,$yU.Yr־־캵/}}uk_i1n־ڗ=g˞ee}}\W.e//oSd.'~+7l  īaT Pej񈙩tQbfwv],>Vd1f?od1}Z.ycra˼#4}>Mfnh{ o{٧[}>K,~YkM '},ym^x &ꉗ~;<FytQ/ȣ?CP2~Ն0a WBO5,yTBG5,6p^;;.~qx8IowxPMQz]+OgpP`a8-GקUs SsDЁRf'=O'V\\~Yi͆z2D#u$껬p;2N12Թb#)H52yEMIw4&Ѥ;tGP+ѡλwaQb4鏎ǏFctΛM|.j4"sL7pcnnlX%Ϩpc 7p7nn<x'xM @ @H| 7p 7p3J٣֘b%fs?x*kh'dLw2N&;x'dLSw N!);xBSw N!ީϩ?5~?N W5jTW֎1zJLSÙS)Tk*v:M|S)T75&\YbWݹ=rOgߘN~cwww~u~qh{Lg\3t:tONN9#Xʸ<3'3fgO~lb6l|+GwC?K. ֣M~h1Y\ z=T!:tQoo*d]{Gc'Oް O~ig , 0Y8!p(p$G88N8N 83|`fH}$z/Y?+W6KdӬdM.,2jR-yQ<^'C~rv} pH8áoex2ø/fGҩfGf,xqvTVmz638Ξq1 m==Ө˧^)U?O>OS?OA4fGt}Bq[031[E;+ƣO HB꿐z/&@W!d+ic1ZR?&[R?UH=B[~ EE+w Cz.jX5JEњ_z ͆ ]M/P8SQ4:uUD{Ŝys^4>Gz_;/Ώ|#b }_&?/>cR#?<䡞cS!_xJO<3G|0?w}G|0=ͧ՘dդ5aSMpG c>>棏Ø$\POe>z7#l~K=eG&_T*ROXH{_$oo B.~5u!z],D B.D gn~Ɠω^/ B=,D у?O/P"@9^P` b/܋^!o-^Q"rQH/-nEq\V`T=,Q"azXDShzQ^gzXu|㶠Hԏ=xsJϞu~J___Msb1K }!߸IZǿ}iэTQ7noi~߳ɶt)kOw)}K#/mY',Tʵ,\G$G:Sr._Ƹw~x2qr/r<^]M9!}88s[pQX@Wdy*_\crc9p=^+EVP/+:hAu+itqϱ"_+q~70~VDOVP_+ keЯ߯^~+)uŮ)f_ueSVW*_׷WES ~}{5:Ycu4Ͻ5zVG}4ˇgהϳt<ۨrVVSj|/z 50^Y!5Z_Kkeג/fW|DޞMsrzZ<54>ry$(uo$:ؠdUBRB֑uQ׺ )>_뢩>_Y>_:|#:|#:v>[3oYϼd=C?3XcCŏ6Dz!  N{ccouD=uqo&WSiii缔4VS)mH;H;t 1)Fʹrno">(1'~@\s=76En׭\v],'M{S=6MLm?mhNqJuqi(o?-IѴtQ({1G}N=lf|(;N}l>GSŵp#<Դ9Q_/۩_Qdqoi'۩;ߎ޷iQN{Nlgܵ=M&;Ũqv }??$D,*pf]Qz,Ce,'rnep,hpSPtLeѣ^OQ!X‰VV?eѴ;JړɢѮ[{*>7˨Wo-~X'.~"7E?}ew]F}R:J(eaeaeEva(>ʰc߁w`;ʷ ;|'#}'\(.gQ<Q(_{)_׿(o7rA9rH9~d'l'_?ϨqN|dN v=^.qh/"]w1E:(.(.ʳy.(n8xw<.;ۨxwnûf|c޵/Z}Ѭ}g_C]Svϝ1Jo}اc/_DOaXOi?Ӿhpu_\nu_\>w?OS?-ڭsp=@Do(@?ks\S:z;z;w@x=Ŀd}|od<|?zOF!z(ε?"ygʅs£yOT5~ž3=s:IWD@՞ωogQASO5?2ٟ/"^ksQss U̫*WUЯUDPE\_luRA?W~0vs9;L8};5㏞aAoAo!#{?b׭ޏDՑX/Yb\iG"'>i#щ-?ωy;<5w49(sQQ7G=~R?GGIޤ|oR7߾I9ߌf lc~<&y3֟ثHm~{1?Ƹx6~0^Q&Bzt"nF+q|=GqzGOD]cN= _Nj{ND_USB| N('v'T ؼ Lg ND:~]ٮ:7J:i_ zx ;ODmjINND:5 g~KSz#v]FHqǁhN;Ihp~;?]Ӆ `t^9A Cp(j Z??0sf:̺uvf:Ln]G ߒ D3"gkl2DO '7<֫~(? e]+}MA/lQ΁s!ֈ7ހpxֱ,`_^-pG1m`<}PzF{G]:Tvbh*nEhw+т>ho)`?__-Vh$g*Sl~Vd]D?/랄\_?]_./ s X X X X X X X XbG83x:Gt\o9~(~(Q֫Q_QGiQ֧Q1u |,r}cA1hTEhFc1w[ǸOyzا^ǣcu>Ώ3Z=G[D7Q8^'yO\zߝ( }Bk&0a)wBG!\8+d B첐>x~>o=֓["" ExZ;?1E?(?~b);H5 u_s*zJkz.낧ǩ [%sy(N?RqW yzzwNi;M~gI3֙ Lwi`4{hv*Ud٫FSf"R{<= Ltwp;úuul,Ͻ?u牿=/F/|K_BeB *Ayn`}X`QahEg?Ʊ8&r8R 4o2W8|cn}EJ+9b(>>3ݾWw81 "A_yOz9}x䫑FnSr3WDDЙrCosHId _SiᩍO?&Lӻ쬧vIql]OqC{Wd4$\^*z襢^coLk^cKsu48iNhoҜ 2 8q#\G9=+Ol4-,d|~Cw?;&S.5 z/5cǞom¸_|hqg^\|dig^4uwڑgwNA z$\/Ѿ{! ȷ94w^`O_s熚HՂvd|#["Dn 5rk䛑oFn&١Yb&'۾>9BJ6B9slαs};ەڅPW qǵsv1x ]pvq߻m]cI9S9xFwFV;C;\˼|v|ۗe_"/ʾDe_"PPB9 \.|\,sPŷy>W3wc}NN~G;_'U'G'ơ٩ʰ~W3^JN%KwN'QicSB]ȯ z]ȷ vaw!J}+麒+麑]tw.EHwG;zݩݎ+v<~y.*êc'#"x ^`4?w7|Y};aq2fN`dO7vJ6>q#EdI'ǾtVwrhbYnqv콖NUM}gߏ?,.e}Wc&?}DZ6q} F[?8]>'p}X/8>#0A"uViG?SO9y*?{;gG#J%C~ qG@'@|@'u*?}ٱ.?d!Aig/U~Y{y(Pa7;k;AtQy$((i־J|sS3@ ĿHĿlP%?ߗiƩ5?%OnbL+FM ƒn뼕ftcI7^Ӎ*א_C<ב_4 @M7o"DIȓ$/5Lv^Bo9?[٬"OAfc4ǮMc_2usi}L(Ms}i/6ͱŦ;gXӝqƁ7st7tg^9MwS9ݩߑf:v(YXhIy= t^X894L6η[8v4ө_hI2{O#AX FLɺ%zFP_MO*~dd]ʤ3L=~pz2QjthLg95|{l6lzsDE<٢93y>lU}>pC?DHЩ ,g(1񋑗8_%\Yl_99M7ˈ_rwC}/cgSOSO3gʟX}J+9伾sJJ+9wܽsJ٫_U'E\aR|ci*p\@GGhУRz1j?ƹc'NU=|sq9N9 t'ȷt+$]! IWHD$z'K>E8q.]d2.F;q.]R h"'B"EËJ]ʸ9sx3.v/.F;9*bS9\o9P{:]A><;|O?s#Gѿ| sR/NM*/_3JcTq澨r)Kjo]2s_5?qP }Y7C˒J_IrX/ZwS4gyJind-b=+ѓ˻v߼kϧw=&9xo {uTtE6_*bzI nX}?[#h߁}늮=RѵkTtТ3sdJUW!Wv_~*nW߫4*Kj{{5'X͵$^R꤫9:Ro4Wwi &ɆƍTc)?ϸ6I0y۵l}n:[;Vh׹}g4 F۷UgܪHuw>-F^U /Z\yrW{$IO:]ۇ%(\P UA{k0^5/a2n5IWt5IWt5IWt5I^{wröSnLxE ~P~PDLWq~^&MOnI1`/wA'"ƚzzLמoe~"؏7:"y$ _JۥLPD\{?`/K S ?4jeZBao >ByNLr|0mSÒݛ#Jƞd&qNqsuSo ϟ?czN `KhWS\;v70x;ŭk}3~r;\hWUy⮉3HaHqw?Hq9ahېƸXփh]T7y2 48*do촷EboSgo3hM޽ɷ7{ޝ`vXqFGoolTX1h{}evݷ{W Fޜ{c/v?~_N{k '@yN~yT*yAxޣ}Hׇt}H {e=A=H\.I64s=ݧsK0ُͯg?Λ"ϙ$yԏӏ8GsE}(p-aaaawaqQjqaT F=>hm쏸yG\{/מg<_|J5gjHy=wj}~1i׏59&&K9nv> <OЎ'ܺk߷x jm~=>`\Nyb\j~~~>}H=]]8OU~~x )מ> /vVy0v:;!~OӮgg܁eLkK0?gO{,N3uk!74O‡b_CPk(5qWDo3k83 wFt_2HE]8B<<ڵ=ƷWAGoA33\+B+\{#3/?3Z=3cQ%h>}"8Tld|ڼpKd{#'Kep?K3ط\LY.dpz Bهd`"Īr}3\f+3Nu Sfp2\|.OBY=>iǰο> /E_^^&e_qT%~,!*k __w:O' 7D~y"f ߂owp 0Dgr^s'Qgb]h]d=73 ǫ9 e">Ehb2 ;NgqvMgyhg9q+ߚC?As0sa pΣʙy#ʛuysOy8c_8<|7-xoO ?[?Bfp ̆KRe%r9?z.s̽{^?wKd_-rf[X"5 ŔXA>) `.̃p ~I}\ 111aXGFk!7B{~Ox>#G䳏Xz7Azֻa3-e93r6P @7T#6o-%%r ,U>~0G9{LLVO.+Sapq%ee\2 ʜ2Iʬ2S?42\G7}Me~I2/ VlEY̏Äcz.UmMq;nBdXM~&wTT11?}ּMSGFBOOf6mFo z[ۂßVmoC۩šBKtH'JK3&Ϥt?g픷tItʤ*WSiwFF[i제wPAy;(o()7Q;wtzd^tWiN,:|2vxv ݅~wa].vv ݅^^P_KLDŽcj s.0Z.|WVv VrWrS1{M0KPC:^u\؇>Q Fos{Ws;Rk߃S/w< x'`a zO/|,?Kd[dN(P#ΑX.^ "n#]/YqƫD8:8"H=/Rϋ"" _.]>E^~Eα9^~EB Gl| EX9\b~]?z\f?zzkϫ8P?C2Txrio=_9e*EJy{rէ=['{e nO;8M#n _*W U@"zѫ^E*W JUBzл л л UF2zѫ^W*UA*zUѫ^U^,zŢ^5W jUC:zѫ^uW@z5Ы^MjWš^zqšW ZBzЋA/^zţ^-=g]-=O@+iE>)5[{?m>g֞7[{lپhJe?)'o&ߛfchoWl56^1m_zMm!6| |A{>8P/cjdc g$\i\m={gޜ<-KZa}E6~ۨm^;bYu42.y߿ͳ~_e/P䍵ļq|Ʒ^Xc?jj{oLÄKߦ|BGeߘ;|wWTe|i7+d*[%#ŸRy5osJ>:0ԫցu^ώk F;Hw:zC?:oNޫ/;D9Eud!{z{ɱ&Ap繼סE:NԷ7c"w_Q~7kl'%na7{ ;FvnVn^ nأFo7ͳsPΡQ/[Cr{Þ߻#wG{S廑{xU|=;{=۵zz7izRԯ7Y{>x?¾|> o?(Ox֏+V^2ux ǽ <y8xծxU`U ߷RY:xizdנ>B>)8C, w88*W3y׹@~|+[Ǿ;T&·;υg̋ƽɱqMoy.4Z5%&f /Ke  Wkp<|N߀o‰]-xMd]̿I]w&@{egϽE=ަoco{3{Io{34۞]z;,ěBVYĞ!w_4w_a;;0/n|fi>ϻ]9)O޺FF'L -S!7S<{p*Li{ Ƴ:nӨ4glgysG_1ӼizZGay2ӽto>9ݳdRLݦ-yG)hyL8k|׾cM [տfzkj$NjDai7I5Z?Kyc_2Lx333":\*.fiΠ?gҏJ0Gџy/_Mlol ejez?Z?ϥܹRh<~K?ϥ%ޘj's>rwuShP⍵JK"K"="]"KKNn{v|>#^ݏO}˕qŔ9Z HdhRq#(3 7FaE}LQX1ʍC/|x-d<Rυ/!/b\y7F󓋰EP_D/YK%̏%%̷%=ױq&]6sٌk&>M2ڸgs\Myٌ{vIyK=lBloUGw¨-?xHy2Kϥ)!<owڛ`c`Gp!\=7üa~K_q>h=;su^G=_zwz~f߈F/')qpYVL̷KocZG%hO@@0? ԛMGG#zH~"'"xf6{s/l-ooE$D \'}[u=}V/CPVsBB[{B[۪ɼʼ[9ty~饜ohiv΋^΋^Wl2gg~ w_uC+oIJ?P!^o]se]z_0lkB}#w=W/pOwƚ,'alsvqż(; ahIk]O Ƶj,7(;u1>`V|^zO%x Hz@j_^LdHdHwԻK;uM4v=wDޥIx1!!b(w{hV1=r%?A?ݣJ4=EޣKx1-]B_aHiPPPP^jRO~[`O}»a_>mU轩ZM{;cb}Rhv]2 ̇BC!/Į>Npᣱcy>O0zOAp0ϔI{E4~x?7R+q_!ie/2\."wD6˜/s?/盿(oދ5S='C??>P8/o]/([ҾPҕ|+J:!}HmeKh˒FF+Od+hhE^I=~W/GQrԯ+GQrԯ+O>:~:~ϋE^r+RnEʭHЫD+Q52 Pokjl eeS<ɜ*,2C2S5L5e\]HʕПRXsz\ԧڹ̾koy\QS޿yrMk"'(/55g-jA/^xjI=jSԳ6M=kSϨv~](o]d׷zwuL |23]H>E^K3Վ| g9p.' <Z}52~jX7ΪfvIORb}i\ø~`N/KvI5\CK⍟SB~ :7*A\]îaW Ox}_MI5 <DK$! oHx#ވ$MBNFNfSz3I,X?΅f/)KA${f)؅c\ .R IߵgT3΄f'W,-G }`)Gijq~2L_} ^~2((ב$^#,בR/Sz^n9 9  Mo8_8_|zסw離#H9{#H7n݄܄knIVȭȿ5rkw3ķ6߆𶄷%-o!oAVo%Voې!Cv@r: w QAЎE|=ܙzvt O'.w! ]GW!wCtw.uG;p7~ g1 EVtJqʝ߷Zu2z𿇿=G=]l~׭b"ۃu'@^^#˷(^{o>#>}ΟWW%mqo|#zG=BitDw?O˴^}s%v;rv_^dW?O߾"=}N=Գ//ޏ~v ?\~# nGaDc?Fҍ篇\gM0:v\ҏ֏|>ՏsU~yJd~$ IoUZCdcң^6=Y. e]}~r_Yd, r?IW<}eiW~||ž}$OA~tQ']#cȏn`w~$hv0{= ~ 4I}X)"A?A'7yӾWn~a?v̼B9Cwt^gAJJa7 Go8#GFRQ荢F?w4O23_6N?_1qܟܟ <=A/7==ƿWc3Z0v?} ,T(s ~;ԯ%q_Ic+(2%?BGe> e>@^/0/w{ W_<;Vn2q8^[y'&hvǾ G}#_w'rɖ@ yWn[h6ZNe?kJeS\KyG<ʝO|>[ g~~~>Y"}/.b]B%[B%[BF//%|)9C9%VC}n閑n閑n閑n9間n9間n9間n9VnVnVnVP}-cQo_>!O|{S?O)Ӓx+S Oz~$4#ƭʕ_~t4+ tBP' ~M|__V~].Υݹs.ϥr\!||5仚tIk8ϭan 5#P5pf uk8|Lk8}A//uD?`\U‹(X74n/H*_!=Yiy_ޮ~kZuM7~Ʒ|?Oە2_Χ}=כ ;IU7B@?p}?ǥF|WB3|}5S7`vT>~ʵd>1}b>|' e~=?gׇqZ 7[oCqc7?D&Oh~?b/?O^6o[؟o5oN0߷tܷ0O0_.㸅ys\uͭ\uͭ\uͭ\uͭ\uͭ\uṃmcfc6aT%8FKq3~m}b>S+y;`v˘l8`v;w;?m2;Na'㰓q8dv2;Nav ;UL8Vx8h?-_s7k9hnb7~s7؍Nvwp>v3>C?g `(ָv?܍?;]o͸p˦'~o7~o7 w~ yy/}}ȿjG>=`pn9AA!3?bM=f~f~3?3?3?3?ӏ#9-[BО;-. [g.. I~ *`.I~F믂lis[p+ CaoovXk!#] AO }!r!'O""{;}.c)9}LS)vv:Ni4u:}ƾNc_i4u:P:C;`Wg3w;:~ t_b49G3`ghA( {888/jI}?7H@7ɾvF휟Uh>`|1s9jlsy=g8_`/0 |q8_`/0E߾rwr.j\hr ryv ]\<}\..RtD^\\/GNv~}s%Kd%oWhow sg &̎L/˴2u/}opE:k__<S{>okiXgE*11ɥKfK#A.LK+~Me˒ߕ?*_ؼ(G|ooy_]uFTIQ!X7*fp9U ̯U l2>B7SWdh>Icg f G~-|/%dIJU+6~/ l\ lDA)ݏV fwU=Q%0J?T ,.kU &^UUGyF_U鯪EŮEy)̿ });QZ`Q5(\?V ?V ? ?JGGszՃźo<8T>u]\vij05+Uv ƚm ̿v*.I4Z1qgџBϸWZZ̳#E(7pJ~ыW:UߡN`:mN`Ttn`ׇ`u)wzc>g, F +&}{~`KF\i|4fXdd+T1'%imf OF*g}` @RYv֡uhWQ' O:)*qL} o-U`=ruϺA]u`uM(S?-~Qh#Gǡ^10vU.꓾>S]?V~A5տ: Weͯ(b</ X_w 'RD'v$2>czw>hvX_l&1NJ1.&[+mQzb^DŽ&_K1.K(oC&Sv Dhߋ=K`o*\1T;PK'4y<,7ܸpDҎ&eLKRU 2 3S)%T_E9-|$|VmF"~#1x,Hy2-w,SM>2]}dD]R~?fq_owi?,K yjgY~:gYYfllDt>6Ŀ7 ,e4ސy08ϋQ`%gI̳$Y<) .h%gk͟%$uaDIYv%a7IMv$ᇓ$5 ~O$גk~-9HZ N);b+TS s*~qPAǥ14X?X?X7X7X/ &>`~?̏hTrO4օ7oIڠ6/QCn_nTq|'t7Y:о,>7 ps9 N~ يZc7q~3m6̻6mX_0۰ζam:+$Xho&!m|z "QXXfnG?p?<  wÃNp̆]A}g&47Fko ?͒1׸7vv?T7vvmRcd}m觌Ķ"\6"uZ((io |q5lOpFx9Ÿ ?ѻۃw{Hڣآ'/re߁}G掠l\) ߩzwUzȷCK@_TCD;N$c]]:N}N;_^;ޙՉx{3:K.h;ӃKo4](K`Sޕw#A#c\ 7 A}mgwG~7!{9e4y11=鯞 vk?B$&$`b}G76֯CYU;G97̔8"w?{?> V11"e2~}__KH׏q8=DC?DÄ?RBGGGGGG%:Hԟz_>QN? I?''(7Dcqw௺^ .$hסbJ:ܒPPPP>E}QA=?5z ld ϐ 3>QPP Y{s/P{{#Ճi`98أ?yHh,vCh=vCh=vC xr jy"?&íRgdz,?KR=1ru :)a=#td:2tYws^zÃ7#iD`G`[ѓ`>Cň`Xck}:#$\I(${IGbG!Cp:ϡzϱ>Ow<~u zc{N[( =_@"5z}X(]]L:w ?Q~8(gP+Bލn Ƣ?;ut]?uׇqgq8?}WW?)F}^#`9\i~:M%Iy" @ F|y'|$'IO"~Rp<96Xn;'sa2`?9hSh5Nf?898PSOd?P*BI6_])% %T}a&f3oAo|)A:'3vM)Y6C!g{u13L/w?+xԾެ>E=]5ف=O6;H$ hf-g6Hq:Ns9?'84 &-A+~Ot;^7?#hO;B}}}>~}ҿO'4 ƣ[-P΂ \?o2G 7ZD6?^>aAp\WAp`ćHD{> sGa/ퟏ 韅 9O. aEofagYADWE,+ ¾dagYYv.k?,&`/K%Xk Z,^iOvgcxE6vM~E6M}r>1R;_eERڷ4Zy)Cx9/vh'J;Ү+/ x`lW:5F7瑖n(-V&8m&~0>k?gzOAps / GNHz-kKʓrr{9_sE+_ZԎ̯.s/Q4[I?',PI -O?E ye  yUpFhUX*嫰U؃ ^M-Uh/K/ZOL+L'-4eJÿR\A3Oy_^TQyį&~5_MN3x[Vkr5Z[-^U[JV[{PĞR Q[lZμp<9̜9s{A-U_\x'O)~Ւg/ct0`ЍNWEiu0\WBh- "-Ÿ69!mh|d 3N@3Ɔ0wXfqb~;7Ց;tׇ83z#gOiH3ȿ#:^\^:^:+:w"ͬ#?/:w"-SJARP|eaHμ'"-x,OGOǃ3_c]}"dPC>.F~94?N0Xlw#&_wO44y:r̻}_1D99iJ3˄0;NHqןsA>a9"RP{zk|͡Gi=Q4WMՠ>>qON'(?=q<(?3X =>su|޸NyLO$KPey?t^y|:{Aq?E'(u> !۷wwA~?oa+g u5瓿W3y\G/y <|zY]/ s`?^z*/o/ h:@<@z ZB6_|9Ћ rZB/+WUl󫠸,(ЋbΒz^_qڷ^W(#$(#774 ĕB !zI_ک\Ѹ|JA.;W0R;Dr(2Gԝ`)ВXV7|kK+K]VC@>bWwUr]VU/ 2`Y0,_5lLQQ?UGQnu/XVUA~%˭5̃s5QnM[Sˬk ;z6g3rAt;G9:z39~{hd#[1nu|9] O"ʑ]l7{SkPߛ#\63od-1ļJo'}+[xZROvSҥ"9$:[?%c?B=?O3]ٴ}O tw+w,?L{0>G`[zɑzQ0;C׿υ%~cX7VO|+(qz<8]pAk0sGyE Ud*}np2qPMQ3S^R柄.I|>ط]=<}ׇ ƂCap0Q`<1Xp8NS$p8&3Ylp8+1l `?s[0s(0'S$p8w}l̑m(',>bz018p gsy`?f;Ǜ7brS$p68 gڙC|OL~!b}((?.9/ˬyBlϡ/D9o,u0ϡh`֕'-?1, UX׭ҳnEVq o;r&GNY+ہuNC{a!"c c"}X)=g`q`suGtouq=ז i j5$vEϧsy`a@;"`QX, ` PԃY4@M |-|R_-߿&%}K}\,Ǽ"}\տ7J7I8oK~IH_F2]%'.LyqK)w"{n:?vF_L?Sd>O3}fq28r{<7y= 6% Ud|AL7fe4IedJ_l<-W$;a,>ظ%`ʿ`qU$/(fv(n\P2/e ~ `V+U9b|xj'$w4|_ ~8| qa460NJ61kjf͍;dKd+GeqY-8&}7h,Hld$Jv6,9?0j{q/)Ę ?3#ZR3r^&?yL'I>L7$|&h.d| K2?1y\d㵙0yM&Ͽ&N*t18X_ sn4PiN|qBxfd9G2 ]f8)rˣ*q _qU᫁y5̞L/}tMs;`Zfdmsdԣ%Y,-.ʫr io `d#ss%%#̾MْMo3_sk uKw+lcNlk~*,(\On,_dLnd<~1s?f~-OYInfnnazI4l|\(Lc.2J5I~b.7WIhpY^crs1/(wpq7˴e~.ǣ_2=qJ1XǙ+$#==M'㼝|I8?2=Ǖlf|c&g7ɟSNAz EԾ{ `R3\/Me&[azK_ /x׷f owb^P)w%x@2MjVDZJPJ'w¬kz5l}W+L~>{֗y <^/W}XÏX   F{`c l6[-V`k l;H~v`Ohp08c0p8G.p&Dp 8'Idp 8L`28p) .+0 \ ~׃&p3~ ~nw7p/![0߁߃ $x < ς"x  ^?MW]M?)&]ޏq~~/?`5?fuX-`{0 v{p 8ch0 ?K2p9 A0x<Ogyx  ^ & kN9 9BN.X[-`$ 1`,8Lg2p+LGIQA<)sZsu4O/o0 ?C0|>O@z<`^0Ϭu:q3Y`6xП^8bfxyZ҂òL~c#c/a{u0.t , oooAt`(X ,@4A t`0, a`,˃`%2XVC\'BpL67X,`hA`Xu7Cۈ?s!\ 6f!- A`6gXmKoc >`3A~N7ht:ccLG"1 ?oK 1E+3 됍41l̪& b;.ZvA&?'2sdJnٜ} `3lv#>`ǁs9ےumcp=JnՍwE_ %:F!` 8.?~/Eb?ۙ~|Yp xv+v{'d_p iGr8xp-[2iWr68Hsp1{HsA ^x5 s&y? Lgm؟k3($p&8撜b6aff-HoBvɵ߿'3wy4QG s5d~[np?K`* \Wk/q~6ʱ!xfV/Yӯ;`-mZ oy< EŖ"yŶ2 $x < δU\׀cl5?-Ԧ% 6[ܒMվ9cyH{}~x.doۣ|_N1ϏRIQ`??8n loK^؂f"PC(E? wf[|9,>۹ oxlޏ-j{}I٘slIs9is9߹N6 pp9  Eb<K|.`W8j* m 0 `V[rzO]Q`?kv63 .~;=&Wd8|rA~s7|?IE>p<9}K/`?q Cam5p>P_"ҫ%鱂yXN L0ҧFp>Sk$^g%y\ [k&1J(;a.r ֲ"S{,YF!x{ r2[ث|l .鐙O[}K8x#f x|qCoaaw@|2 w1Kw%A9G0^y;o{rZ;;5Wqw utS1߫xG9Q(8ӡEyѾQq@OM {t6a* 9#3 l-y ~ڥlf4s.9s-aps(s3/'͡q~G1nc\tzg$ys[ݴ|ߗѯq~]6`\jxb<^E~WѾWѾW1.!:#3o-=K,Y_nYAYE364JYT]J;T[va`a7ʕ>\zpJ$Jߔ֗|]\la5%ϔ#y lci/70Oܦ y<̯8HG+7K[eve~ yi1*wͽ?K32@{١@ =~Ce?`WOȿC'f@ |\"M8KM:}`˙i`d!<' ɧ8n{63s33NUi`]Wy\40]2N!Yn`1/<؋yAvQ%A1K`ޚ*h{%I=^Zقs?tx1d;rRy3W-n<`q>?-_r+Fl3D>;i˒|tu "B3oPz@A/a<4.ߴBwVMoY~T^@oAx--󑜾3qX|X|X|~~mݞM󁿵Qo`1q8 e^3kuOWz$,S)yQkw@IBF7 ~'zlECFs̋$kb]Q3S9w?>Wpx(`,y\TO*2B`˹^$/x_'0F |_7X,w7$@+;@sGc?ٙ@/07$@| |?Z7he: ,,2AW+̯zoooA_qZ*`+b~EvѯE<*9R~EPܐͽ^=f: #XQaKUrs﫩߽$CNc/7|(-#,-x]^euv/d1#8.a$ǍtTX 9t' ܻ}t5Ⴕqxc@zV)y޼kH6xiȪm37uU-Kc֖2Lj႑ڣ`Mi.lbg6ibKpa?0S0R-Xl`#^\]{yj&m'6#R{׎(NM{AVڞQg5d/+^P]ﶳ*V;{n]h )xlC]b^Jsy`[}Z|+ $1_/ܯU)thAޯU5Nl4Fh/-} ?4/(b0j^nXX^aۃg  N'G,O~C7 a>a؇xC\4P{=4녑n|>뻑4 ޖlNHg 5&PB.+..Y49C'ֵ"r9V2^^\t=Ps.G.Ks1A0/)a ,9_\7\0U0]e}|2Ͼނ{GYdX9I}8FYzaCofkoz(R?0f)o=xS<_MD;ǣ}vNV@-@KR`-|HvY,-q4hh79F?$ZxIh,8!i:NK. `Gi-CSpcK8-% u-̲I8>GzZ"赼}0q, y`Uv_G\n+`)/..tQVd&OxdE1.&\`A$ؾs^"|sx?qMBNB}'(w2Qd(g2dϓq>OF1^ )g )o k k ]VD MMASp|b8)8|*y ۓP$; IBI(? '$P4; 7 9ۧc?V=؋u:շp8A.:]7^|~`GI_3P ?ׁ@=fb{5I 3P 30@}f`\@=f<30NO%#g Fj3q]i3AW3qis49TQyK^EoHA2:goO΢r߯Mlldz1~f#n6l?7y6l1ffc|͢͡"9bͳru!}^~^O8Hq^)_)Xw``z-@ ,; 'b[H/H#hE"E"EОPE0^~XihAW6bkL/Fz5I ǵXJNܥhX-TTǺ|U2o@o:eVY9~G ;xZrsg >_09{W`%+-~J/+1^VbD{Zhr>s|Xr֠֠֠?֠?Ұ_/i8OP4g΃4s9͏v綾}z7~Z#O1zn@FFǍ#晍8ލ7867bݻFḞP& mByP& oB~N4 o}!)ԟ۬1a%{ k#HqK$K6tInV1ϗ3;+972+o'X[ө^cًA{j&?HC>[v+SJFAӺ`4N \š|<qZ5,XT9isڛ=E=Xvظ!y k-~~i#`{S7N#3ViG=*y <:O~ N]Z\C?q y  ..QY?bV0'_F\"7 r;]pX=Ul(9%AO7Inҷ,xo{}C~nݖgh-ʶ~sg} 㞠'(?6| .4+$phy{Sg.,*+l#[AgGXr77$t~|+v}NXw-ba'ߧ,Kb͙70~ۜk1Jo!39Lߋ8_9+4tdG29Cy]iGpw8K8MGV NN9;x9Tk:<0#M{!}9lG8}8GTN?юjTo's: z9)3LpLsfywBJ9;0KQ~ FoS{/눔KSp"8?);ؙ,WpwWݐJI܎hG}< A=Bߤv EB3iZW9Op,y^w`*'UuFRG8@K>ɼ|ٮU)3jN\\yM_yS~TyQ~T͹QKrW5gYjԞ^bm̠1r^  dpW2%p#+˻MI.U͹\ ׀京scǹ]j:; ǒXA?`sdt|xl?q֡_+xZc>S0%X;DO|%9#0c΅MBvH97s>4unu%H[%[~a}"sc\4vt!"ѻ|ohD;y_oMsdso-8_ntkۀmixA>L9HGgL.( GHwEO~`,8 NLp8\ς"x  ^3_Ч`h`QX,:h&4 e`8X,V+`*X ku l[6`;=F`wOp 8CXp(8G.0L'S$p8SBp1\ +0 \ ~׃&p3 n;n[^Q$#E;(b-6*9O^[~» 9^?CFO^S|t|r;?CdE|4_2ţٹf7OKZexg?]Q? ԯŸ$_IǗ:e ~?~oSs]?Ec^=h?R/y BJޗ| ?_ 7D)3\I?|F6 ·&_#b..| OtUt#^w9׫o fA>gk|_ ?_S[n?&7>|57_[M)~W'w $O"/#o#|kk{ _3(|??|M_}&kk⟩׼_K/{)-7[[Ul߇י?k+/~M| HWA^>o&7>R~M>^^_#(Hʿ;GN~yG\ G~~ wuivO!|sO#_@A(|'_T/@b $% M~Ǐ%x}A /Sx_㵐˴>u/^߬s$27_|[w#jR/U|OMȟC># Lʌjpi Jk\~6|.׫ Ѻ/+^2)~ ."lț /#_QokorE^Z *QU>_9"DGkxz(%)7Ŀh/|-?I޼ž" }_[R*UW(F-oS_q6VħQ|8>Cooo'_o!-ˤo!|[GOIt<4ĿɗHU Yu}"ߝJYY|Pu}",]T'_e#Y|쪺>=uS]w {6_?{(| wSC#KX᫓J8^ j}B>]^QO;rG'+Z_?@qR?xUezZb}ZߺXknO~0(?w/DTOɿۥ W?7#?1~.mW!?HU"1TOm 6J7eh}xUo6*ƥ%|yG|G4źDUoIcTg)/].m'J~3i<ߚ+|OGDr:$'c).S=IFo ?M3&k֗nOr+_gz?kVEC.m[_HއWSrO?STw*|ySC-M'T W/S%Ju}! U bF5N.-M5?V&U ޱZ.mj~!X Vk8ͥ}_o(ٓ]:B&׫ jf E\FB~[ڜ.mj~!ďwmcmɢ~'|Cw("z'ͦQT֋nȹKo?-_jk/?v~I{ğS\S&(~bv'/!pG~-_VܡϗECȟ_?Ng*?p;_SVυ;n__P?[ɯwSn)s7^&o_ .}ߏ>(E# wO|4O'gş|â 9O _q'GQLg+7d?Q \:xܯ_Nܹ_g? >nGnފEP>Ic_(C~yq E~o)&S'oS_U>!WSz䯐FWgb|u#?_ _ _׃?_Cÿ->}}N|M|# bQoZg7Ko"<Կ|sES(3| b~m({Kk>\ Q-'[?oᄒ $ !䟑QwkkwrYn&G̾KwP~ ob|$RP}~*{~J |}@?I#yqugO"/F+| =]:V_> Wc^'B^_U䫑*|=ɋ5+|7ɋq MPin HLin L.U/?JUO~|(BUOkU?yq{ u~K4^տ1Aտq|_^e& $Uo^g.UWgɟ(_pLS/e_e_r$+ړx7L_v'Bi?~6|a7_7QHs?_̯~{~TOɭ~o-o?|OI]$ϟ//./v>n<Ӕ24^ _|W(|=Wڟ1U ERk+x~MSI]\SO!§_U/~K]䟑^+M+C~"7*|6O+IL>O_q$R)K&9T!E!;  Y w|+Ӫ?? gUWKЖWj\UU?E WP^RHCG"?*_//{E5_WGWUUI5X?Sq ϟ>}R>EoU1>s%ho)s(܊["[:ο(}7YR?)ϋV?O#wvkߏw'$+SEĿy5ً{2 '_^|^U|w{+$.|G??K)|AEȏSo笯//O%7ϫMQg7kߊ*/A+[)|u_\#F| &O" >HuےO |W:~ S}'h-oM~,❊"?m+| >Dѿ')_C NjSćoC~,_<.ėS%)_AQ>u8"J] A$?XSBs_ (GxȟC oY}CE3w%?ڿG^Ŀg7Wߍ|z[xxsUsķS/|AE3;*V(A>҃]< =Կ=|_.| Gy^s_*3|WEtGy8ﮈ/OO{{z}ފ5ŏʣF~a}WW(|"K{?O&>+|*ȷ"?ρ |Z>HOـ?G+|& x?X#aK Zц|-F}wk:SCF> ~[*q"YnF]3($($ ڛ>O@ZjnG6XE#S3(}'-:~OR#?Yuy/VM~JWsD#in>}'+Q3& D˟ q߽CE>$~}Эr'uPO~&Q>UK!_ ~j}F I›_?|3U8KW+'_Cg44Zח_xy*7&2-"'f_M>3[&heOU|+:6;7|,NL~>׊4Gw+w~~|* wW?~ <hڅ]P~=_+I~/柃|CO[[pzG{3<-Q͖?_kb[|=y{/ISS|P:*g^[nǷ?A;!ϫ_7E};`|s" UM~15H $<+u.Wө-rѾ?j}I~ ?bmO/F_|T/(>w;)4m*HA>McoH?Q(៩俀*;^+(m_E UyU\85:j9)~+]ڛy_߉#|E|20x_O%_ Gb ߎ|*&"|p?mщE"|?PտE^_E|yαZ,U_&ҝb Mо!A6|/p%+|)>(/ϯ]_~mC_27姒ީ;ȟ/v|9 +TÇ_ZQbԿ?0j]7+wF'_=IY(G7q\/ϢP]?|?(!_NQ+Hkֿhw'ÿS)@~?|\Z~QV|ATOgֽ'b|FEH~6G F~W)}C}'~wW?)=>Q) Z^M8(E|V﯈O!!?@u!L -WXhߏeAE~(ΏzUx#P??R ;4c8^mG|">/ÏQO*y(Twxѿ'Oc(S:O|E~>Iɯ(/毩 ׷MՖS)귏|x_tG7/(~b&hu?dH(~B~g)οS種??_Q(| 'φ_a~/ۏg||/%|*|~~~o~_>̓o~~5z7L3#zX U˰sZ'_Vχ?E_*οDRLw*)1.Iyo׊G~'wVnIGQ/o{kegGؽ\TP,9 aZVB,IjEakںҜb $Z!+u~.>{M|w}l=] oG‡0 NE Oo_ҿo8|O/:Nad~`p3KG~\3FX{@?A!/ b7_o<*0>ӳE?zLM+^e?oL?s # ~{o.Zf"<>~Pc8ҷ:CI?| p}?@IO iWς? xŊ^_m+<>ZoY<J/Q%K Ou_JtK ۗ -?5e> BާD=[U֯PLx'ѫ'~S?x*> {c1td-~O57_>~?Orotx}ɄwAl&xB%ζߌn?|!a$+3LB'ûc- _J<zk/江z\<0_ :z[zgҟ)V;sïçc||Xw֟px=TX?"zN'‹k]'ѻ KZK7~? ˂@./oOa( oOA_aTzO#MRbM//OG o/ |b?_Yiys*/yzcl5o?zo.@1BBnoa<7q| o;vi)Y =P}Zy0no0ߑߊE~;w~K&3#?A[ϥJpݙ}P?h!?Cc+ x[珽 sG$ _ ]_/Ex΃A负L O~/铔sU|Do|~ <> S|qׅ#<}3~ LL!2z~<}0?>OؾTg_0 WvaFIM.|P?v"g> Q)τ}5(sпP-b?/Q3R7ѿT}^&r5ۈ9?OïbO7J> ǚU'-ϩF<1ߍi_ xMund_bŷ7*~IXпS Sgop!?J׿mB>^ap0;gy_զwW2軅@xϔ/+=υOaqJ'Oo_O o2}ol?o:}O"(h[}!'m=f=[d_O7ygz ,8FOGЏ{ǯ/A?!l_d{i9zI˂'=~{sB\yn6\afß/=1#\\__?_Q׮_Uy?ޗt _G&x[u)rilǻ/>nx|,Hg(.| ~[@>~ؾ+ ^lB x]W_B1oO:oo`ҎgfpXSV=/1Ayd8+ Rze*BKؾ/nv֯V\~1Յ|('I z !}NY\xPR:>zGL~xz_Wly6x=iP !W'ٛ? qaqOr) 9D Ǜ x3y7ܧMo!s?Lg}X!}ɶ pSjqi'̏.S)OWim?D{!t?㸯}ow/{V8"9>7^r+ހE$xszWSOһ{;ӟ/^*&=پ͆/ O ?IͿ('cJN+l{~v?C+?>_Vֿy+mSOEWפǼj|4?࿮7[B>^vN>txU oM${`?<^u<?*x(||o{YkG txukρ?R/5*`q(Wb|A)o{7Zwo& SoͿ5aQ;Qrng~9A+/\  n ޿xjoOf9(L(IWbC3~==1<'2c0|?>>UOcL,}p}c:~k# }t}q_,>9X8e7dW% KmnE>WFo*/~T8G̰п$?=U?/1>BؾU'//=x'3ſ5lxc:C$_Ӆ|37ÏзHsoޏ0? O |,}tM!? l.a~$+ﰾW׀,5c?s;P6'[ӳ|?+~X?oGN/3ww~g 0w 79|e:)/4y3졟u 9aJƒ}σ_{cR A0/  ρ%~} ?ècqwa~[wLo/!)uzGa}F:ƚNŸw?+x8|/;  ~*x0|D)?߁7_/7Sz;LJ]N/J~+cKO'H .&Vx_i_?W/^_lx3^7=E!~ B>Ϳ)9AAߣg$#C| >TX?Äppޖ~MP|)=Nؾp /*ּ#?~l8o{#|~/ ϥ+]_DzL\I3#*?J:>ቹGK'<9>C ˵O?N:>5. 7WǚG^O>/ߧ/YOgCNgx|'>.^_ϯ!(艂'{+'"OW6}P߻?BOP\??/T,e}>jnz/[K|(}}~<Oӓ+^X3':k?󧭿qoy %N\Rj+aP.}†ݼ~X/5J"_+o}-N?/|<Oxofaw:ro}t~@OϦg C#x}xǧ_^oHZ`|)|( г[?_߳5X/'s{7+o}kCJ翿^Yh?^w 'ވ~#Y<;+xF #|=c޺߆OvS:+#<>L_φe"1?I11jE? m?>z}~aB}3BޛP#鍄| =zcap>)_7? Ʒi 9^(o&?ޮB:|K!|y,z+|I˥ha~D[p?")Dy +gNv+ n_%sӳҫ@.< {R _G<}gLwwr ,oY1gؾ+|OU vveɂWe{Hm0 |;oF-\Ϩ"oOm/9۟Tx2=\_:j_xWO#S07[Hn\`'?#wЇe.Q=\ _ɽ~yw##=f:lZy̏5L5 _^ߕokZO@%x1kNx8}M*xOPZ'*}D7Eg¿a~*|A6<4=o a|=ڶ$Y#_:F&}afdcחk?@_䬯SW韔(H6}?{_q9"З8}c;T~צ)_@2i}?JOίWQl*D1ZdxѺ_*=s}ckbzaJx'O7*gk=o+Q/h\YIva|FyL.:!oF{LQ&w2շׇo󠭿[LGgk*̏}Ukѳ^Qțq8+,bY댟?< ƿ }}|Ugͭ ~IR a~Յ@k|M~ޒ^GȧG_:||WW: Gr̥(:NCevۗ@~0Rσ'ӟ_}u19{^;: $g~bYO2~oz8RJ3wUi)l_ی_rwDױ{)GZ{Gk?e@>^AW>l/( mݿF.U-~{Y6~' F+G 俤$| ?}χ; 3XN!IG3ɂ /~>`('Ͻ>EKh?z0rY!cwûac|"9| Ry_WxǭR!{)> 0&e~>F/!?TCpO@|',x3OM^d~2>#}So&||_t'9~\l!GJ.g 4mk}]9mmXX?jl)O'K'\(+_/#Eux0?4F_,x3s[K{׭1˄ Ta|B/Wb+)Jo˭5+|$J3ٿ~歾5?gY7~^F!7oCߨ`6)t5G7 gs6U x o`;G¯ҿ<'kw8tM}xwK?O<*}ҿ{_Jߧw1~o!;c? gzk=PWN1N 'ҏЯ:dxQ! O"DŽg y3c~洟H]? DѮm>7l'xWi#gO~Vs ߗ~^这1 \!O_P?M(9뗤{x./ x~Egt~y> ?ORג'~ Ae |: NC΂o7bv7ga~&ӛ^2}~3!?lBf{|zS?#apr__돔.xz}>Džoc?6Ia"_%ZX"B>Oww<@"ޥ<`4e"*6k1p>B_> ۗ o2? gG"?Rh?> g3?^as _F[>tGB ȏCOOg~)y9~ 7 UO< afa~5_>_Z=o0 O~&̧ _BI!Sҗf,ȗk{)_p|z__.ҿw>o ?U>_DV ^5>?zY{^YOm_/c7 Oo$3Ep2[+D~uwIx'n'n >f| C~.?:}_I? n!Xfgg|y :k|N<| < ( o(wrWa|BL ی a  [t~^1-gKW{_Oe쿗s¯/#_:ЁQox2/\(aOG @K\x.=F>/<0o x#zwt#Ñ^ǧGH??< Wd>x4=SQ{_' ?F?Dg|bIOTSHO>]? 3w|3}fŸDYYe gBODsw,x;}!p_ _%`&-7ƚ/|kui# 5"Ixnl?8] >c~,ng2?/<2{N}R=7.cǚ3'/_VGዱ*(^wJYXoKP)~%! J-p?awQMxv~#xv~T< w ~!x|T;?j ?9i~Nev%/kז+Fx#ͯ3nߕ-||{_+o.=ꥦGXо5> /?oW3x}!3o?uBxx|?7'i|cS@3Mφo7/*oѤ(sޢ|W+GW8魕OE;B 1cJk'Y1OJ~6)g'i6xcia|ͱ? Y13—+5e5 ,XY`q|:ք  o ʄ5  EHccMWFXMDO̼+yR%>235=OE%|6<̙m|T K{ /*/ c <ޗ^sN(,}-_1/ͭC[Quzϯg~Doқn)ეR>/[Q.#o9|G Oǜ ??x/\8E#lxտc{B!=1B7]f+qeZ/ѩ᭑ *ˣLDm}$7{?De~UYa۟,?9acSk\_kff% + !H~Y߂'× ik|\>F>lɆe sK7k=no  EwW  ϣ 5?  XN,dz~ o(xπ?Kƙߏ'-B/om/gH~]?pק=SHWxx ',ihuOӱ~VoQ[?z%_dS@>[Coc_Wk~|ǔJ2ߥ;wǚ7soW_)i%@?#x7~VϡFSFaqnww_R2㙎e >/O"WKk$ /OmQ&r[?h65~:|9؍Xp _7||H=&('/,Wx|&%U{/xt+(>L'A]೑/)iyR U}_Zi%|1eAq̗e[wz9wD+ς7oWw^AV?+ lNJ{++`>|Dtro%lOh)NGXzu3࿡{D.<֯)of:zFVɦ{8Ӡ>ȴW7v??ی|υG&nt9 oM{lf7s<> #tͷ/+zw_ID'*~>>V&s|85k9MH"wѻ ϣ<^Ga;_<M)x&P%E̛+ VwWی>TXr}҇ σѣ[zKJ H%]e|d}s~ߠ}{}D8}Mo,x>}P? ' {8|?')>c鉊ϧOV|=}?ѧ*~>M9TNx~y~~'᳄1~?[eJg(\  -3PX"i_=n*_$3'S_8ǟ+'/Q9}/@_Dr~MJ~羚Po(So%}vOͯRji}@uP>w=iiB>A]N~~0|-oYp|%~S7H(x&3&?+x:<FͧlQ֧mߺg }|6)ϠOoQc?8۟u]^[yɔΟ{F^?G+C%x9^x, D"QW( ǚ?Kxp/W(W'kS/3G?x2]k/(ކ~QK_VЯ:-<1I'4Y?ו;zyhG:/t? Og<>~|kOJDLEş{_/=?|ueԼB5ԯϗEm0yt~ gxԯ[$\1Op4#WO-|}oq %Bggxlr}7V_oz|cӛyq|3ŷR-ZzKŃAw_6IDMrqQol+G/ϣ9Q,97b=T?]wU|6ݕ!lviSä$}\S}WxP_/ڼ* >lAϣMGzҾ/|>)#ODvQJߢV#[)| ?_JANtxj ˄OB&(Ϫ{839>|(]ORπ6p~DarC铥wxhA?EOU?Ӝ|'oh[ƙ}6?}7__g  K[9JK+[+DO 'ç [h-닔Gs0 B~&_'3?xL֗HD_*l_Yߧ/Og |; p|WKj\(sKISO+Z_|g $쿬=3>3c {.c'"C6m~~Gw L?“i } GQ_ |/x_I8~Szt~π/Dq1o7C!2ic'G_?46[(ު_]@M~WΟJTS~d̟rmQw~VMS~yizVL?%%?Zhs+􂿯^|?JS[?O:p[9~g6~i}ǧKB}*;~W~~=ywZz7O/x.xy61~>N>߳}}?H/}?>s~6;[P^x*BgG Sp}) ~B@x \ԯw=JS!x(Whmk:{PZqHM/8>uon_^~ҿ.Ge Iox6>@7S6|kЃMo帿s6S?c0q?/o?n6xr|=b? Molz;ŷ+?W!KɟVł"Sr|?L]i;}C;MN/[郅 gpߒie`>#XQOx%ǣ $xG x}X{>N A_?>^''(J %>Iɗkg=Q?SOЧ) l;?Vos?V_. y_'ϓ֯p}KOx o2/?e /T֯EJ~5Se|~)ϗ ϝѿP@Ŋ0D0o6}~Oѿ<^i˔ý\ۙJW*gRܟZ̟l=Mlx{Zu/c D,}z6;ؿi!ڌ#V!B~m?wѶS:gw _D-?%}rA߫)[E? ? {QC%+b1^ECپ'Yܟs$?17OJ;|1(>:߫iQh>y7_P_(藄Š+ee}_Q|r}IOE+ƙj_&ѯ)~]]?no(:tSAGE*ϟ^QA> w)u>~עϸ{޶_L oG/^Ax9I/!OBKަ/7CBg< WܿCw?WG~ wWt3 cP4~E{X+x)<ސ^_YJO荔K7_t_LoЛ C|XYB9~'W[ 0[?i?c[ {zkaO?Co#/ 3?7#C{FL[=iz{?IߝҟP0|/Dz|ݿ?\EV_  /|?oyEYʿd0oпn}l=)>SY{)۷Y>JKp%_6Jz?%ߎ~b~ݿoBM9fsY~>?SJkOQ|;̯> ߟ3>o+/<~A:?__OH%a+ȟXISo_Q8/>xL~<X8Ox_]*_Wy.tSQ7E* п WĚN}wh@/tGK8 F/:Oo@JMެ>?$M𙘟Jݚ/?[S=-%OR?ޚuzeT2~M)ӟP7:?BoOW|I:Nٿ?21w 6[Do91?[řg]:7wT$r~*>GBп<hc߿MؾxG>9$-a՝SaG_{EQ9?uQ߫ߥ)2~hx5!due~Vy7_=~MC1+w}֏T|}>TTz2;HAG_g/`F*^&& ӫ:? E~r4g@SWt< D o[Ps艊O(oS 4ūZ^QlN쿗)3~8xK##;>F>O_O+bu/,To)/ ߁h-zJEdx>b W苕s%3R[пT92eHO0>%\y_ͯ'x_Xȯ_zmoP|?}#K߬ܿ{7N}Eߦxw`z34xMoW|};[L+g}ؾ@>O ȿJ?ߣQ֏9B>ǔ*&SlTRQ6Jpi{|3B>>~V_0|9yegz]?^}t)u 7o'+.xzYώ[I޾h|% ~cmC-F$l?kVeWm"_WپzJ |%x`O3ߠR"xCṬ߈79SB2@CMY}> 7TCB}? 6\x|> ={G|~xoa?\Irbz[~\SJV/5zS?ݩ_Mo;r|}c;)RCB> Oc>.JݬNѻ+|x ? Zo!B+ϟ+Oe6}}(| (izҿוoч(ǸwaJTÕQG+oq}q׿~|e1#ns|-טGBNy{ )7=D~r~3_ л$(/~'f(h3GW*Vh ۿJ YQn&(>}p~9_ӓWڟD_K苔N'Sߙds/w߿hE_ߍT/O_̟O_91?{+期+9Un}g8y==M~){2}_7 S o'=9fK"W,<@|jOՔo}f(7^~~R?^CŠu|h3wQ_D3uO@z'ض__ȧ |7tϭ߇޸rg:Co?Jo&sZ翿sc[y?_t#Y<>FPxIi0|"̟Dx0O?@<$x&_Ps=1C]Ϡw7zzwG=[+'{ [?x4EsI>9~F=r}kԌ3GIJ7=J /#r}~=Rڿ ^xeߕ _ ߐ>y s3˽>>[>IOR)^r >[i?>Gsd_8G_x4޿+ףlϕ x,}3K_N_功l_\{髼M߃諕;}2CiOoP3FeoR=]7+Z[oMVGҿWֿ {mW:ߡ/Sg*{Ix~ޱ~&0>?Itۜ OY`Gυ`Et_L?&Qg#?T.|I]i4Џ Gk 2bO*^wS?J>g;la*YaË|" k+4s-o@t}o6 [~=12M̿>*rEHyPS9UbU{'ᡨ_:pvqߟGNt<ÑK/{|K{;eI/w*WjT)L2+8c3s֗kJT_oB" ~?x? \lh&χz؝~ e|?dz-k;;E#)_ =Pzpܽ~JWg7Aey:3,7T{lhzc%D_:iUy^)AS|&пdb'/)^f(~?]y#/xUw=G)=J~}_K~zs+RWu|;D%߇>IɿMP$zR}EI4:`}jg(=IߋR|2}R }+Cxϫ"_GOo3@Xs~*/mN#~Wק9?^Tbߠ8޿Tz %8^ZEJ6ѫ(t?ŋaՕk*7赔?^[dzs]w=.*K^O+7r}BoPqsz#ϧCoL/K-MэTқ)?MoYzKXR1]IGLTSΓWעU!JuHJށ3d_Z S{W-|}c_ZϦݿ _G80x_gޝ8?O7:cCoT`Q'#Dh~|Y-x|:}d§_r৙O\j笿O‡'ҫV' 7>SrSM< q!?~?GY\6/dO^)QKpܿɄH_,o6<^?_~ >^i!woXmC}ͳ;O@ro;zqgrH,J-rJ g23rĴ"Ջ3)%ΤV4)9%sy֟z=}9 ?Odzpuq>G?7u8tUG}+7v4q5o>qJO8L_ o#~?*7/"vc㻕~\x% GVglw_Kñ~OTIhOu| `'("sJyȏaD8 ]^?J^6{ةYz9Q?MGO+8<^_+9$pyãUޏ^wѫ;|6Wk:Ʒ~^~Iu_7P<~="B_k#a ȟG*[%- #_@o嘿KZoK(立_v_@o/1?/g _N7;97őC1,8zWGꕷ͵?ѻGW=#.|>INB:ո^??T!\EoX[VL1}}׺&Gk]zJf["C{~kCK09>q?@S%רbTG`~;WQJ> ~=|0韕߲Um>1cn迏>yS8/Pj6ߎoOR Lѿ6խW< h^G5l~c~Ot >>ɱГޠ>űOu$4,OwLor|1m/:jR]?~_RLwRF(ˆ/\6?1 +'b~/g!P ;| #,VCٕcJ_';g1}ßg8zuK~1Ϥ/sL߂ÿg~yw4'?8~O ? Wh?e V+6Oca6Z񹟾;<79(=Z1HfF?]19  gow;CF_u>8C+o:?8~_ ێ|c8}i8)'J,o12Vzc}OLY9h }c4M1ߗ6M߫xпv*ͬ?kMV,ӟߑËߨB?"\?O1bRo"W6ǿ)g/t1GWo7:!sb_e /~uE=B[J??E1<_{R0_}˷ejO;*@fs94 yzYzWGz%׏ /hNzxCNrvzm~,Fgq~uo֥6__!~?{5pIGGwY?siA>?j_|+Mo-'PV___X?/W7 c~#wLnx_&|?m)wrl@_U_=0(^r]SMi?,sC9ZtxK9w z%^|ot8z?e0Ls O8mpxe~:R`3c;-?o`Qυч: 67h=1P0OwRHc|9Q?vwzãQΟ@ }o%2~7ӓG_ }':)=q~uOv];oSS/OsfxCE^>߶S|Y'}f' }x,G~31jl~rA }NCQyJ>>>5g~Cë; ' W:K^RMDs.6q}H 3'O9ߋ^벫r/>Fdal]Hy헏σנVA_x!}}#v1 Fcο4zv#9|ƿ^g}ͿOH?owyz#{8| ~j?d}?FG/ [t OOϤ(/^7DҿS? d~عY${e~"{,! ~Q(?8KI#_'rO97K~oGI?-\/83YFWk=覱ce˿秗.o9_Wp/Wr\07WqԿ^ՑBI^S<[^K|zmG p\g#%;Ct:%Eo?Kovx'1Q/mܟ~>Y^qNWQz{Y1+c';;|:W9|#j31?1gÿ_㘟bzWmދ=Z?N.CΑ~ b=F1unK\ѝ~m8Y#A>߸9?[/COpo>Ї;P>o}~>+鉎sc5}~~3]~IM+:^OpިIFBLTOwo詎_g?s_':| o;_ w~:zk?#?}G8zc}to8uL~=J[yvY.\rޝig?sB80K=Gu6^G kG>cK^ ];C\oX?&C_\'[c)̟p,'~gS%D[|l<tiGg!8Bn~M2MHzYr;?AJ~.=~6z&޿&ҫ41$#ѫ9mk8c~zCWƟ_|_K?oKcRFmO]ٟ>7s#/wHeե_k-[97/uzGޡG?;@oK~]^?sìk~ zŃS̗8MB}183*aj^%_sz ]~?"L wu? {(G~|?ڋ8 Gu}qߙ~78|<{;<~_X?_:οz;w~?&b~ч&Ӈ:79==qoW#F[]%! Z%zOя>ґ>ʑ_AȿCO z_1)~~{>ֱÃ~=Oֿﰞ~~ـ+Oola~sܟk=-铕EW g)}Wg}[hr[пkJ2/e3_NO9?Llqw*u COwx?L!}Ï /Sj1I)fVX_KςtOo2ρ_TO)iƇK*J)!|rU?Ŵ/^YJ}N䇍J5k퟽>U)v}S<~3=^lxi)&po٠x.Ff 7&wOO1MER0K|v}nV<|7[W~U(PgHEnrMM> 6y>ё?__+ͮ^6o^xl>i̱vmg\mwb+`?7jyv}?fO1 gw͛'>dO7o9̿ܿ_?QG2? O~8<ױg/?l1t?T9h?p?Ŭ[X߫ԏϥsϷR5|F[?b/[l߯_2vwWv(6v8&!m|4L75ohXyfRJIëHO13gm /zo*"3ż0o~Q< w/WYbvs+,v$x~s;Y78ª ~ұ?χ>U|ɱ?>H?jxg/Qχ?N?J_f_ɫs"irke#~;z9G/WpOWtW+9;M~Ïүtԯzp@|/MCOc||׋N-ܫoT</ѿE_,>G:yPr |" )6a7ኧël#τd/G* ߳>_R<m/G+}LT|_ޡx f|9Vs|9N;ͱ箦VWR/I>Q 8߫x<~&(9QdO4S/Igex|s9^ϟ+f qT ᫶i>NJܴ>(3Ŝ) yKM>`8~c5y~>˱*׵ w4m_O޴k?gR?fw9ڿ>_π??e~m˅{߿υMT?䃯>J?}QFZ_)bW)?>ZOqoۂw߅_J~AtgoRƗ _IN_. +̗~¥_vw=WX_W~_WO%Ɵ??\?_A|{z29Aϔ̓'O/|G? 7_E~+;1}5fI LrM騿g89jL~㙟s\%_1"䏲CJIf{|i?#UK-1l0mSۛ]xC|y9{;#?r6~x#v<;H@~wCsa|G*+Jߧ]__d}h?9u/K?.@[f6<{c?x8L1-ğ|>w̿UĠ~C3;)O'(O ~ c-CO!?/[8=O7B[rK|wG%z>ShÏ:8#){|T<~)[| *Dx}EÛ1+蓔)zOGm}EwR?y?S?Mr__ r}+w; [~Lo>qޣiW?c}Ew>slT7}' +_D>]| *]d;_ȱWđH_Oї(|xq?h9[Oc,s|r|K0+"`rT{'Eϟk4DR?,_O+F5ȯP|_okW)7>Z{~E'>j*G em{o@E}IϙJ}~9GMX法_П雕|dSc7U;E,wsY WJ> >RߠRNw*'|WF*wyHߨ?xZ7)._يG]3oVn׶PO~ u{m߷TǙf1PR<[asQ<>/RC?x8Uq#;Uq~S>~<,yWF+¿~&r='4O4_zW;EocgN1?U/c&N}˄>Eτo 1emfeC_HѝE[9?ѯ(n1/S6txpcQ?~;7+|=>&. (v~-A_ʟ+{OsKar1?9?hF#e2!/_?yJúxy[՗J?FO*<~~ /rTŽ=ޢ?%zgW)_3_ӫV_IoS0Tmj=OXԏ*`CSc1q)A'?RwC>T ?1_r? b~4oY_LJO, |I GD_JC_ύ?)cȘiu͟bhxH~|h _+SͿeWCDkpޒ~>e“7.0/'˅ߙ㏂wheۯ^.c5/| v G|)]i7u˅@1/-` '?7VққM/i*\̟</qx{z+C@oMo+G/U<BR<#~\:zѿWo;DL:O7slxD0GN[ '-} {G *|4}pcA1-=}Uб$'C_Zqq]f=K}\Er;1\߼x܅ןD_x>E;yx1|$eG5Zb_y&|^{_;#,CI/wSW}y] ocfsG/.gd>^!g~o=Ѽ~*^H?IIԏ.`GO  C9;g|˔ЃaO]]iφ7WWS|zz=^C/޶|f=&Xϧl5JW݄g?NW?~My X1l/+~| ~7]dY 1ggJ~@/_5liYofB>" ]? }2qD>U|>|!xsrewS<ϟ+u|u_AY_>F+£%;8o0OۡK]x!~+S/a}׵ÐF?OCמÛXYcm|sуK/oOD _3\/bx1WѾVL߀izߘ%;ҋ鿈}? k<^]Q_ay}Q<>~VO`*W)SBφ/x><2Wpaf'|;r'z ֯!<5π/_{3ޒVV?Bm*G }ƣ~N/KϺ/" _M+Hƺ#D}30`ӓDҼ/{_NWx:=>^DO_2?YDi“)y#g¿| _Od3OVj=EAJD<e/ӟT{kEeoПxπ/kE>,&W< eM1%=£n_* 'wV< >>x }w|Oӿt{^s+c|x -~뷈(bYN×gӫW X׫x%=X Dě_x6Q1ty->sDT"y)3go2ѿA6)1_ޒ)[q~ۈ|8:/S<~ޞN og'/lj>[nuC#:EIτ'bFqCPy'GT ob[ Ѐ>Sԏb>'}X?G#sX?E>1(?JRx =~2꯬(fҋ7: U7N=fLۊ]/헠*v黃%?'_qV1wu0J>D _,5K%L+T ? 5G0_^M#*=wOis~oɟa71ѯ>7~(z1>OG!>҅wotS b0!e=Q/Û?x+XQJ?WOe)LtSK}7pgdy\;>6Yɞ_cW)/^1j1gZ/??I7π7U _0=[x=gXߏW;M/c}3/_߇yr1<`8?ir}з) eZWޙ?ǯ,Ώ<0O@?  毐DiBowjл?W-JJBLzuQȻ?M05]r4Ӄ$OFJ%!2ބ[/>̓o7O!_?79dX_-ꇏ AZoM|oDaC/ÅwWOMOwzϱ?t0g"ѿ>>; lHcB_E}h?ng§ѓs%گ6g&I5D>^lOW7w}J,S԰# /fȅot?a^~K_<4J1~o2lw~7=ǧC_?o,|X"O1?/p}('\1X?95z~STz|i~~~#>wD>]_.qo3'=8?(ކ}8M8~| } ~X?` :,t|(o1|l~?`&oVqG{O,7_Eowt166`k_xyW"|=|OЫ MYЛ 3`RX?Io-_.wW$-~#w+Ɵ ?V}؟=h\$azyzCq|bPٞb>c^ʡ$=hDG/|>INrh/x%;ӛ.kç{1wG~C۟s0;,;X_5vO;__G<3w2?󹘟}~>\{~N}4B?} mߺ6YX~rG%_53%MD#}V"߇~?}>>>Yf}N =Exg}»#Q|@x91^oϔ}o?w>eOуy+U_APy{o_'/F#P3T/})_txJ;D??h(-Ex#|8>/>N~o7_A<@W<BsD~:<^- ?ZvY?^??X]kGSM-h.v1`תz>|#o/eiPysw e#mP|/KoK}b|K O@~$}>lh3艊ߣU-7̽;|}8yQ<}ҿ4wgR7Y(^AOS>>[I(}\_ӗK>![ m˫>]ۘ wIwѣX$ܫ o?+ƗDNosW诉|i+ۅ>ggy}#hz!]C?~ x}{zjw1%`~}zWU>:N rjox'*^ޢMIo%y,=zke~{m|4/Z{^7/qUޖQx]fjMn2{V ?_J3`}_+<0|oq|:{oRqQ?Ni WNφm)?o˛v[Fh}UQ#'( /k} Q'ïQ<~;}i;ݥ 2xYxm~'(?BO׿hx֓yՂ>Eo~I*֏>CӔI> yKBO׿py3}ҿDPo?s||+/L׬/>;?/ZO'18~~o?-y3/ LÛџVCJG~*=cP}hs3G[_/ꯧGѷy{׷:6/{-vsE~~M.1?y";o+ {> Û|~W /{㋆ y6R? 2>y3m߲D{ /֘oDvgBep ۇy6Xgҏ{$/‹N?&?/7XU_Khp~O /so]6o_8L-rŸWPLگX쀹]>_(FS7~U%FjJ>>=[dzyܿk+yjo0+ 9&|~>Lg.GDW/]c[(Z__p_3?OWkwTWΊG+|dO_xzW3{_o{ `>齅{ϯpC̗ãp'/|xwz?Nχ?@/?n7{G. ߬>>X'›҇(BU6>Ps۔oW/Ї)y0GI!^STXx!|T3E%NJ6?C?SEޫJ'|3 ~-?t_CGzN2b пL?˫ߙߟC~j7#p,k[Yb˿|}oku_§ O{Gg韊Vwz'"yA9X_m~{hƏ?<>>S_!OG. kSD^T%Kḩ(|EY9|0|;px:(C詊gKG?[OS<8li/2?O~XPGWoSCFf}Q/ ?%lQ< ~/6O+oygva~_P<1IBwW7㼿P<-ߡxo_W<>WojLK?yi=ż?RV<~oT<>~>&zo}φz_7)_beoG[>Hz7+>?3 '}8y #D;ALg93zK״[\x5䷄V_Fπbv>~deÕ7GpFlHr;w+^{/wOQ!jx嵭S|'zeu+> "yPk0I_:$߄3pukG?i ~՚D_!w7U>J/O:!/m~~#"w._wU aG~8>w~;V!ߓ7bE/k{>@/,υקf63ςAυWjn>Cwy+'ã2n+$WxQzȯѧ !Oӧ;FOY oK[0Y_R[?Dku/'uSz% gC94f8<\iת-19 ;Cc >Hn_7q~zSG7wx|Q7#?1=^U^ѫ9(k g<>WՏ_"Yw>ihW%uCo%8[(|S<4ED<`>0'ogxT^w ?>kW|/JϏ23ϊ y!oF3)"ϛg-O.ߟyQg&Go._o8|}[]i|+̿ !1nBG.z^{^P7|tq|#ZLhmh Kn{>ҿrj^FB1c'w8>'|t|=bE?)]ESx%= W{J:7^=_ 3O/x9z39JJ>aOW{o*׻p|wZOiz 7Yd{(-3БY# pG?ѣޮޅw6_棙'_$?+7Z2x:|1|sWf0_û*^_Mx!8[ݣ3IxOOkO*5gNσïW|<ߠ~xx4>8.aQH Kok{|~v|{?{|6>2xJx~)gf693 ^>ݱ^a/E#/|4J37 EOoB*| WeU|E_p?}×Mor?J_p#O_v%h/>grq|߇'!Y3̣b狓Y|~rklOo._9?GA/"ߊOkߝ#?,'»a+}C f~zVb4A~;B/wOПo~40ü_Q I:?6O9mzvxMOwo?y??P?t'`~Q_5_x|ח OF"zi/> S}4G?~2glNC/]U*_|(=ƑLƑ@ѻ; Xw_GΑ~##ۑM|{z#7#NȿMGz`GG~VG~!}#vG~?}#v8IC}]|Gݎ={y|v/pQDe񂈲 )/ZxRSq--$MMCYtSi++*?Tvú?C/[v3gΜgULx)[τ3sksVOz=׆ V'+^'Aؾk뿝ׅ3-篙Fjɟ7\?Dk? _oT~FZP/qSQoabVgn^1|~&o7]f| | E>0S~:~Q 7ϼ~:]}}5P%Rϯ~9>\/`~x _0~ Kbvx¿f|7ƿiaۼ;{g|4gd|'Ɵ5/Oڢ*R1ß3i 7Stq3qBq#R?7:c~"xd+]Uc_L.d,Cx6 2W p oΔRxkW0ooǸU~K}_gݎ_ >~Džd(|3x`|>| /~ }=_m_h!ƗY3QD70 3F{1G(94Ʒ]:Æ_UgPos o ~q?{$?k6{?G _@x_J>D_E~;0^C\-ktm|/n߂r™mx"_FeJwxw ;B:~{Fϑ_H84E&_(:Q[óQnsO~~͑R!o'wlN15] Oa~?dG4?m`Tn^K!޼?~;D3_G-ڿ /Gm].-?[Ϥ%:o%4:ؿOo=Z)JCF='t,>#/0$|h[fsx[B7=\~~9υ4z}2t73 <2北oe|96k3w0F'}Pv&{txk 7?Gk(,m(' 2:$㩨?x"*|MCy_ڟRKTǧxIoȧR2M~eWjx?0V_d⯀nk䟑/5?K _axf/7|W121~ju _hxGL|ELt_([o߃j<~}*בgkQǭUOLφa7 7p}[p$hw 5w=÷>o7ܜ> ?v^ǴoGǓc|vEc$'cqf0H Wr;Բdx`)^t#bYɺ~f| |ļb-<~s)O+Cyw0k/0|>cȻSOF|Q:J#s{Q,:# c?2hezçw~&GF˟ >I1I?+~$YF{hD` 6x5Vx7ýDd Ol#2j6G=}/|M`T~y5si; 7{g 7_r7]A<7}VA^xTυo2<1=d^ }Wo1I:XC'пjɇw4$jn }?L>|[h^Og?{)~c`|6?B 8 ?4!?,o!yG ~(WhcA"!o'c/xJw+א_ mᅬZ ~bH5axӜ}{eJ}ɿm<~UJk?txÛ3 Նo oğ'=ciZt֞dlRl4LrEM$ķ _M˻.)Lgx? Ocx:.3 xGƧ3cN  _au.a߂i}N~ g:+1$<ó; a<\&?;ރ χb_ cs|waaޗ?~.}=1#_ ޟ_ d8|13~>!L/`/dC>\_&=|$?>bx!|43o[ި/': 1ƿ~_u3}2mS{`2>^;_;L1=qTaϐUb)/x57~=7G/?|.;ßfP1ۗvn|`|.N&{w1^ {$^bL}Lg|2of /5Gnr 9?wm'Z#~ |-*÷3n־gRɋZ$2#jx&]?4= ^>D'g O4o=/?TF~0S `y?(߻JlEy?X!~#kȫ#va#>)L|[4>Kx1yPo/ΆO _MӘRpO7g;:0~Mbó_B[(_U5BB0HO~vyF]@~7Ɵ$_Ma~a!ؾL_ᘟ>>*q?ӂ>j_gx]x~"旆O'~W%&O~\Dvo# ~0C?~}}Oqv爠SyLeLw4꿔_ϵgA?5AQou G~?7"}IGު0#G !Ë+/~/&f/۬ q͋5ć@oWSEa|T0|0^K^?y[?_MǼ3>Qn?|h *qBAsf]:c!?, ,zOC|K3*nCX瑧Ω[O>V7w.aNGQ%NC|Ez~G_A~pF俄))Zs ?In߯Co9[ L|%wq5]v=ޏ:Woj~ ?E~?T\P!3>|?!LK>%L~ү7| Nm2!~'W8ȭF?X~ [Z;w`kO^" >3 ! 0|;yB_mAY"?["=G]%?xhI1#!=_L^ oۯED0fx* _C<Cنw^!?c-?*@p#~򫞯# ȷ!~h/J`9GW%Tc~F|"y?2_kxTH, .>|90^Ls{)XE<yאN`2| :x}-Hɿ}=#yH}[Y?y_:>_A6#t q!H=_ix7!}W^0<uגOGar.=Do|E7LxsowdQx[=HTSi~}HKu|+ /&_ )S?Dk(Oh>cyf6*8??bnEf#$-cY$Z,Bwh%e4ghc|0OW#btvLG냭x>=)**L|=yT}Y_!k^L~ '_א/3za~%0^@^llӍw|;^C*c#o1*O+CdCPhGG٤Z?<k*n9 )p'F6o7O#_&b×{x#cՐb-0ב__O]ja]->B Gq|c?/|bq9e~ ~a}x)v.}aWK;N~W;?^!"mZ-<~o!? Hl*wwqOUo~*y??k  C?]#ϯ;zs݋?'/T~^3=Ymf\G}@ۏEi'a=O,hm\7G;WPƯ/dvx|qW3~~;{B1&2ޣV)Ëxe^s _Cc}I>U{n_o!L)w036U+a&PCzφ+R|z~k_w3 >qK1 /e|eς3 >s>>V[1~2 _Bg+ ^cE2~ ^xAŌO_5~—2dφp2Ƨ×3~+7>ocE_;hk?]k?=Wen*~?w|Oj#_ m1;>kw|e|1߁?'$ i51g,wŸ*31~|;Ow0u?/\~] b|mƗay^=x7c<? r?sq +_r+n1><>oh|哋(|oy7u4ķ6|N.AFvywgBՌ+C|!$?t/|YB˙σƔ?~|eUi ?O ёY7ﯾG߹?aܟ+Z,5?1_-G|AA>w)6ouaϤSGWI>>#L|1#~3/%W_&~0Yaⷓ/|Bë ?H~{aAm}!]ct?ׅ!/O݇Sa/W-˴Gi-μ>+*ĥpH@"|ȧP|,)CH&>c&~0&~ ?Oa\|_:=gqmqo}Z9?}>ߛχ !TO _EC3~b5Tп k]aLOR.7?/}}|37Tȟ!/2_e/f?I? /a꿛U*r#~sկ:~24o!,}FLu|_iԿh_VC35/u47_b~*WQf9Wj1BOi;È߇x?ſLHL:MJ~ᇜ(o+Dy5ӿ_'#/f^^ OA>~/&DO? B SgO70 .#9I~o7S~1?c|0?> O# 4?[W=oj5n a)q!pBߛc5>˿g}gOzRs_ ?~Cfwozn ۩}>MO73y_07Ӹ>VC_GC0~|1M~{OS-&|CצOuIGȷP_?3 G/W»t1~P&x6$ɏ#n?p  RjiEqa|#awa~1h?ђ?=r9׏ :$_x`Q Q5~#{[:> _soxx5=5wd3!OlY)(2K[WrOZJBsWOlS-۸Do \_ɌG0P4ofMx~O2~3e_/hyf}Gޙa?ct|hd|(|W9!"JJC^ _?ٯ_79N7 _䜟EӴJQD3L1K:sɟcKWI ӭM:%'2~&ӨWלOz8a|{(`~y1~/2oon8f_ Oļ֐OXOs ?~!Ϋ׃Ky OJ|5 US;{~q~! .x=ب>HhOɷ{Cfs xO1<]8f<,p5G'-WFٕi;[A>0Rx7_SŤ\]~;e+kmx-䋕bNjqO]$/N4,!8v&E.lߋq~& .k4_? Z  ^˸70od+|}c/2~| s/10*{11|;;?q[w2 ]w3>-Ko3^k{_1^ 0~!?b<OxGAƻ?e?3G?gR!g¿`%K_1~_3 2013{O`<o4όga\Ƈe|<(c|>_ ? O2 og ƿb$Osd vs1>~")O[φیW]w3ax[G1! 7e?x 1ie< x&=^//'0^ o"x od|Oo$0%<#oxT[2OcEOw`JxG3]N? x-,_wa|/l?weGx7g1=qg|0|/d >k_`HwG1^x|4Ga"/O`|&|"K_ {Ō?x 3|2S~S}O_x|g2> ~᥌Ob|>匯f| |ks_/dq/vEw_9kbbx5_ǭዹ?zn[×p~/?n_ƭ˹`rm~;;?|%ɭwq;ԥUUaaܛ^-ڟo4=0.k e{g_L~ >οWQ=csx:]q점}jw]T)Ƴ(Y#*Q-ǻGU yӋit?O A/ojQ?RP|Ƚc+ryF$j<{Q~1ҟY$v:ϷE"3}OP):'|.?qkwv۷w Y y \eV/ℛ:LeYԶvYcJUoR42GB1+'y^kYPbOzT,1ډRlÔkr?i;땱vXK0(VG/ɲPlO%cuY )|}-ڊ@K{(=Ɏi?ʼs vdV>w;NL 丨-D.o'HX '3U:ѾU<+G-{ Una[Uf\GG5rFߊ|"0L V-C(-.]xlK9ƉXw7ӎutNǽʜc'Q@}ʈT:X8jCMא^dQuf+J|P6Sh(=i~ڒmeǩDw-$wQt|lh&ѪM&hm/mMt%ނm>"3_ K=r"f-+t;ihGJD/Z)Kx[!OKh˟DzyL;5?XvPjzyJz IOsөynmAgV9k 1>lޒvxO+>O| <'i$lO/-tL}M|I-#=EьT"#mNjqtM_OKrMX,>W)6$ ё"RtBjN 5jI'呙Be !D.!(wYo&Ǭjj1XgU=hYUDF/Z oJr$cGڤ<6idOr+qlO=ʝl-sQcMHs}MEZ=y^1"zwk,yjkyfJr5 D;KA+礦**ᚃ{6rO$y\4<5<ϣiǝq >X~"zB1q<k]yIxj,h.BY/뀋jH \{ro7u܅G7=I ۾ȋ%":EnF9B>LkStQx}Jw{|Jo>-VcIS2?:gQKhF薊Iw竖jIQMc!/ xN->foЩ1?h92Ӫ1NKk< E&5!yaG+n!zG/G?REخkr.ieHū9[sTK2#.*1U]:%RȾ(K^)6/of'SyTPId?xK-)KӿuM+,9 7ւʃclGh )͕H=̝#ݎDkۅyBwu>Vie8=hl!eɴ m5ym:5gݺEE&R+^W }ln>gS~)V*z6B!/"-^WDg+zuz'z+>QmW+mn02g,Ǚwbr\tlsD&.Ls)W#cX gVnk:+mh&K}/Q=;ʨZgG\I)?y+Uс=9zF8Z`vv*HG&5 T}6Lt8uzA/l[T}0y3TqT/NN' yy'/9}[3zML]ZQ/]$nuQ0m7JqfP\ U͉l:Gk?{F]i,=⚪-Qx)O}ul`lSy\;'4gq@D~}A.Q-w;CoO솑HQj/璖߼/ǹ6 E 裡}.NMOŗ=.9QERǫk(^icU,|ϗ'H֥tV9gRYwZKc@LhHwķs9G96ʐׯx'&oo"e4 x/ӳ!.C(RsV%_u募` qN!hۋcQ8yoɾ]$韼Q_pF'_B->I3Dc(Zoj}u:׀Kh'{v+jh7g]픹y'ܭԒFzH-Jg%y{U$okGu2VDZcRU NGlWNLp\o뺀ryQ[՞=cq:bRU?Dp*]!qM҄t9~9"^'Gw2ꡯF=ʲvȞB9ukY/xu>ubFqb5.L">v dK)R"QjXpXrgSz;nq]ߟ";F./!3ǜI+iӫJ4k*+Hk I!S}rxz=ʶ+nF9i<;Z:wLs$<7Q1I @?--=j_oٴ U7|`սW12r)}q5W^+K_@~:d땫_d~ZN?'G&hDzr.>|!o6'8wL8g?p.9橆ɍދ 5JOs4"Q _ 8yyF]YEjVqxk=0}ޙF#ug:i3E`4uվGh1cg|מy2*i*-BܱqF}"F4.s:鑿ykgh?Ѯtdvf%>&980m.2+w}=F~=B>~Yn}}9˫8F#ddQ*W+jNY~kJĕ׍szm?fjR:>˲gM30_JsMeHbJsOvhJL:a*-b:taKTZtq MSiQ +KZX3pL>JY]B[IcDu|,fGJ#+f8燺\f7QE:w5߼Nkxx#sh拗w5"GTϢmݜ(xj9H/Esv KTF]6G6^xLXsvsvvvTM- _!mеn 4"׃QTI:8s]Oaf t.{TU"EQ0\K/W%J T*9}s'}'Pm q~5dovzhgiT:뎆w]-s=SEV3=6κ"pMHG.1׈\b>a5"0澏لYCmFg;.Cc\Cyic(>(:=JS6>Wo" W1oN;]墬v? Jg]a{YP8Zh.R% W[#gWފ*h4:'eMl^\qŸ]Nc.t9FК:uP܁E˺ZnvV8n֡Srޓ$.?c/ۺGuK~U_gݤfigǣ{zϧwKf:$+N]IuYr4ww=U1jG9yñ_[Fm8m2u> -W^nҫ ^џj;msw%Am3nQ4_#Oj#ׄѢGyM3l{:3?\},yrnO//x T9m$fPklyA.-s,o%vv@J \/Մϛ|Vnuh]99tNoWѫEnN j镛]1w~}F4CzV_- u> w‰Z.v87g4cyfWR)t\(5oQz`j |Yi(W0㲇G,Z/sъh"+Ӆ\/ :"hEx'],2"ɥ j˲P5(^?o28;ͩ>1y'X{~cjBs&KNʻ굴RuɕjuQczD^D#R";~"&2%R#!B {6S3S}y=ewwDLl>+u%JXNx|\.|աͲݩCFvrޱU":*?1tmR->4kSꕯSꅽ*ReddrtiY5C?6!U{夷椧5\itfӹFcO y -2Ŋua ~֨#گ uMZʲvk^꽊(Čyeidy!={pZc":Ylro[#Zdn:/3*o>fj{~yʺ3{zK\y?i/#ҟ?1,c^gT]1ݝԟww(7Պ>gFϞVǸGKow|6v,v/r" D H4WfPi ~'ݬយ~?V>^A"ÓOmSwpS]/QY?fMW.QWuyeG^RԲ`jZ0uV05'ZLL-S SgSgT}OgzVSJcռ)B UExpsB:ӿ s-Ztrwc\G53.Y55cSۭ |V@s"""u(/-3~k 풳.nw4jB^]rZ*rʝI|~5/ ^M[ujU?S |_ˢw]}Z4U+Z\OkgiVIMTNw|I*MPqBϽfS=Oo $>TZS)b? PMi,;#K{VL˹ {bx,{hee}nco_VQ*g6ѳiz`. ։gQ SiXt\v]e>yѺH=Yen|\b KR6dPqlAw8ųnL^K܉"Y`[[)ٖ53<3?Ϸ'©^ QgrY+ƌH+sUtuݵޮoNM1/OFX eOY*Z_۩4P="#>:1/Wc|h%O{з^h'rk-!_ qP1 Fii#TІh>m-ʽud?ussp;@#νDz?G'Z9/Q@hAIVAF˘2Wjr6@:ÎR)E!1C<ӁuHmJ:cyܻRWvh5"sLPZRKlJqg2PvrJ\ꞯRt ]n߀7zTywJ<1G=/yRǤ=)EzDȳNGuT~=f̠V!{djGW1Y>*?Q.8(_=IHcaZr%i$y_th=Bh [}H M@o{{}SUvץ<XYPaӹE3lV;Ѿ8\"=|}v A/FW5nrzt\K%͓y!i\3gSXS'Cv?78-)9 ⨏K5K@)tJj/B^%l?ɝ)Au^ƚܯ^( 5g2AkL.N}%*̯ʉN[V$O3Y}}y琴}suZr\z7+|vtGs)߳ζ_y[^n8}g|9ic:Q8ih^wZ$hdTl\d%HLӧщ(_*D޷_5QqeRqlFxz |ξ:g_~>_kfDUk=q?xb qRS}Da)1ZD䣻<H+8gYs:Ltޫk=ZMx5ɛ߃wBGwwԓֺ=ב?go-}#x6AX/oWN } ]1V+}u[*ͱT0c{ggG52S#J%_54|]suWkYeh_!(Ԫ@Zn^ee8;saMMCSﯚNy7zl3TlN;j6{U綩]Y\aZZ^z=S! mbF_&)hq99:p0d;~Nd_MO+4eK9uXwNQ{ޫaiE۹|avv̫;}ޏN[vM9;Fޗp!)3&rޓ -:BdyL 6~J53yk|[[ #}=y[GU9fPځr/ MS#Gkل8g.0m2 GM6ϭྷћdsp? .In ~s+n$Y)|'Θ}摕V;;ip΢?vO|z//$/s".O{n2týe8ѓUSk<=34š}gIBN Uc/AxF4SKy,X^@xvд\ϥ qʞ޿".Cq+CxAyPrԃ=\;KzP-zieny3JJ36gޛ7{]An9CQګ3=TC&5r%6POlhS+\sy֡okU|Q |%Ov=pOU^tto+u4^c>Tv>jAbL5QT]v*$ymhװNer޵=עT_x.zwk]=yC+U}%F4WzKgoJIV%)uܡ5KPe³W5gw=9 9}},u7x} 1Dg fm^t>Ɗ[=0LvUN33 /quz37ruĻ[}C~&_72'%|/? s Cw_wQϹej}qZNd+Ɋ 鲎 p-pN|yn |"\ 7z=79uZ`fvy1oo罅sV~ f>x9C7g8<QC< B]_Q_$DAD>29mT@zHoL-?Ms讑z97P zfh=% h a܀v~h(f0KMfe.>Olxu{+5Z؏,m  gRE&\HEfl=r5Gd7K[Q*C$KOD\Eե-HN=~r*F1])3*SWI=təjք( ]aιZaU3)ٍO*]7}*U _TGjd/;DʟVunB>tZs`VR#a3 ϤPG4<3:4<3]gqugH:3u!O=~"F1iE>.҃׊lxK%-\Tք?Zw z4, <:uZJ>mLstz\HS9}q=x¹u0d;"}E ymٞ8oA{)pQRdMkJ+YJQx&O#4l#'d)m;A-D{z½5x(:Dk>b߅ؾU,ݽju)ʯlLνi;#ϧ}PwO&8za~)|RQQ7C-rnwtsaj}u^̎[u=MZ8wapyD/ydsGm, O 棟)A;tN6>E-݂_+)Ô}mxQ=.R^ Y#y0ncjB+fôR**~.oZo'Ί Yfn%A>I9G6MmeZ9\|ĈL LF&) =ȑ+u#x@J=@"dfָ ph8w8{R$Ak7ifn9`4R, @=8 dJ2H72HwÃѼЍLRA˃A9dir d}=HW@d2jr4r Zk } }\y㙹xtB渰9v ŨѾj6<~WH!\CR:Y@Rkf`ǎ(?tn~.Fp*xVG.Zc3AhuXQUa?6ԶNz#h姀N%)JiZiRV~?VJϐҵI [RVx)i+?QJCڙY9P٢=3ahK<($3s@Q(?5KVȵNg6xC;nCIPm(6lJ %چlCItj J ׆kCPZm(6RJ ӆvLDLD;ShځPPP -(Hn[ HnYDND 6H %ՂR I Rl[ 6H k 6H ҚvWZNRk> њ_ &y5C^MWy5A^MWy5A^MW SHjc!&ȫ j &ȫ j &ȫ 8k䥵7B^c!Xȫj ȫj ȫjXDn!&ȫ j k,5j ȫj &ȫ j qOڛ \ > *S7Y %xNkYhAZNے ZaDŽ&XBv'I" 0豦'RQۼxA&@3Yh bo<;fh؏p#:td.P@я‘].C4;B&\ vtSgU], B=(aENEm:r C6+}tzq$0U$AIJceM`DE"eMSk,XA. @H'y:( ua :MhZ'/,"8!kM뵰 oL/H ;;~c"[oIB~u";_e`+D)Mۿu~סWwmɟF"ߗ̎o#Ew6W4;VfYwUo$?8ta&S앑㶫H?R֓FA -kdKS壾lHWn>S(/Hv)>oyPD++sG$[qmX()jU'ͣ"Uv*bPmLxF"G{{:x1ѷY"hխto%iҭ .uÄz'S8߽yS#8cpVwYoѽ6şt(ޮv'oPu&l棼3|Ή:kwQVk6䣙~D4 9a =dHyLT]v-H7t|0#̧㏓%ܞ`퉧Dzpw/YwJRcN-h*kE5'~D<ucѱH)L~j% -0+ISe|0.D1•ЯVRJ%)-ce27|)a4Ҕ.Q3sn]Jʏʬד;v s}K ZD\h8{rѐe.:68P?~e;XD5M*HpJN"}.iΠ~0} ,z7cX;jzY5#`[$yVj|L܃k腳$e_Kjr\9/]Q؝Se=}Gcވ4[MS1Sd ˝#'D}tF#p@ZT{zPޒu39z/%Sy'mU ==oYAvcD);Ў(b ;f+f ckS*q/C -^;=?OzBF3=I;jYwwc<0uYrg!>r} 5d>3 }FgT*gt rF}Yݑ/;G %(Mf0Qը҇wً@/rzEG~Cf3Cnÿ /^f1K>C7O-YleNna4M}R]s jnMh1,9ȱBK- bOA-Tvzlc B;ZA;U;n~Hvz#n蹠}p/C|($(`Jw>mNbH!jB+gB`W)w|JP_LJfjuc\Էעx@z=*gNNeљ((GZDvJ*:eڎ2 X}φ?o}1"ˋ $2}}1[>"Ԥ˖|ʫ$[K)%H4kl_V./2@AŷTWa zp^pEdĽ7Iu39$5B$Qˊ2_bST}*)d5wj!Q#7Ćk!Y.$0sͣ?ƒ2\-O_@Qxɲ @m;PlK+FD†&j|PF ?"܈_/~ANX,f}X{Br ^#[Cc((RZ+9&?Q_v- J}e>/B>z9DK 6XuW+/5"|@25S)DIO9?Z A#:A-=BRtGmBsdN@J7, ׆~E_(hBѯG٪~/vRp!L a,款p 'NkGk &^,&]JTdԍ,آu羠>DEܐO%.ʷ2cdp9bLx6!N~*2WnS54e]`  q|_yM;4"qs:Ih8YXNX"2d^wjYf`Bz_.M2HZhзY].=B Dz;h;@:t*ht:聠ǂz'h?УA Zz h7гAM%%Pf̏>~5+kV 듋lZd4#6A>~_o+3"rTdS^íkQ4j6'{1b21~gt냫EQf~<'ENB&}K4~獏tSz^=8R|)yjxOow#N2\Mֶ;E]oHoqzZ:J{~VvĠtSomcmaSK$:K'`6πhĹo? __߃E; t3{,DoXZf}p@= he4 `X"lšz jbw@b3gd@G6ǁn"jPz:#$gWjkHB4>@ ~րz &;akF}dxϺc^':9&ɹ9X7>ɉ4*^Ȕp{!|%K|}/> l]ȇ4DŽ%+{Gtf5|u{C4N6&8HMPze'/B5 }O|$QV! y+nFDyR[6RrmuY0P!s9ck[j9.^[ZzV>@\r PvH)dV5ABT́E" QM2G6a m<|Se\|C7nie.>g!bΩ)򑔯UwEg߲ +1 BDX# ._Fc huP4sV b}!Z]OIEr)Bܮ-uрfN^-E)~r=†( D1kN{A{LbؠV -7E^*o"/֢=@>:2HDa ;fxϖP֥T}ӥǡ>㲂yH]J/w[d3v0v2ߘ9;o"Sx_hY{+(ggç0{.\,c#B7ءM=P&4Oy V87碏7>ռ0TW1ow|><{U(/ ~Nv+rJٵ4$_Z<ke~FZJC/[tF&'} )_e)[X_\Œ;{Hz_Eҟ*Bg|Է(-q2zӾ"V:vBzL@"Y;Lm4bcWi{.x9f]R-A;p !*$eu,SmI~ǁ6ͻ<d!M5o2 ($X\d#dbٶ]6RzI«A|>/5Oё専)]nױB{d|(_?w&|hE3;!@ڵ5)%-MiϵEnSX( %vOxFĂ2˰yv#4slHUG52Zj;c Ӥ5sdUޗ:O Wg8vH b\gцbތbNDN{LqUz4p*NZ}H#Y868HoaaR[Y٧DJ}[jf.UMos0K>*}!wz({6AΛ~趗2xi6;233L'+"}{S'w{rlF>!R&,:ǚz1̧:k^,:"˄ &ZCT*c!˶7=%(Hsv\[f۝#Yl9jXڄe9 v66Xﱽu/m(m؍${cneg7mzF}toYap/H_{-p½:"N)@ݿ92bxVЅ]W]qGρc 8δ~"AC;%WK34θ_gB;eW"یXdǼyEfb;f+f ɈW]1X8ێyUe;uW"VK5QwPvuk$]jF=Ҟs"(/3Q~&/"(/s;M:n>g B 4HS M49HS M4*MuqhcN<&A˩EL6bdeH?_h]lk߁xg)3>#ޔyBE+aԃr5eCB=rVoe)vΫ^93emL<{swUF;qgu%9~7wd-+{W[ |{ѡνVhoh<{ݚG+n#mnEnnfC|UG/we9?9Ǧ⏺э/;sԷGS+ aΐ}o֊-B4QMng2֔Bcy]ͣw⬆5lO1{sSssL`i*o>FnvXe*=97H#d85dP6Uruju1*!uf8U5j@ǟj%@j,*ʙՙVm{DYOϐO=mk(CWYΚd9pO _ n𑵡>s%'s3|B8y&*oKn\5m]<3l^c77oZ|dcS|q܄rߤVIu(v=еRw@n&ҵ[I ʑөWsRjGJk5{d3fkW 娵i3U52<9`sȉ}>&2.2ݧ)mz]&.p28\wp=~ppp5pp}?@w\n0\. 7n(0zpÍ 7 n4Stvx-gހ'Wp} {So ajZ>p}7t|_Sc={} /$m/ ޹ zgWf ޮv;@ kЯA[oA{AGA gПAwez3A9>Pԯv@A y!DGA1@7n t3fA} 'A} )ЧA}gA}9A}A_Z +[@렯蛠o۠o軠"H+6m~臠~Ǡ~ 觠~9_hTZu _~@S 7!7i9i gyawlɮ>yU N hݲL[---------{-w-s-o-.oZ#_&g"B:LFn[PZPZPZPwZPoZPgZP_ZPWZPO&~n^N>.XJ sщ/j^2PB9ODO|CVyR(BZ(S]< 'ZPv-(Y k"j aSZwI j%Ϗm/3Z%fZ|0J=ϴz!n{ӈ{V(mŠkAQAQ;@Q";AQ*PLhPN|2(J(~ (J)>%ҊOE?%%REoρPPt<+RQ2gK@Q(PI(<EėR/Eig @QrŠhe@QKAQ㷂oEou|(zBt!0`Zэ M\pAsdg5"boyc_ROeԬm"mbdHȐ#CP ;A12$:@12$Ȑ !q (FTP iA12$Ȑ=ȐFDa5)kY٠1K@1b$b$H -q(F͠@1&.H#FFP[%t t.(zP@'>&=pPӁN~!J,D=qb(zę @''N&o5\DG(osQV4X/9T(xSMaoiM M+B7[o_r~Mu!Ǜ77V󴞦V?'h\V{ jtGrZ>~!4ţyַƅ|3܄tZək;#rF[kޫ{+%ѭ rk(9>lZsZ~ f՚_&5S-GHuU1usS5AR}WĉWEV׾~e+a G-V̠Udɳ)m';):DmhCe$= eַ,z5 S4Ca~M+R}O?~*<Eվ 7WWucZ'3ZC;L6~ZDŽ)T Qf\оD]r:zF\kBekTy σHH3ᕚ ,C_I\?)7O c듐?yl}r'!{]rǖ%!7zlYUB.Xc%n]UB{lr*!JȽ۫cÕ{c<0 c+=O c5.y8nܡzB+< <{%$QBx,2ciNmZ JHcᕐe rUHc3=vX YJ@Fzˬ,Xf%d^.!gyr6YdY ΃2ԃ0r;zr {ˁ AVAVAf{lr'&rfr._y@ 9ȡ]V`5Ei5/{ᗾ7Vm[woT茌O4Id-YP܋{?0Ժ"96gQ7B=YVea?K纼 A p5hAI-`zԛxJi &sፘWm YҘ!+) l? k?# p`˛WoU!5^`?6u;o}uc?%"Ek{ނfwoݑ'CYu5g;lW ꁐe!ˮ͠s쩕kAٵ=*W^vFWZ e_꽗]~?lXa)ҞA4Vkzg5ZgFjd}R_8f6*5I*} mr:S*_#SOW"##ʻWyՍiD\n| 13m*w|p~.m OzZD8{J%oM C^~L'O p=Ry@L` dRa!},wW W,)s;{;.Mڳ {[lJ-`{Ӆ -`o7u:ǁ^Ӥ=۹[\ٚs_Ҭ/r2bn.]_.y`{{΅=d`;5(l'YzҞ G~_O.'`G۠u`M0l0Mg7~p`}¾VQ׳ {%b\~+`ߺo} Wz{v`ml;Wmvc'ꄍB<;\v/0K>uq7P. p `ˁ=žؓ.I`'{܅=`OkS.)-6ɚPcGXsufkFS(kC?ņXst!j]M@*>].d3 Ys+/LWR'a['uG :+hx7Hø n8  .+pO+ ZKV-;nmӖe wXapjq*,o/hZcpI!j6k.[ܸ l=H&%$ ֵN2 :kj޶{?_r}ǚԸ"=5Q,@At aSm+)4zL:̗ P Xo<9R(ͱ;--m)Ӡ<}EFB2ug3A6&_5/tA6Zt.WRx?ƪ  x J̸Z^+]=]IU튣ڙ.ߠG.DYd Z o{L 像\z<+Oe1stk^.|/k^]A*υefl4'_ 55D 1i#O*7| I 1A>WK5am!2Ƭtnp7Tx+r/HƞzGƧ?ML'/-A )KFGԓ# ː?@(.304U)B~ H-V,}I[ C[^]pN_es;(/TG 0PhaFߨQ[bvj[|-UU 2}#{i-n)o^viB3.X26"aوȞ )FA{;bf$hRX$PL2+/_Ƿ Y͠p*ڹ!{7{"fvOXo_q+{;X M:H'%zaug"gY (7g!cY͍ Qh0z>{T3,`0[]@9xbq@ sB 9 :0x}v ݑW 놾dEC-_s{J_2BT=0 l^% ٲ#wJ)iPLyuƩ]Jv#Zs:j_ãv[ɓ!ޒ뇳5Yݕ9;fY"2ճ|9)'||1Sqկj4˱wjT鴊qcJcN|Gb_g},s|JgW9^ JkC?49 Qe VՌ?'lc^Byg+ugu͕k}.̅f762\F\h \h.bsE\i9zfs\ 9zR΅BN~1ч¦B7p1AUO5 ~`]7.DSKeY\h9 p%_*HVtWJyf1>r\Q:w _^H͜<6H}YQ'ޒ{mDo}нt_rlS}m=@.NzӶ1PD'd}1= Z>L쭑m̚>q#k|[KVOVRAsԼ/2 p=#V}L0[[JYUvF&1])_Q{ Ǥu6Im7jN7d-#Z> c--<(cކe{W ݐ+-@[$Ϗ˕@%枻rvr Iꇲ3PX}!L&H~tO:G3~*,%%N'|?%?oG|Otiaސv mY$*}_}u`QYFgM,=G_y$e?Ӽ~1Cτ>ꎀ>|3 J~ /B4XM1wcQXBWmi:-q+8Jv~_W3O?++V545wgwinV' ۓuQ+A^g+~63P_PF=ћYb0&UjӖfN17n`f] SҥV;js`{"xۣ7jnq~{^q4zgGWQ#믥t6΅n#S<ӣtrtRq̭tڔN)QStΤQYf:N'U*,}Ʋ8est;KzB1- {,s>ߜYO]/s^z֜uv]OQכuî"'B|7UwiV{GEkKp h:: YZ[|kZɧs7z>ϱ4["Sl.oU}Zڷjb0S46& {yW2v+5}~|{QEw_,: n6U/G:ypȞ""SY}Y1͓ x 9s0Ęw>#[<=wxⵦ_{oė'z{'x'~{G'~yG۞ {Ŀ?rw<?}w=''~xO#O=?՜3KNuk;b^֥#20Vj H~J=~֓{'&g|_yr)'v:fufgnN۳S??"gղ|6Q=sD}Y'']649N]s]ׂ֋ z&pYF,M\zV YgB`\J^lE-'n+*qQNʯ=e7|W9q//K~_ÿ_/'slsJf\+Ssd'd׻iv/*uZmc!LwDdT2S4^ɣ\O-]W[j9,,uB}FSѳ_k?gf`x'f8F5+kzӺnu=U})󞘹'OE˳r]Y{~szGy~3f}{Uu58ٱwp^wHfWT=C?OW>MןW8w^lRSE͝t麩|-٧=P[ܵ|#,vs|_id7 HH iU#-ʐV5Ҋ"(Ҫ=OosfZ xAݚNt^s&"dj9K{UvZx3eC"eb;5ښ0rI1pVYfE^E켨_q`qe2.b)\k i${9KWvrT\Dr~le-Nwb}&xjb}Oͺ;\3Y3GpgPE7almVw {LޓJ^R52){閳tۂw .W;j\=x{tS(jb݉篤Xpއ#ʆ녔t~$pgrp#`+%RǣUk`]\ceL/SH y Ą1Z9Z#Xj }>>wd+$t'}>}(Ȭ_C*KAzb~7{otQnEd`XDֹshf[3ш J@@j\1yyQ1[4bL4qfeq_ϭ:Uuj;uZNA ^Cr\#&t{K{yW}/K$ꉓ%kHvrqBiBiZ4@c@$ Ӥwlcΐ%׳Yg9yL7H5ui:122WiK̐o<Z6>ڔg9'^kXeĮr̈xeNNl#qI2"Z@r=ϙX:tBN*^=MՉFY4PU w#RzֺYv3Ԇ N39:gl98QCC>] On.3K,^-G=ٹ -׹Zr0x_mltk 09#AwvђF hPwښ"i˝eY2g$(pwJmhu7/*EQU1v(M>h򮡛ކ82I<)i{.Aj.w: ?yggF]ﺘuwrCct0Ԅ7|j|F+NrVL!Tޘ?_ttbq ɭP$b~[{r4C7lq#I| la6͋%?8.Дz(nɈ֡\IsB' u|:e+G!9mQFZ)*M6F o`́ܫl]4 sۅ]?z3=ȍr#CK;kbd$WrfښI7Jh @㫡0nfh˧$u5wĶHg90D6˜cQP7"l9BmZ1g̾<rcq0 RҚ!/Dbr6netQoACClERqOm vm26h}3+LkDEBZ:ľ(k~b>PW'˜w%OSI-l PV=6C -~7A)o:+.t+%U.YgoN(y(l%K>a!6Y=ܩ;;Jjuώ{Jd)RqKK?z.{ h?"#}ё8ٺoxCWн4C1DO.% B!2!};ˆ]:nbC8b/b8EC ({D; ϑ2Oyr'< !OYq<9ʋ9! hU;Xݠ,]T#\&y}dhhi*O-ȘiVk.T.=O@-Rsm:0yX+E 9'DQnnwCaRqvSMVSZLsiBPg7<1Ƹ;n6N`_ .fz-L<}uq ՠtIa.wIxr3V[. c{ *j2dw ~x8awA]l4<#hS+GOه(r)BpNrkxWЏ>^.>FvcqYPD =cK@MX qRßrZ5Ws}'OB+ty湶S vȝٸ{~S c!Xk湶Q6J>-IADͧpL[XBӮ>d?O%y|9^"l")k}C Q[k嚱bhB6%~rM91..S&$NFIBWKm 0w+sQD+=Cj]I;AS/he]̉]P-,{^A >`uP6i'}jLkOT|*\rn>`b1om<2 a@B>faNjPs,+H9g MM)[Ǥq6b8hЅR[[q}\tx2F7~!`@}[m06N 4};[=ߒgN 4·?n( -2GBh }NӃl &^Edv6|ݦo 8Pf!i~L-$dsUH崙2 rCo'jtJvq/ӿ[!8+2|K?z6hAo N"F^|^ؼn+4H Ľ~2qu#o;}L$/9-{'y'e:IL>M٤EwXh=/^khsfT]NN6bWhɎFpD3N X3vrC_lf3S ԋ0e3%o1GѢѷBbOϵ:r.Z9y U?A(jY1J֝QwgTID:F" s;E_حPB(p %X-M52\w2 ?VCzlr_tDVO{ = FmgXע.?֩A6um>}xP3di[xRzҗHzJL9/ѻtfލ.IZ<=*;q%_;vS;eSq GJxZ_#|L$ eY*;]pP/|y:vu'aTom3{Y;}t GZ+5ϔ&z ;XI>R/HNe e5Q\$$ܝcF#n֚ }lnDĪه0mkw^TB9l?g=f>wlN"hƪhWp1 8gas9 Xz q_ǜ."Et2-%UG׮?ҋ+ֻ2}- 0h),S]r!}A$d,}4  [ abk}1V(8ϭC7zSO<87;YKXot>v8ey3]ׅX_ۗ8rA=J|7ֶ5[g~WK3eF2Gdwzm;E/rw&e1() ,'D~©}Kee T}סEq=yJ@)@O#v̉7lz$Bݷe;@B|LSc'E4>/lS ǘFA2g02CyR q!Sk:-zG<.<rgB/ j +j}\ُ3d {m2΀^V lfk|\lۤ{g=H!1^fNJſy?9.%Ľo10[n+rI 2}̎@,Bl &m?Ȝ4Ssbs[5=fn2IVs[p>;Lp- ם*t@Ⱦr&ĸja|>*Pm፮ur[]sDcfb{dhwЅijBhD X;@V&Vbq"@E@"k!gԼ&厯!e"g8#?ºW Z?̀ugW{%qW݅5 z=dG?a&TM9)l?cŸrҞ3<9< /[ʱѤQ&d;M a(&=0v=b|mhJ=!i <@}^eUv&d^[˼?.FAAɜpl:iǫԥ_G7oB]W|$(tE-ߍMɈZ&WyBsߑ.cӤf=>Zq>a=lߙ;ϗ҅b>(s*҅%T0iZ/.a80< څyeHy{<@gNy n?{X٭py(пO {&Ge7~X"oD)/(~Z>̊EC s|C#Nfp&!/qlmww kœ kϋbxE:X3 ݜA|1y{\Gxk'ϔooXl[+́)y{ 㷔n}jևka?a|}S6҇=Æ}aQ>Y6ć=>G>$ka?a'} ;͇=|~v{ʇ%|O|X҇̇5}8;ч;}χf^au>>Eܖu#i%I雄85@y;Ew0U S{ًgx~y=g(~c='$)~?{~ {~/M@}g!gI$^w/1'y@;<WNkmT{I) $ЈGWW>cvq#g; ^={fV?`h[`s Ps vC}7*K<`7WC&йm5AzT[=e]e a__`/}%m?8m^!)[:ۃ,'~ɿ@_lʉDJ$o4ʐ gm?mw5$eqEIw4X(X+ײLQ"oJW ɛxOd) ȏ^w+)FU e}Gv]ʔ# {A=*zݶmxOx-2G-9=L\oEabS4ĻW=y26:gtϺ[u;7'7ZI8RHtX!hbWX.o =(r,#aDݨ;9"pfkFn#1.d@3, \ )Kfuf@I }WU ~0nk{8<tQώrjCN$WEn25@'ai.q?OceZbW"ZlDAG{ YK xܛ_+{<0[Sy/Wr"ܛ> c?q'Zg˽rǎb~^g7vKޙ/$rO"$x=e>q-_cg\¸̜9yyb]fK̢-@ G{Wߖc/ىMm}Tw^kUD+^9Vr6)"*Orx}lo^}$~ig \QV{6HϘUjWZ"A3 @N~PSN|gVg?Kݱh:ziO`|7,x{ez关<;?Uk B.Uz%TY7?bi?ei8Nڂ},>xqk̝흹N2-;WBE+m2o&7;f{K7[~"Rq.t0 67 oLF}B]Z}BoU@!\.F>PH7 *-P7`/}I@9ZmMoJd[i2KMr]i24B9ڢg`泂gGw)?XwTEw^xpTb8W{pp4S lFq~e&EB+ZS y.#`km1R5o{JEZ쵃9^c:Ͳ b#1F/|~U d/K^ 5ccꇙmo 2<=]7&1F2ZOKhur~ߧ E[hnV'U%LV &iAIZ}@Ъ`VV0IZ ( &iA!.iu+*V\Ҫ%ZVÊV\Ҫ%Պ2Z8߾SJwJY䷯ P&1?ieҳ)tԇ Zrל ^Uh=/uܓ_Cu38ՙhQԕЅ{ b:+v,oϕ6j>*Ûˀ_Zð=U^(yLc65P6٢ N&l(ސNJ-Ó\&J(x%x% oc ƒ2޾; m^~m^]62j>{O3h6rdž]hz8f>χO*2~p\$$'sW]쇵A[(gwj'p&)盯Uvpw2` O@q-ę T϶UW$~U6~ 2ф3O 4UMs;m.擄4ls-˥VR HA:Kʥ=ۣ=1,'{駖vYumAY/|S|0d\V%\$xOP4s,ǔSΑYTVΓ|xcHKwi[Þü]7SSV ^3*|nY9YXV5>|~|^‡+_CsJg^Zė{^b kO9=Jž帒0IN!Rg _rW^ÓsR9 _K ϯ5Wԃaxlj7Շ] +x:/^?B0ί@·q-.67_ /~/lY [@hlj|sqGROpR 4C;zxSGW6!VvoiwX@yχ$]T7|HC-Ҭ o 367;$ke;΁tw4qttս$)O$qҽt4t@FYJs7̓9넟 IkdM_o!_BCntොlo,Z>~ySb{)֌'gto0*`xtT]b:zZy~X?FAz{,wkDWt)]tU  J{\Eg}QCRۧқ>v>Og3QQk@Pϑk_a{M>_Ym$uUyg6lk SsI!^Ux,I5k,ĸbsnm< -s%Jj]Mkj]Õ "kBW@ØQĬ<1 kw,ɿR 8͡gAAHPlaЎs-#}17RB淆rT*8Wh̬*#fx$IпȅFx_Bktj⹱+pUIqZNRALXܦ{4Q /QJ#fmmBOHQ#dlZDB!s3SKhAS^HLcqUch8vIN &JLP^GL|+ݘ iRq!_Sxl#>H9<' _ע_=,^}{ɫb+J^sWb̛)-SrfY_8zt ΍ Y#̓Dޔ[H\EnA< Yݬ&JY 0~Yc~!# #$ 2I}w ŵg@nR+_~L[Uz8N]4]{yP \g0qRw4LXq2'̻i5Plj4] B T ?@C8@.N P]G\v(S<YJc팤9xf,eDg-Xh(Ť/MagG0ꏵ dbϵ[W 58JGYҬ8$}봮R*HPH9Hi(C #pwZfNǥ]ٵ0GN}vBW9=1B]z1Qd5ɍ GZNc^zM=9pxe@K'\c6ﭐn ybYo^C]ZfƁVՓTLSo|Bn{f$ sa5Pwxbʟ{d*mlq.#m4 ?>4l;͍A݃6L kІMr}=@RqG)9EY9!N_>hN.3RP>]3b/넜\GMEvv6֎s7GsګGs3%CQwuz7?h95bB0D;StlusyXsS#LR[1 dR'ؙlFq(phԈPQb-ENCR#;Q̋c^ӽgTq[< V Bs/L0_cfPbl2LYE?^bQ~?Dljnw4b/qOTr'a|BF9|GCp]%e$g ze[M!WrUmi)PWf<ChެЉ CCSK 2!?ˍ>+X t/hy=s%<×-DŽz*eh2 X \y\[\UW442:B ,OAJbJeśy潭w;4)t.qmۣc͌8Us8qJ _Z= Fs uJ ~T-RE{cK]iݳvxcwpsߓq:{ 'BG߫|o9 _R}p,2wBDg6i2xb y"GK*Z E+*O?c{A~qAa l^j#iW;+9pU=֖=(q3X]CޛHPD=z=ңȕMGl5)Td]&'U 3m$&!e5(`!Gke} ߰wX9Ǔ:Sw<]QZ_iz|8 !SJYs.΅"lQ[k  R'G h&2Z,Y$OZ'BSOmE➩pc&Ii48΅`ֽgºyo(Z)sntˎD/QK|eee&xx<hp'`ͱ4 S&Y"-Ǖ\\3:Z=-$)ÎfQ$^\w#QŌ]+(A?8JϮ7AXTvA(4% (xl9|\ -:K#u{AB{'o .BAy{{7㙭²nYU9L<] >޽d^{z[8w~yp ǷUf pB/Ev& =Sl{< 1^{a^:CK\po_4sbXA d7~e8G5Տ1nޣBO:K9 NA)Yb{>|j|_XUu 9:8]ž-ŚЫЊ\6t:Gs7 yze{k|e aAGwCRN(7h M zӆmBx}_P/mf=/mNuB^e1*M1EK ,6URxt^e.ɒ\ 4|B. 5HxESqOLP<Z^A 0h]@QbjKdCDaPx_߮Ś%ۤ6G1nmհH[r %"$a-vFo*j+RYBsIZlRJ Œ6Ԫ$nq&Jj[\ÏkpIKx5|K!9}XY_ UaM眭ho(ctN,jB+N3]% ؄{OFfo"ۊ,\ ]5>Ј\a.T7}[ ] ylye"C22~iRBEVF5BZ=8+u#5Ryw~jؾ`Mt7GL!;? %Nb> YR 'NrSP9)Ԉua  x=dģQu?)uBN;$t8œn;P`f 9Hp)AΆf G@],%!AS7ij,9(ۏ)DuD.= ,0WoW#7v^מӪ)Z /ZMT{9hҔ*ػs8f!hP( ?~PЫ)܋t- RĬ0$T N]O{~]Vg1JiC!<//GB7&*r[;sYTp΍Taj[Gx" cz~?;O =Uk"~k=O]mKh_:~ǝjy6SI fr}9з]M7F#WKʣ\Mof6ňUa#hGe+ c/0sf3[c2qI8hܳQ t/0o D-ϯj ` $g koY<p$lvw,poy/s;2& :5UXP *Q_Cs* 5 pݍ[+nڡzfj;=&jX=A9-?nF 1B6 @:wdI&5brOk (]B g66_|fay^1 HLOv/h&gR)3VFGrC?G0Nhsy+5%?ĪYHX Ë@0] ǣ.==z !=g+ :W[ בPqA 7ArhRac0PLcqu*!h$ e_} qހ|:еnʲJnj{Iܹk50j 0a~Ɔka}mӬ5ut>.r}v ^\]rw\ [в r ܍L}1dۆܱ,JS&R1: zYI "!8w+K:QdoVofS̠Vom &t/ RN%6ܙv?LN'8tڝvYWN[[K}=/1d6)jk92XTXv/PnTmX뎁\h!1FĨjz%=LCSp4͗PXD}RÓnbw:m萫s?gD?i"]Z 32q&mz3􈵳A\kzsO>|HCUTګHn=ukm.Qhrkۯ{Ślڜ!WiЗ(; vmf=k%, csb FA.:3zP!=nhxsw6(e/X^(PYN5+Iiݐ 45 VUZK U#|IZː}-W>$ΊG1NvY(w#nMFokzaFi8 aµ+6 q ڀA)&d!G!eu1 LL 8:*w~6s ܭ ~7d(ٵB&[r* Ix^018?V}?g$2Ԋ4Ӆ"Z$wlΈ<:r29Xk7Y:mN (MI;!0|ls]uVe^298b=')dCOsi)skxy=B'K?! _G6 B4jB*> M#>BǗ$Ž965I_'yRQD 2}`sUNlo ZD,{Xg8嘰nXi0b;LSG.ofFr5P@ N=Uk bjAB4c(E^XL ̹op(c@9a=5EV r[c0?1QV S?FLR;&&77=Yǯtox +g䶮5k-bP;OO&I9]Zr%Q20`;d'aЈADl7qb6C 7*&H bC*L"ȩMaӮ"+*@2b$7Aa}$SjR ;wlut?O8xN=Œiz%'ϩ\zӯrj-6E:ݜ6SSa-Sl$ ]f\Iw]*t|uF\ʼnԉ;܉x26>"/-s(gubF xĹI]NFH$0fuk͓N 8h*ƵuJ+R *ZM!MО+yD.r-n&>'`Z_ġچ Es03J~ wP(^\j3>gQ$5T?!Gn'p'S\ 9:i$h'd}H^)Ͼ[AJT7":ɍ~T32L;U0CiVVUohV#Ƶ'>Rba8E^Q(=tO4#Ӭ&fD!'A9;6Өe\xqԆ} M$<~א"9d mo6 4i]_NI>eȱ_U^`݀;"K՚V tI \PROjߥr&PF2G&iZ<"9Z g$gTg1ЏڋKz4 $ay=`5C><8Ge$i5@DX3h'I9Kv}a֧9s aIwPB0"qoœک Y Z3^]4\ ۢFo)Q| j9Uy%YG q*"Ei+ijtO-aL;>on(J_j}ʕK׃fo9]Wfώ,_)s2 o)G|2x^ѓ!tɷ4إ|*s hǶSl Z$Az~%NɷmRpDou{nE;3R]ћ9n]V ~yCx?侨s^ߋq&'΁|?;/Ca'`4qaӥ=7~+Eqq_cGq /۹̦P$[@Iv|㚣C1+L_Bi.C8+C&c n)祯q6h]tDv` hRxt~zi5mtap[aD7CrJ@2_X^x1 9שyk׏"/|cnR=ޗU\m]%˺ՕdD d2c':"V!$h f KP֖leKX KZhYeiҝWrlk̙3ۙ3sghgҚY<´K3HcG譝~eoxo@*\fطخ**6_b_bWVoT19Ȫ|:eߗ 6(TN}hʷ0(H^;^P?2onf{ B>0}7i4ܬtwƷw[vP*wּ}X^&:%*!?n !ʉƷw[IEʽ G݋} S.ŠJp ]x{j9Gz,PHVPj"9FV/-g˷(;wjGfA͓õ=zʹk iG>YrSx+r!u dں0ݥ "^Ai\WJnwHjV4SZ̊2''(q1Sgn #&bTW TCއ;5ѪNJ 'Ssm>r쬺SkĈߢu+X>M.eY!cWiþ][<`;(!fe:j&R15&ΫCġ֥A4d-+ny+;|2, Yk-<ߕN#nWyHž_w+fY; ͐%>H4&-Hsvi/4:wv̭Z^'};opM9| NIvQA~7 v~1eFSʆ,6=1[9Hʒp3E(}v[]Qy;o:;Rzcc=GXa#y8[\zл٥w->zTFuI&3/ړW$aK%up?YH>G?cd3$J*QZ-ɊSUM=ٲZ}*ZlEբԻu!Tv=^#o(mw׬g+ۭ]Uۯfx06Wc6P{(B翣Y/afLK=翓:>>o+3XC zIw{u=V]j1 ڝ6Y~oý5k~‹<׹ܢd.yfgkzkY-39m*sfr[̒3k6*(n=f ,0.{aD|33N1/_~@ۓ=|OiP[K8v6~auX5֕Z3WRg}v ke>꣍fr\,oVݼ G+oŭCkW*&&7kΗ/*;v%=ΜyE' ǺXFQyfMOY7?RQ<_B<x? xF -/KʺIzg1%Z_+Cw*|MߊWD[B򷐿*Đ-o!W5k=} I^ "e/! wRWAM,x_B򗐿%俲 # K_Bүjw][7&Q|ܟTBvIiOu0d/ܱXGDFVѭ+" N61𫷯P PLY7s\jѪQɽ YU­{kwǹlwǹl?qsGd[X&-{D[%]A7)TA *J~=#&Phȟk9~<"/ aK #p?\KVI3Zp[%jZ!  ,VdVc.0is9N oGzœXR=:ESoar6Q1t0 ;1? ~r58q=Fj{  g쳨{A'kjO~}AiYE:X6XӋѿ: J型D-Fm[\] ss Fwr x%=C]2Kp*zVK7 AP>FMgB飘}|[\s|Cc/If5ߖC&V]N{X"{B[<.n. c~&[!4|è1?^ČFeQ-~Z|Hy\B26x)uyiZy[տk 0F'?֢| Lֶlin,z)smx^Ț-8y-_ .sll M~>i8! pC!֧uk5fI14+0R=Az~CW׉T kJk}1FwŒѴPN+C+dOœr;ɉ i3s}0h҈?sykay< <}Q.5F|19ڧ/1qf%؞k'[< *!+ޤR{[ O'ؾ(Oiݨ9it]'d5p z4"h^^tWjyK'IAa CG=^]gwԋZ%}CtFT(5+i^ɵ]WPTRRs14:d%Ψ5&>'11?LWdb/64H^J'k'(7 ! 23Df,|Rk*I4,WЕIиOې[?S3,DZ~D˙BM*sebs3At5(&)(&II"ۋkپuO"de{meV}{ tAXZ5wO q2Zn*,zU8 ͖l)tL[d?)Jq!z@vv2Dڝn g}k`'tH_4#I|>૙R?B7}`D˗gn[{1ܧjɽ|+B3`B4~9,E#>:Ғ6:M0!M~+IrCI!wC5oBr98t]*׳D}`:iɦ6&|e]!|AܖM_aDa>-to-5~}#^ɚߋ-#Ü☘]=,/LS-8oW\i9׮.6Ǿ_sBXKH@C;.(oN[GkΗ ]/sT+tGpNfn\tqt}nᾷ֢pAHzMoD:ZmoY=p7}VM+X{Awɬd*|m )Cxv-f^}oެVoVl{G{s۾OG~N,͠܊$̬pb)W-ɲ%q{Q>4<rW{fiteYp}iV'±4ait MAJ[mXwNm?w fp@q;;v$dG<|4e RPۈ+zWUIMwɸU({/ycBԅJ|UԅByG٠EGg%{;A`Y*zxWԃ[nX K|co@l0un7]%.D}x?i\KWӗ2Y&鴫~_ݑ-K*ycRI} 8I"Mզy\'oɰI$Ȥ:. t!`Hh>Ѣk_7NTۘ,oO/Toޘ%m?30s`vn몥Q)9D?Ο-5P7MBv%,w[[5kK}>oqo߳f<G={=ο_;_y}{@nEؓ{UzAB 2sVPs:ъѹΏO$͗fllM81S̉ߌ%F.#%7 {F.4#m7Dɼ ^nfsm3’UaUa 7͊[1 ivZVV_&KO+j稊*֣[X Kv@-Qz j%ga}hiNñSH^]87=#mdv)G_v!R>9#:wQ,'#Z_E8Z;-h,_|]X/:_|y#J`>CcN|ȆRf~TkKTYJ%jҮݴd+H;]iK'(f|ڍ+B_KAнp5N;BVZoRϣʝRXYglղ6%oWcWIgɟ1ֈc_9R~ jNCmbGqY~M_{}j>9/m"9K߮<:hMJCյ\=~gP5k55>PAԚG?!1V]%j-Nbk_-⻾Zբ]%wT(R|W 4%أ]aE J¿FccVwm,Dװ PSHQ]|쿇,k> 7pc+jqA~&r r@aB%I7.4M"+9<;((# ͞;'c ւYgsۈKg0?愈_HnwA;gx$ o"s0X;;O|3Ez%\ ڦWP߀M\<<Y7n jAS{xsNZl w;a7owoownw۟h 'u{sF'13ž\4e=R(2)F \UtdtW~Fօv )O*:YϧB(9[d\Lj,9k*Ag,d͡סIhI1ՄrF-ћ(_ -|(Aw0ϥT6!iuRgiNٚ34gz͙tO_9՜`H0_E5jFqӸCƴl珟Mh~ |*=’kM]k7mw{Y+dVM=Lĭ KgCdݼM tơ=n ѳǿkmh:"{ʜuuR.@Z,6Z륺:.Z@뽇38~ZQ;)0̜"NC62W]\ux: y}5>&6C6kd6sWebY<7pX sXÌ;Z om6!Ѓ=:^'֔`.L߅-n_,ގY`knqnʈF=d>Nw#$^+#Il];EsaVz )lۦOhR*.d}Οcu;XqS9{QI+|(>b4]v ř|iu 7.˭@NNxM7WʼnVr~;J/!7(n4 FO$.bUtKejmRdv6V`j@Ѝ7˲=#:]_TZl\5FKpMVqeߠ׃rmQ+\q۷ͤMsu;2Օ ۤ٪m \*Xo⼑IW&yrAo-b&l߾dʚ2 ⴊRS)Lԛ U*5yX҃k9.k)tg<U(M̭|ORY{/]Y*XMc ϶d_P}V&|uc* Y(6R*9xd= x 'Z/%F+%2Z$AbDQE "Y4ZJC# =및}җ[+:AtR Zf)iy46Ј5:*+&W1pPI*>Z}mܢ7f D6vmV-=M+7R9O6iQ=Of9K/1nyiG oGwʼnFY-[/ÝS/#\ۊʍAqH~";I1SѪD2cҾidz(Ӊd?+Os̤ G0]'9ol/׌r4]]Xў+$'E{^Hb* /=tX{zQz_Qtz~lucLs.pMG~sRM49Y'授9)7Ϛtz͔ŋG!H~6 Qzq=V+GI: L/͑LxYV (4`={^КKzi.WXRHhV;7W{.inzK8F}|q."wn an~# g0lziޙt9ݕpEXuU0/r +~T.t~c[n ԋ/2_4rxaL.#+}Pa#a={1]Plzn^}B-ыOWOW{MZ}}5[Y,9 Y8;--yѝG@Na$)6^[{ί>ͽDKz߅::|3'?Ԑo߯үZʌgU;5GZ|UmՄ~㑈ݭ9m"[h9J6rQ.s ˤn6Mh~ۯ_8ˈd1,L}=^vcbCG!u4;ݻ^}{߸hhoo{[ϠF"ֲD.CgWVn-IIKtp]fx4)I'ۙ$` `,`Wp`.`/0aʹӄ㵡0m8a< ?oKxݽ{HQI_6/?_eJ`,dV ;)v..ɎVfL`;N &ޙ)Ѡ>t>0Sxk!|)o#Lد93cSMlhOX_2y9Ҏφ-|VpDA P_D f |0 a0x04>8 }w$*KD%kƇK[єfK$cfr|\=ޒK5#S_o5f¯ vu='H-F&~m5+u(^Z:"\ZDe`},x KF<^2uA`wʥNGyhf©ȷSk(E Nȧ- &}K]7/Xj!]NBe<|z9Er߷é&'#|cN {kanS1g˒rtc85 6cRQs{ؚG4Q~S9m_c:0 YemL->H%Ap}K6!hlף Lt33 ી9XXX(eUYk?v g>>tx\n #_Ề%:7V (U$<7)#M?`%(*р.cn7ۀk''N8pt3/ـs|p>.|}\ p5k6p=7n @Np;w ǀ S~x0MG< O+~ x"7~=%ˀW*57ol x'n;\u xTK?B/Q_k{`W@ ;`Hۣ %Թ4|O YX$UcTdIY~v8/^?R Gj*57hn#G<.G+W>qµnpK+y}dr3p$4QZz$@(t@@Iؗ0%} c_¸0u%!<5 ry2`gT. i]9@\zx&p?2XBW?zgyޡ3~ {;Pp܍[ ˞m} I:K 0ӷs bo*3RwHڤ'`;gUuL|!>{wnipB{M)2?sBrLkͤsgYL:[Ye|sFa/*Sy"]Y>. gׇO)ܳ2^-J֗"ۗ5ڨZnu--6IT~uY2~T!JzNod!ogY.z/\b+揖2zcIm] 5E8]PO;NFQԦVhRL(i.h8;3(9f6,.Š]R3c4JZtyGSv:[}!'#B5{ڀ0M,ٙ1a)GWRO=tG/,*ogbo?Tnsd:Xw5/mDkR槊DezabOޕއG3F=5E\+:V^nɥ4FHP MQ-vjJԝ6}ÄT'@rL_~cܧúmAM~/ԄT C<ՠse&? &/M;3tIJmZQQ+QQ+IC̩2|lGϥS\\ E.CC?82(yehE/i_Kkە:@_x*wU[<[jbuNʹLjXޖ6#60%y'٪/B hD]IOXHk%%CĒIr8e tϴILp!,WNYnEe;Ji/FZåRjyB_tƝrNVm'A\{Ks*ŵsę,c!34(,c&~X,I^Yy#ϜyAzXeiEo+3{%a!̂gre)uC:_yOru]ޠuw|덗v;YSMda!A s(okw zހKϫ?YI;̣+-Et<ƪsA/N֛{oy̽tX>zk}SQ]?5s~)µfyHVQY7c3U; F~zW?zJk&ڣ5w&J+%:̓'wNR*WmRDUӼgZ#BuNgi tM؝k%bVR쥫cIot=وxŷfE/NJ9@sR,JC=q> 9? [D.pޚЊMf%wC:;-H Lщ2M箼u2 s'zoQiz\$Uq3aX>,`~]Dqե\k.4"+bcs|QVOXR#S~o ~6#6K̨F~²/}<ʾCDn"hd}䇢iq4_!C҈}!^=ǃ f̳Q_|y꾶<[J 2t86xR%ޕBޣ`ZJ>936vdt?C'iBpGtwxOj߃7_:dQJ3(Nu1[X2/ퟆiԹ3#aV4݃v?3/!AkԨrP'+o0g}AGZi!{3iFZGZ^ rv\'($}<5(%88YS?.J@Bb\JY(js^τ>ѭKo||6켽g;b}!+k޴ѯwS;Cl}|.7[m;Z5|L;Ĉ!le|vS9vؿ"+rd>[VdN vjNp%DPH{;]Y'&?SUc`%|-^#bz;ϯ]ɩyDZ#%#wyH(\)mGy{T;oQV9konӐ沘O>=6u4Q/6v'epjbqؿKmy;9ԾKœ#y=ZJk$Ru(>ϡtk/WvJįJTчj:R=g'ކ^FgRntJ)Sy7;clY7~f&e#Ro5l/sgS/6ĥɴ_ wj!p: w+.2Rȼ6W]7>̿VQ{hh@ KlT{LscU*c442AgnuUйG;@V8@.*AeaJfH7rJpߋ]>#MfJ}UF| z&#i)ɪߐgbR=OQWy1_2vHvŗ',o~mxԺn!۽SD`${yQ|7w#RQZǦĥ/4wϻ7l܉š?sad_ao~'o&k{XMiy&&6[޽꽉g@ܔxߔڇ|or?][ܷͲ(? ߻YLj;&]4*7:;.&oI4RC^H]o]K5lF}H9K]D$=5ɧ*od"͐tsn>JSx;}]p1A+%R _1Q>D ((ջpw;)qL[?s'' A| p{{*N'K.}:@P @0Q} /1Dg'wLe ,>}Bnۻ5l"]M%Tۄ\{fu7:@up:pg|pgoCDACɞҎv)wSk,8ڸfUcjz=+$7Xg~;opTUZR~Nw~Yɲ%ʩp/_u.p{/kuBgl'DZ׷Nt} DIw1O#ܰXzYOޘxDk"μ^s;I^~QWww4^Xm-Hfu'Ե{|'0gXL'# }fg;sfO[w:w Wz`*1 %Eiw%H5B\19}a9ߊo]_>9q/oG}:VKN~jZ+4O,>Ҿ 1)n6\U\Nm:w*;J}h$YZ\+LJf.vO)Ŵۛ4! 3mwm~BYw0rR=s#Id?t?mI~;C;=+{wrީ{ﯺ,bw6EmVj\xyoQ%"7'_5ŷ/|T:7G6RJKJU|}^G52xZ{EY[|P"'틞 3N8'Hd$m_mS2殒WZ˚=hxD(U%1:ǝ?e2c:9XϏ:' Ia#̌IZvI跔@IqHsL.6ōߒK9׼͊OB\>Sb5) t._OJG륙r(qWW %6G>ଜif|J܋".kZo'9_B2~~ O1*KG~1*v$ְVU{`nszZe|hObMuGk[;P8bew/1L_L$ݭX:ìI9ˢXֈz񁬝6Fl>?d[t j5D>{'p٩&3zx$ ̓uDbHyve=DlHB,JrTj1OH|}@~pсlě"q vu7t6~Cy} oHiF;5K{7&/X\w$~Ȼ\y/ܻsyIݤ<VwC 3PcRJǑF~2wТGrK[/ߎKc͒/x9X_ P@߾%[c_i4mNn]N3(^ޤ۲2Y(s7:PO~>5[jvVk㾲^>៷',E<T;^FJiߒym0q3Zs1}OwՈm`vv)];:fv' }wA"}VKemꏵ2'+ѮI"сK7y;Jy 넓djTEޛ=wW{F,Az]fiz͐%}L}CK鏫o/-COmv%FRC;٪YkM IsTY{Z|''2[Q1jjXgp!l Z{\9%҃isIIc毕)}hmȲ&i3R)C~~{Z""M~%g`,4S30i⍑+%sԁDCuNpNh,ܣל7.Ah7#jURK[ms*~J:A(-D域y19Rq)ޭ9kD{H=N3z >{qdW;7+li~[VoޞdLQVyv tfޗ 4gYѬBbvBO{==ڼ3Ą?ٹ#5>џI6tkRގxSյx_?YOwʙ.x)sqϥ̱{(X2DFo}Uv.~1F^f?J-r,.c{d;ѯTrc&|X':f'2"͓ y%6'W\ N>Wޔ6o!]Kt*ftCqWK*È[ZV7/[dz}pckֆ8uFF|#XGx9.Ί xuWP5:C{5BY)@r>OVUGf+5l5vt^z!bO5֜ 3M{Wi>$ӨU'q1t Kؚx~(u!/)Svř<4jb:{+zRf"ixR6Kx!a|!* 8׊p:/&4-$/1ƶBt&}C.ERUS_[Z. #m&m!U~8Vz,)8/ S{z +TlQ>+$iy*B'u{0PcRJM^0 #/:^EhW`y3L;Ř#W|׋% ކ|v_ I>+_f}I51 izztter0)e#sP׏ڃ_V׀LmDQ#0ң,FMh,}LጏB Oyx>ߡsN<cR9g>'!{NyD"%_{xRuՒ`GQ~peˢ@ҕȼe|z-ql|ﴣ/ӆk\&uϑyi1.bҼ_jWwλvxk)o5^D!Fm6&JuV߼ 64/$KfQ^qS?!Rz/IQB)W/fuJQމ3G 1k 4^!o.g@NE F!ez/qOW|(G7N=y훡k>ۙhz0An7<\nu}*"տG}6uPG6X:8왭A34apľ:!$ӏw^H3 ?0E4;{6mŶu~vl4IH!{kxU nx Ŝ?o~9q [MRܧ(e \'F3.[=Le:;p}Bg$hى!wM?Bx{3 ƹRz }nw8B{Xhކ޸kƃA/iP?d -_hK'S\v'aZӊ=`6PU]^W1R&, |{x<;^لd{k69ןgqRaݕ-(o=}a.|'\±0^t:<R7M#ڋDiX_}5B hkkkWNZL&l< TԓF9$P*diXz0ލp0 V]B~IH.tڪBeQ3ú$B\KZuF7m "*@dJ3FO/|7 d07| Vh:A3\a}MIٞ 6k֫_Ήe$߄/{|2Z q. GEx߄!tJiJӀ7jEl39N\8o.hԹ!qW`I Ԭ$/^?b1,o^ہdp}pk|4\3|=:ċMMbS`XXKF/Y_V-gp-78E'>L:|cC* "Kݣlvӛݮ@7-bjfʱN:)NvJcw9q巣lQgj0ۦ颿zpcvgk6+3am8'Vܡv嶎n|3Iu HPTh  euʛ>~pHv"sXܮVDH7S[>U->EJ;0/~|.YLWr2h:Պ[]8'ϕrʅ J;vufWPnVu[ziN}R(x{":,Ǔ t-ǡiVgrdqGz"|,j{u˻ꋘx?@H_!896mUd:븞t-|C d-ح.͜WH 8zz>c؊%:`*㌁pzmE LGs5 H1%&,dY ߀FOQ9Ϯ:/+8c Z{V?]w+/8`]ˎ'9$A3)Iyg1s1B"hneWn6ypڔ\BXMIhM:d1L<țo!O$ݫ4R\)z=`ws=)M1$^U}lc.{i1kpC)+ U7Tp7pbwK*{nc!-@Ӌ-qݳhv8[-Ƴm<Ϳ1)Ŷyg{蹕^Ro拹\f5:I7@z쥀;R{th8̚M&ƀhc`m`LA%g.0+c?n{ FTT)Vޓs[ ɒ_Iy4o8׳Q'>/s&`r{aԏ.kU4st uF1ZbO}\pV؁=.h4bhl}Z;uRD߆QǤ䭱l#}kU~_j>* x_8o* ay|%1Rc+l:Q| P(ʗ uq Pcx{i?*QN; =Z̙QvO8eЛdDD@n9{a;{?EY`#rwo)oӹhSnhO~ ڴ-z~a,PR /=뵻bv@jA niޘ>r6FG*};OƩ1&?h08#3̠HhJ>aQ @U5屎1 9;񄜰9|]k2mnL8 ~x6G0+yk +w :H;5f XkRy@s0Y>M8Ӂm].:7 oG;EB/ `|1 <+^;Cy4iТ@E[6cNadZqΎ; {0ɸtf(?2XLX.c!߽i=2]Dk=7 ';F' |MNUng>`~&s.VU lSUs(<7&tb)ӆ1ig.eVff_`Je25sU*?(;rW5a{ݏNᩗTSNCs<(Ze`?2CR+8%2u%{ÝT2*Gg?ce7;(/ $32V+Z/Oz~Qfe_Ŭ/.r|䈃u7\n*=+kg˙D$8+4JTwʜUGV3p=H凩J}Z9@o +HW% 帢nz6žRǒL#%pϫ8OYW$xFLK';T= EoVa~=WN͵\_Ax~)Oa#kgtDݐ:v$Os/fO_l+< :jB2ي4%Q/mN2\seߡpM͸[ C Ifz:O4D@Ntsc.sAcN0e/v{+ǘwOq}'磾9?ݬ$̉v?_ăѬ qTemdd{I]Sj=a&<4fgzIh # qp~ۉ4Evgu*PkEZso.bgɶi5'qM› Nr jS3^t#ꓑl$ɹ)ʴJ7k@ٵ\)[d_l#!YǓ~ehlvkߚUսyIvP"¸UkD8r·{͛1#?Ʒ;bTa: tZHw:D=+kHdM?u k9 k| rPkZJ;7O_k|1L˭=}G`5А:nSC ±gN_ER& 0>p߷EF S|o@@h{;FO!ӂ_nr&[ϾOWW3؅: ~TzsLy pXsLD;Cc2Sp2\|hqPV)_n j3/rF#Y\w~wy\azXȠ]ю>=X*^e_’La2|l/yB4&Ցz?g/N"CGҭ"=K (ğw>9y*9arۊsb݂ge'pYE!qzRK8kӧ z3<"zӫgkEn|%ݜm"#݁(v6mN]rKr-k9W-ˡLLٳFd~_ R2btf[= 5y~{E9]Ʊ.|[F䐀Z{mLӕ*=Ey ew*Qt΁ ͙u^hGMJoԶxx2lRs2m1U[|`\dLxN2{y:dt;ro%y1w?\I^\]Yo2Ahp+wVw{ 2}({J[{G!ӤzLc&\y~[%r|/Mc0=O3*i7'J{~otM)RT'3o oM60͸Q/\o*\WW|Bfi IO8B:;(aI`Ǟ4?^!xW:2oK?Ligqΐ"SKboT콿F\0OG|+ϡ*ΧϊV^L_[btuLZ ܬt)˸`e׬kk*4;-F#̟C!S6R 3SoctsLRG %a4R^?#yp~{$I?4PnLI{Gnzy|0=eOE $Sq%U7}5*dA:`%[" E*y{#t$/71'7Q[k^}eAދe1hXPYfXu?8,0R>^#EmOP"w߁FywG'޾<$~ oZ3e@VoA>2#[#y !\Mynߜ)Ao+yv3PY6[z9@zzI T+xg4gL oO>5W6f!a ԅތRL-ّ˰ﳎ궂[m{N6ۛ,qTE}E )L>g̛m-ݷL8@>9 lZ1BCNwNf3Nhwv{Ch =an+m{mhOGђ"HM aqv g'¯߱ςy{>p__;p(TX)sdz̲{)9U9"^ \^;rHpZDKpUJ-ǎԜ60}CNf}漹ge u;F1$FQyv(Y}"N8oI moS;08?F_?:SOoxs{2 8' b{䞠nojwBj\@+;.r{.m;of ps@"5VX1"=IYL|i6?5v!ݐRO*wwM8niR*sBϜeqUyO8_YK=bjq Ry!t&bư' sه8lq*1 >Tj:sɞ Z/⿙[6?|}_9I' )]-E>ޙCN7zg>Ux;wSTo {4')Pb&Uq%`78*+1V10EEޟ+Ǯ8F&2ޑzHxzHHerI~.\Qo ۵8O1;I׀܇NR4`QOV'8egd" J&hR2 jO2[}zqe@6:دuwHºaOؐ55JW@*!$2Kq0 ߨ20Ҧrv0a>*ld2.!*!1&G #}ߵGr}rx.+񜨽c?HO>/v% L@UV 7-ŢW;̼ %V)Qk&Ze}4铏cʴ[)OC@LM|6A|_noߖ[W?-_>44> (JvcY;vg~Y??TȢ_ eћnj.٥lz>h1K v˥_N)BbNrd)hM}<ҴP (4H^z%6jL~ {% ǘ?/ԐO$Ϫi/8Nbgd  PhggNvhB;tsTV ^ܰ@t>b|%5(aXef.Wb;B;"\7, RI7Oh{Qz6='N\C|{ ;q:SFCRJ#i-fF]۸kdLf\r,JGvVL2SpvsL69)9ipQu8%^{o7r}{nt El(8qGَ-s}h77 =G>{k5\u؅?1}hCޜ#Fh|S>w4;?JKѦ|[=#ߎ=Ҫl,׳p u"m|u<v-m3\-[yJ2zApu]Fu_%f¸2mFȈ:"߽ 5*e'ޝ7RhfQQ;FuDicYSt YbŰƖgcv o _CjN}dDF#u3#qU<͛wP%0΍D>*p+'n8j/*ְ9]3*ф״PuLG&6Kkg73ڹB3-k,W#aC_%H5aҌ~BQsw T'Uz;YCMYzayO V;ۿTW8\/n%({w鋘Ϩ*X^F*T36Cc;x~@ONCIH$׾=WM@H'o̪{@@+rBY~]ЈDfj;/G| 1m=SAغck`vagܺxwSPbo>3`=mCoDIb$nS,O%t,C"a&KLN됌9 -c5s <$7mmFaZ+sܿX&q=GUOܣ'4"{͛c^S|_޲`uZ3>aSEbV}`;50j {+\5s^pFvLdص\틘 ܩVBbծ5+c']L(s,4wωցS,i-I;{|]6X̒G?ϒq، =}0|Rq1`XƳc1Kc 6!}kyH6s{oN;ˊ*G=yiı5xWߴfS,F+LoFF1gTWsXq)c[.0b!F}њ[`'_6> "/}M1ff_]km*zלfChW֟]cթ'|, Ioi& .EJƧr#ݕ]\'2hẐ|}A\#u($SH SD'x)c"߳;3H\az5k+FZtE Su~+oN?\v}PjR-|y{oޡ4!!ɠakI+ W,}Xz2Rky Lv{%*ƈ:9QY):{ԑ0)9rW("C)Z('ӿ9<;Ʀ1(7x @PXcxU{~6ބ>Cgª<a_2WH7Y`U)ծEe^_sf+}}Q#}}_䇎Mڀ70fFŗIn&m䚍7Uq2-D $aZfY=xkK>S)f(ThjF4 _,Z[.8 q|>YAOwn'IyY,(a>1r{x!(tIe2gY'Kq oY3̜d-ɆC+2 uҨS|nRucuZ.eu&]9gh>AX'stをSP =+U i awchy>DAP *1<T~UhE4WMFI<~޾(E[oyH!ur$ Aq.@ z( CKj110PAǼ 4hf}XW@L{ C$NC x67EI&T3ԔQoiMACBbuJ'?k:H:"hC53-;o8 27@TV-<пj7WPb=zNbv'A2thbF!;̍ʹ59auCWxJt)OWW,$Y,Da#`le"M4߹ h\_Aj}Y oear,:qaj9/hޓzMOY~:}04ZKUPhANI8գoO'y)'[t&C7:Q!i`VHdVC&Gn=觪O-<~Ɛ4l|`|a߇5*9 u-l}]z7s(Cywzkv~m{gl ۉal7=˶p1ϔ+4^YLA|ΛOTU}A"@&҇BU-XzU^h oU|$YgRV$CHyR|UCg{遇Jo1CX?y#xus {78gh !J[,SI̤wX8/ҵ:2LZc?-yuURSkӳy2m`&!eQŞѤ@lٚ+Wċiϔ6ZFTx +.oxU棤ꎠ-N+(iVB4/J Vwg~IUu1<HU[U4}{uU!R OGHMnD̩&s`i) V '~^-UU=)vsoVf6C+ga+ՙy>oC9ȁVfLK~f' ۂikhMacA jıj}K>x|u^!Uufу9h ޏ ){X )q7Fǚnm_iBV*,NFniZnqϸ\ESjMW>qUmDlG:sw>F@mD' j%ݐ7ϰ7etF$KH4EcF iI?IKIy8 d[Db*@_H!HIS$-ϐW%AUS}z3|C(\ >΅W՗Y]k" j:˥ }INjwHZN?-6#]htm>n۠Ϗ'focxC 1ހ1}(׍o.!V&4k%X(1*"4o߳~z#5\mm2R֖w:`:54lQJ6m޺(F_B HVf0H(Dpr23)$U&zSd')rfݮ(jnNj$Ue9iS D 8RxCU_W, u,x 6͏\*w$XPG%H3|Ļƒt򸂈yLKp7/z%N( D{VS\FE*#FCluQEkdȀI(nΌEyy,ہnt(*$<hxiZ4sޅ{lemvYXFYJf yW}YFvJEΩҶ{xFUZERŷ{i#B]ҟi>. cK\a{ qGΣ+eƭUouҥG@q-N7}bM]Jft(GJ=ʙTkf]cƹ~ՄU.030$Xc*, S@)2ɆRTURg(ULy*:˸ʫfTE3#5#: n:0bsE?Θ,u;/^٣ZV=V `VV5_MrFV&2q;pm"n| Cdy^E"1\>qkǼqx1]:k4`F9,Ekra5qq }fTx\.>nc9ӵ 5:|;EoN hXWOƲqE3LRPT#2~B? L2vl}im; ):6^M&z LTr:*udz}yWʼm Ob"#:0h"m` ^.1 y_Mz; { ԛst?pٯG`h8^#Pjo=bۣ}=9.{=@ifivUi6zgRZ:*ACmcH7@}ٚk:aaJ:Qμ-Zx5EU( g7`*nڄg= 5SsV+%)A_UIgf%)xAu|S2t85mC]uv Fc5k~RmU ;XK_SK>l4?Uz͒PT\m:|-P~,M}k-T^׈[Lf`t0R|->9'[ćzoLL7+Q &vU+}I*(rRxr@~8+ LKQ#Ա,Uvxl}`>wLHIG·YhCDRhpj1Vpi#N[ed 萼72|f^K3$`-n)-,RE |Hi&R~/%>4yqؑ}?~;ߓ1 yh4>d$n^%* =97MEXkam{k0S wW+_gc=RW$TeCZjaaZ$GH>*{˛?g!3. eA[5GF5|>wXطb<vc iE jTAqdDTgh͝/1n_0G*c\Ŷv~#cY؞/`L"ՒE[Oبk^߉3t8Kwuey&)Zb+hgCY6ws_ [u~&ѫ~V{V%L Ee .9 w'@ HӜ(&xQH3bG3V49v8wI魵m[mw(c;<w¼1WU? z ֢-f/ؽ=b{hY~췉+eGC9i^QXi KM֚s yfcySZRQna&+rT;Vܡ l5'z 4R% Fȁ:=?f0"=܎{F s4A?US<TĨp3S߯u8-Q oV!]_GYXkºI9a/ j$~ [$JK3֧PY #ܿp;maM=T9pMzȯ ` B^ Yȹ_Oe$5^p |=$sH1^Q3$cZ0i D߀="3Gdnrv*RnTyȚ/i>e2'~yO~/'@%(u!ntN(c9., r٦up\mZ]e0{/zQ e7iBJHD 77^NwjzO! M{)!5nu ΞwjmF3{4z!R#jW:5U:,8Ƒka%WKetUI>jG p|2l3Ί2^|Pja ?#i$7ă^/$1pe6+kIF7.a4apRLXe4E0m}pՆX}1y]zpazЇh yx:։[u Rxr7>wN`Jэk (C4 j{^_x+W ̹m f~ƳaBĒ1% %$gLIcI)ce\1T}95>g0$ܿp$AOf(ghNo3}PhE[jp#MZ>7)|[/i{Vs^Q"ykǧ_t;ɼ_+|q S|:l @fa6G|ᶁ

    OqXW%;\Wّr_&3a!An#s5k 6O5Cq'F8(Í (-[KVSN+|NV|&J^Vz74*&Ψ#CqMvMF\mKkv3i=\*kg`SPVC◱g>0a XN26*ucU6>_NCY +XM@ mg)w)XAZCW%Db_Nd);^LdG=SBž1sZz؁ugQ 0@h ٞN)2->g# >M6 ײ5?w᳃ytktZuvq?h<&E+E RuҢ7ȟ6t\tzX\^>n ˱ڳ]WX _Eqϼ$uNun]ǹk^Q.uQWu岠ǥ}đ.voqZ]60bRac^I# ~I?jX_.T;zxz."88#fTrkoUߡmw޲#4T!]O~vϦwIWd@=OJgϢ, 2Vggd}uMu̧pmذӫvN[u_';G"5n#q(W}Y|>ҸP*2Cc8t)%h\@\xl0vXghjekCNM)b~JDKԸBgA*ʨ433 gMg;~KNw?KҜ*i;ƦSi5Nls2Cߔ!n8^qop.>+n-j3#ުV4n $&i޻ZaCQ_ڋiH /AcQ\3vu&_iZ(+gb()!Hbhן;n ⤌9)7zZ,a8i#bSӃ\Cԝq'p|ʶRF#.ݽ޳sʹ69AZ[H)_ߥbg-5 rFHO(=[ ~^Doe)z;,7vք:`DhqAFR.(;eZ{ssŅP/B۱]D6ӮM]a+tG٬lc|[#W*bsu 7]j؛ ūSi#5waw*4.IH53V}R'پ69>!q]+ho[۶#]X3 9]!Ilu,ZaXwv=*iשf_άC]cvW Ҧ3 k* .}5P06JUjR 9KCE} KCoʞf{NQ]3~W'y}-O[Zv#{c=ܥWRp2ojXO8G;eعK`P:FsFާa> :+.1kQ_BNv,}(yt+L9}qqQܵ\e*ϚI \EaSs8uGzQ7qg)bz%c(Y6lr+yeة$TZ]l70]p\bчGat{t`V&xXZF=f`VxQm=;ij1skjʎw*gOuĞQ>))g+!vVbS]~3[bΕ6*{;$:ް_1qi+Eo ̕4yc1#3˷)E8M̕>S97J,1_:/9Ws9=gA>On\wy3=g6Zmp<. XWOܑ/GΙEEt%'Pg=BΥ9]h|?YXrME<[ §*od Ǚsm慆[)As}ާ c?Gȸ&)w7 Fښ[`cs47Q2:kuHK?ӂǤhmN_miXŋ t!p2[z~QmYb0kg {MLkt"ص_żlEʆQ-|3e b^4Zkp(M2 ?Ѥ!z-ZE5Pjw|,6~ ijue!m.tr׭{6Ӧ7'u5rmiL RrÎ"sekDћ!van5[\ۏjp4Ah(cHQ܏?w(fgPp3aط܇ߟo{ί^㓦lb*'"tJ.Lu*90HQoP]Sg64ߌ?!kPoC$ w cRAb~bh'8khѾ/s^9QHfrp({]M[/31;pUZaWz(^ftfsߌlMRKx([ `ߙl!oX\]Zi%ޯxvZ!ӚCO̕#YcPfYwe`dSC-"c8f"c V֊?B4@OUǧmѿE೦Ű"ydZ:"dhrb^|ǥ"Җ Z癐;0~kލ_Y kP/ L5JyX W(lQE8/jUBxl}Iz$Nґ;ʆ[3hA•VmY oFw&|; dx|p9B(u,)MDYYy(j #ͥO"CtqzpM\3 Z`3֔N1(0\SOD\:Rq~Ъ*ɌCvgma魝qpD Tny=,O*+\xe+`ƶ!pk=z~0ԪV~3 YՍ]*txW^U0,Q 3nqoO7N8FޥѨ_//>j1 28SMml0iC7QΆ[jV@͒zc (\Thf'G3 V1|zY˭; Rgԭ#ɧ) Gs<\'J2Q6>CW֛pa”):DR b=~k|Of0%QTWV_ujѣwx.դ&ne}K}f+kū.aY1q[k@Co BX:ꜺV#uVmf+5ln6Xv+mqm-6Cح[!prE=<6Æ_ir_W-t{A{6.rQ=K_|;.a5qG /gntnsŇ CR r|XJ}W&57XFj3%L$ !7N F[AJ}fit C UFV ~AA>oR3_@RºΪw8GmuH/A Îq af9{R 6sJdsMP|]BhS>*y>³=w( ?2C4/yD`f4HH=h 2BHQiUX%yXo綶Ze:~߉\}\ q4h85ȥ@+h ICf,U|Q|W]ڦuu\@O\ FVXӑC]P 0Z]׳Ќ~%uZBAH6 %Sp^BcxԚtl /9ufN NM`_[\s3'OG KZ.ydY^PP>.8 $/ AW.F$76>oC__|Oa0oPf@ ,&#khH~ 2.4ueq?"J 8#h/Phig8W1gxH p4M/Z!8%ĵK8GWy^ /Yp^ҁ ~Ⱥ쨛iiԵyZl/cu;ɕF]KoKCeCbqz%sD(}ǃ{|uD4@ fX5cb]|jZPIOȉQ(\:X_ ~ĻU oDbq`8z \߻r5:86hBP(ƭ[újFA]_ [0i-MʑTOLf b! f#bZ0>F;ڟ:ƒ`1աı 6TW>zV?&.S-յ c㽢$.%Jv[POV +7{:-xZOb_`7#ǚ@Uazow oz;p+'f3ʹCjOA1zy ,Xy,(q3*z?e7Bjј&ﲸIb+Дt"n4y;9?FOVov5*5yJqH? :?ׂ]VR40}6.,vQb6&F,kbX)bRkkK:8m3<-Wlncb%KzMAP;Lqx}%#}RMnNX/ p`{C~@\#aBB~q<\ya[#V޸W wk덓\WP7񫢸5rVOahHk놛. &foH] 'sOs 4_ Y9iz;+U\pG |b ]8`k1οp ,tr4 FZf;|# wZ1>"jX4Pz`.իmiH-/nEx|I38Ϡo\"^{U~6O3|mtiN=9޼]Or"5]=a'[HeYʖKʖMӲKL;.ٲU&-VW_jmѴ] (L}TT+۟.=p͂'e";,=t@E_cԗt?3k\:D Ý!FeLZ~ҞgF!*O2·~Nȧ*_W)f 7v>Y׊tgtک yJpZu!$,Sb{о/o B35:a}o?<(ֲ*[p10GCF~Q[۞/MSʰB?{[p&D&+j=-#S4Z׆'US|?uL}:D/e>Wɇ?^|kE3C<ߔ/H޲y '%`'q=>{86=tP"z]q<%W@?&06N,ыwՐMFs<ҞCfxW fg7mbU U)YB6>pV@ZK665fe"Fv6PzqOI emq'#-ejiumS~D$<(y_Hok*L&:h -$a7ςԼ L=Z*)ᢱ<!n#9 +uf=c$\}zJ)wtedjaD4"kC!_.Hn:MpBĆ4Ԍ; t; _t_Cs' ap.xh aeZAb2 -fB+ٍNpx0sO%Cv+$ >CC 2Vd%cTW.A 1JQS:ݫS>(^Ə7 ڇz7ڳ4ܫUѺZhY8]?%Ki&4D:s4u} n~a4{dkϤUv :5\W _ėHQVpnJFuCrOaFzqόK5r{;Y'Oam )w5+:CKZ`e:| )]]19@e[whA3ro7yRmQ|8 d!{MeX^N?N|Հ0AWIrՠ3Y_ Ob zcPgtP*ne)`ٓ8ME =xǂ6~M*qj}Reuuܪ1Oo򢎄ƫfrqs''y)5SRI<|F7nw4{(|S}^2+ڃBLԟ6zӮn<(p+b94^4 Gl>u'2ݫ@ix)H)EW؟j ;k8YXx`!#|">t6?eW41Uߒh7.'!(YHׇ'a/_g_L7ZјI[c S!/W~4SHQ]؎:aQ۾je=.ށsm=%N&֣÷~7YaK8yRZdvEA!k}t<pU C7 n\~E8'6=ʯi}4LM]hcOM(Xd ۗg)|Lfj߉߰'V6m7{JBk2롖3ONؿ 9Yy㢯qPꨟo\7#ށ(ո~LOB;83d:J.GR>v/Rdݘˋ(Pf/#3%pwA Ԙޣ):I_1u)pst^>KSj´Ln÷pn<3}.u娜h$xҲ#Y!M᧰Ō i$=6BJ0g֚BdϱsTýZӊCi!U/IW~vZЍ ;k·')[Cp !x^AdŃqQ-3My=p2*ώ0a׿}=?~0$ 4RCJzny"S)d2?#Wa4zJE)SSf}w!1OH7E{pF#0U +ϠH=c!ļ5asfb!7ޠ*C/zzAGa0 pw g ӊl6Kr`6>I~?NropųwX|PBw2CÔI> ȳF*;ٴcйc?km/ ]*IF',e;W\X|E]Iq>u K٥]Xk.efd;g=PKYpUXEgO 9%յ⺶Se=v!rpk5e|3Iu@`L!NCh^0TYT{ G`8*7bHng&790WA) 5-ͭTDh5B̅V8Vc 7/+!I+ø?C^39Mwx \2a5 Zy(tiȭ &u4mzPσ r|I(CK׿q3HOX'N! q \ 1Ň <)׻շqZ}Zyx@hAl˧vC a8M%ڀ  cW_pWvE랇"@=h31'eA0}XAX0[ג߰F!,态Zid^=|}RZL E!5%py]S+zحFML:Qڃ'LCҖCR~#(ҩ&;]WQo*QEawV[(n;'Ll:m{f6#Fʨ$n&eRw^)VxASvo w HO:Ezb0.6Mƽq=Wb,ikJAJ1]Gw>fr*MԤ +ǹە.ޙ?>~gv EF M,~~wfI*?X'uQxrbߵ2bZ PձE5c^ k8E  Btjr>e794ho^h3c>tR=:ԥsF%#n`r`Yi &P~exYwyvMZ^6s!Layjo;`Q 0Q/IKlNyrn[tW$1Sэ\+Oiq}Xv50׾Njn;雷gŮ#׷璧zWF ?76z9Z*62mN\7Om Nk>juA7ϻḼ'[YW==?~BCzZVED3w/& / -sʊS0*)*L,όM!}VS gFT!JM|nD_YпE)W }1 &ª4W|x;uYcXXq\?g'3GPA>xs4gj~dط~lio=\JggH?c܊!S<rV?6(Rqoo̬lp12;hELw1[l^ ,S/68[пZ,oB- 0/h_NU So:fڏ g 7@gnĵ4+vmU(FlWa: z~.#.]+ {}m)7k0tF V{D݄u!?FKF%cTIXRF7h,{ј)>1:lqh+OP{Pİ=Xmgw3̝uQl:k?3m'Y%Κ!&)ktnK^ϻs|qхQvF_|Rʘ]?gC\/]}bA`<9Ǡs8q$mV 9+}&j5}Ɇ|-$䏓I&NsyC5yySS`fd6c{)t=L(%]>zܸYJ{]@llsA7GܗbU&IEbAD4H{ {deHoua5G]ZPXn&[`"S6D9:e~.\C=X1jk{:XcUNڼRw/q>c441'Uk!M w%zWZp& P.|+MԾ/˘ Y2d'e!}+vw1yyaK9#Ck\"eUX"<=tuXo1S“n{20U\Ow4a&rI/RٓOri7fNH}{]Ow,^u$M.`(s)'tBV5=u'{ֱ:ΉPs/%`M|E54ʴ E\KaHX-#LNtBdu#ϑGIjB\ _]km\~I5()ܥhWc27Z)dPP5~vLKv 8m=+\^jMߤd¤ը{Y%,&=_0GUMq_e9`|K.g)M*+irKnrXHN7Qw墚PojΨ T EA(|!hVjޑk~4{"w&)=a6i:LfT30R'vQ[^,pٌp KDA)_'qh_i-><MOE1"dko^^^7gds4stvdykHC jE_G&Ӗ7t¥l#T:e +ǘz51eRz@ITwBUWidFK %k]Hҫƚ@BsV=]BX{yi}R:Ӂ_ZW&!WK$-=n?/:k{X'r kyI%'-*pe"~T4Ec7Ȱ=iw,pal/eep5n\MW}v{֛QIuZH:[~;NǓ02z5Hl SP#{~.IـuGް"Y]ۤK_;fnza`,Su|7@=W6&/ΧVq =wꉇp wZ&ְ=u k,mFm%>ߠ2İFmkN B#~ zc=,/Й)̇m{m~NrM( 4e56-K8ѧ\JbֱٛtUHw6O#vɬRkzIR;JC,ubcuuvmy 0z!$y;-K[xgT3Mår,)c+zM0۫1!,ĩd[S+==lL5q]jS=d ] h/D:##?.<\!zCc;-؟wx *ZøfHXd{İKoLh!+q:e3~a`Hy.`޺tgqR2_G5ڗ g^ %~31b^`ȅ̅lkZLB3&;|3/tu+|/6ܜegkf0W YoD."*ƺfRPbH0L5qy2z 8eExVBj8];Co-7TAJ++*4Ypk7N!Ν0X=(U p`Df<Ҫ kzϟJ}@*]={9A}ξf kK!V2caiSrYL +!W!Wkuub}弾 { PQu}. [ Kkn.)@6%](s`gE{ s`6YXJ<]gyxIɒ9+_ޚV=+Vd䯤 ]OoOkzBOڰdL-%8.[+nm re\3U9-SC>KKa}s~ȋL TEP(rM,Ng0߉ ׅro`EGr^dp찮V++|6Ϧ6xp0E_8Ze!߂h;{iz>q.><Ӟ-0Nf&"_nh15UEr?,j.1B[M)"]udka)Q틦"nn wYk BfAYS,AclU@ڼAAڹA~,S"^-{*QMerw{5{k&le6@Ƕ:߼DQ٦`WZbL-OU TDbs~LU&{X.00kړAC&iޝ@ŚI{~yl W6o&Z1ʮoaOh2^po>G}삓GmJE {seMAUP^^JT87_%3c~8\#\[7V-ZWS}![XnXC!mưm;B9J[oU4|)[*lhZV~ZZR֟UVU(L|V`+q)̚ZZǥ1'f.Ty>zMQѝYЪgbϞP}eNmϝgvkw33_F35H;]QVFe>UGફWס~$\w){^=.׆C\뜃%r-d9+8p3S ~5j:tQDʉp?Wh 3k*Ͷkd˶5Q{3U#r>LUχfg qʨit| JC7ZA^ [nOnۼ̇_3z3zFB?BS0J<ꌴ"$N>&CE+i!(KAYfeUyhFxl0mNS-\7mA$ .Sw׈BM0K1 SVxFFc1xy#W=ϋp{Dve&M&"?([/3z я"יh+At`Hx:{תdC5QTȥP~:epgV]g+g+D~kdzl/YŲ^{ b2*huL'z2TeaKY~^t-۔練my5ט;3@y;oZ\z 0vZM8#yٳ5#tá̈k̴>L2؞a%t1!y S}^kk稗i} }fM7Ǻ/\z'8[޷ÖkMAX= q hQ%ԑ @9'}%DI|=OxOtAmUB~eGe.w@ I (ݛ?"8  #v S'vVq {{6[J&~!`HԣjMvRO[Vm3 ڋ3)p½J.y_ gcx5fW2 ZH+{3ߴrRo4SW͔&3tӓ?BAl=q^C'yiOѴjTn2曙?-J{ ɑ6C};>gl&3e t[pQ/㰥hooa [̜ތ:_tNQqQpYqB ' )l-g@[M 5K|\Br\n+m GDݿj>U]k%+tqx׈^NoYCjQFq\:XJ km dfc|K Lo)TX[ʴ^ro[MRlqo)|?;-m/ 8btNh!Ӕoec94Gݐ>c]&j&5"&p3| {SȈle/ln3a!0?B:t}I3wk{6do·qQg̹nv7Iv7nU7xYZDa9ACnD@[k(U+xᢅ Xbwyf9{6 ?o>͙yf3<3E"x:[bտ6uw{4[t1WgwZ/-=V˜iӸ 3yz#SycqbŸ׊bcŸ`LwdjD (BLøLcdzI6M)ucגi4`*E rh5bodѐ\ 5l'7}LǼ/mW3a 65oDHͰKIe!w ׀12|OߖZ̥QxIack;KcVΉR^$H25B$~q(H"{ b%~>Bh0~ŵ:X!O`BWaF|맥^M Zk8qӴH̉cjY4bYbR[W +̷&;f7 u̳4sqC֍f~OBO̝]h ׍v?k͏_zU2ҜRb8-}29ome0H5)fTƿVB)ykU06UVcUsWFl*1+mx { J +dN}X]W-PE+<9_,nE{@,UU:_4nUXܾq(y=K[=ļHںwCS<Fs|U~9]<.s|5 hGTZ݂Lbmc js>[lWd8lv3Evvʺ.' GΝ2;=ƻωgm;jЖg(=q6/yɢ5f?qݐ;ŀX;^)GK;<) &ݳ61gԇ'(7 lάY05->mv5VAם65I%ZeN|SGɢ& 9p;o1z6I^)$=Ѕ\7x1{@4ou6U*F|{a.ZV8WmM_d~~-4!_3THcƷRT w/N2&BFB!t N2O%WXn1zo ۽n})lw<Oa!uX n59/yⓑFGp^-^tρ* 5}++)JNdg3Jhv(O:7~<{NhfGI%O3Ϲ?',=/DL&OE|>ǓBZ/F2N}7@}wsީoO|lO0| }U Ž(®meǽ"G+ &> +dz7ET1St/N įa&"~+a/uk3OAIGum4'D5wSy sB[w 7%u[ܦ2P#$X'Γǀ9(I0zƱbYs?t/͏rQp(E.Y+5eb6!̬XnaGl揅RwqK]! 30t\ŷ8sfwl6=6QU 팴W"ZvX#Xؕz:PɊ@s%&ch0!k\ayL/$Y-(E˂&fJ|6%nSxwԱd$eʬ9.X 1ϐ2Bp?0] E-b1/X¾AxzQBZҩGc}qsQʔ*<3 QU4sl>2r|h>nrչc3m>ҵw2}V喞C.`d^Ii-xǹDC7*= <Ƀ/o\)<~{|4igB$(ȑ@^9Giچ wA f|HKN_;e&nm0M1TXg~qnAbEh${gzS 5#!yQAl%Aݘ1oE`2Q(̛2xem"]S rt)-ıoFPF [1oFyv/y$jԟSv}fxzN:KՊl:- $Sݐ.^r=B,k 䔐-/}GKwB-ѝHLԠOVV//' ;^!--ƅ!%'o88C m=BzgfNL^E& Z5L`NWHp}V.6 V|/?ߨId3b*oXr71{o co43HKtg_kaZx`WXo{'߿0!/%?E>zy _<^ði {>O =9gcG?qZ3#?pJz^Vo VsnjA^y*UC,2Nҫ~\[ j ~~GYqNh37~c])z τ]mGhG~>z>j[;u{sv>|0Vo_PsnV<.׊՚{=+SiBx_ ͊gv~~y_ /Rmv%azY*܏e "o-o Z:(P^ 8wK8r 8%& [X QdoZjfmJ 0 ɠA-~(װEČc`q]|d]8.Hc6/싺(WsFwko֐OATυ=aQXVŰQLyI&ɻAK66|kq;| ރt;=C)σӬ]_owj&E'JyF!-@&dieEiNrx";.Gt9?(+Q^hאޮ}4e@-6fޝ]ݩ+sc[8UveFfӰ7ix:;UY{(֞ ({o d4c9m JC|#X'~F4{kԲ'R?IbGa<&i*l,0/@X^3Nf;W7j,2'ߦ򩵺|1P5I?K9|fCJJRˏVdȂ|r8YJte{ Svhp(<lUuB1}.\ j)k=k}օx[ÊJڀm|2{g|B ^̫ c㹻`(;TUkmP)>%<sINIbL&[MJ^A<7H>h?|"L ^owܪa&$tQ^a#t 䵭:DRH׋SfA s-R"qƼ=\ˡakC>l^DÝ ޟs/ڭ?ҟ}w=ItIfQ{aƋӼ6H \;X!aY\Y.k+yRݻqG5&xp԰*I~gwEmRc.i1zL3Kv}ZGl}+p3qR_N Q!ݼ]p^FgBryѕdVlwX5 wE]8ou[zE;:c(K0+*odT9gL:jAٺA8bmټvR|~+·rs!ɌnY;;:k uZR!j4ɌCzXZY1[בH^<k\dz +%:uťE)ѾN2q!%tb;]ҽb]:=vJq[Ű-:?8lǰ:=K]ǰGtEކB !V(ш{\:6-1AD V3^ Y@3N⾬2Jr)O/!G:IPsIp'*Z+m}J-IwǐH8 ~gWR[:8Úr+GuvFWŧŰFKU?w+%z > cMS$ܷKZdX&wyeEX*BI/=%,PW{=_sLjgkiu- |6{xc '镜n㵳x>( j$:AnJm$d!#E/ɦE1>sJB.6Hq}aUm6:ͦgsR \|'uVO/r7,S6󼼌rds8J(ɏ/kT^?^*$N-b"W"EkEo38'RFmS}K䓭c#rR {וzCՈWI|%U_ BfQU-EMՔZVa ^@kQq&3b [~Աl; x.a"H>0SU8Y)DȐ0K.zW!@RF=[ rwyl?w]~{F;eNfBFf0a7XԲDLw,*yIa>kW٫hQːJj$ W l L>T~Kb|S3Pop5)х$Qb}\v4c:Y eW\ZU o6yJvKtH+'jF+aݣY 0zp\)ĕ1NUwww VWuij/v Z闠q!QW(s+]B eܶWVM#Z-"L&b^ye.sU{& Zf`,x/Lm >?fm~NT(K W`TןVNfSd;/NtkIͫ$ǕTÛ>Uo~_5KD,o84bݼ蓱.}:?؃ d_ Qy@qtzH׾85mOZ}z唛fw:m>* sF2䕂0a7j"jUj`eukq MxF?2[OҰwL>Cզ2e|0</5bc 䒕D#( jdw0_%`Mb^ #OBSR!RvDI(AV5>`Ypw W8@Y5<$SSAޘߓW|422[e(XV&);4y$QpgNISJ2R 1% Iޑ mH}t) ?h.Y(C?ZE>w4.o<@^@u0Vs$k"qXgC?_DQ?Vi{gMHoe!slo 4h-+3֪#/ ԭ{`S8DP`cRboBWL _ B."ahLYSDBt8pw÷$8/}S2_OFJӔrOaү4~澣K'&` Qš6Ļr~xoSdq%ǐ ^݃ D=K7zF\s%gI{aFO!-SkG e4o$_C} %zT!u(e> S#>sO(Vϱܳo6s5ʵP>x ɕs<\*Xq^[]5#a.m,s:ݏu**TЖOo%WS;k w}%haDS&52<y**&+|TX/T*k) 1>b[iL'DzJ\'eS"M~sͻڻ{ALOUK:}DkQGh qc4g ;WK}!FQfjJJn.݋Oo`UքZh*[e\O?PPl@)<.Ϯ{.ӥ]bMtמayM iR)7'l/zH gVJ>^59*() <4ܪf j$+/D6uЦǒiTN _zW2%i]sU11fvwCA9S*M$:-[j]k_p_OY]0lxJvSH*'6G&WeVcߝ1s19ROu?Fe͛ğgd>حkE_kDHmA'%>[kpp^KH\ՎHȽ'fHGnCg9ԋ ՅY}hz xR{$g/kש4zP^@H9q2 DqBu5KR5T@P. at.Ky6Z'%vͷjD@n_X>s}d -9P'QӾ%K%KrgN^f?9Bgew0.-a}TI'J|sKo_26ZZO`a-cxT,? H[vQGJ&0ip^xkf\&lVwr./'}mKU9ڲ_wCa'`kn*,Wʣxե0aUF F%8dtPsmm5z#vvvNV%r$zJr-d$e ,%}2ZR-bv1"Qñ$&:bW"OK7;9,&U!K:͘ҖwQ,Jwe̡)~;[4qa$J?$ջa2[ReW boW=VzoSS"TVk8oP.SvekCOo`kxWjQUܽh:ޛ:/yg9].7-R˛[vasf͛/6TV{"L9"ߜn:R3M;~~/^e7{A {|O>l+!V0Xvߣl}%bN #Yzu:oxٛE(m|Wkje4:5_ TGsjm,Ke<ѰthK<`_[hB ha{von=l_$R*l9~˵ޘva 932; ]3$<:m2M@:t\A|?:H7*A/VzM|@ ^z696? {*"|9_7$qN.9~7ns;d{7]\RUgB?{Z|u~XM.eaץiSũfS- {hBtj-S g=uF}0Vطx(?@0MܘZxRz6x 򟖳-aXm}(}#کmwȜO :C>|ƒW|G${,_G 4 e~=Y_껏N9> yN dȚ.qx$wKaBS9q=>8gک%WKrj>A{5D[)0P C-cۖ1WFDB Ph @_Ygc(ch3iVK_6g +0ʾ&|tWkS87Cpk5>kf  Ej{¹ses(hLxQj i!}7G/OΓ%~Ym{6K? K -ޕڛ %nVqk31WY#=7tKmEr;z?Koz?؉?؊ovt؀Duc?%=O/}5}FNIpx^nco.*k|S']6҇fD]|Ǹ<7)nr!.|.Is5ky8?~')G=ջe|h.yߎ98-ܸLk=~O^[nQ`l G.;X -ĤiәHo0wBmꓚ.w9c{ir喭S̶wj-Rf{1~+l(5bs?i7߁+-/s/pu/ork3c!c5ֺgZ %֭u~NkM=ֽ^ JS|m9с?Shcʼnb|__Ӂ߿r[zV# G׆+'/m/ k"|k%jӁV_/w6oiR 9Hv'mKZVrWk~;5w74ԣ}Kmac.4Kr.+JC^i+m5 y!tQ^iW--3lv63fKiӯӿ̘ 9M-&|8W P8_7H&e}8d[mP~B[tPB9EsXyJJS$q.+5t3~VI"hK|)|8͡LW;J_,SX`rcc O7\w9cOe ݮ]]C:MC9y*+1] ۩ewhS<=͜/բW=[ nED(Syfc"HO5OT|M ; ;3ujjUNk:} gԽ :;5Âʭ ;i zK)S¢ uO8㇘a%Bf֮(mhv&bn,Dm. X` q..3 tɂ]Om.[7IEu8cwKMJĽi3knaq#?`n^8Z{45ND r8l8 ϧ5 5apup/̛!܀t~ pv8N (P<lf?D~]PoGdgtr:պ_:|g?v7~-CݩϮ{am~3]\͕waD~{VI}\?Z`k29ZA&֦-}{))Ud'!$䟄VI($[3Shf{нZΘ+[rЁ|; ]Ia9f\3o}_4Lm Zymwk?kޜZz;} MaNL:{l&?ny" :BF+nQ9HԀӹ80?p23Pxa,}-4N8y aK6jAX5fa d@f$dZ`g4z,i]jq|#[, ,0ӮS i5N@F/3zvrUM 5=7B e;@S -j{N3V!6Yiۊ|xUaT82ě0èeę-s& JAfǽx&{8e7 PϴzஂZK p //n+[O_B?JXzf$qyyYk>w#3yڿgdw>VK.Ҍ҈l'aI~5JH& OXzs@F)PO˚wZ'0g'x9 a|w !-Eoe?Ӱ4fsV_h}o92n&$k,Bm+4T5=8ֽOIn/{Y%;u^-scy?(Jwa<ORDk]i P`@)0VxkUk- J9sKgUCڇ=ǷlԈ_=߲RoO?m63m,Yl含v~6mwsȱ?֛?+'Q'߾BF-W 1|x9w7VU`I<ԘOK>(ǥ Q*en;6U/Nn_q3 |-1Bӛ`NSNYA shFe=g܁ϐuUpOeV w.[34SVy4mh \rmL⾛5fЖA[2i1 rsYYF1~Y1ӏvJ̐ۄbYqCJ ރn#g;F u=Znѱ˞5_ +)nJ+ 2@7QpԘ8 hhy .w;nK͖`m\ 8G`E[Z<|~LS&_|KwV[ QE{JVGW%|=Ioqٻ1q< n\˦UĶF6QY.ۣ-{h-ăЇiX5ɧvΐwam m$i v޳`]= 7Ns(+]Gc{4]ZTÇ9#+Sn;3Vc X٫M²o eq/Ŷf~z+ؚ)ܢ5bl*{Knk+l;Jl[3=IA8jk^B|ֽ)[ dr< <[`M͔JlOmJ@wYgRiNn^31ıS Q(im8k0KN)睮<b@| ׭PSAm)0Y<߅$| {3 Go>u\7ai& _h:;#SGˏ[rde@R}c{.{ZTIyO-uۉ,!$~ 0|~ j2Sw0Niym}V, О{pQLrP fn(ă)fo&=qzܤS!ī66D"k%jngw hErQ4{ ϖ8 xl3`hq([}M3 8f'֬?hO_*~%.}M-`>0/ 0ajf_CsEiPwYxEN xY;)>WljN;^ ,'(1da|$4q>#n7Nm22Xk>dk}l-CmzX..e#LY'$#6̫e@6gBz] 5>ٜU$Qҍ봹 ÇcpIwt;2xa7TI򄼳Om2@=PVb9;'lȠ͕VnAt"9 R?˵Tϴ.p]?ι>&ƒêohwcA-7p4ae6%XeZL{y_8sWtVӽ+l=hE{|XLKvs8gWض\q;Nj`B_E\z蓂'YGޢgz\l镢}].nߩMvΛ k{T_l۩ضӛ+z 撻^ܶS^$mo8J G+MӢfƓ7~*H& 𑣊X߾Mp3/YϮqb tWlw@8-v\lxԞO3|̮Vƙ=K{o x7 P#wSԭŒM3~Ra )Bv zᝲo,NK+iJc&uh6E+ĠV20Zypq=Ntz 뮌uKHрWH@r(>Y05aʹр.-i 0iJ)PΊ]s0V[]SrOl7Ƅw9#s(EԸˊϋ,5FˁAŎMhӫi>4f!BxH7t:ѧԧ^?V}:-7B|q|쮩V}2vpȒpi 'lruA~qaNPUP7a|G%7Z{^EB:cM>ƽ}GCKܧK>#x%ӧsٰyڰ fC>1()=ԊQ7TmrhQު< ۶dpWOw~"#>_"ݨ"Ma>J #>HtiL(r{_gT֫f*ZëkWCbfntO!уGC\!U?֊l3h3b>A%|*m.dtd¼blJ [3qtt(~\}cJd7"[ ǤI,1=(aS?Ĺ[7=&EQpxU LZRT샳I a b*\ Hݣ3kC34s1&>X I-{#,nA<"~hoV밎v//u 䰎TG|&ru8𕵎g%a:>FXd 0RZq?7˶x CljSza.x=6naW2MHޣǤM1<4 w7oQ.YikW7Uf[>{+U/!]V 8vaI]:rCB#FxI? }:>B~dyAbw/%c<7Sfi }pt(_{żWޫ#(#e16{tG)Xv#8LP(z_&gOev$b1-=8sX?ˡoбJzLT.Oء|,c9PnVR}r]oB{0$OܲVغgBiZltэpc:x"x<֫0'ݬ#:[b9c3:按 1 (g~SqH&!s( R&xYo0kT=jġr!Cy@g;7z>,SE{U>:;20;=GY}\r# )z}hAT-O.- 'XIe9c$_b%0U0s=F׋95PG)̮Rm7Z]okŜۊ9|hJ9TԋHs w܏ܛtUԆ? 9)^{wmoz̎Pze%kw7"lIߧZ+k2\Bb.E{ޘ+Y=䃺ZWFKTj@%v>#5l;B(8yoo)X{] 5.|en/kTT&`sCYuIJ<eyU=r>uuU ZFTcWF{lJ2}eeJi2c `Ltť{JSK/lZH@(UbC`zUb٫Fp>BrG$2Hl}sUC m*/g+떀u/)U&$|7ԞrS 9C(E?4U#z9 *΃@ q^N4d?R}xD0Fׂ;n.w[ WUGnkE&nd9B;ޏeAws91TDnU$ s|6"J2طRXQmlE< ڑh!`xw0U)UqU- RoE5.Q$8*G4ʣ3rO6Eq6 H\??ٮzV= => ܤI>(<ֹdϹ:=xߎoXx_糘F>0#[N,̍}Bg M!zxv|1:=o^p &=0ދz_ݬsUjYc>~n])hͷ65mќKUwXlE0.vK:~;e0b$ֈ0(˦6{+}'4RD}=/V©T2D<|.zXsns֫%8/, zF{/ڳmOa?sKK>#+[*g1mgs.2wN7mhg!O:9zN^ȕ\.&O.4e 8|%dm΃h_3_R6( (q/ov\;@`)9ڮ}c~+GG<Ӷs}#Φ .W|8SJ!oLOjSy(vU<]td" '~9~}Y w֎rXrގ?cRv+b!c9kv,g+'r,ݏ_cݎ,Os0|傽SF;aۘʥx l"oo}27dL+(3wX6={-Gs &S'Г0gqaL/Ǿ=Y^+/zҮ^{r=ʰ&ʱ/wqG~55IøI6DB9 6`,=Wn9񃣸\]:[mGm_E"gtA;Kb/i=4Qf=`gSgu$o7n +m^9'&S!Lj2q5lޑ}(J%ȫzP@"g6㑼*"'DTb㉂x`mx{B)s?G(٬:G*^l.@~L&^-2\3R{cF>@tEQ^cĵ}Fq ߇2ILq<`we]eUHՕSvzG9y`r(GAц?XJ6|IÁ/*/vw"I w9nq]i@Hf=QI)h8&&EAAkedIHyCoYz.J=ä+Nj`k-aȨ ~漱^oT̏eGNތ=A[|rTxgDj6@fʊ~|MX7L.܉ܷC5 Ɩn>>ŭywIMutҶ}I5$Qw(!o`3rGU'`5z΃ 5b {\ENi˨hC`FF$;_`*a(xg?, PZGlsŧwETT-8A~V1~YC+>\h@D[zmA_$qhk,)^Z,xw<diW{)fS 챀cA7F nhsKC,-/}zaͩ`YH"ʥ[G0@W FBΙElIv[vRYz>RiU"6_%QɛN](>݆o( bLf0' 'S9۠M~kξ7 BL@ WhUK p*fMwKM.$/:G,a҄[zAћF7{^!]n˓qݬ 璝Ӄ mJ;Ҧ!m vdaPl*qk'A׫e\_W*JmrzīH"g5-ÊkZߧ$*9I)%I)ҸB#?1II 4ט 4:f }a:z ꥰ°Z|O'9Fz6iQ4NAS em5zO Sj;% x<3k[RWVbT*<J>o%Mߣ&:b!t^%QSQw6Z1lybs"8WO ֌͵n hY=˽.oҏVx/wKm򒡟7NZ ^Up-o9r||O* 5ɼr+,- Ꮇ+!M妰Ә BMb=i̚GX/j5fT>k.ᯧO"kJԳʼniwD=%4kP}T" F.B(c'4߁ žŰQ 1eJ7 ;wm5 qs!Вu UF%m5Jk+< ӗQ|#ɿ^oLƯP_t(1ab";nWgؿA,W<<Ğa;vXl|Ė+pKggfwV B֕́.'o -?TTD^ r0X Vys3~B =y i|IVGsNo|H2(boB߾HN_E[h9 uI;E{=.Q2z)C t(dm|κG`Y`˽4߾=gRp:KhU &(:h:mAO[[?yZcmxL9r%>X) PC{O]1F՟{)؃9z3^TM),G+ :Z~?m:{^ 8n0_xhVGnk8#"\&zc8lթƻVV? 0]nM㒀oEg-Zow5*-1)eECl`Wb(!Z)2{\L}b{ {&CZ< A gm FŴ_^Wpm_[@/lԪ%3[er 9ZNW؂XFZhO1˓mGzbj֚[cd?9MGv +~V620_5O]}9xkVrQz"wnH1]92>N=Aޑg¤hMȅgl@T%3w6׭u,j m SЦG;5N5"ցOekzV)Ph-s 55QM7qu[5~c C\C6UW{o?΢{k`Z~U݋D +wiYƄ9p{3 gnG,xg/.:nN{9P̫mX$E[sp%4؅|oYO$qS-F@0rJM FYPrC˙L Y!|?_iAmfݰu*0S ߃i;X8j< Cw0OCCF%zNL!do7Z0jtIsIV Ԟ> Z{zs#PW\\~I^"\Rb@M7:0fpf3YLahGtDZӻs W.w(݊d/NÉJ p̱c݆9NTۙ-r56x߻;/Ylp7ѧ(38\cϨo$x:xpVGY)le[h͸bϖyPKJ\r볋l#K'ށ{f:$лa#Coۀ=~ NB-a=o;*OUAk't??c`Zxn}p#߇"|AxCx? > •>"\Bmcٮ3#Bo?pNQ蹺R%?R |cY57bIJ7L~Wa ~Е~phA#6ףۼpXao5uamE+'suLiH{)Mx,. vq,r:8}~{5nij"_URYO$/@nvMx]Gȕ*pmͅl뚚 S0ΙLf[S`m?s(a 8;^ L?9|-WZ.#eeQvp2MG}F41v6{0ֲ@/fҳ7֨Gw,n@+e]W$g+jf>i8*sqCֺ-'1kd_.~7AR68ـqJȡKn.-#1~ͳ0fi܇<@\|@օ)ּ x%2V_P-Lղd}Y_jp,: z{qHLaO[t8|ގ6[Ӣ+qO\úD w7] 70DY ed.w_!Vqr5,0Ө&M:]%!zOƇ8@7dm>*'??$$&?Ɔ9UOi+?Ɔ=6'A0]{!::ȥQ\ma 5u@@[y~gOGqwSL0;i|߮!.ϣ8<by>?kwx>7Ð6 9o7=K9RMfD*]5N!!;mOS/u{K eD;C >\?߉r`O\ m?5xj.n Ha?n]!P);[߯\pO#|qxv|U< NnwVޚgxn+FV?G=f:>p ;V zDxFˤkd5wM*/r(ӯJȌ7[׉s.V#``Cq\}P. _O w43m,PGޚ4A=TnOwrdX4)&o lji䄪̫b/t_Xb߱,pCV;ۉF)ev0AF_!UHtto&6A}G}:E#q!>Me}sr3d>2 V;3 ̥ ҫN;7v#RZW0ο).p[gpK!6$SL({W+H^8%w*Xh;oIQ{aGCZCe"7~kr ^9%Ր\ ;25BH}| ;;D ^d^R&azvxA&;ǝvRzKy(NR j-ܰ.s u9>,qnsG;CGes9L)H {q@%_  <{v 2)5* ˒ ;5y|9Ӯf~G9QwK\ G չƲ就ccqTWfGQ^`^dZiXQ!F7<<(iLe1{Ȏgo_TFXH1BQ|+fA{3ة-`!Jù>l4`8l Z9}dmvW C7@VxvWHGȿs)Ts:̬!qu,rUݱN;•&wWz1"Yd2I k\ZBgށa _+{Z%W"d:+ +=s^!r;K>r`E7>>Y9멚 W:7}u+J#}109:R?.s͕gk&.ぶhZ5i; 2?:ZGVh?Cg :~pe(֔6Izd0&;ȴH ܂cdiA9xϽ}d^SaRVUgq}mUޫ!zf?Ak!k.gP=W_%o;B)/Z9|WclLeG__sfrfgSh:V~w]~ _׵ݬ.,p>,Z¿jۤRnK}UC(iTTMη6UWWY,6u<[1>,~BUEtu?*.Pз T ,tF@h! P Е B<V'8=YIfnmz[?. !\䏯1hr_!AƇQFPWD7'IPt|[I)m%Ł4`Ihf7Ke_˵o3=`WӻXE9|/W܀9?3Y!pG̥3ʜ"{瘻-x{sD(`V=LzWv Gp#]cך=ʷ;fȋxB ۹kс:kxE7:m)vԤ>#aWE0V1="8#@/ :_+vd }n- ;t c]¯27@ \2 ?$<+ s4Gӱ@y=j">I_vT8P q5PTVS_ꪇz륇_ Նv6W>ц+̷8KGZo}Z]9ik?'rey}sֻqp:a!M1cр{voT?ɵ@΅iO*D^c=8σk"GHi$k'x]?q js߭Ѻr,t_ہz213UQþ]2Z =粝߷g`%= 7;f0qF0KAE9ɼ|NSvֲe'Ov&quOk>=t˖BOhc h2h3rӼC@Oc}q;tH?>V}\m5 _\u7L]7ukq <2VUp'-7Ab$á?aL~ %Ԗy:*TRj]J jt- 򔠇Ҽe4[);B[ =ؓ#v_}acwډZ8Z3 3vz.san_s[_C|>X "6n [_VM$bnY%~A"źjHQ%=4E7_vx4LmѧjxBUiTa^JpTѿ}n a50m9k?Lå|xh~$nwV֏/]2٘UG&{F}ZXm3:uˠ%wQvpK97Bݾc/-K>]3ZI]ӝgD>!O{Ӎ'mgbm׻-+wRއaceo7s%cM>d(l>馢9j|eb1f@Vg<^{k./Oe\?%@{MGSW8_u99~'zZ'PT|=zס3_׊۫ߗ_ N/́q6yv9VX-,_BYvv01n7RR0tcQ&G<nZ;S\oQ~aA eBE 2 oڕ71ٮɴψOzv$ԩz^{E=XUT h݀br] n-hb>FBiQwG/S8Yg셷`m 7S$RiZP8=vI=ksI=-Y}` RH T=΋3 3Hi'Ah>a^ RWO9LS%% U;&zg<΃7ǥP;%a+1CTl۱C(wH`zR~2IOzyZdp߆ބf'5P*nS(*QoN6YQBa\+Ca H(0!)~!nXt !=f_LJY)GuuZ\YEl{[&.UXOJJrg+=s=&9Gb֋{ ZyǴPp>Q?EX"aW<)cb̌M?dc#0I{YP:u(B-޾T>9> BF{H[ kz 6ևr6݃!?wItFP [7}a|PE8]H+RT2]cb!w=}TXٳ(~ d,o\Ҁa#*ic7cQπm}55i}p_TnK#l8t)sr:<kOn_WJgceXlX;ImIsZYVw|)QR:vFudżV5]"A5\T0AV.^K 2B4^<.y2 aj=#` Z}xǐ Z0| 5w "vߙnӚV7ShV39BJ3dӇxsGkWq CDwKD]r{#.z)嬃5xԜB|-j[B'_WZ s1'/-cR SXOѽEMS>|E^Ny<9uXL~>A[ߵg%7XL~mFHܖW@hc{rX7J^B]Bj~&_z5GCf4g7?!g {FقRq&x]5exfŁӪ"jqj53>{c&㨗C8+q*@eX4X;f& < 5[A}0,au6ԉ ת %vmBgs\DX_ϞvNMc<jP-qb7aX;JB|nJ&;˄MFHk-=R!q~\p*ƠD3#';P/= qFcFGh0| ,Zи`4=e0󈱭h[2]/8|S[ƄtJz2MaF\=fN1$ G œPEP)`gӈf#[8/rG*Op8,8aG?\Bt?GCv|JǓ vf7[L{㍦}Mf6^9>C¬T1G .tGSY9G wuoH1Jִg] Sbԛ_ūVJ@\!Nfk(̓"zǾCQz(vc7O6Oo1Far?an]0zWC-46row?otŁ oQڼ)DeA zJ@oyf ^sNfO!r4 t'9w ,+8J f:s(J+x>y(%_C5BTE.JhI{B%7vbs>p`L_:;=2\c9G**~!菮 ~?J U+ @lG"6O=A˙F ' t*{f'A\Ngn+_*gaR~g 13"lcm@o7G3ZJ7{RFLǭJ${BK ?qZ #O%D)!IQ55g}ڼhٽ=(_(5a5URJ }d$N ^Hn*Q3ܔI8~ YA~ ȱ[ao;N&,*XX]7r4eNZUw5~&'X4XGd7 =BGI .yz6OT-VlZ)ZIzbkq$o(KbMǶhpv dڮQ =X3 4{>5X݈X/mzo5ύ8J)|boc -PV7ڣ\52uqKyAz=i 692_22-(MT>o4W3hy rICO(+_a4FS*E2溣1T83w3m~5}ێuh0ͽ% = +gvGy4.rc nq4YoጪLQ~dWs B>Ft7Kتw{G+X٪n2ح nPhhCN8CC"A/mh8Cژ.圙nU߯Þt0.Y B/@+حXqPy@{nMɾ Q"ù||q8Ojl0LngoRlԻ[ȹpNn]ҏa!ӆr,_5 TjL?ešNЖrCL; ,y0%o%̽-890V ZY?2O΂RgLag¥k!)z (7{fw6OI10T4`)x&dz Skf,)z)Opt!nuH"g"oSPʈ?OV--+|Oh"͠؏b*:iⴡ}t>mY9q׳a qHzӀBv0iϕS.zYYK/xw[HBlOJJI'} ϙ-O{">cgMm@(_-lB-o_!E~_y)y]^vzKQi0nXCnLene RU쩡Se &MwsJEkװоϠIcNU푘R~}FeJ Chky1BM ͈Ms5ZL7ohBkuaUG"ۓOwlOhmMzlM ۓffdծqo1nhǭ{%lHpn%rAс.OG=ꇃn;M/w_o^%'/:n+)s&m'-FfQ^-_s[IHWtRaQa;y|lC_3{WU} ylB^1+o;"/yAꒃF+1/v?Ooq^eO00fQw=f%]\'nn"oh7L;ݴ;LR%M;BNHٕOJ )7m1N C9Q1j ,.nkM]G?6rPDnaT۟&+*(g&%INm v/9{q.{ZzMI uB~ɕC]x"ޯ5%Yةqxs=~ i!\ ~d|ĢH5VXF{_ +Jr*|N2mI=eUό`N~iDӫye-WQ٦y^i͝Uq{mtM`CwMO(f[{#]:1 wcKAru"lUK= 00%qb{ށ1;Ļ@ Iۘ }$L[.Ad}y*.l[L8H}~[B oEU/rz>P֠C{U}3',π$q?7@1Ed47ni(YA+=2rYgo{iy#%kطQ^٫-%gz,9^7Գq jQܮJ2EbejJg0o>",A@hO qK{`,a_+X PL :l}WݜG}?p'S0c2G%Qu5-mBoOEsnn{L@y;̰41XzDnG|!!-/}~uQFE.g}I%B9;Y?5W?VЏC1z݋BAfu͏E!fk[ſLg:$B~\^PO:vz_ ѣrVD1o|gE{dt֦?=du w$_@{Z3~ʕt4Ksں]&G ^: +aߨC 4'`Lc>$К!m:[v{lzl@?.v}q?XֱHEY| '& g!O^jgsMKI+We2Nc R1# S>L^0iN?r#?Ss&ؚ9;cBĺ xS]} u>vS 'y?|;}5$3ֳ;s7>׏0+ߗR,km /?~N,E@8.…}CVf o~>8Cq[%J=li$YqhtW9vSP7d+q2μD–F*4b7iNұ464.m0>s!p.v vH9/z,Op hNfOT'ABzꕈ h_źHy^xS}7bǕH:FDu=Ui7kgbQ41!F-!ϯ;0IN|eIͪJ'-2x9:"Ϲ9 xa7wZ|FBr3n|lxxLc\ "|dxvlYblA,e٩<,đ ]p~.+&iz5-Kֹkt&:n[\^Hkoy#2иu .Jo ݺp.%Qϧ$q x0.|Wl?jOI-nm˟/G!}EVG +|\|MF3~zI/i/; Bj|e#.AYF+qǺ6#n=]K#ǥs[oxeG7,8vs; EJX҈T[\1ёG!cg0٪F##] OyFNr_fӜ.:_%b-;YgWl]yxYNEA^J~y_0=gCϧ3O3,f#9kD6dJE;3t@2 M)=:VCkbXJUYβar{(nzIHrQ$NwW_OOmbm -f n>Ɣ ~SUrip,I3zTQf*̫ՅJljDeqUd`]-d9mV2YT5WZK }uKXr讣iPr:v rӓ0VX: a]>PGߤJsKiu_G=_uDk%]"Fm'L;AI w]!ЧM`KhB%avG.@@d[V* aJپ0z m{A@%@wnjD~H|s6;d W1i[ꈿ>%R479OH.6n g:gBqn;|cE% \t92,Oe0d2@〲6xaIR@33/ Ϳ0TkkQYl{ܷ -P-3"hE"Q/,N&ʿN/):9G1CNXo-nyƳenu>;m&>NWl 'cO2E #TC&Úx`h_@+GÿQ@8ܿV^P+KK0igDZBIԺ/1_is1 @;j{{=_EKqXo<0 )oiC4)xwbNEn8ں.tBGarx ‹2: ~MhHNrv7`n `5s0/ql^֫n4ڐMbs,~*~*ZÊc*ڤXm*5rFgQJ܇eFr,ٴqE?> e,<2Gf'x,~e^XC+U%b0g0z,o?)g;747~"fˋRl"}{ o|oO] ]-|r9.#.3.86qq" RD/WAs<-=3zԪ,.oŶ'pk*ezͨsr}2Ӕ u*+C!nlÀU>*h))9HP'G.[V}S49$ Z4y? .?]^dHcud]Gm1A̧̧l[|>e"fQ\=봬OGYQ8bnϘXi:>bG\rQR$uXԣ7z$V+.<1YL'F8VA[ɑm1)o0mbx~XޯMy]Fy)'.(yL?1⶯49RJd9?ZYq&x6;0dmաG떐O;r'lXryPl{'٪@IL=n@V\7y8?=OPᛔ̓4i&F= ֛zs͡:[Ke2pB uRw|m^p @>4R.,2MpFP"5ײ*X3>v::a?m<)CLp\Q/ED}ʥ>7>q-uAZlOzx$i ξbz}VzDەg8.jgvB=CV~"7@Gjyښ#})3 pֳILOE6WLmb*m#07{?QV[Į]8: L˷ǐy"6J; N m P*UiyZMUm}-3S­îj5u  zmjL])Y~_̤ ==-Ո[6r ?P<89 YV.L%]n ?"фqbN LIR-OO6@۶)9 [d nm }X1}Q%fjqԧ}Jr]C;XI*z(k3uE'.)~B'b+~"~{W^9p%zԽ9K ?OCX' 麄_t `Hٙ2h5h,uMľLR[ڜ;m>u @ad? iROʃZ'ΞO{$oFZs6{{w=kg2GϾ}ɧ\ ʊ'mGrh4>=~זY3V^!rYz!nkl+i-9f`gp혆ݎeM!ȭaj[N-uz Sp&iaJMT2״`uܥq]S_D[ayc&&᷄ĞrcњbJhyfN\xùPo8#Rx7g@h;bi3pte43k{Y'3X ~!K$lvOYԏ4۠NaA҉@N>Rm:UX9CO'򹚇"vbV{P7sv${S]8o"ӫn7pwwwQgv-w}JR6u^YNW^_ @7z4!ßV}I1Жڼ^zr-߈RI]Z+%uFݒWsνuen`V1Rf#yk>ƈgʯ_%#*|(PS2*ӽz`OK2|jTl=buQW^|S~l``h8#ѽ_a+#o[Jtb5U(̟\, ;mS]m8c׉o2Q9k*]RSO- )g:tWC W?}+mgt'#ŵQr_IMtYk~+N(WӮ(JN[e 2cgP'!_?qbBk՟cWg3YY^ݡ[3f.T^ 9r~G9E",!?,]Qz[ FvR)K#}2@Kxs3@Sޑ$KtJW\ *$YNK3"qd¬=$[ӂS נqύMr 䏒LhKkį%2~㗕ٗTH7wJ>zJCMkNZMj$h}\Ե:w,͋h&hdٕ3KꋵHe5lYB~!)B8y2'J9UzޫV@Z`|oeSkԳΰyW C\3m.`j?.Ko+tmZj2`e]x{1 `\O]rH.h ?~t_az"ۆ^@N?q2%B+VT1Ex+5SsN?3΋X>ġ'KG Ǭ=T t>/軡4jq7 ![Es-{?<$:_'AZw cm*16YY:B'A/M  ܖBr{xkjԌfh>19O.# :6lZ\rn%PU=,怨g-:`1YȔF&N? -aF` 4o${rvEW}D£.ے'q*l>ZK'y>`EzGPGb LƐPq˹\dF GCMnO:?2w׬gKhdRĨ7CH1zӬu@ݖ[#"1lIZ3h884&y4lʼn=~W`)285gmH"mL$8:g8oHļB{ZҸN<#l1A$L?ŕ],Qi YU&.{OS]eܥ8Gm @kԧT8?_y2|e **[],v9\ , q.>v|ӐR}h4/ܨA}c>%LF-u"e-#c}x_e] ChTb~-sJp:>t~\tsƹr˭oExjs9@u'hEαe0;rh jjrb7g"nM(d,g[xDGnziÀ)vs;)αCKm}IJW Z HwCn[虺@xuiD66N|C{\QҪdg@~,kX(ffK d2I(avCYeItY̲CsIXB bwyOvgXF@=7ov6g33~_oy+p+|;?7[-SGlV.:Bh8+&<nCX[dM#1w1s Zgּ{[;{=  d,€2XMk*M5Jz ܞ<} pXo|NY{Sb\ۧRNf'W2JIBXryY'[{nJ{\?0Vܹmv\,΢2]su9ׄɉc<:gf{FA xV\_pgt[\y%M?'H" i8#CmzfA lth@R#=?R#2/EvOG95'{jЩBl[m͚C Z|<F-o(g4@ %FفTݒȜc[k!mW[Vښk)sRg;U9iLd&W¿a^.I[ww+PzC! q|>dE g U[D;3Ԩ(E)b^3P"*cAg0{#̀1ۆc.Y#p?:8?G,iC~#΂F28Fqs\U=%}+mymmm;bm;f:mhQ%צsMjL$D4ZdDY9},'mǠO \stD%"Nʼn3~F]tڙy<}-Oc>ucm[[ugZZmmo^&1=3d{Zِw]|J{m*lPύԳ*xк~K{Hݦ`j&^VOr3 چI'*Vтĸ@]ih/3 %H _'K񙬨s]TRRs|I =ٞg2. ƃg#+#AGoIȕ~NL;] A[|^Wjb୴(rV/rԦ:}hY-LVлݴ.adN~i(4L5ӎ6zJ8t5,v6t ; W63^Җ1ryMd-u#o|zeOm;{CGu~zZΚ3{SeGgPɃgJO˼L <NØ~`90LɃaL/Z;gy`ܝpj2=x4jKx-%rs<uzr {:oX6ɩ6\nزH{VRwX+敛 [s31FLrO#3&NH$l|]]vt>1Ӈ/`#~0󡠰}//{O 4^ҏ:nu5ru=-3 ?wYHju]k-ܾ #te s2Sz7C;Jϰ8抏y(KBtYmSz3sh#k"p ;1Z*1IGS<[h[hu9chy)Sf u\/ݭq,1ADxR|3BξGjjvhϘhcLBAx1Pzw%/5x1@PZ=!FREp>:Ghh9c 58rpO0UMU|f밢8̜aaE3u6mH/N[g1)&FVK-2POa6$H7KPdթՆ<^>E<=po2jEl[0a"kVJPa5;ե;&mԌ2]qF(=iEY i <puNv␣l!}ulK14V8lKZ#yGdy^ QM+8+o`RL7΁w|n.ϓ0eJ OZ,Z m8)_@J]怠 2^Ez:ߗ5ARB=.Du^NК`Y'Q0(-xu O >q;[;F˥"-$sL dmRmX3<4)(s3ebl2|=h);]OW[Mgz`( >-B'E|w}7~׏3MqSm3WU[#eu7Gz' @3oTOcPI6TYռ.^†2v HHHR;So5_eRx"H_jpD:9E<;`.@J#R!Ꞇ6GYxݪP~,OZ \K~\l> r{@w72D[,"+VB? [؏O5 Y0.QƔ0~_#.y{ s yivK`P9@]t(%Z8]O_sxc=F94LZ`9V2tI:mܾ@agCtrmXfvl;+i!7fud?Sgi{ |u\'g?1`;|`xQ&+w.1]xN*yd{mW*̵b r<x^JJ o<7z0A=murw@ҚQ+5x4Oیdc.ai܌aK;%/m3> mN s!gU(7ܸ8wΝeLtW"bx&cG:+~e f՛enoQz?je\,h?7:XLF+xV8 ɋwYb7wJYs= י.Ȼ=8/X+:{sW<+7:N~Ph^^o]ՙE;Mq<;tvm~pA<𻯛Xܤ۶wmwkJj-niF@MzXa̡9{*P+N?"V:0go5e+2/T:sM0W| ,eo4@1JqfR\8pfe-3zQdl8qx2X"ę1T; ß/LYX't³g/+uwɻIHy+s\6]\i{g?%82ĸLZ/ٷc'cfn?Hoӓ Yul%o{jo1kG^ cs*U{ۆ9M &Ԟń'^ cqTo3w+_+fw ciNqO yzZEg9oǡ NHڵi:0h̫='&x͋>5`70VQN;XZ+LZer\un'漼/<qި1?vpw.՜lZe|nS#y ]ó=BJЍz%8 2O/V&Cwo_dм=&tw{z+\l)T˛@MU[٥sY;.yr^|暽fr3w6|Ԟ3jqc: kND:=.Wsz }ے4+CH[!ϷnX#mgÀbN`#00 շM7s2=^bO&͝T۾H1K ]:ʈӬڌO^̟_IF }|9v~3SzsCװ'Lx4/n!A{I=R=<˨S.pym̀YD]T1{++vJ]JM136=oÝsAAQ޴qNK(rt*BjDžXݣ?LlB,APGVǻ*~({z; xN=꤫/Z$ݡ'; j~p/9e;dQ -]{cL&'Qu{:E|Y29 }LLNY CS:B/1=~iz~E=JgԺ[zm- 줱Og gKdMvVݠ'K37tUcePZ{|plPѱeg8rC'Hyt6`rF|T=bshy`a_> gklLP^8*>2gPK"/DûX?5LO Ѓz={CB}0e| SǕ*Zml" #3 hq9u_Gf`t>:> c#V/0-:ЈUC.5BK9@>=rчn2E.^$8#xjncnbZ*M~v?T0m7iǝ'#^`y``0 XgmC5ur[UR&֒mJ'Qs)зt S3qcT~_@7Ҵ[˶铼^nڠ.uQ8:XK @^w^'CO֣`Z%]VwMWwߥ'!r6Mg'#L.YwP@|Ѭ:/1m0g[h=0>zޗipzWC_l^Yg\wϷ}Ҧoֶmxp_n&%^qLa?r,?i^?g.:0?_eDя*^S Xa0w"';kceɃ;>y<~n}XO GtF=|_s3M}7T{ܩ 8GfvȲ啔~^9wPa&GB--Eh1Na N}EBW8Nˈ[c š:?f$vbuP8'h,|~fM$wUG)nP-eE#)uf BP|^OTe_Y(joGS%L5?̻ώmQG. a߶TI[ޟa"3gdw:zr`ՈDz\{F?)!z~e3ĿS/R/깰!yZ7E t-1~ p^"5la_882ҿOIF?'o~'{IKwlpS>!osn=zWϘo]&х},w{s6 YdRR7\<ɉȳ&zM<\&q.ϰszN+.Gz%]9_xwۈ"ba0:]JU J={q "$8CK:;c\>X((fW4<8}米režOYeދ @%;qBY(wgXn׊Ơ]<0?-GG&UDTX5bZVxK𰚆mb50d-Ppyr a #7{WsW? vg^Gϱ wʣS˾X1X/a0˥ac1ÆgdF&Tepq7 άDkVs3X#Ls( iplѬnZoP1.=1C K Y_1"tJ yN3cQe:8}4ytqߵ{ ZvqD/d -@^9a'QVMsj 0 !D3Q{3zօ~X1 r_ G|8uL6WBy'>&Ϊl>w0\s0kxDFrYh+a~CY[v%[jK G>>X!g|;qY<@ڧm{`t~RuɪHh<b҉cR;WF9wyrT[[]a|f._GK*UuV(5XsH@z^;<OZ @?|ܣʾ-F?7C+9( #!:+V 8}hVWAC!fܘ1 "ipƙt8R0Čz_ v{[#I {彠ŗB_~{ L>rdtˡVLS|?o?^x|t뗮͕@[;?_̯q0 ̹!9z^ĸu5Pwl" ^`3[y3]04I-Rgz%~O׺S?rM(g=uQ5|b}"_uj]f:/_q'z7zw/ z_Hъ<ɰ{cBU=OGÍv)`dʏ0 -;Ls#Z\JiL3EH[c?@.39A?G'pZw eHMBdX2=kۦnTL<ٙ.a3~cԦ&n=m}n ;ƶtbOD4?~|Fv0eaGC_FS [|o404uþ$=)F.ϗhYS4]}KN݈O3IFFld,5z p şfl>NN0(zՙ_S _&G(((hC@Z鳯m.8ʰZ^>$G#DVѬihat}BZ4G<ߗPX{\c:Ԁ`,IFjey*?mFP9pnӒIcsG;LqٳS*Ƽܾ>fY;^0gݙ]"ڤN34cmr$WƗ>ܲ>m̶/$߀ Y =s`(4Lwy|Oyu'˲`)S빯/+jF)ltD3Q/^U(zk=2gZ)j&ѲyQbhSB/՘aXU'm/T, ~O~`~N7k =5OB$g_܆p/$is7'ːX(j@d,c<a܉}7f1_{7H?V/~i 8e=#bYFZ9ь? s !Oن[Sns41]w6av'x؈Ae5N@+C R~[+$PWTCQG:?5@Y@UyQLȐW):-~PǞa ml`X.5o)>ꯧnaj?VUupM錺GGQ+'1[oI.S\Wy~(1L+i|)N؏r`}P 7㽲'b1!i~ޫV 1i.?i 8 $Ph2b0 ߅[ 10.C).@636صhyo ~cyJ*1K`<ͅ\sgB0 WnΚ/4&֩1 ȼu=z9|_WXY(`V0 9g*trgvu7VunPf{{iu1 z8>d_bdBއɹ^;rW6ܶDغeӬm+G|ښ Uua$Xv`eMaE=ٕTʳ*M%g3`D/2m <&?(kn1P?gT1Z#[`E˜ ]GyfEscl;ռo-17I[f %`ȧVV41>qv5wrXJÊ+><@jp&k]VO؆[e!cY20&{/B=/Qse5qXKe!3 Ͱ~[ӂxk -`r:Հm^Ksr8c]U^eH: eRTzCe7ʼχj<[{J=V^Ne[z8E>,*|[1v7؜ oQɶH1<^trMS2Bߡno2Όpks܊K|HoG_X e fjEndкXl>)^2 f[[y3E|\vM21Pĸ ԛM1a<}Tꋓ4fp?"=S|h|uh ss:Om5-TV+*ZiD孧kOmp-ȡ(JP$X6>s FO=DNi}[9͏6F{[G v ֽ~jWwA䨼^Roug(ֵWuW{w[،DzTPi{{O$w˦G/"䖯/  [NR94 HjR 6FIH~ЯT*h w-|K'BmP ( G(}>EO/+eN"(iT4m+ΚYNKa52^b;EC1pOqi]EnstVKL^닫ͬG <,C{3mJyg̎1Nzg/ק-^>Z*(i\VʪRh2˚]7Jۣ F)k@ _ {1zjp P SJj IaR_hr[A7N/mci@f7X`1 F|BjZ^x!Kv/Kt2W^퇽YDݗ`33W[J|79ASDp+kJ Jfx~6'ӞoL`/w5g5POgeP¨Y~_Q$JOힲVr=x3|LɥҽJGɆ&$# ^5í|&[3U=qyivO o;bCc?JzO|GUFfspjܞ1/ndo9/:6wtÛT.?LIg6r@]Օ5OFٺq(˚wKibP[)!'C%eLd]ݜ'LuLJ(9$\@_4rBf-@H3 אGb.v!ƋwsVwT׀ި崔qOOzf2+'3 j}Zq.q xb~R[5CCH]{R}35J/c~i_D'se}S659w\^7À5jMhXef+Hsݰ |"KH }4Q;٪?A_wuha(⳹=Ka~]]8&yZq jCh>[(6nME߈8o)@PJ$C{a z鯅~ ZSX(qOS)ks^<Y:2#گTsZ=E6̃eA) MsCM[{U4fs  ȿοXF~Q k_b |/|1kK&PWȿ_)%dMJÔW`)Lm o8gּXL9@V(6hU`JN&i/:ta/ezTH5PUPԘ-5bN@&2%Dad{ngUx ˀ-e9mƍ_}5^nVG+vXB ,•'6נA?))DD[V^6ЖYq>ezp2 Lޑ ingcu s[s.Lrɸ.}MWGZI^KQK;nP U > F?4Yhɚz,fɾK#*o3n&/@fK,f%2k8xpP]7V֬f ;4RA\.^-;6f\C?ϐ[qyA 3R&ˤ2RB lb@Y+?g1 '(ƍ9G p x(*dm8nB[f2e&)TST|7N(c9@/KgMc!* g׹>pl*s-u)Sx-n9OHiW0%;02<1q~koL!UenuwDc֚#H1{k#^vC%Tܛ%'GVߟ=-p'V³ {Z}X|_ȹIeϏ0Q0[` iR4 Γbejf+7L{e"]mm~V) V[`!/2H);ʻ=N1+i33?pLT,Dz 1!$ !/ߝ/geƗ~}u:ʌf%0Lg5F<o͋y{&\`i:>rd_$g1~0$e G;{l?Vl7/%mˉ=Fm 8O,o W[TSg;60n3)V1.7xad\.j@iE@-nZgC_L$ľW.]hbi G$o`$*#|$0NDPE.hD|RӐ9cmF\߿ ǹ=h89 ^Ѳ)~)Y%3)%O7r={Zkld㲁~,~Fc_#$2ZSh$gޣ65qG` ƿ"\&kHbR @$Mpzo'`P0]PCRى}Øjf\T>:^Ĵ7ͫCYsHG"B)[z⏩L oiP?=ĦW @ڛ$MMwiX An0Ǡ<<\'9s7vKfRC3[Ħ'i, ];{9vs?閪{գzDvsR~9Rxr%U"OnO]ZQp A-~n7 yE>Hk gxgV}֚tc8Plbk /0>p] @X}zbF[g>4;rU&FVn8~dpǖ qn8J>88[~dpv1?ǘ^ ?rO6.D^菛Z/8nvg?i?1#k\p8dQط2~(2ۦ39:C5ShQI3WkE?MI?&.S[KhN,1j7 Q2wq-:N Fn,ڝWH]#,Jݞ"[k9$VzZ{Q S8z(%s6P K'pq{w"P=Uue#5j](V^\&qm櫕fmkvn&McX-5Ra1jzǚ}.P|Uz~5|j95r5 ~ W~@M݃ejѧo^sSL5e5Euj9|#Kqj桬R6x<,$[f36!Gm$}'Wi~Ӗ&mS㱻_ mėO!h_cceI7l @LB0QUOArO taul?03Zw쌛=`~F~nKo Y@"NJ6B{Tw{ u5WCB{&'C} ʐxb%ʠP;I6qXPъI&4Z+IIx7~>B/᷏V&qmK}1ٵhmP/͈1>%\6m2~ɪp"F&VFƱDnhZnXĔqɂx6@o%zKF;tuaUUT('XXت><{`<1]UqSi_7hca`MI·pNaGT_iە~gէ~7 b&[TU{[Vy ɪW%=| k^}e =fč{j{ %Elã--~wG&'Z6om{GUe7o&!@ȼfB 8H &*X!b/kǮkwq]k ({}&!~?3n{xt EZ৲αC0 W֖/ +^:B -mTk{jȰDhfI~t0Wiз {ӴʕV}nbE8@or6ZG{ΖI3,OrSZb@HA~ݯ5*ݱ6?Y-`-Hd-|fLS M0v\6<T0~]BQqz_'Rǐ +QD9) QL~(~Oёu :T˝8m7eqm5J- )t#ء[]bO 756aOyNe5(<؁:Ũb/1x aYouGV\Hw&iO9C[(ZK(ԅж3+?Gih9^ΉF073vvV=-tпsNOV ~,iZJ̩.LsVw\Z}"<'O}J! /G9ްI˼]ޮYof:DNڟx gu_XtMDM=>3{/ GȉJTک;C񾎾-:įِ&u Q@UY~aNfFi4ef[#_Y@#:w`)Iґ]+ce˸ 6efvb'(HG>0Y!*yT]4[vX^_z/q/V,2na@kvHqÂ*PX(I1Msy7oRh'W^I8U>qi?ZQgY>afZ?6;*̔7h,|GӬrLz23D33`>~YO4g&P\[X?yZ쭲fͣSȭVa*C4e/ ϕ4er=4V)w zX _ T?sq=Zq|xX;s{ [1-]VplrZN~a>x4{xȧsB r}k(TR׀BxPՅw@ !zc`-3.rDmu3,tA6`"aA}R ?И0=c# ґ2!%P#|#\h,]7kb݅ig u~ZkϴJ=ٷK}Lr>J$/ړ -j Tz5#£)Å|/i>(S߇~g^`V;ĴmnY_y"mdC)Td}ǸhS*|8+ PnWԩhX5O*ϥ{f5C:ĩoG߳#pέv(/ʊ JޑlU)t@%H'tͫŞ.0i(.:>ħQOe} 6$alaGoGZ B̺)b_]mlAA嚻u+zV(Y :0 BVU~_,IrYYz_Ȋ w9u=*ecsCS;F'1 ?a7y*]ЃY{9 Tvbgn34.TZp [JB[&3| A39Ts 9ED)هroq2{ ܗ>vлΌï1aY(:(_[dH&ґC/Og XXxNX\ci؎XUu_P.JNש dx6:Ykq +G_e>r@ڽu7xh>j:Y_((JMʽd@PJi|9 p~&w&NJhɋPףXMs-ѳjuv|>_7zL>! s7+@=Nqm'h1wrMQ.7Oe7vOmkwRQnj&SBoU\p'D-;hs~>0 {|c^NFP;F݀r,s3/ghݜi|?yn&ұm&onx?y=Ja5*̧!]Οn{r lw,z -q=`s]}9|oPJ {-N/ќ3;V:ݯՊz݀J?za8ٜ-WA\vn <FfRSr-8ބXBhk`d`7czCc_]Ě52uľ aQ#oKg"&XRN[X\Y` b;憵Aޚ5dfj --RhR|!ti߫Q&|P%m*OTySmX"\dDACqgV.3Vcv^L(쉍_EB++(.j} =B_"omp,S1G5'< BH)ï s BC\G6}+zѮr:yݥĐxt|sr.cx\3OX~\0 Or2y@ͼ>w0-~g-30~y B|G=Fb~E4'cyɹ!UsgHb<yk)N|Ȩk+6hi-u10s {#6rYJbyO6FΕM7[&~#aYuנڙgJꎆtΞ.dž8i]:Ҍ0ʧg@i5sj)`6-EYy`?[sj+M_YVu | i2+ō>$ͱylI UH6] xha8m[>[n, _+I7F:IJ]T^ـDu#b -,deHu8sE~YAwr{NO~\ZKiMߣ)hU&є[hQ$ݰzД\ӃʟAg6ye[ݠyG) -oyij~S4~;x篃pկVnf3ۿڙɕ{4}6kJXoM[Ctx&;Ҫ+υ!Aɇs².V+qeYVПG#^ mPj2ZcnY{6faag _E8ٶXq25[SBgeHO7--<an2oa#Fh;zƦچ6v" F+n i4ZΉ? gyo?h>(H; vp鰓ltf.xJ>iⱚڵ\+ECYFts\" "ʕ-:2k pH q> N^bZ*uNr=ƳK私䧁 hC;s6ߥPй[|fL+9pmM5ifpn=@nPH  u0)Q(!4[ޒq>(G*ǛfV_޷wwVf|_r 9vx9Jw;~{[dv"zy8Y!qr^̭9ʟD-|/|S'F9xc0btNnަ!|;Ss䝾TwޗZ9n(&KgwX=Swc }Hyltʽ]f8fmߢKͼ[raݼ?C!|}4cjjs9ԉ{ZWH9?[Ի9ciN֢-ozȑVrBy]^}",C ][\5:Pp ?Mm}=,=Z/['}L}~$7?`=CsSc#]&md=nɰöcK΅ȹ,̅:>r>sA%s}i^w^vMo#SwMUc,3^Ӱ|O:11? =,-ډ=ni7uHO~_d|\?j뤥԰|Whぼ[hM>oFq[ㆧ˞"Y)}5胠UOMYI $֦ ⟲QFb ReꞷҧQL6{Hb|90|5bDcZ^QGga^,\ u|#1y^hRgdӦ ~ Y3XM&b:A jt{ɢS3@=Ц]Z"@s':Xtշ(ϟw橿uMAY{?y v` NNJ:&\߹hB NeQd}G-eY}ո7$s! Ѣם7`GӨ uS 1=g]*0kY(StA|jXv>`&>$u O~"Jxfǝf+@[=Ou> ~o2\|/cgp֗|"Z}̝O_Yا9Nbf qOĉ׹p Kl(m3.n|?–QtH1JWXyvz|: jQ3ygA''bSS2Hl9Sɩ)̍#]kbLG8 1O~'iB|AI`u9gz|Zc2 y6Η[=tX_2_kgS͏3XƳ@U:̱wi^Ҷi]E_x}'ґuc!VD8Z&.Ku?g࿬b,\_EUO2kж`uxo[V&1޴27,~9wϿFf߲qYn;~i䅼mZδ׹f r7aqZ 8( (MM+|cހEx>~}lkB>~z}Xa(c+!:Yn=~66A }B%Q )_kK7V{LV+SErm 4Ce_µCi2o mwY㾄otDr>bq2rVY i@VQ)\ZwMX6$* 8V(ĔBwmo~{h/8 pa+O ?.þ .`6[{6u3khUnV+b~b~ 1LOWBF|fwBǐ~fxx+7d_S?NL`3mńƬy^2;߁amCsx.Sr}i7ɒf<}+B:Gc텶?A4]Gv[ :|V43% ГU"zF usQ)QN95,UYFI>ÖP} |idg [_M0 fD"W^,}G[w޲In";"acEKtt!J~T@y(!|ܪ ysSxA7DcR*%\>u ~gG>@ά֘/E<>$? f[sd\/x/OٓK1ITu9;m{+k4n/׬5| KQalݠt9~IeI!4? |GXٿ`qe:紪g㿛ȯ ekظxx&'>=t?!"E^6Hw$L-ȴ?C>Vi| lfȫv gBPJ {]@:YGs7Smhx:U/:zg7?c/uFf4;3;LPqط*v sk5;'zGbvNҼoMZ-zTvR{w7zkmΨ/hlcfab]59]Noso'1vzZJߠ>f-žZ>j`,;NYڀ)H~0YB @G@"Gpp]0rndi M䛑0"ue(.5 04@6 ?kĽWۡ/3qw>y;~ GPoaaη*񫭆 Z sK #k~)na1^%{^DυOz&lќ)z=[oR"}5ṉ1!{=|wy%īa&P݉(ʞg=S~3.gwaec4Tx?n =2yF*tySxPp>k,Dx;aL"©b,JJKY5fp 0㰄9MYiK;sJ)◂_(э!h?Q z׫ pH:!$6s03$u63 OB3GCЍqgxJ"ws?'75Rg/٦-AM7{(Wռ;Ԭs zV$-|UXwNI_@I% uYPhѿguɷXo)L[$ %G!;V{ #M<`'Cnv0?>`MdG+JVg2pg6`t-CNu5x*u&}"ˋPxs+ÈX/Ikи8>)8Xkܾ~2>)} aPOu9VrV͎6rPl(`//ڗI;WV^ۉ*XfjP&“YJ;<ő,b@T]xeKPH\XbsCEkT݌J@t^ZZn."f2.Q(~FemٖؠD0*Pa%䐨U!!kJ2uBk+:qL^e .*fN^eO^me&~oHAc`wYCi_߬mҪWZaՍrԈg=oEocJQJP494 VƊE_@Gx+vOQW{I|?*@yIh܂kwќyz>^/X >7F]vǧWk)J?hFJS(9}US1tm)1E=0]_TKAR>_yo Lywf9LA45N~94)zpM³ >hӣz\UV"_1g(RB ޸K58VzJ3yk-Jq0׫\Oaz˸x8dp"AZ f,"쌂ːrCr*@K+/o..k(+攴̻ +p0}jxθ 4_a,nPˠ`U8-C0ilZH mqkH71x5H匂-?٦'dZdRlTo0Eٸ>]1TRNq/rpO/n,2ֿcd|q݈i~و]`qAN|ڝ+Gs9ShWqLYKQM~ktCju,nR&$E4_+4RWihåt&} 9f-&<{F[]` 39\h<<يg]d/FO<YKwؙoͼ ->b+:WZWB+AU\|k»>}2JXy$ ,W9r< e_vvsB+ i 04RUτ&a>Y.L-|g{'u _8w^9UuK8[Fa} qMKF|?(ym[zKx"/Pz!t$%k4tz鰏xt6ĭMZS5ib:!UXe/>lYWY 8:SwcykZ^g JF Y.J<{(S"a ܪ1-IX2{#5gf=LXʤoi|l{{a';AK;h_}NS\F)8+L?DE9Ǡ?BxEp6iUt*JL^Mڣ!٦Sl^Dg;Vnh7th3 Jks7/(٫s<2q@(ΕGYp4Z_pxJ/>KwJKk/]ko%hYeN–T3po \9M?|sN\v.<>m5c=҆'o)-:w5+rNR~7 )]%b^9z-gYr+g(G^Ԁm:V:%InXSwc ?wǁH[$-'RP}/5iF-?gPfcR )BCPs ~G*DqDX_obz+Wf@XKv x8[0ûۊ8@z< SX Տm&)ځпTVNwd RûV$.Jd 3Qʿv(Q7.7̗ݭ<ekBi7 kIhω!UIq[{ĵ87ٗ{ z%.'sUrf$ ;+wT^:Z+Yt S(2̒ac߼t{a+92y%RpVm2&v/  &rIxQMs$qjS5RbK>͒){WFWFlLKя[z)@_A xWYbUrW˹f.qMnee[^Tq|kc /os@tdR=?KDJ{<1=Y9LvӸmPc֌cݵPuKn-wY[K|~mYg ԉ Yzz DFǮr|wߣDqVKxz獫>jjs&qLuvꁻW ܕicȆ5J~.xFvQ|wYE Ż;q#u|yh%+ay*GC1f[3=b(j+?*{j#(OPt)UfZLPuQ:3l9.4Bycx =7~_GzN<.ۘqo"7?hNBZӲciE;%=Z~d;e5F-xKTE| 3?jO9"[kܒ>u$O~lrM4QZ/=J!?uǽ| ȏaO!ƤZ7_5 ^:w KQߏ0~{m?S-&BŶuywvfTޝe"'(/})g5Zr|4y8;KPkS?-CV{c`蓊Sz oS]ܓ6tƬv%7^h|#kں-׏XmQy$\= e$L~Iʴz18Q&!c6 w(2#Dz)1kngw35Uy61Ч:_goX֛x{%LX%}P{RPkBTҐ*Yavpl/z<&;cL&Ԯ#ֺ|/1bysk FVdm֭:Kru7VӤ^+]zNuNu: 5:~aj`.c1|ڛXo,6R^4UQ6V´ϳlyH&erD'k q1 [r/W.;[Kdb.$O/|UĊ)kg5̜BV_-q.u؜!DR;kf{(yZ5oY69gq2vLe_{9_?Vg-{g?ZIl' :a25;۹Bax,;CvO/Vk ֟)3yw~*:e3$t*Y\ {Bȃ !5#ߛ[ D] nΚgpTJ4za%u6@oLPnmDwxD*l܋`#ZkSX9%%tJR]u./'qfkI`8]Ng 4`OtpV!d2ghu{1pJvC)P+Ӫ4牡:&v*SLN oXvjHY.WϺ9:z-SSdIBK)߿~"^;t  civ+! /V^uRVVέ [yMg8xz]Cln |%V {Xx c٦6]%\=se;a]G p%]˲4xSr{>ڋ( ^pۅz<e0g3 ,)7QF@ ??ɳ4ޕωNT o)xѸ `Q5]Sg7jaͲN׌wp/j- i&RgZXP'qFtrRd}~@I,TLsm^giFyrL;Tn#5esC DX+F[aUNζZ" Oh#m7g}FgȨ#6٦TNkGTg;Jͭ4G[2†^,Ya%[=lmG>6*tc b! 韗vTzmPmAe!ng^ճ-j<[,W֬TX҇ao71cmyOC,ޑj'0hL%"Dlܿ"2U-o"kQ6굹3db+wZQqn-ﳅQ:~*z2jso;uB&`}j[X\5HFTkZe57Un|(κ*B&^+R}jc&Gn(6Ю((j>uau?;nK3cs] 5c춺vbpKrjᓰЈ.I(_I3l_ƁfY"g0{gCTȪ*pdMBZn#m;n@Ң^ He%/uZ(ԣ=_,$;X3qU5FXhjhR׿;F[9|=P3&PV)!3c)t`<ӱC@/`á?٪-Np&hW0wv>yHTwarb VxhJرVڻ1Xzd8Q-RSAL>PI|}\zo=~5?Jw*ںow+`6wWݑƀc2 ZE;M۩}"a09mT-n_IwU `滋jgh[TB?:YfJ? 3:%I ^@ܚawX*Ymkr%ߧEƱ.ZC_AIv+0 2ىLa6u"5+,t*vm@!öix>_Js;ׁƣgn\26ʧegv6kO5ժH}\#YWm=,Ȇ`?awGڍ|-G#a9U^es&Xf;0 vh:Nhe1GٍbrlC:pWlO/@Kd! qwᙢO4C} @ԧ)lH t=1S>jPiԱ \c v:֑#4=bb{1" œ}( ,^{c#ч0c9ɽ˜kg$ r>0!AǶ?>샘_bv1kcm+;¬s> n̜ N]k֜m38R;wη7H;E]<Nn̴M=<>w C72 8cn I|6wA晜gEKKt~*UZ9p5kyn9 qPFϱU ̝ߝ;%SE 0?CFbyAy瓐tSM([`'8= O'عȓl^k{ԉ˵9[7tpÚt!&r)?W}$!DPns6lė˝dh=k/7u2\2+]%668J4-R^wǽ)l' 賉Pգ zzϚO~!5zy aE޹ ݏ#si^FvoVxW&ؽK&$Tk`6Vjc~VYe 5w4ado5ϲN%ecɧЧy6OsgYG5 vC^O6َ'::ҍ֦g@ CeOt\ٯ4fDqGQ?{(Ч(S;>Ra'hHC¸y^jX;|yߓs4fOt~x+h[v TDӻJ~v4ZGTIr7u(y` /̸l^uq=*09s.t5s[؁r͂C uB/ǨSm.G^cq8_l̩vN֪lȘPvWDM _E:)C__ hӃ|E4%q=,z ӤiNc),\ 6yX5pW)M{y;3'߹Eʁbd.DlwҵtY}Ggee`m6gI?v`<=Z AS^ʭ""K_j;seOřKlgSlJWMw^!t*0'Ch/FG/"?tl:SZa4QRJ\ޡڨȊFt}:=Qle?0>W鵇ggəنdohk^{֬s F5kT߼U˳zEq%y yv_8FDIO)=+O);Қ5 dUeo*FgR釮&t`S,V-hbZE2Lp{̀L-/Oݿe8vn_fr~ٶO `Ob8 }C }'ngd+1'xYog']#o@4k=k;Hƭ傹{%{;w( %_C|Oxƽ!< #0?<@P.08 ޚMo4iv[d:dkL,;Sqs#NSi>q)i+%zU;ˎDR1/+i-Y(R; W)sS!T3EhɟL/"7u͚jToMn3b };\mJvTl#uA[b6ef.|6*+@?M.|%,̆?gķ;Zt!ZY1ĝD?Wmw![̹ycr.堎ҹŴ6щ`q4F I7b15M)mݠs)>ؙ<ݸ?5#iڨǺ'<|_+YX+]\^evNFnegl36N6ޥ oŚ,?)>Drυ_yGy?ÕW^V78| @<8lXS9.^u 8\W^_ɞ{3 Sžqmj~Ӄ~<qyX库 {kRoՖC.&?~sW6Mk];*cbTg! L1;īAnK~a:S3#8BmʵyЇ"<\orn _%nWnxt#3eq[7<9߼vܒn͋/[^Yuy^Ҽj/^oƿnSdޠ27Wه},s<:;-c/_wÖ]D0{yk%r ?p- ?+>qw( -yyjs~=kv{n_mBۇ}=:-O^s^{N@t!B鹸Ӗy1{ȓſ)ˠ#yX{ˣy{z,/|x^xT' N2soqyO@qQyիI/KW;c[MԀ:>NCl"fׂ(WuoCl雼3[V~[~uV%iFO)vO.ȧS@p".ǜڃ1[+Q31[K]&SM8Fcoy;ig9@}sÿU<&&/  7/N!| Ȗ|-&z°O+WXH`֕VUHK/&XjYBۃ:_ٌ(PJͿN^c46o%os~w< <(,S v`t +R&{ ƶ1 -󭔩{.c\Q(ZKr,Q(?WmxX)Fݣ]-"AxsPmuY\>]QeA%~^nWd^m(Cu1%W6_&<<\&K:.1Ȩ/.yg妽d;y_sķ^_^qw^؋[Dj$G{$/kEx8ݑ:{aƾjgU^'~RpU C-5wv LA cᑵXE{(%k&[ >{`~ToV|H dq VOoʡݯde]y Jʚg}:߫w{Uێ]J%µS~hQGe͡X!Z,]B]"z!%<<)RM {EL`roчg[89|Ȧ:Zj?MiI}(}ls_a4kj{D<r7hdyZKĘ)ͫSҏO?IPxC!|#gJqtxg)GϽ=6&|26vD(kAр=v%~FRLq6sXqO@WJ]3㈄VEh k1v Dz*\NvV*bj^PbGRuPbqOu7*]\574kgYf\cFt"_\ERb)_ {>/czrwz5S=`ɐ`"+($$ 1\1DkUZ ?wu^w{躋z'/NWuo[ˉH@zwG))攍xB\{ Kur$ }q} Vkh]qZj=Eq{ K=Mvٌy7EV_/Iz4_Fu~]o[y?l~/Zw#A+_AɦmO6u/M%粩VK A_8>|||MqQ^C>;xO][W<{ LܽӳL""JggnɟIЮ#H# Zy3t&}B:?釲4wB:VwjWU@X<{%S9aN.asO9sWA)3l#UwST s.φqH !|j솰ҵMUyo=DD^u&lZ 7?2&~O$7>~3H~Dc$6o?˃?σdoQ;ad=4)*e o爒Ys7:<8ỌqԽե|@N)Gf}FO'vy9!* A(8w<$;@:& ].8U9ń*cH, A4@$gxc4"g'Q<+Rf 5 a$RA>n>IsSh_?@7F< PG|^eTбCjO7yyQ;D[EyBύp fՂUjn/ |J A\Q_E $EEfnkW\OҶM;" LJT!f_&]x67.m>6J>pVMYO!g6CG-uԔ=A'+Z;EMzƨ@Rc%ʫQP~}P6=j( 8|}s+W;y `{&$Jdžvv )Z*k(O@<4t@վ#t o 92['IO?6?"ΡE kS6VpmXju/c81v@=Ү:B0={ͼgڍtT.-rvP7]hPI0Qo DrA^NԒZkq(IDjx˟PUV%֠qx{5` xRiͲb(Cy4nÆ% Nյ%\u؞AE)IZ-MGYD򲯍/xm|][ƽ̴ܜq~[RvMm0‘SH!*fhH-̫v[z[!6:4~ n>Dvu,aub H͒;NMTu,=ԠfQM9A<\6q(ӯim!g^Bi_R;/\hL?WC2)X;8BDGiU wV}uœig@; yۮ?cL˴# ӛW@c.=B?c4B|B[~1/?.+!~|N͚V}>\ my27-'mBq>7]ȰNv-\"O)N$Sn\^^G ؂2PK͘5Z29w-Jۉ}? N_%m{{[w0o&c>$W"(GHD;ŋf;DM>_ w46jQsQUC>񃁒C!LM O}c>E 9P$m|'<4w.Ћ\7m΃FI߰_QuOH?a&2|?il';˽ѓFÙju0}<"ރg5RBo:)eՕӹT+KQV7?۰dWa3҉ q#L9hx3l4s;c̽GF2WZΜ{YfIrJ~K%.ΰ9;ą69ĭ9;UviCs; ,LsKrYs0/lZ}a3WΖ=̅Na.oA'j`]٪L!/m^^_ ?\a^-YK:B}~cow_+Gfg/(}ّ_W'}'W=`9ǃɃg=<%<_Y^Øi>K_uxgayg΃Ù_N͕E2@aYs zYό4d;T."?9c,gzR!0U}y  _ N_փ0=4VC+=)<6JZk/Yt^!wcֳ\ `(8gHN-嘫R_xz0H; bmYvya1o+ExKReMQȲ gXZG_$swB0n:';bǟ5S| ]s /87W>c.Wrbʞ mx' ԓ\]111&7bmfuu2ODġ[Ȧ^H$_MA){<8ӡL"1S|*vU1>XjMu"]~ nYԃe@ o&;]Ҭ,8?ûVhkD"YV%nhE4g7QޭfR)ȟ`?Ϣs"\6tj*GggH&25<aQFl} Nڢ|]4+$ҌGA\Q'm;4xrOkV\#i֏#[hAرMUU KB[l[)+P$]M:q;"x!?1y;<_"twE ,%r.1z_$|X@R͠penѼmqx^ Žq;@Ѝ>F^šb=f=6oK_:ܲ0QSv [zZmes߳97߅AgC@[:j;^ʭqKiܟgl[Z+$MUQvVO^zV8 o2Qs@rgT Pk3= 0sQݓ](E@ۜ@+ ~ӯ{e\ݥ~tΈ0NEȋ힬z WjH_\3Rƙ5$$~(oӤ>Fǻ ڌKdBЕ uE,C]d:5Ԃ:y7a>QoN+!wM NA(Y !p!4{׻:P_ R?랫B)$V&4!I`(x^G ;/_ucM'~UA}yK1Wμgּ(lͫ|0fFUmwa&7u)΢G|ٗڹ{\aP CUj4pWUb.KԦ*+n!Wqiqo,up=>Zĩ1#rN"j%\.k/9 {#րB5p+CYe) PZ d?0ᗷp}cwqD< f=Q@)އf^Gd50=^Zh|~׭~g Gn\Z | !63;jd}BחVPaW(t?;pa9>gvxxFĵB@dY8F\V05h('@*s m;4g)LDÆpSn145  >jg|h@bd<`Po@-9_}{)X-|.H}\Qp3vV 3-'[lg}|'YP1"d0bA::9Yx!m!u_Xsnnra8$. goFm8[Pbr{R(8ܻ5g1V-RFڛձѪ LӴ尹b/^GRꞓCcuh![i^ba&ுlD{6؁ О "Yu2XQ912a:uʓqZ_UN{9i}q]*|kKJ|A0L>Jčftn{,gzkQe82^2їJ5Q էc}T˛W, ptg]%C8G_dK.^W4'C'RQ)s}ʼOɃͫoѤ9+q'_j5} .#ys+0N*Zzvv}g~}vu!սJoSPF>>`Uo_ܢC~HaôM_U]ǤO؄&e^<M[ۧV{ fqX`߱>ՐvEZ>3[ÄSXCʳ۔,B^*}E5!$ֱNx!>7WeNr=\Ayr˔eS~t׶(+i|,mdn\[Bj|N&4LMYɈ' C=AM㶲2-wcޜZy  7g4n+js}$3v $v1EP_| 9hk֏H*X#:y/c¥lo,eâE^oѼca4oD cx8 MY2F2QM3;(r>GAo^gՋ+cO3Hs;jHb5r0A45n݃yYD܁zLoqn0*vHz9: !zoUL=MӉASAӂ?Fĉ7?gZ\-[L:#D>_?,|5;s:JKU`<ӹ"V=Zq1gc˟ym`h>9ϣ ʞVMVZ\b=QUR%auC+;vd+NWJ`҉z Zlor}>h<&Ls>&^@x Rp_qQқKIn_J(R>*ZTݸUboވ˜31+N 2*{};6sJL<["XẾ<w;ܨ̷ۙFzHy#ƙ{c%6 aG{1BQV>"t2!;P+t}m+d>WA?Sp˚I%=k/VJR<['좞z.퇙iTJHi8wg=;g,CXŏ\F39(#Ih $?(L⏣\Zn&jhbO-@XcSͿdh&Zt޶ނ ^/%i yprip~*HgbFOH1=9.?9&Z"ia_M-"VL'MDeزy^l liS\blMv*RY7. <ߡTm1rvy)-P?íj3 ifatF8cЯ!|v9ೈ,mȚFkc3woXz5.w:wZSF>288 ftuca|* C(Jsik\FnZFkx_9?tQwsar Ky<S.S%RV*yͰw;D/wqXkv0#w7,k, BjcI C 04 b=ۡ pO!K M:Q˟qu55ƿX<~jI wF%UCdcQ6wvN*[HΓXG_[޶~  2r8˄qbVK'gT _Dq -,g|fcfuiGqzrޅU%qHԣrmWmqv 1>wt[qZe0-5Zٳ,'ra?㵂dldOg-(ogf)0aZMrZ/']VtW̹%z ̹e\"Cвr#G_?e+x^ Jz,_|k׬6/7y{rZ;$^Ϲ767 cL`< 's ;˜WΊ72'<1z[x2+Erߟl}S_+b;UIxSJ1|ai mRF>vmwzHJdf˹4vK2C׵Wo_nrYx=RMsVuoհ:iZL&b + INu}h} )R=8Ss uytJ_=}q./7W_l_Trv:o, t ˕{:u%.}|> kQ@#}n\pk;#nS8nPe+Bwhz5NB[ pc7e =l_oR_l,RR~?A%y6lN&9lٗ0#077 fgNgԕ2bNm\E{GŪfp-Rfa}x{ja-77s%ggu0:JǚD5e9ky /Bߕf!P*&*ud%L@Dݯ:o{_ s}NĄ >fluXNK}<9!} Hy !G~d867Qߍ}1~|9e[6Al]Er:7i4g;*ש.CR]6|dض R`>=C{,ϧ`|W1wnS6wfS&?ùol*9:ͳեw]%NǠ-oCna/HN$зdc%[]`*˞YVQy 뿠8ׯuP^%_-PDS)ViY uk͍ITMKV0=}T )#igTmIb7ʋᗵGjhr`9)̶mLD 1 -ʺ,Lۂ(. P#c$v4ӯLB@$(y%mpJk"HO ǶлcWhлǽ؀=iaFՏa6ӁJBD<kr|lu҉M'&#{}?83mOO%y>}[HC"zucM#Ev ΂BOF5\߷ },><`J:$FTA. tN:ȥSN>,kA\?\\ͮQDjlmq?una|qsEP~6=١vsKh{dic_qo/'%-ؔQϴlMý*hѕgU-}AK+P3)K^ȒAnS\߬&B76{756$ownl4tɳ.E5\`irW%WTĊ] Q:6\Bh6ԇ@omڥq)3ywha~ YҶ]bں'K+c=Xb,zn㈌g7̔;Q+G DHXIhּ&8^`cv37/~ ED1/lSƾڴmۄsrco;g!׮#OCgRܛ/UuײWQV{L}Pgꕺ h-}j޾zoC)5zZM6omog^р 4.+R6_ \M(;-P|1;5I?_纫ezT0_ "7y7 7{<dDJ#T`4+y G]Vċ$%9WX6M$8}-ӳF,%;x{aN`<ƟqQ9]@ٚ!9{fv˸+OQ)W c ԣC 71QvD ȓ\3A q/VO^<{sO۟{wYM'9_.p_.Q]P e.cBPoJPe¤ezAyWA&4~@]i2[xg{!/Rr8 hn)X'ΞFn_5qi~Bx g6'35L64al+h_[0= 38ʍ`XMfHK)L=>U)+0mթj!v<Ve^7l/]HͲoD,W9>Ak}; e4Wb $,H_i`N}gG(#$l<9ȳKQ;VfA;kynrL {˃If(l:P:ޢgٗp"W8\C%JT? Ʊ )#ԃ!跮DBJ\ g0? F_J#{t$g9Ða?mR\(aaetbX]!̺hC'ᬻ(47hx7k%Ċ@`PV&KL~a} @.`thv|N8)<l\ ?Mda@OK=j~TO A/F|T8<#R[ڛDĐ kR d5$t߇I4ץYxDsa$8l:r xd ^ ZsAYvu/lf4YB9IK"ƈ^ךa@+ '!3K'"U9Үa}*)A `E1 +!<8Uv61L76GXxݗƻ*r֎zm 6^ޗK-tx;NFRWh@H\1~zXϑٯiGך#h ċZ׎xAX{x =pF\ k]In}guâr HKdlkHm "R8""Icznf8>Hr*QAaEfV-Ű%ᾏjYJ U p8K~!)=7 m>h;wn,Lolx;er+71 j*)G>7#\,wY Ywz%έm4X X?(fء?4Tq8^&8@2uA®33?i;k#K\#nD VnAmn6Gi _8ztLN.$fP. O I4a#m\oZH^7Asq,\yINQMy8a#x (bbqV1;o*]&(-l0ij7*j|~-*'% `i 'դ@{'$bUH9@ NTTrҤi'+ehS&m}EtH!Gv& ]AԀw\*5_!_8۞.qop>8k\:/ +sVBJ?{8\#~7~ԩpgczs:ߑ{e%ݸŝ{ Y$^r"_ILbIw=^}Ŭ mh*:q/iwLp| !d A+aR4ry=XLj((4* Ũk%4^\B{lTܾ :DFp\X76x.u Q'-MG*m{ULҲs|T*7,zs:W ~ҥi Bzht*&4caeKy&-DZa/W=‡ȇWYYvw u(Q'j7x}LJ4v믊&1rVB2?z:=ؕO7mt [( ӛZ@TBd ؾS .,6ت0m!iD v&p88]MT| ]\bOg`R#1 g(Ͱ%Bfy4Ӽ.ovNkzgCq8V/I#H:v*Aj8UF*pZiE6x?=w@ϥb:9@NN^OZQ1'߹KmL.ik6ӷ= E>%uA [e!"ʛVHWwa o7u },9([V,0KPLblt^D`r7[Sçq8F_YZHτ aAy:aܺ#xQ0ӶZBR_c XHNQky!̊ROokRWV`4񱋒iKAZNϰ#`7NFѺc;v&qdJnhJ]V>Ri?%G])@۠.TPo>Ikl뤨_P{dngcxsk@d-2~ y²gCRY͝bDܫz4~$דc>t%o௒vj:zK4tfw!p9Ff B^68i7֮H);0EPej^A\:[iV+ v5W\ba|C5w 9A⻕l3|)QgO%}],4l@1o7j$w|%:ics_bK%9ۢȓΓ]vwIٰ͊2_-oni㾞;H;Cvc =\ F?¹)~tbga%}| ԧeک 5Jn5*8 P?YXv(6FuJts{88p{";Ʌsir :(`bOL@t%"W6)aZt)9O-Қ\G [_J?hovI9Ӆc졪*~fu=љS-}[? ?d"-Xeyd!-gdnN}rSP]6=v5agQ+n=?Oɳ-bv*r9y8.o-Kn?#-(n [E=2}81|F|ñ'I96ґyI6ϵX'mqδ䙶ER}iX}'yiV ogv-p+iZhT͵p'9汋=G)q[:յFDZI\ýZ&88uJ[bh ,sޙxCLqn}-B7!wWzgJΛY0t:m?.<7mrx<‹+Ta,{BEY2k+$b@}x&6/0tPE).J'k,.,,+̚E _XxrD{M3EsbP&eEO X{U`l_\}YV$G.^[z:|l_9}x|"񑚾>r|7|EvS3E6Ogz3љ ?/WwIKNNug6<{۴N_;.k-8oJ?yi/qu:c6n}6uaiTe-+ɀj&V걕a)6ѳlCTD㓱"dyobӬgnXsPg(jltgQSR_ uPww{V`;E:iҟ?^d:?TR,=F vBWhz{2z(xr*CHz )4z ,[=zdf^yԯ+/IqݲJRs?[dzqD㡩GHr TOئ:cDs]viZZ`y0cXUjzn wUfM]44/khcZ8gEES l&*G|X>[ 5+ǔs55Ҧ+;C^pG !\>4G L=[On%{.-SUv|-v3 JIêYRaQ%l{_յE4'Z͌x.Nȁx ]e\/U')zR.{cJv8wFMvc,9 K*_땿nB;~:wVשE\HazU$Eq6dr+'ڃ&NԒ3lt pV)H5eQEX*D$V+.0 b_UT/%c ca<+QsQ(* 5[$X" X׌SRyu)fxi xv.vPOԽhfO5ʹ(L{b:$:mѿgVAG> =:VE\{C X$uQ W4\o&QxUstN d@ *A Qo⵫{(⽻% ޫI®?ϤWU^UW=hн$7lpt~AvTtiݻkc3tvn:?^^?Ѥēӧ зLd۹=ηSw-։.wytCPg6|G@əl>[6pd#=@LzʹCmrjdػ~: ]i*>؋ ZKH[?oMB *u99cJq/Dnn~/Ta$5.8TЙWPDXड़,sXVl%Xvu:n{>=- np8^h_s L_zcmsXk7z2];]-j"̎4M4CW90^޵|M9{퉽g͕қyeڈ*}{čΐ.4;|t(Uh iX f$5AR!{8}t'GdPJ'~O8Cuw4[B)ܜ8PeРۏ76q9&i~(KUdH'~ynۨF= t9i&CnߺA~ß&CTAt+^^:f<- [cXb ʐ9M|mn%+qQpquQH+֣&y6qa(zZJk`͠Ѱ:=fTS|xoÞfxڡ݌³; <zE =u<32xMKY+Uy>@=m썔Jdq+퐨b&́GWm\YtSJ8+4:GAh?e,i'o{mw(E/P%ԮfuvSp{J+[{no\{[3yLo۽eKI:'OV|jR@KdžUZ@+ĉJu6>hm'7\z+\6GteIyN_X¦>QFE-ރЇm{zzi[snџ47h߾o?J5:}}+z`LU0~@ȻiNәWŊ5c`lߋVW䕌7v$f^Eg|}^YTϪׯNI*gXR!n;fInxk@"ok21}'3誒]~txhp6.:t*sQSiô4ZiOԠK{ M4:diAi0 1>دb81q0e 7N8XNB F?kvD|n)ti^(vc! `L,wឆ1SԥzK/ڻhϜe+N PMj݋oߖvw_`]$ܲYiM[G zo}̭ HʨP+P1oDփ`Wu$ F-鏝HPɚ2JˊJ>DžToߴ^):N^!ɣ5|33\sM\w3 ~'SN`b|aS|/Ɨg9-&.?ի\QцWx ?RؔB?Pެ5FTalfyFJ8^% $UWoR /5(h2Dxr ]|}쏡Yn)!˛\ݚĻk7JXQ ]#C'Mʖ]z B+恪 d11j''*bbȁTAZJ}8swieE\e=!>TSP6=>o~g ږ }cp7B{|>z~}̞dbW(?s]Ur>^13n]p/~Gw[&\l9+Q<΢T(OvUfOtnfs]1B4I#21ׯ}1$ "h;+IPE`chpD #I`#^j,TɁgh>1 *KwOKO_7h#ϝs}x{B:`{ :^VyScJw֞8+W!nΞDEosgo:P,>~G/rxKLQ֥r߱o$9AqC]`\An{#WNl11,?>VҁC5{Db 5Vƕ)Ir@$  Kh۪*l.~Gho9Ȕ||t=I iH.ٕ.ArHy9|p^pTSZ. r$!$*hwtqZ\GNM%.U^PL C~m$?DVݖɗ)C+JvThԆQr8Bޟ3G=)YP -% I뗲a=Abm?>koR:w?0u΍m/6z;Y6]Ѱ!vI{/ -2h( |ėߗIxڧؐxQ\$rbS!>fqJƫ}:L; &7InQPiJt o_H%&pRI!jEQ\$4lR셟I$bR~XE$)֦… MJI¤ONz Y rtd PWlRƓ|G$~} x$uIۈ./TtmPC=7i/K{_ӟԌ'HlSIuA56P,` d%`_VZ~B}-Lhg%i~4Vj n+rPZBhTS 1 DSqV=N@fƬL'R:x C]}I Sli%x@8Vd+`x8؆|K­T>=)cW Aҋ?Do5^N|)M"tx6 yQSAcd@QA}@P$}2b֨O==;Yx d/K@b@[J3ѠrI*答=􅐺|! *>~ A>6/TYi5u50-K eU>~;H Piŏ Fo1Y\IBA-d!]G$09\uOŊbEq`A}RNu5`QzHcn=[ΞH~N UX%'"a4]@B.]İJ 6|48y}DX'Z=9O1ӡJ!6Qb{r=r1e,C{{g*arf{F;Ed~6~M_%~7~w86o>n{ A\?O۟8=m/K[OKO9ҋ bx" cKNSwe ΊO)5[w)gjT)$jE QKZ0޺'k]+P֋xdtF3q##,5%<~LsdΈiu,s:"nY'w:nYNGV! uDvINzH%k4_s#u(C5D& srh8<]NgEEAVR٧OAiDU~zgABPG/x W\ts˲[~wi}A"hD4\&X|D`~>%pU;pNEJ`P"bDW58rq#< q.21DN0ZI؆g1ϼU'C6jv . vFnڿ 'AȁV ߿UТ>嵃yTV8ghf߂CUFJJ} vee>_giH{^YeY'y\Uyx̮ʼ^~5F 1(EGº>QIBBg]FcO#Ǒ~PeٗǏ90ہۮI+á4HJǟHy }h,p&A׉]R-~F'0H{8싪ob?_7a9tvD ;(W 83dn^(ms7UJ_ow b66 2>M&{H)0h'+~BZoZϱ@wǒT;o;P&ӡi~TVG@#(W)iJhY'SeVsc#W \]а*ʏY ~܎HܾN7ѩm47H36/պYBښ$SçIMڵ A]8ҧiqy=.8Q*|Zd]X=h41JT>g|ͥTR @ak5Vop*p}3Zk& sR=1 VG*V^<>:S3^tEx60wF, 6Q!aS>K'ew+ɼpR\:!Wu_$ : u7տo'XFw\(A=B2+1hT0Y%vIUc[,^e2gF 8k&G_FR,ɸft?8aLwƩd<ΛI.0RܹB90Lx-!-wOav^Le!6F ݺBQr/!Cp<(B<?#ܮ _6Y:`w71榔m>j))TIPR#f}zHecz>q&WXPo^0eL0'kMh/uxJbh˦HM1^KfyjS6̧d[3Pl#E"Xm- %|'>2t uf^z{Zx)P q|*ds"?kk¬<\͒Цjls bԔTdLL*fD1pboOݠ#T(|4jO Ўbx:DNmtbכЧd+bMOY[$`ݔ}$ĵ"gc`[KηJ45p98H;=jN O{ə*j ֆ9շ{RiGƪYo:|T_^ Ѝ\<[Iz,jӐtj3Rf#Ye }K*smn!~ظ|Bc9;]?.dN+>VY3M8yQi!_}r2Y8ٝo{t( <}![dpXw~IJdHfv-7$kXdk\_2eW)TuZą7T0p A 0_g*}-j/xgj%QN)~!?/+l6trc!0fZYXc2ܞ_2ot\ M#@uf?_0Bz{l찋acq 'p\f1!Q6q̄<+lNŐ.B0lq~%:֝gvO'|?7vv5(7|IVf(t'bߠ0X}47}c }7 \:7F@'lxG+!Qxjgqg[[м5ob_ AؗAM|A3h]a@h)gPufxoՂW>y_~u߯pM:3Z%'uK>=(=ut>]b5{wqΦ&6t9Q?Gd.\{Ӟξn']+n{`4=onW=/tˏ/tL3\,tZʪ t,Icne1ߵU_6݅ 7 S E5b:o#6i.ߛ<Ƅ +7) G9B/] %ȥav"&HrnRBmoE :~xu ͰŞz٪0 4m^/EpDˬxsHmV5y:s_S"I?0MH mwd?h=hKQXz/Lv J)(ǏB'5v*Hdz@oՅA;>4ߪXSPx4bBtKW{;RhmL7!w>Ĥ<]aǾߵߵ0#=~~x)VQ$ep#"^c{x @i v+fyٹ$}=Iyx0gS3gShfViš2\ r\`TB@~@ ^oԯ,@n^( wϬr9Aߦ߫_Y2 jW~"bϨ΋QU(Ϩ~Fu:gT?3Y${Fu))or 'C=pC>Ć> .{(l3;ț {K*)fqN{~26~!jc [76B_җ4{N{;JZ*y 穘BiiT6DJwd^_O. y-kwu:N3nmq _acEA$qPh"/onve8SO-WhAӴ:-H@WhhGS;o3[ Ö:T6{!Jv KY^ȬPX]9frmϐɃzQ 'wсYʸ& gm]B"_Y6Q9|T6vȇz n;l?Ă-^7s.q -cZ/]7pg}j20QGWl IJ|`E.9o9!v+2ǾZsޜŸ/%nC=WF[D>hdJ5F#_OfQ=& _.yU9HU$bJVatw{A0|UwjW%^d ]ۮGPv*}B뽡\I{ Ϗpo(p??3'o[,}WE61y[,>Wllqn+u-N~Ƥ0䮶b80&OZCbo1BVD bk5)*I*0_&'l />d-~*q< a͋rSgÏ 'Z\ɶ=9Au`n^k jV"J ^{,WCr}c] fd7I[oTxL}csSr+SN^ ElfyݬQo;[b߇spQ"-`}f78'J&B)̔VaU[ 9mji hȩ sĿ|mR,-&V?2-lZiC 6ZbMhʃXʩh?6ZLBc IET)%95;S5UyvWqE 5%[9?Ϫ^fd^օQ|S&f5.xJ- -uyy=)mϜod8Ik%I-;iFPrFw-`9sDtdj9&e$ y UFKjj#dSwMN{㨜< az5>s}60v6oo>^5SFJag.e%D&n4d m/Q ]v҄Y"lМsʥ&&[,K_ V6gM[M c2Ꙥi+vӆYi߀_<=yk~PF+5H|k%ݸ_#6ܨ[[>$, B!%RWj-V4-.myfY/& z-xXp uK))e־mldfm8N{Y c¬АM`~(?a@8Z= Z}i1;(#ۀCqA}(2׎m'jޅyy3eg{ۓ0M۸6+pHۭ҇eMdk7K|ރ6I}`r/yvL׫u←M\{: eioa}J<ۄ]9w[g>u7#@ɞI7.60PUBc;o"+Pg/" gnq"fA0+7|J/RUl tpNfy3m<澕@6>qCO6REj'x1oNiKm-",Ӈc:mk,)dXN߲f:+7/6ReG0{Dkr¶􏠟n?fL&x0P9$TJ,iޔخV5m%~|̼~Oj%\a]\<#e׫”+W 6yQz-lO.`9讗)㩰5{)}vમ gVCo[H7mHNZsNڰ>MmmUei裇g4j)eos4) l߼A|B-xbǞȇ N% qP01Ea"q5Ԕ" iϱӂO,Bv2"^qzt׎a/q+sR+ _p_ϼ,Ab_sq/_ }yb=3_l=]- K[Tv¶v}V8_}y&5 C/xBjïspx l?3}E.$ǫ`}3{_t|u=Ja'F%z͂O-E*w˛\;'mI}a쏰}3cz{2qR|n $O靎mgk6`տh yp~ԃk<0E߽~ǤBj+QMd0dӅ_ 7[+h H`Ja?SʾR? `p._KY"?DF;6vwC݅H'/ձMی4G >mP#HOy --Ӝr:+'~;IZGlޠݯfm?R6"YmG a޸mLK=ooќ'ntwhe̗9~KJ?S۲~,/m=]|_|_vwKcx_)w)r[lV*dr(!CiP_<4j]]=ÝR5P7 ҍ.醛M/^/e{3Z*fHNyڨd^.Э˴lKU7 uExwI_GD9t;7/rRc6J#S%rXc5߰M] {: PJM׳nF$2I]O >Sa"ѯF(cҽ"A= e:Zf>"!:; T]mj3sUm;q-{J5{7r{WN-irC eA3mҕC6ctJw@F`ț|~}4p~+_P%{4B^üo.nNT4}gÝdHNZ_}\:<Lu d'fd}^.n1̒DBXnQ{Ẉ~9#Wr[vë|]׎m\zsļp^pb3[mKDT3W 73fqud]kqx^}Y?9mބWN:vk{vx=Na8xϊ0ͭk[.b[2pFZx/ՙ&xSKɞJ6ūwRYɍ1UxoicYg$?.SVຏ[pivA^AQjC'x%*Bj&PLZĵJf ϧq<ַ[.IRkKwBb o*\, X%J!sZoDbmovWo,UOqSvo ϴr}_~Sm,d&'!agp(gaoL >Nճ 1t!= N'\?Dof m3n" Xԉ1H pm!&7zщgMm$N=SƃGx/GezY4~.ޠ#}9Z81Mܔm}_MRj7x%=yb:tY x~?'!+x>?NF[6ReQV:M i{ʕc^ˋZ̍։O;ZanZ~9:cD !r M7]ITVSނ_&}<;tLsq^S?r;|$ɷܵ7𔔱5=r܃rۺKrem37~^ˀܾz)^FVJt8Qd}8/!o9޳ěvtn0iI8p|[ usZNeTȃW26VYFM,cIHYj|&k9\4\ZaVhdX'K8*((S%qȍk8n8TY  xa6zX{f4O-ŷ+}Nt[}\Q5e\O*w.G}-ukK_w)A}Ơ`|}+!x^#a}!% c%e}v'w ~Teܦ?i6: q%F]tV&+ZӀ Owr3iN>A1ܹ06e`0&I`0&u 3Yn0\$`0P /nd 0Nxpܭ+4n̜vzmJ؟uC qBtں$́đP sذJSnwԼ&A?> se#6I g Q4 5A1ןĀ|^8iU%f3d81_9EN PW˞Z5w1:-CC 'z$2KI0N0jNxZ6rrںojVXFUJ*G^qP晕 b+J4bgUU:=o|̎%*=cHDWQꄴ;jn>2W MARR)#cR*i۔!eƳix-cnrq"fۭA%O ω1"/1;,/z2`},v6Od#:K ]ynȴ!wbfbfpw`&$>hkLeuʃ&3Z:Bc E{l3F\Oڐ[?+UjxTw(_$ie&TI\s|2J<3OǮQaLK8.OU!z^ɑ*u-fƩ5lQn I\aZ܇iYihNݦuՕ7|pJ%ShƧ4ߨ>FI@>(GE GDvw'=tntR?4\k+oG➺Ir!ǗøqN+\qnxJ`Ao{IJmCVPxpxs\&K>W 'sdx'[ViQe^͈-dBo͕:x/ɺ1m2U%~'e ԥ]i* $ O"hWϻgW{v 81ymCX#' auBX}>U6>S orN59d 6Ǥ'!$8[$ڇq/ ~`wkECL5] Z垑p|]~ͭ<߭$;=vqP&1cèx!oʓqyd9XH? E AEW ]%i#{#{d> 7pDS?K}>>?A*e6 2q;)?'7:~|ʁYi#X젲W-98_c#S?>KucVU^.˵gH1@=9j/n|4ABW[2iޤ"nu&17ÖF?qee,z )Br-os[*I!{.nRԻg߀4:toXc`3N@YAZ[g}i g{3M,)"4żi)ഔrUKM=usk uHb* `O(nt|w{̛Vs WQ#=#wgbZ76p؆Y2pe UkԆTFlj) `'U j| Ξilx(NӀ<# Z\'z-ԫl=nP;Ag s*p>Ye8?\k*J'!Jt9{1!JV8G[-ii17YZC:Ui֞Ocљ3;2gHV녝٣@['WZ7oIᢝ"]w>A^Fu״ޙ4#ܖL;N\FibY I?]='G*jove{O~pk+k^Mƽ{uͮ'.]_LPq~r޽R ߛwG-ru8C/R)Zif|a?[a=DbEm?̷" JNwh|xE%Gdu>mr)ep<S°C{?ҧ;/^.+U%RBZBJwԌugl&OsN.@qRֵKYZ;]uRNt"ϣkwĿשb5Tw.jt9hĠ:vOuY%v¤4yFM,Jd6_th&)xX.]A |@r6\!(,e?ʮJB rL8~i{O_3z(z(<((t*C朳!>N:r%VV'{w 1`WZ yd0MN5:/ucY{w-k:oO %$RXRœ"@_SيbiaW +⾳?B]|-2CHa&~cnvnX|_·ohi a<}~7Ja=8i""Ƒ=vAZ:μ9O,ݏ@3*wOIjoZkˮd H|oz?=k]ߞcnў݀K؜txjOu)[ D]K:D[B[bڲћ>[z7=9Ć|6mKԍ8mۓrŏaΪ4H63HnvWukʦ>g{ )N^nM68x`]{n?1DSjc ת ϸޕJ6y35žֹõ)~1aϸVhAqOiXT)4#t3}{]~o_ҝ:hN?ݜ}tkWq/yN1gOa[Knzly#ں"~?U1I l1}39ny^-W9G27y ڋzzM >(Vv:I'xoi' &ӳq#H@/џ"zS?F63)}NTظ$:.=кpʆܩëm*' !+^}X[*}IitqMY^IN{gfUzx*"\Bv8Y5_7{ts|mV,KXw]L{~+Һxi4CvAVW_άFt7[Wr1[Wb~)ZʑG[8+uk@+3tr)Wmt/н ;j\ϸ9o?Czl*}zqz4mwG8<9[6l$FyY ܽ|잍SbHc?@:{i:-;N6 D_6nwu~i!gl8YuI} ߓVᶀ:qcԆ~$|z{$܊ߡנd;N/R_6/ztr%UodR/8rE}el$F2˖m0ՖW"0,L5z64'OBBI=ؔH7;{w:}Vw7o7S̼"v0wcn~z(Y\b"yR!r0I,/ypm~UFz9m 3&= x]:<~ 5ħM~=cl#{C' (l bτ<՘gg YDnuz,}mQ>_ݙEKG6<8/cLpA݋ءn'Oq[t}>85__6F6HEScN kCiԿ#˺M7Gܽ$cA8nv =޷<<ۡ5EIVb 7O psPnΐP&ebPn?cπWv0ˬV՝9wJΝR{wqKu_^o{wڽ@g 9p[{2n7%_qЦ O~c٫%:M6툴f l)H͡}>,q?_}Ojؑ;.Df c7Lf)Y*<0=bl}w0;VQ%"ow|=laz UX&Z8Vc̎ 8`7la{C]Am;pvމRl `&Ă]/=&>[d%rq."&1wlz Zabo?ڷG;s ęsxL.Wn `mq RA\}Ma>zcO@kCl@;͸I5w,:YCϙKuX*o.ytKrNg_Qzܿc0qz60WX^3ϰt1yN}m6i;ksfm Yfv?k_+<|so}r|s:"ߣ m{`e> 7E+~g =/GiǎBz5WE;{EV3>k:Y7Lo&ਡkkP>}xق=^?;#fqvh}ҟ /{gϣ2}g̶[q]\Û5\23le | 2:rܻÿ'#^]~ ^ٴo:v0 N)L W`W2vv ̮ľܭ8V((@-JzU{>eV*PQT3w<]+]+L \+Yx:SZ"f2^CP^v/c#DjwsIUǍ}?dzAln9+4יg'g_5Es8e+[a1V\w|?ѹryk}mVb.D]ZĚAM'9k-(5y[A6?1kٹzI{zCȚR!&'eu9묧3o+]bbt\۲\g4l'^ѕ(Xr J,r%umJ.Z(QSܙ_apہoSr8 a^C #0v*;S?﷭eqjFY `GJ)o%NuoPK ^nvITj ^eJ`ŇZmvY&Aާ\e-ιW@w!ƚ`FvBV tp=rrً4WD)Flx0"aMq8}rg^4H=?䱹|]qI_9FtyizbX=%XO )2ڋtk$. "ƋhA|}%GγsO<5xorF !f_kٹ禚ZxLᕼlaI zdžAafMyQW՞Qў9T}K wBn=A{ӶY6M>Jq<x)Xy9&S&-6O9ޝ9O9yX;hkoR/g5jG^yo9^{s}4x8ldo~ߜTn E"%g47_ÈMYA9u G?e@Գ5H%9A8Ws < { ժra*4;d4eU\rLo ih4u uBg龐,mo/g11ɞzv}idZ-yw <6%hu7|}8Z@D3݌S'ޅ?FOXx§Pyƶ?-% ڴVϦ3DosmtLi靧#WtW W@m0җף1ݬSl},9K$iVXIz,Vhޅ㮉UK4jwts.Q7p]!D#^Bl׉sݽ`+>nb!#s}I] zS60D,Ns1|ayYG^x}>ϝ֛|s??L{C`NEbwsx;wgDI!LfB횚 U~Y;ҍܾȼ?|>[>ط9%$oܾ]uBrI ,^()"]"k) իzBXƵ⿞;M%F:b?M-(c8Ջ> pz1'Tf\z7S͜*xJqVIWiJϢПV.*xNťW}C c197U{T'`{v FaTި@S SĒб3 Ce&\8ӻkX}JeL2c}וh&1&(~gPYr ި|f0A3ZԄgN;$2h-YIbһ{uh_qH #E= 78Dǯgsgi[\'cB?,nKher КOգ/)f_xrthp_XښzCNgvxz5 Y7$`X~=9`px^ݛy&a'O }$ yZاZufL6Q}u~^Gn`׮~?̳w ~]|$T[Tqzh= .OW ݽ,x%P˜6l+ Z1zitO$VE)q#ὂDJV!<]Ll d=l C[\[Mt}v. BiSF !jUJX_4 }Yl]:O6cN }R|Yv%;\jua=;0qԯgj ܆ Nf<׆߃͊&~,sdzXWY}lӾ˴:ܴiګ;M}mXV$ϧoqP7̂7l3|鷹3}w靾Y nK$K?e7;j=9 OrNԧ$ v,$C{6Gx'(QM\.&ʽ}}IDAQ֯q˦@|* 9Noσgc'{O6VFé;N\#ߑ;r/,Y-_1Wh}|s>>iqnOLQ'z}/xn:,k7!\Bu/g;1a-RͿ}ZW\y852 kg;;_g8~ꦿ~KIQ}K%YQVYP3Y,*HD]E59&Sc?V UX2U!o!]UA_S=&5n]t/@~0fidbӋr6<׶OG7,M 3:dN?wnDN0eqJ~Dߖoo÷ScMIv!v牰s%mReWCjD^k'xRU Mcy"=R>[8G y[L=&EѬ}}p͇  !ۏn:#~O45?p;v 4zD3;}|;1N*v =91egzK @grDcgljvfF9̨ǘqf&x kfX4B{+4j5ΧLc=Ҫ 5ߎqs |;|N˞%YX%}NɎh❀F?K;+xfJ02sf 5fMKP.2i?܉)T<ξdW)'[]rl<>WM'g oLE?n TNe 3 lߠhz4x;rHˑ9B2'',KnyNkD"9o9K,O|2-z.K!2} Fӹ'5e,P"TGYӽ6 Q"${or}QXHWdHj K/E&OQw^X-}lSCe)G9w "ɘP2-M3?w텰"MSB @E-"/dPEҹH *ךz(2Y#}4} -G@B'Cfq 'mZ8,c.&a&%虰_{*oF±A3 ]fg4"q'@p@7VJܧ }fDB%(Sۀ^ڮLGkf9G,eibάKmA@8xWvI[qv$e vť>'ioxz7!'ob>ׇC.z="gpuDc\B{*y= V? q}mv,Ќ1y3]F VKDnkp&k3,+Ŝ`4[c?<:X_sp;7i=au uh[`%8"zv;VPOPSXzuoԺ^]t}*K/}5SSk -:`jCo!ΌySL,W-Lu?@,]}V̛a: Kz qRGLQ05y,7Z0uo7_j`޲yG}&y0@§>U|'OoAlW?G3%`,qZ>ҁʁ_oNXVw`Wӑ#o4mFs E,f3+[s'P >pIO\G6JYb!ԫ2Yc50/+`DB<O83k&v!- Q&{s} T;Ĺx=P.+q=71}/;ج?m=E{p&W>ef5UŠݟ&I j!Z~"2jϠG2Lx*%VR?s䰬9yby*Z{מ3=Ob:h}BxTah`{2T^>1 k^M[Sew'Ӡg>1y |ߏer9<#B60fL=_(F gZ\k$:5 шn58TZ՞ 'R{.%Ti? 'vjFDЍ;h1=fm<@Dۥl3_kXS,|#0^StVICaV<үw;~ &1n۟NS1wpjJAeh}D\vb%UY`/=i3'ڽf#8XJ;{e;Pn-p;{M>rt~^5 Sdϩ.K H=Gcq[1=1OV-B~).??$Z ~mycQPb=Mlӏ<Ri$Idd}{q7d~6 ~Wr#tt($PvK}pfӏax88׾UsMo{rqCM<*#}KvnΝ͎ k9>_Y!fq?gTc2?A!oo 7}xzʙ3co~?B؏<윴으)>xo hܛL,U" wF[`V*!~z).ֻn1Y-vb]g!5 %Gsri8[~Hls }Ng%ߨ_ޣ0r е3~/.+^M q@}34k) +yƓTK񩀯#FڂĞ%rsyT<|`;|']jK¸,jmmr6GMg+|yq$̗T }<>13Anrb$X}CW*nz'α#.i__O9@qkϸ7V4.1>>owAw d5Kxdi*͗D"m7dgLiVA56JgRA?ч捚}_y Ct?~t0O/m4]uoTY\?L%=#&?\@<62=+%U 7iCsSl!h] #S"ll=T9=b'W\lC7B/Af}5aU_ri2Lȡ#dSO ;/>4>?33EJ5'@IIoEwY#lx|R3>lfAdנ SM^'@n"h3M*9hb$=eRHiՆ`*$t$XCAh HjIqV⟪̯.9vR? 5)Bۗw(?goD<ϼ6"?و|ai 5\S xo߇ģ> Bd+ Rv̇AŊe3OD 檳xO bO}Ԭʠ&l$-@D7Y"ލ* WaW% ҏf|ե3'k]jCMa{Q*OJFɠ`,.NוPt~si=9hZ9&.MkBcݥcwvzK0pGja߃%\"JDZk>cП,'OB|P_9 fZ5Խ|71(7`$oHa2pϠ6OE=!`rf༹hG9ʲ4"*@>6 Aq_Ò,v}Qzu5ȍWBj8bݎ ㉊#1/@=#Jth5"1G\F 2^hr(5 H~ȈxGϴxcYɿP]eea5rR9pGQj ?r1&)˅AV ۄ:i#2/w~xC ϟy;3Y>IveYq o 86/%lzDڱ=asWga8RD#؝ORVSI nR $Da< }2*|2s4Y{2H^/yIˋb.="%8(1o^ҢqxYyQEya[rc/cE!RKһ3w3HV;ftYߞ*kgꃓ;(@ P?u]>5zlµ~#j{fOrESdPZܶ脶h;0x94 G.4fH3;H{4;9Glgcط}ݽ<<|b,,ԫ'/z5k=rBF]Re]uN[I޻_ |4]7~pUpp#{@)#d6S8S#p9 {PW3N)уDT/颼 vgr& eD.=)lH®?{Fm^Q*'9@Kh hq+Uh~.q@^]8RYm'8F$Kzr^RyY ]3™3+ψr:5F8@ykuG}hp#=Nb߹Lx1sX߱41;ݵykt0wkU[SQZ]L HAͺev~_'_6jЮb~csO;.$?3?{뺥|5}v|eޤ́CpI@駦ۆb涇wX/Ccw7u西3={%5=>;cX?^ [k>gܜU=WÚ4ۯIL9wgQ,3ܝzTŶm7~jњѪNCTyZ7%:9 E Z#۴pofd w!,g Kָj.[#[IuWL~)N3}bF}'&kh^]|+Ȼ1֩C!]x7FM_@L\n,TJ_4@KXrdtu\,:8U(K?di?Y5+Q3ғI$KØ#+gE?'"֑]Kij?(ףsBWƟmٟ|n& ߬_cB陃уhS#(L)RDLގs81u=Ygܢ_?)cIDdQ,T'} el)IWQǀd3֯nw>W`T-*{?mFP\/_'Rsɠ^[k4,5RP<OlqWP)c@7r7X]kKAFQ5bFOO]bl*ժX܎{$Q*PS~yV*z~ ||3O*7V%}E]3SMQUh5KY0o+R,rݓI) evnb$)t_"/F.퀏vӞ9lOwpўM*i|Q: jJG)1yh,H@fά ;㤣Hab6#*FsO{}q--l~ -uזJ3cqX`ޏ73I OᾄԬd{i?BŴ=Fw& -楡{i`Z%Mk4i1jKzEvtOg RR]m+e1ϛlIџs{)ne*I4jEp-laEiz猢u $ŘG N7Kcc:h1+>96% ΁|C)-=V9A;~moWYR`,c im&hQߔY?.f~_Eym V,&T۞en(ZWx[Q XV pX h\+r񍄙;_:ysV{jC& BjWg[;bRc瞑-, Y|F`V€:h z.лG?Nw ƶݵ{} &_!|'VCb akC, >7B=E'C s}5ʠq<: XٷfBh`V3l&c:ͧa 1Q+x%SuڎDQkyr~[Ɲ cd6$#x 7uOWF+MeçGȝ&EX`;IlޞG2zێX6!q2g@ؙ?^Ama୺|V\yYmկA iDӥ"& \x-6~G+Wrv팑7 ڳ/G<<{Py_O#k_'گ}~+I#@3L1Hqq9c`fpfxA:v:㡚~.Owo84b!Լѫ9'.#zخFuy <aSg.筼.,T 9V =׷"\Ǟ%7&􍉈3Mc*3 i U>gU82K'Mhe]t@Yۣ F7ai vF"ΆՠA ΄YǃzROogL}B;Kv֔d)-(p& ЉD}۾- ?2F嬫{__8馤;{3QG:77W\KFI棚%ϖ8YosVOXCBzt98|8q]QL~]86R(;uʰR`+; 9:iܐG֡1xr+Ug9wvtgMjRk^O |q+~+UJ3? NMh7}|rϬyr>LrOpGqh Xn.}X{}.r^?98nʜ?cu\5\)c5uBه?C}#~H-& Ȟ̚D}C_y߻70-z\CoO)0˗SzDqі.-m#BG&]ٯpVʼ1r/c2;X:Iu4=1 9k!JOۈ+dC }/_~'Ytӗ~؞.|(g>j=KYSf`ff:(\H1|-pxr>oo󕿣hykP>PPQpWb?WAW_gW+WՃiHQ{+s_{Q>+ _QfOGm|ow;Y O3+`z"(!4h@iAɯ#+?WWgu8Fq;b|4{|+hyGV_:98__?8>~o 2??T>?>vKuLۙH~>^b cPk_'C&'o0Xi;I7yxotY:}}9>>ؑ>؇>}^}DX$}NcӁ|8 -cbq[Y$v&s\1!e>yk|pՁߴ jRZ*Mh1 m=HѪHU>Jџ\=ߢ7R%]X_fS<зp;Hg+0_HWnbH'YC|I!1c>p~zX@pN1q9[pBbL54Y?yGP_=N9_,w>v2y`DxgȻdyk7f>|fZ,?7!c,z3>Ib]+2`N+a$[EK$^}X/mv~D '^<>]yB<$ϡS$jUcV gXۯ\zk /?2$DP(s)NUʿA$Mi}'KX?O b=>Y2W}"W}c/_{mZ*J%$yuzn6ާ{8J,7-e9lV3עxZ'X_>^|cy7Qy7}ȃggDȼD|h%aySDxDhSg= Ircvḏwvx.yZ+*!-ī]יExm.+;#IM;r2*Gޑϖ06ګldLWKz? cM A1}drF&kYYOٙ"Of+o0A&(\ q5Ղ}ь jǥvlXmhgQNSLpF4QnB07F1"<) :C0r"eV{1I`W j?53X,V=ē\].F'vM .A)Zn8NNs)^̫3 ێ'ȧq}N4. ~O:bI"ok5Ⱦ>{|noopu+z-{s aA؂t6'XYB~ZF;9TG9wpLґxwǩ 3V+ϊ>eD[S #"1 \KMPQW9lzV,净We#B"m6FӘh H0u Ź$@J : fi3D)/ivLሲu0Mew$o;o5vkiMX{oV>tO47t SoS7 С^%C2GR+R)u-u"bP28B *j+WG7$9+B{*/߱obwX%\z>Xw"Ώ|zێ fW0mQwﭫsNNG^{4 Mkƺwplatyv(l>kP®*NMq l0)R^ZWt6 ]xOp\Jj. ;Tw/~<5u$Ma̴4HϕS@_)jJ$a޳) )i-t \5B,.A& )J$kp߿RhlE&=b sGѲ$0kNtLpHgb'y3ԋ͉yb_~5I|=B}- Qbc!69F#a[cJ-S!ukkO \VJ>-ZѤ,I!U^U5JVXqjò4n *"*_M}I2&; i7&=woV`Ӿo|߷=`}߼ BAfo)ZOl}* ~_3H#1y?jkg_:ݠ+r~<>͕]]MG+;x6}YCZ{1]uI)ut󫔠T $$8QE^k\N ~ |n8`n[0Me4j.v<|mPzIzBY8JwOF6 8@ #EwLꀹi|:巜Ȕ_y6$o,#83O lJ?'L`Czkˊ:R [گd|*[BEW(RFhtvު'?a^ iN*4|" P%W JX#$<[a>Ub"e9]AgC[CY%eVֻT2{ ~4N-alO fF:hR5LX˦K;$e{D+;,Ԇܤb7uSezFz$2Qcf FC8u0Yp=?BJS;vK>EL=Ϥo*z&o$rU%71;Y1^}.=nb&qw%?ϛ 4^rxU֥Jf[1gYJ`\Ы ȶY ̀= 5P&ZJxPN{Ga\(۴$O[Ny;SFSf ;[} 䶿q(!LgJǎ۲mVr#vթg%@xjЯ`HZ=nTطRŔke䌕QzJg؞6RrV}5TK̷a:k!p9]Af-=y9^-Bp.bp*j#-%eKuyo ?gd6v )h@Qfzqոmr&]䜢{#;; "A,R[3YGYk6OP=ԉ??>u>2l_/f`W`g`7ŰNp_g DsJ2}\+EO/Gy>̕7vFv?oX-#$ޚ:^O9meM7j >x??.tM&2/σ9%x|xouK|R7LO=E|"|_W5y N9?q8Ϸ֔@ַϳ>.%;zv-l7 QOἎLwrGd kR'&[%m*ֈtmơ pgJG^>ASDs)ޯCVɞTi~GSHd7ΜR9i/!=v2UEܨ1jjPCu17e"0 Pҳ( :iX Dw]n 8%VrG MBQ/>J:ګrpaCi6ڬLy4{r a da nȏ o Y@N.D›#1=דh7d8(hOkٓ3=jhaIutMO%# wG߼:aw3ƶ8Z+]}҇$!@HGJ?8Rvzo!3w2A_j^G'LǿOnOEݻJocrN6m4} Kēsnc|.82Dx.{ q﹍قYTTEtܯ)v\UWkABxCFotTӢcÝ퐊:D/VXU#v"PZN.VyaS6" %%-MGB*iaTU-*'z4"Wi5yyPjCr1Mȵyy̌ ϡZ_\#\sDUr~z "Gޟ?" y~/N) (G#R2|oI'DݽU߾*`{槾]@xwtiY쾐x@\WEзubIg wsnܲ;.eBJUz&]l%k0z#g}k.|SL1ob'M +B[[nK6WZzKy 8T3FZOXNF[4mVZE?Nr3z H2>{<_Iy{}4-`mT/t?gŅ g=j=Lީ󇧷X"*Y³WQAu1=0;m2 i)qU;q^s瞣;GJ-ޟ[|7o-{½nn-{}w wzP^\"S9XZSBroso0;'ȧU9~m.ۡUjٻ{ndp;apGi1g~3t s~P8 S[=q8YؗAڋVH̖M% b26aGѐ`:j8>VK)C6ζPG+I5tK|k㺴sf#\kRQA}.:͝r@VkdılnUG֫4ޯZ9k;S)C1jytCVtZ-|c^͉ FlOCw@8t'̕O) @n,QM-=;fvv`3+Fv=kcoK}1ӗ^o&,E{eii\O6`6/',Oa6fF ~KaE,#ss{=3볏NIXpgRa <3gWKvl̺ea{`Csf#Gl>UA 2Cl;Oq`8cbP) gW?kp'ɞO~dC?:{,gx{gX+,7Y^aPn(qxUG.ܰeo W;i=m-5xd:KE(!Tt!jޗRtO[ 8Oq,L~ %tD&%ډ``SHކn&|6DY[[Rsq>ۛIQ\U=3==#Gѳ;,r"f{aPa jA@asK͠T-UuFa*bm"^%?RXn}XbWB|zN{OiPd{џt `0ތ|y_#P; s8(5+H2ϔ 2~7Ju;1L mX:)Ӟ:t"Mc6(Ⲱ;#ie)7i">>R#n._wwҊ&gE[T؏3T]<kqY6K+,ʼn;ey:5r?z3nYY謳 e?.?{U^m19 v;AFQo/WeS*x(s*l0ܦKϢ lY=7UVƩۋ1C+cO|2z_ş'˲D/ ?ߢw9;JA|y.{.E";\{/,v(j 4'3k:nzchf \ ~mg8Yl9XQ23//n1 #6h~W43>NFm/pg>U/\e ]o=UkCig5Y,wVW-)ho"WKhP~/ n? %5̛v Ryd6|ÿPyv>pLWM]쓿tcOxSܮgG *k/\GӼ?|SOξم}3'V7\X5 ks{[@-c~TIW'cmᩌ-M9d%7yNY{v;ab;)#|,eq/NvƝWwew~YGee^PiY܅eq{.*b+,+e]Rϲz.-7:.+ŭ.-[S7,nmYܚub=fd8om e6 _+ W^A/}cd%"AhW9_RF9w}fhFy-qCn;xBJ۫ŷ=G;a?p`_IW RRr#σkױ&/s]{.כѴ~z4{;j x'UaԪy+ Ԑ7}7J<@<5rpҦfIy n[9}=RNsG'A;_.5 u[w( )"Ͳ };)!eeiyD, J@`&G6:0ɱfx Y2Ƅkh+9ҭ#l]yiǗ/q2+p7/n\M|^cE'tQS4oG9h1} c}&~f m .vq>-S቞ԧ{u} e.lyٝ=Ŷ}Q<B>j󡶿Di_D?ZE mmЖ*ԘOR=Kq^`n{}QҶ?j(tsfa33;]I=nkqc9ۃdUVs '+K >PU^.y><=]iϡ ̒.&]U›L !RN;}%6~B}0W,ʊx-⯪_s_]?bgr从~ {YO Ѳ=:m \@њL?\ӞAyHPV^$S&Y/,B%E ZX9PG<B< !R)#d1cYa)l6b&H', &[q!C@n5(y;FBk"i%evfZofoiU5Ǚ]tiG. 8uU#V,4>?\jfs` KZ7u1e7=)8bX}1|n76B^彲n\1݁^bbކb#Ě8N`aa S )wÕz&?-!aq2i2sc»eǕ_ ONi| e|bHKO0BEmxw6ϓ<1 <#=@x ~iADހ/$tZLe|4|Zok3TOGtk6t?3qy$ϝS Eczh4KA]xO$PIfP.iq> g=F.,XQĦ+}has>fVj1K=/?|3q3peY{8+l<|}STƉG.яK!wQ{ᘲ3*@=r<nB/󅆲D=:,C7塲V<_שQ#>7J4 Q0] kza{m7-xxu<XO:'_J34([- 槗:Qg5HF}KSr3|AHZ d$lZC\Hs9a3ndV\^5ͲIf1ٖQM2GALNgL2GJ~81lpVzsBkZiV KVHum|-hhZmSLk]Kma$^&X QxeKÖ;L#P 4EY#x/Qevֱ 쪆$D N} }2D#i SL^1_-(I;"}.<׆ 30Y <ɇHK6h)I4[hr+ƹvڳ~UV*̾yiú!/{P]A#G-t.'`z~9ݾ#9 1MG@1 Bn"{Ms>|KBf, k#XƜ2y[(&1~@ `~C~_^H;Yz'wSu=q#qlERS7UǘigQ)`[Z;_oYvҝ L{7$Φ.L7ځdv{PG_6gl]Sq}eͥ5ƋЙcblft8Zwl3c#䴼]˿#>6ng}cCc-ztnDZa..z,EF9f-FG2R zCADK:%V6F *>\wSJ^W_)GDg^ߐh\2ɒ`zƼ7-ĊxgzH\<σK5BP?J™s{ c5o>Ǒa+p›;s_8ߪ+V;|Yg*(bL~E*_7^#7F1^t3'Rr/@YLg-gM6 #Ak2D(Ԍ &pe*$Džm}~Sɖ~[oyYBz:-rkk\C^6,͵j_rx9\}Q-6G-dFȓ"oܧ=# =RP FJ1f#1['jwoO1SHnu$#V{d'䥐co"kاX{&Mϊ69?i96uihu鞒{Z2۴6CЩF ! uoL;7k%K&zyU1.EY!3|5/ܭЧ by:~n]|5Cay{L]WqgZaң7MH;@sd 6Mg:w\SĿexN2g`t=D Lv*ɡC.jq/~4Kw1e sjge=vEa!ј;N57j]BV~& GY['`T^R=r-gǴ..Bh>kLC.z--ٍYΝVʯ!m24<&!iG(Yo0Lc}lw#B ZYЭǠ]snA: ~*聮!v6.qC?=lwG<>z0k6JjXZ Œ-vb?TKw|^ϫڢ,g9 Kzʸ,Ub͓mlf^!\_ȩ2d+Po@Q`PsHL|y {iXI>k 1K.KʶtOvډhAjai?x,a#?ќilAf5\ݖҹfv㪃k %KiZJW{@MZ T޺8(]S i+yhdij)=58v${zHl;3oRՙCb݁JffEa+1\lCS@ʳ~PdO=%UQk#nҔDy[R.(+{WjNvː>LM%W7~b=)Rrx^m^RCy5ٟf6Ǜ5f¯w ?7 [qVgA-zhr>X)Na -.V4 +*3Ѫ;98N*SsƧ1 Q}o+X)LPSQ-Kٻ].'Mл4֭fr(o!D8=Е//ח[!\~u`5+=i&Fhr.tR < 0_$D#GTøE BǀhbGm.'1>.֨fFq H:1oݫ9kza|yCqn4(ggb!o|9͉ę;S۞evE@zIENz_V褖T褾Zq}WN0e|Ov;<ؿa}r ·d0j#%lJ^W6f!C{+lY(g4MO-֧FO%M8Dr/4)fTZToPQXݺK7!/Zrq']mA/A-^>BKBӺLI0\zi]v&3B2UԺ"v|w4Zq٢hW“e![p㚕7vx4@knuVR0a ƜnxbRFB4֖PWN pB$aŪZڴ9c-4Ⴚe2X5 mJ/)r J9.5[*{洫<r}.eX.ثYc|@-LYG~$Qd4Sp6{˞^ߟ[S'/~r6>|@SJ^ҋwxyQ|^K!Wt0KÜ6P3aNsjqafեfs̯ nױQtT$gT%4RSf.|$}k; c񑭀iRI~#GQޓ3_$ҥG,%Eĕֱ6u;a>ie|֮p.BgZdżs^iZ<ɹf&$̚ygGc8/ q ynq/8_X-#=x%*X͚>urwUXcʌP%վ>@Z|3u hM.c;M.5[alFx1ʆ#-d | 43ʗ yK9 tf j=ևwR㾸RaMY S}@whoExa,}u]5`v?(r QHi52cX_fN2q12Xo:Vsxl6 1_ c]saW9Z,]Q&Ų7dX` &}c8$ٷ΀/{Nqۿ(L пJ4IKhx.OE&cYc^@'r_&z;ƓaSV%^>ڽdj.239:i.0Z,[:OX",urM>s׵2W#9׵!':|w'~Zcxۍ㠋1zYa)9G/izy0D4˺yoC\r+^Xk r}i gN4[vhG=kǝ4  z5ߌe tڛ,ӵjuCD߳l^<)yR:uygnw <:8i WT<9e4NjMH5S!b(3HJ{ԬvC֘.1u#ee-˽\] ; vip?Rmfԫpx>kHզuͅf.m#\U(5o. h\!0壅^5Gdjs[XVSJ -ȵ۱ځg6B^^޽= WsU>ުa}$ۥ^41PBMZ5k9Gnl?v2${Kg?Y?G^P~aҲKd,<G\끩bSxxL'.K GT9yǰB386GTYܬeqDZ8q>GK!eIg%d\>L+w˶,+ydڞH:Iѧޯ=$B[ mfVwmoBk?idS7 ,]Ў*$(6-_ o0[wnld㻉IN;o0KOpsv>yMurV#%د[})V其Vħ`9`]ػtubUq#8ZVByJ 2{q>W硺+fSɍ{`ݥ^}t۫ݩxf ;'vA[Zԛ!WćW{O9O~;\*bqAM+Z7yT@7@w?"pys|o$r!Mq Ljx.6ڼZskLWÔ `V*8_z$los\qh%SvFO ==ݮHDqc9"l/)̽8RHÈ+CgA\B%??s|/_Z(12Y6nn}`lxq^!C|kZ/{#}UZT/jR\4M{pcO8jp<7c}*Nw>.xx'7nS~}oARDOaŰ[amv;O խSobqUhN|'ӸOc9a7կЁv:W5]gts5ʵ$Z0ndρ4R[Qh|]6j^ky[=7}[]ґrM&_׹sq6{[L?arVe7-ا!FZ-&މG& .F&FA"Klxk#~+V>;=翬ִBi&MX ϠܔZfZ\rؐ/9 Z/m<?5mfF*?s9rYz,'~U@oBwBK4>4.qi5q4ðtL>I`o˱r猫3r_y֖)fJw׏ q;/ +ʒxjMcSַWGHp? Qwq"͵|!ծb2Zɩ_Sוcsu26-O$XOE?_w1)濗Ceڴ_E;l?뿿"b*/_͌PEo>o7deC **ڰmж6< 둊2lmxa6y{HOZh6/(Ng+Y B w;JiV>J%ީ Y#jN;47 ulX\!e(3%)i*!3]vSLҵt.3ƥQtIt$K>@ZnԬۊ[\*hluЭmϙk=_Vޞ yxۑl/ _]GY&Csɳk鰦>3{n;63níd__3LG~uz1-C$~xk䒃Za$zݜr8V2N͸k/y11Vcar~䥨vt+:ħ7;NgҍI@n#%WϡC^3 ]x*7xZ\uANt0VsQmĨDAyِOR֢:Iw )߻6!9R=^WC9P53 $~AMC|>TI-#b~xqÐ7¿7RϹ*LZ5G~$*O~f!^ {0Qv#вƺ3*դT dx*a@)'挟 >`r2 `oD?Acz'ˀJ7/AWjlWUMuV/< tMŧ'jŧt zCd zEblFNoYɨSΊ7߭ XS-.'(s|r)u׸]5p#S 14 tՋg0y9s3ޯ">OB|^a,K;˯V~^XCR0B5j&Ȓ5damUGXiUV^UPI"Ph @55=V]~4QD?Nox Zms<nIuyu`$ke@և-Jq:<j V`\?TLrWɧ$H/3Ad|//ڢD=):fq o붾_6H§ISQg1Y |O$.&@eݯÝϟewve%: C5FdNcFj2广]QW~"IԲ`8fq=0|2H'Y_I =oOPO!93r |oR+VA{JbqVQ{n7c5F&LsQT.IBK-%ݩ __=cu_'5FM`^PfޝMdS1xӆuq +kf&LЛf>y (={@R{}u7'B<AݩYq"{by\a5o!o\jeJX6 2̧$𺢨#7'rmqDgWp0F- ֢7z̢HtDjaC尋biߏC"5x&3%= E[*:??HycںT]kQ2՚#>qU$, a$(].t AAo " 0jMΆQfXϭuS2g{ڇ gۿ8bqي@~>&Y0=- =}Ώ:i7F3OA{%B^XH"oKpmzCFx)~G<uFқ+q[T׳>Rx˴VQrM`9İ[I a{fBBIs:!?yBx!yvTF&d#oB(sF.&d#BY}3|crl_^ivwͰ cwp?LaϐB}C}A}YןͬO} [q2ARFhA3BL_ra=1lR6[/9IGˆ ]""1o:Y!Z"CE8_݈D:3Vyޝ:n{DשD XuJ㗉gK )}խը*WT_%j:7=fQ5ΰ'qd7dLb~pq/dEmxB5ǁaۤz ljuJwYm_2m»5Ku?7/ ZMs &. t__Ckj7z []hOčEzƾOe;ʶFG^^CVWttڌ:Ъ&jDry~%̂QH퓆NgH y){U6 v1uhGos+|o*Ҝ~C4'zGGWuEyU朊4zIs)m𖧹FQ xk~XA\݉z.b\ m\Zg!D;R_NP`FVfP^WhSU1 +ZUi":kK @dڑG{IW>~;o-/j]i]ehS즪1ы{ǀH fPyelEVQoBwDyF gEҘIIA_4W%H5QƧUKW&Ro+s%T\oʬeu!%2Y4x\w4;"4k-Qu?Ա^Ի@(ٴл8L?zom3ןϟA[gC_Ge:vB ߃Vw@}Mލkp(76O(2&2JI[G0mOjJ_;wwW+!'3ݭ۹=]]J{fZMz3Zs^`p4KIlOWK~+5E)"ڱgryR m+LvڠЇ;>OHc iD'ٽݙfpY6(1}}?[Eyܴކ%Dwzf%1 ;ݒzf6hM.47SnvaӬք@~q_W0=_H1Їwv1ݟkҐ҄%Cĸׅ@'Y0k.q ť1]R%zGvi;biވ:cȮ$&o!2Ve6`V&lM+W2}Rhjx 04꿬PϑG>c<'c<c ;EO@/KNr^jۻUiElޢ-y 5FAkUw[!C|膤(J14 XM{qbIee˻ٝk|kӎ92/C"h%H_Y0=BsT:1jCPQI;/ifX  C-ǰ2ԁ>Rusc~oyN!R4գ\A+O{(h 2;ē̄[D6tv݄At̶ۣvr$^]ЎfD;ZDsI aP,RMp^O9Œ㻑(u v)(h'Uݧ\ߗv~ x~߃#bmsv$Vfho 2+b6,|Dxfm{6 <_E=C=8[d$&= mIFmhe|[WCІb^[ x>;9"VwXDŽ({I\X>gr[{_pU`<H 0xۋs/0w$u˶)H]ϙ/Ub|<<խ)S~["-j k@K oy)C a -,%OzL~r>߳Mo>zj\JJka]ۤi=2(Mć6c{UP+A)c}W8p-{3a.s mdaw,sN߹>%bfULo9=g |5nZ2&6a1].>#t_r^r璋?<x X#;gw=@|Zf;W^-.uz"]*DǴnz Ե9m,[Ӱa3,P <̠|酳e77S ʽ7QxSzs&5ްʽ|+~țEb0'D8R|Gp-ޮ!ON!-u f}7ymzXhC,-h1BkJ^"3ϗs?sʮVfFV HA!t _V6JnPqu >yWB-fգvEB4iR$#_fH@٪DeNAZa׀\}\QxvAR)*7tMd92%mweZ|J\J顜rp0sm[Pw/>7|jՒdmB_vY9࣋u# }OH0'& Fa.ӖBg4(x]LScsƉ 4h+lt\}nқ,tݢVޢ]K'tKͯpGqlҴE)QNqNO C=ZrjܵMV`r/@>^ANjdzzeUZ{,D Rr$U4r-[iW\ tn ]}.uJrfg%-1Wf_ D]yV 1M>g^/߂]7o|<ϗ!'P.݆tUv9;qQ+*; ??/dݾH=7֥jf0 ={~fgp0vzrp z8 ,5FCZ( )6q1|c'q ;dsxr~}!e+MɡfDvt4~ɍsne6_rЙ_<aO&x<&3~1Tb'b;m&>{Pz̀i̓ W(g!UZ0iTkk-_/ySWeի)kTW1N `y;?(+6_gv14ޓ$>PyotADnɘS缢a2FoMǁ25 \P_ɮ]+qƏ -}YZ \^ǯ9 ahNնm[%c΍ŽɊoqgug`#~Ue}7M"Ͱ44ϾF{:Z-t9E,\ibXA[t3. իa^IpL%3H6 W;1qtKOC= ڃEGe9ccu/- w>$R'+~ƏJA?7 9~[!x᯻A<?-ڧmhX7ۖ35;Qq_[66>ϓcg?;3\ <O7 OxUN{g/'75<@}S^2IޥP1)1}PhƸo}F!N Scn:ͺ~J̺qR,o

    = ۶gd~3ǜoPZ7yL)hM2ZPR=U %O܄{:C!q(@/K)Yn*:߷aמ,ߐ*~1kR :<_yt_} Շws\^ԓNWIN9nG0 i2S\s|G03aa3pP(^,´WܦAV|w ? py{ܣL(#H{Z,;)"6-pxF)gD@f?==!v: ;r|l{\۝eeyT2:Lm6Qˌ,t@"KvX'!Kzv)ֵ;hc.!WglMJgoAr7:uerh$tu r,YT"8]|,k)3ZIF)N+5@hhN2I3Ne4V4 7 ̂5CXS4#lup(H3b58d6?S|@}`4zeӼ1s6BziٲGz njJz3-P[w+>ZSCgMK%%oJ: Jjc%aI /GFdE#fzBo;3}{!d[Jd f5D? 0.ݧLVSJhІ ֏X%U?2fYBe<->Ư= s$k G9Tn+9[vi6^P&\ k=ى{v;L؉Ghq [-PGe#v[ư^^QGx{*KW@c mXƞcX"=Ѿ\_sFfnv~O?I.f%uXi{[{\vKP#*Eڬχo-r=H^ѓZ{ r]ۓ;eeJ{XW;56ջl>X:43䰽-Ҝy _ LHstluׄlLm NBSW2oWYF'˵1\N}ynLdqfr/[j ZnN( } ], ɗd#NAB]^M O'뵦v"gfKX}Õn6Z!4dkMdK$~Z=}`$K Pwk&w]kRK6z@8mB@/bzgAݰHNs +x3VSwk&Ê |B tz$uS,9f9.7JC͏ a»Lސ3a<]\/wº.=> }-YgfD_9Fٍ|u.t/wZAbyg,X&mY `n:_dNhEy+v1y ^4r1\01i&~s`9>6 X: 1ck(;anb_cb6^6b8Bf ѥfdo0|4prL>FnnD˿f:uߔxp\2e9rb413Kci/%N:hEɗUad [zpOs)cc3d X{AX_cs1)5њvq7h1@k`9Agv,G2%FkCg+ҙcxl:s 3 AqoE=Wu$'a]$C< CO`HT:$.EE Vp=6Q]uoc]]uWN]W^UWOw&U_zFquT0k*meƜh1sX $wiLӁ@>-g45k=%>( FGJšz\II #?/'9oUb`LMM۱G ;'빭rL#k 2`>Q>(HUN=4/r{s,BNZԽ~?XG)0Lqp(K~_觀|iRͧ:Rs,RÃ5=P>Zav ?EgD:N'뷞q F g gdv-s^Y$ٖP<}2AbKvIç0x>c | Vsp@ ܷ..SzOϧbϦzdGnm};]oؿ';ˬ>xQ32'^ N`,Z1˝2> kZc>rU(: %?ȣ@#}nAvxFa0,#L>Ϡs>~}IZ=O2EwB \h=8vð :ծ7>!Gn`\h޸Zb 5ELiə r.t[/lsj^?4[2؀vrLFCd%}i8`wς6'z>ʨ"3{v:*g}8; dflE u9_axt shpޮT}v}XoLv{e:2&p⮳֋IX1/c ZakτyiYQ٭U=tgJa-/@HRO@^![\o!>-eֈ5 szFPjZNt8&USpEwuaCOXS',,ˀ%PVNÚi/<'ŭ `-qzsFFÜcBV䴄ͷ6XNlDS&(+OMIFڷ9!P籛1%}Z~S$vN\l2·@߾|(R~biww:X*9)lm:2~턿ܿEv}v* Y"IgkVtm(<))bZ Al$i\fLfhP|9F!=~J5Vأt/6BI &g=(>L|Dp{t5ثL9+ͳy-7yIh/adxöBeQWD|%^KZ%U\kWD\P'߿J m)P ]_E9\K~,& ciD 4g ~ި ]ߔ.[ǝw}iRCЊb7 fD9=7#;Ӏ"=J j0qNv4 )@*xHuq=C `v=q Wx~JwvV$(~hQI܊{6fRuߚ[Ms \wmk3 ᷷I=HCzRܓ%fCUnW(k*nQϽ$Aoߛ fυ=.< R-%)}GєL;o~[ ̪L=5pvIqqRbiȠL nEiFfxP&V}PeS'$[J 49N R* =A%gfCj.JZ4󙥝D;j|pK|pxmBMSM';glF!`.`rؚΛђ03xUŚ}4LJ.wC艎o^ǤMGr۫(x,΢Cuu}G~+<mc4z.!eL#hO<89˰Ǜ4PFwFq_ ,ʝ f1v`ܼҕWcGռo [hx<ʹfoAigENCSĺ׻h>JochʼCU UV 0aKù4}lX΃`gm7D]VXW(/+[ Y!d`HCqLR'h}$:]%a~Wm2 8ܝ_VKvM$׹7r+xtὍ0xTs{Fl#Rdq ߕ!wr+}%VHR| x6yRoF[ר)8GfvFW+z3s&}>qsv|{΅JٹtvbLٹs'68Օ9~g=L/zÖl"Q=ok$ӱOp?_F=+]zU#M6} 쐢RLO}/dm3.[20l?<֦N/L#se~Un8~ *)a?LN(3òGUQ5C-8|_4ARpIX7R-vS,E]?gyps+M(Kr f)X.N:+'\-O-elF1MNğk}jSKbϪF c9)gkvW.dEF0c sj4_Vl!|ast,!|gM.Wa+ Wtp85W2yމx EnC ;mp o4p3͓2'm[F"z$޺Mo7:tNs2'uNYk=?Ş44Wp'yJ?NixߗzOi;)V5z[s]nlhM-c6@7b7` OA. v0סaHN~mi ߝ'k h`[ږr6'd B :m|CJ; $<$S˖mׇ󦈓ْWOln4BIcg|wݽxIRhW_C0,>LM]MG>ZEBwSB Yޑ)ޑ ar;}uf͗ cinSEwFd%fx; e:Y p8 rtnߡLVl{t,51h]o~ᇺbjvPc 8U;;@Zn)y7M;?bd),^BI>Z#a*i +bT5}H [e17s'й<8i)| :0PvaߗaQAŧjw@Ai2%w`Gw)'oj(ReEj>'f=ڦ>@8 ߛ0O~j9yjILNC J (5?WK˩"y&a(I,|*=2qwW̃ZM/՛7>?8 q?Y޼ԫk<3ў <ξfSmf8o\)͈1} x.!% ʹ;(iU4͋O ri{-i{)R=d)!YAS'Ȁ]m'a Zqe+ ^fh]3/ af ?ׯ0AJkrCj@Q*2N~{QTMдMy/S!Rv4/#[=;e-|GfgٰY!J%馸ShOئ!W?y-[C ,NG#RHմ.*m/Z˖bl#AY0c*k+65+}JTyeY}Ѣ)=ė0b@C|nH$qp{H6m}X˗z+EĺA>'Z< [X&MgGw0:"G5o^aT:aRg`}<4k?(ZJZΤ&dh; O-rX˷?~y<釵XcĽ >/Z0ݿ 5gO0!9,x.7-Pcw ^aXkV׾ U %Cڠ]Z_ mmkM"#s(K샃X!Vj!{l|٭I۟-SAl,GOj ߎSf΂2z a=X(QV> P'K>~~#Մ1)[a0Hz>yǬӼMgS3]BYqgM_sB_V9sl:U *(ہq+iǥO\o}hf>Ak}'JԠKy<²kaKKW{,Wj/ϥf.ysш;f!#\QU'%%s_ PD+ҲqHF@6ٹ!7#I$+备yUאVOzR@O Փ;ԨDS5Hvsg{4'C[~2|_?c1FEe];Y+]}k<M_ŐۯEODطCؚkUF R'klYA`|LzEwQ#? K/x˂8//gqzUK~S k>2i/rh0R U@ 2D%oy&fz*n!3;dDۨ$,2xBb[>93o]6i|I@a͛*m;5s4'ָko|gJKxpg"[{VlҰ?`Vn%;1_H*{424R;8)*cA$"q8dw64ʰѐ3'Ux2ƀcs?y˷Hk3  >RCdPuyÍ]OX.U-&`{+κϨmHq:$"!GZvb%P%LW'2}o_JaGo!.1g6A^)F19_Æzp[76Bͱ)jik{qw"vli\hy82 f(kLbƤFmֽcm>)uBs2 J.mBFJVh`ux_g{1qi̜2]: m.xVy#=|.LJ;^')#D-AFEXW\ Y?,dhXS2.[R Mek}{yXէFIW>Hu9d621p'"23-Dz^ցʱHhIZB'Pw[um|H!o;4Ie٦(m-nVb;o@ڧ ňO|ΰ>7U{`A ؁ވ:YvHi^ZQVOB%sF ZA|yL/ o-z8TIe֌vs'C-˟CA)~6ϷrDbEtLMTDw4fVoCUm.d>)-0~n('譲-2b(f / O`hQxX)upwq z$ҳ@q>6e?Rn8)&r2e~U)nmnO23F~0jh9xKMWu޿UPwx΃Lت?,MΰaT0g Q&WhE}nch5uvv0?kE -LԖⅺ.׋\^bQ6QQ,]L-m%ҨAp/A3H^3bMZ*#5`ά3ѨpeKb~_ ,%&U[f$x/It67E궾rY[*_21[j$np˄' I pMmbD5|Ocuŗ- ׶hlt&rk~f(X)V6Zgd+%eZeC~iDYnePho-h)14kKx>yg]Uwɶ[\TH=L}q Y}2խY ׿FưnHcD_hyS+G[.)L8/4?BϣUMH<7JYA]^]oYxoc_׆Y 9(PP䳯gހj׈?8e>e]e֓X굖FB4 Se&e6c3H(`=^LBQ9YՋKA@.ɳΥjQǔe| mQۃ4Ѿ 6׍;0^9vQ탵}+&ryi &nP_X &0VKg?xrv3Cfza NsB9!)"n G&\ȭ|ϔzo7ܮV|~z58>¥~cFnoOW+G֑ȑל]vM[l ms7HJp|ͦxޑs| bheQί1u?#^|밴˸_;qocе͂;>8%*I\qN2ο=qe J} qraBVu;;-:H >mb86vw hemY息vF! <1S%{@a'fdαh'zfgO(`;0f?woi)7Wdf]ASȦ<| `z~ /yle H,_Y4NKlvm0n;ϑJl\?uo,XZ6,uO1H~b4uf'=4˛f6/"# ;u0\N1 I~x[-Ց{XiS1Ƀmp|)\)Vglà XWm̀M*`80v3l}g'\eZO{;Ei=zW~4xҬtw7Qd3Dpzi~ceZp^ /9q@XY)jWʎoYe){e+e9/.*̞7!>͎S X"i.P̵tY92Yo~'oecv2/Sȴ\kξS<3na:ϝt9/O vULETɘϴ ؈V>k:,(᤻5]|IoRZtd,c>ޣSݹ \ҢX1{YiM77_ 񟖶eWZ1Nw1h+]5~P?RW; hby|;,͔K5&ˁ]N2v#Sw'փ#){C2FNྶi/z]Mnz|T[hJޙ;0d<8iJu"1Tw#֣gdLvwqxHahMv:YoSsݠF. 4^Aoҧ,| !ƻ AZϰ5ZdOtpM턚\ԨIMZ&e*/;jVCX>^B2G1!Mx:L *٢B{$R#c$*we<o;-;7Qz#K,qbU&'IN8 gx˄^,Nn;slWwQ)z jj8: c$Fi5HC7Bh.աjGRiuMG?@i>bat$}uՋoyGt0:O)OpI;9ړ(l(DF6ݙ8u87K(7ĸk'G1j?֘*3KyB'."hB&c"ٹ"~:ceȭKu2vaNNQӮ..!B>%3=xy蚧uW$4\R$Mo8f6xi~Xr̴' Gm'SwPF1tQܽ>UL\s.[Q}jSa<A)VgkDGy}ZI})^;5򚄷G͉,9Zmo}ZA>E&G#5rHoI'r5TOh1O$RCAj0#UHHIm4A@B8KI>橧^#M]%hϚj1i^sN~Yg}`.[*U3#ž5+;FUTeE9;4D,sf$^>_ϲ 9SU&N~9֮jxi^<)_G~5R|5;Ԥ mཌྷRsO4exO|B) |˜O)0Ԕ:u0U9=aM{/&:{&OmR ܈ 0@Op)?`D>F!>2<=n~1M w`H30bYA 9xJ p1v3-KNZ⳾ |M$43m,0 JK uRJmSBȥܦ<FTBMDrpG+6iV$M#4,d'M; N)?_Ч[!>`5Q+5I8;+xW"U> "M&?k;%֠U>%p՜II߅uZi] 's"UPvNd>ɲg Z"8J'磄I0Jb$>Jl+0g--Aj !aԮ_XUKg'#VG)ɀw5E5)wij|CI\rX·uY}nAܓ,eN7?=elo#(-dg5S5q(R񡀙жᤙSPw}d|=/" ,UYu#or9@2:"5J hm,tU.tzji61cd1TZ(aۯ]p9sbհ kS+%ͅYq 96w<:catJ=]a)q.ۮ:en'Y$&U5G#vq]c`MoH7ʔ4 Gd~XFJkWnS[˯}mJB5f-ij[kS!y]ͷÚ)Ryګ~nr"XUk6yoWKY;T$8CaVVvm˗!!-pj~JRcX.r/#=Қ (,k 5UMsIB%r0 #y1ߜU=9[TExJ$Jo8'/Z߰tVrőKw}