ElJOAhIM0q^eUOoj8vcXXS`{Kilt<3MDHVkVZUtTB)2i zxg4=iIV7vI&%L)i($`xal||)~tm5m+d&DV~M{xU!+$he|1}Lg-ku<33ia_vkXW%*2`?PoGjvOyU5KpRLguX z$b3hDO7NTnl8qXHq~HfYYJyfExy-jfYSK<1x$dt(>NGxIS_MqD!f>G1&fUFgSwW^x zGLY0tm)VqvoAliK>o7=-lG&b@lLsI mI@;8R>q^yH;T~0)4#cEq&9mN1Y|_Q@!cu`lM67`OQ{>p8Sn{()To5R|>Do z44t%N#m9i3rKSqofd>%Cz|BDKJ*`z}kxd`S;!2b2R0c`zQ6%T1bZhpmzo- |=03EIpf!PJ>O*@JGy`aXeQ1Y3Q-h}MLu&>t0<`cx zv`)}8pw&lfdNqtsQV4a>y0s6Z1GJV)I9&MuXHEZaoHb<*%)6^#bKbg*O9Wwx^5%5~ z^9na_UbnH}Rjr?*dFbJ=dadG#5JiZy4TnP)5NgmTJAjuFUZMV}NEB2EhcFz60K*Xe zintbNLZCOilYto&e-B*=Sb!k@j!6<&jzB*q7pg>Fgm8oi1OtKz!HSTiOmqq )&gm2I3Z&_kj9Wk8JmGLRh*Nt6*vrQ za{P4^ieP>Q(wx#E<7FUU^vNhdDGSnlWb^}O 5i25Xz+#{<5JHesLx>?WnGh242$8dr5T6>tFhQu3?=KKqv8Ed&rE57V zglvvVp_HSKP{UCrG;&l6&I>$Z71S!8QK^+sl>x*fV^1k+gU5rODj=SCd1`^3z!o5m z<2@ZfJm~WH41n(d!+`WDLVg9X9Ef@dRX}p9BS4zj>w%crox(Xps2w|iWFnuzQagnK z$@~T&wWA$K&Ex GGpc$whhWF5b5x{6*GB5_1 z2PETf1114$fHwi_fj0v?fyuy-;fcb0Ur$xCqz+Ob2!V zGl1PdI#USsPZaJ4#sjwivw>TI#lQ!E)j+CXJ+K(q3VaZF8Tb&;PmTUxf=IYJQ78o_ z0n30nz=wfFz&`?a0Ly`gfYrbz;67jn@M)kr0Pko4wZH?wEZ{T1Ex>1iRlw(f^}rgS z2z(x>8sSV7UPMGYB2hR9%mBUwEC5~uRslW0CLp VZNq#&}>D5Jw?GGB67007e7LfwV3;0{l_|_h> &bUz(C*@U=XkpI0|?K7y@hr(z3n-7zXqk z3ljswfs=qqz{$Y1Kn<`MIK_#`ZbYU6Yk|{%&A@PA2XH!29g1-Ps0HePDZofzK2Q&= z1R8(`fe!+kfe!&M151GFap+w@EwBuj1AG{`1?VhCWCtRZz$3uzz;nQTz)s+Ppx=0O zJ775QX<#z&uRsT|4!8qI-(fidq(S~1PyxIER01yp2LM$Q(1gHHpf50D0{Z_zL{dN) z1S|lmfK|Z3z&arP*^>*vp+LVdv>{Ln90tq+((eFn0r~?E0M)=IU;wZSI06_t5xoGY z1%?2VfV3xHJJFdaj6tLrgmJ)X;CNsoa00L!7zWf%LR$j!ffis5FbjANxDwa}%mIc> zhDm{1U@ }B&<7SH#7FBKz$3*e5?XU448t!kQo4GZgsKA)`katZ*(#x; zn`502=tKO)LIg*vVC5JlWN}mr`5aY3IY%F%nxj$}dxA%>&5;SBe6RB5+vCp3iV!Ro zt%_aSCM)*D{AeYugxQwFOgw#D$)7%2?_v|TGSim{3xcipE^ zOdH*Yv*6zRbt`Y*xPB9tu af=pNSOoar)Kzo%%2J*Yx8JvkZxb1%@SthYhC _ZQGbiN5T%T6j{ep(A!cdJ<(RP8jM$H3hsE6*w>j>axJxKN z7oQxzGCnW9D1M9i74zTC|1ytHxGBM&usES9VTc8#<-l116SSGyby~Ofr1o2Fr}k%U zp6&(R8 fh9VsQ;(_C;iCiWv07L51CGx8cgR+qNyt8x0u z21IAConTv33AFt39gyhxSYDKVgeN zol%#gyInV2f6@>gbtGD8$}>H0dd=j#W;z^mHl{NsFg7Cg&e)RJPvfFs><8k@;&;ct z6hF>vH~-PRFX8QkD2vUq-m=FcR7%3jP=^lfPujP2H%Fe2{Ac8IhF1&?hO5zoOhaNe z$GjMGKIWU4+hY&Kz80&Av&3b_IpW@p`zWq8u05_34VnPiI`eJjHBNJ}xzW5E?f6+j zu!UA5u#%9aJ*(ZN^VjQ*M~$sf0nx$HIncM%^pfeU=@S$XAG0uKZOq#-zr>7+4Uhe6 zY)kBlxS!%Q@o&U`86Rq1V!p>*Vg9rEMfl1&^9A#>XowbAX}D#iWuYa*vemNP@}lJf z%QqI`5GJg(C{WNY*FLRtMm`&PH1e~^OOZkPNWI(ewIS8`XX8oZd&aMf%cGu;YKZzE z>bt1S=ylQOqZKB5%)>DOu-M@EyW&Tgr k?i~SZjI0@{HvtYK}V0 zvVi??%HOmKoxg5^E?Rew?ls-O$RKAVgMa$!ztt}={4x5?=zl~%VHy&9OYExHg4l}K zn%HBpr(%QS*2g^-cO`COd{lf~yfuDR{CX7mQv5lykf2Xkn&3!qCX^+(61FGoN_aA1 zKWh7K!nuS`5;_vDB&@L9VPR0@0x8mrdMYq{Yi~y%3DAwwMd+MHomF?U?lzr6w^3K1 zyH8iFdsyez?a=*M_q6VL-67qpx;JzUy7zUT>MrQobwB8?>IOuPjGP>)kBpDZh`cRw zW8}`r1L)<)Bby_K=tt_O>1XMe=(p-0)^F24rN6`AGVC-QHT-P&&5&hWWn6E(*XTAr zZhXdg%J{i)NK~LRYFt!()Vopth*C$7iJlxC5uF%4Kl r*eM|eH_A_* pW-Rqt;YZJ2DBVTd%u8#Wp4HIx`0F+6UlGQ4m27~b`r;Rjy> z+NE>XqB)94ryWISB_vsrEh!c|{4~pwZOO5$wKyz!mV8TrrO2|yQfw);lv}o0DlI!K zyDe3gYHHUooLZq>3k*euVnd6e)8J=R8^eqmV}voum|@H^W*c*iYmIprz{`!>j5~}6 zjfael#wKI4vBlV7>^AyEsiVT2QJN@2R8mw%R8~}WR6$fxRAp3k)PbmjQHP?AMAb%} zKtr`gbwqVX3DN54!03=@ZL}deCE6aH5uF{K6I~Ep8eJZ}E&4!oO>`X^t~I(NIwal% zhfR*ph%bmQj<1eC7~d4%65kasm{n%AIm8@hjxeWS_Q=67;4C*+nybtw%=P9bbBnp# z?33V^5SS2}ph<{GFeJn$BqgN4K1B(|3FQfu3A+=j6KWEUz|&h3!~{P}pe59zu|!x5 zmUv4N?3WMQ)L7~)jg~fxXz8|)>$kvIe%cUinAW7VYVFz_twXy-yG^@WTdS=zXqzyi zUDkGMRl0DUR%b%bNYUl#igdem)w+YaCbV)ZdO@d79T^JmPl`;5%-WR}sTiHthKW<9 zSL;Ld@%kjaU7xQn(ifux9K>wXg4yP>KF| !_%x12f>jFvFmZF9kIyDkUl!+C-$JP*mDrK!M{V zwKc7aU3{sitSBwf%rMEpBBLVXmfg@xb>>Q4x>=D?^L*Et!;9T}KhN|3?{{>c@7imx zz4qE`zn*>0P+sR<-Xm{R%BEeq;oY^IbaipOY?N$tB=-&&B_3wgai9{Ri>1n )P|!Xjzb7v5d3$aa?<#j4OUDHayrgM#h;SF?e-xTsMh^Kh7(X zM>K;^TB#&C!muj_YG-aLSW~iw Pr;q*=eldj`LSlf}s>76O@oZc2tzDQkvkdlR^qMjU(q{nvF z+%NNJ$(3>(C&Jn-YOzW@r*{!3j}}T6l%kemkiF0XB|Majc6ygc8IBWS?Gu$$N<61` zH7Jh~N*3O~nX|#v9iWxFL@i#>GQ#OyE9E#&gf;AYs!+Yeb9x^F< T^Pu!NiLF0Kcj1_* zr5~iyqs14d_&L3~8>MC@!dfhvqLg?}?;ubfQz%*3Bq|95Y4LbP0VTZCJ3`8EoCxa< zo2VsTVmiImpgdYAU6>(i(SmIBXo2a4Ug(BWhT}w7cZo_CN<8#EP#z_eEC^ZT6$?n^ zZqc Z=iN-{o!M1akwc^o_B7jaIlyLeV7D1tCG%z;U;nX=`gM z APYcl;vd|BBM kEoZYObXqH>t!56zsTt$n*es 9p#`~@*?(}%mpgsZz($TvF^BwTvqDxfs?cwlkbHoBs)$t#q_RI0F)I;q$_j8F zGz5w&di)$&SA~z=Znw2}LI#J)$Rf17%%RwUf&!K|qb!T3u>WSL)2HAvdtk&Q8+8Bo z^o2+ntj>TF+S;sp!FLBAh4ms6CD~6yLx$X$AwP^Xr!24Mf7{yvd+nz!!cQ-G%#D{k z^Z#IQUJtu*r2giu?+(t!+j@#I^GkDbjk$N(@?jIRPMBKHarWMt*DHT>y9;%N+%joK z78ap!YOM3Z9c$R9BX5^2Vun#W`J$KD`BAlVP_q-g|1fa@b6;=!-R%}u-3T=o?5)C5 z5GR_*Ev>>LV)`z3TjcIw6>^XpdaWI(xwW^4)%!(E1QV@n0@PIPfCW{}0hOO|9Jg$_ zmDVeFaAp_#%5O>_1YG;Tf19h7am$4d53o@G#F0-N;5aY$a)BLSOZ?5Y1&CI($ghkP z3?543wkmjzb5sd1v5>O}xi64}pJO*M>>mn`-!+(;2RpjE$ZS-)qM5HcSL)-*Xyv*^ zD_bs!y|=2l)W;p%fQWr}7t~Z-Q*2sbceMS^LPt-Y2KF+ITlmX<(G=GTbic*f!W(rI zRaCUPT_e4)9&*-*Zg%_V>3+}*_k^Kr#U=Li=ujImoT4jGTMkKf|6Q=^L=h6~y+YqY zc$D1yFAyi (JQSR Kvho56s<>Xng zzoI3~;n)QmPk6~VENfe-_7oTHz7Ls+Da9{sWp61HWpi1taylQF%pwC#Sx|tsd-h4O z?KI8ytg8hz{^Y@1R <{r*n+LMi5USwg5$0mqcmkH&2 zpj9n1v6Exdaqk}+E&G~91gUYi1&w3tgTh2=p~+)J+7n{!?U^c-{p{*hD>QAwmEE37 z4@`HMY*FXPvx75EMUR>)>>C_E<7*SAao3c#*OYcU&4Mp{x4y>QAv~1MaW$p==u@;B zIkGyu{tz~#v;5$3Jlnw@2%d$>=EdMSSVq1N4&~*$Squwhrq|??p5HaRY){Fh!%Hrr zk{5(b2o?1<)humwn%ksun}nN;tUP2KDtJC5EMmM7t)JC&Wp>3izI0ZhKQ=SwCTd=5 z9tn&KH+a&$>{%VwO6V&b*sTgTGCtI(q#~Bq)5g=0)hYZjmsvt}{5Hn6hh|24`pyh- zfMLhtG`EswRKDrN-mlq@q3NSjInMPacn)*>iOR2;DJ;ZKRM_drsum7su(e?mWT~tw zEWzN>mG!vT5?9m}TYD6a(oShqv>{W#+|o{=7u6A`hHpWfI0`n##TQ2QV_2HMM?=SB zkT7?!jYmSp-$yihuBQ=cz3lF-=*cDT6^)C7hjx#fF!3AId8|cv^m`2Q5> |#NI;cL+!O2Sp(KN+seoPAxPJ^j zXag1cH~nCt=Ruy>0VWK12lRD?Ha;p9nidfUDo3nOaK&Qi@E1UX>DCeYUzk?)X<*bx~g`4Jw1^Orum|wFo 33YXLeTln8SZn0?|Bh eR#;;^G8W;uM}$)MQG-x|IJ^Q9r|}1C+0+?{ z>|ETmiDpb~P~~bu$10RV1(aIV9xe7yP*z_O3z@3n|Fx6p6W7RgvX`cgj~z55ElJEx zrCg#?(uS8Zc_&KA<=Y;8TszLsGMMK9Eo0O4A)?nSYs~n+%W2+AT}1fjRJLY%5bK*Z zT69}D{{k_BN6oG1<4bjg{ T!~eIEf1b|5G}o2<0*19z@)9b!XL!lGs>FJxR$W(5*EBXso2a^kv5y`= zWAA^|lTBj}Xw&%vYuQQdB3^zE^G(w6@0GHQBnw|w%2?7|UQ^0CleGNrC16Ig8OZ}v z?@J|YRdRU3VjQ80oAA_F&nA3uPlIjgso@hc9a++ZJThfDzrw|COPL^Zv4>NlLaQS^ z^Kz5PW#TH{YC%urPUu|h&6F%&70E`XM)Qlx+4R&YBamKrvqf0a&Q_$V_zy0!ZK><{ zhbJ>3wJa!pJZ6Q_)_lk~95I+Qg%jcI2cwEV`UQJRzm_ka#QxB43W^v9u^?;tkk||3 zMX^Jlvlr6V^7$$@+Hj*xV7D4n{LAB5xnW$`*ciC|Fml-2v3|%Mjyjkq{2t9-HN^2p zLfIFFbpGazEW)^g|Mv!VpK*n>0o}QQT24_IW<5GooFPmsZgwXNO<&9Z7|R|=zey_2 z7|MFn$Auk)Kdiz)alQ^mB^Bq0WU;0=er_ JF;is+dvA_rw3MmA zNefpHdplzsJF8FdZ6mA3M6tZNB|#?xMXw$jQgOprQN_GZ*vNUY11j!6ODdGttLTnk z+vnXAv_mOcAq=S)KSop$^f5~{51O9wF1yRThJQMowVR8_Wn%rpgF#g<^%-0a2T|6B z%j}l lf{0)k#$r!)G6*#XuD)Lw-^L3j@xXKo+;9 JBcWQ<5<7vBUox@#vJKT}s@7MAu;jwUj%!9d)g#iU>mCj;aXUEj7Do zw7P@aF0sqYH8!^lrx0^|t|%+qe3J|1p7 p}EZKq!rHYNYv=RI4O*h%I>gKT6wUN`& z9O!z{Ys9X1B}&vST3+ZzB}CO!hDEqJlf8S(#9L@sEVDSp>XMCr8WGf!mK4gC4~>X3 zLnDF`X+)SXg7A99S*1dplvr>Q!7^@DMMaLJw^1 v7=t)AaW~`Zar*!$JAS2?YZN_`rZp5~Y18tiv-#(rhG3$DTo`ElS4G zphZ|uQ}bI?mck*HV~;!uHw4TTBdmBul;Y?dm}= u7MrCM_DAH5ygY zb5r~(_QUERKKf1;uqIA!%fLg`M=Ro{b_(0zi;As#al}#S*iCN7=|-hPY^aK@<+S5o z7BF{r5!<;YZq2_1$&k|c>rO@JKt!A$gmTO-;#A;^cBOfOrUL7(>kN)Z#~v`a7bE?@ z8{C~I8vNNEWH3M5#8TEwo|5kK|7`4n#%~9VHU1A{jWmpD-g=kDzGUnbr8Ma^!)W0} z1#5g{CNtdT>;LKsGFxHaO^wQKx-CqW!~zOJSoGw;z-#Ce7*s1Ik)?at{DN4S_)Mla z=t=Wo?6z3%1UtGm%Qj9Jy$tflZ P&mqQI`KujO_*p#13S)z#@9QZK1x2voBBgHXo&dKi@7c0dwr9w_T%m)0?K-7xh=X zGjaOqist@`zUX_x@j?IvO117ot;MEvHT*1|rJuY-v~l~H>&|1@qm90!*C1)=P>YqV zPvLWKVYN?&`K&raO4Z{)wrWl^`AaFn$A_B4J&F57o|IGwN!TjGja2bZ{I(&{#B zUHicuT#G(b*<7lyk9G&wcd?&tckpklW0ls7$jw+}?PkFtH)C9In02o@ t_dX)OyVN=|PP1r)1mqVVc#1swj40+TScnNai^3Uj{dc6;{V^xg`a z@Y*4V()PQu$S~E^Lyt;LaO5z@zdIyX(W8=%x&K*oMApTgzH1fkzu%RJyLv-B?khK# zeUQEB#dWM AG pzgYO)mz^$NYeR7X$6B*-rXSn@ny`)#uRYI59`Qdn*u`*K?y2eZ-%Ql3 z>$QJWv$V%PQuDLZ+`R?Epr*9TX}%bWD%vyTUhmYD3N_|Vd#=h}7E|@bmM~jDmAhn2 z)feh5qix<5?$CRDEB+N4{`V`R@!D;Dz*uveePz3SYn$Dqt6AEHiYx7SD&y>nbnK(M zXUe)B-!v`Ch6g0n2TObl-pyLP-g5_+z;X+CUP2CAxM}%xM32*wxnAFD&*~|?_Y}Dt zmNk)G0nr>zh^w9enNljS_cx6T=?-{ 9em^XvCrWxjw9LLx?)9NN zxEdlz!BQi&JsN(5J*#c7<$Vyb%j_n(JyXG4n h-KchI`)y}s0GapJ?>IL zxKE7r+s)lxXDt|vf^|7-yC*&`aFI9(*68hL@KT0`V3;%n?dC4alI6m<>(q?$sG(j> zO8S>kZq;?Ug-g$(pKo~%ONsnGJAZ8fd+feg{<8(_=zTNCa>(E=4YHg2V49cHBK&J9 z`{};;>3bLa*$ky*2241FnF^VZW0|mbDa*WnoNp+VvFRCBbpNCL&iSnW{wRLqd=~M5 zQCW>CNvtz!-Y49j!wMhJ^5OGY{R6>47^h2?2~!|}`AAF;&tc~t2oLW&2zBg`INR7q zVD|E{%L-*~CEjYVjqCmrdJ`rpdse>}7Apm^`Z?s;7D2Ow#jc;ok6yy&ua61}Lrbr= zcMeQrg7pVDAot!`*3IZ>4ta=uNf6$SW5}QPtyy|i|HD0U`wv&b?C*ReOmEeHbdT>T zJb&4)_ MG)e;d`h?N=;=wtz?Q6&L4qZriWoYBvS*t^Rbt z!=u5p2t9LI&%NV(&z1OR3vF|mU)jyE9ofS>z*#ZYH_!q4h1avG1K3v0{j=wThCE+* zor*lf>{;E*yxvFS_X}BwUf=k5BuLy3Pkw-#G;e#rDa*%Rd+@6Yn!D^-3Of8` <+%P-4Yc0-ry{~ttXB593I_Ju1z=$w>amh$ve(DTKI#r&yhRs zS2+1%VpVlwgCufIa_2my-0~fJrF(D`*A$OT`NQY&YwxcodOGDkmV*3zc(eXB}Yn zZo0&Ns=PpYs ~k`yO^%JI2PH5Eyh0$&lBUx zbFTU@zu+r&Z_NSz;NMyJ_80hHzGTkrr})`lvPbNj13Vh&ZDNlfX4E4icJMNo;ODp< z=9D;exWD9>8aU(qLBCe?M9|dxt)l{IcRp(NCkJAtcFt3Gz-@0mdV3^!86W@XmJ9FC z5<9)!xmx^yNZit8> Ab&;S4qk{aX&z6JT{<$3nPiZ;bypegpX_>9W;*iZ?zu9)_dNUi6NwNA z+%u8)L3W|Lf~7vW1)O6~PNpn>e`> _ZT_~LQa9tekuhdN(iPXY8oK@i&^J3jB>KXeIg1~fCT}3r5s13aD4nBE_W$z0@ zp7s0IL8xsX?e~7&7a6p &fFi4L$AYoB6r#u?L=>4HJ(%Jy~`G`~2xC{BNHy zufOIYlK x-_~d5L|q|MYlp9c41?q#S0q{WD9p z_2l=EJ1_W;VV4esDLj$y0@>*Up;4`#*av|eRF`_|% %bz5c2|3eha#T7oX`Vf4$0f!e%9C9>vii_G>M)0%iTCZf7w%nfFZ=A7 zJN@r}2S)_vZX6{Dwzt{M&n7@-+q07b&knU~MUR$7@3Chmhjf!|rOiuf%q`OQ6YgN4 zi~acQ#3&5x^))`iUr!I78ZLndO}V0Xwa;1oW02;+rWa*RI>nxU?lnI9L$ v^Ft(Eo$MK3>sNK)$&B#hZDbw^-AQQKQOwDX;y45b0!>UW^UDOdi4;!8U3% zr#Z^v_ojMYESSt&Mqa0a>oaUn*fhNz~V?HD-ev=iwG@g%nnpM9vjW0aTj=r?g zpVVU)7BKgHp{s>Oy}WMp7H|-?U%;5StL4aJFXzit(~r^0jJJ6m_LUv<@(P{qLLqOJ zWFhH#hXpsr2k7r1#|qNvPlx2#(#ECyzmKuD#v1~&hSxQQ>N@4sG}(=;;MEx1t6se; z7<~-~3o`LYNpWQs-pS+jJoA0+=D^*<^NM}u_Sba$)?;k{YoYYHFudWZbBD(%&75%4 zG1mUtZnW+CBkI6U|0Dl%N3?v#8|=#?|11BPH;{ikn|w4|?tM4*iTDZt%APqoCsiEE zcp}hzf#;vfD=2umIL}aTB$r}Ftl8S{iPe}D`o7XohdkW^85a9`2oFekJsn-;zSrka z C?*)OHHw}S~;X39~dwllhQoi;un|bmMjOx87H`A#0J7vtE z>Fz`K1zI{w#^BRInLUA?bGs$}>Q!f!VVmq@KYvh{g-?l3Vb4>jSSFOgGq>DgPts*E z`>Ck$NUBj_OIfo}PR9+R?71^~e-wP?R01Ejiv4_Q0$!VpdpnDN>NK;yJ%yk8Hhb*t zb$n+m>wA0J5-8A|%fNoRaux |Xq|J{_-BG$<8Kk~IpUoJYy9)XJLx# yO6)-gQ*9tH&IOr=pLL;_sBfDC*{)Jkc0dB z9l_-{W#DHCJN!$;Xrx61?@SRUEfitKJV4z}?=pbh%pEKeQGT!(=rAh|ZlQS9#ePil z-c95y{M%272TKscxAnM_<@jBPn2JfzyG)`A<+*pxYUZ5fTfpGa+{9?cBR#pJCeynQ z@zY(1%cZzgeVG~0hSH?!lr6-aJSBZc{y931HD>}VK07%Lp1`WDF<-@Vp*xuNF9}4b zJcPsC0}skYp bTH7?uJN@pp@T8#?jX-r0Fc=mg1o(&qfGfS48>Km8Ay-7FykDJFWw;M5{M`CP? zW7+*##aX%j$4xGrGLS4c9 @;eMR7wYeVtSW!!q;_f zdJq|dGrtOdCF&_F97!FHMZfp#7$j7DD628lgSg^j2eQxJOVv}%%f7OAKgn0L;s+sh zV9^HPAaQ;
XXKi#z&Mc7;K7=9cx_wknSDTyqIK)3%;=lI}_EIDY+L zs{h!%*gZLpV(08q>}Bgeh~pLGS?vcw+9o83ZC_h!&rvBHbNuW#v};-gcP}R1dFVK< zFwDW8-hoGP*WNu?M_)Z3H2y;pC?)~=Hh(~%!)4vW9=s63BF+c!b>rEL^P%J8kj0Tz z?}`zz(-kISwM)5&tvWwxdMoKzCh5Rt-qnh9eD+$=B@3v;TEJDT>-YoPJXiA*?B(;5 zCq#rp-rFPZ$ZB>~KSAm{UF9M+xXPYjKcA1YSxD?nOhkh{+u_h*Qg9`aocOtiYnn)Q zqJpkykyMaCkVw)O6s{2>N#Aa`{@6{~M1dbgQsfFEDaw8+lJqfw>zyauwgKT|Q1K@R zZ!d=seEb`Ir+Y&`s2@Nz)sn>{hgs}-_wFhsBeIUVwo(CEb*^=yQS>6zRVbE8FWp?L z#nejIa*>r|BVMM+>vYWn{@DfvJcyFZ25s0tHYg)t!y|YI{ge0&eUQy0i87K{=aCrJ zXQ&qOlzxcP&A*KiRZx# -`d8NYNzk|kG4-OWUc$W+*0L`ljgO(5I!L;! z@9~ZxSuU8Nb9d4w(qgBpqV%w6q(9v^;A2n84o4#z*cD9L9D9izDUx(b;&MO6Hg=4+ z4XT++YUYueIZz}1X4G}|F;MiYPuEGJ=$D(W*NCE@U%DEIqMuN@o+gTZ2I<;G6#bUb zwVf#XJ)*0eDEd*M>mH)$hk>plqVVg!C7f$5k@OQiS1zbOw sh M8>qx;-Qt;q^C_qON4QfV5+Ik@@Zm`ry%G5=flBG=Kpaw~}p1pM; zEEey2JT?6iR8vGOgn$0YV qj3uT_NFW$(W?wq0>D!T_sp0Y{Elbe3@IgtB!8aB yDM4#(%55#bu*ClN{zauBo#bmgD|$p|qBbR7mhib4({oI<#OARzo3p&wz) zbQz~cxB(%5x(&6KGCl g(+m&qzyN|r*R+{15FrNqkCCqrAqe!pk=~9F zg|x?k j%vBD(HJQ4fHJ z(7Xjag!-*`gnbZvgk}omCaw$ESZU&v2whdcsv`$n(^Sg`{wf2{p>H5mhse0 m5qlGjX(RvA+p_Q-ExSO!uWd4~>>B^C}L>cq}$J zxd7h!^Hq fxD!1Q|6ux5D!Fj zI6F_&5;B6asE}2*Cm}#K)}}-5qG7oQv koiIPpjw=^1{R!0R0*2Ul@< z!{Vf;dTd7M@H|`@GQ~krS>~QqN?B+Q$gp7!!$y=2aJV@LR`_?|B3%~58zf#BP>WE8 z{5yax62EV-+8JFEi>5z%+B^Iw^P3>rCGpfq$N3C5z$284-Wx$8or7BE>_U_Z9x$W@ z@c|kN#EV+@kfd2+aeY)8^7Uozc{ETK>J2h1iyA$|M)e%-12TldfAc{eWPRS^xUKJU z+*=6WAw-_#xKf0(2>wovJB5(ZiofB3P>b*`g8w;=n~(4cLhO4Sw-VtQgrDByW^ps# z=eUOvX0+ieT!ga-{vU8$7Q$|XPZ9jjBaYxWzvuojvYE0`d!8R7+h{Yr%5gJG)|Hj0 z?!w?l8^NC95d*w3t{GVt!5g>%y2J-W~M!NmSz5LH8w3ooA}mx2?aO ;fXFl}7#^~_8Xyb2z^J>zD2GA|{b{IXPlhlg+3I8JdLZxQryoZp{# z#8m!?Hy6Ahk!KqyWRa*a>^ec5C*X>>o+rx1T*u21 7R44HF0g7`}jToCmI(IOR{4s-NJ zZ{#xYJZ+yyyciYafD%tbJS}*``iPczwCQ*nC%KYbGFbQm(u7@!ADB|DRhd{eks`+7 zp?bvk4#hWv N%&0?xHHV zn``oj_J+#*R-2@>8-XOd3`oVT0g~Dxpd5Iw#D54#)o}oQfqNzXK_I#Y_cD-7roN+# z5KX3X7W9Ho*Ka^7$E($YqkvRS2$0H&1$qOg0;wD=aG)vbM14w1CNK4!@g%X2_=r$q zlAP#joG?%s5s?{t+>x@7wa`Hsnt;ToYXAonQQ4%B>P~@dA{jMK0!+Yx>#=p7LaFWr zNF$j#l(RZS7JOT;R8Zfrf=C&6Zm8ga0?FWk0;w=EfRr` `Mz$Nu`^#Mr@ zhnJoMt 8wBNhX(5GlD;(n1B5c#^3u0o?ha zLhA?lBSsHnw+$6)1Dh_KX^Q*2HVG*{?YN0EA`DOO9G;FR7lZWlGLXMxSUTmq^`wbl zP=D*N^yiVb>H|rjH^?JcFv0Wss2tdVKu+Q&W^e;>+DFjlmoDfMji&BX8|>*K4N^Wz z$F}^zXxW63b>Pv3{rC%r+lr-l*?-YvfgW1y2Ch^ra$Fahc^I!8535%2 3SNxHt?*& t4UD;&KJ6{%NkbjUhq0E;gR$IKY{rF#tFnSpQ6nr zn~K(LSk7^i_yy}q=9X^Sv~EMm8xv*iqn=R9!fe9#Cawpe0i*FMupi+K(29TI=^mjG zlW`0%4&hbMI-m)mH5*SLz&xVQW1a$TK@jjuwrXH40{yB@g>NL{5Yz}-gfs*b!a{`1 zUXzW>0g;Q4k5GV6giwr72L%%_VCp4o08T;tu!Ki}v>-G|*bG!4-XdWe&=2u;2|Izb zP+XL-8|Y8FdO;+xxd+mUa#g~9;3&j77(=K4rUU&X3 K{F; zSuT)_s|3 A*Z-Jj&-vK+FK{0ww|*fwO>ZKs8VRCIGqLuqXq M;%)$Hfwmh#WP-Q}SPZlPD}mX-Cg5UV z7jOyiDli8q{~fQlfhynwz &d;*aWNxb^!MSuL2JM!`vqBAW#Q91k49M1FQr-3p@mT z4%h~40QLf(2crLHa4&+;!EuLydBB%|TY!H64*}i44j^@BK|)T3=L^KcfIKiB=mksz z%7HmRZ(uRd2UrdC1=a&c0GlQ3w1J?VPA||O2}(YL8x1r81As*m?gA quuokETo&;W! zp?h?Jpc$f1!XO{G7I8I@2U>t$z#^a=SPS$9HUfQsZ9rdOFOdF7q0$#F2F3$N0xiH% zz#^a@a0k#I*Z>^O+n_)suxkS =fEwUlpcZ%(xDD6|d VazD0iXr=DzF&X46Flw1w09)N&X^G2J8Xyz;aAf28~7=0(C%tU_Nj(uo4&mJPcF eE&xpk zQ~^VQI$#(u6G+eHMFAN9<3Ut|5eaMnMgiM_(LlKpZ3)x?V}WJBbYLSe7kCl48ps7^ zV2E*C4A2JD0n33F;7(vMkfy*LgmQR{5SPy8SuV?SJZQ3dFlLJfmAgEsIP5`riwF5` z56a~KHbG4@7a?Lfrxg+NyofPezKBY$Ohg4&E25lh5RvD?TSNkn1rnoIiYtG_tEu2U zy?R;LvHF=ZlWflpz3j=9%TyeW@6t1t;dRt%@pY7Gb4h^-YuRNJB@L$Cwq|pQl!UZB ztI}lQvdeq!Pm@g WK-95*|o+JmL9-Hxk}S_$@J6vru!l z=0i<~=5LyBH9Z=+Hc&fF`-e6;X=PGv(m#^Ck`t5X*^*ZzTa!zYYm(nj{v-Lp*>BJO ze)e|V1>MUj$5K8>`8XviwKw(G)Bt^`K0^OYT7qG=A a@RUXC|#k+Mo1nQcKcDNnJ^< 3QlHhouK!ejN&l_BS09v?l$M`%N7`uPBUIyJ z3^RZ{;k0Iqc8m77_I>T>q%%pElDK45a$54%WR`qoHYtBpw_DesdrLPXB|l|P%B!iL zr_R?e)!(CkUcWo7DXl-v%ka5jx$zsD@fRa?X;OMjeOCRMdW1GqJ3i^5q&JhkN%|@2 zzT{?jMmziF+3RPQ&Hi%sx3ha@|2mt~Md@yW@{E+il+7u%DV-?|sTWhfOP!*(rd>*V z&Jdl>)zb3IadQ*iP3TFC)lAV8!`xlkx3rhE|AhX`q}53!NuMX#e3K_9>yl3=3&|U1 zd+D^g4|PB2;!|! 6K}BrM+g@X?(-@uJJpgEPYb?oOIe<6ru2a>L1lB6JAU>pYZpDe<$3Pcs%j5#LJ1- z64z@=HQ#6gwfRX;*pg!5vT?c!-Q<*{luaotMV1 K& AD?z#+P<_{!(? 3O87oue4;9GMq)?emx*5|#%QK#G@3L`w&qq%jplL9Uo_8aUc=z~Li10}Rn0XG zr}feLX~$^8v{70W2BKP haVO z`WyAn>0d=3c~}3T{%`t!=)cqdqL-zON()YlPRmH!mDZg$-EgPjNV?%i!*t`F#utsJ zjqe#R8+(k==~L4+>8a>Ond!Flnsk=_RQiGR!|7k8yV8G5zn0Fm D*Z66b+87%gs@2Ye7jw0F+7fuMR$H$ ZBb>hmsnSnlVvbOzKHerm9nQsixG-)FSlHy{U&%TTF6Muc6-% zVN@C8jXGnlG2du478|!1>x>P?R%5&IqOsp7Pxng?vZcqQo6uZE=_Tn~(yP%}N7GNH zx1_hFccfoT?@sSYznb1pof>=Q5`bK-RIAlGwMm_+E>f4M%hmPj26dzQr23*-P%9FY z395v737HAG31tbD35OCI6WSAc5_%K-5|xSS#LPrXVs2u7qBXH7u_Uo9aZ6%UW#Zn% p`ou$thZCC {nuO{{<$~9pc&UEa-8)Of8;gg}R{{yj!8)pCj diff --git a/sln/hgsetver/hgsetver.cpp b/sln/hgsetver/hgsetver.cpp index aebe056..61fadd0 100644 --- a/sln/hgsetver/hgsetver.cpp +++ b/sln/hgsetver/hgsetver.cpp @@ -568,6 +568,33 @@ namespace rc } } while (end); } + static bool change_file(const wchar_t* file, oem o, bool(__stdcall* modify)(std::wstring& cont, oem o)) + { + bom bm = BOM_UTF8; + std::wstring cont(load_file(file, &bm)); + bool ret = modify(cont, o); + + if (ret) + { + std::string bomstr(""); + + if (bm == BOM_UNICODE) + coding_util::bom::from_unicode(cont.c_str(), cont.length() * 2, got_str, &bomstr); + else if (bm == BOM_UTF8) + { + std::string utf8(""); + + coding_util::unicode_2_utf8(cont.c_str(), got_str, &utf8); + coding_util::bom::from_utf8(utf8.c_str(), utf8.length(), got_str, &bomstr); + } + else + coding_util::unicode_2_ansi(cont.c_str(), got_str, &bomstr); + file_util::save_2_file(bomstr.c_str(), bomstr.length(), file); + } + + return ret; + } + bool set_rc_ver(const wchar_t* file, int v_1, int v_2, int v_3, int v_4, const wchar_t* company_name, const wchar_t* short_company_name, const wchar_t* vender) { bom bm = BOM_UTF8; @@ -702,6 +729,138 @@ namespace rc return true; } + bool change_vcxproj_predefine(const wchar_t* file, oem o) + { + bom bm = BOM_UTF8; + std::wstring cont(load_file(file, &bm)), backend(L""), lead(L"BACKEND_NAME="); + size_t pos = cont.find(lead), end = 0; + + //if (pos == std::wstring::npos) + // return false; + if (cont.length() < 1000) + return false; + + if (o == OEM_HANWANG) + backend = L"hw"; + else if (o == OEM_LISICHENG) + backend = L"lsc"; + else + backend = L"hg"; + backend += L"sane"; + + while (pos != std::wstring::npos) + { + pos += lead.length(); + end = pos; + while (cont[end] != L';' && cont[end] != L'<') + end++; + cont.replace(pos, end - pos, backend); + pos += backend.length(); + pos = cont.find(lead, pos); + } + + pos = cont.find(L"OEM_"); + while (pos != std::wstring::npos) + { + end = pos + 4; + while (cont[end] != L';' && cont[end] != L'<') + end++; + if (from_str(cont.substr(pos, end - pos).c_str()) != OEM_NOT) + { + cont.replace(pos, end - pos, oem_str(o)); + end = pos + oem_str(o).length(); + } + pos = cont.find(L"OEM_", end); + } + + std::string bomstr(""); + if (bm == BOM_UNICODE) + coding_util::bom::from_unicode(cont.c_str(), cont.length() * 2, got_str, &bomstr); + else if (bm == BOM_UTF8) + { + std::string utf8(""); + + coding_util::unicode_2_utf8(cont.c_str(), got_str, &utf8); + coding_util::bom::from_utf8(utf8.c_str(), utf8.length(), got_str, &bomstr); + } + else + coding_util::unicode_2_ansi(cont.c_str(), got_str, &bomstr); + file_util::save_2_file(bomstr.c_str(), bomstr.length(), file); + + return true; + } + + bool __stdcall change_sane_def(std::wstring& cont, oem o) + { + std::wstring backend(L"sane_"), prev(L"_hgsane_"); + + if (o == OEM_HANWANG) + backend.insert(0, L"_hw"); + else if (o == OEM_LISICHENG) + backend.insert(0, L"_lsc"); + else + backend.insert(0, L"_hg"); + + if (cont.find(backend) != std::wstring::npos) + return true; + + if (cont.find(prev) == std::wstring::npos) + { + prev = L"_hwsane_"; + if (cont.find(prev) == std::wstring::npos) + { + prev = L"_lscsane_"; + if (cont.find(prev) == std::wstring::npos) + return false; + } + } + + size_t pos = cont.find(prev); + while (pos != std::wstring::npos) + { + cont.replace(pos, prev.length(), backend); + pos += backend.length(); + pos = cont.find(prev, pos); + } + + return true; + } + bool __stdcall change_device_def(std::wstring& cont, oem o) + { + std::wstring backend(L"_scanner_"), prev(L"hg_scanner_"); + + if (o == OEM_HANWANG) + backend.insert(0, L"hw"); + else if (o == OEM_LISICHENG) + backend.insert(0, L"lsc"); + else + backend.insert(0, L"hg"); + + if (cont.find(backend) != std::wstring::npos) + return true; + + if (cont.find(prev) == std::wstring::npos) + { + prev = L"hw_scanner_"; + if (cont.find(prev) == std::wstring::npos) + { + prev = L"lsc_scanner_"; + if (cont.find(prev) == std::wstring::npos) + return false; + } + } + + size_t pos = cont.find(prev); + while (pos != std::wstring::npos) + { + cont.replace(pos, prev.length(), backend); + pos += backend.length(); + pos = cont.find(prev, pos); + } + + return true; + } + }; static bool set_ver(const wchar_t* file, oem vendor, bool x86, int pid, int main) @@ -762,20 +921,40 @@ static bool set_ver(const wchar_t* file, oem vendor, bool x86, int pid, int main coding_util::unicode_2_ansi(unic.c_str(), got_str, &cont); file_util::save_2_file(cont.c_str(), cont.length(), file); - std::wstring cn(L""), scn(L""), vendor(L""), base(file), rcf(L""); + std::wstring cn(L""), scn(L""), vs(L""), base(file), rcf(L""); STR_PARENT_FOLDER(base); - if (rc::get_version_from_file(file, &main, &sub, &build, &patch, &cn, &scn, &vendor)) + if (rc::get_version_from_file(file, &main, &sub, &build, &patch, &cn, &scn, &vs)) { + rcf = base + L"\\..\\sane\\sane.vcxproj"; + STR_SIMPLIFY_PATH(rcf); + if(!rc::change_vcxproj_predefine(rcf.c_str(), vendor)) + std::wcout << "change predefines failed: " << rcf.c_str() << std::endl; + rcf = base + L"\\..\\sane\\sane.rc"; STR_SIMPLIFY_PATH(rcf); - if (!rc::set_rc_ver(rcf.c_str(), main, sub, build, patch, cn.c_str(), scn.c_str(), vendor.c_str())) + if (!rc::set_rc_ver(rcf.c_str(), main, sub, build, patch, cn.c_str(), scn.c_str(), vs.c_str())) std::wcout << "change version failed: " << rcf.c_str() << std::endl; + rcf = base + L"\\..\\sane\\sane.def"; + STR_SIMPLIFY_PATH(rcf); + if(!rc::change_file(rcf.c_str(), vendor, rc::change_sane_def)) + std::wcout << "change exporting-definition failed: " << rcf.c_str() << std::endl; + + rcf = base + L"\\..\\device\\scanner.vcxproj"; + STR_SIMPLIFY_PATH(rcf); + if(!rc::change_vcxproj_predefine(rcf.c_str(), vendor)) + std::wcout << "change predefines failed: " << rcf.c_str() << std::endl; + rcf = base + L"\\..\\device\\scanner.rc"; STR_SIMPLIFY_PATH(rcf); - if (!rc::set_rc_ver(rcf.c_str(), main, sub, build, patch, cn.c_str(), scn.c_str(), vendor.c_str())) + if (!rc::set_rc_ver(rcf.c_str(), main, sub, build, patch, cn.c_str(), scn.c_str(), vs.c_str())) std::wcout << "change version failed: " << rcf.c_str() << std::endl; + + rcf = base + L"\\..\\device\\device.def"; + STR_SIMPLIFY_PATH(rcf); + if(!rc::change_file(rcf.c_str(), vendor, rc::change_device_def)) + std::wcout << "change exporting-definition failed: " << rcf.c_str() << std::endl; } else { diff --git a/twain/brand.h b/twain/brand.h index 2bf0c12..4c8e5e6 100644 --- a/twain/brand.h +++ b/twain/brand.h @@ -8,7 +8,7 @@ #define VERSION_MAIN 4 #define VERSION_SUB 1015 #define VERSION_BUILD 2022 -#define VERSION_PATCH 7061 +#define VERSION_PATCH 7081 #define TO_STR(a) #a #define TO_VER_STR(vs) TO_STR(v##vs)