From 99ab5b5443f1e3f3cb1d28b0ece950e81aa54a0a Mon Sep 17 00:00:00 2001 From: rachytski Date: Tue, 1 Feb 2011 02:18:10 +0200 Subject: [PATCH] added per-unicode-block font support. much less "unknown symbols" are drawn. --- data/mangal.ttf | Bin 0 -> 144744 bytes data/unicode_blocks.txt | 152 ++++++++++++++++++++ iphone/Maps/Classes/EAGLView.mm | 6 +- iphone/Maps/Maps.xcodeproj/project.pbxproj | 8 ++ iphone/Maps/Platform/IPhonePlatform.hpp | 1 + iphone/Maps/Platform/IPhonePlatform.mm | 19 ++- platform/platform.hpp | 2 + platform/qtplatform.cpp | 22 +++ qt/widgets.cpp | 5 +- qt_tstfrm/tstwidgets.cpp | 5 +- yg/glyph_cache.cpp | 23 +-- yg/glyph_cache.hpp | 5 +- yg/glyph_cache_impl.cpp | 159 ++++++++++++++++++++- yg/glyph_cache_impl.hpp | 27 +++- yg/resource_manager.cpp | 6 +- yg/resource_manager.hpp | 5 +- yg/yg_tests/glyph_cache_test.cpp | 2 +- yg/yg_tests/screengl_test.cpp | 10 ++ yg/yg_tests/skin_loader_test.cpp | 2 +- yg/yg_tests/skin_test.cpp | 2 +- 20 files changed, 430 insertions(+), 31 deletions(-) create mode 100644 data/mangal.ttf create mode 100644 data/unicode_blocks.txt diff --git a/data/mangal.ttf b/data/mangal.ttf new file mode 100644 index 0000000000000000000000000000000000000000..bce3e5c38d0c3773f52df44c1e4eb7feba5a440e GIT binary patch literal 144744 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�JxR(^}ImlWa28cGf7hU={*ElW#*H z46>fN1Q_#|@B=UgIE3>N-)=IexCy0tOZb`k`v`M@m$+|?*c>k;LvV-!r{wu^m;w;g zJVwDC-ZAdrYyyWDo-et@s{cezFU$UN9#8ER;P;g=e;HYo;a4czfvaIvj=#D= z4r*5iN3X`S@@PD+o~K?dpU1rug9cfstxZnul!;S1-Kr>LR&VySn&>tK~62 zwnFn`iB54NSNQY3g5SGwH_Ens>F4}Yxc~d5>$`FNvhmlelpVF#@i}C#kE5_|nyyoO zy3Wz3)80j&zT$?f<(YDic6HB}ubz&pSKfH_M7c@3y6MYTug2AbH(uQ=w`f+9YcLW<)ihOe1W@BvCR_|I^`$Xi5*xA}MVA=V8JO4#(>AnK)3LJBQfC~MZkWY5 z+3)n=m4hL}LPd`3Phly=rKK$3B*V$+Qv7kY{QUSVCEcjRmf;mIBEgxCS9~#30zy3G z6&Fq1oglHJmI89A1zpA^4#X3I;wXJdzvd|g2sJLcwDb*kF}RxHc^i&*hoFJS0r?Zb z%JD`^DlSk9)>x^Cqi5TNC2K3o=Puf|d0_9vi+A7gjsD&hOV0W$%8OntEbi)j#uusJ z2!C8NcgdAaYX@5ou6q_NEXUCI)HDwN zJwKkKT-NMtU**` z18w_F>`v-v_GLq`J|kUDbEAG*c3Xp1*lVx{W$c0naCJm%l97X9sTpZ$Qk0TlQLO$1 zmS9b=N=dNKQ-K!ZoIINC;-uu>GzBAxe>L-)!w#-+x@q2%MJuf?4>)*JL1<8ofazA{ zo8jvh!;gpmW$BdZ-5u)+Jy}8D9t8293ZOa~3;lU??l{ zb2wR>+$RsBTTc!O!ts*aN@}XaFlq^ts+bZtZtW_P0NkOTX9~&^4amTN(}8;P543!s zMWp~@S*j1IF$%(}Fcj3nAS+d?1|nTLkbx~>R%IB~LKoh6ZfI|7&Er#lq#Ov9u%ysS z{cqoUZ&Pvk%+|$EGdEF%`8Lm8cy`jhq~d4icX4WjnE2?V{yT0h40QIE7Dz`x9X;ZB zYMq{>Nj)`-{q~DOk_ON~4a?HF&2i$4IFfpPU1g$+%orCENP-^q3#>t$Ce9ZnyJ!~? zx)J;qzv%ZHOmL+`BW zUE5z%^zEXfUA+@pw=pA9+fRqCFUT#D(($JM6Mkm7uh}!Td*`!j7QMXjHh;~E>X{i6 zT8^w}?Y>AtGWInbLVglo0*9(mMaqR94R(SpfwV?TroI^JM&daHi11GJ;Pn zEn`DYB=XTJdBC>GHf)nTp1k5fVPT+N*U>zAG7|rWhS+Jb^JAshSRIB@_spCzb4FmO z`e?P-UEN`6(dilt(+u+sk{eYfI%d!rbOMtn6ir|q6FMg339}Oe3Pz+UDHCxwG~-Jw zR`Lry`I*omm_Mtp)^&GRwCN^@LcS$m%ug4^^n9tJktve|b4*%{KSr7{GbU!{45>ot ziQ~-5Y1>cis{V^op%nRtC;&Otzg3k@!hn9Gr9@RfgtF227hOosiQoU4s*6-L|0e&2 zA{iPGfQp_`#KbF~IV4^KGLomkT@84glfG3R_|YsSg$o4VRf z_r_;zUhH%LssY;QSYkfgY(Fkrg|i} z7)@@6Eo{KN$vkY9CYyU;iJ4ivfn}t#G`G{8fR}ME^b!(OdZU~~O3bLF#jcIr6?-C9 z9#dsjnu)Dg6*Efnq9ycHa=E0Waq0{NCjkU_95$1@Kvlqxsx6M-6Mww^bTDN|77w9&xId-;B?8s4|`KU=)A-VbHqSaKIogF|c3* ztIw~~mjX=jaj+jo>1mi*MoXNGnak+dChPO@DlC$-vrFYd(5bOhv3qiJ3Ry#bKJ&>6 zqJVZO27^)EN@X2hDN0R|l3jyWJQb(MD>0_}dUK2vRL!d&aWIlrxJR;B)r3Sn9=QQ6 z5pE;;Q3U|kh6LGD)unnBuzBMssoDq;Jf2;T?C4iTwk2Kde8FH>rANw>NXXk^Tz#8p z{8;X7d!IF$UOe-k6K~JBY0XEQX02P;koRK6a8Ex={!8dF-FL3v!Cnac8Azt`Y)@t3 zlm5xUMQD&ry7Z@|ZBHzpCxw4KkKJM#C|$A7SFxh5Gkx;ZVaA?1*BZK0w1uCk^_8ck zrW>!{rMv~zI!>;81+@x3SGX@Y6D2>rX0~6?a#8Q@Rk91az8X}z1nPcb*Fe^{d16{%Or4xO($*R?4{%>|{I``_Dn_HJIIMP(V;HHi= zcU9Z2CEL>fFkbkJSr0B>bo=ZX2Ny4|sc3t_YD=h^xPyH+!oJ{M%>s#J)kyyx33jfC z+ZHDti)JDp126;mPW@!Ph|bMOl{sb6of;#?iWonZDk5nnWQ?`HK%JC9RN~_e3Do)` zEj2CGprGx-4d#S~5!Hyo3&YjG57-W3H)1nTY=>y#*4poVwI_yM??7XTLzlw)moC2j z@$)yo8vg9snX|X={kS5u8Er9&Zcj==M*BecHz()LzWwHZI(+Q=|FvbsPoVmb#$8jj zAFpzc=Xq2Q>U@Y(4g{yyWVU7YWlE*#P3bezrP7q9lo=^fO;TG@Uy_s!oVNznhCKm7di)@~IY84m0) z=|Qt+>hsGnX0x?@@3&UWePQ|D!m7arUyhsUjy0EDCId3+2jgsb>aXG*rQU^L`(W}= zve=)@`kbs(-=r6_FoGgrh|%Sn^V2X^ND7qX=a(SXXwzA;+*x8)mMC~V9#Kw1y?wc& zB&Op#mMJP}xjM6%O!x$YsU^*vW;VE)k|_jA0wo5e)UQwsf=^;gqqwyCkhgM z(Z)kFkYE9g!H32Unr6P-$a-31qlmep@g5G}@b|*UHZFN=+SHa+8xNe?@|{m_z4P$i zA1w}T$N9@Y$!1O}E}lex!cP-LZwbHu@Ql``r5lwXMwTva}G zYI%8k`$Nf`8xgyp+8wK4L;QlW{b}f8Qhhj?p;&vf3;o#8s*a_lGRy&1&|xZ`+~o9l z*=SC)*`#PCF;QZvn3WuFf(?RV3)TJ}jXZFMBOR!D#V`h;6-O-xRpqHTw=9nGU{;AD z23U4QIW*dC(rAybUVicP$2)a4h{v*egl~`Q_y^$nr4Q35vAVwl{tu^jK#inG8H4}<5N{++AQlb>IBhlqz zPCytw4kp2fzz9R5toUsV%Z+1-Q}DxSMzsbaELXV^teH$|04uUoI2@#|kG4`2RfdPK3xFC03?(SSEH^z(ktFbYb018$W zuem6#NOXIPyg{#2gfHkSg4&Y`SU5$9>cyH|Iy0QC1XG-nUJ{dQDhv1uS)u4t29+V@ zD4K@lEBXLla;{=B$s+nymH2@f7S#HLNYH7_*n#%#=fMFE^5GUH$}lvmh|`HX1l-`n zxgnxOSVXN-;NB|PLXb8jcHo#f#-dI9{OIF}Wq6|zW)3-Se4mF8Sfzm&5_?yHRBVTe0@>or_mE+3e1mhK2JEObjku zH>GLbz{BtC+Z{7;=?-yuM3s}pGt$Dl{;0j4NSi$!9MsfSFR;1JLFbTD>Ww4iE**_! zUQcFbsw`qkJEBQhS$4&?z_!k|+a`%to6Rbsg@2A-ak+67%Mj%hn;q9!OxEZWYl<~G z4ef(4Q5$8{ab9n<;zwTr6ye|?flOD?7AL}KWV1uBbJ>peCu7>4ye+j(lKw$`X-VyI zjUS0Z@w$%+*qoXJJla0UszCJI_TIOP* zuR8s!^x{?1%L>mf8kjdEPo6({;o}E>DV`bQ)WDps1$XyMn$KL1u2_F$)z9`9r7xJ; z)H84@>)v$H-MXa6vr4>eJhy`O6d4?|Jog5t`W$Gtz&vJ>?a3I7Y*GZH1@(JI1CI@+ z8x(U~8U`P@QZWdYr6ngz79|F5BLxM-7$YXN#Yhr2J#UD)Xi=%Ja~{WqLpAP$2cx>} zWdSuZYDph;7JZSI~>~8K7}n5XIwAffxwMiEbel8Rv$ebezSMx9yWok z7+o=sh4K!ZYF8z~?Ilt7^?`V{%|OE6Y=K*7BY_`>_DYEsi-{$f{V1cPCQE+A-xCy_ z8868mOI?;CT8*RcaE1tprb@I3{#14EBASiMdX*cvM6&XhOBC0%TY**#UA*b!6FU#? zBtYI9p)Y!;t~u};cfY20EL;7ks8@AaiMS=~-7%?JDj+Wlxoa(JLlp$nQ}piO>_N+r zMcig&gGPp#n(_AG7#0(Srb41!&WMlqnv^J^z>9%lL-9xB#dv!H+%GMrL7tS7{PFl0Wi*k!*oSrS-WpK%?`jReV+Y3ysFSpB6ibRFA=Q!2xgI@P4K55}1~=G@Imz%(`_M=;F3ssk z)!AxfijJdAE0ev7E*US$rWlPk9)d_BUF8yjn{&-a_TUY+0cR!rbj&FojgH?C)dKug zwGuE%O-*QFs0XpoBbUy9dV1%hIR#nGQ;OK+vWDw#5&OoInXpgI!wH!Lz8;}dE5ISor$wl3H@+zUT!MOO=dm| zL!!WdiVFj)tPm3uodswE@A096I>yxE5pr?_k5r;$Lo!#VD9#ea?9wGBW&s$HSLrKL zz-ee+QlL|8Sy{4Jfse=*mAo&DVV>&au@MAiIoO+;OVEf8I$B)(`tTbyBRD2_HOWg| zTGjK0_=uHvvw?*GLaJ;?u@d<6QrV~^hK=xBNhYgnux;jpTRS^g$Mki3SFFA5-1g@u z7O*?QpNRi*{rVTvXJr*PmL3()tHq01x9(`0IiqU}D`qRdvw6$m6YGZ09i02U@HOt| zv$>lR(|f9CNbiEE$T)DC=J0Hc6Y@v(dbbBB8qgHd%i^6*SCS&9Sgmdz;?8j^H1KB{ z!o2pZ_)H}#9xo|HQL|4867xEpjzr!na!eelViwbW)MONnDKQyOLGgH(%ls`(0YB97%#leVW@lo#BET<1(V#MqQ4<4$t>+{ju*v)EWEi3bM8Q48I~Ai32D+^7iGj^3vM8+!lwRL-kC zFaDVy&VeOt*f+tkaZ$sRPF3c2ioJciZ+)wwUn&9t35k7DdKdIlGt2SFmrRYKE}FBV z8O{AWhMs%vQLHA4AwX_M^Rc)%LrknrAFW4s1sNUK%myLBV8t()U8ghXW1@|C=`EBb zj*HSm&IewL7?2e5jhK#VqKWrj^JB)Ssg^-}Y4Lg9ZWD+gAIL$64ha1U669(g6B9?@ z4d0&RKgdoU3hg?)Ix1mLxKVm9993EhA^zUuUB|*X8^zyl*ll=|_3$-wYx?Je8X3*c zW}>!qa9h;jC^0jGxziJMdXud}X;#E6Sao{iu#v4dGI7Ajg3x<W(MhxUxU8m~TZ5(`T9-`J%>2 zt2VHcoMzySD2gNTY(b=^kfKS{ulU8Fs}+u8&E}c|HPVa<)>{NFV@rLTePT8_wN^k> zdBOTbcSZ>)CFjvk8$qAJz);|5K#C2x^5m+dq$->$VN#W1R|y)(t1DBSNiMWNaykn+ z@nTEdCGJ8cx=t}q@?3}l2YC%EHw2Ae*n;YK?pImZ&L-U0C^0@;OOR^Fh!KlAm zd-KJ&_8vaoTeg1Fd(Z4WGQ8Bx5>(Y0S~dLGfrG_K&YsRM#OQ&U?SqFV*H5q8JUes~ z1U^YTZhu5}B~!R3IAV7F1f2jU?Eo0kWHy#yR-O?p!zkgIhVnpGo~GoPJz1Ga>B>=L zeoPjv7kZW@%VJMb3ZqIPIgF-~5|ba92%X(7iwK8A=|q^x2xCwcld3d{a4I;OqBmrW z5asBw%P!4`-XI`p`MPW)`h|R;uQ%=-r&;u>Vf`!-&wnSHhYv? zDrl}6zUig#e+R;MZ54NKJD|IH-R{M`3(_(h=0u$~wM|;OZ~C-7Ltp$~ncIKdRvG6n z*}1=zEF1|=n~^Y(Ac9+mt!$~4oF^*ZiL=@*7Kdb&8>m}Ossk=mlEuPI$@mQ;g)FXC zy(n-j_o5tXv)YIzju7cu%4A*G?-D3CZCw_jaNc4GK@_zo8TK;taPLCz z6fxSC>TqBnYjjMMDaI6o?3YtwDFmpo5unC^!C$0+0^q%|$e9*91d9<}u13%_i1>it zR10Q|&xkScpQeLww0ZfBZj{BW>PaRu4+V9qeHZ#e_IkG9Q0SS%s}<|fa3fbdU17gL zMB7XxVzUMl!V5Nv&u!eRW3?=apJs00{m05W(FM9e(uH5(c?`81L^W`44@1&rY|0SV zd3Jlms+!8`Y9}=X&gM)>OAA&J*X3N1(XQ=T>ra^-5t`4KAw?m4Gi5nG9o` zJy9_R@Uo)=M1|m~tg5W?0)1mg$m>T$7N{20EhWVQ`cQ{2Iu&3Uixd%tMk)F~?_w(lGPKxRicd5PNmq0pOO*Im)kwQJ?pjk(jxGg1?i zq>{lSL%v(LzFcwU!t%b9J7=uyo_FcoUuO3x24H~$BTwj7DShz7e#7yh4d4_+Zi5EB zP7!LV6@_DwIi?rgXefSPE_|k4nWJ8b<}!jiO_s-9`5UqqfH~c*VNTt`e+qe*q^cK2 zc3)0OZ^73qmu*SvSHNrd_dpO=0f~zL)KB{jAsum#J=#6&xCcQ%(GRYhF$D@T5fh$LOPU%T>G!f$CU z3fd?b44p~_zjt&?#`v|kH5wk!-tz|hI^2DZw(dEj&oNT2U3pNw5;L8uaizNIXd_>p z_QV|3faf@*-Sh0oTS5|OY5|BxoS*nSKl>qP5*1{Y6x z^u~AVg}fY-sZ*azpKGzV@UQsXT>iOW0ebiK@JA#o@a|*UyVs8VLgkyv%EH1e1%s%4JZpeC$2p5jUL%e9m#40(wta@Ngt~ z59NXI^Ap;={xmX&b|aa8t_gGTRQ?fWjod*Q6h6S~NpS~laVQT2qziu35cF&BxQ{eBKI3-nGn~SM_zYbNJ(WGK zg@47VPSKtU>$sqC>K)oUbi!q3CIQD+*b2@N4Hdu-CIvu7+2n1PI69{@JAX2@712D0o-lA6xGb1-QChW_Uvah3ZB*O z`+>>P_8aZpg@$5@s7)!lhSyZ8Otm1(## z;gTN1v2pLX7XB40P1WvA9IUPKoc1)dO5B^~yU`$rv{7DHbv>Tq0qx4mBOeN7my~*3 z8H_QwTZH=B+}uuu%m4V)7JS`(8M0)&KEQ&|1O)wF|K3W4zxO)E<4llFLZ+}JSkAqr zXxRbRHc4_=Bnh@^id*oeBv}&76tP9ODOsl^WGVoXCZL-c!T{U`Q!RRmbz^!2w;5n+ zsnZ2{0Mdd`H`ST**vF{fL^cEg5LLHH^;Bu*BcHEu{IPo$_C0@BZdYUCtQCvqbbg~S zRDo#={p=yJFZ3{5zHH6%GpE00K5ZD7Id|R6MsXSj25tm}u%bSmvvHx<))&DxxrCvN z0vWQKG7$J;9IF}avJ~Z~XS&heS8UKO9Im{*QYo$cL!~HGvW=DdDn)TYC9AAL^Qm6+&{JGT z-OQbwj{J`sC2N^3*_9p>lkSq`(rllSE0ik!WR^@R$x%!wf<#7>c)#%K=JWfU2-Y}t8i@8eIm zi{@5e-t4(2cU+8=6TBQ=b?uQ37Pl^YDla-Xrxq71Yna&5HV+d3!_3CxbE!f{u)r5f z7<&(mkV}fjc9@Yxu-nZ^QnKJq#+*cRJc1^vz!B2;4vk!7z=9Gq;TEtYP6nQxg^?PG zXj3k6v|50AVIby+Alnb~CtX?J+!m=6n4WA4$4c*^y~XbzYTw#2b$GN$pe}nZ$^>w1 z!Bfx5O*kc9VcBy>GTFg2266Lou)ts{hn(rl32-ak^3fU$>@nVL1f)}rJlTEP* z=?Xf0QvXNnbHoIP@vR;Z9x_#TmY}^tCE76{FRIOw8wLA2zJl}zz*=tlPWYV&&|jV$ zY90gm?>M@1IXm&*IE4SXF=+p!`X!{>L#J-A_`2kskWI$tqx3>eO`ct?+T$ncHSVuS z@NTCCb4@rca-31N#o4S@Tb#rYxJhP4EEHobEqGz0q69SGr2fvMl7WV&YqOR)jEplg zb)Epyl>?J0d4q4p(BtyfJhHn5F8cK?JvCEC5#!U_=Tq(S2)A@` z>?#n;yBu8QD`toD*<6|ygu1`cW;B7I7W5i`TRevJl}U?tsFfLV%be9JK3@isXaRe?$vOodHh7xB;Zi5%q|1a3_lb zc+`!at|||>$M+3ahX1l%IZ%7~mGDQ;9D105**!bUD)Xw(yz0vfaIbqe5ZJN4h9#xB`*u8? zuxIsPL*3^^^})iz2@_OVJBgzcF@Hu_a(NSiL^OyuK!bQOB0ZXUq7ZggEOt!2inCx) zOhT-JL@P~ivC9f#>n4SUkZAm-~q z4KHv?Cg78kzi$7>n#19EXv$8_99RRNtA|D90aeOZAddAF5OTUII>HbA75FjXZq8i~ ze+}&T2C1ledtLHtTq^3}?Pc0xRjH_6cY|NoCI2=eJ@fKRuJPC1;K6mt3nKTctjtcm z;kxl&TjX;gjVme=v&N(`Yv#HL5nN$nF!yjg+ixfJ`G}r9CzBF2BO>dv$c7jT23;A2 zIK`~<>%@rO)N<)R9hEzn@x)0Pi4Q`5f~FPaa?_hCdQhGm-lu^F5#S$%4TcUyAcLG2 zMvlvQ(2x=`ZX1JBd{(wOnjzU%V`TRj*>NM2b|CY#(#Yl;S(UNXC{hI-^nOY#i$P2| zHcF5kQ8M)KpS1Y&&{WMMWV^8je4IX++sm;+`E){2T(FvXB-!*?S3 zu#yMX5W*#c87t$EzER*K*9(w>+?I<>Q;n!e-fEThhl4}D7SE@pbP#fTpLwe8*uO^u z^W8pg*2?ys1m>IFz46q*;HK?Q<}6z~XU~y)3+Oz&xU#W^1Nl}B9GW(y0{ParHqBdd z{+qYn9fP`#ww_&_@9kRrMD^agbjwHP328w)0&Katc6+Bz`8bc|1u+1X{P+Gcie_=& zrC9h0==>t5^Wk9UX3qhSILoulBOZ%o;$Z`ejYb2*jGXucj$UK&ECU42kj=8<3j~UD zl^mCna5CXs!o>tBCm|;x6?2oaSh1o5hV2Fd`yoRq??C`xAMIF1d*vFJGTcuSDu zk{lLGk|1X!DFzm2u{j`FT(*QXr!$Q^;4F>%K;t(Z3&IizTn4rW_^)A>!oOAFO6sZIK|T~tMygOBbm!`*=H7(yWj4W`s6?5Kaf*|%6qM0fg%pgj z^>bIBvz&HLBm9S@d>LUxMjbsmPb;HC@bAY#i%>=Ud(jkXRFOqDV2aK~z(m}09pO^N zEi4LF9F;Kf*CmNAc~RVkxV>=_iW1PU7tNGpyTvYKSOmqbv&c~ZRO6LwiBoJsGUhhX zLy!8cq_oC)uHZOc+elg%PV1L3K8`Vf5BFE!42N&T_do)TsMwzUJGXbTSHC?D*>g^X z^h}<(j!#nEE&hmG7-pd=n2fr7b4;`>SfiP2#vB7PUd*V#;ZWrvjyiMz^sG7o@g3?d ztnmvqoz2WZ`~zxKyeqU+yt{N!cvAf!LdU338qk$jfkdi?X-RzIpPG|{VW9R3`Z8|D zD_{Jg18fqW{uRIsn@CcAdiWQIzJipws3K;c=aal8)V0v;+9!iqw*=VQ01LF3TK5;R zJ^AdWeAbh{G+*4FeI#4#&0di$?nS%P7e*cpwwYVI(ph#g+pn;F9?X?u<(|nN@s?aR zl*Hb>fqYWLiDfmhY`?^oitK=%I9VsLC<9Povi_LD zwgWCE%fQCx#VdMUx}-#7_~$Of@AOG2iM9kKB}(tsvuJ%viar|kWr`PeKfL8YB#gq* zVU(xlJ#Mkot0hnXI32M3M>F_Xx~jOf&Bqw9zZW1f@o!^7q_ck$2*Tx(Y8zPv7uju# zoouF)ZPzgjF}Is+X4zpBk{sMrvSH>*g55yYQUdCR5NA>&zhtUGijJLfm7~98GC@!4 z$yWp8jyIdad2CK|+1uem1?L84j5nS_H#aQ&nfManHAoMPoa9n0UN{$AToBC;>zG$$ zf0WqwBvvj>mY$O&ZSRgN>}G`xDu`|MLQu&vW(wM5Oq`9?S%n1jQ9z$-%vxMUTd6l; zUr|FEFY`EOANIUdZjwcKpbc=*R8&ytClu4bw)wD$stzZeK~@X*;zoBfGJ!MwO9%`y z7lBi}7}|3q^a8T&6@%FR70AW8Ft8SU&Fwrs;Ssh4+j6N|c$RsYSwz&*=*Hk+fWzE6 zA*;sK=IV1v(XK>S9!g@2O1w@<%8(Sd+klKgj3O8;1~*2H8_>qZBiIxxxD>-o@bnbq z)65gKbqlJB@MHQF`F8=X5;dp$U6oC;Ta%77jTy}M=Q{JoRD zvE^Vz?)=KyWh@YSK&CkumvYkk&aT+EXJh>>v+jK2@#6W82{$hePP~Blv_hx{WU%^R zcgd*mClva(f@^)bi*y@wVwo;bpyXCm#3xwoPQ^{LRTUa8GVG8XirpR!(+qu+n4BvG z1f_}+76BzQ6V+0wEY+=) zbQ4#Ltazs?ij9`5P5;xqglwb>%k4niZD7a4li17GzcV+zB|ERQd6DF-T=U+eJEuOf zXI9szt$i;ZIC{QEoDrHky}WVSZHGRE3~vqnYNDrodU<*EtjUInaXF#K>sa6Em5cX& z`)<#zJ^P-0>d5NOZ`Jg41rJmNuTSFoapYYs?n(7A$-?nqcaM>|quCv1cC(oc5{M4= zZ4!Dmn_+8B`8NNlErFu8tn?EGbv7(!z{^UmJk_>5VRpc zoeFtSl-v0M7z0;J_$h*U1LKPd0695TNy$Zr79=Hr4%#L;M`s)pg3hXiO0z0#j_|dl zZHzPa|TZ$5tPAVw1Bd8o6tH!fm)2{sf$SZ>55+lSz(127kay4c%qJt5n zfm?gpx3IQxIF3++28e2M8sOPD4Ss>|y}{@x{e|pofJ0O;3*abU0kf!U3_Yvy0MIPs z@1r=>`xv7B4Z}oo{y$(X+I>!G&k0-$zt7tvzu?ca3DHsPNtAxDwzjsEfLzr^zP*O@E4a6B@%Q+)XxbWH4$CbnH~7 z0I%`2Pco9Lt^ViQDhU~*yCfz7#i8;$*{ZnH`xGwI$5V(Z<{_p9 zlj9;hc%OEM549`xpi06eNyV!rYB)9E)gpB4S3y@JN2fA>wkFGTGOgKeEb$;T#msHu{z+3Rv=Wv)hp-hR12t)#CNdM?* zO(Q=G>;6QgweGBt$!Q&-;D2cA&~XZiZn}v*v4wv{gw-9PVE+h)!Ev<9FSU1ML(&2Z zhjuYVKGDbWwU5VC9_pJK!NQ%@cIsE!yNXr$JRa*5k!_j`{q?w&g0h4Hx{O}Ct}(>R zue6i>sdnWvBcBQRmndZpG)*E$>I7qq<`%*0{eR582Yg%Qxj%m1b9A(9%aSEavLsvb z9_I|+1TqLD5LQ`bq?A%9Es%z$^wJjELZG*#KW;}_ z+Cb^JozTl&y|)m_|L^mjBUy$(Nyq*C5s4i6=$z+$pYcBX$;ukmQjRis$`KJXi0I?y zuYAnw_>R7;Wg6|{P>qUz#Ew^Cl4+At;Ey#aNV%zPVnS1sGj~|x?28%4T2dXMi{Ilr zyjx`xTg30tC8LWi<(BGU&W5T5v_%F>s#m@|C3ACBcMYz@bPE|VBvBle%a8>{G^=I# zB_@t)C&zvjI_b|7F9;4LOCPRg$EuOFQZ0$N``8wK_r%P}^9)qCNH>VP^SFISG#R(& z@ZPC;>eW2WQC-=@cZG~ol%~mVr(!lSQ`;FeGjkEonB{j{GFlZ=<4*i;y!R<+Rn5yB z)%|#)CAlWtj(m7i)|6OmXo0_`i7nT5>rFt3-J<+jrEAJ=CE-*vGDmfTfU}nJNvo>p z&O9U2kxQAGJU5E|eF`*JhS^BiMIsq&B*BToF0pL# z6yrO1mS2ZhTXls+Ke^^a@8l`PubVk>UcFyyQ@Jhey5w`!jLSv3SCaROHp)4Z*G;@U znPrLljml>13FtyE1Oiy8z63s$bh?1DNz>1o*gAC&r3LC962-Y)lR3)BzI++Dp3J@+ z)qx(d+h!RZR6*4`2|$49sRIL-S+MCVdCh9I@QSj1zG;nVhe=u>ua$SoQX?i+UXPrd zs;UxJU7h2wSkZUE?ah-smFU8dgBOgak`jYZ#T$E1rdpPhl6+ zWl7r#pU`M9t;f4&Yn|b405zOrOVz4Q_GUnO6FJGWF1Kn{y1kfDhlYRorv*E2+Aw?m zYS-sJ^MxV%SVu?V*|Fc=wQSMN2VdJvjT+)Ne_rj>aG-{@c5k#g zKPz!&)hmuGx8M7tE4TiHC;PwqbM-tv4tz{ztd8nBCVnh9m2A0Hart6ptxRZbRgt2} zmX|dNpysQB2Y|l<;sH(>GF)rO(L~O-N+BtVpLkizT~xDHM{|02dpa zH`FS4@UNP!Ix2n@(?N5TOr5{_xoR{qtj=|C8sWTtopx6>Uv*S!nD{4xUca~UsYf6{v2NOdygS|h_?>eHp7WJSRr}P54 z@DlbBd!?F_>qs)D>c|>}XO&AmzFb>jfRbn$m@Z@wIfetQC&0!XED#Af9HB@+=R@B^ zp}E|LP9O%vcUfhaF0K>h(2*SG$jOyl_Hqx(Ph4_V2rqk>$#p^?Qg4eyZ1vI*i1i2p zbL0+sWlS?uIg1k)bAJHM#DNJ*4imKko16q`jrQT$!|&+YGuH27)FoUAkg{}9m zoqO-TM?Z7?-I|$l*ZZqagl2(PpFqx!=>CKn(>%p$6uP_HTA|se7o#M#=Cpbg{$13g z(0BQHoUhoyALRi*!t1&~fF&zb5MFQ8zMnWXso~)JT*JZlhh;P9vHrrEj;@20vMfuC zze79i;0h&LDs8S^}tDS2DXMPbb2a~ zpwfZx$5HJxBKUxQhv#tpPJ7N#p;B=e162%VHQabsRX$_7JBXt*g_SfNklzbBVCr6h z6DFFw0Nhw&LR}bjI_bKhN=dJ!Ylr*}&<^<>20=+)CC6y(LVx-WmkSIpq!h-<=WDvE z>cikVqxSs8@W_BFI@>)SdM?)?O`JtDot#D0g=mzSrc(k6u2X9FdH17q%Zb~#ZV5Wz zT4hqlR5`Tbgn{gO#c8p|&}ABDiPcJ?M-os%%}*6VKCciFD${jOf`D|-6a@K-L$9K%;5mRez^9fLH`=|@mE}*fd)o* zBMpq-Z4eT&=!Ai6b;WM>#c(fk!LYt8T`^NBDUoZlv zF1k%FF=M2bMvlBsYYPG#$eI%qNo@q08;1s(8^2SD@I4`T!a#L@UqpiLGZSwqj!?)1 zkKYA!I)Fu5Y~_RuO-ZXl!ri!Dr@|$eK1{#k-yxp{^gI3?=y&PgxqzPccDkO2?{Gbj ze`h%;p;*Z?1VXhT5q|5OMkj`62$7d8q7YE_nEg`-au zC2~@WYfNG*O*6#zQM|)_m#T&c&NZ8a!5E48_<>53~Vk5Qyolq8#M2>7!R!!;Be{6f%QT2YY)g|4tP54rGy>i|lDFakzE zXXip!VQyx&Y|h0?%tJPLrDPQYqA2DUP>B5OSmbo7do}`R(4{dh8+{ijj~x0j?_WW& zR?2z7?^N}<9wkL*d1Ib%JrB7evy`r;G*ccvXL?p%nr!_<^+IabETj(PS}7f)*`>Cs zK`ZnFUr0PUml^N<`lDC0h09Cs=x!hR!Q%5Ty~X-(kH2;6;wKZUkXrsd_T{~a_$A-` z%Dq>7)_&Y_({Lp8W%l!bPuyCSXk0J;Vf~fgXEthbsNzER2$!L1^hfoVf#O)W5KU7H zaSW38f?xTt=HXSNKchP9#5qU^_&LkU$fv|(P)?s3i$YDb8jB(lqHo84shzp#rUiOk zq}#{VgI?$89u;bYgRY`R2P}}p-`@vL;($;b;BaBr**hv^nMBo zc|ffU19K-~htCR>2)U|8mq?2w-xiMKSWjk4nmrnk+xc~BY-toTp)Q3zh@|j5hgG!) zY0}?f`F}yz)P0~`_?2>y8r$69ln&V04m%sjT#|WNrgWXiwuxvS$lBXNy7Gf&wjJG} z%vn-KhRq#~=-m1?X+T;cNl5V*MFE9@<#!sZc;y!%_sR8OlkMP@Y191xGX}rnuH==G3H{$DB zMj$sOLB|vf#qYS=h(`UPfR5VbYJD(}Ma9Y)WuqY{h-xXOCQ|E>Eu<#SaC4C|? zBq0C=<2O!cZ_aY+gkl*_1^x$crs zfxJ<4hu>Cc5ifoBvz$^Vj_TAJd&KcTp`*In;1PxuD3&Nt$#4v~A$IfdVXvu)=W(FL0b%wHILwOr#B7v~klM-*RPUQ{p)iYh9Aw^T1% zD*`YibW*X_=m77}pY-}-^sbn4+%cv2)nbu<3d%1A<#T6jBLLE6Eopcsb?espX zURIEGPWJ#LJn57rUcM^hyD}FxQSBOMHl>|+wGCvp4)GL{mSiMfdPVqJreCIq~Z3ms|JHA{d5y z_5jiZ8bdI+C27~btUJu5#aWHcmIE@979NkyqDl+upgAgSgtU+Z>UHf9_9!!=#(txC zD3hTl^fo<{^>&BBq0>9`4wQL0QPN@1$!juqWQy}>c7cVuKxgD+=uPOr#Pk@sVNa&) zgL_YtyO(l5a8`kV$tj$kH^}9byNB*0)P}@`*4G=)-y&^}f31W4 z>5k`iC>@)RT=D5c4T;y0&v5?6cW?jhvqSeS*|}m^yz#wVq$`b1d=AohGHyGn(@*?D z2z&+UTu+}u!!^j`M(qA6t1TA5C{l_s(8lo-q+Im_XtoMfKWv4qXN5uqmlm2q$Ov3m zW3||Gt?~iSs{=QuM`uTMCE(^#dfxZao=1)tdM?@icxamJhnH846RI)WQQa~XOWkg_ z>NZqm#%Hu>9wN6SGo;Rm*M-`X42_SUnfT@@r;`py7d;?P4Q8WA1LmD;pG!nYn_NB& zbiq&A|C|!*9TktGyJZOmeuY%yMH+?^vKD;@>1J*}?}@M#-`39P>oqvu(BOzpJSWtm z@MGd@rwR)JutdoPipk}U6)83~)!-B$QPfB-(JJ3<_?2TgCMM&;BRa&{1)E}$hU@C+ zJ`vSL!&fiNLb@8Ak8kp)j_7`Z%qURuh~KXUo76qxRTj8PjS!DYznu7uQ2iC8i@gNc z=t7?O03oNsNF-3yRU}e~SwqOhc$$Bzdym7U#)n6A-&gTA;Pa*9%`q7T2HqCQ=Y)U8 z$qtd%+EkfVAvUo|+gCLzJSw$Ld{(FkG=BO_{7ClXV$~jN`_=#$!f#zn<+e9WjX*uF+-KWDv{C zoNkZPi0VEanj#tk9$7&?8D0TFSD6{$#VNIxVasw9sF*X{nZ>4Zc#ZW|l%JWQjri;6{?GFvtqA*^2J=H0)MEw(oWi8rLPn6d zh(eu(%z$Wk{dp*`5DmOgiWN83+iHNxQ3hGq`V(<_;PC%gUd<`>58Acu@P*)7-OT)akg5*7FH+Yg9-6eA1lX+{HuXK#mIB;r{Crq<7(R)NQ^;AY_WSu+!y$Qj(iWh*r+JRQM^@-Z+XVa@ zun9Ok+hO@uD^?0_!Gre~O$1HCU%*DdUAc|G?|L7*ML2lENV8>?Y|@&PPPZG1Nz!(( zf53JyP9q%!)<_sr%<;8T@KR5^c!PqsWKj=rC=?(bRidR?7JT)vEL1qL`dY;*!GK~6 z0{dea8p$a7q@{s7a!Z5X@i1nv{RNAIARvoFyM7~i0Z>NZh0|fu0!iws+y((XEZ69V za@+DxNaX4KlGz&TkZ6zTG}PwzCRd!M8`JYhH|Ecyn8aVHBjY}EbkLFceYUgT3r{Lp zhT&?4|MyiN$9y-!b|zuAx~ixM$NY!s(RMUenyN>0pW8{hJ4U`YP)tS)J)Qp+)moDq zq{oqZjlZ{SQE4Hi{ikW!d}YwGQ!Be3F%F@w4xyJ1(Yoy)(7KHcga|Bw-uV(5E?yB& z1Dl|JpGKUfk82RuXb?Xk+@N+L!-L_CZ*PTTc2ZC0+%`o|H&AZmDK!2JYsP#Q*sbla z(%vu3aVZ-jO^fF+LyOm7{-$u<2?MtyvdNFw+!zW0=Ko9W9^yfhrYZd%FplbyymlX? z!xTNAUwsYf`QXTP8b=;RuP6Hnos)JH3!(IJt_?%-2)XH6G`}~rXukf#IIfzN3@Jcq z4lN)w@tKLIl}xT#OMxhheo(zu15}zP@O~Bj-<`eYqITymC@A$9;I8G2BPh z&`DG6=Bl2UH+g=(Hj$>M)3ZrW=g%I5pLOtrngxv2Q8uuWMT_xxaKc=q9#3jC;WTwx zBX5(QCPJ6zPkRcdbwtUW)al92r+{BZtoTCeJrBfj4ga-?G!37x02;owf+Au12_5D7 zA+Op_IesSZu=LDDY5wZTCUi`6Pip^o3fKNs$Z-yRh!ueEq^tn`9asUW?|h^+fUCJR zpkB?Igw8KhHVWciu%2F0GP!ji2GAqzqfG>jl0UZ3n)6-vq@BQ_hMkZO^@rOFxOy0t z`6gVg+6{<;>d*-as-O))a9QYVt%UkUqUfaAmdt2`_*G-mucg}*xEHr6_>%`&k6q_Jx19D|&O0K+%EL)!0tVWotswh0D25Zf{2O`u)^^ACJ zB2BmEFm|TJC8nK_cxtUBn`hgC>cB4;dFvxs|Dx_qOrmO0Y5F&w!S!#x52T}dNQcbN zCmnLCI<9GqY5F+6%k^>o-Ruy;pw=#@BC}9ACe^@2TJX_SKf% zt2ch)r{c?TroZj{i%9hO>6EecYvSw0(;Gi||H`||H|)CRj_Z!IBA(pGdG(3(j2IZd z&qJeCEh4RHKi`b%~ONzt; zem3G?>EG&?9_)Iu>$xsz_Rvr>n`s{Gv6tk|8J7FArGTNbFWt zBDz-pARBBQZ0(SmbxfGsA%_rp3N_3b8e&ay1{x*k@a5*_UVp}3^jJm%Bb(gY+dW{O z)hgHJ=Lwh?9VpmWperZ{RLVVFUETITncN-deyUrXRoC5JH%kiCw=lU$2*`Qj@NDY$ z_xkgwfJ4{iRPQzN)1%J@{^G$V)nAW)ogsXxvm*$_)R9^9+w-wMWX$s{Fx9TNobx(a-dJ${Y5z*|<5T`u(v6QkQB>_je*B~xp9;oYlA*jA z(~4|{dlQMLUdsxGdhff+xp7lo!7T^w*tun6?CLeotemrGYw&pO(OJENGgdNR{Bwr; z60_sJM8ooZ#VEY%>3(qJHcU1i9~bAuujP%h|7T50>9p$b@trMeSGCMLcIm2))|F#- zwJOUFHjd7|YGY5wlgHzm7>0eX+1b={)%Z-dY}vB$^V_J2xb6m`DY#^OL>=s#Tt0S5 zFMy`B%yNH$>MGLWNV{ZY8{o=ssaNWbs#j7(x3naAWm=x^gC(B}!t=Y1r9xqWB3ZeUuL9Prp)YntiUv(r>Sf1mQ z5U;UhWn;!QtIkI0TD4Tj6aR`mg^gC5$503&iJy&}0V*lmPc8RT@#-Q{nauZlTWiKb z;vmjD!{gUi`*fvG{_eqTJjwUI2OeN$kOL1iE8DiuXb&DMiU*3>vmxV( z#Xst8tSGFI15#|?rXPR$x6dDc&#C*=yI)cFm@H+XM^LAe$Ate?Za&h6ju?Ad#XSv7 z+vnaHeSJ2cM_(JPt;P$PltupHcDyX5v6wZhxhY4d?fMMM4D7n1lnOIT_5SYO88cXq zD0fx+^ufx?NU^@CxhW%h49@gOUtc7uA|a5?x{3%3MP0f`H> zP4%v1MA^j)J9!toa&RoK<>X;E41<%=xa{^M&SrP|pLpPjmg&2K4@UthjzeN>vc?!JEm63^cyA4;?*{={xdM`A_XU%`yif)(wt8zMz)$MjiS zS1&E{ETy8-FB?Yr?51vp-Vip}aj3vAXN)JwBJ4+B*s8 zL}baZX4cgP(BLGqwl>p^viD$#RW5>V9V`kK$wH$nmxbzTYgstcvJYMFXy$OR#A0&0 z90F$Wkb>;bw8apVMWKHXF9(LuhJ|{Mx4>5ri8y46_2an2MuU?klV*XqAjB$#K{*!j zGk)aBvz(bUp{iAdj#-Hb)hh{cDtD=!Q@Cj4=u#0vKQ>MB7P(JV7b=&fGIDH@FMmVA zGCrqcaC`68d7oR<6`j?-yRh=^`|s}Cb@z>{)(rg5!hvztA781CH@p+5czVT9rN3#; z>g>6f4Tgg~ji0EDf4!VZ8IekO@YHzHzyi(Hkn8guge4mHUG2Whg0zlQ2bE~N-K9g;MXNlX5iqzp8X z(3llHC)2t0j^A$T8@Xb|k`gC)wQc$pTR5*?S(&$>CDK2;xwx{++|wEG7x%W$->`Ch zR9@cq&~LU}^6>WaccyXdvAWg`m-KL7Yh=YeQ9~!yuw#LRBOSU-x zWLi<@QeAE4XCF-$EeX)HTT0z1iR9jBXObOt^d(G03hp=}7~^9 zW(~_gqE_xQ_BL{Qv~~hX)N)RzWcd^yt937`_?^USl8FsT9f`AX^GDUc%$c*)=KtKM z9$V7=>F4vkh0Rqn{SN!BN0+U+dG8lKojM?CUa49IQ&QP+Lohy2$@Z=Cd^NwKBv3Xj zg4S)$L;j6d9DjMwreEIoo(G2{f^3+PqE#HJbKI&?ZAw`uzgCW5N?y0&M$tPet{E)_W)KU!7;UQXy zfuOgf<}*=iUku$-C#KuMTdt;Z1GHH>9Ql+cK0x+|iAN4CiALJ8b00tccvbb6M~*I7 zHZA<9Xe-f%$Uc-mck9}gWu7aGa?8B=tS{Oh!0sJRJeY_tKI-&_SCz#B<=^gJGGpLy z{Q}$0r`e~7X^w4GKI^Mo`HIo3^A=Q3FYz_OECi+;6x~KfP>0YdbO|$s0ptelJyORu z)UkOG&SGcBz<@PdDeTP+`6XA_o|SKKb-B8FZJ7|YXnK&y`d0eNV{W)#VS{>@wJ=IWx;_30PQ<+0xu>G56@u0<2va$hPJN&^9Ry z{(}lL_WD@#2RH<^=AcO(hNK>lK;rKWQefI?@A)_rE%l8$0II5_rdooNIQNirF{rWxQvw;}7#|wyjyeWAkTronIk;HPMzhm$)XQJhw=x^39O? zfWLdHrd_}M+VFv*cxeTDHs8{GTd+3T)f1{~Z5SP@Z=5yr@>t@n!P@P+?s{_L`frmQ zJepnOnVA>*Gxuk}qBsRiQXVLB1z@FW76qknYsM*=rhMY7yc}2N!W$4m77A%T&ncIq zZ}N@;c4;vyDJu%q)`Y{N&Z(=#OAv6v=?mRDTbVv1P{{ZwE@XriqFZ;wCtK{Hni`f{ z;x8)9(EEoASz)0+41GtoIsG=jtu9x24U;Tq6AL`5y=G;f(wBpV3c}2oJ9Yg0Q{q#JXBKuX9i6_u&Lh=z*M%gcHLCoi)>^95R2yOaHw&kgoe+8? z@@z!GbknrgF}n<43{Dm6(b>WYd`2;i;NyWIv|eo19hQ-imv zMl#zR)v`G&)2v0+EoO_kL6nP%8dx)lxCXi-@`hz3M}903r^>gacq3Vt5^qyP+Xpyi zid>_<)M=6pow!teqMXaL?>s!R@$jNM{Sax7g+foyJu+{FQv2uw*Zg-unx5R>Q5b2ZOD*ExmKOD$AxX?&`lKGHToT{J*Z8O~UM^?TW{=YI>1(^CPM+Z@N4i z6y3yL)U4@0sWvjvesz$d>ExGz?@gGvSMTH%d8ajN`s?bI7&|3QQ|SLROa)5qi!xKizs(xrRnL$1Wf`YYuvxboZDJ&Pu&4lTR$H zrWyln&SQz@y9=Q&+lqq~Y-a^KSi*LeutR3Hvxt=zmy{J27MF#B)xl~bq;deSVz`FF zd1X4E5o5G``RMkSZN{?dLXB1WkGv$z-ax&v*IcM?% zQa$G&ZAtP%b7A2#P+mzF#b7s83FRF8f_fo&>{2uHc&Fi{5#IzJ)M@S-wfC@0{u;(| zt>|!7FX?`D{;6O+yEM_kzV(a5d+{$N&I%@+a_VlX zy?gw~erZ6DJL1ikl*%=AJL(SBN&7-IF7%rE&`>ze3nay2nh&{=W7#npI>YQO2z8qW3YIV9D`k)-hXQid} z4DEqDg?<-9)3>I^dYpuOuiv=PUbFCbVfLxpObTQWauIuuqc51;=O3JYK}+Q3@{e4j z&>|*VN=>egR&8vA`$ z;@P(o&oN`-$oS^%iH?T;*Oq^4>x#o{N#cv^c4PDJo>>$L%xs&xHnIPb%OBl0udQkS zXZ}aq`8n*#KkZtZ*gSK1M#vtRcK4>PCTHR-`MlzPQtM{e)13Mj=?+hPo-*lBU>m9N zio+&jy@DL0!~x&%e(ZM zlblvTMTlG?Xmzs0X_K?rURHLrFkQ5?yuQA?z+P3^mhJU>MQ>~Ffl3xY8AfhpZaH=L z>7S;Yf-puCYnzJ$ zgKg8#_gpbB^1x#|TMPXU|99Kmw%6NMv1R)cTi4#hR(}q)v%gM=`}XbySv*}@SlzvN zPW!a&2_q|bsIs*6aP$1=;L!CiC*r$UJ#$j|EGvNh|L(OrNfSx@E7j#dx<$3T^bX;7 z$}ywg?H4gk`;eQpR_l<7Ugq_5$SrcV!xIWl&ah z?NBWIPC36$MioI}MO$lIE35K5^!4?&CWAr3j8+S?WC#7hF!lD9Z2G3`8h?#gBbVLM zbi7GyDr+i}LOh1yLBj%XM|(hGq^yjcIemI8lG0Ux7H*SaL?};9Pf`TGU z<8yO+m|l6n6kwZt$9&>k58Lix>Ue3X$LsTESZO$`+~LX-yjCzyhqoios&8wn?yk|5 zmq)5~y6MwIp%*0sfjqf@+$WXY)4HdzV8EqsXvk?ccj&XK8O9EEWrVX>xQk_VWpzn8 z`sVDgpYp)VmFD4QG0+6}GhO{)CZPAd%nT13t_o2KW zbzmwgGB|tY4DY}eKcjLUeTlAz`Uw=CPNg4m6mmnMyqTCx#UWRIz*8xA8dr>_;E+1C zQAbjH5|dj#yJ^j`+Lns4vbN!dZV?oys$Z zLz_eULi+3;e^0naQbIjFAw{Zm$eVH=%$dlMa)en1xuL14QWhfCNNq%k=pr4l{#ZZj z66H3ZzPH!WP@YjZeVT;1QrQ`P#Hcdd=-Q1w=K+hqUwQPRcX}q}UX&$bV16f*>Bru0R0^AsoWddKO4b$w%%7O$taz zMH}xWi{n#8EmvjJIt)P7RfA29dIN=;?8WwSGz(vlSkM~qdi^!kf1Lf~%&Pml8`pLB z)lG9aGp%NGcl+#r+wl9bCF4p*-_^_!uaSN6hpR_Am6Z>!UJcRte0foAO-aT4pKrfA7D3WAi`TB*jUT zs^=KTW(t?ARe7n{g~d^yf1|_4Mg-PF;O@ zPQEW2VpH#FX)e<{2WI*lPM_Zs_K4Qz&CUCorR_d8>|+ie^EBr=eLiPyvq!Gak^OLs zAro8fRFrzTeFjH#pD0i7tTTnn%c=u#xasY=PRZ?a%#ZjkE8J6fq)_5%SbLChR~Yg6 zB85_oO?G6LWcOrC*}}{tQFeLss;DR~in3s|EjkdDqBU}Jvn;nEzy%S72$zEBSbkYa ztzSVaA%A5_v|4XekVt7XR_ZawB#F#4rISTwWjVu zNm58tp-3vIeshpQ(!DU{^oDO}s_d5`A)rw$NNl}zq`lG83#(JMEMRD_Bg z_U;Pz%H_wp&(){8lH5NyviHB@+o4*S538!x!KN8QGX`!NoP4?Pyp|iH7 zy}hEfwyrMHQjt}JYxLO&oRx*-NFFNh%OYiwB81tTMR2D~r?`Sy4(nUem5DC=d2buX`hF?TQ1NkGb!4cQ?htp-|ljdp7Yuw~t?* zlPKX8vu(BOSPoA_`PlXDginlSco-);)q0T4yF{tCWaW50=t?UpSr-LoXUYmU=Tk_=j3Im3$K;GuOeR)z> z)=-w1mz9_0v|$jHQ|E&&X|*Ew+Q2+WN33`f)omM zl!@k^gwS{$)hLtB4Q())OnMy12JFrnwOQFNLx~OYpP}Z2=Gi3%a?6T>J6DJm@vnR) zHhkIQZHf2To8oBVa;i3Y=$$}Ob7|2vOPg4vFWPzU*4O$De}nC2x5n){v{s?)t!mv) z>_xFa(G;2}f}m(7D=jGz3>nNM7rAsco7X9nd*O*KEp_D<%8Gf|EDC0;Ie?-YGt#xt zE(x8Wa|Mj?#A(a|7{Qj2Y)3w(x^PriAsLxtTey-$Zb4pvLm`h>sX_;(wPRzYg_?)F zzL9uEvlvl5OMNg zxw9=5<)ka_vq)}BdAY?cne&Az%#rj|R229GxeTA_(1hNglZ(pmvUm#6R6kn|!}_Cx zLk+@0P;fCp!b8;ywIyrWE1+*^2x|VBHq9m}6Ot+bOlC?sqju#uA3*h}OZ-XQvIPsu zZ}5%nzii>?_UH3<-Lk(c@eAo({6BV#FB-eto%n`$d1q;H@wJN=Z=N%9&DZ_6U3=h^ zx8p0!jBWVI_>NG+P&^N8peJ7?`n6ES7V2zy)pm#QnsVK>4mOsvAxA7Tvuk-N<_bMq zV&7vwVwVoUmMRH!kn}XRx7QkTsBX(B*JjK1s-~u@5_w;MseY>G5J+PIRwd}VoK>>h zkz3>pVP?CWW5XNEJy%v{-F*M-VupM3aY=0}!v*}3ThXAbVzHuhzpaQH;zTw4xi zT?H$%iseECr!9WDu+UoBg3PW;Yo%COV7KZT!?Ih#mQLCCX!P7zoJ!@we|!~es^%1+ zY7XA}$#&~F2yq2S8$u08;Xg-z050ZRt(|ows7qz2w(7A*;>=~J=QBCUDr!!zqN7&g z2?P7{%r|cyTWLDau1*|Cd^UFWvd`|kdfuY;Kh^!_jH4~w{qy$o|4zkpwAZYQ_BXV9 zVCcHys^eGP{^=zPc5ZpFe{j$E{3Q<`&#mt*_C6$DMcZ3Dz306@lEjlyWv~x)e`0c9 znM-+Ue?B_~myA7V7kOCnCWPDrnbz29&vuW9&U9@uJ0`QEI+o#W^A30=v{>*sJS85< zqtCI)dV@``w;3c|R!dbhTHym)y2K&znE0gl93_ueh=db=1noFvhodmRpg^Cm^E7zG z22YP?9&TdN>Am`W$n*&|y7dP5qFQ8|NyY%!d^Z~Ak(E;A_Ytm2-;XPDk*DzpSVap& zj>REV$KaM=;Rt-as;hUh;E}Kf9#LE9)ngPQY!$Wc5p$hz`lz}oct)KCqdM8?=pm;O zOcNlrl(bO%gOEC<9MZ1wOJe%2$VDhqqm(OuPLpW;r%**6wF^y?E2{wY#^@n)%rF z(bemizj1J|5r5u$mvf3BEP&^C3ou%#`Q5*!Y&@31uFhbaGT2R-?5a$LQq<-QQ@*ze zFP%yDxQmLAXH_L*Yq&rIj({@Q2vIN& zica~)CmD$LmugSbmd0?* zc14;mQ+6zI?~31-WS}gzQGKV7V%97UX zOU0!c2c56w9E20}h`t0TD5k;-MWi{fOy$$N^I3z7IV>fX0~QIB3sxJp8x9zx5|I^` z8~|&1atn0W*+V{dos0Qgp7Fd*d3!M*!%g;<#egWJ#i7fzmEh&EW@MIm0wpCyw!NNX z9?|1nov}URK!$|j86lMa%h^Gi=9-@7_mNj}FETUivdu8vpN@IQM)X z`=9t*{@rZb)$zSoA3lK#5l7k!H5ec!g2iEwlA9>zC0r<_3{nChkEG zqeF}_3o7!nErq#e9ik)II-4M5V(1D*)G$mi=5;Vp%!G!X=|JBo8$9my;V#VR0|(Yy z&r#?LNPe4yq?&~Dy!Dl_2>H~Lh8$y5s;(wpb?wiZzV+bx znL~@%{KUjlzq_<-_m(fc@xA4VHTv?zcZQj{;cL;(wM*NNzqboq*SFw{YsSC5^j$@* zpOBw3bZhI~sx+?8+m$EIH?lq>Ycf)&yzES~xSg>zw9v^l(wZs57WR1SfKrdD|Nm9eo1wY5<-ZqO?;lziywWLlkcNk`({?dMP3wQf@jyMmTC?tb{L zmw&^=%i~|c`rh32=Y?PI8@y^-nYz5T=+~~?bb937YSqFJ^xF(n+33UcuWJ;g(#6*5 zcj^!6rOPFDRAhTZcB#mgif9F9#`J5&?u{+LQZxN_qb@hsmZi(aQq7pWm?H>gj4vd# z(o*xxIYNH+Us!4oOFhd?3p&wgt%7Dvz7LN9TIpHo{$=qi6Zc#@?~-{4YG9%3if+8} zG_$b5SK^<>N`JbZB|_0FR)^Jv&K!Ae<>)tdzB@<7qhY$CFSX9bMea-7yWLWcku5Z_ zTvw*WEW50_92Z`83z{p4WE+d1U3-3hHtK-{^giV@n@xCxEiGo{WXl-$BoMIzUrA!^ z;!??a_LWEwNQ8{y@{2Sv>SfELGY5CQiRV!c9UemZV5km?28X6R*C61T1ljOP4k z+@kjwC>gZO88w*`pyId$YY)J|nucR*Az@fLtLrX~|Ma0med0e7cMT%{hT~YYvMBqf zm*X#E?f;Cx6%kGD2i^vg`l#)vD-w-3Vu ziQ_4L`W$x)l1u_pfm-~J2|aOIsTzqT&V^hmW!y1P+N>kXP_0;^6UUkODr-Hk`>U@c z&W%VXkNvYCoiB`Uofw{Y9xEbW z&J)V2A34}*{GW9;OZ;*c`@V_&p0PtF%tFm}_^}vIUY^GxnJ58LGz$9cM;xadzox;D z9;43mzb5u`6FX`8mPwQzF|oVwHIva?#xAP(^1C6evm9&9n5KVnvF>3g{5y4>__mag6e%lBK;^^8HaM>wDZ;^ z0lh@CvE$Ffc0COTFmyklPhAu=h4Cc0@|I!b)~Gjdw;FwiJZ2g@v;aS-hubDNxCeplUtg-g8BS@+e<1^wfA?NyW-WO_- z(wGDKK|#JC%UO0i5;?@29FtWZ68FNmk_1Q=MKsFGO`A>P924-teNQ+M(7#|y{9Fq< zKXEM^WP}qw{));}U>`foQ?6C3Gnk!ZiPr6Z=b<0{zt1gh@7}fihU*jeCJub<|K0cb zGmne)(dA3FUCnj~y7)`+PfeVf_;1+eHV)xVWx#67v72l;IX07B_ol$UA^Zz^GwOg7 zQIPc+IX1v-#V}NhNpH01_lQTt?}$GY{~*dxjKwzNfKdz^Aq7-+3KP+v1JoK5Ks!Bq zniD@hSM&6-l)73e1wM9~fR~!3nOkpKef0JnyPKdcj_(JSNLPjsawj`UKlPc{0g`K@o$8~_)$cMkhZ~O_k*r;0VX&1UA&(<-|kt9 zp1Ax@>y{<$SKj3Jm34=PqE{LF8dlFhXY|>7ZrNIxUwzHSO7F&5C2nU?*UTJOOJ9sV ziw>HJocJ2}L%h%>NIwh+S1EmgEPFv#R)Jm0&GzT|b6tWl-({4ujV9S&keREu2kZe` zma!*u9=uI9LCnv$d5xmp*k&8BJ!_M)kwzM}Ng@O=wwV`=VPRIZ2;%gjA>kbSAa7_3 zRLy1z)T`@k)QE}bKGN)TB|ZBE z%h_vg_B#g)+89b@A5|1{KiHv!v2YkegPQ_xBS*q&cgD;a8K6V!x7%N9|6RNEPwnin zcGhm4hF3uEM{8rhN8j1{CO&&+;wdGFFSNG?0-;iUZL88MwuUmY%+v6ajQRk=Fp}OL z(RYQ0LLz$S!qNGIlz$FnY305;xF1kS@+!Oz*f5^I2l=hW$HVlS9}xMF{7%kS#V^ar z=c^Jj2t*5h@!~tKa_1JSanNL^`cP{*KvR~Y@Z*@y>D7K!M;NXVNk*2y? z{morRyPErF)isrrch|Y9!`u3MmoB{HrpqtC>Gm(hpIW!)_BE9a^X7t0*6knY?5`{f zl(gmNx1sW&vcIFW0{ZF5?Cm$q8WH*=tr7%3^)fV{-O*zbaIwioUu7`hGKm) z4SjuGBQuPKA){!ZL@+~_KD%1qRX$WMmUBn+58~&7uY+!1fc&$*$XyP>bVPAHk%Nyj zHAzY2|BYGszfdlMf8(%1SppY2bl~#;H0hJ7{-C@R&3;Hn6*%Gjh@!L<;EoW9-%h4X zm%iL_?d;2qgH;s`?U#1UZ>pU=iM*Q#b=zY})ZMXg>7Dz_y#-6UtNOz8%+ZpC`SG)0 zruBWEyv(+yS+iTG4|nxfl%^r`#xzt84&AWzmOO80yec|quoM(G4!;SV_WaC*BAD5q zq1ox+AuLpEsF@davcQbll3xm=BPq_mw@DVCK|w$rTJyu5%n}9ct@DcXe8RCH{`-Z} z3Z5$*|FPD2yMyux+3Wglbmq%N?-EfMT|l#-#4V`SrxsRPznaP^*T0c={oE0L{bf_H zzxP5NXW3a@3;GFWUE9h7SETFib&~O2rq1;heNoIG%!`uI_y>(998nq3-Vj zL;Uv|49RYAcTg{APA`yc>e+LpTXE&-hKJ1`dA*IQ$(nL+`X#ok_3)AKeOCm3k_n zq|Tuvr6hMqg-fNB^@@x0c0)rNK=cW3hKCK}?|_Kj36h2+B!8hPwYotml2yBOtEzXK9_CrDcU21w#bDU;Tbk5diFJ59=fY8o4BCR<~JeMmz% z=_`rRJ9>lXLTlJOAacC{ZH)&mrfoKzQ16#A@uVIz6)IJaS+BSOfzru@&d#)k-S`Y= zkE+7-G5#ayrtcy_NkT#bnRE6u4O2--9%h$de|`d5K8|zR0|G%!az`2*^oi2JsI4U- zr{m%Pm?BzKo$lW+2*Ek7JtZNSHtqcoq-jroGXzN*N$Y?}G$Ne`ja;stM2{=B+SI3OYLt9GK23JNM^xug=Wpb!a$Ys0l6c3I}0%p;jnriFJ=sSH?51MVem zvE9uix64!Gs&VC_iAp72xj`m}gk0I9ptnjGbwQY&iFS1$2RIXO*XgMb3v`Z(Y$1aRB|XeM7Xa*P5MnvA4D?MQ;DOA zpZ)9XY4dijSva({cTGcGYZ%^FZF7N z9fXwO@8WLg=oqgE0K%zlnO0i|hf9>IfH+AY+EagqD1tHyQbj=UxuBAS++4`BNj9fL zPX{fZz{dMM*d^Ul@vpY@T>I^3r?0(cpfBL{RE)C6u8GgQ`tZ?2H^^Z1H(Nml6UDDx z_r%(5jmrmb=;`U1lbaa5T0C{lVF_KyQ1^`HVQPNtx6sVHLab0gc6-=r_jdOIx76h7b%~`e7Pa@=#h{&;?0I%^K@Qrn_KRXrWQ!RqD=BgMyaAol zWMX1x} zG=z!{*=W>dxPw59KHuxp$=RqW$@b+-p2A$YSSZc&P);}BdG0NT8(po!2vd4fm?v^i zZa%*RZbqjJaodIVG>Y+l{!I`Ke=QkDB-G1k4e;TXJx z^+LV1K2X0L6GY^``o8+G*IQxBF7g+Ji=-lbDC}~DEA%#+w~P!rVW2%MZ*JWOPcKxA zu0WUA)kF8{716vXuc|$SL9A6WuPqH^N!?l9S$RE7?iK3$`oayY!AE_k^Z|^b=ibJ# z=nEgHqT$7**jJV6kplIDWTz9_Yx={x`Qg_Z52!ge+U}35I?X!GGCbwB@Cf?c)9d- z#6ER(`eqfY3xQUB(a3Smg8B2=Tu~nKM)UgHfzW6Qp+m@I&l_g)T%mh< zRasSO!Mt$kywZ8$Vtth_Pfzs`Z%1DTjv$Tk#O%;zSrYPX^0qmwyXkJL77v(bA z@kb(#--RQc4oIF}71W}+yjt!C)SRrH(1WM? zgH4;bhm8YHp0+Oo?zw=QTX@i-|1M7A$(4|fkEN*k^aZ@dSPS1!}#qn(3gmgs>dUCsR=*MW4%HQOU{%Ghg;Fado53jVg_sig)C^89a*M?(6 z_5V00wMN+&@KO_Hlb1RL(H6yT5>~F%AbP*kTHzb{m;BZr?JQPzE$O&UQtAbK*F>r0 zyH3HjLn$;1RG+kxQpcG*c0}6+Y(q|JvuR$=3^cy@?9R>z#sk_X#6; zDU||(x3gV^_oJNQ`zVxh0VjAN-Q}YO?g6Svw|r9aB$D3Ese8)3n<*H#pD^*jK!9Lu zivmXQFa~v(zRxxN_j8XYcQEOvmDkf%dOQ^z6I0bQ&&3Ee-?ajrpkA>X-1kGnW@ zG$UpUy3J!+y4|jx_Wy8SdQ!?wt8U z0@YnCFhkb>q+A}>Rlm>4{r7gaCwK7z9(TaTJ?^Pp+@b)sp`j#f|8NJq2HS;v@SOT4 z<@7g&<0p(vx&=#XeF};)s=j}op0QPqzFy_Aytnw&><}3@8jd21fKl3Ng0*&*b!UajFr-Thmn-;M}8q|1KHO@sG>c1(NaAByE8bF%gnrNP43K~Ct zQ`kzgt7gqADN$+tFU1(l6z#s)00VHJc9u@Hrl!KiBMfP<`HVOXRM`IE(FP*Ysqv_( zu<>X^3bvilK`@OTuyNYFQ1F2V?K6{jf0dMVv__Qyum7)zvh@rMB8H z(?QjxCeVok@N|-LkN?df9ZiAfyt>)Okt8gv8U&KPvn*wVY2(;o(TWzex!3^DiW}0 z6ik9yXi>cAS*(*~J}v6Gw8*?L24p}7hClmCU@{_0o(pykxh4@k+w>DSFm2y2^uOy-gArgpvMvn^L^QU=5 z7y+o|T~jLlIrP@xp(NfsCE2q&{(|-Gy4s*b-Q=ilQKTpadQ7O*+vuu-#r#6DqG9nh z-QU@H^e6*rO8uhvYYy`TwXR1YC z4(yK0V71v~gAWTupN)JS5OEsKVyP4JWbqs7I9{;wf_6$%Cf_nO(%?Pw7!|H3SILWT zr>qmr@L1vz=`bxcvZ-nJhU3>C{KAsaLoYqnd5X21-z5f8OMR^4hU-?G9(nV@gL7s* z)06l$U#y@z|L=UYv$0yW_TV0+_mGzz@UW<>-z8E*tDsB5nwOZ^OcRUZZzF3rq6m($ zBAeBp+=5(`|I-!(_!bz=YE2_;L7ov?pf{rILJr^&7r6yIJzM=NwGV<;wrWTQkZHg< z?Zi&$8QO`~#Iv93uWLJaa9)1f`sMeW`2Lo!u$uERaX7UZY+ImwVE&8q_e8fWyKQ9F z%a{L$iu?1|^4(BUyRkzFnsW1U#Y#H`1SM9KWAmd>#)dL69a@&AFF76SMpV!I4NFd~ zlw+JC2t?XESfs7ASNbij)b*|KBiCKBb64XVKY0AQySCiEVIylg?-uu^7W!hv4Od^b zu>JOte|_v(M2jn zThu~UTCdmW$j#Lo1EA<4-0Gt#8Xbw>$JJD_o2<8{uwIIqlPl(2?bNvm!|wU>*Uj6w zdCjz*l`9|FwfV81|9tg%*7DwO#ivp@9vWU6YHfEewve^57=6RmIu~NPy z#H7-fnpF9tdn&!X!SnJHJ-12RMg`AO&AR3t`PaKP1)9Tq*S$XRUOytVmO%H(BZ}gK z7bf?8ZBUpqK6_J4Dtktpo_du%ODUd3FBl+m#<^4Sa8$@o>%e1vm9oE@*pfa;g|{D>v^SRD#?I(UT?;$ z+REpVOaJiAE7@^l>jz59Yg@~5I1@QkPT4JUm(aW8MXlO@maYl8@iQ9q{s9KuJm+ta zVCO-R<3V+PxA`rFj({5D4erhH)9Q2{o1aEK?Q`@AOsI}Plkx;Um9c+6eFXM$QhAQ? zio}P_ai%1Ir!?a<40~sJ#ZyTcmX0Uu+Sc4cKJ50{?U7h4_^{ALX?SY{iHklm$c6isEnB|) zzWbyV%a+~O8Uu*JYMm&5*8ZVp9%?f{aJwyPTu+3Ps79j^_Mro91vgB(P46YeubA=9(>Dz4URKa2CgLIW z>Y6*qec4O<-WnYq*ESHT|NNPJxV;;C2R%8P?6yfNT+k?pRx3TT8K}a!QYjg#Do71N z+thj(j|2r5baU3$gEY}sH*@K@*v>I&`?6pfK`ZFpv8J2MCgr&$S%HmTPgJY)An8gW9-QGzUk8^TIp^AcB zp&G{199d|tK3dWC_2c=ITaUMhqvdni;{4p!rRC(k=GKcixzy^AKNH4i9zYIh`44gT zl+^%M5uFv+rrahF2d>|6<7Y`G#BA6vACXVVl5EwgsnJW?%y8tK_GGj*9DaliEjpz< ziAF~+HdJ{ISoca*&TppoB43OjH;z19bHmFo-!Sv8L4)tObMT zoY9jL{^SiEc}7Rp=!o6~m215}Y*JV(FX+evR7m(a1S0fT4aX>I@Yh=`xjGP6q1@j>c^uNrK##!si>Te{O?GlrIwOgPBvN4`r8ct0zSSPDGG9liZ9`EP=Evr2bFqrSygtnD+fZ^Ml)MX-C&Rn?&-C9?^-;CT&reXD z4<(<4lC7b8L&Zl!$srrrWh0?ByWJ3?i!r9*+%!y2i;MMZ^jr0B=}+j->(xfR&T25g z#08vAR67El?6m#%KviG_3ffzII1A3zZ$-^fVv>jeJD|l4t6FzXrHj6ju4haKooAgz>0+*=OYY`Fr>sCIUF@&YDKmIVhkSL;UnhRb zte4Vtzmm=s*O6}9J#3EB3_4||$oOI#j*8*4VNms}emI}&&C~=^F+9W?5gomLSGt@=(ZggOMp0-RY zIv}yNL6}L}xY3bMkD{x5ny{a#e!}homC7(_!R7{3VU2Y(+y(~0s7OS5Xt`rjPK|Q1 zsl#-4|Nif%+4~G0+{d1FU5G6vK0d}4@+UT-cu$kzcK07Y6J0ENX3wOIjHI5e-*~1N z?d@z1LuF*Tn2fTw!c?GuyXbY2NUxY1u9dW`)}fdC^8tB{Pual!0dcrXw%ShE#I-gu z)k;QL$sj8c>||0`0`*usFStpH<=T=^k{3#-(q_nB+grBtHfgDi%(UHV6DQb+G}uP` zp}ZV!hd|zm!{_v`yT)KDpe0SsE7+y8Aw&+@5V9-eV2B)I?cxB{G5cA&*u~zpYiOA5 z)QU@{#fqRF0UB5jH$4~CQU2omW?NN~ieyU1G4HVOK#zZeFMaEW$f z2b^pTvc^~?E3RPe0^-OXxav^~QK!Y_#nF*Y6yi)Un<@EuXI{jt4>oHZTBp{H9ucW_ zz$jMhQOsBA)O9=%ngLZgWotOBX6Ph?>75=M-wLf`*1hS1gPDn9O(x-&n+D%uuzIcV zV&XwYWMyT&lx$DS$w>=M9v*Csh>eY~2B)QutQ#@7cTcSSc=ObZw)5&GSy{cW zn;eyw7da(9o*q})+pV9wp|ZTR=RLU%3+~%_BDNKkDz$c%m$VPm+<_9M)_W$o`@H3U z!vDO#v|6)S^MVFf>WL~b0L~KZz#Vy_?59qKN!Q?DGzH0MR_i65gEV2btWwLKqQKoE z%u)k=`maxpR}K|GXBPt(EG3~INXix2-bnG$NaDF5Akq=njb7~%)r~fr zIv9DUZ0v~MEh0W1rcJOh;2HmmwL}Z^fc=k+|5O>~sa+E6n#0xXz z(0Y>o|Jrm|*-B5qER`M}K;iNu8P{$)SI$_oe^D;%yJ{Z0KwW*Mj97a0#1@t+=uH0v zs|l-M6JB(8Id37yE#wUg*=r$BS;!g-`N~LcHj+>yG1D?J2iXc9Gm}R19p;s0=?reu zpr)U4t%YwH&l|-we_{$StNm=YdtklVfM%C0_J`p)I0p=NA)J^4j8=NluqjBECAB(; zwmcXjq-NjQH!L1FDikRyQcVVti+h!sb zyDnmP_xv)6Y)smnB);B_e9@I0auR3M14$$^sQ@>=B=>y7LGE@Chr`cQ;BZAyMKt#; zw7{OOp00?!$!{f}NS2bnh$hiP(86NWVQCPmN&^;I3oeE^Q`(5pc+qB)sTsfIo=#_U zl4F0&k(g64QeD(-QA?ww>!V0aRJ6Rmy3*H0)pk1T{JY^C!O(;+lZjCB~**h*l$$JiKM2%yZp>i|U{{?nFw z)yhEsi!FHiudf#dUD=q||JnjVX6v<&SRLBw9xDlU$Il9H3Kyq@lk-93co2Cjh`ebb z$IRq4GdUkXJ_#Vwn?`afkcfdO$emd0;%}4tj)1^|vt7u_E*rY+>LPUs>-w>g%rM?; zTx^tzj1!EaaVx!l*>EWAY?!Fr9u*eo7e29TU01QI8y%&q*%YYu!?jQbgF{|Mhh0IJ zj9mafm~1wOkuFBq_>T!p3l!;2uNY`D+RbKM42EuDm2@NmT?pHzkWAx0;r)Vk3p%#2 zlYn#_!44w?5?ut-`pSA68$YNcwnRoJqT>*q&7jL9z`hz$<~In%KU#V8k{EWKFT~T8 zi@3PT%F0q&F{4Ld#Zo zSJ3wF?~@15s&<;U9E4FFt6JYxqi0o1>6BHi51sF-(X*`T`xu_N8K@!)r}rejrG3CC(z z8s@XwEoSr2Ah$o8e+u2YvB@WW{ZHqfbZz{I5A_H}?QK;)#B4o$v+#m~Ln8 zDFzh+RZbB5*%;>c6 z#t*n=u0Ph_i6oKbjj#TZ3|&amy^-^*HZP%;=$-;y&*M%>@E;}SVLjiCo;nwjlRK^F zO-_dsYYv|WrE7V58>!|2F(c@L022pwOw}ymVv6bS?0u^YFXd z!|x!Y!y`sV2P(H`dic>>$FMK4*h6>0%dbZdBhIejNj!A)Miw{&}OC~&v zJ5F{b#U}PE$tW6e+w^%2@x#-j!tG&F%8Xe9`&7(p`*0emoTj?%=ec^N)jZeHs!>nH z@?-7CS*t*;3tga#PgSk59K{-@C5RIPed)kJ8y#!w&vmqQ7W*w&!be+Cxp{2tau*b9 z#?oO0+h$`s$L{C>EOwg`TmD>$t<^l!y?bP2u{wsuwiLv4j@{8Od}HGl9s&Dy$oZd> zlH%fuH3>Af$x^`nLZ3K+wo>*8SM?jl=l%B2=`+ZU=szd{t!75wzUk@3>MWLvE(KYg za^W2n(3?8NroD=l-`+lbdi5&SFfCB@k<3o9yQ{wN_A%dQP~YEPFQh$7k2`L8zGqK% z$R!EMyZ!M-B8hgjBo*y?JN;~|(?J~)HNtD9yZjO3`j{tAJKImvCsHi{*J18J3^4-+ zKrK{-^D{6wqfzHF)-W@WOIhctsKVe*Yj^?v!dj7q{$;h-pO#z#PmGT|pL^=j=UgN! z!A(MvF#0)-`a4+0qDj!nK1NHQ(}TbLbS8aBHpsB{cS42n1!Ghuds2^mH`e~TVMifW zqi&*`ug+oaVc!jtu?y>CQB0%mUqp(2*_hbw5FEa|+QOU9o-x%yr8#JW6$+LEpA$Fi z*_R2m!kisyRd+o2?uf{OBe=$b6|1d){&jbO-k^Y+={wAdsa14kB*y&MFSLJI^XlRkP=K>kK8Hm#YE!a<-U%zC zy*2H${u47y9U1ZDqt)9syxRWIo9Aug`sdWD?=lFrRECWUlt)H}kA6R{r_Cgpzs0N$ zPaQz%+uqdsdP)I?fLZFdpk>w}^`;b(;;9w(7uuurue%F&<%N_KAA>GxRjM1mrv4`7 zZO;n^bQ&}lB}d&AsY)=zp*ew6tru`ZH>4``_^4EMy0Iq5j0OehBikYR(9VfViKRM) z(ZzqaicSE{RAhI4TAzN1x~FxXgtUs~wPcxa=d)TjeZl}*-tKIiitXs1Ff)Bc|J3Gy zcDK<~keovp#P(9oZ|}6w)>cMb)^jn0DEa+`-b?cf>Cw%T-w8ssJ5h_1I843x-`SbH zCzyVrKeIAKe`a~2r>mN<4ipj-Lqkzr{|o)wb4J0NQ=cBra*7_#b2^Kj?Qpqp8~g9l z<2~n2y}iz-&wFyFw8KWS4P|Jc`uH$r)iDOJ_Sb0)VA}Gm{dq))0Syp}^Z&xga77zb z<}coy`iu`Orx+hRWq3enc~-+lr~vd!A){B%p2+d)6C!l zsuE9`w~|dtJdGAKQ;WeUyxAu;C8y19Q)Z^wjMN-igg@jj z<#dZr-0)}VL6`$>Lw0sR08SD0r-{-@md{+yq8`jjXR9aPCFC@m%?t;*4MjzWr%?~5 z@rHMfw?duBR$l$(36Op1nOCUT43a$U ziM0T+49_D{YAPai$R%(2Z}WMoD3-eeZd32xEO!ocU7Eo@SJYjpa+XC|qeDtn`8#Zp46`6ov@u1d+< zZ(mT#p3MoMFM*DlogHtXO%XdTd}qX4ugW}PU*|Ze*rKAI^suV~=RvO#=MSCZAf2M3 z3_4@^l{hb56=%qh6xL19p*zwMNc$&kUkfp6C*ENgcS%|(oMG64`Wo&Rfbv>QK|$Ns z8f@Z`_E^xJP@jONXA$a6raOJ5t7^&>a3VG~IDHguar=uw~dZCtM2(7Pz)Q@%JHgBR~7&f%9#Cxawxcn-tr3VP1xQ78-WaCOTdVCdpr;SGyfe4sp1& z6bdiUh?UfOhn!@y1cwBgauT~GC3KJPYLDpByI*#nJ}D8|7F$SQ_mBiZB674NDmKD|wo zoa#z$dwIyT0X1pT%R@({O&_qF#b`Z6e`IXho|-yfMjG~>(?$)g8qoTwH7h$ii$-j7 z7%BVSGX_i@ItrVXLKF6Zn=sx|ZDt`Ams!VR_g|&MPAK%5 zg=%d)c0zly9yAi#qC15Mw@JosFRuH;WL^?&P_1Q(OxVk$V-Ov?SWzxaGrb4lEcB-B-6hpup^9!j_JFWN)9ZtZPXtOTSpYAhbXy$4|zdHr5O> z8aqvsjVkT)sjWQ7#kS70bfYjV3_p2j@%-#xy8}=23;)E&J%Lo08S2}flWP7RJ^cWW zHoS%D3($AJ%8gB7o^x09CKSa6BHd?n3pv67VFI+dCJE(2rSO$dg?nk95vB^?(H+hI z`}glI0cd7mP$DX##`dO`_z@lPCwgK)8!?gqs1ut>AhAF}DwtStHaLWY5<9^QM$(mp zlL+D&tqRKBO<{ zN3wATvzz3Q0VJ2?k$haaHi#6ELNb^PAw$V9QbdMhV}ArGA*G~@j3lGTb!0Rd17nTX zlW}A`nLsAuo`7;PnM@%SxU;PammN?0cbC`y@&CUP_@5~O)of>$)5ZK0=BF~h7xUAZ zpTYc0=4UZKhxr4TpUeC_<`1O4%gKDk)5UnY7*AIk3ul~NjI)bzb}`N_#@WRRrLhhB_B zFUFx4oXE{t~IZS6cOlSPl8UJ*~Kb`SUXZ+I{ z|8&Mbo$=3rt|v}I&~tS3-$BUtaM)TXhV&i*C*fW7NcdymB;k5ENf?LoKLn>2A*4VY0z6bix?+h~4m??$0$d?h0#}Js;ZGA+!(S_|1UupEml$4YKQmIK1lCM-R|QX(u3g%>Rc`q2pvAzL67m2=85e~}S_ITAS2U&Zpt zb7l(0$u)Cl;#>xuH!5*((gw2~jbKv8X~t^q)y&asFyyhg1U!gpmg*_k^==dNq_1Iu zp~5iBFvrkhSZG*jc*w93Ziiuy;UL@*Tv>VA@TK7g!%s#WurP)g!;L+RPGeu=0ArD{ z%s9zdWvqvrj|-}o!L2o}y(YhZ#%GgplW~{vMdRDXKN-&$&lxX6RWm5S9*`K25|9@# zIAC1BuEDzWauq9w$z=43H0mlO_1Y9)9CY`B^Daw>)>TN1EjWSI$)tZ`2 z3rwrvHkh`U_L&Ztj+%~}E|@NwWwXv~H#^KJ=1lWobFq1{d7AkqbCY?wd6jvKdAs?L z`EBz_^BLskKO#T>oqU*oG++KtDwqGs`~*&hs|{=nToAY<@R7g`fx83u1s)DO8hAGF zLSUOkwpcA)EJ>C$%RtLe%LGe>Wsc<*%e|JBmW`IDEH7COT8>#hv3z6sAxIsh4+;;8 z2}%#@8&nij7E~2f6Er{Qj-UsE)&^}0+7(2=0iL0<;_6f6W=gS!N$1ZM^p!HtEh z3a$yB7d$`s?%-v?YlGJZZwuZPyg&F*@SlP|3O*BjF8Igb%T}$`XthIAH_@76&9>%Q zi>;%qldaRNjnSe+b6cuwr^}dga{$(kid|T zkeHAjA?YD~LkdEQLdJ$n3aJUH519`O=F37J2w5Mp2`3s}3^^3?cF0E|CqvGKd>3*V zH(nY;gF+pl-9l4BGeh%22ZxRd9Tz$+v^Mmn(5BEOq02)b3EdF7J#=^Ifza1OkA@x( zJsWx<^ipV>U1vAhyV#@bN%l0m+dj}eXzQpG=@HhDUfX`1jzK-G5rp5>I$rgwYH2iJh_{89Y^944@FB|shY}oy`4ZsIm zFt#F$(_J73uE&_41XW`dDi^Sn#u{eUt0VYvI ztWl|q6PSz(!oI-cLX@yUcvTpP6;G-#4eOPW!V6eGO_T!@Z5;!;&%x^NSAZs?7D0@lRcgaU-iRL>K?JB}z`< zuM(>x4#F|>Kna2)Eont2J5*_2nXEbn_a)pYnq*IdwCgzX)jwu?4Oo2Kop9jYzSR%oYdZ_&1BS85;9KBe8QeO-H4drEs&dr8{{ zl{uYX7r!XKG{4?{L;XtpD*UGV-2%7VZy!3f&N4NC-_(R&+)&-|6c!<{u}+D@_)(y zp#L%dPyD~}{{hWguMgM9=+pIm^+mW&xJqB6pRd0||A2n2ew%)m{*eA{{Ym{9{g3*~ z2BRU!(9Ph)r3nRwv4%;8dc!S-dkw1$TMWAl`{CY(I|=ul;X5d%i^d?hZg81!gW<-( z)xtHwEr;6xw;S$txZ`ja;M$CB0VcR8xHPzdaHHX-!`%XRFWfq~9dHNXj=_Bi_fx=6 z|L(L+dbn^nCmilKFqOeo!Oera8*VM!HaKjKoBjlM2JT1Gk7g~L9WD_r8?KnmdncP4 z;TFKHVsqau=6!I7;ZDI_G+zvq;jD0RaJ}J%!cBmi1=j+%5^f{h9=JE*K7sot@EZ%R zIk5!7#lWS*6~K*!tAU#jw+wDQ+&0TD%YMrtjFf`$I6gn(a~X!Zu#O2pSO8>E0Ax*o zosE$ru#)=_7p|WmpOTYU)BPT@5k?DG+EhZ(^;Hzk!%*44{^8UiBqMTllKrM2CJV`D z$R9>{m4JPBB1I~`FiIerD2nA2#it?S(-e!a>p=bXre6#h%zhor=oNf{gvjWR&l*a61iA zYE%3i?*f2XczZ{<+)hK3a8(5hFQdMyf`ym0??>LQ!CyQ@DMckeQ|Vks$&YxBg*P*Q zDNR>wrrbKUoM-_vP0_`|Kk?yHD%5-VsA6fjltz73EXz+C_2mFYznS`S0OPQkgdPxwF3+R)(7?CVy?)iSRBgyrF|ej;2_Oq~X5({aQU&?PfV) zW0%^^^8ZK0XZdVVer5S=p}wq?-B}tA>yQW$&oaNGWfG~L_BHe%?4C*c86RZ?$YtTX zX}G6nu^uO#{*Cms<$L&d;^Uj{-&nfJNHUMnzem%RuV>-!vix7qa{exRE;S3^z{1rm ze8aCk*Y}Km4fUn(8RZ(`I`H4i!r8ba?`7d^TvCl-l!K`cTa&b%FqtBM&B8;dFMrL# zL#VG(dZCNav$0oVBaF0+hKT9RXE_(Au~;`>BixrhxoryKX0~G|R`R94j)jk+;c7q1 zN7_hzwIAcWk@_O5aj^>FlK7YQ?J#z^1ff;556J6S+RA9Kj!|FuwQ$M7=;^5H<>dyi zW*X-gev9$`CVq2OJgoLS@s#p1wfzVlUc4K>o@Q}aI}_8|>1g>|LwdIt;~6E!XAkq= zqtgk9GZF5-293Ps2EM(xXhFBSmwS(pt zQg5O(m@jwa=f4v2znkZ)%g`spy9S`osgAhx0XK{hp=qd#3eY zdG`M{&DHYn>X6oE+@4NapQLlC_ED%=sqJC-f`C2dwtckidVD57+uo-kmk*O4ynY+& zU2T7$ZK93!!?w2=-p6>+@KxYOJQPeaTs}!DTC*74Q_SDRd?h}c8+f>EVBwS(Vfpg< zN{DY+g}kRlwo>iwlZ%`;ZdUd=2G_5i3A zasS%cGa7}w@)^@=g~9c+rd0{Wc)M98jG9(nQzeX>Q{FgRm^`b#vO$=Rcb^TyJp9@q z)X!>YY!L1MO|5{_uPj~aD|@bVwNCeEsZaM?>Hf5e{na2%8j8IJ{6cMg(wx%}3-d!^ z>n>eSCV|~$fE~FylCVPy%x4qb2g*Ot9 zbnNPi17SU*3VZiA33mwhqNdghPYJt){jgSgR5&SoDO?mTL!Ze6O{ExUA!S0tXehLY zCXwl+k<2Fx$#SxmY$V&si{v0VOg20NYlV%%cHu?nX&e?l z5>5*jgdf332MxS%XxF7cb8aBC;>JSbt(MFqEo2FKfUF~1$S(2{d7b=;d_vBW@5oQ0 zjIG)byroIRn-{k@SS%AKK(nG=yhU6fE<^9zAZ`=)hzHOMkBO(mbK(zTo1~QjC0yGo zIi=oG9($74Jvo(yH#mY02zxqNc#EUAIeLeq!yLWK(GiZ`iKBmT^b@YWE_D z22V*6+CNyC5)7;!MBid6VKPT5j?^4!IKo>!PYgefbR0o0dVbY&1eu92nkId#E3mh^ zF&(||Ke3k)6LLF-wm%p;_M$+JEF1-K6wHy8BO6B{9EEaZ=O~P$E*y2`D4e4RjvO3C zazw{RCC||u#c&kMQ8$jda}>u>ycbdJD|~1fBzVI}B1b(r!rNs}y2%_lIdXB7!ci(m zX&m+9D4nAWjxssQ;;1)AeK_jNQ9q8dIqJ`mo1+|#25^+iQ65M691Y}X5Jv?Z6>>C~ zqahp(haCEJxRKG>)V398KV8 zB1e-rD(7f2M^iYe;HZ+LDvqXdG>xNbj;3=ogQFUbW^z=^Q5{FKIJ&`$d}_bJ8%7#A zn$6K1j^=VSkE0tox{0HkIl6_TTRED~(QOyEt0N(ISrS z=4dfTOE|iRqkB18%F!~8?&D}VM=Lm5$t={t2u*L!c`hBlN&}D_!V|lRCJhQYgdOVNqxy z8{ywho`ioNPUwola-6uO>1=`j0ND!vLGl#*RXCq23afFNTofM030INLvS_}Z0bWX8 zh5sRD&Vij%Bij+af;K@<-rpY`N-;L0_vI`FAWhIgqK(T_n2!9pX3x74)2mfC32l#8C z3x?EDemc~~8^YVj^T*h4I4gXC73WtSGYqj79FtHZgR#D-#VlkwPJSN~E+H3vab~57 ztjDVJtf+<76dj*wj!q#*pOQbrKgsInC!mi#zx~X9yUc!5s9S+Qz$q?~eCVNp>?9v! zK~6QJ7>$S;Cm&F)Y0z}k^JyANKBuAN4E&GDU*Mncp*YJZzF-tzGK#ORpg6}U&NGS& zjN2;QP>#;S}C5T%M}z|8AUjwh+q^BMnTZlns8EXC03e`2`^!lXyxa#GI7$% zd&X)vdH~&>Vfu6Od?63tplj**M_Wh`dU_mMkFvjm(g31+JSY($y3d2M0HXg;V!~#m z+l0T(Z~{&pwxAW=4ku$z<_?742`38+;AE_l?*h$2I6+thCu2Y9ZqO`-6JZH$3H*ED z(AVGuj9c{fk!5f)o{f&a%i&~U1)Pj$U5WhM4~KCEP7)r3lQE*vF>N)RjM8`rd0hi1 zV@16d{=;yR@CclYmHeZ?>)>RR8u|)$kk%vJ$2}{C4G4JxPQY4xBWRw4lZ8!i^tm?! zZ-JAAt#AVNo}PmLG@LAKgA;Lnk&bNJ;Y8tCI8oREC*XwVPSEUvlZEHtMC@Aa27Vq+ z7WTkN!V7RB*8eX8?}d{wuJ42Y2RK=H362Oa!^zn1+7JJaa1!H{An>bj zBIE&Wuk->H0q6JvG4{haGyEVzTPd~gFQdg+;lrXjXkersKFp#c1b0q=1}0?T!}>LR zSZjwLPN1EO5i|nt^&P|k%19E4@F)@m3~RLTV@M2sg*7*X!{#wC3@af#j>N%_C-LwT zFw>U_wKOQ>v|vxrB#|Uw94H5dC0t+^Z0U%QX(>n%cLKntRue^>Cd8ekI8m4m8ki=6 z4+nLSDvc#bNO2seBo`GdNp=bBj3R zg0qVyz@-E?|KJQ`8SqGG7K_-i!MPUl7$ma*d4RS@9)}c`$OcGZ0q1O<0L?~7ScyDI zB`nzl2`iD!RKjAfXAAtTkgyVY3KCW(Pea1WWE+*RHckGRkKjAwe@1uPxTnH>?YCL043T7Asl|4EU zb%|Xx%vD6xj|ZXdJP7sYL8wCyO6MrUgEZLviiea!@GrP*oj_(k!3r2;Ze*8AhD=ir}7698SWEO%tA)^gp{z5 z(LNy)Sja@5kV!10+$Ur*3z^~*Qo%whSqMQnT+d3mC)2~H+V`1aHjHz-QFm(II$E%! zIt|~bOfk{2#Yd4fv;{$aVzx<7pAlgq9ASFu1X}7dfT>nGflhh@{5jA*CtUkH0k|i$ z%%L>_{c-{>c*n=;uA^PjJ=u}?P(3c5AJHV#z(LgkA3HwYe=4*LJ0xK`YL@ZC50n?x z&iCr53$Wm=Jc05X-6d8rDoSYsf)0TvUI_A(3Q5_7Fhw#_nJD>4KnZP!%05NXQMsmO z@=IirOY}&n4cN(2dt?xmK9Y~Dk!`mf^vGy2ODq-X&V({<(7k+Fj1hZdUwf=i zD8_v;R_r5=6lqKH(#9aPo7h(zC64n6#csdYUF;`bCyqy`jGSa52ctXsxHtj*d%Dml z%*V{--?%f+QlEzUV|$}wHAmAqn!!;GM>9F9<*1IMSsdNKQ9VZu95r$@o1-}#&E;qw zM>leG6Gu05bPGqfax|Z#+c;|CsF|Y{j&A3O&Lx#{xs#&>9NopyLXH-3MCX`FTsqHG z5S?o(i1s-J-OJHZj+SwBA4khMTEWpuj_7<;;r9SX4|24Mqtzaig7IJh#(~AG|KEpx zz6t$$8|IF*H$Nx5+G#c)iJs^?qt8e0dIEEVCownJj5)zp%mtoC|ALf)WPcvLYaitH zOXvf%7kK-V5WEQAgIK5#-0W-#zE$nl12%O2ZXgcM4yl@>%*J6Kz>s<9D5NB7_n<`(x?%iZ0cYDx)VRyw0_Bn zlEAgE&apk6+kM=v8}3-wVtUuvBD$R|WV2|JUR#=RVtL$WefQd*Zux1d$!XyEBqFj? z?lLAE`CvWWgb+~HwcNU>0XxPzJ%QP=lH#F~= zT;vLW@A4b^^S3U0dE2f*BQDe(uIMEmyLGB+?&+l;kNEKC2SfK|e>k`KQ0}J}KmF{@ z$8TT!R?Z*$MHLim3>76bD&Op(S|sG_xqaJbPhYft!5=E-z4Bzr?0WN-ZlZ0HbLi&< zX`wHa3?32E)K=Q_<_}y;Uaef6laqXL+mxHWY*-z<%pP&m;+!M*_CE4XW?J5n*_Y1U zaIiTv)7ES7wpX)L&PMK0?O*Zd*D}X_^!F8+70bRZJN)MR?;n}?t-R)>*z)PZ_-9`k z{=_>sRJi)~b+$-n@ENuamn4d!S-8C6iANIy_P-#lN)5ZYtgNeVmSwc0=0{u+&aO(k zvGV3oRzJI;(NR>{IJd5ThPPq)U)8V@ojsI>72OfDdS<1gw6T2Vtm@jSj?&8dIn`4t z9VK;jjjl9jib9=GG~6+?FlRvF(897Yj-1@w{Nl3wyhKObl=!R+hnJPocv(Bla=BdT zo!eo$w;eX`@aFI8hVOYYf6KL=Y@jnw$x^?$bLS?_LAPl@w@I2(H#51ua#meKbz@!q zjmag&IkY3y)z3HrlwRjT zCy(;22->t;NPvKFo!Ekxheua^Id%CTXPS3zx%A|_ulGnfbnfEYi5vf9*dxvS zV8PGBk4-cco_zj{&RSHd&yUu<*8b@7cypiTjO7E5>{>HAdQ!Eo0YkIwzkdGUoimzR9F zt}yG|7rTP*J+L(O?4o;CPFg)?y*SD|;8N^`FU+gjnwPFxxF(qOuE(42ayH-Lw4h|W z#>#r9POZfltWs$tt#ddHbjSrxT7&+R78H;Lm-1o5hd6sVQ@wN|v38%<*f^`9cXIMS zsb4mlcD2Y_r<#yuih~K920zZ!|9KQzB1_N z*)95Tq0iUnpS*wgq^cD8>XFZf#-(iyc_yX!==FW`e@IwT zHgM6~uW#D$#1kQJHxzYKH9A{#kK&_M`nhTL#d|Mp`uW^UbIF52_YbKYcSVkWkI@XMhhALZ}JXhx8m(UQ=CB-dJ5%>zI?`@^|{t_-czdvead9n&}s zPIs?(ddVk8#*ElJ^PqM_V?yob@uu3#z5OL`)lNEEUqI zIOHT=2f^4t38qyz zyAt}AZeJ1H$5B_W1F4tLD_WI_L82q2S5_(}vgMem$f>Dulu(KWNcaX!Tq-M)9J%== zWjTdKy6bXEN^*+I3iC@Hd4;99Lvsp;<>xtait>CWGD8c86=EKfq@&bDg++sUJIV_3 z9V1Kg9m59#7M3!0g#!z7bIS4^_*z<4QkYvdbc~~P(K72>gs2*L0N}bbl68SXsNVs73L)A9#3ydyH@M>omhHX zdrjTcx}>SqRagK<(4j<k#gf9bQZ_2XSFayW#Z9s4QH*}sGA7O$QKciMDW z*Zh<-l<%YXNiJVWE@Sf5A=mxc22jU$t23e_qU;KkO%?vhIUj!5%dy~3TSn=Ml9xJ* zeWL4K1Dx)4Ax&0c7<8;_v5#Ml{U8V4@6_R2<6|*RQMA52%aWPi$s}8MHrCIsY`k$+ zWwLLLVlpQ;H!a$JW^w-ClmA?te%%LS`|kbxuGKHQCx3nUf!K>*Ecl_u)J^ZcHKbJi zQ|js$MtnLk&JiDH9)S5r<(k zD(ol3BTJ<m!`hqWbdaMLf(u!>-2lNYI>w?)HCBB zS@*=0s*|}n`bnQGRJ&%J)6RYRbcH-`_rY#E9v(C#WA2lGtGD)ieC{g&3ld&^YyYfi zuY8cZA?gqP58nL4Pv1s;JEX_E6a6<0jLNyoI{3Yn2hT1~&3M-R_FL0Obh#9`_r0^G z4Kc47Cw;X3k0F+Vt;b^TBDZ~0a$(Y%?>_7K;#0G~?R{JHqSI^c%zk6$*Vi39l{)0- M>0>e$VaddFont(GetPlatform().ReadPathForFile("dejavusans.ttf").c_str()); - resourceManager->addFont(GetPlatform().ReadPathForFile("wqy-microhei.ttf").c_str()); + + resourceManager->addFonts(GetPlatform().GetFontNames()); DrawerYG::params_t p; p.m_resourceManager = resourceManager; diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index 949c5939c1..5d387df6c2 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -27,6 +27,7 @@ EE12021011CD464100ABDD5D /* libmap.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EE12020611CD464100ABDD5D /* libmap.a */; }; EE12021211CD464100ABDD5D /* libyg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EE12020811CD464100ABDD5D /* libyg.a */; }; EE12092C12BD67C900068DC3 /* wqy-microhei.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EE12092B12BD67C900068DC3 /* wqy-microhei.ttf */; }; + EE583CBB12F773F00042CBE3 /* unicode_blocks.txt in Resources */ = {isa = PBXBuildFile; fileRef = EE583CBA12F773F00042CBE3 /* unicode_blocks.txt */; }; EE7F29811219ECA300EB67A9 /* RenderBuffer.mm in Sources */ = {isa = PBXBuildFile; fileRef = EE7F297D1219ECA300EB67A9 /* RenderBuffer.mm */; }; EE7F29821219ECA300EB67A9 /* RenderContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = EE7F297E1219ECA300EB67A9 /* RenderContext.mm */; }; EE7F29831219ECA300EB67A9 /* WindowHandle.mm in Sources */ = {isa = PBXBuildFile; fileRef = EE7F29801219ECA300EB67A9 /* WindowHandle.mm */; }; @@ -39,6 +40,7 @@ EEF5745512DE1AD50082F472 /* libfribidi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EEF5745412DE1AD50082F472 /* libfribidi.a */; }; EEFC0A9612B561B7002914FF /* dejavusans.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EEFC0A9512B561B7002914FF /* dejavusans.ttf */; }; EEFC0BBF12B5656A002914FF /* libfreetype.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EE12020311CD464100ABDD5D /* libfreetype.a */; }; + EEFE7BBA12F78091006AF8C3 /* mangal.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EEFE7BB912F78091006AF8C3 /* mangal.ttf */; }; FA04373212CAB83F00017494 /* libstorage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FA04373112CAB83F00017494 /* libstorage.a */; }; FA065FED128614C400FEA989 /* MainWindow-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA065FEC128614C400FEA989 /* MainWindow-iPad.xib */; }; FA065FFF1286167A00FEA989 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FA065FFD1286167A00FEA989 /* Default@2x.png */; }; @@ -93,6 +95,7 @@ EE12020811CD464100ABDD5D /* libyg.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libyg.a; sourceTree = SOURCE_ROOT; }; EE12092B12BD67C900068DC3 /* wqy-microhei.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "wqy-microhei.ttf"; path = "../../data/wqy-microhei.ttf"; sourceTree = ""; }; EE16192B126E374500622BD0 /* RenderContext.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = RenderContext.hpp; path = Classes/RenderContext.hpp; sourceTree = SOURCE_ROOT; }; + EE583CBA12F773F00042CBE3 /* unicode_blocks.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = unicode_blocks.txt; path = ../../data/unicode_blocks.txt; sourceTree = ""; }; EE7F297C1219ECA300EB67A9 /* RenderBuffer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = RenderBuffer.hpp; path = Classes/RenderBuffer.hpp; sourceTree = SOURCE_ROOT; }; EE7F297D1219ECA300EB67A9 /* RenderBuffer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RenderBuffer.mm; path = Classes/RenderBuffer.mm; sourceTree = SOURCE_ROOT; }; EE7F297E1219ECA300EB67A9 /* RenderContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RenderContext.mm; path = Classes/RenderContext.mm; sourceTree = SOURCE_ROOT; }; @@ -107,6 +110,7 @@ EEE4C9411298A31B007231A9 /* basic_highres.skn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = basic_highres.skn; path = ../../data/basic_highres.skn; sourceTree = SOURCE_ROOT; }; EEF5745412DE1AD50082F472 /* libfribidi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libfribidi.a; sourceTree = SOURCE_ROOT; }; EEFC0A9512B561B7002914FF /* dejavusans.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = dejavusans.ttf; path = ../../data/dejavusans.ttf; sourceTree = ""; }; + EEFE7BB912F78091006AF8C3 /* mangal.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = mangal.ttf; path = ../../data/mangal.ttf; sourceTree = ""; }; FA04373112CAB83F00017494 /* libstorage.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libstorage.a; sourceTree = SOURCE_ROOT; }; FA065FEC128614C400FEA989 /* MainWindow-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "MainWindow-iPad.xib"; path = "Resources-iPad/MainWindow-iPad.xib"; sourceTree = SOURCE_ROOT; }; FA065FFD1286167A00FEA989 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = SOURCE_ROOT; }; @@ -252,6 +256,8 @@ FA065FC61286143F00FEA989 /* External Resources */ = { isa = PBXGroup; children = ( + EEFE7BB912F78091006AF8C3 /* mangal.ttf */, + EE583CBA12F773F00042CBE3 /* unicode_blocks.txt */, FA57ADF312F338FB002BFB9D /* countries_poly.txt */, FA46DA2B12D4166E00968C36 /* countries.txt */, FA46DA0412D414D200968C36 /* maps.update */, @@ -395,6 +401,8 @@ FA46DA0512D414D200968C36 /* maps.update in Resources */, FA46DA2C12D4166E00968C36 /* countries.txt in Resources */, FA57ADF412F338FB002BFB9D /* countries_poly.txt in Resources */, + EE583CBB12F773F00042CBE3 /* unicode_blocks.txt in Resources */, + EEFE7BBA12F78091006AF8C3 /* mangal.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/iphone/Maps/Platform/IPhonePlatform.hpp b/iphone/Maps/Platform/IPhonePlatform.hpp index 0e94b121b3..066de0f389 100644 --- a/iphone/Maps/Platform/IPhonePlatform.hpp +++ b/iphone/Maps/Platform/IPhonePlatform.hpp @@ -19,6 +19,7 @@ public: virtual string const SkinName() const; virtual bool IsMultiSampled() const; virtual bool DoPeriodicalUpdate() const; + virtual vector GetFontNames() const; private: string m_skinName; diff --git a/iphone/Maps/Platform/IPhonePlatform.mm b/iphone/Maps/Platform/IPhonePlatform.mm index 06db42e6c4..8a6c9fb694 100644 --- a/iphone/Maps/Platform/IPhonePlatform.mm +++ b/iphone/Maps/Platform/IPhonePlatform.mm @@ -31,7 +31,7 @@ IPhonePlatform::IPhonePlatform() m_visualScale = 1.0; m_skinName = "basic.skn"; m_isMultiSampled = true; - m_doPeriodicalUpdate = false; + m_doPeriodicalUpdate = true; /// Calculating resolution UIDevice * device = [UIDevice currentDevice]; @@ -168,6 +168,23 @@ bool IPhonePlatform::DoPeriodicalUpdate() const return m_doPeriodicalUpdate; } +vector IPhonePlatform::GetFontNames() const +{ + vector res; +/* string fontFolder("/System/Library/Fonts/"); + + GetFilesInDir(fontFolder, ".ttf", res); + for (int i = 0; i < res.size(); ++i) + res[i] = fontFolder + res[i]; +*/ + + res.push_back(ReadPathForFile("wqy-microhei.ttf")); + res.push_back(ReadPathForFile("dejavusans.ttf")); + res.push_back(ReadPathForFile("mangal.ttf")); + + return res; +} + Platform & GetPlatform() { static IPhonePlatform platform; diff --git a/platform/platform.hpp b/platform/platform.hpp index 1c2fe3b4fc..eb27f61284 100644 --- a/platform/platform.hpp +++ b/platform/platform.hpp @@ -66,6 +66,8 @@ public: virtual bool IsMultiSampled() const = 0; virtual bool DoPeriodicalUpdate() const = 0; + + virtual vector GetFontNames() const = 0; }; extern "C" Platform & GetPlatform(); diff --git a/platform/qtplatform.cpp b/platform/qtplatform.cpp index 7e81e9b41b..1125c6489a 100644 --- a/platform/qtplatform.cpp +++ b/platform/qtplatform.cpp @@ -357,6 +357,28 @@ public: { return false; } + + vector GetFontNames() const + { + vector res; + +/*#if defined(OMIM_OS_WINDOWS) + string fontFolder = "C:\\Windows\\Fonts\\" +#elif defined(OMIM_OS_MAC) + string fontFolder = "/System/Library/Fonts/"; +#endif + + GetFilesInDir(fontFolder, "*.ttf", res); + + for (int i = 0; i < res.size(); ++i) + res[i] = fontFolder + res[i]; +*/ + res.push_back(ReadPathForFile("wqy-microhei.ttf")); + res.push_back(ReadPathForFile("dejavusans.ttf")); + res.push_back(ReadPathForFile("mangal.ttf")); + + return res; + } }; extern "C" Platform & GetPlatform() diff --git a/qt/widgets.cpp b/qt/widgets.cpp index 4794bfe086..93d651796b 100644 --- a/qt/widgets.cpp +++ b/qt/widgets.cpp @@ -45,10 +45,9 @@ namespace qt 50, 512, 256, 15, - 2000000)); + GetPlatform().ReadPathForFile("unicode_blocks.txt").c_str(), 2000000)); -// m_resourceManager->addFont(GetPlatform().ReadPathForFile("dejavusans.ttf").c_str()); - m_resourceManager->addFont(GetPlatform().ReadPathForFile("wqy-microhei.ttf").c_str()); + m_resourceManager->addFonts(GetPlatform().GetFontNames()); DrawerYG::params_t p; diff --git a/qt_tstfrm/tstwidgets.cpp b/qt_tstfrm/tstwidgets.cpp index a4d0a1ee83..ad56b5484e 100644 --- a/qt_tstfrm/tstwidgets.cpp +++ b/qt_tstfrm/tstwidgets.cpp @@ -50,10 +50,9 @@ void GLDrawWidget::initializeGL() 10 * sizeof(unsigned short), 30, 512, 256, 15, - 2000000)); + GetPlatform().ReadPathForFile("unicode_blocks.txt").c_str(), 2000000)); -// m_resourceManager->addFont(GetPlatform().ReadPathForFile("dejavusans.ttf").c_str()); - m_resourceManager->addFont(GetPlatform().ReadPathForFile("wqy-microhei.ttf").c_str()); + m_resourceManager->addFonts(GetPlatform().GetFontNames()); m_frameBuffer = make_shared_ptr(new yg::gl::FrameBuffer()); diff --git a/yg/glyph_cache.cpp b/yg/glyph_cache.cpp index e37a1252f5..86e59c82d1 100644 --- a/yg/glyph_cache.cpp +++ b/yg/glyph_cache.cpp @@ -35,20 +35,25 @@ namespace yg return l.m_isMask < r.m_isMask; } - GlyphCache::GlyphCache(size_t maxSize) : m_impl(new GlyphCacheImpl(maxSize)) + GlyphCache::GlyphCache(string const & blocksFileName, size_t maxSize) : m_impl(new GlyphCacheImpl(blocksFileName, maxSize)) { } - void GlyphCache::addFont(char const * fileName) + void GlyphCache::addFont(const char *fileName) { - m_impl->m_fonts.push_back(make_shared_ptr(new Font(fileName))); + m_impl->addFont(fileName); + } + + void GlyphCache::addFonts(vector const & fontNames) + { + m_impl->addFonts(fontNames); } int GlyphCache::getCharIDX(GlyphKey const & key) { - Font * font = m_impl->m_fonts.back().get(); + vector > & fonts = m_impl->getFonts(key.m_id); - FTC_FaceID faceID = reinterpret_cast(font); + FTC_FaceID faceID = reinterpret_cast(fonts.front().get()); int charIDX = FTC_CMapCache_Lookup( m_impl->m_charMapCache, @@ -79,9 +84,9 @@ namespace yg GlyphMetrics const GlyphCache::getGlyphMetrics(GlyphKey const & key) { - Font * font = m_impl->m_fonts.back().get(); + vector > & fonts = m_impl->getFonts(key.m_id); - FTC_FaceID faceID = reinterpret_cast(font); + FTC_FaceID faceID = reinterpret_cast(fonts.front().get()); FTC_ScalerRec fontScaler = { @@ -121,8 +126,8 @@ namespace yg shared_ptr const GlyphCache::getGlyph(GlyphKey const & key) { - Font * font = m_impl->m_fonts.back().get(); - FTC_FaceID faceID = reinterpret_cast(font); + vector > & fonts = m_impl->getFonts(key.m_id); + FTC_FaceID faceID = reinterpret_cast(fonts.front().get()); FTC_ScalerRec fontScaler = { faceID, diff --git a/yg/glyph_cache.hpp b/yg/glyph_cache.hpp index 120d38f2db..582016340f 100644 --- a/yg/glyph_cache.hpp +++ b/yg/glyph_cache.hpp @@ -1,6 +1,8 @@ #pragma once #include "../std/shared_ptr.hpp" +#include "../std/vector.hpp" +#include "../std/string.hpp" #include "color.hpp" namespace yg @@ -45,10 +47,11 @@ namespace yg public: - GlyphCache(size_t maxSize); + GlyphCache(string const & blocksFileName, size_t maxSize); void reset(); void addFont(char const * fileName); + void addFonts(vector const & fontNames); int getCharIDX(GlyphKey const & key); diff --git a/yg/glyph_cache_impl.cpp b/yg/glyph_cache_impl.cpp index f3fdb9e5c6..663626ca56 100644 --- a/yg/glyph_cache_impl.cpp +++ b/yg/glyph_cache_impl.cpp @@ -7,9 +7,21 @@ #include <../cache/ftccback.h> #include <../cache/ftccache.h> +#include "../std/fstream.hpp" +#include "../base/ptr_utils.hpp" + namespace yg { + UnicodeBlock::UnicodeBlock(string const & name, uint32_t start, uint32_t end) + : m_start(start), m_end(end), m_name(name) + {} + + bool UnicodeBlock::hasSymbol(uint16_t sym) const + { + return (m_start <= sym) && (m_end >= sym); + } + Font::Font(char const * name) : m_name(name), m_fontData(name, true) { } @@ -19,8 +31,152 @@ namespace yg return FT_New_Memory_Face(library, (unsigned char*)m_fontData.data(), m_fontData.size(), 0, face); } - GlyphCacheImpl::GlyphCacheImpl(size_t maxSize) + void GlyphCacheImpl::initBlocks(string const & fileName) { + ifstream fin(fileName.c_str()); + while (true) + { + string name; + uint16_t start; + uint16_t end; + fin >> name >> std::hex >> start >> std::hex >> end; + if (!fin) + break; + + m_unicodeBlocks.push_back(UnicodeBlock(name, start, end)); + } + + m_lastUsedBlock = m_unicodeBlocks.end(); + } + + bool sym_in_block(UnicodeBlock & b, uint16_t sym) + { + return (b.m_start <= sym); + } + + bool greater_coverage(pair > const & l, pair > const & r) + { + return l.first > r.first; + } + + void GlyphCacheImpl::addFonts(vector const & fontNames) + { + for (int i = 0; i < fontNames.size(); ++i) + addFont(fontNames[i].c_str()); + + for (unicode_blocks_t::const_iterator it = m_unicodeBlocks.begin(); it != m_unicodeBlocks.end(); ++it) + { + if (it->m_fonts.empty()) + LOG(LINFO, (it->m_name, " unicode block is empty")); + } + } + + void GlyphCacheImpl::addFont(char const * fileName) + { + m_fonts.push_back(make_shared_ptr(new Font(fileName))); + + /// obtaining all glyphs, supported by this font + FT_Face face; + m_fonts.back()->CreateFaceID(m_lib, &face); + + vector charcodes; + + FT_UInt gindex; + charcodes.push_back(FT_Get_First_Char(face, &gindex)); + while (gindex) + charcodes.push_back(FT_Get_Next_Char(face, charcodes.back(), &gindex)); + + sort(charcodes.begin(), charcodes.end()); + unique(charcodes.begin(), charcodes.end()); + + FT_Done_Face(face); + + /// modifying the m_unicodeBlocks + + int lastUBEnd = 0; + + unicode_blocks_t::iterator ubIt = m_unicodeBlocks.begin(); + vector::iterator ccIt = charcodes.begin(); + + while (true) + { + while (ubIt != m_unicodeBlocks.end()) + { + if ((*ccIt > lastUBEnd) && (*ccIt < ubIt->m_start)) + LOG(LINFO, ("Symbol with code ", (uint16_t)*ccIt, "lies between two unicode blocks!")); + if (ubIt->hasSymbol(*ccIt)) + break; + lastUBEnd = ubIt->m_end; + ++ubIt; + } + + if (ubIt == m_unicodeBlocks.end()) + break; + + /// here we have unicode block, which contains the specified symbol. + if (ubIt->m_fonts.empty() || (ubIt->m_fonts.back() != m_fonts.back())) + { + ubIt->m_fonts.push_back(m_fonts.back()); + ubIt->m_coverage.push_back(0); + } + + ++ubIt->m_coverage.back(); + ++ccIt; + } + + /// rearrange fonts in all unicode blocks according to it's coverage + for (ubIt = m_unicodeBlocks.begin(); ubIt != m_unicodeBlocks.end(); ++ubIt) + { + vector > > sortData; + + for (unsigned i = 0; i < ubIt->m_fonts.size(); ++i) + sortData.push_back(make_pair >(ubIt->m_coverage[i], ubIt->m_fonts[i])); + + sort(sortData.begin(), sortData.end(), &greater_coverage); + + for (unsigned i = 0; i < ubIt->m_fonts.size(); ++i) + { + ubIt->m_coverage[i] = sortData[i].first; + ubIt->m_fonts[i] = sortData[i].second; + } + } + + } + + vector > & GlyphCacheImpl::getFonts(uint16_t sym) + { + if ((m_lastUsedBlock != m_unicodeBlocks.end()) && (m_lastUsedBlock->hasSymbol(sym))) + return m_lastUsedBlock->m_fonts; + + unicode_blocks_t::iterator it = lower_bound(m_unicodeBlocks.begin(), + m_unicodeBlocks.end(), + sym, + &sym_in_block); + + if (it == m_unicodeBlocks.end()) + it = (--m_unicodeBlocks.rbegin()).base(); + else + if (it != m_unicodeBlocks.begin()) + it = --it; + + m_lastUsedBlock = it; + + if ((it != m_unicodeBlocks.end()) && (it->hasSymbol(sym))) + { + if (it->m_fonts.empty()) + it->m_fonts.push_back(m_fonts.front()); + + return it->m_fonts; + } + else + return m_fonts; + } + + + GlyphCacheImpl::GlyphCacheImpl(std::string const & blocksFileName, size_t maxSize) + { + initBlocks(blocksFileName); + FTCHECK(FT_Init_FreeType(&m_lib)); /// Initializing caches @@ -36,7 +192,6 @@ namespace yg FTCHECK(FTC_StrokedImageCache_New(m_manager, &m_strokedGlyphCache, m_stroker)); FTCHECK(FTC_CMapCache_New(m_manager, &m_charMapCache)); - } GlyphCacheImpl::~GlyphCacheImpl() diff --git a/yg/glyph_cache_impl.hpp b/yg/glyph_cache_impl.hpp index e9a63b2bc8..b5e5d19e44 100644 --- a/yg/glyph_cache_impl.hpp +++ b/yg/glyph_cache_impl.hpp @@ -22,6 +22,21 @@ namespace yg FT_Error CreateFaceID(FT_Library library, FT_Face * face); }; + /// Information about single unicode block. + struct UnicodeBlock + { + string m_name; + uint32_t m_start; + uint32_t m_end; + /// sorted indices in m_fonts, from the best to the worst + vector > m_fonts; + /// coverage of each font, in symbols + vector m_coverage; + + UnicodeBlock(string const & name, uint32_t start, uint32_t end); + bool hasSymbol(uint16_t sym) const; + }; + struct GlyphCacheImpl { FT_Library m_lib; @@ -35,12 +50,22 @@ namespace yg FTC_CMapCache m_charMapCache; + typedef vector unicode_blocks_t; + unicode_blocks_t m_unicodeBlocks; + unicode_blocks_t::iterator m_lastUsedBlock; + typedef vector > TFonts; TFonts m_fonts; static FT_Error RequestFace(FTC_FaceID faceID, FT_Library library, FT_Pointer requestData, FT_Face * face); - GlyphCacheImpl(size_t maxSize); + void initBlocks(string const & fileName); + + vector > & getFonts(uint16_t sym); + void addFont(char const * fileName); + void addFonts(vector const & fontNames); + + GlyphCacheImpl(string const & blocksFileName, size_t maxSize); ~GlyphCacheImpl(); }; } diff --git a/yg/resource_manager.cpp b/yg/resource_manager.cpp index 27e94c9396..bee45e3084 100644 --- a/yg/resource_manager.cpp +++ b/yg/resource_manager.cpp @@ -20,7 +20,7 @@ namespace yg size_t smallVBSize, size_t smallIBSize, size_t smallStoragesCount, size_t blitVBSize, size_t blitIBSize, size_t blitStoragesCount, size_t texWidth, size_t texHeight, size_t texCount, - size_t maxGlyphCacheSize) : m_glyphCache(maxGlyphCacheSize) + char const * blocksFileName, size_t maxGlyphCacheSize) : m_glyphCache(blocksFileName, maxGlyphCacheSize) { for (size_t i = 0; i < storagesCount; ++i) m_storages.push_back(gl::Storage(vbSize, ibSize)); @@ -170,8 +170,8 @@ namespace yg return m_glyphCache.getGlyphMetrics(key); } - void ResourceManager::addFont(char const * fileName) + void ResourceManager::addFonts(vector const & fontNames) { - m_glyphCache.addFont(fileName); + m_glyphCache.addFonts(fontNames); } } diff --git a/yg/resource_manager.hpp b/yg/resource_manager.hpp index 098c6cb7c7..9fbef9b69e 100644 --- a/yg/resource_manager.hpp +++ b/yg/resource_manager.hpp @@ -49,7 +49,7 @@ namespace yg size_t smallVBSize, size_t smallIBSize, size_t smallStoragesCount, size_t blitVBSize, size_t blitIBSize, size_t blitStoragesCount, size_t texWidth, size_t texHeight, size_t texCount, - size_t maxGlyphCacheSize); + char const * blocksFileName, size_t maxGlyphCacheSize); shared_ptr const & getTexture(string const & fileName); @@ -67,7 +67,8 @@ namespace yg shared_ptr const getGlyph(GlyphKey const & key); GlyphMetrics const getGlyphMetrics(GlyphKey const & key); - void addFont(char const * fileName); + + void addFonts(vector const & fontNames); }; Skin * loadSkin(shared_ptr const & resourceManager, diff --git a/yg/yg_tests/glyph_cache_test.cpp b/yg/yg_tests/glyph_cache_test.cpp index 5872a87ae9..9e091518a4 100644 --- a/yg/yg_tests/glyph_cache_test.cpp +++ b/yg/yg_tests/glyph_cache_test.cpp @@ -5,7 +5,7 @@ UNIT_TEST(GlyphCacheTest_Main) { - yg::GlyphCache cache(200000); + yg::GlyphCache cache("", 200000); cache.addFont(GetPlatform().ReadPathForFile("dejavusans.ttf").c_str()); shared_ptr g1 = cache.getGlyph(yg::GlyphKey('#', 40, true)); // g1->dump(GetPlatform().WritablePathForFile("#_mask.png").c_str()); diff --git a/yg/yg_tests/screengl_test.cpp b/yg/yg_tests/screengl_test.cpp index 774ae9c101..573984dc33 100644 --- a/yg/yg_tests/screengl_test.cpp +++ b/yg/yg_tests/screengl_test.cpp @@ -592,6 +592,15 @@ namespace } }; + struct TestDrawUnicodeSymbols + { + void DoDraw(shared_ptr p) + { + p->drawText(m2::PointD(40, 50), 0, 12, "Latin Symbol : A", 0); + p->drawText(m2::PointD(40, 80), 0, 12, "Cyrillic Symbol : Ы", 0); + } + }; + struct TestDrawTextRectWithFixedFont : TestDrawStringWithFixedFont { typedef TestDrawStringWithFixedFont base_t; @@ -901,6 +910,7 @@ namespace // UNIT_TEST_GL(TestDrawSingleSymbolAndSolidPath); // UNIT_TEST_GL(TestDrawString); // UNIT_TEST_GL(TestDrawStringWithFixedFont); + UNIT_TEST_GL(TestDrawUnicodeSymbols); UNIT_TEST_GL(TestDrawTextRectWithFixedFont); // UNIT_TEST_GL(TestDrawStringOnString); // UNIT_TEST_GL(TestDrawTextOnPath); diff --git a/yg/yg_tests/skin_loader_test.cpp b/yg/yg_tests/skin_loader_test.cpp index 166750750f..a5aace72df 100644 --- a/yg/yg_tests/skin_loader_test.cpp +++ b/yg/yg_tests/skin_loader_test.cpp @@ -8,6 +8,6 @@ UNIT_TEST(SkinLoaderTest_Main) { GL_TEST_START; - shared_ptr rm(new yg::ResourceManager(1000, 1000, 2, 1000, 1000, 2, 1000, 1000, 2, 128, 128, 15, 2000000)); + shared_ptr rm(new yg::ResourceManager(1000, 1000, 2, 1000, 1000, 2, 1000, 1000, 2, 128, 128, 15, "", 2000000)); /*yg::Skin * skin = */loadSkin(rm, "basic.skn", 2, 2); }; diff --git a/yg/yg_tests/skin_test.cpp b/yg/yg_tests/skin_test.cpp index f00b642c26..3c80dded6c 100644 --- a/yg/yg_tests/skin_test.cpp +++ b/yg/yg_tests/skin_test.cpp @@ -9,7 +9,7 @@ UNIT_TEST(SkinTest_Main) { GL_TEST_START; - shared_ptr rm(new yg::ResourceManager(100, 100, 1, 100, 100, 1, 100, 100, 1, 128, 128, 15, 2000000)); + shared_ptr rm(new yg::ResourceManager(100, 100, 1, 100, 100, 1, 100, 100, 1, 128, 128, 15, "", 2000000)); yg::Skin * skin = loadSkin(rm, "test.skn", 2, 2); double p0 [] = {1, 1};