From 700aa08f02f55eaec1068ec5d01e4710486748b1 Mon Sep 17 00:00:00 2001 From: PANDA-JSR Date: Sat, 14 Feb 2026 22:33:14 +0800 Subject: [PATCH 01/15] =?UTF-8?q?=E8=BD=AF=E4=BB=B6=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=86=85=E7=9A=84=E8=B4=A1=E7=8C=AE=E8=80=85=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=20PANDA-JSR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/InkCanvasForClass.csproj | 1 + Ink Canvas/MainWindow.xaml | 16 ++++++++++++++++ .../Resources/DeveloperAvatars/PANDA-JSR.jpg | Bin 0 -> 81181 bytes 3 files changed, 17 insertions(+) create mode 100644 Ink Canvas/Resources/DeveloperAvatars/PANDA-JSR.jpg diff --git a/Ink Canvas/InkCanvasForClass.csproj b/Ink Canvas/InkCanvasForClass.csproj index 3cb49b7e..2e935f17 100644 --- a/Ink Canvas/InkCanvasForClass.csproj +++ b/Ink Canvas/InkCanvasForClass.csproj @@ -269,6 +269,7 @@ + diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 95032d06..9a2908ae 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -4043,6 +4043,7 @@ + + + + + + + + + PANDA-JSR + + LG`}@cD_xL@2=f1Dp&&N3@*ShcA*E#1p`8)l034ocI;7kAz z2mnAQ2k>_VG>tPfyk=!{(FAwF_`d}MzzIPV0U#hSJk-Y20O{c9g#4HHKjelF3;rMc zf4QF2`)%sq+5uof;r}B4|6;Ltc!uFml=e>wI`pLRlg{#3-K zgTqgBtp3HJwl;<**y9AtT>n3?`~QLQ!J+@^lTLJW0{kQXZR=n9x5w005K!!*eeJfc9hn5SaZB4_yubTuA`XHu@jlf953EE!6F# z{*y^QDGXj-0C4aC05}{0fM*N!b~aWvHV#g17zZbulZ_3= z4}URg5)k<0I}k<|Mn)E14mJ+n|KIet3xGqxao}5EkOaU0 z2Z7h80R(0MGcqwSGBLs#SwL`rL7ZDj zA8ak*76M_6SIQEuvfXRy!Ai?UgU@}X7SKZk}VP+Is;NlKqHG`fTjOH9hmt85;Z zQnmHSe=?zFN9|EJuKKra(EmgKyLAxoZ`(}F&=aXP{6q>cfItu?W@ZQj_(TN+XW#}a zLB#c~8F`dLLYtT*RNdlpx_MD51~wJ@hL@V(@huzKe*QZPu%8Tw0S<-(=Yh`=TK+R| zwC3KOF6JnY1KOXpzkq?ygdx*PUuSyWpOiB<;xUj#DhKvLpb`%?<4d-*wh1C7r_*9p z)>QwIxX2A+GV$n3QbC5*c)o_jJcGdRs%=E1H}h))2Jx@)=UEUJy{Go)zvokZqR}Di zsM^^FGW)2D=%^T?j0a=Ck9f7CCy76rP&*g4erK10-OwV-pObFvpVEqu+vLSZ8?o7e za-PNvs+gA*KW6~gXCDb1cio4w7!7Lwk_gZG3*-SG@=t?o4V$KE2J@8~lyTFDtUtl* zD}vBq6hQe4oJL68afHME0*)7K{Y8w#6E{4<<0m?fX|HYw4g`zFg*x3bvvo+Hvx}+b zM#V-Z2#0lL@>mCaY*f}#u&$(XzX?RWR3hFO);vfbYob9z>T0skX>MwwrBRveq2knk zZuhL^$kO?q^38Rczr`%4j7F`DXMKMkis55UUy7}&kC?d(S&n|)3hZa6c!WQ+iy!R~ ztYYqov#whuW(3ZBrHtwGv7d1VN}dR!_qMh`>)F^6WL&W3o9vMM1Ja}|Z+FfF!q9A* z;p+n=shxJ7#WZRH$)ccQeV?k#f3Z)3=QrNNcCunt_Wh-i?m=&v+!Apk1ML-SdttUy z9cc_kIrAXTEAK}vtj^wc2t0Sx$E`6MH*Wj@ySD{yTNL;_|MFchH9QBDU|I&hyR=@_ zqS83m!g8DIw4h0X6>tyH1s7^KTCi%WeVrla?a+2tI~7$sxeNtN`a2aeZd~cuX2Cbc z<-q&Kok|YdsSV|mp_M7?#O<-yY3K&mShdw#^WGf28z6wuOsW@!Ed5Z zm+6+jG=RR%_9OzT35RfS3Z8HNGq}Yr!G05_#ua{ECi!K^t2)cOe2^RKMk9XneZB@! z%o4c8S9tO1ZxGRWnrTwh#X65>oDv)PT#w^$#f~vuFV3dX*m3cVH*2o7dn}3*l`~@@ z+O<@t!Jv;9y;Yvr9p{DAXEN7c^jt?|=ssz2E?WSSqC>T!z=`M;dw_15>SI^YD5<9_ zlA${=f5z3slJ}-zqq-43U?tk)kneuuDf;X7vO3N`CXD`Ts=z@Ur0b~2e9Y8$wzWEK ze{R30<2=-TJn92JDoyk@4+BH@+2*W=3*0In2EETkLg9-~YZ}T@mtuCTmv*wYx%ybG}o+vimjn z=@;68o_ZbY)asre-erJM0deCO5JKBkTH zG+D(I0Sf&=>ApjOY!;MOipEZMU(Y6FdkV?aKd(hdw9pwBgQ%uMDp#NrKAH%V-cDb& z&QtM?Wqr~HYG|RVO@6%BaKW!->Vq#EawY{BjlFdalnp&`ft@lF`+B&5Ab6!L$-U-& zbFr+ls9V5K4!V63)(;Msljah`=B^L=UO+ki1)u}$(wktaf1on%YsN7Rdeyp|Z7#18 zn=NnDj`liFx_t^&Yb7uj_+kB>FcZTe?Jg;6Ayf-D2a1MDrnyGd#Y^&b5Xr1yt_`%g zI+WwNVaO(6m$v#OtBs*oU{{iAPfkF^_J*_gaTh$|h6z_mBdGBWOgH9bGEEX9qRN)9 zIT|%8=3VT`GG9PpCus4mWyMAecD~o@D#MyH@Nf3`sswc!Lf7J7N_yaLtDPcK&~ned zWRT3%ewY9wqG%fz`_W(%cjTw&4VwWuL{)nlN2(9PD=$!u1nr<`mvufx0!KB(IlH0- ztt6AncZidxQ1?R}t<*IfdT3Ug(F%&3B^X7zXr-t|us70dSAgw2P61+TmE-1aW^{6+ zv1mLNB(MWO$qrE~{CJ$28YFUYM9#+KhrV90t~T&xhSPp*K$7>orqR5eFonhRjD^{? zgz^N7tYudmGQ(d#pOSKUkj7XSI$TgdvFCJs&Q(OpwJGiAf-}PI&^VwV*fj>pfQ}fM5;mE=j{*#B?6d=cTl20dmc_v$ z1^G{bT$hEh*C|$-3PD1XRv2B9w2Clc1 z`}!*qJ`7YV%|HjGBS##SxCJc)?Ts$Ks1HWNy&+NyySt zFQkkMg_=T|`eXl@j?~Cd`Xd*)v&4KWTiGdJG-uE%rSOenH&uU=JM-d2${7uuA^L`u zx;p!lzzvO7Io%{NGR>nyLN=hUj}52NoXP)6gWchL=|O_}fcnAAAnHwOCzOfM*ga!D z&gEMNvpj$fbqNQds_n7hvz@L?e*V$DNXV%&rAp492azP3pG67#k$Yg9{YdR0KF~Kf zsHWV~%nXH%FH?%=kogNF`JZ`1tc%UGWH}>eJW`HjrS8(~my=1+{Z?j=j(7Pjf8C(G zbKT}zCyHb)azA=G+teP-jPCYEwYm8hRbXVc#3VrS^$z$l9W|tIeKRR=);b~MwR2>%7k-=3(BBD&8*gQ60H!572rXOrG`HZ z){pMvzcDLd<8%co-a@6FQ`X8mx1l=nuFkM@T)EmyYmLOS#`>cVB*`(%FE-3lMfKG< zi>R!Z^NXs#|KO-Szs0KxJDvL_Ctt`Q2<6(I!2G_*=;ibQ@v^n1xw4jiwv1ZK?H-bi zmg29~k^Js6$`OUBYrGdz`O4RJPI=q%S|ymiDi(~Q!JTR5gG4~(OP&e7Nm7l_$ZKC- z;gS*4X;kfl_K*Dx`7L2UfB0D%r=#Z?eao%Qk^8#>wzi38W+l_bv0vHJ*vz%d)%!~( zu!BT@ksT%Mi==RBbmh>=!gF_eB)QAWJlw6EFNm?;W^vFvb^l&ROS97)lejw+wPu(; zz9++^e)c)-6uZDbAgKrJuDLDgmovnF2;4>AD3Bv7;-inXk<&(bCPbyF2lgc#kvA2 zhq_MZSk_?fXGi)h(AM-pr~q-_UDA7($Av?vgC- z&lX~NPb=Og%@~vVQI#3jD4E>N$gTD zLf~`X$YU+!z7MO70EFv$_ZL!$i@JG}_OTI;uXa8%2Ipg&KFuwb=e`)pnR^f7KAuv& zzadZPTxmHE72$Mc;cFBY__DOBLyUu!F0U}#$PPrs_W3f5vUlYftiE&?zMT}jb!69m7zxI9lqQ5#Lq@CgFX5{EL^DCaad zr6M&CDC6k7cltq)Lqg{|8-t0`G?d(0034FX=ThM#k__LEza@`!v1i3}`>-}gk^aC` z<9S9OOeu1dVm8m`6;N|mz`$pjg)UH!r6n%rW?%4MAfss)RSS9VofiF}cxYlH&I-dr za386F30=W>d>hJK)i#*MuxFVnX_cbJAJWwj1O1hG0c7Rp8uez*B%|kfRg%SPk-@y` zvAz5SOULX+IP+lC#Qo=+?cO`8i0&^5?{kGK+S!L*U9|9XHI5f1Tw23{1&8BMwzzTS zvgp5+U0usNALFmPQEfqjUu=S*`6v(iluUoX<3rfY?f5Pi~5S0 zE!O8Zq$C_bit022niU;=L#n)NKWE~_pM6`Ql=B(6=+8MMnSkL_QWidQM2_#Ko#9Qj zs9th2D7|8u>4kfXk8zwe{0^7A8N_$Qqa{t96Asudf?W+zYD zgiG?bkmcl_ryk%>O9<|9e#A?bCs`%mV9s39C*>qbgy%l&C6fAjcV!^Tf)u)mOCgdg zuT%7{M8|nicNDf4_)fE|T$_`YLb(u+i>jabwn}upgybJk%%uIhY;Uk=I)dS>&23*P zSh0*7;Nt3IGvv*)bw;sk;an{I{GWqbjO1b2x~me}wzHe)AA`Q0_6v}aqge@#i;wdR zo)LlgO;kCL0Q(v(r;D^1Fv{&@CV5)wHns~;DbVGms6NSD${9IGw*15|4>W61Oclqg zS;=Y=OfztKqb;Y0uNjz&%{!}dDWk>Spq$cuCyv32+Fu+M3zj*4%Ar?dS0VJB-$wHK z;|Ye7{gzaE!qr*`B|Gsbqch^N+0##!B&%ha{%;R-`P7^s~xNTft-(6F_9 z_3iYKOzMMI-0fDN&V~_lgNGop`@DRBXn%H!XH>W%+;173G3hg)M?Q;t%uyr1PW)In zf^PXLM6v^qMr)~VGY2bC6D0kZ%3)?vyC8c4drtDn8}s$Nk-=X;P+ww6HE&Ri1s-yZ zlWb%BoiZTKn}Qnr)Jbz~SfFBkyd&JJ!MT#U9e1Z;FiA1m%Pib4amEMCBhofZOM5ie zQl(+hzd-4RxHAmvf%Bo?r7|@@)0D5RNP!3}((hZ0p1i7{yt8(3oEyRl?ySc#8SUnl~mx31vW-ykyzRJIV8FIpiTUeMB6)E`E{)aV8t z4W154Ni0KxR=jSF+>R7Fpv=h&9kU#rQdaT0k~eHwRJ%_W{z1E)B#Pp{>gT@;AL>aT zyTpac?{uGf*tp7xgTyZ3a1^xapzC$8AkonQ_As_wsZSzUH&r@baGy7{Bi{7-v-nyy z`XaX$1tfD`Mt;LC3b_*v=eKAUi%Qfy8}>9U@X9qT%zipy%wPuknR;VG#WrNcc}2)% zXLk-iYi{Lx3CsX+D@u|Bza+>F7x-lspj(6;N{rTf`L(%2{{m64PK5&+X6t-QLE(xv z>vv~E)xJ>F*7T(smWGPyl2r(~UD``RO~z-!hNqXJ|3v!mZunb8RUWBwUzeY>ZS3hf zPIthK6dia!jlIe$GG>rj%fPflY#@ivLizNQlZk9Ja;)uJR1(;ysKK`wA4^*e!SOz~ zlw1rQ)ev3R*Jx%@ivoElM@u$tEpySP%IrWlR}JROL&i?a#L6Cm?lsys*v&6_>VqO( zXN+#NJ@<8rP0Ds>raTwZ)XZywtUkCjD{hy0Kff(C-izOmqMe<`PnmItFlTnI@?9V7 zib}uhXDDBo`!uEBd!q4oWcpj7SGMa|F$TwK+JFmMV(O+}&(eh#ZbLPO8dNOh4T^Opm(~iB? zHHp|CRp%fe9Kv(|9a2PetkwwLF)MBu3b2>H!}-<+7*QNGm8K?v_F7~NPB$%HGk;`S+-hNwC|A5T?hx+akYk{% z2yv_wKGl9F5gbdLW#s)6EJTslmsWz|&>P-2Q-;Yq(aQdCF=|#-5H^}x4bxLvsA)D% zTN6Z!^^hg^INA!{ng*Nnr=eAz8u}>os7h4Mfd?r2(R-)y!Ajh{s~%oiCGx((m%VjO zhx>wM^+okt;Y^RRj0(yw_PVQ|HcjBjn9?&d^ejXWThl<%EC@LT@u1=JGF_uV4)Chs zA6OrCoSf#cS8DaGb8dkUBi|;6ShE+&bp~v)ED8n-TG=d(?3X)v{GV)sT#OZUJv?!m zGp2sEDy&Sia07U7$NNQN}@i+*J%uu-u4+>lkR zQ37+0BHP*Klf|b+tdnoH-@E>jGc4GI-EC)Lfq&ov9qh?3 zDgKJuZbq?X%1XB5rYyy{H7K>k`rSmP3`=0fQP1Y~74xJpz|K+_wP%jK5Q33vOW9aPa}u+=m)>=^hY z(ejCPB4A-0r#rJ?H7GE-rkSB-8JlOH1JD)vpy_Ymce8%^yUmb{w!^p4p)vi=cU3RN zH~a-O)YzR4`)7Rc%jjsqQ{ODBqae|O7lsf9>MDbuVn-vwavt2qwv4=+fEK0fi{Vh3CGW%xHM34tEinA8sbY)>mS63)a%U4k+HLp2C-m??Xv>_sQ z5jP`S72M2)CbdEFAA$G<2#XoCT_TAD9rwJO#|htYZLXwrz^ot3oK=+whkzJQeIc^r ziKCB}^wnvW+qGk@KXlF06P*-{cfRF*ceQz7b@s^6UD$-f!8Lz+u%53*z0bfg{~^sj zX~~sED3smRw-G{Si65U6a{w0eP7PT#lt+Qzl)n3_MU>tYlF*tw&Xuf1o!w+e&MN4* zRi$U0bWUe?LHZKDVfc_cuKAk>_ff`09doEElFGVZq8#(B05b}oP2%b?LY?6j~bR%>RBH0&0;*_ox;nN`G+6XXXpkF%gVU;(7= z2(uZm1xc@~wo>}@BD}YD%di8w71U(ztatBe-J6~ZSIIEJerhiI9y>YDz1sC=pE<@B zP`C0_NJ>dub{rHWMy30FU(pL=y8CIQZ)+c=54_C3sEJ0ulcF(;Pr z*5icIALoIAHSnw*iwH-7$07Mwbq4mmCFjAT0I>P~r;fyZSc>@}aSk;keIY)xw^uuQ zP!BmcxO!&{S-4L?bfcmZQ#eFx(Ya?)Epn6tJ9ef5z-*(=twt-YrM{{k|v z<51)kHIVcce=B0RB8CB~9U$`_$r(fQqjrOqD+QTwgR3tkg?tn*x)IR}cjepj>GiU* zt!zy4-?Fw}$5*G6Lo3>s<>fQ)-<|RRun^~A)0I$laV#KJ= zt+s(AD1O|+C4j({ld7Qd@`yN&1iB$T)c1MQ@&4T+pUPWcg!3}5P3~QnP-HkOfag-e z2j22fL;DyF%H$^LR2N*FfHexe;u*fA(g<~zX#2IEv!av5lAx-03FQ-6z-t5Xa zWbi!w&|f2Ze*i(VM^Y34AB-C+70q{bqNK!>l)M zjhmhJ84lAD4m;>me~zz+;5%iH?zdvXn za&#Fy@S~e|L}W*AbiC=8>4Si8MRU_TDu#6-XIdf}f=fe@gjv71Y85sNm)t2zp)4IjNNy14ex^;&s({gAvH1s=yp=-Wr=6M?ajErE`PO z*QJc=-CS9uosW#-a_SNVM+)gebD%Ll_^SKgH0t z9OtCZKzMQ&;ai7=6TlVjraZ$VoS)*U9Fi4l9!R8Y*2nMT6XfOJWJQTas1F2CwhZH` z`;ro4f&q^fRr3)~H3EMDIETAIoQ<*mm3yj<&j`eTnY-n;GybVk z)#GQCW-B8pRf~T-i7zw0T1q>OHo9r$5&tc0RPYtmu?em{v2K%`gq(cTgG;HOS5TL%Fd8#io;i;WU=yzji#eaD zb>#)B+EnLUP87NhGymlgaR(HQnUv_1cK50gDk)BMs5dE7sNw^jJabnuVp{F=BG^~A zckD`(Rs*J5SenOO`rTp?f!s{RDQy~>zIFS&1Hgg%fU(_unlK!%QXTRvZ8;c^66tlH zC{WNVyD+`QW<4!-kNB+yLzI3>OhJcp_ejRKMASCc)VxjqnuesAY6mdh$8FuSLp2c^ za%zzwl8l0b*Oj$^tI`DgyYj>hJAgQwp{DZ5{?lG|~Ml7C0%t3E9Tc{Sj z@;ig^TV<%?Gajv4`bfkom}cd%s)YKZ=#-|Z*9zuBdqTy##;dW3fsUKXm8+1 zN=|?$2;CU(4hSC`=~PRYu1P4Ix^@-|59Q1o0N7~>K{U^+tqjlnhd$%+$jvax`(Nnqp@(;f zrqU!6CKeA-ou$yC+au#nSB2==1cDG#^-&|z?>-IHt~hQi*rn`b#KrB+iC1f$gEM5T zj(VTx0-qN|sD$PWh#2`A;Dc#FJugH3nHh@|0MJoe%BkWA_ML0q$vHmXcE#^cS}A-& z&r_^dxe1Z(XFr%|x9MrEZO!Upa*vvg7E^_d;3t-u6RZ*s z2!lBjNZY0S4HPr(=mv3vOPDJud^=NKR^Fg?7U}RMzNu-z+*7P(w74Lz%Fk)|N#NQB zgoI2j%EvdfvbO5G29=DS_}McGPs6uC*ZSQ8f$85KtPYfTB&WmxqLRLzmGSfP!j;@> zY_D;FdTvn=;J?>=g8Z1D;C$Efemo5?LwcFtXftV6SidKXeN z`|1_X#F-F5fR4COs(n%Xd+T;KpRB1Q_D}u0CaLy!_%B}yuTef8G)Ra#D@ie_4DM+K z?3@Gcmc-=>hwmBGn{!#qH+q)V^?XgClyNtks4r>oW7vY~;H5=dSEg1`Y$G^f$n(;J zx4tYu(+5M(;eu-amjVepRXuadvQy_S{DDy;!uQyE{uZK!MH zi2)WM15p&yOseW#Jdjm-}oOT*N%ed=*inKggIeP3gn^Fb((R3l}fm+mxwe{Kzdh{fe5asNMHR z;xbA&MDna72NN}j6uTtwbq|5#`Urc3$o6p?pC&6;nNSl1^PNZqzQBhtaa75RFuuxu z`}Hyhb(KEmyb1yX#5nP%K+YAR+`F9{+EF_e!4eQcvxN4sIsfujuVVdGu@T_D=r0pl z4qO|jqGT#YY&DfVn#Psq5eez#FRFRDAZktiQgx7*M%Tv|@9h&gM!d3eg~DD%5sb^o zB+i{)>uCyRT2Mhe;Cv}E9zu9>nnU}jbivx0)<|B#p~*akEv!*2L&AtB3ml1r>~T{Y zgNEstE~{K>+?jXrWs+!8CM}1KFcPWD*^=gf4j|dvVrWIb(W=2=Encq?C=2a#{9VZ- z`{TXygFb?q(Ro6oik6i7GcU5r!=5d$Z3>nfN*-vN#Hx2kEDo7l;ZQdiRJr>{mCE>? zb^3f&UtD;RS5Q8~AZqzJBr#XsL5PeIfa~t7ob2p^DVDutiRZP(n|jSV{w6kBuRe2olu$WXaQU?l zhyB2yhL_y=o{@8iYL&hZX_Sz8QI8g)xm9-x*PUCH+W1WYLF2aamK_cjW=IgfuK4hy z_*ww!iKx!7k*{Mt(unVwIo6ncf@xqkgyg+&Z`Ef_v?0##tkBzP1k!*Q{A9ls%bD3Y z?$?jC&7G?QP6E9m2}H`JUY7xz5lk0=hX?9uj|y*YvHI3GGjM4{gW)&vbo22(c3G8| zcSoGASE~G-ttX0=6 zW6lD{{wY-%IX+qM?`s@zWY$dz*jzwh+(~*6 z(yHfz>|SwnAHwBkL5+L=m<97StIzan^b28ueH`(Kz|e-QcJm5%U#;7r7ZLZRr{znu z@*8*g=gsb4+t_HkcBwO{F6>%$T+wH%U({qjg_kPNUijI5>UZ~auC;u;y7iuJE{Tx* z(g3JAuyavW*G4`)X#B$BqW4@xsk66sr^M-x(C?*#{8h)!Xp_^1&{f@ar-H5gn|I5U z_>{XHHzSl1%^}}2;U~Xb*}{8Pj@{=q>IMD+0_;tTcYxb{Rv`Y!72IjjZFRF~6sWIJ z=ZGM`sjg85iLA6J8Pq*7kB?i4F!uNhkj+t{8Q^;vy7+Bi1 zT7)%0eLjo_*0_I)Ny4K2YgeeBxpw z0sq&&XE7`_ZQ32#*n~82nWMpjkmC*6F&;{4gv48k_roTqpZ{{u4^rhrm+yAvcFaE* zW_qG#tWe?B$GT<_9>>pm;`f~xePnbi#HU7q(zA=6{0p#r&}^$DUI^ym=HP1%K1#bD zK!(6Ov7b}bUWC+~qUByt+1f5NPSJf@SHz$d4=SF=Lyt2LL4tM2HL?ZKXh?Wtr(ih?xhcCiI zk;UMq_={o=3W{=01$93~h|g{s$2XpPI577S1}WyKbUvt5 zB@6HIRwO`08|0V(jswKV5QTY)SmB+t@y%61p;8PgI7D=(#T}rOin^*k z4luPrz5h-*nD87j{)AcUp#$ZDzgE=Lk(8I@asR`{lROu5Er%tX#^NDm-1TxGzSY8V zXAfR0V1(g~WG21ge~>wIkjEKT<}f%0K=f9ydS#-nYL`KsCpiU@uv2@2NISO|)P^0I z5alN?RcEZ03OOWbowgmuQvI_ z{?6AGp(_y;O@REWB#T;gm~(`@p9`-vU%<)wYii@bmiRP&>+U@UWmYu5Uf9(KSf|Pl zvR^s;tm~#-dA9oNob!n+{dDzhvCdZG2;PrY%oEF^;qhIwR*jEMvGl>u;5oMKll{xV z=&ts~5f|?OSEjYP)sF~AG&{HQ=gl7`2-(%*A%_LoN0E!ljMo# zBQS7~r{ys<#lrD{AUzhgpNy@K7tea9m4D~#X$;7!^g-z&%Z-m$f6LlTMO2OR4{s=# z4MuzP$t{KmktRWl5wjfPrX|%^?iIQZZZJGZ>WX>GODgTty~_J^LB)!bd)dUNjZJx8 zF*C92YEj|U*7(=NJry-Kj^_e9b5|35?W-FyzRJ~QRr^gI(sFk`uuUUx##a3~CU^aI zOHF%m+&X*B;r7PDBd3o+IwLVQA5>N(pBckv3?&g!i}TA&ZF~R_ zI(U94!yNLhWVLGSqce?zW$nV=j?R~7`HjvF8;GFpdp*BIE-G$>FHZmXQl*P3-|-`R z*;hY{LS}`j6x?juE3Ns_+ww5sBAhVin1%4tKhMJ`PZxiB9?Qym>FTw*U}_Q`;1)FO z7$jYmCSfR-3m|5g&`Iq0x!a^NDj6O{5Jap^k%QRb%~`a(zrZOem6D@G^j;B~*rzfK z93~)JJK?i6oPCn(klWE138m6^T9@sgfT9h}m-uA3Pba`Lf=hK)lS_-$mt8}CTBvkU z(tfRR>(>sPM^JNGCZp6jPOSO*IsQL3P za>Xowr9zYs&P=FCQ-|1BuV$Z}Mc)gwPwcymjaQrFX0g3Hf7t0dI3xHrs7*8gSmTd>UXl0c^Q zoRSk+KwPB<7O73S939CA3FQC8$aGh8m}2Y*fm=B&Fg$H^JL5U^EFN@xn`BVV&AAjD zO__2pE`HwuQ)91-Hm|oJ1NUA^{E|rk?apFb?#*cnz*H-h=MG3mIcPn1aY|b{y_$Q3 z{RIlQ$9(~_9p(&v_DRGJ9NwkvzkX&6Ng0)vGPic$!9tkZ4la)Pt#!k1EilN3R<_;& z9kXxVae6oaFTLXRlxAEC+#=mF$$=b&UiS7CyHOo=F9?PtU*DB~+$SPLhwH-8W&(Ow`Z%+y z1b5km;%)SwxCXKtC4{8eJ2*!w*{YC?e72dW_Gtjif<6QWiV+DD4$XzyPFG%Z+u*gY zoT85zjzb>)n|JH=RCh&Py)pVE496w1!WcMnC~W$&hiwe&8&F%&eVE)V3S`kkl|oYyDR>C0zNOy&JJrY#8+;9ntu34yhx(qCCs8sI2z~U^c==B@Fh35vl;qO zE|&fj1@TWgab-`^%~zNSk;DR~MH$B#vZ7v&(iPZmkJcZCX64U4i9P}bR@|Q$bGWWw zUx*Sr=jh{U(q3p24?XoIzRo$XWyu3YQ=4s7 zUYvc#T>CwtzsETIFA$Tuu3`v%>`)>}a_2)iNY#a^lX&+RqXHwZT5HLJ+8CJKX0*uj}AzrrY9socsC7UVFJ~Zc8?+^llbK6Zn{s? zBJXN326$m4Jt|tfUJ4bkD5Mr4Q9`*+axO+3rD6pp{6BGKPTlcb{{2oYK1|aW1+8;@135#* zypz=DR#t268s`(Y1Y};@28V3I1P?Z(UBI(ic{R1@EYMj|a_bKlj9U2X#?lEPP@S(V zb#q)Xr0vidAC`aAu+TfcooZRWMY+xKYEfxBhWYY+HBiH=9R@GLGUtkmR!Wign-8Yj z?-6oG+a`HRkGV}iT(|2EZpYrtw`b_`(*Gw$VWGsXX;1$6OquNGP3bA5D(P?`^4fPMf+Gy7vM@!JyOHkYF-0E)@m4Thw%nk*3v)M>Y4 z%%sDz8K5Myy&5QT*UOh><&p5-CihT)1*00@sSgEp1c5X*EKibjD*A-4?k*68;U(timC)aO;?e_9{DLTpZOkw`eHZg zwxwTgn-nYJ^MGp!e$f!*!%GYdiH#s(o>-~M}qFgGG}gpb&h+! z@SzoNNlxb`I0UV-@|b7XZlT!U@Td(6kS=4HCf&OTu|K;eUw!%vuj!ZG;-y5KD|K!9 zX`z4*R^v}#ZXq*EPh#&*xHFFps&%vJt^-*gN0GhPjn<(%hVUMI{3Og z^aYECAmrhtd!5|pP=W{9R^nV-vHkQ))b)htm`nUR(8oqxG{s-k=_oSP{4H7d4yfik zc`6bb7e$NM`n^t22TB84JcKBm>=Z?&Q{H_MdbbDT^)A#_`@e$Ac-01}fUO)vo1AbQ z?;j{h_`T}AvzVNX{l}NnU;jOK0Cw?-J0k2K$O)H00RBWXRYFauM8VgKo6suYDtJym72s`dVI6htiHtRkNV* zp(HiIZ&0JaexYf%)Xn+sJyeIug>4|{>w-n!OdMrre^fw9A4q&2;uI+@J387a+l6)! z9fJ^oQgdeR&BaCIZ@O?z$fPFgY6#7sevPrnd~KOZHtSOMv+>Ou_@-!PUD2?t^ZFRO1>i8skygkA z{qB=hz{mD!xlFyjplSk)@sk);7Uo^pCi#2j-Qy#txL|~YN%^_qcQ}FQ;TQ_$2-C+> zgU6@&yc>Viu`itcDa%#IKClY18Blq_)ENd9d0lH`szkqAVi+RIX`+iP_3%^)#_Vr~ zT3)%@Sc5K;=`r4;ITvCct>G1Qm(FYK+t6%kEuvgK*!!#Pnogp>Fw#WtgOZ>nDsDv) zBdkHrwv4&?+Go7)aYz>X#DiUa=GUu_@hTPL*HA$Yw^`8ZZ_N+Fi|c%Xwtu^xZyd8h zi`8X4c%EweEW-C13&y#}S6#b{3E%vqZ1QDO>gAc6CCYmfi)7X!sh+tIotkf1^_=&_ z_zVOD7%pC_o%lvzwkI_B&ir^I-IGQ6aXIt!J>V(0g^^=njWAg9{@a<%)NhxO-`aoP zce&{PE#20afi5f|In^|g7bf%wUsA5<-;0(X>OzJ_DS!24Xw!p@iH2#7G>#``W1XMO zdZ%jW)YvgN&{tZ^KESPmmUZfk7^GD!G}BHi@YOU91%-MX+3-2)g?8<7JsXM2a7uJ` zXo+J$UC}`$50BaMfUQ;>EBTk|jPLuEFM>;wD1y=@YgTfvsDP>XZ^`sEw;x@$;1&1h z`Ohd`ey$6BTnEKayr8x~)nqh@s_}i`sk*BWi%ozhE#V#0*!J3Jyb8p^_P9Yg|kBYi5 z_M?d<-;}NWLu6m*M)n1ieI`!EHDlFK!KHZ2`zGNhonE@~90?mNdJ3mY&IU>Vk)ec` zTljj$(p^MVa?!)y{&hAxM0Y=rxhpx@6lqY|r3eV~s1_A|1em|$XcbpY#vkDg!j~LS zTj=3Wj>kQd6IWo_aB`tYw@?ms9ixKH3t3RK!(v|AkH_;inRO*)D@nhcugOC^&mjV` zjJEc$8j>w>L&4aaR11F}Y79<;hhm)XTa4 z>m5IOdp^EAr_6qMho7M!)>Jh9b;GO$4pW$>Qe!?G{o1{*KXu3%D0bb~pxB%p7cb4l z3%t&84HA5W+LF9M9#j9o`A+PC_n7o19CBvdiQ~@T_2hO8RH&_Bw5a05IsdhkDCcua-)TO*(0cgt zeM$yn7`u}JHK&u3eI4OKtQjo)e!u0NL3mD~yw;F4!z1fOrJzk7)GGWj{lR}_Dfo-e z#~qF4mzN?5U7j{@86+~KwMMr14{{#8P&eNC z&(zAwH+iR|IMIb>Kl;SP3su{XSLN6zBZ-d}pup8t?-H}4H!nEO_+C0dW*0+UML&Zc zl@(jYTbJkJYhVxC7ta@tSYCPm;3Oeq`n^`2()`YO6{)FnPb6~}oUmhKDOu$`$Uc~+ zmKvf0_uINft-#+C{_Mwt*ATrX-z@paf7W|g%sxQUz8h)3n$A+LCHTt7Z3;KYM zyOnjmWeH;4GP~o2PZH3aQVJSh1)_Nq79185n8+D&dRA&evijG_Z6u#}P4w>vgxV&+ zBbQiYj%z}*bM6C;Sy%KlvnI#E!n^z}#6UpeM)3J0SH@WfY~XPgI+Wz}Z&jx=0u@b*?P?`&>skBS?!6jO zO0x$XJ%X>rxxyhOM;T5YiQT9tgk8X@Z!-#?hPWh75O)ut;B+WAh_)q3-T{)QZOJia zC@cS0b^N0+uy8iEw>)xB5O{2f;+-Uf&5c0ClliMCq7S=Bn05x*B@y$Wle^@wM9WVxe93{IW-@ zw?s8We7e_*)M^8G53c7vp7-T%wU9rbUbd>D*Bw~Fzjejg<1g^x%qyv&^k2H4z%J5) zh*ez`n{y*0L6hI&9zRLY$~TvmF!sCTEX>W>^;v}!@nn*?|9C{{D!*6y{niWL36C7u z4|&ty<#sd*utgDtFzZD%^~RkS-v7Sya%WPpG!8ER+Ubw2Nk`WujB*S|C4BMYL(mKVvj=;Q``M%H}|;#H4Hv_Ova$^h#O-&&ZS_=ucUS`tAO|uhR3jgL-_k21kF&VQM2}7?LHaKN-QE_!Nmvf!Gw#yp8ICeiUJF`w1-?_^7M4Z>)qVRO0`uUKIBL|^GVZ_=<6X-hgz-#K{l9n*+|95Qn6BXSsW z4wZ)7LY9Y(s@VGK8jyXNA{7e7YhMJ#C<|yu9$grI4>`u^YJ;vfE*MOC;)htGO>;_U zx15Ei@9|r1uzyrmz6@(-jNi|5@n;3-ub&?bJJ2126<5@H_vCH2q_fI)rXWC|e;cFEEY4P?~7g1r|T~kp7xZOB>uVkn1GN;q5Pf z_aSreZCxsRWZqd)k7^64Ub4J)Tga zNn$)5=pP%xqDtW6Ln%tN{j-Pg8-7?W*f_?+olh#6Bqmd$cZa`O68v;Q>5@AE{SD53 z9o#bBZpTDTrrhrHRjXT{d!TP7v}l(xY1{IR$P7y5s|G|OYip59BmwrYbqQS8r1-Jf zMCS5zJvBo0WRF+`oXensw=%ve5*25Yrez!{yxZxNFC%}RWU6-U)Nnwy3}P*u>@wVB zWhh`MPXi_zgW~Y@7K5TjZ+m4gmyKMzRC6;)kpX&Ij{P%Zs#FUoTSlmA-h`ViYFhmf zG?Z#(n$dAU^Qu#Xf*C0EruE2qd@-}9Z=DORh(U1FR}`!RZ)<9-)x&%VwlJk7(g^Q*M`=netVW}2SO zH*!N;AKTL(ucAwOv!=Ep8Uo_-O|B)mdsxP<^M-0J__;`<%UthUXw@AL*YA{=wNIdf zjsEHQ`5gAg=Fw!MjKeCcpq#G8d&YQRQmE`P)qaa4HGE)d{HEQq?a(pzw{wL%M}+-c zN-$pI$=4f8pT9K}2etjegwI@R`_nt=5pSbI>KYq6dZ=wKcPg{A&L4rnoUy;ap(7d; zp{917n3pS#2|;u9*-YO~?Gbs%VQC=}P=P@FcnLyEf>ifeIqC|2BEid%3gt|d4v1gE$ZFYff@ zdA~V7lT0#`nR~XZz4o>B`ew1VnU$*~v3;Uvd_S4?s?hU$M_^G#lpIr^Yw0c08Vuy= z9Awv$x&|Kq#0oig9TsYjLrZHw$FLZ>D#5MQU*8n`6{_d|dB>n!#Vb5kuV1DukH*v9 z6yMqjOmdJXAG>EE=NH>8KLyIyEm?+F_=OFnNCDW<%_(g&tA`ZX>y8+A|nSRd+NjR&pTHjIdc;bRDUe(m=R zl+&2&Ly}6Xtfqa4=Bqi@2T(eYEz^>Xest}pEkqI=q-RH!4@qP4039*tA}c%CI!b@0 zgfb2Ma0G<{PKF{9sgXTsRL=3= zj8fVah7??SyP}Nj3fcqFhxNIDzroR5>EYPqZqy zTaiR?)gkz~Bro3BC69w6V$x4?|1G%ToX)QNg)#!0;q9rjD@pb{dO4fz<5V5UV7d0v1rJ0ego z#!!vL;ivz0w6UbY;@7>L7=lbY+Kn3eLO&;>N-7b;f!#hha!8;{zxkBf7{Hmof68Qv zVmLY5Ns5G)2IK5)#$$>zyJ3tLoC2*2X8z`Pn3MLzq2z`3U>Ovx0FcDzap&kPI>}qUA&WlEtRC_HD2t{87gt_kBqD*y0)F zX9DCZ8lk*N;@cD!qOIB2LNdCtUU08yaj=5k_9n;Gr1YzPWM%J*=y`MWqyqqWS*^Cn zwcAvX;d)t4W0U~}7Ap7JW{xu0Q*`5%y!X2*iLv^>2cMzeg9WEj){%MjAQ*YdRc-f( z`o-9eL!HId?CO;qBN1ga(ihcl_}!=wK!FC|MfPwMnhTjN9aVKlO+WCqK`-7PBR{#WdRJ-{pF8oY9Hj#D$4LOV;8tVZ@d>^oA_kQY5-(R zdfN(A=lg&L(ziv0cpuGBVnyVT7g_lU*YvAaV=ridm1lh?1m4f|tK15G?30r{w`!C2 z4#zSfl4Y#}T$_a185F68OAp3U5cg>c*|}Sf>O0K(%`y2l!k&wr1cHl+fH{xt03*)> zlQN7pr33+x(8{10=c zQ8b1&2B@BlOF8l=u4b+ravba0@4a+H`UeF&*JTX|>PQ|K%_gVEq7D^hfPX+kFT;5M z^$G=>F;a+K(v0nw$T?6_BZ>rw;+2kDtJ?Vq`-#cAJgwCW+0$k^2=eX^NLe9Zs3GRZ z58oVK{p+uTgGSV@o_X*7BG zro(169DrMOasW~gq!1(gA|e;}Qw$kl=&EO!1uzkNL0RMd@VQQL)0W<3EC=TAC$F#1 zJjT&&SzC^#n6`LelGS`+*_c!FQvFSzNZ!H4tafDBduk2kk9RO+Y#n(z{M6*8*dAP_ zFV;^WgNRc6(paspN6=`-1ZG;CXHly!-y%f8i8h)PuHRyL8R+Tx^~^V98eiEAK`e3$ zMEdN7Nis<<;^!(4tBsbc&naajIERMgviwH#*9L3DpPyyE3iq zkyEaiXz^IYlza_Ezwe<~=9LHt{3byHhgYjPn+#BpB9r=DqzL5zaIuEXp0xEaC~xEJ z-VcTx+(ms#*!_TG1-um3n^Sfk4VJhsP9kwe!lB;i$hN#rYAj%zXk= z%zW|R6bI~+VX5GQ6hl3H_tTLeqzQ~WIrjWD4WUVkEwyTJTIk>6zp1hs>%#YwsVvQ7 z!uh}8B38;D4C2D=?eiEAWvi>gj8-)g**A*t&oJ*~iC0NhK6N(dRHXf;^PS>H{xDJMaI|vx3YCS@qNqi$grDP9y~d-i0=jGUNsC z;}ihJd8IiN8D@|(0?5kIP=YbymA~fnaKHT9QTcL zvh5jVJB2&aaZpOKqLuh`7q_IhSc!q@nppNX%D-4x}bw0>6f|e@-gzB-d=*5blQI&Ha4`d2~ghDp?i~!V+ zHzy!&Ftuy2hl8&h5sQHWoWJX#KaZ)7qGG%eZa{fX6k|XHLVDZwntoZ57S!;<rhLXw(T`<%sw8`)r-Q1&8jf`6NKUKjWOBG*yve z2E8^~KQ<2hn;8LjVAMPhb10(qF83=+2ti^K^8Erv?UnzzKSd&%XA2S*+ zp;w|F5Ne}`(NMJN<{AS0x9P%jF|{amu-(|2y%!0yQq(gmNok+VU$g5d*gGim^O-t` zh;%>GiX%%*ye4!yhBwjgwZ0r?*d2FT z>6Lw}SOhK(?esKEK7ZT@ZdjH5oCTKzpIU3Ouuw7eup#>mxyMV+Ql`cK!VRup7oOTa zeiqi*p}pX1p73Lxl0i5dbq=UU&28WOiR0XF%p1sTV7(s^rThH5H2cS99o6Tk-LOT- z>seDxeR;l)XS~?y(zNI)I z@CT$VU;qm4h8v%t)=d3sr_M^`@6nZW9O-7#W@yQ3Tghg;$e!1eVZxW6b8&;FO2^G5 z6J#@7<PF4MyU{%5xhNS&Mt@7M%VcAv%;wHP@L4SBuURwd zcj{Q=i9VN6GpKkBgVCw2!Etn}xsFH`j9OpTPU%9)Per!h`)8UhO95_!#-e5zcae5M zm`XOnDF=wi|x z6%`Wt=JP4A`QC}Y5GqXa2-A=>tzjWRWeQ&BL89Rew)$2cdXvp?dX-e$TERf+Z{DWT z!Z19Q?jP@R@4tOWVK4VEgZ(BNbF@g3@&f-1C~KJz;!-1N#mVTz)=~kDZcU|SXRY;#}xSg-na(rRXt5x6I zBuN@F37b|qKT-s$g1|Zm{2GZm8CQxo7-gRZgVQkMi0Rw4t-+sP0j6-GFA28q4*t*r zzoYLl%tp;BJv_)1HIqAhlsdB&IT; zT@~+2Ze9Q>$^$t|pW)E%Y`CyP_QaI3KCxBJQ zY9&X!ct=^`3AYPWnUydMb*A{Gm~Wk}S%;A_+3D=g85G*e>yTYUdy$I3N|M7w%ur*g zVCYfM9~3!>9NrQ`m?M{4sJ2K9Yrp|XirCS1d6%cm0U*7K9x$Mon!h{)vqH38PHn-y88po7&l+OvzWEG5 zilA7De}Eo!;TV@z&?+%I2(0~9Va2R9-L|+Av746Y!ZZd3bXMH*wC=*|(fCXy?sIp>5>nmf&2;xSyz$d9KG^QfKY-<5{KP*eSD^v0nL?H{utXw=gyF&$s^o^^d~qr@mf?fxgy%M5kYr zsE=;wRl5S7XK#bq`-IR-GBOXRvv!_oAB4aB0}ursI9*NO`u8%=uFE6P3zfa@Z4Y9$ zZAyT^uU5Vu%;ID>Gz~#g;-=kecE0)h)C=%RGg#f6z#aS=gKyG3us`7Ijoo~=cw_!? zW1pyrW$8ZvxAoNigXZzAH+Yi zht@w(kNchcVaDqcT{sCmyooPwcywyK?oL?twFuakuAAlW<{m_6Kz*`a6C3||>($xe z8xZ;XQ8782}e*pP|_CF7N2l*xtKUFTA^Xp{8 zqqAFm@#@}R>x%0oqD6N-bv5Gw0WU|)*S_=5+&8e)vCURb43*l#sadQAwLZ6N;@f*A zH-q`tKYttEO*qLneEux4ax^s62N-nPWiCj`{n;Fwj0BBdb&Q7ob%ls&U`*XzWL-J8 zBr#Jm#7@-m2plq)m(VhK%H-0a<0@342I4!b+$CB2*@1<}=;;aQNLo|UYC0mZLYlT@ zn``hib{Az!vp0P+c`Bgxrus7y%$+_&5%c$&_6PP=I0k(cU1u z!J!gST*gg)6s8pv3$6v(@1EiRcnn2Ghc@_!+dp0Mbvg}z&?^5MO2nN7aGp6gCLwSd2(YH{JGZU`1Y zQ@{hEi|MpC9lB2vE65^uyNZ2%O$_(ok6&p?sG09WFD;LGD@so;8&k^{)jYx$7BT$X zg@7OYHDRsWs=#t$)dC^MW5~h`lG0?|D(~N(Up?p?E;l3PP|@OAzTyoY4=(TbQP>j7 z$_+%G$DrhN2l<^ zNR!cEAY(21FrNnKmr3PksJ}wGBIU`W(%;8>Wx`l(c&_OgjmB_o3Bh*`8n9XVp~3t* z8tgh1;yKgzo}Q#y1~r<=A#ZwECso%$@zC9IrbV`&gf2UmAm7g`sZ^$Rx(a79Z}=q# zOo2?IDq6fvI5ua7{10I5-3P_Am+9LLbWB!zTQH1@_vLMS(6cg^^NfM8{t zDvJmi5*8Zi8nY~q!-j*dO*C`hnC-_xX!H!O0T^bBn#>2|6_RP*B>(90g#!~1&7X#v z!0HgNty1?ltUe~XEE(@{H!%bOgt@v{wkgKUv7ZAM2>_`PsK87pc=a~s6Te5H0QAuAJoh&Kx@}un zKM~PX>inwrculrDS}BF%$tUH$P+pQ@)Ppj`V>x&g`&s*n^EN=zO6r6W5apEdW|Q@l z7iFfM88REY@7=;i6A4*1CaC`uHz9%IBPYld7Ygt4* zJ$jCL%Ilf&Q$u^1JEopC3aV*SPl$-#zVNedx(i$fi^n90+x@+JSpZW*hlMZ644p*h zjth1cP6Xtadw%&bD}Fz?QjRQhVE)s+{)`fkbMp%6q-V~=JC{$=PCP@$yZxE(*gpX5 z_&oCu@Z{VJdE~#^?RBrqlLTo|em$mDXkbLzVTP{_K9dK0x%Cye#kh$tlDY24_%4oR z6utXguo`6foEYOCIR4n0UTbfD{96#utIWGSKy>>bfH@)UMe|{yAY+y?XmoowDD|Z- z37=$#Cqe%~+&v%^kvMt*FXhKH{{16I?niCVFAq({C-56PF3X$1$VNCeZXO%@F8@D( z@S}0`%i21&Dp$(E8E3)oyOPJ#7mYwCajr6vR%<-Uf`EU3qlX^98@vnONBfgGuNyAw z8wuBkms#n5fDuQL_0E5Q(Z~~m!?2T{mD5A_upqC6o;t3_<@^J&_4!uExkE$B#ZfB5 zbw9m_>74O{I;Y+9ZLtG{YwfS=gYHVZzxVVe;>FXOhJSz*uce;EkH61UofaZ*MGfle zKKS%nzl8M`pIOo@`*F2Ae%e8#Z6BNV-EPht_K)^5T=yF{W#cszXll}_Zl6$=+^n{t9N|t;_;-8%OudxxSxKj_8{(&ZkJNYx21wv@ouutx+|=# zPTR1Sns0q72vWD^*0Dz$2PS3~O0b>w4b_$eOWtg`CsOC=z1{lcTf9D|D$X_x7fML& zo0~kvd_Q_Z--kNw@@i90&*C@iHgZ5I!_ptn8Mf>KdC2?G<);0zt#`{sFL=5cD zp7_H8S-uJz>Ha&(>VUH_@(V^;$HK|V7KOm7*DW2MBvA>>5|;NCcgE zlON^PDtRXrbXgL`ax_QBPMw1mgq*#@fJU^=NN&_ zqiwP+s1QtDkjLgCV?~o^G^E~bHv@j7PnVz-d)qpGLeHF@o*`FLet_7C(luLC?B~i7 zmzp_#zS{%XwmQe!o(fKx&Shdc?y~ULy1M6*h96@Z-Ns?j5Qtf4Hs=5^7`?I$p7#y9 z#k<5k>Q2AU7tAnxswgi{P~dnM<Bh*1R3v^Q{S3#^50+Knfpb@YJ^k%rde#m$#S~4aeSRXx;(9sNHkq+6J z#8bPjdC0ES+1R;Hc{<@gU}q;(DPhAL*y2`@ws{Fffk5dx(>XUDdp8{+>y#?-1ri7K zLN*R>Zo&!DVY`>9_WB;a1%7r*01c4HD1Us*xezD!4;6!{F491u)@w3462YtJVYJZiC7G0qmQes3JaK(D zKJ0H2L7SqRYo=ULFLR@-`atp8B6VjC>~W2HWsbpZ7Rn-4 z>-w^^dH)a4BCgL>JjYDSl~D7JI_3Av=_Bz?(C;0Z!#q_7I);-Vub_W`MxQgwn;`c` zS{k=gRWEf{(frt_FPqaV`xFmdj=BY0k#DA+@vM7WJgR5@ENGw9gD@XxKE1@f{Cb=z zTAMyS>#jn5{s&MB^vu7dzB$w#oGle%Xj2YhTRT7UV3F-;h1t`r`LsVX>`u>ZGOr^t zt<>d(b%&_p@%m5e<@gF{ovOu+8MRQiXYXE^NL@#7VSGj7Z9$h1()n?>qTtg*KzaSq zJm{`Qb=dZJCm$LhbAgEGww+xikLCXW9>W(GPd-6Sdv8m-WX|@ifAvg1lRQV=s4IUw zy-Bb+1mIR*pYr{!FA#cE@x5ilsplDbNS>FAD5H1XXy$YR|ZDjLMe zN;#L!FxI^O?4zZ3+W!fsNW zo@ibYW(&%n$)1}sHhS+}0?rCW*A{~QmwY_b>&e#4?Xfqkv6}xJ+9Hu)`KDXFX#&v2 zI*OMroZK&nhAmse0U&*)=t?@O>7=Y{HV%nOW;|{msHG!Xtlb-*<1(i3*WB;2mrJOJ zEnOu8HjSK^bWzZG>41U_+B*qg@;Mv~6vCU4tFW}1nyZ}+%(P*zKsS4QyL2l*J%R-N z_si23-e-JGd>>2mqE~O%Br3n729sOidX}H-5gGs)>XU*_I7fMMrJCPKehu|{Pw3W? z1zKE;fPn6^C}JI$zSsfk@t0L~_N&d!0L))c=!F=0$txPXNHdij z`B)EBaWfk_-)&>_@8OfHM~iK$wpwQ)`JL4iv#Y)2Z53&8GjUWmvDe{mPVbmnKSyQ5K{P# zDsT8y+Mu1TV)d=>6LD)*_FdRV^C?a-l0`e)8LfNRRGk+@w?KGCzK^1pvaIxsA&=;UKgRBPFS7LfrGmJdIQ23i^_iQ6_o zrVq;Y8l{Z8?9K1F0$)QAT?_#8GDEtQPz^nPMgsJWTJn;>Ufce8(-X9Y;E1>&nHyp; zk0Bh&VX*-Fl89E(&fy+>+DZQGs~QI zzRJV<@h0+{;X--lw_4}u!CDt$lQ)WMJ-=OUKaSVwh|jA9Hr)=c8ymBwmCJY*lO_k$ zRWE>#Xyk%?2JU^H81gp7i0_3EMWWa>LIMkbDL|oc3;&QjQM^Bgzu!H(tq36saz1-; z&I55Nq}E%(yAx8fJKw1w{hj-!g}u!`&ylz2D!t1d0ZrAWWaObwUk?8~XFiJlq`i8M zSg7B7R(wg%(bZNV-6k?vJeV!{yv~<)5;Uo+cXac)O>r@bdiqzn!e_FE>7lHp7w?;# z;4|$NrSoo~ja`Di{jQmGA@|0dnSF}w?SLEVTrrg+KV3~|4wVkaju~-1!;ib~xz{}< z!)e#qTKk)P^Qv;)qEuA8n0U4=A83K#VO;F_o*svZ#rY1q*yR@b7Us{)-0kMk_4U%d zK4XK>;W0<;a*t)Vxfq9TtD>P`X7Xy&h}rT&`87?r6Ikz(ruol}Uy$vL$r{<+lt?aE z)opLu9@e~8SlEA8d393bSeQDAn69lM+8w3CxCn7Nu}tRv8F^o1>%|AnmxA+`n9;L_ z`g$k!EYp-JCi)3$hOUleeM%=W)C7UJ0}G>>@R!+FNfktG%sv$jD8K~p7>u1fY+|PM zg9RqBXlIs0))Y*bLT7cHWY1FSX3GY{n`_>!R!6X0t*G@f+fI4PSw-BZ)Iqrkytr%b zyND`4GRy~wb4{Ho2BY9X#@h83DSH^hud;M@9a|X@k~*_6rGp(uLTZB*PuEyE8SgOK zyG*m;YtG#Ju}W_W?8-EUsdX}_W86zqo(q({Kp*OyI~4;;Rr;z3vFu;{EVljd=@GL3Z1`VH*TNUuXev2rzBhb8bb6g{ zmiZ8?fQWYEYX6{DuGew*j_bw9#QqPLSIfoIyUVTXAH&{RCN9w}PcL$2Zbk)==eNDK zQ|;5AdTpuH04M^ZqI>BI2*V$r0E*u7ke-9^ZI%zz{8J=fi=Jo%Q^x3Jl0B77EY&$W zmj1PESxY_V&8E@^h_Y{1Q>)6JrD=D7>9!9oV3b*DY*0Cjbnml+9a5!$H#-qW@&|aM z>8?Gytz`>e5Nm0Ck;+=KxL*5mGBr#XBK$#&E7C_87zJLAp$gfyW$X?EA{$H^7~Uqc zn~~PmNk%m-G4<8pWPr0)-t$SCvdIzbjI>JPgxpKm0?Qf1>L{-f7S5jcGW=z~ z{ACUu4b?@6GSOi+h9nX_=5wLIkM-mj^r`T0MfuAlgYGf)LkZ`0ieWp5h|JOL(8_7^ z(ciXjsgI+lrTTiCpGkx^-iM|pJ2x#n zZvW_ILT%v~;V9Dwxfi zm*9GTEPN)AH6@f!jzn5u2J<5kFb{SE4nk2YW|U}iShAcC6VNdJ+nE5B6i@URW<$S! zx>XA|`9Zm+Fl+BdBOSFhqXQ;|HJh!Xspb8|qNS%6yr!}cXtmGiC{P+H&KiT($%Z>? zieJa&0=9Es*%lJg{hb#3Y0tI(*j{SN)oM-x}0M~S8CRAy1>Kg)`0y2u8K;g}82HLP4^R3uaQD}^B50WSzGx3co> za~R>1%#v@}VHobY)d~tg6R-EQIY`~ujv2$Er(o<9U6Xb(4tT8Lc)R?lsNltYb2~x@ z{>c^+|MK^ZK;8)4Q`d$um|A58dbHB#a~|}_=J`$)&-aTzsd9f(^6&wXNG#!uYi_Pk z7ImCDR;a>Qrf%S@0dZv4zIg`IocQLuYKnMp?zQJwj;`bPTpy9AoL>xG%PlA<0ajGJ z!&Y-Fn8RI9#byaI$s-p9?ElRiURK3z{sFFo9>i4wROEw0VKw*W4?#3H8;=U!AE*DP z&ddhJzO0P@HF^5p1N#}&vOX9j#${wMK2%UMyom9{l+k~gb&XUF8w>gnIGE?Qx}#7} z0>?PVUDtiP!y7qZ?I&*vHAtD+~7VsSNN_6o5N68 z?3ck1@2jgJ{drFbQ(v$kASkva4#7}}M(4Jcto_1i{L4Q9!nE8_J;05WR$`b3?n|_j zO&BMzni+oLkbwxO64t@ti4xkx6X^h|duQ@64Hf#yzY*vFOli-o4VjT9$(!UE07Kk2 zgB*b)>N?CS%(jV?U_9@p!eBg?T_QsVzj1*8K2uCi$7m9aq!ISEVW4DHt6Ae%-_v%h zbW5Y(O-K&`ML}%UPsH=PvL!ECisGdpwvGCIZONE?)6y=vFSwT||u4vIr6!9P#lwnCLXbk%?YeiOr5-N4fy zStQKFMqV*BJMOa;_P#z0KBR!gufy+RF#=uYAA!FkRK^J4$X1w z*F1|k7K=Aif%xy)FSwIZUlERwQuLv@1z*xotG!qKV+P+z7nQLH#~48_jN$d7Dsqqb z1FP^gLu;KYhmagM5yog_4{`&0H}{Au8zlG^F@_1iSG@CAku_ELtfsE2Z;1s3(bY*v z(apqo;Amv}qdB~xA`BRL2|o0EIv+ShH-PDFg}Ry-xPgPmKO9Y())1of`A~wa{yir( zzMS_}LCqr@&C;|T6ZJT--JzM|4t z^ieURskd1lo9y(ue~OmBRkLp_t!z_@pC-!AGpfdyM#_RJHd6g9ry%L5H06w)J9ZH) zZB(DZqc$!Vc+0;2YtqK^X`ceSHv8^_TX~Vhq5F9|*%_GSzl%_0vp-R;?Xr*u8RngL z|IF3pBeV`_6F)zNC0p?)`T(*Skl(w;_-8iazXih2Wj%EPkNPuYv%!LY7i_P@6%KDy z&BX6tS#OFJ%uv6GiElqswp|~6NK{2ORuHo%;>PvK#>UwntZJ!*W!RQ_B9?&p(L<$n z6u;ehdS@p4ZbF0;ca@ftUPCi)Bdii^1;%@X@s^sI& zW-#Nb&ne-Qwa8#A`AU=W+3owQiu(8ng8yWsi0Qr*48CLr{=yCV^$+mp8GJ2}aHFGN zfUv@+B8wv)r)8wJe*iCwpdSxzSL^>@sD40bLXX|m8JoQYZ=j!1yO;y_EZwRH(DqSJ z_z#WNCer=)#Wmdq?xqi%=G}U3bhDs_RyGpwxQuyAGu7 zwos0A;anOb6T()D~4k1Y*vO|3&UqQHj*b`z4gOhcJm`Hz8N2fgN<;pQrkJ1%nAE zvhW|kJ(+x*NjtjL6FsC^w*u4hX*WiqLiAl*_GjA0!C`tqG5dhOv~t5MG&K<^_1`KQ zX4@w)1cf_^fKIQB+9u3VOK5~4IT|-B+d%D)OJXeKiRwXQ+K1#iR~2Zj5-E%|$N1D{ zd?r{ZNz$lN%!8ShvF8AtKqM#@0aVcvxECFH((u-5E126Fj=exD15~fU9QauY zDx(IcB*ditR5$TsK)N$KLKCgHOs;@{PXDCm&1G|kp)vm}qChZvV^*vHyTs3a&!BKc zV@6sAwOLYfMX5EJaby10EdjiRtil8MRd`&u;!OK>e4Z7qC9Cj*SGu6$z977Cj*we@ zRR%#Z#h5=&D?!N+-I-6TE<%tL7;J)FYwFz(o_jNhTY(=$A4d+%slM6WB~HK3xLpvX z>6m-YhuXTPCMr8%tdeXs$DLH`6g_qgnn|utVeL*xusmdqYBQDKEBg-t;+xxa22v|Q z=W3(D;$ol!FpZMkcWmF}FA`LDX}{`Jo+Uq)POIduD4JmC#M;R#fE)W_O1=S*9weoy z-}+IXe=Wp2V%nw9ij1EM>^yE2n|`zb98$ST?wBEJt@Omj+VL=P%^PzX>uy9TC!#uo zh|=;wRJZFLFDk)$OhXy%NPGGq_hAV@>BLAXn`SIE^BWukqqb!heEu)`CjdaUb=qf+ z9}wCH#e*fvKuz+{{M9{MwO7df`F9blhR6U&KGw1gH;I)FD8r0wim8>+B2?7M1!}{W zYaW03G0$IO>1*EC%mv%>56g}fujTm!aU5ssWn0gqyH%J4NNS$;uE>}Q6M5nLDs8p? z!Fj}gzvfBw!1(f8y(v7iv1?2zRdhJxYx5dbyC+r=7ZKOzUDYP5B9?N&vb9wOxraA? z1alQAWrDfd^$ZLFzw*SUbT!MUJ+R64cX8^ZpDSt$0w48c@LqwqHfkP-mTJ4h7CVD< zzdfktzswPs1U{OYtnNQ&PZx@&4?eA*-u?q@c32;XMYcT`P!PU!BWP>91MK3EJm>ec zrVcAh1Y9(OG>hadC)~MJ8VSy9)cDAz1jd8DRqmk?2+%PLy!Jl+LPWrKP z!bUP1zUNX)Stit>gXd&4X>X->#(mImfXHin(SxZz?Q-)lg&oX`bp(*&9{}-8+o+FH zPoMvRq2K>;^%D79^+Iuf?mK)W95ytP z7$vZtKWrbAIxr2yye*hnuh<{Wi!V5RDCdD|Z0?LVTmXr9As-DfMRKbkmcVJzGWmdl z3?Hx2(P>Ni8|Hu^O0bsRU9xdV7GZ*qrK*)<}?oGuo zu9yo*y9;E_4d6}d1WQ(s$fTQifKK>nbse@W)B8py(z9ATkl6r0$E|tPCBQ;kMhypn zL<}zOuWYzRiJqAKvW*>JQg8Ut2^otPSsq|15l%oGUcOCN^bZiJS?f(06uIR_8U>IZ zG*Q4I;cWc)SAdpUZo)$T6U=ejG=XH(cHDeQQ7uu#+!9z-N>Dzp-dg>t4$p3sG1if> zWJI_?y(=XVF@LAk`(_<7kaY<3d~{@KIi@oT{7TO!c;L=Ccc>8+r;iTd+7T)9aocMD zQ)=TNkjy@cl*P__NbuW@;0js!LoP1kLgif_KnGS2!qcNGjN$RbFa((#T&LJ=SXgn6 z&6dtG%?ljrWXlygsI#}_hJ(0OeY}zIvG$t{X7q#aVFv&g#AY$fRvL}lm6QbN>=S8* zbs3|P{-`V@SSpkzs#36~n|-Ld4T3WCiX~n1=MWhqu322b^c5kkvd-^BWG=fp;kqB{ zo3P6hSah=EF)U7=wr~!~83^nDZmBQeQA`e2fuw0L%T=p=XDeq(klTQo`uc=k9A_a+ zolJ8Aw0b0Huvb{>z?4xDMPgzS5)=~*h#^d+l*PAl=6%|$2)VQRSUU}3IdzhQ1(h-ma&#KfrXhdX zc8yY9_)rsomwt7}YU$YeNNhsuKNX;*Uj4A)qUNd4Ak6op&gHd<(=-m0{eQw7%3hGp;0k#%b}$EbYYow$nq1KiXjKLL9DiSu7> zB*Z84&))w7oOW|gr(Q8H@0&DJ|Neqm2ny<})La)Eh1cI&ck*J0jm|Jn6Rn*51DFp_ zy>vSnA{2rSPb?<4+4xz5javWx9}Nq}#20*$-#3(i)JBun`z)1XUptl@&o8sF$;kVm za(d|)48Z8I_W88NEgSL^p4t^<`+DsE6{$fOLo-DZgu~WC+XgsgSu?+k%d~laQEa(2 zjI|&+c0q?xzJ?Bv5+1%f*$2NS!d16|BPk4-u)cDefM*nAAH}iPVE;?ce zIUSV$29a(N?u$cVDr4})*}b%0!h!wzVAw4lqTD^0o(YT#{EbirreppD5S`xS+&S(4 zIHE3WO|p;>IR_s%g*hnKM#+SOPu+S`U(%oP#6I5Wyft(1HnTU6PK%`u)G}CR;b6nb znd|LWf;#L+OAC$yCr;>huu^o(BfDA#;LCF}fLDV)(PEt0IY!HK7F441ht_5+#t;&e zGjw)+qkUW}u-Y{7jAbBOhNq z(+ZVwa@wbS*ck1R5tPe1gRY|6Jy-zw-B4^Y0QDxr%+b?}@q07Z5Jn|pO2t^#j@G*N zeN7gc4q?vH!7iizMS_J#F*p~arc$KO(HAF72`f2dK+P>0GL~R9YdzVgv{tMjpk^BU z+6;<2R({_!Md^4Y(A;!*)YmYO<+j5>!Tt#Y6hNmlvr%E8M zrSSl+8+xg>8Ppk&P9KNtI6lB;Xwe|{QCD9HqnNwidT``AY{w{A@^%f$SMYx`zD?aZ zFsG$n+0tvSwshG9-JtVi{{vVl7}k*5nmeNnzbdLsR<$wvH9Lc&oEAbMaGA9{*I?_L zd38$b{w06O)!>FxsQUx?;>SKXtt4&2ijP*CN;i9quJ)MD+@0Tcrbh?j@N{G>Br%56LV~=f1}gTt$`1|3vcjf#`oax3C2;70lxQJb_iPdZ&=u+yDFZd0cVS{# zQuwUOcGIHOoUCbg82Dy;=r(!BL^)f)OYO*W&=wd96dXw_1Q-+Oa5XPe3?zmf9E5%G zW1J^h+srbKZwQ_P(6%9=}WOxcn&_3AS zh9RpoB}0wT+DSfbfi~~u+-)%rUzpocb5eE1xA|KRZrv-2>V2V=hbQqMo#9r~zr{wf zP_*G6$X-bF(3W& zKk;GVg6H#2Nb5|r4DaGHF?q-c>EPGu=*j)#Rh?xdbeF{U)XvcOREWU!p0pudzZ$rK z1-&oDV7>&tk*FZgI_c|CUtJ4fp@(vpC4H)_C?l8c{{gfAk`fj5#J|cZHXSmu)Io;gX#!miIDVZ zyWT#F3084pejY)y)fF#jMs@2q67O)*zOes9e4*^SeWOWsc#BtS zc8S_{5-%up7z0UHm#l@1HcT-Lh|z@XGg!G?uGzmP=UWIAZ(<_Qlc8Bd|okJ3^F`UF1LQ?`|R_XG*PIMUd z?)y4}aIr-pIoy7xb;;N%U$9O$oEbIxbk<`u zv>`t2?^uB}s{MA!juOraza31YXenO{h9kyl-6EnpYcWU_2cXDMslY~!-G?z0pFxyS zD2qG)rjB2uSY~ zeMEd9l_Py<ra)U(Yyag)mKL~_5SgXMgc((kVZm~5a}EPk(N$DB_%dex>Es>ZWs)uV{|Bz zN~geR1QAAej2MI8{d~{woZtEV$=UPVJ@@Y3H_v^)sBM5ci+6%=8E>G5}%K5|T#3Mmdy_kymAz2st$pn*quVB3Z+4ae7T zJNsI8I`3@H&RPb7X%aKzKKuAdjT6zbgOluuu5$x2GlOX-0n*WX64WwYbu%wKsjiE_ z#*h2DH9f>!#7kk{rSM_Kl$&;9lZDLNd+6)$9a?xb3mK;d4=~Q=DTarb9OLfDqi0*Q zpTpxP{e8=YlafnVRqOrRo~$&=$gu5P`I4DhNRMdZMUro0V4u!PW5`485g7$$r_Bon z1$!3FRCs2RfYG?gtNmqb5H@FV?HMlWtI2iN7Nl7%s0_2_R}4Az%G*5;>e!|KZgC3= z1$el}F*}&C!|RZfzerrLcA{1+SIR~!3N*+Slkt)%H7sa7l|&b3KY$!uC}zN8@&m0m zwi6ReuiGTMJwVxp`vho<7o*y#PTv&gKkBD}v)zBK)upcO%>t$SlnSx<+!7UTI83Gc zilsQBgC@=HN}}4@6o_NG@HoqwlwkKB$_6FDE8<{EPYdmd?GB}>JAoF1u{bgd#0E#n zz!M_-N|xi$h98nQWYFfQHH!66E7u*7GE|hP#(qLCP@|C#CMx6&WN>$u97wEr_*Ttk ztitAD8bwJWRXdJF3X2H!!Ee*~w!tX{#du^krh+T_c{VPqas$9|XMNYy`E6zB5w zXxHNy29WDT?V54UfLx#g) ztAV{TkOx#x8~jhFODOCu{suR2GU6HS-ESCZk7)-jk` zg_0pFDV*^v{fyf0*)|;mH+;ChG8*Piov!lLNMZ4sD?3#!MaJxO8Z~jRO07S+e&Y$s zls=SIw#UW*Uf)rXA`_?1+>9@1t;+*fv`iQ7a-;902OOjC6;d5OOZWbuK<6Nw=KR^7 zNAob;=c-%1w1(stcagOpSG1sxoJZ@AF!QB+YPvg%*7myUz3b%LYKNUB%;YM%yw~qu zm(PHvScIb0#IwB~;SH^Ghye1Lk47ndT`yGByb*40xCp_vITBSyWGJ}Jur>x(QrkQ2fv*;>=7O7R~jZ_kzEcA~f z2Mz496S1hHpen|!lPeRKX4u1PPW39P6103+ zb)$DCGlR*i-S&Dap1Z3epX6FcHXzO8XZ>{wKR*Zar#~>TfQW6{47GOGccC`TWQ(Sh zNyJaiU)7vKg1{z4Y{sD=lYpw9J7MYB3r2WqXu;IKkPq%l{Os=V=fy2yO|W5Ovrh|A zt!BHjQZ!?M-BzuW21y@1o~~_yBDG&F4j(__l5-kO zkH6rj?Z2=gk>6Wn4ieQr5;d_q4VsqB@w^7zP^+okc;sauEBn>=#ON$R#b6V=)v^G~ zWDAd0lpuTMu18Fo7{%LmDnC{aGn#jLx>7W``b`z~?Q=Q0iS#sg=RW+(`OPBer~Nv< zg`$z#6Xj>9bwvvanC!)nF|EHhf=9mG+DtjmmCNtFsgHWH4}I_NvxoM?RbUPw$00YP z^?z6oi1Sv?**R}Ppv`B#hj##7O0(VSUUhTO#B__}EoglQ+_gVMhK*WO-@5rSuH%)j zqth7j;a|tec!kHn(19nANX7GA)a)}g=|M_X8mRX5kvL&;*NG_FxCr+A{89^QvTp}O zPA)TKhnk+kUE98!lNTL6cLH^i7_(01I-W^Ah3O^tvsG@GO{3%upnLN+N(+EoGd~h- z+(2|m`J`0Jbw#wCs2DxdZO^!2M(}GMHetQ0U>_zzSgrmYTSu!HH0C&zlEDG8g1~=U zHa!@o8eE7H+Zu;cMvi!tSN((Oo8G(_#z#=co1|_8?VBuZ?#(++@;n+ACvyxKx#B`C zXb-x#$4idaaFc5}+DbUR#GCB!8&@(1Ev~+n7At0+k8q6~{QOtz%A3>f;eSMm>{Z1R z1Rt=|RtF0EOna{cCh!)tjeBxtD&ugmCl5S{yq_Rj9?N8pf8~?19R;W2cs6JD7CVTp zFMb5jU(DGr zkw^9UQinZ$E>Xw8^@Swwm~WO0&ABL@)&IWbv+4BmuNXQdPLGaC_yLDP_@KorNwdoM z{Bx085Jg1LY}V|31$`3M8tY@QjPl#*UyrKQq(#Gxia_sCik|#;&dP)sniPVgdvkr28I^ieYyrcaj+#`Yp z=bmkEbF2^tgts8!$3F~1b)Uq={xceRI3a*PQ0sI)FY76jx;cTd&Q*cF-66I$XC9~; z0imG88w|WJ#46b`lY5f~P)GA5A@hRTMnz9~F#-ZdRGh0z3c~?Lt(bJyA)c|P^0}u} zy0yD@!9kb^rlTd+sJb!TIa|0uZlqZ_TWWTVuN!+$RqsEPL@2S0>FK@zk?B4j8>iTe zdqwmah(P2)x#{U{XW460e0dcMx*wAgLofht$ z^LZMHFN`dx*ryz+&K}MRwnaZ;hWfGaR8ripp=AJ344brt&@jkS&Ra?xhm}+A(3K=N zTh`s{N+$lzqEUFVBT{s_OO&?)zhnS;XTx^*3*H3$Iw0};;PLd2te)^UYg5$mbT`WI zz8&!DfrHE?IBc0L<}FWvwKKQP_8S{Rc?dcRuah43WaY9B?cU7oiSx|uSQFpNxqI`K z{&W4(-s;JcT(f-0f$&wEm$c-TA@W1tfhcwEv}~`5B;(v9&^g6h!&+lATJO;RNph|7*Jao5SEk z`Hk~L?R20Y$_w$cXUha;O(UE)!>n9NRCT>Z!lcpXNfu6p{J z<`xvk)+)Fk;v3$+o3iLda`3b@7`6lPIBUX;e*D^2P~>#O>5ix@*lQmPfV6Ls^te2@ zjyYFteFgDy#pUBxo4?_;p=_63*s(5zdqDr|sz;H#?2VghwuLJw|xDHGsZWUsW+c(&pqsTDsXqB&yy2_Xy zOPMQKYVQBx z1r5%eXI@pa0MFmm@*<}Ca_7%qp`E2c)sVL81BtDG^FIx30^pV1&Tz`BtD6&4$eH9p zgvA-%8Fu^TXl8e;U4iqetpn45TX(I$IH(qvn+RlKa|Krv?IEDJAJxCNO)4gu|5Qv2 zvk|GBEaYvSSJ#^C9(*suxz05vSZz-KI^f$@CSdwI_9DQf-m5KT-uX8stf0)Ol={Mk zb46~f7MBO$unkxtor>Ml9oDpR3W}hwjdz6O-lT4=AG&S)N??6mr*yX9%6}B_HSY}b z7%~}@8?phzjfo%Tu5iA7^q4Dks=Q%qJyH?lj+m z{#7L0JVCb)taO|~IM0sue;p)PPaya5h8MWbptm4tuk+@b+MC?nU;kbGjlz&^)jgvK zuzdY~Q2BRYcB*_o0Ea%!XyA~-v;;!pZLsuFH-P@qt|Tuo@35pD97?Uz93Yv2nZm6{ zEVFh2Oi^6U5EgoKG9IxTHU9%7zgiW=IS+W%Uas7N^boL+BYA)!(*`_WRrXlQi2sgd zgZmnocV5yS6pjq=sar_FwT1XK23_u7tpWs@I-zS^h~K6e?laab0V6*_nbBn65)!Y5 zy^ra<1uX@A3F&)s3z`uQis%Xotj8r_vW|oB06}U4aQoSUQ#$_pX*IAXe>woW28_;s zhdx;W=63(}1Q!5^G$5sVU48WtYbScnI*9<9G&(omb54DL3;74J+tHwT7(`(a63}4t z-%3PpK^fHt{MVQJKvL8Zo9%_y7IrMRZ`QRb{gEdaAj$Rt+oBmZ+;d!`!o8@5j*C5D zMxStS93})iiOag$7e9Ri#_ms0;*u~HxPK96X#g=+z|A=w)s#Pu~|`kE(!xw1i_*!M7f8CH}OWD5mom!kkaJ8-m( zlZXzI3C`u49i^N80G^wrj@A}j{<-Nb2$xXDh64ka%pHq|LE~B2W9rm~Fjtnx9S!lz z#wi_4-t_|XclphZOR=OVC z2W%rt4&-ei;~NWI&GlH_lba5mTaX_fjs@58#1jk*Ldk^O99!dPb~|pmZ`@<$eAchx z5e{t=K((mL1Ln6HKweer0DkNm!DpCfl((Qv;DEqtkz=Rf#9+jH2ktp=L2r^0Hg~R+ zOg967PDH6Ea58Hf!BH5160oMT@vvQp<+2^g<_JbXVK<%_A>2Pi>t(=oeo*rquK7y; zyaTYn`y=0>J+=9?MC0caWE1x&TpseIA5svq^#F0kItT3Qz`*JGL0B+Rv*4}$j({^< z%F@p>%uQYrs@kAjCVfQlUT314s^~V3_B1474*c~}?(M5Vbe8A_}#eR?RAab%dO7@!~-qS(7Sjpwjc^8t+a3;^vtX!(ojSLG~7=ZY2t(TE$30K z``ZzsnwM66w)8we2l-Xn;oX<>Y2mDr`lJ^_pv6z|+dOZd--04qGf`nMa(tC_Ex@Fg zT9 z#N7Y*n=7oz+LyCc;*ompqeBiOn7(Em2;2<*N(iFcVec%Yy9O+qUPtkbc9B>z#F|8D zle#)xuS%6lJ4MVXz~t%1XDO8H;(g=dAd&RLYPqAgpjS#ys6@<|Dc0a|H`JZ9oVu3X zAY<52>o|&;nX)1}l-S3fI`oC$Us8)mvpyb!?7XvT%gw`mFK@P13jAeox-a@WmB(@>&I*oGAbuuez;T1>7M>5AH4c55B%(}qCx>d zj5sLqUjAV~Owm;^%k!ToBK(u%C5^P=7RjdOnkxEg-*o@i{x53(OD1deE_(Ib85-|w z7$W+(Hu39y#_%IC(`Th(f+Vw14}TLn5NK&|)rlhJ)k|faH+V^YWlWTU%?RH3vEsG0 z7Ju$GDRfTK|F{uGFhRgpIa9Jy`YznVq~%k8aya2%mqL_|LBZFbMKo`ridWI?yIS;c zI<74$881*{lN_2c75QeIFkY@`I!&UqEln+$YUU@$;Jej(+9@<&+d}0NS)Pg1=r|T> zr~Ep(2i)G?BF=PM6HN-+ET~+(&y=C*Kh{N}xoUhmyT=ua6G!`^=n_9w1q{CIjK&Uk zf0_Y-UyscMC1K*L>jGkzEPP;|f5N&rV=gsL&!7T?Oj0*5ajJ6_&~wUGpDqHQ?lI~5 zrPB+com&vurHR^kNkewR-c@1lpTP^2AoQNe5o?ET-ul|8hF#-nHngmkqXnu$5JE3~ zhTuUoB7sH<>jXV!<`x7G@l#ro|DCb4eB%zU`GbvS<0wO^V zAdU}NV8A3uD;lZR#K4Z<4eAf!^;$ia*)M6u6((NI5Tul@j`>yVEP(?6iv6~JNv`cE zh|K&_>xn^8CGhlVLpZA+Sp;CsLqY;iDsPVa+HgqP>F>v=5Wmj5H{KZ*9IflY)d~Hr zY2c$h|N1=^g;6JGry#q=^RdQQD)85hP%m@HtJS1CpPAPk4S#lJw#!2}j>XT%n(T3$ zWryE!>wh4@0S=G6_9=tBaU1caHpT>8T72@5JF%-P$3py*=NnCNxUZK70W_B*TL;T7 zOaZET%psLEA+P>9NN_kmZ-xUp;J}pOkUU&nel}J|FT4SVPGDJFF2ckvD2IZBi_$^Z zq2QBWx-RiuS0nzGG;y=TC(HDdN#|gD+>^IU~A0tYzUeEHp3OS<_`+u!v{i!iA9JeI^IPx`+m^d7|f5yoQ?kY<&7hFlWv?J@fv zA6~peP;S=wpjmx`iqFFUr;jsv7R}%j4P4QGfBh5!;J@Y8!@mU^Lb|=w2#Jfpkgd2i zzjnmDjxQ75`T0UfYx98wn`2N1!NGpV%EEabees||%B+?m34B!Y*D9cr1KSU*N6lNf z;1_!BsxLB`v%NwFPhdlCWR_3%uw!Iq<>6+sTKqX~Jp3z1*V#LLYbTyq)xBM{H0%BW~p{vg6TB8 zUBt&?J7j^Sa1?^@R0kcx7{gw3b_~967h=28nL6x1CkW{@$j@uYkGtQ3_?BDeI~;-< zW^h3WXJgz(RGF$1Ly_$Lh+24cY*fDm@Fl|NElk9Mx#Em1NpUBwenA|KG~78+zpkcvnF09E?E;B(D%l&N@L@ z^|ipU13B4bUCpQ8589TmBp_!lsW_p{nLFU-be&^B#!^jkPtI=MUsvr68K)_I$_|tD-tl9)J9T1$qMrzeQzTn)*+$XIn^lbR|-8NM@ zz$G#hMLbVL&lM_e@7#*s;(B(hdy)u^I9S3zeq`~pAE_f-YK{!}s;w&5GyEccE=3}3 zwBRC3`l(i>rhTx@qczddaok+v>6GcEooR3Js=5;Aw-k-(Y5eKQw;Jwn;qO2S)s9*7 z_eLnMEGbee3`85<$e5@o{`$Ky`%De9d_X_AP+aZ+pWd2dk(7GWcI0b!tQZ~%2O*7t zEzQCxKfTi$ARSTpr9m!uz19#tpd4fLIP@=zq8+CpUav1PXP#w4bl_eh>k%O-mrX;3 zKA?7a{x`00_x&A~!qLpKvLkZ)bjAbr&j-g*AMgH}H*Gl3t$Z%MP?Mj9Y#ina6V6qh<<8tB5_ zh3Jkn!Ia7I6;S$b*O`z=^-$2e73I?8yYD^b&6bM7rA|I+K|Q~}5IA~@8ZWA~W*`(& z2OrU)9|6*Cd?kjH&!|vJDl!3)ngC7n=NWqCKlAS<9j1+MvewqM!HSCq`@A~$bsSke z)JD`UFya3|M-SgS@=3Ve`zdz)Rci1(OtI`v%`w}vm#z(Mk5Q6SHA*I1>_#Sfgy2t0 z{OWc_j->}DpBIBx+W7d5dvs!d+xr=Rt08$_&y^H)_|IW5X_$K%h@G0)@%T~Jnd}qs zzPvJ5Q2ydRRm=hCPUpbq+K6ze>@yd=jib~!zGxzJkM5ERw^@rx^sA_N?zqA900qqmaoBj0?sj|Kk&V%bt$Fhbp_@J+wouHAtFXq^mn$4HkXC`z0sE;vi`Ao!e5{ zvyPBTUR2npB^#g4>Ls#Nt$8JAJ&p4bdv|YB7vxUS(@=i*{>)mWCmB?WK)3e$Nw)EV zgi_{jLd~&e*91nN#?r3u81;Q+tLpc=j z#9sVfWXk2pX2?{!h^rYd()5_}LPW0R$UXVoF+efp$v@3}UsJ?sJXr zUwx%ch^spf!=v0i?l|_!8$Wk^3pC9E*pr3rMp1Gd@yECQVAJ{LB&Fs7{gwde_f6os zS92`Msykm%#=I|6+<47H1smOLpVk~gL2&-{8XV!x_i1Pw}gq&%d`Ji=YcqV7bmCvvoD+vf6PO#>X(*zY@%k3p?xH+KR>Ue ziP3YCBQqQU={E~)ZSCJXjRH{ZttTV82_eE+jZS_8@b9W*Of#UhtnmpcgPh_w-nn86 zVNw9aaP}f>bt16hMsJGlCZp|C9dv*9@)k68Ww2cy%$6XE);W%457ErKwlRsC1HON% z965o;K$!|1vVXUqBy56ad6jgMWO=xQ+ha2 zC@JcG`y7P9U$k=kG*-PmP=Rq-88ek7o~# zsC&LN=@JB5gT7v%Ss#UxijT4CWp5%i%TV_KgC9+U0H)dG0q`&{|36gkvmf31=w5;i zt6{nlb-YTS80IX?zpe2j>P}RN(G#R}N-SY1R`3xR^saA2{b_eN2~n0&St((LEy!sA zWZ#q23`g?X3UeiWetMalx@QfQy~if}z^pIThCOfDG*6X(ho&&R_h_^BhKBy16xkry zn>kCg+V=jpbrYR3m$VNR@1Ti_=J&ZMx%nA&J^;Mp`CzZOr$u|HZ8OZ%X@SfbFTB4Z z`6y6Q8X420Zjf4TafVD%=PF3W6F18ksF19=XmfedXExuz27fy7fe2=lF~H=*Hs;%- z$P}GcbB9lGTW$D-Q*5^5Memb06uGX4l|m+``mlQTJA{~6ZTbnv;3Qk#HN2nE)~VYC29qU8W6QMD4s<=TT*2n`kY%%O%~3s zneZOvO`6og$8P{*GBjMf$Nt9cJ)YD_*up3XDn&W?Y&)?jmwg*ih82QQ*5{p?Gew;u z(ur)Jy}$vHdkI(B=Vi;iB)_$Tb#zuClGStVf3V+!jnWjpmlAM;E`@V)s4nJ}@6eVJ zM%K?8rSR4+e&9(r;7zRES;E8FAiW|Isr){L&W4EvX@AiqiOxv=pyCs&1+#WGyiaOv z@)AYW7u7$I&pT_1FERS^i?ITsef)1Nkn9M5MEfmBo%V8s507w_WgVth%viM`f4tM- zn3rOZ2o1O|RuxRc-KYg~J~L#?%%)`MSc;;d)sbZS_oA zT2$i|&p)OlDZ}ZepR(FjVPy(Q`Vw*gy)Iti)q(gH;^A30dXV95<4uwWW^9T17F2No zct^h46Y?=laK~mk-$aZrBS`bAZxYL4n4u+3ZH2AYkhL8!VwdOUCpJ^)nxp_|&B^!y zuMS5+%fAoK;qB)}CQ*zpr;*_48-u)bO_S(*64?{o1TE{n0^Vuk`Y%xC?$SHX9j_WS z`FEDwYmv_7y^WMEk5i@8IKS_Sd^ya`I_UoG)I{u2Z2X7ctngDhsj_$WX~m~pwT28D z#&CRwUbP%U8vE0EcjVw)B|i3Ys7$7*J3bSo-9?gB+UTTS9qH|n=G>;h5i21Z){Sym z2a6^qa(!+nj+`}DcXBJqL%JG#I83MRB_A#6`Ib&)kQ-Lz_OjkOZ=*gdmL(^s8(AX3 zZ$~^EgeKY!cv((b!9BvOHWug%IB=MUhV4IYc%Hv<^6U$j?e%&COS@=Vyo8MZ3&9dq z9Ugn>D`mi;bk1FJYtF{$$;R68u_x+6$L|<%se-_|1RPAxb!-CLYa_uGsgS};^XsqU zH|cGs)O8qF`Wxf~;_Lsd-3a=p5EtCcNrH)&*qKbb?1f()?(rKfzEU}S^}mDL6cUdj z*1624OuN)hb|8h)?@MLS-Za*X+xl4f$t?MVTLW-ZW&0*t7;oWH^(0b5R6^}`q`lJ#N4 z`Mt8(3>G;6RS&4~aU0iZop33`t%dN?mQ{ia&xGGM9ru3}E#;;oASNkQrtm0g++Y|A zE+sYlG|jlJyXX|e(U@}w?`)m+abZiifCwdrZmFQ*?1qcn8eOMt8BC%Cj#dsAO#6KA zG9w>t<;qS)_9!}z&XUUMJ}6c3G*Nhq_u#@e*^TMGjEKjPNNLjJc~Ww#`g!4G>T*iC z{<>PBO)jyd8i}8*A%(9md-=3GGp%-4BGe-Fhect}M81V_p}Pg3re`tZx_Bvlm4z4X z4{EuK;sj3`WYVVsm`#&C>QABx11^=%l2Z+H6Ki&@xspoUm|456MT_>mN2QZdVKrB( z|7y8xPlyQ)mW*^=rmL^1Zb7E~;=AQ3dX|(QSMD!LUPhM_Tewy>$klJ)tNsZqdQGkM z<1>4Ei1cM2SYgZTtQPN6l&e74Rg6i^w$WmWC8*l{T}ZCK?#z}@E=!v%aX#sjsLE;F{kI9)SDRiPq|&TkwFDFieuhmYLJ*PDEP|x^ z(|4n+CH2*~(9*^uai8p^NLBr3^vfhl7j#w8VyJU=!}+PIwNws~8R10bXxV|XSB$A> z*4#ZU*w5354aQl#!_QMD224n~tkUVa8r5(T&P+oO$wtUMs2hZGXM-;Fjt$XMyYzh1 ziKf!|g#mN#^e=}?dQiTYq1inKknwlhqxm=GNxdG?AIX@`nYF~9Scc}!1+5~rfXqg2 zUQ$%h8}3IG1xmrPiZpbmb*OP+%7<{8U zSM^v);Bo{SO33_Sd;JM)5@5J`XHTIL-Ry!SZQ4|%*+$=m<1qx=y{|C$tWE6Uv zOgFZDyw~e7eWfj#y?t{Q*93QInEp`Ez5Eqc`R?N5;wUs%^$egdmq$fOzZc#K*`of4 zaB5pI2X$@%U5bKAj882-cxc}z38x7Z=RuyzjzWAPOvgfhRcP=5OGkYr#>+c`j$O|*O9ua-NGj>p|JkOg+gyY&Rw`zUKB>b z6>9OtBQ6eBP$&-f=<_R5YCBI$euP#d6UsBTO)`guOE1SQ4Z*TAp7LoGjJo$a54#(TCPr}={LY>6^l5|irrX+0) zhH--q@vpwc?BP?msgCk!Y&0!Ob5(xUdInXjkU9bvGJcw~?14JbDyX^qqXo>|@;Ibx zV^5d|pw%$1r@L?B$yL(HzIVnYOG4$y@55P?j`hwMbBU+f$&vYu#$Pxud!P3%h0|8m zX@WwJ-^IR42I#>DPp3L-WE0Xu5b%hoz6=LJP*PI2S${nV&;2=?6|RJ5g`sM~JzxIT zFsut3SSrja7$qgqR$~78BrG+=Zk?pWlHQ$7DRd?%0^yy2{|&CG!{&Y#e$0$v<-Q-! z4%*;sxL#mPDIz{;t;)vE!~EG|wRh5JBcupP&qN*)oW+YX-mArgIAE9JkcQeRmUqnU z$V!Q&veQ<@qMeIXd1%y^uy= zV>xOQ_gsovd-s?-GUiI1Z6Ic1*c=%}eGHAURBw)L0n${V3SXNCC>ZKz4j`3cHL$!^tkEHYH)R`8YSe@XqCF7-O1@ zBGVoj4eDhB)n}SSg1}N9I<)X4UmjJZ?&!%Gi_RTPWz1Pd1 zLG}{*wclFQU)yi6j@e;-fJ$w`&dM0?ol07Rhll9NG~uYUa^hsiA3bqLrx9`}kvaS# z@md_3pisAT`--&7o+PPx=`2(*iCvg(RLHY+U?&#tgCjfAsPmiuy$PULI~|m!9CS3h zZ``T;)N;03>S9D$OW8>Ut48Z8(mBgqW>7&V6Ly@T@UKXYtL>Yp##F+zN5l5GFR7Me z+#2BOn!LBMAy(9oo!ZI1?p`d$%6K>GMpWb3GZmjKUG9!C8Z+uHB8J|EO*)jh zWWCvOSr6dkE&#|34QdD{`3vYLz4CrzY{7H;Ma^eV(@n6V&4_CV+aDbB#qxo)jPk*` zSJ9{9zgm1+FlbWkB||9WAbT=u_!0xYUpA%d#<=dNuf6D#HN|zf9!D+W5i{6KN1)>) z^W=?@o$e^&g!*2eQghu1zL)ebgbfL4p zVz$BKcdzkTX6D`E1MosY{RP>kh}QSX0JWdYiScL z-k=viXBtpb@7EsWU4a288z-p|WTK5EQXh~v0D2;yjzTn9F9r{>B6|Q$p~c|Tq96y? z4D>`0^y$kXhc~s`JEAMAewoD6N**z717HrZl^gM^(SW1&$t&3bzks>4;pAXzW9T-= zcSa~lg}(K%J%V@N%S7N1%t=U&sEj2K>nIWNXoz>iKaT%b=}=E5)RB>DraiBdcz`Bj zPSwt16S2{l67T9pwALulmaqe_M;zqx<4adn+S%d01k{Y9f0Qcc`?}}k-6X32Bqe!t zyt}zHY3CJ7ptS0!40ZGF*KGKh%u&f9aT@mh!S8FplS^xWqdHBmA(5ar=*7q4C63XJ z$1=KSYWY=PUwHFqJR4c_GJ%e; zcHYh-t86M4m{q$w>7b^GGj^<_d@4tAjZCx+HU3Z>5u@ZrhN(YNF%z1EK z{UT1L`%_O3dF4PYZvG3M`L;A%O^B}}by`sMCt-5dthFq=#4r)kZ1$abmLPq3{c8e* zI>;|<=OLFfORQ$IqhNrP2Axc~6H#*49PrNAc12JBMZ9LV4~2yC@_9WQFlU`SadI@A zd^NRF6c2kV?;$AAK54#S zV4>XEZ%%?*6gGnHkgG_}gCBQ_u5m0|O@KwuBg&9lGM++!NnP@62>iEk`u22Tw(b`g zbJfNu-})~-1ssQ078^a`pveAxb~*{SMrCDEnHUDPKLV@hESOn@K17&Jd)dd?kT)*D zfg|s)Ump-^4lQd`m@i@*bc8x7$*4#LeHByvl{b-&7pyy>{ZmB`+Mr0+&Hv%!yNTY= zP}7gH9PNR8nse~N+!T-3yK=`hQhfH02k_Sa^pM6_9(uvy}plTwxfl?vW` zMWSxJ#_x?W@lSN27B=^Zo)q43CA%M`kviocF`%qEwZ+I1O_<1*N_`TV69+Au#E$Ff z*}QkJGZ245RpXuUwpu?;966%c1={CWtn3MXkDTOa>^MwTxDZ-Y2wi1oSD5^aUKjqZ z4}%YGo+g-AXn@pttjHFO8Xakmt3V(Bf+PfcB}q(5N-F$0y3`Ktb=BN^P@q^`RA)}+ z5SrrVc<`SdC4vzjFUcjbl2^wcLv_^sbbluSQ=TKb}Ws1M0z?! z9#}v?c(TwcFLm&^(W@=2%ny%J4b)CG1p`?A+#+tFDP|yYX)89hyR`z8cMn9NQxh$_ zAclEUWTWHSg8~v|l^kjfuFrNd5jHN`ySW?uW@#mwUWKM9wb>8)YiI%4cvV`HhgcQG zclfTW87J&q-a|o))Y7Hc3)xUd6+$AGFIyr#y=oQ?tG@8|aEbR%Wwo|3W2fJfX))y4 zzxL+T?E{T6w~eS)%KxFqR4gd$>D*|HIbffN10r}5lGzrE>;L{0IJZ>q@idvJJ^I~< z=z6W=fPDyAKk&WZ_eGjj44r>CUbk% zr$Ic*LCMq7<*FouZmk8CE4rjjm)V|Ol7zN!JE#mniN$>ot4?ZuP~La2Kfzqg;PJ9b z%fPl$iB;scoO?+XQ{h}}P>h*z$pN2*gZWY$RnM#HEJ#DoUJ$1wA|at?Qah8bY0Db+ zHoG$qa(w`^ZevU^V7nZvaQ*<;qg-6p242fkK6#r}JMSRlU^{jP2P=DTp_}mh9gM%n zTJ^mhkhi{AjR<0enP^9+#8}M8JRl@{brQ3(t-v07H^*~oFD0KfK-;HJ{;A0jY+z== z@mieAL;MybMKe)K;2fSORH)~BnnRZC1^~8!rmf9WYcj!eQ|xP;Xvq@e-X8}kav?7_ zCOjw0@oBx}HvE2NFdW*yN#ho6-Q1c5QM%PjKXEnC7WawB(mCsHVMeFTv{BPZ7EQYSsmW;bQg{u=BZ_OZ>k?N~Dtu2#{D}O%sQAGC zdK0qJErd(V0jPteseWR-?2?CelkBBstm2Z?^b4 z=kBcY+glJT2TIv9*>fLCDa<$=cfq9aq2)AHy)n;1C^MXn_}8yx2SMd#_fOOh_w)Gx zCW!-7?nPK1dzqjeF_^uGPAvSr#51~a=NFK-)?S2G0^j)7IPpch&D9(w;eqT5O4Eda zoDOZ{>-;K;a-kw}@WjBE2k0fEP(qHM8!=K`DPddOh3|EIk*(!3dT)B~@Zp!(zTyWQ zwO&wV#h-zN-zW-~`bF;x$VvFlK8$Tt8jP7~(B2x63Gs44=)Udtq7MyQ0WXf0w?dv6 z)^05UCfn-sb0pKjP-(|g8A(iD>6YhCIc8S8JM8H+i{{(zyP~DW1x&kK6hDR-Q$6my zm{Hc{SngKu`*q)$4ozFu_QA)Vwf4z#LYv9Fqca!7u6@}{ccJ|$^Hb0@jzgRsUlFwC zEvI@fsT8nUX8Aht>0Kz=aR|>^Cgu6I8o2jyftexb)fOG7!SBA@YL*xIN8JDbW>Cu* zj!)#Qd8FJ56X=M1E;XH1E2Ca-dKydD9P7%97;3fabk0Nq3MYZ3O77-fb}jAA_=%A@ z33-0H0f6jP3BOZZq)sNRA-I}xQKn}*zilZUB;H7r@uG-oE?pN-f>d)E?`$YZzV8QESvv9W&QxVLm7Tm}sGi2}*`U=4 z;C4{pbzdGHd1A@$2E9{fET{f$gj)AP70O6W+AmEVy3c)=TAT8x@b`T!{;E#Alu(|X z_7VNQ-HukLP&Qu$1(HuUC&vw?C`ldBGk`to&_0X>04*us<4W{8R`dXovx(*D$i-H# z9nFIL6;Ka;yccS}lPO{YTi zU1X<#xBGOFZP-JQzs5@hss7$%4IV10*21*sUarzO>5iVb<^2y&zj5>jzOeq5bHA$l zi%BPqL}PmW1I}=6VHRCf~b}7*wkYOzW1U$TP(L38e>_;{E+;VA_<5#8s|L)YjH{TH@s{!5s2=@#FF0AJ z-T%Qg3!ba!&DNNog*Fei3Ic;)54KSg+Us@wXB)^Swn0xql0?mSD%*ZDT*d z&20-cy%lN*o)6d@yZ$t02M-|m5y69_DZ13LXmDR8BmM)~mS;j)^+iAH)px@9 zTz)fnuJrZBCs5w@8>kxhGs$OHRrhoDf;Er&lH|`ZIi_3RklLz|QXz0~Ira>B*u8>M z1ErHNQ>uIQ0{#!Zfy@Vp+%xnWi|Ll;o|b0*I2B=^?~kn%SiSf7idciJlBLg^r^e0C z)kYK#>!MPBMt)qZ?S!pL&;F44FaUCsD^BxgQY?B_{&MzFGu*ld1FvNHqeP1W+#2eQ z|JaMW=&w4jhj+H~$TGtJC=@Lt)R9g*v+wN%U6Rr!6mpt{iw3)xfk1ipM z&O~;`033lw zwUkmvjX*Y;XUGB#+;3j40V4e+_4|Fx{gnjQ(y4lQH`_|ukI8g7j*32WT?-%$&my3FgP@{>= z>7doVqGnQWWg>KWY?|CGS!i-=yPv-EB+D|G#qXFkB1EYbf5>}659+zmUY7g&;jaC;a201Ysray?J zQw#aCF8qAkNegCkky?=$$49h%52?WXJWLSowo+!G!PNG;k2wEdKm9K%&IrUSqwV?BMwRKS7Xo>S&(Xh#i+rP{ z21Ty2VP=LowC(P>8I^IZ*IyxHsp%Q^RK({G7L!9i*O>$H4#uTkzqOECzz6xCHaE;K zo-hr{b11Ok;ps=KG1t?U4S??F9X)>MDD&#!Jbv4uY;^8pLBo&OpQp_lQz#nB72cTx zKBvxFeznep)-jLz(IYc&!Zq^X8t*cq<7GIj2}@*dVdIN!_PKK|SFYtcHc}we&+Q9c zTLlc(7+3K|)%g+LaYDJ5DLFfBAV;NNmF-@)9|K{6w*5N%omvH?us{LtH(-o5Jj z*^k!Gjt=^$GpfElkK;QX9M@`n6gP@JVc``j6*Xk@q4k!2;VgzK{FwBQFb|Y6Tw@d_ zJv1hw$q9GPEh=#UD|t169)dz1KPao=A|`%mSNMWtP>XIeF4c&au8wXZ<>6RmIchPV z0Nl?8x0+VV%^2iL@R*0?e+ya`)!LD@8JduJR2FC2s}Ekq7vs`EJ&IEZTX1OD69-;- zGMUmE%ybWS#DaEvlqkv^7L)YV7{;s~7OWEZ_LG9h&^@Kukul_8IO$m7MB23};ZsZg zMQhVVJ3czQ^at$hP+c-_KM~}_Tlyo01l9D%g`S_Ezo0rg{%kaIvpIW1BYE>x+&~Kn zO{9n^JIqu4DYe60rDw9!%iXT{jx!W&uZH0|{`HF~CLaT3*V-|tBims1h6}#;Y;l>w z!EqULOX-OEyjdC_$aNzkw?wrl>HKFS!;3J85hh?Mcy}uxWB!UI1iE#4HB*DFa{|q} zCZKeL8WyAiim|I(ST4BVn@gK+^P-aR!48G#ZmNXJWBV(Ft}nQ`V5a#&wf>hNJIRiQ z)2uBlXovEEEaLKIklnWvjLYkwb6gvcb(T^z$z^ITKB4?-cBs16Y>MzPwhwil&{_U6oj!&O?&Ys7D0uxRG-_A`|F_)QDAX=vdWgccJ?7HBOJUOL&^CLY% zcmb5q9+IoOQ=MzGYW^@RNZZa>r~nQdDqb-*1PTVoE#6Ts0{lMBzdz{RDfI73`mWGjfW-NS{Goc9Kc#Pb z_(2Dy?BhT2Zj}2!qw_ttm*Bsj7au+SU-|ov2UYmB58iU~^1ag{)*qWwvy||W5 zbR>((kVnpFY4tTy#)ia-lm}xFIs+{p$9T{r&=Rnh6 zIV9~UfGN5s9|#R*M={i*#t7Mm4mOCTnGGuqC36u&<0`h@mUaM$0M16=IbqZclbLnt zTdKtdts(Y57^*o&(co6Vk>4Xek{X?n1Rp4^Vosn|cmOF^09=aOP#Y7843gf`T1!C% ztwVA++85XXl=H-6Pj%<;i%aEIhFq4S+iq7rQS5Ud;=AwsH6@L z5kHi(Pad9oG$givX``T}jo$EJ*bsp8f&g#um0Vj=)n?Md{iHP($DBQLD)!b+1#bLhnBIPE%2Luv(@<X_9|3rT2E5e#X#>Q z3`zi9;1{ z+{>p#RC(FQUvKIb?OFuKh5RG#UHDInLD0DxfVQ2mF)VvNpfRNKOyoY-)#`6`jgXLf zqT|FFTkRNrw}kYL(a{2|+M~(l7Pm%#zM!!j1^dq&tHOq`3&EDJub&9=JwI#qZkh4) zt<)Wwl6|^>_e8ugms`dv{u){ozFR6UW=C&JZ4E zJ#3nkPQbmUw0~&j^LC$ZvM$y=j;*G5_PZS>x3PPIcAVWiid>5y3BgD8lhYdRDmg0w z%USyVSK{cuv=g=M<_^(){eldDeC8cMD{EJDcOe-qMSX2-diSN>I+m&b0A|E~Q*NKW zJ-?)U9^dUW{{Yh1{T$&o-XdXSzNUG(@%uL(PM>K#>sq^eb*_q6s3iQv=&#z}Xf{9A zI$b|#Jd!FO{{Rf|Y=RC7;sAqTs4zPmm~`XvZhKdo{df5L{{T1XDfYA32>#REq#pFY z_z9r|E@U#9`>G}D1UKkVOY{hsJ`eVp{O zxVbOsJg>9;qW5o7o-b-0Dv}A*4nC8ey z_M4l3U+5d24S;i|onL3_bit=ym$zYXT;+G;7S)O!I+hx9e`a;-^v*vJ!4H`ty-L)B zQ(RqZT= z0Jx5ncS{|KUsD(j4d;&0IVg11H4woVJOcj!pPVUEu*sTqyi2ERXzA|LMjBcEcAWI~ zEhfCbNuXR0qz6m@bDRXGho)LG*elG; zR=Y2!S8xFgk-pPFv;^y7e-lbiPR6>C&4RR`0AP5B788~AJ(ofbok4;1lmpuyQfpP6 zoZMd4w!4i)?(s8y%d$Yv@@9Y#I4c`RTM|h*u`X3o+dcmPNzT*ROc8Rq#&(rJS0!Yj z3eXDKt@jz1QQ;r}1N>8w?4)&P4>M}ifC*q7ir!~RVdR0i98E<=q!KG96P2U0UYG@b zyv~|~T7tqnc9{X9zzmN5Q%Yv%nZo zo{a(pcFgkgZ?m(c>1C)9n6n5 zc0;!DzyoXyhrek#+Kq-`UZJV_!odwX8-@;wnHWlvl8Q4$;&>Z~tV1Xv+G_OlfTh9Ji&teb11HNd#i z`AKQhz;akT2?UKqmPei(XB=%ODe)1fTALM(iOfjU3lKm%6}&t|<0m^w_1YC_)G$~n zGC-4W!hy%mVg@J6~oaR`y3mA_@t{ABxZa`{PgCI~QHr&Y}44B2)H!j4Vq*`>2 z&-rrtnuUNgHMMc1jKyF9!D0F_7PTK4bO%MqunU56e1ue?>RD8I$s;iuXB$hWPQ6i! zR;Yg&S@Mw1kj~o(xE=c#Eqh-^cX6arGhx!VV;Ja?a)+&epPToyHGmuL3f)Vx@aY;* z%H;Q!bXR_*Li3KjZih~`1lGjtL&RGCERA2UoMdmY5ua)3ajW1WKH1X)9X5NOKCwH- zd{u6ajJliygWNa@6MzW^w9ek}>N0DjdWes=b*zD~9)db&J`>{U9?#XSMTKoj-G)I{ z9LHa0AH{K3$K^OL)wPLb=d{gcTE4f8^p7BEN;lM~^pS4AM1QsDzj?%S#?gycL(aGG zQPuU|x!3)7qsKbJIaI+mqq zM@`}R_u6EAr>b}ATjw&VtMR=k?Ymg|s8-fmYIopEb)T)jH5=N%yAnLif_)-=;w5ji zS9J>lMo{#IqTGq%~gl5S4W9c$uNp11jO)ly-2BRgsg@_ahWSlXl zG6ja@{_$Sp2>$?tmvw9S#jR#e3lAq_#8tM7Fnm=z@0hOUEJ)rOq6)X-;Czge>f*aB zSqpe|V{ybNY6;c~M{esMSvW*z$wyk+()xq$d z))5~GBXoBWGm@}jTUv$G={>}l^#nQO#vaBj&9&H)p3RvC+2&{shfIN0TOCbyf4o=K zeISr<0LV+uXwGGBpglTNRS?0s~`@LMX zf+Bk=;dH7=sX4&k<1!~Xl(Z5JbFw@@{omaMtM4EDpWaKj>J1hk7gj*GbtKr>vPrjd zn1RS7KO+X07*W$XDz`N(VE64Vw|*|C_LT?lnu04B$G^o)nF2T25P+)esk-`D5@ zYu4(FAi9JvIm|p*8GXCQfWgIq!2IKea(N2WDN|BS%hWiT>BjoUNy^7hxBGSduihO_zf;9x2jMu`ZWR5W zPx?#tYji!IrPTH=wFgV3UYRtoEe-gefGKw37PSGXt0-h!yw5)uA0(5M^lEZ@KiR(9 z`>)y+jqTF!_lBeY0Pdbw+5PeE{{U$t?)|&j-VpoRzs`DVRx$9509)F5`Fke|>2Yj( z(t@@C*QrZ`p9ynK2Yn~uJr7%b*>x&;Ut{}I?=NFN+51+220yc@%EuFp_AXxzO?#f? zsB9wpDXFoxAB1chQ`H?G=^x*n5uUe4r~m<5q(4PGud)9CN`BK-{b!@mw=bnje6wxm zo0qY9r^$Q1Z(~-Xq%~oKgCE_#mauEO)BIk(lkxt^{V991sbT$N+5Mzg{{VBQ6Myih zk?4O&-)HY({*~0|pZ5Az{Q;g%UeD&^{#sw6t$AM|F0|1?Sl?khS4-`OxP7EL`_I|I zId`^#Pn%P}+5P409@2lX_U~ls5B7TXKdj++bDq3x{s-RZ6+0cb%-Xa%fVKhefgO5A z{ULfQWfBM?Q0Wu`FPF68c^`RDBafueP?7~fv*Mx^t_uZ;eJa-X8o@N@PV*LxRcQKl zur&z&7n3fkrn>4)NZV;NsssQF?=>AWQC-&xagP zRO;!L0^(sx)iHu5)wUG#^7om^&@7o_AF0> zRC)PNnLo-96a6fE-vEss&5!+Cr9S7-Kek`Pe?Bf=ZeOVNsUu2Rdydjs&fghDY3Eb= zNwQq_Q}^$ic@~yG6+qi2O>6?)JdK>I8}+Wq2FH_$H~`6=E0rSt7%3(n-{x0emKwi&$F6NEK(3v_KmI z2asHtp3o~w%XyI1TA3qj0kq8b$n%XuVgA&a)R2kKki>mT=|6~ghw%PJ9pch7x6a(j zb^@ZSPzP0T%3g9TKqwYG}oSHDq#X4n$gryQ`@3{pE`cYYw;! zZU>Z`=-1$Sf7;$uX&VDfqISkV-yxIb@Rv%Bb$A4Zw~MMY-oX?OA89Q?dE+oNI|9b| z%&k5!_GqIOsx=fa4)HpYY;A*+j0F8I(c29vKBf))5G0BX;*QFm|VLv z>FFry6v-N1Q4PpU@b}(JNHz^ldx%<^aKZGKq}uAQsCZn-ty|j}-AQPvw^ynOzl`&L z)}BF#^HLzPFK{#p4r>=|;{n801G@p`q}U zaz0@nq=T}KuEISIuT^%~nKe0S`o(K_i2)d%%ODnPOWsLHW*4A4z^D#U_U^2;rQE#w+D2+=;1Ys$5C#Eunpco$mBY!yJ?7EBEqyk8<@Po9B#%k#Q z0EA)03g13Qn6)_oGqg0G$7c&!osfdc>>_&^wQO1N;2<)}kmZC47k`C?^pj4lx^@?- zRuWy4VoixBK611x3f<9Qg|{(VPMW8ym$#CVA|yD*84^h5Sk{I`m|=E|TrzJ{VtFTH-aR_#NEoQe{(WMtTU-yMTG3%@;=qI0 zh|mQaZnn%vO?pG|3qE#IP5{Tm#jRejdSovVFIM=G>ly0URMYrdQ5?rwoP`OYc*k(% z)}*1Tqfto74L}qK(lgH@F|NYFScWin60g%eI|e}{HQUI=tk8lAHQ4rriP9^;;!CmI z(AJ`%TRQuBNZ=B{&SOs12oN?9wQWSg)EM&-ZgL<^befXj3m>eOvEBr!HQ7(&={nD~ zb^V*De&gCL(yq&=)jhk;AaN|&l0X%BLRs({^1TnWzWerEbiM8EfMXWwk_W(<YyHbomgBjs{J|iBfsSO5x7hJHa`5>1dhwshsmi^H>|fJ2we)I#toso5 zlEYW6AIg}XU)lcvrvCt76(4=>j=xL)05{aFzcoEaWnG9bB}pBO^K$kNX661|{&BAF ze0wkSx%PkCZBRO1(d?%Hp0}>s{)q7M`xejlUFG;bujn3+RFAv%j+arKX|OJJ4uz|cR$l?nk*H5hi%_Bq z6V3a-?WexI)lpw%_RqTkFYKss@e{|-=w5mHo=@iwZXYMqB8I=heN@vJ?dLvv_Fw6* z?Ps%X?OhLOrB2;%XQ=-G06w$TzVH74C?9cLY4-mBWA@&iiTqtYm2`ps0JJ7~ z&t?9ae#Uj`3HHvvLGgcQ>JmOc&zVA7%0GF~8twrgK29ghf8_^{ z>0jQZZBJ$-J^ujFx>M+%bp5dRFTNzv+IZd`KYP~KT8bJ+X*acOLI$Hw!z{|N1WfKo z0fFDtPu{*gsW@S>IWWHGE%Lue=}^YDwjggN+iZjw)RV+S5(xm1H$9^&rGg&HDuQud z1DcCcMmu`SwW@3t5~?BYd&g@5KnKPlRrsFFFQi7JNljq#x0C$2Mk8VZ8yPJl6gMI; zDo$Cil!lf@2;VV^jXKSOYe?QB$lttKPHCMOM;Y%SmoG>=kR*seRUrB71Y*;#P1gP@h1}%&Ov?ju zrPj{%HfpG2v|U0CtV2(o;$Ro#Utnkx~Zz;IzdKfo3YoNArpzR-`t++2SiEbe1@Naavl9Z>o-+k=x@HfEFMku=p{Xc_KNCRsI~|m?Uc0 zhWw(^&>1A9$(Poxsnj*N@eU-4yry6K;)Iq8T0wqdEkm>j1N>$5`bVfp2tH3Ifj>0)U5J57(6Mbn zfDYLsKQE|-EQz;-;Dv0q6ZMBw+Sgaj>IHoeU!;u^AnrLt-D4TI^=1k!M>C!5c^?$w9aq z27z%sj3HB!Eyg0L(m_D_h>gHV0C&Vf!CAM*ukz!DQ#B-vjKGo#IRj_|&oL7wv@PX* z-+)_HatXGh!#3p&i$cV8WCVo14lbEi@P<7NC0z-JjoMbOZiA8fL0if8mu=R@UcfPvRX%#i(4dS_`M@$_L1n(HJ z)zs@pBAJb$pgs6d(wnyCe{I+I|;~3FL=qJr9dZF@jbkhr|xsU zf0LklW}FJFEEVeha|`v!V}g6;XVezy*w){Rw9eX)D||<5moGKH72d#ykb40qQLzBo z=W=A$wy-E|yq4tS+N$J&tOz5#iw`_T{w5>8oXaZXJX01d!&@*$c=H}|LRi{ZSD+ZJxH-?4 zp!fMk%5^V1OZ|JW4ty9ghz80emuA!DhabW z1P#aY`b|Ts>U8u{mLxkoFvr3oMSlw=@3t3dB@)F&K|lcj4Uc%4L1Z zdVhEPEw4E>sBmw}Gx@-UzcD&N4jJA_*-Gaa5!Tvl2>|&XV-B-e&hTof4fz?B`G^fE z=TSch>so>n9Lgg?;@jZ3ZH2@Z^G#|=9u^OtV-@?$iqssO0h0xfIP28CDuF{#x5PF1 zn8J=ww%@ai z5E5Ye@hhTkdX@XX#5USz=Nvj@z>q)>GI#mM6Q`$2wSm%4&IA$S2nM&3*@A42GGm8D z>~3%w^5#QFITE#Hj1dl{uhqG=h&DTzp2^x+)Ax4ExhqK@7bd8k#sf#6DO42J4fSc~ zPVtRymYZdTk~8HWO5>%}2Gtj+{u9iTZFVH&lHrQ!(~`3L#P%xg5l4fx3)FQMUhT^1 zj+qu0)CvfVzA`~HHmyiU>lUd&adYk>295kZh;&`0lk2z4BA<5R`HTWK=Ki3M}oE@E4uAcY}qy9#|#L-sp*snxb47!2dqg9>8@JfNVihgwyPFS z@x|CSL9;t^0BXEI@3=fiqrxl*FLBxjsnV}a7x#_7DXABH^-2sqy9n#5rG^iAmA$1O z0A8|H`jpg7MG4Z+25LrcmPW?)try-WxCUo$Y6(;^-)YTSvOwl576e$nTGst**fc=$ znd>BySu2wzAKC*lbG-M}cNon`!y1nMevx$RTa|l?1-f!h3g>Acjea0dIZ!K%+4We3jo=&MeXGldmV}D z^*l5T{{Rg{RRYbOIAa^amo&Dj{w@rk)=NmJj$ol;0#X`~1&9p@5s2yq!cN>MX4Ms2 zJAFUGSamk22@pvc9ij-9a2Db;bm~|b_{k?R8b*grNXyRu0Hj9V5CX?MnA$(2NBJ^Z zStHN1Em2KChImH;Rs3KS7#qnkS zT@*DW+d70*puK~(ki1q+e>nNYfgOPZNdQ~C7L_XPk%5ztA=D?SdlV~*ly zVs!`bSXsI~eWLu%&E}w%&0%I)wFl zmMq)Qd?tG^*OZ~=jyZ;MgF~4ONY18s`NvQQCZ!Rb;vicCA}(22$}(C7EI~CMSpB4v z^4(23Vx;)Rv=8p5CrKjKIUJEJTALdk^Nq=W2mrw+Vcr^uU=fg@a8{A)3_2bN02hz< zN%)Uhbu|7UNJ|pBU2F7Slcnx}n!~SSkb#yuMD(rHbqkF^AC~e;D@i4cvCIt*s^)%T zJ}+bG=m_6Y8yeK3>d})@0d@q3kP64FzK!YA>el^EnCj4PMxVxJkoAjGlxfoISEJV# z9Xi^em0qaSK0W40qH*(r%8SZ4)~t0b0@PAT$s#WDfk6=7$FxsjQam^t=Moltyrm=r zRxdaLEp`B|$JRclR^3u9duqBy)-0b>4+u3mu)}!ul14T{N3;(+yzdeVB?+fT+3)Qi zd7wQMH#yh|b?FOrtJCZC2S%VHZ911cZyY_CKZJcsirk9ZQ0@Y8){Kxy9J3gq71l$m zTg1*x{{WmoH@ZGioUMnaGIuyKYp@m7fC)ZOBT3!>n*JLjR@UzD6_B#_!uOR%-R_QZ?x_#78ZE(l32zN57MDQz~mO1qy~AmP6tC5y89 zwbOh62Vr1;DGo7Ujvg>#A30&{XB;4QiTS|W8RAGI<0%hi^>41m+C^U#z!3`?*bq%m zafk#+1d5L4JKJ5Du93hUrjKT5uQ(8wd8brbol{!?EH^-Yk{6SXF2$Bp&J&k@rLJsA zF2$5_B%L9Wq8V*q-fLMr+3m)3B(qt%Xk{VliSY4M_*M z#1B%&qNc=wuqOg)9YKznBZ`g6e>m-NtlG5{17Lhm)Pk2 zmaRpR74ESe^>qohga-OT5m?wNTEtW$iN|&S9IErEh^C11imB)um^McLdbFt zrxD!%hH1DY0Aui4l6VXQyhH(jSX;oP-!M)KM^d0IHf%G5j5=jpJD#8WLvbBI$tdG) zWcLewqBKzeK}e0rkfqkFkTPWMam0?00NWvX_LXYrsN`7gL|ZOTcpDM`B$2@F6{#T( zK5j|vA0UM0m(n_Q@GFz}p8iT}HER^dXo+)5;o+T!lvgz-x@)Ha<+I)xbvCxF3W4S# zJ1lnuN2Re>fZ$Day)LbwcGcPQ{o268b1*>PBeWYGrMNZhxEutw_weGv|l%le-Uj`Io}% z1&S)hpp1Zb%y&2yc0(xed6CBv^&YYqD5fOWW34JhwOdI6)Gf;x`7`j5#B43I5{q4d z#9#v0XUa^W;aM5xD^ijDBek^>c73JXi&mguhR=BxKm;-ZK7Mg)vC`TJRTm^L5ZlfI zx~!^2hQOSDa$d$gI)(@ccZt--$T%b(;vZOMhlV@E_7=9Q5`bl)v|M?1lzMBXEvObq zT!gpz{&G~0Vp)LSJ9?~V7G`@oO(DL1eSZm`(XZYJ(_z}I%ltcySTjqSFLo7yKynnB|XN%7|=px zjQ;?Hk7SyHBfX96(()TXgaKf%@x%cFz>wN~qwhszQ z$A5&`>_lPlw(vW7$^y6~mChu9%vU4gSQt##8CRUntEnJOdY z71+Qg+Hm`lKR9N(m;`O)Kb0i*hORQX9pZGxO7GqT5DVa}M{8Evbk!lBGu{=j0D?6F zF`bWi;p{90s7<B23r ztpTtW)Cd3^gXbVp-9oAfD~!cl7ROKd_a&2 zIrKf^bg~B9!p^nbJ{QRTa)=*xEvqeQ{bXE(JVw}AiR=M&t#y%8k~3!)mSK zJn;c)tkv(H{k~ILv{VaQ#883=XD=aaB1|3-dFCUxoCb?o0s|rZJz=1W8rY&Ao?_ZN zThGPG?B4o01qXs@gaJHG%lvPfi>M8WB_bc zK_u)3Ojd=fR@FQ1g6$v-j5$SyBIo>KwIC8e-0c{pEt_>TmbQ3Xz%k+-_v~bwRUOGA zeUw&^1u*?%>7#HhZ58IpuY>_2t8wKQsFBkJ9uJX)tm;DLg~UV*XN1$v-0sY)W zRfEM=00Vhfu9M2E6B?0~tPVe%J9Opg!7HO*1uw162{&nJmi>KmhBQi2Ep`ETn# zF#PtS!EKnf7&z@K@!2s@x!ME5avpXvZgNfNYlBh=4G^JU#5;M)zfj)9mQKSh2`2|X zD4jckY)%&arF8nbIz3u_-43BUR22!m0N zNjvN_+D&ODO9YjL27MmlStCtAuA2?Z-{Bzd6QyEEM4yZsJp9ykAXpML4r=#+01!xH zvy3{b+f8(k6_<#Nh=>A#jGVAW-jZ`w^UPy%K>-GgPNeS{wxh5ZSb(7*l)&8fj`aJo zGAzI>9BmV+7(JkNd$^AAW8)K~etuDlke7sxM({O277NZGYDWm~pQO}lu&wl2pm0L4 zV zQYD-$WCZU#8)+;An)Zf>JzTP;gkVlL1g6353FC`b^u5u+@@cw0u~Oe1G9?Ru^=jwvzD{k z(N$NmcxQ7Z0@*x%9?rKkrruwadhHQL1l$=aX;+lZdUVNqI%%~p;AmEG;Wq+%|sTT#3dv;P?nQJZfolylWtJ*4 zp7C9o@5HOBTEey$1R-J+ej0S_EmAH(H8FK6YJsVxhT!i7q%WqHu8?&sk&z^VI4(8e zY-H`sFK1_v5DCQSI!ex*Z@y#_R^+XOe^^+8a1dShmaQYXLmW6(+6}xQu(Je%VZFJC zoxZSI1=Vd`BRr9j5Y%l-+WJEXzrzC%skY34ow$srQ{|W51iRRv8E9-F=N;;3O-ec6 z^@`MkztS7ok%yJqRgwW3*l!TB1RS`nO^u0mCdB3Uis)SohlBnS=|j}8uAyH$6a+|D zO|V1Fd5@{qWb*<|T}#IYysHpNK?cC>3lY>IV62i`J?5}lk`M>KoLhhpf z!mkU@&Oij52BI{CU;-JO}xRevX$ zX;(G^#EQR{oL4}USQrPq0U*2*BC*w-z7bk>6|L}fRCC@*Os|xC@dcCm$!REBgiu(p zIP>oj=P}<_kPWfGdqrvyHQNUbKoAHime&SWqJS73o+Q%3q?=b)1B7@nI##m)A%XLf z3H@WyZ^g#W3QI_gpPWW%TAr=NK^0?}H6R}lBuf^gi9+U~1~S-)k*MPjXdV$hc#+q# zmv4k-rPt`=p#XwI5se0?RjsIEpau`c;(l5`JJ}}0RMeakktbgG;<=B1kWZEuPVaay0gc6|`WH`NaI9*JC!-ZGaeRCNzz~ z9kz>X#tsjjGBFd`JYa%gNF{)!^=c_&M^bBI?^4Bwm)GYYkT}{Wv2nNyVF%AVM0ong z)gal{hLt%1yhQd7E+UVdPk8HHb+L7>kn(rP82SEkYp^)M1Rpq)1n?kBM3#RjY6yj% z?r8Qq0aBQ^n2Oc~DuKp7IW4Wh`b+z(4wkZ$01i(1`h8-%3p+3fL&TrLWs*|F(zX>W zfL9WE9U!u69-$SH@Hw4+QDiODz_YBO?hS@JPyCZ@=txdD%lXyNULY5*us3FQ4T6@{vD6Ucp` zo1RJ^NM8Dg&cO`0p2XiVKb$q`Yn)_$QF?@Y0W35G-DFR3B6WKcjB}&=^umTwDB)cSsQvGwxK%GyvV>y-6txmm56)D+fC$PO} zY;;>qHU{TEArR_YL8W%N&vP>*Zw+J+utq@D-di*3p;s8=~|@$hL|jWKdg_=ZF^MMXc|RFIc8^I z!LdU-MRre~)jv20C)~=dt598a5(q~K_w$x6$`%8lXibUK@wVSN6uqh}C_jXPKx}!( z)KofHu^ZSN86c3+A%%=Y%7e1rJ66@G)m<+jo?%LAu&J=AJlLqkk5tyC*l21vAK@7e zms6>3q1AHicPd4i8&cgMG@Wg;vXN3NU{f4}%yDXY<^VIe50fjXYh#M&9h-)N zZCaIGNfUsiyCs@gkHiiR6q#49n-QoG3dYiR#@L#JNaxa3O>~`1*d^Hd#BEbrfmLC- zCwRpTI)EAz$s0v#PHl`2$}3vd()b7&Vxy^R5JfjC$MWwc=A`&puMS5_)ePv!6%3NN z%#s`O&ShYsQQ`-)aOt6OsA?UWni`XPSZOE1*b-he@w{hn81jveyIOot@qUVA=~l+I zwMXHx8i0{-?cqzeX;wjjw2bi;q&JSZ^bw|h4-g4hoZ}hWA}2t((WM3F$9RYYB?}D% zh6x986U3I1&y;3`YS?g3F*h#6)|K%B3mSJr^prZxl1n?mi*8Zx013lIHgO7u{5p^) z)6OeWNkhmXC5dDdNvR`e!;y(opa3df{C0z_i14Ax<{U;dfrllaSoE*q!5I&ReRbwEqBV%@341eKXc7f#BQV13#23Djjz(@jNNEy4sbuQ~P3%PPI2Ks9>(y+sMTB zV3#Y*!qn41Ui@;qz||~($zmcj9r8H_O?D@Qc8CRyyUOZVTF#*aF!@v(PP zh@5V`r5fxBW6yXBn^wxW88MH%>FS}?Qu9-X@RG=|JK6J@rP#+(=cZ^6gqDwZi6Xi} z^NPpMh=|g;+i9k|E2b%^3+mJU&hiY?snRqnP_X{++CmyZV zp{Af44OrNIU#yD_79fyT7}{zs%DUKD_aaTW^p(}9uTX$NT-34ikPVRlly?J|{7mFg z+RYFEAaM;KZiJm+55jFUdts-<2zg`DA$??}LBlgLN!*hkMt-s`z*GWx+ADR2r&<6W z+5O~_NCPAdhiHJXDeal9UC#E@O|epNgOY}lOIrorJ27CaPcl%>NHQIaYOvG&)>mk+ zVA$KvGgK-;eENJKFKQ5KORmIm6QppF8Qcyfbp4|JFe^(S4xx@xk`8=cAdt*dJ~6k% zVkbpO1Xyoek0`87tZZ{*l4G%CZGpguk2x&>7`gA>Fa@n(3IU^Nq}HmvLt0vhD=f*q zjj39n!WxK>5;^Rn3}kE%!ant=Ask#Z_(3KrZv87{|ao}Q{$ z5y&2XawXo~PrJ}qpe+&1Ryybvb6gSv3y;=o4`h?%KY2p7zfQ|Eq0f_$$-}_s4dIcp!>C)Bv!LL@I_IHxJ zJ7bdt7y%Yh8)73;#-HaA+*1OtY=hsJu>Sxv7$(*z=_r@C5reU4Ap?$mAVoBcon5&8 zQj3XMu>hTc-|~s<%zy)pF`d-A+#a1ksHqK+%#Z;)q1*={sj(!2eLhkOJMAvD)==BI zT&>M z2YD?aVk$=l8VLr=0OZA=@q~`5m96T7Jwj0J{J5`CLt&9{Kt8^Jzt zYa{{02y4<%u?66tA^JuL1e*b7IKnVmgWe-irTLjiY23HkJZUUv@{!bPCaZ?xxHTjl z#uU3z9u5Ix(jo?i^7xuML}{r6D`9q9{?M%ri32Mbh>k)1;LUa5Zog&l3C z%>(2_t7++5r*5B9Re%;G1*YAny3R&{RQ5j}{KfIAJPe^%;$SNrWNr>jP$ zKN4%@6`gflQ~%qCHyB+T2+|BT1PP^vbVzIi=^lcVNTVVRN=T2`2&JS(GaRiFqKp&) zVIZMM^94~lMSstp|Ic50ot^VJ@B6y1H#7eO`=-GJ?h*}u35MJ)uGzRxj|^{XMCe(7 zWQ3_FHcVB@a-wME(Xnr1RqOqWol3|0r=|SA{St9Ct@Iy})x*Ofw2$U(*c`sr`&}2C z(Pt5oh}ykE@ojDd7=0Y|Q%SO3{7U~PH51SBUm2xi5&UGP20*1Q0Eu#uPapNqrlh%@ zXa48@rdPRTfW_nDv)sb+IM-nk>!}4m9{{Bzy+L}#? z$tx$BZ)dcA=S^E#H6S)LR?~W*q}ZBT-W(GpI|(af^T)qWv(@dhvF?&9rg6H|n0Vb^ zNxk71Py?XFUan!*V|pR>t&F@ZU**B}4h2qIl`mfQBUNH+Yj{)`yy|QcNEWldBs*F8 ziwh64V}*v`IkXy2arUfPa%S>QY1aT1EzdpQ8A+CikPAGoei&@@-|j6o&jx!?}x<8D~u}Y>?<$} z3u_05gV873<3^NiZcnm;;t%p>5r4wXN)5j}6o93gY)6_Dsn2NM;V`5}p zeul-E;tdx#-QoYyGVP8-X4+bm+jDpaHoUf_tsu6ZR0A;xVoM5_pC8Mu zYgDDZW^7*Z+VpFL-Xuaq7eX$JwELJat0P!V#T9*(J2GaJReuD|%k00u54KQqe1D8AY8EoK${SnCKtJ+t#7L)G|V1BFE7~8jK5i#Ul&~+Z@n5$ zg)s8kq%ETm^LIG>%SBs6tC%ViV)c2%7#+!stO&BKm1Smw{;%WFjN+JYPdOj1T``^P z4;FM~SW!T)9^)rrT^{Lhm*Nk9Sxea_M1go6uh1;t^dGfYH8r;iTM`PfcQNE{R@9{D z?vBATN!Bo~W0VpnQ`V>K3e2rwf&w#i|%Sf7Vk%RWO^S=MLUE1=WBUoGQB zbrNqA(MVuUKFwE_TWc8lT9U>tSznCFM)+LKg?F-2qB z@=rWoBb7%qN;9MJD-doszt#&@ZOP@y&)w4ZvYx$7u8ciMyTPD6wugZT{DtQri^_F1 zfa^Sy{0Ns5mE^#A`)&SXgjcQhcNoN5l0@^3I*LiAA-*`m&J^%Nu^cn%igwvf`Ew^( zuf{zI)nYYt9kJwR>47n%a*~+Y4AS{C_al4$oKRkiIX|sO-{xnUnv~&qKjWYS+`046 z_Y-Ol#B=_o)AR=rmIB*pU_4c_!i+g;8(-o9ER43D^Of-BK)zJ~5O!qK(ga;a6Cb9z zUaHakwc~bm;`Bx(1lpwq?-Y)AlS^pFrwnX{8UH+fO06vM{jb{Oe*lgcmTr32gs-B^<|5-1} z)1xsO(II47`CCd-2F=~rHzNIJdif*WFEMiVD|e{7>QN@+`?$-MPHXVr`_6;))3=&J znmo=20*2LeqJR*!-xKw+K(6vuO~+Urws!ZDqBQHtnOerU%!bf10Oxc(Ll=7Yy&|&7 zdoy0T{?wVHbNWmpf?6j%au?Mi?$Ib17MR3M(5-tkL#_I;F_NDg=$Izhv&-VHeGnZU z+gHHB@uuiSkc&rzj+{Ll@`A6HMTEB)1&j$<*Vpx{ZnA7&grdv!IyWRNLvktYogg}M zosb06LYe|uNU}Li%#XKFPj8~$U|3Ow8yemmdd-|$Q>}0oKa<|{edy;cRugH;72>wE z<;gVunnwt3g1wkznH&&RMwJ2I_P47Ep`Hd)2350LDaTHJjI7lG(H_<~mo%7ng=BZE zTFTWXkD}i$O7=p2s~8DHZ^GhUlyQaPM2rBPJbvsky@6wjmu41Ki0!|xX& zG1LSPUy;y-vws^<3)$9$x+qF|zc%Vm*C)dL)Zf$q1KQj98N7vrjH16E&A&r^V=5B2 zrs^@8h-hR-U0$&?fFt~xrmd#t<;}hA%}H8x<#4l#Zr~r(HuD)W!m*0Jw2fX<44(Z~ zL*F4p=GDF$RU9Cv{NN`vM;ZAk-xh|_(>Ny&t2Hoz);{Z%AGev9#MJ+SJ5z{tQ`9Nr z^;nQC0WhaMDPdG>eDpcphzBHM>RL6gwa39SxrX1XXl4T2KVU-rca>DzsC0r~q}GvB zePLU)0QbXG@_$n`slSVC<6Ug&>>k|s+I`_!`{ZXaEOUJ{E!X%zQakRk3W=PT?Ws&B zLkn6uaU2$75VM~tzVIvv2K5PNF?`fpbML~g8gp!zW|t^#6(@# zbrA0^nGWeHH;a%Za7^J^Umn zHvT1MfSjGpFZO!8$K%Bie)5BRfDVMhas?UPxzFwfdo(Yt3*!3brjY5=AUZ1bB+FdO zh(8%bpYh)ZZ}!{6$=PqYn>4?bD?@p0i`BcG%sS6*@dodFFtifz*oU5+8(RHk?diTg zrF3OGdbLKGA2k(#EZEh)o;e)y0DC|5G3xx2Qk!2oO1)gggj`>>2-h`I=@c6h%el)r zx#IhUsP-K*RX?pMTypxQ`RvZ;N6qxIA>3~ov(M6oBp8lU+o@)Unw!2nEt|IW$S#;WG%>buPPofE1^HIhHxFZFSIbO(5AV)kwta{)Hqh4*ZCOL5Uh zZytY*A^51^?%(wSB3QuPr79xk0Ma-6G=P!13;Z5+WD-j$iJ2$(Hrn)L19;UMbZLb~ z-G0CKQhtqDt+{8}F1GmkX4mM_tvxx--U8dWnXR;AIv>M7#Iu65P8kxDxv+q{!n+r@ zrk083&S2`3b8B6AQs{XwpYCRB(JOJwc~c#I374-W4Vaxc8s5NHlkcMCUz2^n6uN?r zJh4E|am$mfRJ^}Ykw)r;L5Q2qfoi~??rEWBaN$!8>mL*TK|M`UAR{cR z!m+1@%Os1x+AuKx7+;i8cVS~elA9CqFr|jlu(Lxe1BhRdlWhE)f2sMR2<<0Nd%In7 zL!O9^(M#ed^Jy4(3xw&QgBAs>^zch*)5yGGlG8w?vC6M4R87gj90Gos&5s3OS=&^6)1l4s@--g`ybs+F}F z)h0=BcD;;J0c!zohR5w`{83Z)_z<(ZlS)byrENg`Iy5yA$RpI3(_8!7wdU_kI<)*) z=0b&N@bK9qwv-X9wb-v$zzya%A!bqjT$LWE-bT({sbT?p=MQY6{gm3eAEIm5^A}q0 zRD~X=MSy~fQO-}}iTDPWtlMWu4v#FQul{e2 zQ*aNk;f8PSBYg@5?Cscc-rM;zPH6tv__3mGSlWZOZSN+`&-ToR$#$YW;uja{)j70A_AL$hYlJsxooT zZqrK>b%m4`p4Nn{*@)hWj8|>T5%-EDuM-Nd_~bt8-p6enX9(HTpW5(=1G(#bOi)9T zWV52so-#XgFbcHN+K^7H-s{p_-TsfnA1v^ir&8!0HXdJJO}>i)y8vImPy^99_l)>7AGJ_wc1_7k3e7{X0;r)Q~f(8fx{pO4hq($TzuJ#(<( z-sVqp{Jkw-!@%8e40<%Sx1rLtZdy}p?Kw(yF*sW)28^)_3Jve9A!I6M|GGMQ%hIUx zxsjhF(9z}h=Y{oZj~yz=u#u8?lZ!!+_(4c&tZTg|uRx6eCuEFE)#7V?sl8Win1}xs zUz+7umI}T^O5x!GwVuy>o2QA^m?fK4O)W?14d}ma!|2d_&S7|Sc&2L>`Z#$ro2yjf zjnk;f>427^9%g1_PGkpn-tWR*uN2A1hGs8KT@7@Q5E!|2>+{0zm0pI&rv1ODJOaI* z{h}g4;95!2)EM9&r>>r`pi0BBLs9$-SSk3xD8Wm%yWZyS=7pgJx7z21P$9xR;hGYu zuMdJbG2I;R>ZyG4qXscEP^p%8_(o&Ek4@q8;x5ai=jJ+W|9g&qq>%nx41L9dH%}uT z3H{7OD&xuMOM?d8sg@;?b@CQ}oG$?%&U}+oG)oxi#mS_iH{EAaC+)^8j&&J85P+%+ z%iP^hAGM9SA(R^{V|0R$&24p1?pLePghB<=xrL+D+^Z5~;2njM0T3Q2@hR-j{B#&v zq%YInM^q@rUcnClx1AphcXIAn{7=o-3BkSh{BoRXGkvhKQH%jNS!&&6@(NMZM1f;L zL1bHdB$mAWl4f?Cmwac-LgT^qEo?BitP?`k1DlDisGSS%?d5hcmuwA*1;nL@>=d<&6qv3&oV{0z~ifgt@N!L~Lxot{Cyrca`OSI?iwr2RenNnjvPSJA7emHT3WPfY89nK`!` z2~F`WqaFpbcs9R15@EKG$5=uYH}(Dw)qfutYp>%i-w72*}W|+I}RhAKJ8QHY5Sj|~r@_bivqTma}-_e>! z-@qGHsJSTWLJySiyHw<+u5Xs31hWKj%OsV-aE$IWp1Iet*Ulzp?qxA*)N@9xmuqF1 z)~o5=nLbmao)E=#LM9@lcVwe<@M)=@3EgeL!T1)9ljXOL(fS{|^(*b!MyV8Fmu(Bo zq=OI1d6c?pgGTr{23`kkYp?>I%LQ{GD z0`5Ud!2r&^B{N3wS0P>Sz8X&6+Bh`O_Ow&q*j^J%Q`~ih4?MES<>b&wACAKnvXyPJg`F(}{%L87uR^9}2%7lR4DmfoGFQTWEI4kesuaNzTS{Wz9WnVG zSm?3VTJ&t}%augP<$AqkROSl;M87HSg`7;@WB09pV&>A4MIxK6?ihWNJjoF~`yfAr zrr3<`7}yqL8E~xNpuS;jfIM-d=G)ZJ{Kgjr=ee8Sl~PX%Q@8CuKT=fB9ottkhQy|K zd{qCS9EtQDNx#DX5xzZ(z!pB;8Ny}mTS``(THZv}@(!wN^= zb|}^S{hm9`Zx=jJWg%cIYkK>nwxx6u%+%FzIp+G5_&VsZ)Yy_W@PIeDbx8aY%JFb5 z5~8Kc+iaKxYd2NS#Dd-yXyS8mYyq&gUtfC~tIg+U7Qf28RCF6T=1elTs(eV7@H)P2*1_B)7@*Pe1Y`$)>Cs|L-7n@&AO^Dye)jyQGW$`@2F3=vY za`V-sk9C&%&FAe1I}?M4^g*xo1!zg!W4%o@iTx{H+sYp;M6jj8(93HC`HRnno!5pO zLAVY0XKBp*5@sIxWX=1*G1YyMQ_dY{aDu;Am!p=)LyY|#qM&xW5=ZEnbpHNl<3mh^iGk&aW9K)A`+`zl1BtG9j=wm%z!|T?iH2$e1P82*${8Y;ntHZevYA}Hu=YK zNQAM>0)SHka)U+MD%;X7!H!1Ma#mPPO9$f#Z%QV%oK9zU6`|pY*5)l1FT!gKxcHb$ zHnMsWL{Rp!X+kHdI~nR1hD_X~50NVt{58iyIz;J=gRnHGWGDyx*ZQV}yJV?GsZRqk zK$m*y9l2Gi9RbN6N1vsqxgR?(m34!Oy(?L!M!x#R_o1y>mhLNPd`n8cu&GlFlaO+o@GxyiS`QvF5ElRv`qRoVvgdi<_ zA_D81lo+#6-}-$;;vs2L;0)B}j6DT-7ki;fGtdqSV0n~iVHCZdpbL2AA1fjFaa3Z= z)$No0cN2FEBYh#jN3rPDb@EW?d$&fVf z9Z>n&H#_}Vaug=(100t`!cF-30X$;P=b_26Jv0d|?ccP-D8hPYgY>b!Hs!i18uH*; zI52yC)HAhw7CEY&ql9My;D#-oQYmfP+^Dc2Jd$jbikZQw@~3D;4pO@P-F!`8EsxWQ z5tD^6QBd|fX+pMeHm%#n27caIRLfjzrj|PL-GSkSgZB@Mtw&(hn)PYt6jXUY>vb zreqx=7yw_VXV~JdoecEB*VmLwxjI%^ty(CXyR z=`jqkfTzEE4Afe+4J_<|qPS{!#5*6w_FJi5r4il`EB zFhjrCCbs66#=acRRKa&(0e5f4e7}F-{Q96-P z^&_!sMHg0F{=^;&ZOXsNn_F!KSodGlYD;MF*TrZr*AI@LkDBKCA=Uyj=5i@p(LYRI zd^Prc%0HKt2}`b{t9KehX~m)c$!aHbk^j@w94lKsT%@0A^EJV_pOz76Eu3%Mm*MS|h1ut5zQ1dfH9F)o)ZTR$pB@$L2j|atz-Y{TTJn&L+7j})>Ypij~eOk752uD{qS@0|8#n9xcc569j?hlK(Tbbd|_$?-8( z-x87e9{_9nwk!z>7z;odIHK(m~1;Hw^CnmKX1zkeSm$I9d#T zAD4fMn<5Q`^)92uvm!$ZtYg59^^SZiCjAB@`_{tYT!xR4H@hP0-?GKWaGo2ru^ISR zTJKavsl1vGzN3&hCV}rbz{dVqhXCSbFi&`f8_h>nbb9~kKah9XeYrd#8%GcP2FX`n zGwN6wTpoEmRBit3G5LRhVPMosq}bbS5S^~dG!?gCB-;6Iy!q8M&KcrzX?=?~WwLai zLIV_6Bpqjrb?X(ycZbBdcAVumM zwJnY%ef4eD8y@$vhgj4N8U;IujEA+x-`9Dp0~mfIHc%Z=l4BZUHZDLm6y3}fQcFy~ z@{@3Z+6qRs4HKVaEYv~^NG(ku!=RoC=)^n$pbNbq|1|U3ivDW3s>9t2;?z-5yo&ku zjN5rZWytYk2coP-(m`Itrt(R^lO@55H#nbyJv|OsxB<_Bn=)0-tKfi5va%k6$8WJ% zn|~D>rOgog4&2Juw+5uZ@qe{naMwchY!Xlu9rcWTp^|VLVA7eh&LV?>lxd}vUlbv= zFiVOp(^Y9ZE&99Z)17X%&@4v8`d|2ySSZOti2CX04Or8@uD|5Mn9M6mQdnube*Z&p zzRHCmWIdu+u&RC(TWQH1TQA{uf_ER3FG!cM7w(hC#L65^)3sS+&veHQOx=2Q1HmObpuiCXcnj%~VOzICjjzu2v4a$Akf&Q^Uuu{k;O%6&CdZM2bP!{q$-Lj(xfr|=kf{xbS| za?`yeiSsk^w(0Cy4W|-;*jaEa`=zX=(xe#BvA7?Ax*IY2I>=XD1hVKO1T|-YfRo%J zv4*<9eaQ6_+|<=JV;&gGQ+2d6e%z|hlBGLz=gnU?j+y`~sNy=8>Q&3lnwQ)YN(ts# z(f<_uhGxt54bAu2BsHHGTBol0SsWLrAGqId=c8-o4IS;*3MQ4*FnyReN7;p4EusIi`&r+*Oi@j+(U_BRWkrP;kaRYH5|)$Z{JIV>%H#h)uQ z)tPNS^?72Sugv5#;^MG|Ri&KF|8HroX!G^8(~$+-3+p5JMX4}`KaF19rZwg-WNGlJ zb?=h?TY{+?<)1}#;XIOAn6FtjBLE=7%`Pd#s(Fp}qKfdN*=>)arJE=Lj!u1gWo?3) zhkf?jXS|%fQBmT5f5ntCT>1Q{6=&(-7^oBsU)JCtL>vA6VLqKk70^*%caBxkZs2x( zyiU18*1vuCZ9Xk(NXw}rt%dz75TQe*Ab%459a zUw8f~zxLs^k6-z}OA{Wl+l_(jjQ@$f?;nQ0A&T8Wa`rZ+Df?MEqG&B{OQZVh6-H`+ zaiOl4gjMQB6+_Y85uWy(OVR%NkGK7Hxd^C9AYB*k4_Z1tQ?+vN&dfW6kF&&u!J{d$ zcfp92M}5*7hu(dlA%XTUiYE znD9tSZW>mXVR-o{nezb5jsphA zX6V^Jx~L`?)L97VZ~LJ=ii#Kab+Uv*k|C|8ugawiA-~1VJJmfvAFiLH#2pptrcLk;#`fpg7w>vvnGS=7ebe6qg6XsI7u$4~Ue+ELA)$6oA%Dy#M4P zuiD(X5;CrUrW37XSIwHZ4Tpz6M9?wg9~DI{TQ*E|;BxEo$|Tc3QtevJm@Hom$+VFg zY~`05il6pLYzcR_nLF|Z2F7OAer-BhopgE^ZCb3;ap$W&eO2G1Z>Z^c8(%Bq?E9`~ z$nf)9%fWoLFflrxHFlW3oyA-YwUy#Zm>-AYzh$o4>vV_m{sI?4Y{Ejuv@hETF@TDa z2FHxet_ojFshrL%Z!)jM-Y!gvs!gS@>IW9D)43E;k)_(w)c{_g%lxKITh_zkLz~ra` zP)MdBlZ)63IRh=_xVb=BZKSTJ?KCufwX}?Kvwkn9bMLaMi~>N=f6a;3JI!-@XAZOu zVb=7xiz&6?Z7{PWFX0_hr~bU&(K>a~<|*drZ~xgE`{BE%g2382nLgC{k&lgV{MO78 zB|9Ckxvt17;r4N~e&XnoikbC34KlPA-;}QD$1%B_o(-f3^>U&gJQKav+Q9Hf|J4^R zkwQr-!r(ZRY3>@@fyEZ$dui#VreD$S@{s@_)kP?ig_?{(vSiEK zCcj~`OL6`LOJ)YpLYJEBu~NE(#U%UFN5@XoSq(d*AymhIr%U{q7(nh$$dxIZdgoxO zl&zb?!&3U76WiunC8D?I61SSwJ{sZ2E8XbbHT>uaN z49^Lj8%i`gLT=pW999?Z^YVtzRwa5+*7DtJE%c_^bQsj8#E_7$$_5O>)Zj@)K43_p z0T5xR^2q)x*%;0q?G_AswkT)f$Jhk&(;fA~YOb`IgLZd9eN`uPjDYMjxenYs_6{jZD4W6w(ClX1k#^vROG* z1V3&4+=`v9QY1JE5xlSCmQ^^_^bg3PTdy*THa?KTH1vIZQf3pWP|-iUS~j*9ZXdEb zqHqPTtYIi?zkkeT~c?L*pRvGDC5&D0Ct*FYjI$QD&t3cyK)D54B|1w4S z(%2OiORf+0*SYTK-Db~Iy&vT<(>CEaoi6Qv2nME`nMp}oZil*0sN4lN1cM(k3B-av z8QB;_8IHqP-WRbqi|$I>t7ByoX?N)vsk_Y@`o9aR(uX^$Kxocps0&iiz=-YP?2j&; zq>_0}QQ&(iZsvc=u_L%CwNQ?U{XavF|5}U-3d7J>1bnFE($yZP4AUU-*B;n`ygwq? z5WvF6uN+|)c0_|VTWa??#4q9*_A+}9lP-QM(>{4KJmlZZb_JH>y4pS1n5>cWBT%T6 zMI9~l9}XPD;?4KuKOZLLG7^w3=5k-G9V$GSbRF0!j7MGbu0_52sAM(yA^GH&G*Neo zI;OQWWuQ-|e(B438*xm?p-Y1(cL{vq%PV%_j`?u2|IU zt!oY`(DSPsF7|5ODW5cw6Fw7sHK7ym4;&H0Al7LjB=H97dE@?8_4ls7t7kW9M z!<0#NkDzQali^3g>q*qmfPNt0Gom_xc*JbqqK9!w4vbO{avfYThue5dIEm%`>yhZ!{a@t+)c>4k$YYO;%nhIpD&@XMl3;)8otP;iR zadqq8xf><$?LsUckVY0i>u5}0{-Oe&L$ko85mk|Hqz{6e86hTspu6@_mC;)h(w9&w z7Ud`!oF=StZzPps@7*lDL6-LbAl=Y|XUNl}-~WD{Iagi`dkhmzVq$rHG*1(=P=Gk~ z6I@Q6|2^K|5sFIk#_O9e`48U<<8Y^LAE!e;a3L-H{+YiwpPz;@&$4T)oWosu&F!zc zaJU`vwA~nY{PcZ;zEm6^^)}XqT+cO)NkcGlT$j~li9*jM{Zlxm2OCztiT{j*X%&7( z5b_FLHUk%7MbR!g8`MPu+=P@d%r(y_0o{$fV}lQN@r2T<(u$}MEu}bkIJT?u(r7Ky z7+POQ9be%Os<{%W69WLA_Z;*QwteS602mYk(_4}xvpqwjhDAmSP7#t#6qAg*j<}33 zF=Je@KgN)jZl0Bij2Fm7NRlPRvp-HlVnpI4EQk`r=jy&)eeH;eHNOUVx{HBz?c039_&G* zg{%*}h-RM$UFgQL>$Xtcq@wb0KFi22*+(~A&9_3A=-i~1C>+h-CAb|%Ilsf7^ zZmM}>Xpd)4!pwwj)f|IS4!-ZD`^ z-@cI^$@22;V_!3eTgqBux5r!^UlpeSII}gv2V{JGaB-^GV8*vSC;lgzYi)EB4OAOL zX?)MJq2iY0lV3AU1ARARfPC_i%0 z+-K!K(aViwc?xtHOqpw0lqx60y@g@ThThW>LKc;qWA7S%)KOPHDGdIb_ir2{z+e1? z_;E>O#=CJe7;KQtw^YO!0}>kkL4`u;x|Ke-&F{KG{zO$>R`LoZ&>=q%GK&VjfhN%B7-m^fZ*4U6p zY!f-cAPXq?+l{9N9!jA z;;AvF>~5XlNWfzS5Ndu1xDRFg0CTInXHugyg%+W@6N6vYOUtf^&83$QhNb5#ni%Qd z?ytq*=zIAy=;hffkt;yk1%_74%!4Rh>!c6i8RcUDRW*5^E>CoCnNo&3zkk!fPWfg_v z4TH$fYvbTrFq0Et$p}M@ucKXjkGerO)au+#dYXCbS}!&S_iK~>wsZH2$MZd92*$=A z>04-99HY1462j1BybLR)q&71$xOLz=Tt?cuxanuKkgi+o#LxAXF;I_;AOw4CkZo@h z!eInoe|o1x!1&VD4S}bw7zY0tR<^kt*h(d6zX^sSy^hb6wrFJ=`U7BpT28gYF4bDk ze{t19X>?>X|9p5(`corM5Pi{^{o{Q&A2RIYg6kp_w@W4jPDwBm9{oH_q42Dh@w6H2 z_*z`P1Q|)JUi-kAA$^nOQc;)2f73*Q?9W0bWHL;N^jNtzP(vGP0AG`5F=Bl8KUh+fR zL(^QXKef)qQOb@bMPDfP(l0Cl>Ot^L|IQ$pyidyTL-ra?wdvUJv7Pwb`~=jeNcR~V z|H?QZJ(^Ej_36pc2oQ8n+AASglf*B_7ux~|IY|BDQ-GIYg!SxObDDYEHZ@)A&mJEA zTux|J5Dr~rtt9t!+&OwzRmrK2Zc+v;Jp^0uV~EB Date: Tue, 10 Mar 2026 20:38:32 +0800 Subject: [PATCH 02/15] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=EF=BC=9A=E6=96=B0=E5=A2=9E=E5=8F=AF=E6=8B=96=E5=8A=A8=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Windows/SettingsViews/SettingsWindow.xaml | 13 +++++++--- .../SettingsViews/SettingsWindow.xaml.cs | 26 ++++++++++++++++++- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml b/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml index ba1eba77..6d822b1f 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml +++ b/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml @@ -650,7 +650,9 @@ - + @@ -664,7 +666,8 @@ - + @@ -858,7 +861,8 @@ - + @@ -868,7 +872,8 @@ - + diff --git a/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs index b4e18967..5cf1fbdc 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs @@ -1160,6 +1160,30 @@ private void SidebarItem_MouseLeave(object sender, MouseEventArgs e) _sidebarItemMouseDownBorder = null; } + private void TopBarBorder_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + if (e.ChangedButton != MouseButton.Left) return; + DragMove(); + } + + private void SidebarTopBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + if (e.ChangedButton != MouseButton.Left) return; + + var source = e.OriginalSource as DependencyObject; + if (IsInsideElement(source, SearchButtonBorder) || IsInsideElement(source, MenuButtonBorder)) + return; + + DragMove(); + } + + private static bool IsInsideElement(DependencyObject source, DependencyObject target) + { + if (source == null || target == null) return false; + if (source == target) return true; + return IsInsideElement(VisualTreeHelper.GetParent(source), target); + } + private void CloseButton_Click(object sender, MouseButtonEventArgs e) { Close(); @@ -1838,4 +1862,4 @@ private class CustomSliderInfo #endregion } -} \ No newline at end of file +} From c60effa87c2e7597a2d481a6e3219119df323c31 Mon Sep 17 00:00:00 2001 From: JSR Date: Tue, 7 Apr 2026 20:00:56 +0800 Subject: [PATCH 03/15] =?UTF-8?q?refactor:=20=E6=96=B0=E5=A2=9E=20MainWind?= =?UTF-8?q?ow=20=E6=A0=B7=E5=BC=8F=E4=B8=8E=E5=9B=BE=E6=A0=87=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow_cs/MW_Styles.xaml | 164 ++++++++++++++++++ Ink Canvas/MainWindow_cs/MW_ToolbarIcons.xaml | 63 +++++++ 2 files changed, 227 insertions(+) create mode 100644 Ink Canvas/MainWindow_cs/MW_Styles.xaml create mode 100644 Ink Canvas/MainWindow_cs/MW_ToolbarIcons.xaml diff --git a/Ink Canvas/MainWindow_cs/MW_Styles.xaml b/Ink Canvas/MainWindow_cs/MW_Styles.xaml new file mode 100644 index 00000000..3e53bda5 --- /dev/null +++ b/Ink Canvas/MainWindow_cs/MW_Styles.xaml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ink Canvas/MainWindow_cs/MW_ToolbarIcons.xaml b/Ink Canvas/MainWindow_cs/MW_ToolbarIcons.xaml new file mode 100644 index 00000000..350eaa3a --- /dev/null +++ b/Ink Canvas/MainWindow_cs/MW_ToolbarIcons.xaml @@ -0,0 +1,63 @@ + + F0 M24,24z M0,0z M7.82154,10.0753L7.82154,3.74613C7.82154,3.06603 8.08946,2.40655 8.57377,1.92224 9.05808,1.43793 9.70726,1.17001 10.3977,1.17001 11.0881,1.17001 11.7372,1.43793 12.2216,1.92224 12.7059,2.40655 12.9738,3.05573 12.9738,3.74613L12.9738,6.37308C13.1415,6.33947 13.3139,6.32225 13.489,6.32225 14.1794,6.32225 14.8286,6.59016 15.3129,7.07447 15.4484,7.21001 15.567,7.35845 15.6675,7.5171 15.9551,7.40916 16.2634,7.35269 16.5803,7.35269 17.2707,7.35269 17.9199,7.62061 18.4042,8.10492 18.5461,8.24683 18.6695,8.4029 18.7729,8.57001 19.6856,8.26338 20.7674,8.45871 21.4647,9.15599 21.949,9.6403 22.2169,10.2998 22.2169,10.9799L22.2169,15.6169C22.2169,17.5438 21.4647,19.3574 20.1045,20.7176 18.7443,22.0778 16.9307,22.83 15.0038,22.83L13.149,22.83 13.1799,22.8094 12.8398,22.8094C11.7682,22.7579 10.7068,22.4694 9.75878,21.9541 8.70773,21.3874 7.81124,20.563 7.15175,19.5738L6.94566,19.2647C6.60562,18.7494 5.49273,16.8019 3.52458,13.3087 3.19484,12.7213 3.1021,12.0412 3.27727,11.3818 3.45245,10.7326 3.86463,10.1761 4.44168,9.83608 5.00842,9.49604 5.66791,9.35177 6.31709,9.43421 6.86548,9.50385 7.39181,9.7279 7.82154,10.0753z + F0 M24,24z M0,0z + F1 M24,24z M0,0z M22.7989,10.1653L1.14304,1.14304 10.1653,22.7989 12.8305,14.9518 19.6892,21.8105 21.8105,19.6892 14.9518,12.8305 22.7989,10.1653z + F1 M24,24z M0,0z M20.4786,1.42438C19.9985,1.23743 19.4847,1.15194 18.9698,1.17319 18.4549,1.19444 17.9499,1.32197 17.4869,1.54789 17.0368,1.76752 16.6358,2.07554 16.3083,2.45361L3.85516,14.9067 9.08243,20.134 21.5311,7.68529C21.9113,7.36382 22.223,6.96912 22.447,6.52438 22.6786,6.06462 22.8113,5.56167 22.8365,5.04763 22.8616,4.5336 22.7787,4.02012 22.593,3.54002 22.4073,3.05994 22.1232,2.62403 21.759,2.25988 21.3949,1.89574 20.9587,1.61132 20.4786,1.42438z M7.28056,21.1605L2.8286,16.7086 1.15912,22.83 7.28056,21.1605z + F1 M24,24z M0,0z M15.6314,20.7262L22.7921,13.5655C24.3494,12.141,24.2819,9.81776,22.8105,8.34633L16.7793,2.31508C15.3547,0.757753,13.0315,0.825236,11.5601,2.29666L4.38099,9.47574 15.6314,20.7262z M14.2172,22.1404L2.96677,10.89 1.20761,12.6491C-0.34971,14.0737,-0.281711,16.3974,1.18971,17.8688L6.15089,22.83 13.5276,22.83 14.2172,22.1404z + + F0 M24,24z M0,0z + F0 M24,24z M0,0z + F0 M24,24z M0,0z + F0 M24,24z M0,0z + F0 M24,24z M0,0z + F1 M24,24z M0,0z M8.7269,2.9067C8.84872,2.70875 9.00852,2.57931 9.20647,2.5184 9.41966,2.44227 9.62541,2.43465 9.82337,2.49556 10.0365,2.55647 10.2039,2.67829 10.3257,2.86102L13.9118,8.13731C12.9068,8.47231 12.0084,8.99766 11.2165,9.71334 10.4247,10.4138 9.8157,11.2513 9.38933,12.2259 8.93251,13.2156 8.70413,14.2587 8.70413,15.3551L8.7269,15.9946 2.46851,15.9946C2.22487,15.9946 2.01158,15.9185 1.82885,15.7662 1.66135,15.614 1.55481,15.4236 1.50913,15.1952 1.47868,14.9668 1.5244,14.746 1.64622,14.5328L8.7269,2.9067z + F1 M24,24z M0,0z M10.3344,5.02734L10.3605,8.62849C12.2431,8.87029 14.0305,9.44026 15.7232,10.3384 17.4676,11.2538 18.9187,12.4196 20.0759,13.8359 21.3367,15.3731 22.1398,17.0657 22.4852,18.9138 22.5197,19.1211 22.4938,19.3197 22.4075,19.5097 22.3211,19.6997 22.2003,19.8292 22.0448,19.8983 21.8894,19.9501 21.7423,19.9069 21.6042,19.7687 20.7579,18.8361 19.6268,17.9984 18.2105,17.2557 16.9324,16.5821 15.5591,16.0553 14.091,15.6754 12.7093,15.3126 11.4659,15.1313 10.3605,15.1313L10.3344,18.862C10.3344,19.2938 10.2395,19.6047 10.0495,19.7947 9.8941,19.9501 9.69547,20.0106 9.45367,19.976 9.21187,19.9242 8.99586,19.8119 8.80587,19.6392 8.14955,18.9829 6.90606,17.7739 5.07526,16.0121 3.46899,14.475 2.41544,13.4559 1.91456,12.9551 1.63821,12.6787 1.5,12.3678 1.5,12.0224 1.51727,11.6769 1.67272,11.3574 1.96634,11.0638 4.02168,9.00847 6.3103,6.73724 8.83197,4.25011 9.00468,4.07739 9.20331,3.99967 9.42784,4.01694 9.66965,4.01694 9.87683,4.11194 10.0495,4.30193 10.2395,4.47464 10.3344,4.71645 10.3344,5.02734z + F1 M24,24z M0,0z M13.6656,5.02734L13.6395,8.62849C11.7569,8.87029 9.96948,9.44026 8.27685,10.3384 6.5324,11.2538 5.08134,12.4196 3.92413,13.8359 2.6633,15.3731 1.86023,17.0657 1.5148,18.9138 1.48026,19.1211 1.50619,19.3197 1.59255,19.5097 1.6789,19.6997 1.79974,19.8292 1.95518,19.8983 2.11063,19.9501 2.25766,19.9069 2.39583,19.7687 3.24215,18.8361 4.37323,17.9984 5.78951,17.2557 7.06761,16.5821 8.44089,16.0553 9.90899,15.6754 11.2907,15.3126 12.5341,15.1313 13.6395,15.1313L13.6656,18.862C13.6656,19.2938 13.7605,19.6047 13.9505,19.7947 14.1059,19.9501 14.3045,20.0106 14.5463,19.976 14.7881,19.9242 15.0041,19.8119 15.1941,19.6392 15.8505,18.9829 17.0939,17.7739 18.9247,16.0121 20.531,14.475 21.5846,13.4559 22.0854,12.9551 22.3618,12.6787 22.5,12.3678 22.5,12.0224 22.4827,11.6769 22.3273,11.3574 22.0337,11.0638 19.9783,9.00847 17.6897,6.73724 15.168,4.25011 14.9953,4.07739 14.7967,3.99967 14.5722,4.01694 14.3304,4.01694 14.1232,4.11194 13.9505,4.30193 13.7605,4.47464 13.6656,4.71645 13.6656,5.02734z + + F0 M24,24z M0,0z M3.3994,12.9642C2.86687,12.4317,2.86687,11.5683,3.3994,11.0358L9.94485,4.49031C10.4774,3.95777 11.3408,3.95777 11.8733,4.49031 12.4059,5.02284 12.4059,5.88625 11.8733,6.41878L7.65575,10.6364 19.6364,10.6364C20.3895,10.6364 21,11.2469 21,12 21,12.7531 20.3895,13.3636 19.6364,13.3636L7.65575,13.3636 11.8733,17.5812C12.4059,18.1137 12.4059,18.9772 11.8733,19.5097 11.3408,20.0422 10.4774,20.0422 9.94485,19.5097L3.3994,12.9642z + F0 M24,24z M0,0z M20.6006,12.9642C21.1331,12.4317,21.1331,11.5683,20.6006,11.0358L14.0551,4.49031C13.5226,3.95777 12.6592,3.95777 12.1267,4.49031 11.5941,5.02284 11.5941,5.88625 12.1267,6.41878L16.3443,10.6364 4.36364,10.6364C3.61052,10.6364 3,11.2469 3,12 3,12.7531 3.61052,13.3636 4.36364,13.3636L16.3443,13.3636 12.1267,17.5812C11.5941,18.1137 11.5941,18.9772 12.1267,19.5097 12.6592,20.0422 13.5226,20.0422 14.0551,19.5097L20.6006,12.9642z + F0 M24,24z M0,0z M3.3994,12.9642C2.86687,12.4317,2.86687,11.5683,3.3994,11.0358L9.94485,4.49031C10.4774,3.95777 11.3408,3.95777 11.8733,4.49031 12.4059,5.02284 12.4059,5.88625 11.8733,6.41878L7.65575,10.6364 19.6364,10.6364C20.3895,10.6364 21,11.2469 21,12 21,12.7531 20.3895,13.3636 19.6364,13.3636L7.65575,13.3636 11.8733,17.5812C12.4059,18.1137 12.4059,18.9772 11.8733,19.5097 11.3408,20.0422 10.4774,20.0422 9.94485,19.5097L3.3994,12.9642z + F0 M24,24z M0,0z M20.6006,12.9642C21.1331,12.4317,21.1331,11.5683,20.6006,11.0358L14.0551,4.49031C13.5226,3.95777 12.6592,3.95777 12.1267,4.49031 11.5941,5.02284 11.5941,5.88625 12.1267,6.41878L16.3443,10.6364 4.36364,10.6364C3.61052,10.6364 3,11.2469 3,12 3,12.7531 3.61052,13.3636 4.36364,13.3636L16.3443,13.3636 12.1267,17.5812C11.5941,18.1137 11.5941,18.9772 12.1267,19.5097 12.6592,20.0422 13.5226,20.0422 14.0551,19.5097L20.6006,12.9642z + F0 M24,24z M0,0z M11.0357,3.3994C11.5682,2.86687,12.4316,2.86687,12.9641,3.3994L19.5096,9.94485C20.0421,10.4774 20.0421,11.3408 19.5096,11.8733 18.9771,12.4059 18.1137,12.4059 17.5811,11.8733L13.3635,7.65575 13.3635,19.6364C13.3635,20.3895 12.753,21 11.9999,21 11.2468,21 10.6363,20.3895 10.6363,19.6364L10.6363,7.65575 6.41869,11.8733C5.88616,12.4059 5.02275,12.4059 4.49022,11.8733 3.95769,11.3408 3.95769,10.4774 4.49022,9.94485L11.0357,3.3994z + F0 M24,24z M0,0z M11.0357,20.6006C11.5682,21.1331,12.4316,21.1331,12.9641,20.6006L19.5096,14.0551C20.0421,13.5226 20.0421,12.6592 19.5096,12.1267 18.9771,11.5941 18.1137,11.5941 17.5811,12.1267L13.3635,16.3443 13.3635,4.36364C13.3635,3.61052 12.753,3 11.9999,3 11.2468,3 10.6363,3.61052 10.6363,4.36364L10.6363,16.3443 6.41869,12.1267C5.88616,11.5941 5.02275,11.5941 4.49022,12.1267 3.95769,12.6592 3.95769,13.5226 4.49022,14.0551L11.0357,20.6006z + F0 M24,24z M0,0z M11.0357,3.3994C11.5682,2.86687,12.4316,2.86687,12.9641,3.3994L19.5096,9.94485C20.0421,10.4774 20.0421,11.3408 19.5096,11.8733 18.9771,12.4059 18.1137,12.4059 17.5811,11.8733L13.3635,7.65575 13.3635,19.6364C13.3635,20.3895 12.753,21 11.9999,21 11.2468,21 10.6363,20.3895 10.6363,19.6364L10.6363,7.65575 6.41869,11.8733C5.88616,12.4059 5.02275,12.4059 4.49022,11.8733 3.95769,11.3408 3.95769,10.4774 4.49022,9.94485L11.0357,3.3994z + F0 M24,24z M0,0z M11.0357,20.6006C11.5682,21.1331,12.4316,21.1331,12.9641,20.6006L19.5096,14.0551C20.0421,13.5226 20.0421,12.6592 19.5096,12.1267 18.9771,11.5941 18.1137,11.5941 17.5811,12.1267L13.3635,16.3443 13.3635,4.36364C13.3635,3.61052 12.753,3 11.9999,3 11.2468,3 10.6363,3.61052 10.6363,4.36364L10.6363,16.3443 6.41869,12.1267C5.88616,11.5941 5.02275,11.5941 4.49022,12.1267 3.95769,12.6592 3.95769,13.5226 4.49022,14.0551L11.0357,20.6006z + + + + + + + + + + + + + + + + + + + + + + + + From 4ad905d06c5487f1598c6fa828382be6f7541e09 Mon Sep 17 00:00:00 2001 From: JSR Date: Tue, 7 Apr 2026 20:01:11 +0800 Subject: [PATCH 04/15] =?UTF-8?q?refactor:=20MainWindow=20=E6=8E=A5?= =?UTF-8?q?=E5=85=A5=E8=B5=84=E6=BA=90=E5=AD=97=E5=85=B8=E5=B9=B6=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E5=86=85=E8=81=94=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml | 274 ++++++++++++------------------------- 1 file changed, 85 insertions(+), 189 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index cf129f5f..9ea0266d 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -41,6 +41,8 @@ + + @@ -149,71 +151,6 @@ - - @@ -520,7 +457,7 @@ - @@ -624,7 +561,7 @@ - + @@ -643,7 +580,7 @@ - + @@ -656,7 +593,7 @@ - + @@ -797,7 +734,7 @@ --> - + @@ -1024,7 +961,7 @@ - + @@ -1042,7 +979,7 @@ - + @@ -1098,7 +1035,7 @@ Visibility="{Binding ElementName=ToggleSwitchEnablePalmEraser, Path=IsOn, Converter={StaticResource BooleanToVisibilityConverter}}" /> - + @@ -1250,7 +1187,7 @@ - + @@ -5054,77 +4991,37 @@ Visibility="Collapsed" Panel.ZIndex="1000"> - - - - - - - - @@ -5360,7 +5257,7 @@ Geometry="F0 M24,24z M0,0z M7.82154,10.0753L7.82154,3.74613C7.82154,3.06603 8.08946,2.40655 8.57377,1.92224 9.05808,1.43793 9.70726,1.17001 10.3977,1.17001 11.0881,1.17001 11.7372,1.43793 12.2216,1.92224 12.7059,2.40655 12.9738,3.05573 12.9738,3.74613L12.9738,6.37308C13.1415,6.33947 13.3139,6.32225 13.489,6.32225 14.1794,6.32225 14.8286,6.59016 15.3129,7.07447 15.4484,7.21001 15.567,7.35845 15.6675,7.5171 15.9551,7.40916 16.2634,7.35269 16.5803,7.35269 17.2707,7.35269 17.9199,7.62061 18.4042,8.10492 18.5461,8.24683 18.6695,8.4029 18.7729,8.57001 19.6856,8.26338 20.7674,8.45871 21.4647,9.15599 21.949,9.6403 22.2169,10.2998 22.2169,10.9799L22.2169,15.6169C22.2169,17.5438 21.4647,19.3574 20.1045,20.7176 18.7443,22.0778 16.9307,22.83 15.0038,22.83L13.149,22.83 13.1799,22.8094 12.8398,22.8094C11.7682,22.7579 10.7068,22.4694 9.75878,21.9541 8.70773,21.3874 7.81124,20.563 7.15175,19.5738L6.94566,19.2647C6.60562,18.7494 5.49273,16.8019 3.52458,13.3087 3.19484,12.7213 3.1021,12.0412 3.27727,11.3818 3.45245,10.7326 3.86463,10.1761 4.44168,9.83608 5.00842,9.49604 5.66791,9.35177 6.31709,9.43421 6.86548,9.50385 7.39181,9.7279 7.82154,10.0753z M10.037,3.38547C10.1297,3.28243 10.2637,3.23091 10.3977,3.23091 10.5316,3.23091 10.6656,3.29273 10.7583,3.38547 10.8614,3.47821 10.9129,3.61217 10.9129,3.74613L10.9129,11.4745C10.9129,12.0412 11.3766,12.5049 11.9433,12.5049 12.5101,12.5049 12.9738,12.0412 12.9738,11.4745L12.9738,8.89836C12.9738,8.7644 13.0356,8.63045 13.1283,8.53771 13.2211,8.43466 13.355,8.38314 13.489,8.38314 13.623,8.38314 13.7569,8.44497 13.8497,8.53771 13.9527,8.63045 14.0042,8.7644 14.0042,8.89836L14.0042,11.4745C14.0042,12.0412 14.4679,12.5049 15.0347,12.5049 15.6014,12.5049 16.0651,12.0412 16.0651,11.4745L16.0651,9.92881C16.0651,9.79485 16.1269,9.66089 16.2197,9.56815 16.3124,9.46511 16.4464,9.41359 16.5803,9.41359 16.7143,9.41359 16.8483,9.47541 16.941,9.56815 17.044,9.66089 17.0956,9.79485 17.0956,9.92881L17.0956,10.5869C17.0752,10.7163 17.0646,10.8477 17.0646,10.9799 17.0646,11.0661 17.0754,11.1499 17.0956,11.2301L17.0956,11.4745C17.0956,12.0412 17.5593,12.5049 18.126,12.5049 18.6928,12.5049 19.1565,12.0412 19.1565,11.4745L19.1565,10.8128C19.1834,10.7399 19.2266,10.6727 19.2801,10.6192 19.4759,10.4234 19.8159,10.4234 20.0117,10.6192 20.1148,10.712 20.1663,10.8459 20.1663,10.9799L20.1663,15.6169C20.1663,16.9977 19.6408,18.296 18.6618,19.2647 17.6829,20.2333 16.3949,20.7691 15.0141,20.7691L13.1593,20.7691C12.3143,20.7691 11.4796,20.5527 10.7274,20.1509 9.98548,19.749 9.3363,19.1616 8.8726,18.4506L8.66651,18.1415C8.35737,17.6675 7.23419,15.7096 5.31756,12.2988 5.24543,12.1752 5.23512,12.0412 5.26604,11.9073 5.30725,11.7733 5.38969,11.6703 5.50304,11.5981 5.66791,11.4951 5.874,11.4539 6.06978,11.4745 6.26557,11.5054 6.45105,11.5878 6.59531,11.7321L8.11007,13.2469C8.49419,13.631 9.10425,13.648 9.50833,13.2978 9.73651,13.1084 9.88244,12.8229 9.88244,12.5049L9.88244,3.74613C9.88244,3.61217,9.94426,3.47821,10.037,3.38547z M2.99905,6.31195L1.78313,4.65293 2.61779,4.04497C3.46275,3.4267,4.37985,2.89087,5.33817,2.46838L6.27587,2.0459 7.12084,3.93162 6.18313,4.3541C5.35878,4.72506,4.56533,5.17846,3.83372,5.71429L2.99905,6.32225 2.99905,6.31195z M18.2806,5.20935L19.1565,5.75549 20.259,4.01404 19.3831,3.4679C18.1157,2.67446,16.7452,2.0768,15.3026,1.68523L14.303,1.41731 13.7672,3.40607 14.7667,3.67399C16.0033,4.00373,17.1883,4.51895,18.2806,5.20935z" /> + Geometry="{StaticResource BoardGestureGeometry2}" /> @@ -5373,7 +5270,7 @@ - - + Geometry="{StaticResource BoardSelectGeometry}" /> @@ -5579,7 +5476,7 @@ HorizontalAlignment="Center" FontSize="12" /> - @@ -5591,7 +5488,7 @@ + Geometry="{StaticResource BoardPenGeometry}" /> @@ -5629,7 +5526,7 @@ - - - - @@ -6500,7 +6397,7 @@ + Geometry="{StaticResource BoardEraserGeometry}" /> @@ -6522,7 +6419,7 @@ @@ -6576,7 +6473,7 @@ - @@ -6603,7 +6500,7 @@ - @@ -6745,7 +6642,7 @@ - @@ -7072,7 +6969,7 @@ - - @@ -7714,13 +7611,13 @@ - - @@ -7729,7 +7626,7 @@ + Geometry="{StaticResource PPTLBPreviousButtonGeometry}" /> @@ -7737,12 +7634,12 @@ - - @@ -7756,11 +7653,11 @@ - - @@ -7770,7 +7667,7 @@ + Geometry="{StaticResource PPTLBNextButtonGeometry}" /> @@ -7786,13 +7683,13 @@ - - @@ -7801,7 +7698,7 @@ + Geometry="{StaticResource PPTRBPreviousButtonGeometry}" /> @@ -7809,12 +7706,12 @@ - - @@ -7828,11 +7725,11 @@ - - @@ -7842,7 +7739,7 @@ + Geometry="{StaticResource PPTRBNextButtonGeometry}" /> @@ -7862,12 +7759,12 @@ - - @@ -7875,7 +7772,7 @@ + Geometry="{StaticResource PPTLSPreviousButtonGeometry}" /> @@ -7883,12 +7780,12 @@ - - - - @@ -7911,7 +7808,7 @@ + Geometry="{StaticResource PPTLSNextButtonGeometry}" /> @@ -7927,12 +7824,12 @@ - - @@ -7940,7 +7837,7 @@ + Geometry="{StaticResource PPTRSPreviousButtonGeometry}" /> @@ -7948,12 +7845,12 @@ - - - - @@ -7977,7 +7874,7 @@ + Geometry="{StaticResource PPTRSNextButtonGeometry}" /> @@ -9560,7 +9457,7 @@ + Geometry="{StaticResource ShapesIconGeometry}" /> @@ -9572,7 +9469,7 @@ - @@ -9834,7 +9731,7 @@ + Geometry="{StaticResource UndoIconGeometry}" /> @@ -9863,7 +9760,7 @@ + Geometry="{StaticResource RedoIconGeometry}" /> @@ -9904,7 +9801,7 @@ - @@ -10114,7 +10011,7 @@ Style="{StaticResource AutoFitMainToolbarLabel8}" /> - @@ -10339,7 +10236,7 @@ - - @@ -11066,4 +10963,3 @@ - From b00b84515ddb4a38d2b2888106bbb827e93daf19 Mon Sep 17 00:00:00 2001 From: JSR Date: Tue, 7 Apr 2026 20:01:11 +0800 Subject: [PATCH 05/15] =?UTF-8?q?refactor:=20MainWindow=20=E6=8E=A5?= =?UTF-8?q?=E5=85=A5=E8=B5=84=E6=BA=90=E5=AD=97=E5=85=B8=E5=B9=B6=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E5=86=85=E8=81=94=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml | 274 ++++++++---------------- Ink Canvas/MainWindow_cs/MW_Styles.xaml | 1 + 2 files changed, 86 insertions(+), 189 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index cf129f5f..9ea0266d 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -41,6 +41,8 @@ + + @@ -149,71 +151,6 @@ - - @@ -520,7 +457,7 @@ - @@ -624,7 +561,7 @@ - + @@ -643,7 +580,7 @@ - + @@ -656,7 +593,7 @@ - + @@ -797,7 +734,7 @@ --> - + @@ -1024,7 +961,7 @@ - + @@ -1042,7 +979,7 @@ - + @@ -1098,7 +1035,7 @@ Visibility="{Binding ElementName=ToggleSwitchEnablePalmEraser, Path=IsOn, Converter={StaticResource BooleanToVisibilityConverter}}" /> - + @@ -1250,7 +1187,7 @@ - + @@ -5054,77 +4991,37 @@ Visibility="Collapsed" Panel.ZIndex="1000"> - - - - - - - - @@ -5360,7 +5257,7 @@ Geometry="F0 M24,24z M0,0z M7.82154,10.0753L7.82154,3.74613C7.82154,3.06603 8.08946,2.40655 8.57377,1.92224 9.05808,1.43793 9.70726,1.17001 10.3977,1.17001 11.0881,1.17001 11.7372,1.43793 12.2216,1.92224 12.7059,2.40655 12.9738,3.05573 12.9738,3.74613L12.9738,6.37308C13.1415,6.33947 13.3139,6.32225 13.489,6.32225 14.1794,6.32225 14.8286,6.59016 15.3129,7.07447 15.4484,7.21001 15.567,7.35845 15.6675,7.5171 15.9551,7.40916 16.2634,7.35269 16.5803,7.35269 17.2707,7.35269 17.9199,7.62061 18.4042,8.10492 18.5461,8.24683 18.6695,8.4029 18.7729,8.57001 19.6856,8.26338 20.7674,8.45871 21.4647,9.15599 21.949,9.6403 22.2169,10.2998 22.2169,10.9799L22.2169,15.6169C22.2169,17.5438 21.4647,19.3574 20.1045,20.7176 18.7443,22.0778 16.9307,22.83 15.0038,22.83L13.149,22.83 13.1799,22.8094 12.8398,22.8094C11.7682,22.7579 10.7068,22.4694 9.75878,21.9541 8.70773,21.3874 7.81124,20.563 7.15175,19.5738L6.94566,19.2647C6.60562,18.7494 5.49273,16.8019 3.52458,13.3087 3.19484,12.7213 3.1021,12.0412 3.27727,11.3818 3.45245,10.7326 3.86463,10.1761 4.44168,9.83608 5.00842,9.49604 5.66791,9.35177 6.31709,9.43421 6.86548,9.50385 7.39181,9.7279 7.82154,10.0753z M10.037,3.38547C10.1297,3.28243 10.2637,3.23091 10.3977,3.23091 10.5316,3.23091 10.6656,3.29273 10.7583,3.38547 10.8614,3.47821 10.9129,3.61217 10.9129,3.74613L10.9129,11.4745C10.9129,12.0412 11.3766,12.5049 11.9433,12.5049 12.5101,12.5049 12.9738,12.0412 12.9738,11.4745L12.9738,8.89836C12.9738,8.7644 13.0356,8.63045 13.1283,8.53771 13.2211,8.43466 13.355,8.38314 13.489,8.38314 13.623,8.38314 13.7569,8.44497 13.8497,8.53771 13.9527,8.63045 14.0042,8.7644 14.0042,8.89836L14.0042,11.4745C14.0042,12.0412 14.4679,12.5049 15.0347,12.5049 15.6014,12.5049 16.0651,12.0412 16.0651,11.4745L16.0651,9.92881C16.0651,9.79485 16.1269,9.66089 16.2197,9.56815 16.3124,9.46511 16.4464,9.41359 16.5803,9.41359 16.7143,9.41359 16.8483,9.47541 16.941,9.56815 17.044,9.66089 17.0956,9.79485 17.0956,9.92881L17.0956,10.5869C17.0752,10.7163 17.0646,10.8477 17.0646,10.9799 17.0646,11.0661 17.0754,11.1499 17.0956,11.2301L17.0956,11.4745C17.0956,12.0412 17.5593,12.5049 18.126,12.5049 18.6928,12.5049 19.1565,12.0412 19.1565,11.4745L19.1565,10.8128C19.1834,10.7399 19.2266,10.6727 19.2801,10.6192 19.4759,10.4234 19.8159,10.4234 20.0117,10.6192 20.1148,10.712 20.1663,10.8459 20.1663,10.9799L20.1663,15.6169C20.1663,16.9977 19.6408,18.296 18.6618,19.2647 17.6829,20.2333 16.3949,20.7691 15.0141,20.7691L13.1593,20.7691C12.3143,20.7691 11.4796,20.5527 10.7274,20.1509 9.98548,19.749 9.3363,19.1616 8.8726,18.4506L8.66651,18.1415C8.35737,17.6675 7.23419,15.7096 5.31756,12.2988 5.24543,12.1752 5.23512,12.0412 5.26604,11.9073 5.30725,11.7733 5.38969,11.6703 5.50304,11.5981 5.66791,11.4951 5.874,11.4539 6.06978,11.4745 6.26557,11.5054 6.45105,11.5878 6.59531,11.7321L8.11007,13.2469C8.49419,13.631 9.10425,13.648 9.50833,13.2978 9.73651,13.1084 9.88244,12.8229 9.88244,12.5049L9.88244,3.74613C9.88244,3.61217,9.94426,3.47821,10.037,3.38547z M2.99905,6.31195L1.78313,4.65293 2.61779,4.04497C3.46275,3.4267,4.37985,2.89087,5.33817,2.46838L6.27587,2.0459 7.12084,3.93162 6.18313,4.3541C5.35878,4.72506,4.56533,5.17846,3.83372,5.71429L2.99905,6.32225 2.99905,6.31195z M18.2806,5.20935L19.1565,5.75549 20.259,4.01404 19.3831,3.4679C18.1157,2.67446,16.7452,2.0768,15.3026,1.68523L14.303,1.41731 13.7672,3.40607 14.7667,3.67399C16.0033,4.00373,17.1883,4.51895,18.2806,5.20935z" /> + Geometry="{StaticResource BoardGestureGeometry2}" /> @@ -5373,7 +5270,7 @@ - - + Geometry="{StaticResource BoardSelectGeometry}" /> @@ -5579,7 +5476,7 @@ HorizontalAlignment="Center" FontSize="12" /> - @@ -5591,7 +5488,7 @@ + Geometry="{StaticResource BoardPenGeometry}" /> @@ -5629,7 +5526,7 @@ - - - - @@ -6500,7 +6397,7 @@ + Geometry="{StaticResource BoardEraserGeometry}" /> @@ -6522,7 +6419,7 @@ @@ -6576,7 +6473,7 @@ - @@ -6603,7 +6500,7 @@ - @@ -6745,7 +6642,7 @@ - @@ -7072,7 +6969,7 @@ - - @@ -7714,13 +7611,13 @@ - - @@ -7729,7 +7626,7 @@ + Geometry="{StaticResource PPTLBPreviousButtonGeometry}" /> @@ -7737,12 +7634,12 @@ - - @@ -7756,11 +7653,11 @@ - - @@ -7770,7 +7667,7 @@ + Geometry="{StaticResource PPTLBNextButtonGeometry}" /> @@ -7786,13 +7683,13 @@ - - @@ -7801,7 +7698,7 @@ + Geometry="{StaticResource PPTRBPreviousButtonGeometry}" /> @@ -7809,12 +7706,12 @@ - - @@ -7828,11 +7725,11 @@ - - @@ -7842,7 +7739,7 @@ + Geometry="{StaticResource PPTRBNextButtonGeometry}" /> @@ -7862,12 +7759,12 @@ - - @@ -7875,7 +7772,7 @@ + Geometry="{StaticResource PPTLSPreviousButtonGeometry}" /> @@ -7883,12 +7780,12 @@ - - - - @@ -7911,7 +7808,7 @@ + Geometry="{StaticResource PPTLSNextButtonGeometry}" /> @@ -7927,12 +7824,12 @@ - - @@ -7940,7 +7837,7 @@ + Geometry="{StaticResource PPTRSPreviousButtonGeometry}" /> @@ -7948,12 +7845,12 @@ - - - - @@ -7977,7 +7874,7 @@ + Geometry="{StaticResource PPTRSNextButtonGeometry}" /> @@ -9560,7 +9457,7 @@ + Geometry="{StaticResource ShapesIconGeometry}" /> @@ -9572,7 +9469,7 @@ - @@ -9834,7 +9731,7 @@ + Geometry="{StaticResource UndoIconGeometry}" /> @@ -9863,7 +9760,7 @@ + Geometry="{StaticResource RedoIconGeometry}" /> @@ -9904,7 +9801,7 @@ - @@ -10114,7 +10011,7 @@ Style="{StaticResource AutoFitMainToolbarLabel8}" /> - @@ -10339,7 +10236,7 @@ - - @@ -11066,4 +10963,3 @@ - diff --git a/Ink Canvas/MainWindow_cs/MW_Styles.xaml b/Ink Canvas/MainWindow_cs/MW_Styles.xaml index 3e53bda5..dcf4d739 100644 --- a/Ink Canvas/MainWindow_cs/MW_Styles.xaml +++ b/Ink Canvas/MainWindow_cs/MW_Styles.xaml @@ -43,6 +43,7 @@ + + + + + + + + + - - - - - - - - - + + + + + + + diff --git a/Ink Canvas/MainWindow_controls/PenSettingsPanel.xaml.cs b/Ink Canvas/MainWindow_controls/PenSettingsPanel.xaml.cs index 5ef0db6e..c2074c53 100644 --- a/Ink Canvas/MainWindow_controls/PenSettingsPanel.xaml.cs +++ b/Ink Canvas/MainWindow_controls/PenSettingsPanel.xaml.cs @@ -3,35 +3,41 @@ using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Input; +using System.Windows.Media; namespace Ink_Canvas.MainWindow_controls { public partial class PenSettingsPanel : UserControl { + private bool _isSynchronizingControls; + public static readonly DependencyProperty PenWidthProperty = DependencyProperty.Register( - nameof(PenWidth), typeof(double), typeof(PenSettingsPanel), new PropertyMetadata(5.0)); + nameof(PenWidth), typeof(double), typeof(PenSettingsPanel), new PropertyMetadata(5.0, OnPenWidthChanged)); public static readonly DependencyProperty PenAlphaProperty = DependencyProperty.Register( - nameof(PenAlpha), typeof(double), typeof(PenSettingsPanel), new PropertyMetadata(255.0)); + nameof(PenAlpha), typeof(double), typeof(PenSettingsPanel), new PropertyMetadata(255.0, OnPenAlphaChanged)); public static readonly DependencyProperty HighlighterWidthProperty = DependencyProperty.Register( - nameof(HighlighterWidth), typeof(double), typeof(PenSettingsPanel), new PropertyMetadata(20.0)); + nameof(HighlighterWidth), typeof(double), typeof(PenSettingsPanel), new PropertyMetadata(20.0, OnHighlighterWidthChanged)); public static readonly DependencyProperty IsNibModeEnabledProperty = DependencyProperty.Register( - nameof(IsNibModeEnabled), typeof(bool), typeof(PenSettingsPanel), new PropertyMetadata(true)); + nameof(IsNibModeEnabled), typeof(bool), typeof(PenSettingsPanel), new PropertyMetadata(true, OnIsNibModeEnabledChanged)); public static readonly DependencyProperty IsInkFadeEnabledProperty = DependencyProperty.Register( - nameof(IsInkFadeEnabled), typeof(bool), typeof(PenSettingsPanel), new PropertyMetadata(false)); + nameof(IsInkFadeEnabled), typeof(bool), typeof(PenSettingsPanel), new PropertyMetadata(false, OnIsInkFadeEnabledChanged)); public static readonly DependencyProperty IsBoardModeProperty = DependencyProperty.Register( nameof(IsBoardMode), typeof(bool), typeof(PenSettingsPanel), new PropertyMetadata(false)); public static readonly DependencyProperty SelectedPenTypeProperty = DependencyProperty.Register( - nameof(SelectedPenType), typeof(int), typeof(PenSettingsPanel), new PropertyMetadata(0)); + nameof(SelectedPenType), typeof(int), typeof(PenSettingsPanel), new PropertyMetadata(0, OnSelectedPenTypeChanged)); public static readonly RoutedEvent PenTypeChangedEvent = EventManager.RegisterRoutedEvent( nameof(PenTypeChanged), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(PenSettingsPanel)); + public static readonly RoutedEvent PenStyleChangedEvent = EventManager.RegisterRoutedEvent( + nameof(PenStyleChanged), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(PenSettingsPanel)); + public static readonly RoutedEvent WidthChangedEvent = EventManager.RegisterRoutedEvent( nameof(WidthChanged), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(PenSettingsPanel)); @@ -44,6 +50,15 @@ public partial class PenSettingsPanel : UserControl public static readonly RoutedEvent InkFadeChangedEvent = EventManager.RegisterRoutedEvent( nameof(InkFadeChanged), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(PenSettingsPanel)); + public static readonly RoutedEvent InkToShapeChangedEvent = EventManager.RegisterRoutedEvent( + nameof(InkToShapeChanged), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(PenSettingsPanel)); + + public static readonly RoutedEvent BrushModeClickedEvent = EventManager.RegisterRoutedEvent( + nameof(BrushModeClicked), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(PenSettingsPanel)); + + public static readonly RoutedEvent CloseRequestedEvent = EventManager.RegisterRoutedEvent( + nameof(CloseRequested), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(PenSettingsPanel)); + public double PenWidth { get => (double)GetValue(PenWidthProperty); @@ -92,6 +107,12 @@ public event RoutedEventHandler PenTypeChanged remove => RemoveHandler(PenTypeChangedEvent, value); } + public event RoutedEventHandler PenStyleChanged + { + add => AddHandler(PenStyleChangedEvent, value); + remove => RemoveHandler(PenStyleChangedEvent, value); + } + public event RoutedEventHandler WidthChanged { add => AddHandler(WidthChangedEvent, value); @@ -116,9 +137,254 @@ public event RoutedEventHandler InkFadeChanged remove => RemoveHandler(InkFadeChangedEvent, value); } + public event RoutedEventHandler InkToShapeChanged + { + add => AddHandler(InkToShapeChangedEvent, value); + remove => RemoveHandler(InkToShapeChangedEvent, value); + } + + public event RoutedEventHandler BrushModeClicked + { + add => AddHandler(BrushModeClickedEvent, value); + remove => RemoveHandler(BrushModeClickedEvent, value); + } + + public event RoutedEventHandler CloseRequested + { + add => AddHandler(CloseRequestedEvent, value); + remove => RemoveHandler(CloseRequestedEvent, value); + } + + public Slider InkWidthSliderControl => InkWidthSlider; + + public Slider InkAlphaSliderControl => InkAlphaSlider; + + public Slider HighlighterWidthSliderControl => HighlighterWidthSlider; + + public FrameworkElement NibModePanel => NibModeSimpleStackPanel; + + public FrameworkElement InkFadePanel => InkFadeControlPanel; + + public int PenStyleSelectedIndex + { + get => ComboBoxPenStyle?.SelectedIndex ?? -1; + set + { + if (ComboBoxPenStyle != null && ComboBoxPenStyle.SelectedIndex != value) + { + SynchronizeControls(() => ComboBoxPenStyle.SelectedIndex = value); + } + } + } + + public bool IsInkToShapeEnabled + { + get => ToggleSwitchEnableInkToShape?.IsOn ?? false; + set + { + if (ToggleSwitchEnableInkToShape != null && ToggleSwitchEnableInkToShape.IsOn != value) + { + SynchronizeControls(() => ToggleSwitchEnableInkToShape.IsOn = value); + } + } + } + + public Visibility NibModePanelVisibility + { + get => NibModeSimpleStackPanel.Visibility; + set => NibModeSimpleStackPanel.Visibility = value; + } + + public Visibility InkFadePanelVisibility + { + get => InkFadeControlPanel.Visibility; + set => InkFadeControlPanel.Visibility = value; + } + public PenSettingsPanel() { InitializeComponent(); + ApplyStateToControls(); + } + + public void SetPenTypeVisualState(int penType) + { + if (SelectedPenType != penType) + { + SelectedPenType = penType; + return; + } + + UpdatePenTypeVisualState(); + } + + public void SetBrushModeActive(bool isActive) + { + if (BrushModeButton == null) + { + return; + } + + if (isActive) + { + BrushModeButton.Background = new SolidColorBrush(Color.FromRgb(37, 99, 235)); + } + else + { + BrushModeButton.ClearValue(BackgroundProperty); + } + } + + private static void OnPenWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is PenSettingsPanel panel) + { + panel.ApplyPenWidthToControl((double)e.NewValue); + } + } + + private static void OnPenAlphaChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is PenSettingsPanel panel) + { + panel.ApplyPenAlphaToControl((double)e.NewValue); + } + } + + private static void OnHighlighterWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is PenSettingsPanel panel) + { + panel.ApplyHighlighterWidthToControl((double)e.NewValue); + } + } + + private static void OnIsNibModeEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is PenSettingsPanel panel) + { + panel.ApplyNibModeToControl((bool)e.NewValue); + } + } + + private static void OnIsInkFadeEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is PenSettingsPanel panel) + { + panel.ApplyInkFadeToControl((bool)e.NewValue); + } + } + + private static void OnSelectedPenTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is PenSettingsPanel panel) + { + panel.UpdatePenTypeVisualState(); + } + } + + private void ApplyStateToControls() + { + ApplyPenWidthToControl(PenWidth); + ApplyPenAlphaToControl(PenAlpha); + ApplyHighlighterWidthToControl(HighlighterWidth); + ApplyNibModeToControl(IsNibModeEnabled); + ApplyInkFadeToControl(IsInkFadeEnabled); + UpdatePenTypeVisualState(); + } + + private void ApplyPenWidthToControl(double value) + { + if (InkWidthSlider == null || AreClose(InkWidthSlider.Value, value)) + { + return; + } + + SynchronizeControls(() => InkWidthSlider.Value = value); + } + + private void ApplyPenAlphaToControl(double value) + { + if (InkAlphaSlider == null || AreClose(InkAlphaSlider.Value, value)) + { + return; + } + + SynchronizeControls(() => InkAlphaSlider.Value = value); + } + + private void ApplyHighlighterWidthToControl(double value) + { + if (HighlighterWidthSlider == null || AreClose(HighlighterWidthSlider.Value, value)) + { + return; + } + + SynchronizeControls(() => HighlighterWidthSlider.Value = value); + } + + private void ApplyNibModeToControl(bool value) + { + if (ToggleSwitchEnableNibMode == null || ToggleSwitchEnableNibMode.IsOn == value) + { + return; + } + + SynchronizeControls(() => ToggleSwitchEnableNibMode.IsOn = value); + } + + private void ApplyInkFadeToControl(bool value) + { + if (ToggleSwitchInkFade == null || ToggleSwitchInkFade.IsOn == value) + { + return; + } + + SynchronizeControls(() => ToggleSwitchInkFade.IsOn = value); + } + + private void UpdatePenTypeVisualState() + { + bool isDefaultPen = SelectedPenType != 1; + + DefaultPenPropsPanel.Visibility = isDefaultPen ? Visibility.Visible : Visibility.Collapsed; + HighlighterPenPropsPanel.Visibility = isDefaultPen ? Visibility.Collapsed : Visibility.Visible; + + DefaultPenTabButton.Opacity = isDefaultPen ? 1 : 0.9; + DefaultPenTabButtonText.FontWeight = isDefaultPen ? FontWeights.Bold : FontWeights.Normal; + DefaultPenTabButtonText.FontSize = isDefaultPen ? 9.5 : 9; + DefaultPenTabButtonText.Margin = isDefaultPen ? new Thickness(2, 0.5, 0, 0) : new Thickness(2, 1, 0, 0); + DefaultPenTabButton.Background = isDefaultPen + ? new SolidColorBrush(Color.FromArgb(72, 219, 234, 254)) + : new SolidColorBrush(Colors.Transparent); + DefaultPenTabButtonIndicator.Visibility = isDefaultPen ? Visibility.Visible : Visibility.Collapsed; + + HighlightPenTabButton.Opacity = isDefaultPen ? 0.9 : 1; + HighlightPenTabButtonText.FontWeight = isDefaultPen ? FontWeights.Normal : FontWeights.Bold; + HighlightPenTabButtonText.FontSize = isDefaultPen ? 9 : 9.5; + HighlightPenTabButtonText.Margin = isDefaultPen ? new Thickness(2, 1, 0, 0) : new Thickness(2, 0.5, 0, 0); + HighlightPenTabButton.Background = isDefaultPen + ? new SolidColorBrush(Colors.Transparent) + : new SolidColorBrush(Color.FromArgb(72, 219, 234, 254)); + HighlightPenTabButtonIndicator.Visibility = isDefaultPen ? Visibility.Collapsed : Visibility.Visible; + } + + private void SynchronizeControls(Action action) + { + _isSynchronizingControls = true; + try + { + action(); + } + finally + { + _isSynchronizingControls = false; + } + } + + private static bool AreClose(double left, double right) + { + return Math.Abs(left - right) < 0.001; } private void Border_MouseDown(object sender, MouseButtonEventArgs e) @@ -127,7 +393,7 @@ private void Border_MouseDown(object sender, MouseButtonEventArgs e) private void CloseBordertools_MouseUp(object sender, MouseButtonEventArgs e) { - RaiseEvent(new RoutedEventArgs(PenTypeChangedEvent, this)); + RaiseEvent(new RoutedEventArgs(CloseRequestedEvent, this)); } private void SwitchToDefaultPen(object sender, MouseButtonEventArgs e) @@ -144,47 +410,87 @@ private void SwitchToHighlighterPen(object sender, MouseButtonEventArgs e) private void ComboBoxPenStyle_SelectionChanged(object sender, SelectionChangedEventArgs e) { - RaiseEvent(new RoutedEventArgs(PenTypeChangedEvent, this)); + if (_isSynchronizingControls) + { + return; + } + + RaiseEvent(new RoutedEventArgs(PenStyleChangedEvent, this)); } private void ToggleSwitchEnableNibMode_Toggled(object sender, RoutedEventArgs e) { IsNibModeEnabled = ToggleSwitchEnableNibMode.IsOn; + + if (_isSynchronizingControls) + { + return; + } + RaiseEvent(new RoutedEventArgs(NibModeChangedEvent, this)); } private void ToggleSwitchEnableInkToShape_Toggled(object sender, RoutedEventArgs e) { - RaiseEvent(new RoutedEventArgs(PenTypeChangedEvent, this)); + if (_isSynchronizingControls) + { + return; + } + + RaiseEvent(new RoutedEventArgs(InkToShapeChangedEvent, this)); } private void ToggleSwitchInkFade_Toggled(object sender, RoutedEventArgs e) { IsInkFadeEnabled = ToggleSwitchInkFade.IsOn; + + if (_isSynchronizingControls) + { + return; + } + RaiseEvent(new RoutedEventArgs(InkFadeChangedEvent, this)); } private void InkWidthSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { PenWidth = InkWidthSlider.Value; + + if (_isSynchronizingControls) + { + return; + } + RaiseEvent(new RoutedEventArgs(WidthChangedEvent, this)); } private void InkAlphaSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { PenAlpha = InkAlphaSlider.Value; + + if (_isSynchronizingControls) + { + return; + } + RaiseEvent(new RoutedEventArgs(AlphaChangedEvent, this)); } private void HighlighterWidthSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { HighlighterWidth = HighlighterWidthSlider.Value; + + if (_isSynchronizingControls) + { + return; + } + RaiseEvent(new RoutedEventArgs(WidthChangedEvent, this)); } private void BrushModeButton_Click(object sender, RoutedEventArgs e) { - RaiseEvent(new RoutedEventArgs(PenTypeChangedEvent, this)); + RaiseEvent(new RoutedEventArgs(BrushModeClickedEvent, this)); } } } diff --git a/Ink Canvas/MainWindow_controls/StrokeSelectionToolbar.xaml b/Ink Canvas/MainWindow_controls/StrokeSelectionToolbar.xaml index b42c473a..f0b09b36 100644 --- a/Ink Canvas/MainWindow_controls/StrokeSelectionToolbar.xaml +++ b/Ink Canvas/MainWindow_controls/StrokeSelectionToolbar.xaml @@ -7,7 +7,6 @@ HorizontalAlignment="Left" VerticalAlignment="Top" Margin="800,900,0,0" CornerRadius="5" Height="80" Background="{DynamicResource FloatBarBackground}" - Visibility="{Binding IsVisible, ElementName=Root, Mode=TwoWay}" BorderThickness="1" BorderBrush="{DynamicResource FloatBarBorderBrush}"> diff --git a/Ink Canvas/MainWindow_controls/StrokeSelectionToolbar.xaml.cs b/Ink Canvas/MainWindow_controls/StrokeSelectionToolbar.xaml.cs index 44a91e75..e820be66 100644 --- a/Ink Canvas/MainWindow_controls/StrokeSelectionToolbar.xaml.cs +++ b/Ink Canvas/MainWindow_controls/StrokeSelectionToolbar.xaml.cs @@ -11,8 +11,9 @@ public partial class StrokeSelectionToolbar : UserControl public static readonly DependencyProperty SelectedStrokesProperty = DependencyProperty.Register( nameof(SelectedStrokes), typeof(object), typeof(StrokeSelectionToolbar), new PropertyMetadata(null)); - public static readonly DependencyProperty IsVisibleProperty = DependencyProperty.Register( - nameof(IsVisible), typeof(Visibility), typeof(StrokeSelectionToolbar), new PropertyMetadata(Visibility.Collapsed)); + public static new readonly DependencyProperty VisibilityProperty = DependencyProperty.Register( + nameof(Visibility), typeof(Visibility), typeof(StrokeSelectionToolbar), + new FrameworkPropertyMetadata(Visibility.Collapsed, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnVisibilityChanged)); public static readonly RoutedEvent CloneRequestedEvent = EventManager.RegisterRoutedEvent( nameof(CloneRequested), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(StrokeSelectionToolbar)); @@ -32,16 +33,44 @@ public partial class StrokeSelectionToolbar : UserControl public static readonly RoutedEvent WidthChangedEvent = EventManager.RegisterRoutedEvent( nameof(WidthChanged), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(StrokeSelectionToolbar)); + // 用于向后兼容 - 暴露内部 Border 以便 partial class 访问 + public Border BorderSelectionControl => BorderStrokeSelectionControl; + public object SelectedStrokes { get => GetValue(SelectedStrokesProperty); set => SetValue(SelectedStrokesProperty, value); } - public new Visibility IsVisible + public new Visibility Visibility + { + get => (Visibility)GetValue(VisibilityProperty); + set => SetValue(VisibilityProperty, value); + } + + // 暴露 Margin 属性以便 MW_SelectionGestures.cs 设置位置 + public Thickness ControlMargin + { + get => BorderStrokeSelectionControl.Margin; + set => BorderStrokeSelectionControl.Margin = value; + } + + // 暴露 Child 属性以便 MW_AutoTheme.cs 访问 + public UIElement ControlChild + { + get => BorderStrokeSelectionControl.Child; + } + + // 暴露 InvalidateVisual 方法以便 MW_AutoTheme.cs 调用 + public void InvalidateVisualOnControl() + { + BorderStrokeSelectionControl.InvalidateVisual(); + } + + // 暴露克隆按钮背景设置方法 + public void SetCloneButtonBackground(Brush brush) { - get => (Visibility)GetValue(IsVisibleProperty); - set => SetValue(IsVisibleProperty, value); + BorderStrokeSelectionClone.Background = brush; } public event RoutedEventHandler CloneRequested @@ -85,8 +114,17 @@ public StrokeSelectionToolbar() InitializeComponent(); } + private static void OnVisibilityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is StrokeSelectionToolbar toolbar) + { + toolbar.BorderStrokeSelectionControl.Visibility = (Visibility)e.NewValue; + } + } + private void Border_MouseDown(object sender, MouseButtonEventArgs e) { + // 空处理 - 让事件冒泡以便 MW_SelectionGestures.cs 处理 lastBorderMouseDownObject } private void BorderStrokeSelectionClone_MouseUp(object sender, MouseButtonEventArgs e) diff --git a/Ink Canvas/MainWindow_cs/MW_AutoFold.cs b/Ink Canvas/MainWindow_cs/MW_AutoFold.cs index 0d7de4fe..e8ce63ce 100644 --- a/Ink Canvas/MainWindow_cs/MW_AutoFold.cs +++ b/Ink Canvas/MainWindow_cs/MW_AutoFold.cs @@ -148,8 +148,8 @@ await Dispatcher.InvokeAsync(() => await Dispatcher.InvokeAsync(() => { - LeftBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed; - RightBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed; + BorderPPTNavBottomLeft.Visibility = Visibility.Collapsed; + BorderPPTNavBottomRight.Visibility = Visibility.Collapsed; LeftSidePanelForPPTNavigation.Visibility = Visibility.Collapsed; RightSidePanelForPPTNavigation.Visibility = Visibility.Collapsed; GridForFloatingBarDraging.Visibility = Visibility.Collapsed; @@ -415,16 +415,16 @@ await Dispatcher.InvokeAsync(() => { var dops = Settings.PowerPointSettings.PPTButtonsDisplayOption.ToString(); var dopsc = dops.ToCharArray(); - if (dopsc[0] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(LeftBottomPanelForPPTNavigation); - if (dopsc[1] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(RightBottomPanelForPPTNavigation); + if (dopsc[0] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(BorderPPTNavBottomLeft); + if (dopsc[1] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(BorderPPTNavBottomRight); if (dopsc[2] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(LeftSidePanelForPPTNavigation); if (dopsc[3] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(RightSidePanelForPPTNavigation); } else { // 如果条件不满足,确保隐藏翻页按钮 - LeftBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed; - RightBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed; + BorderPPTNavBottomLeft.Visibility = Visibility.Collapsed; + BorderPPTNavBottomRight.Visibility = Visibility.Collapsed; LeftSidePanelForPPTNavigation.Visibility = Visibility.Collapsed; RightSidePanelForPPTNavigation.Visibility = Visibility.Collapsed; } diff --git a/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs b/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs index 06131fc5..03923728 100644 --- a/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs +++ b/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs @@ -443,11 +443,9 @@ private void RefreshStrokeSelectionIcons() { if (BorderStrokeSelectionControl != null) { - // 强制刷新墨迹选中栏的视觉状态 - BorderStrokeSelectionControl.InvalidateVisual(); + BorderStrokeSelectionControl.InvalidateVisualOnControl(); - // 刷新墨迹选中栏内的所有图标 - var viewbox = BorderStrokeSelectionControl.Child as Viewbox; + var viewbox = BorderStrokeSelectionControl.ControlChild as Viewbox; if (viewbox?.Child is ui.SimpleStackPanel stackPanel) { RefreshStrokeSelectionIconsRecursive(stackPanel); @@ -501,11 +499,9 @@ private void RefreshImageSelectionIcons() { if (BorderImageSelectionControl != null) { - // 强制刷新图片选中栏的视觉状态 - BorderImageSelectionControl.InvalidateVisual(); + BorderImageSelectionControl.InvalidateVisualOnControl(); - // 刷新图片选中栏内的所有图标 - var viewbox = BorderImageSelectionControl.Child as Viewbox; + var viewbox = BorderImageSelectionControl.ControlChild as Viewbox; if (viewbox?.Child is ui.SimpleStackPanel stackPanel) { RefreshImageSelectionIconsRecursive(stackPanel); diff --git a/Ink Canvas/MainWindow_cs/MW_Colors.cs b/Ink Canvas/MainWindow_cs/MW_Colors.cs index 133d23c9..85d88ff8 100644 --- a/Ink Canvas/MainWindow_cs/MW_Colors.cs +++ b/Ink Canvas/MainWindow_cs/MW_Colors.cs @@ -279,203 +279,17 @@ private void CheckColorTheme(bool changeColorTheme = false) inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(249, 115, 22); } - if (isUselightThemeColor) - { - // 亮系 - // 亮色的红色 - BorderPenColorRed.Background = new SolidColorBrush(Color.FromRgb(239, 68, 68)); - BoardBorderPenColorRed.Background = new SolidColorBrush(Color.FromRgb(239, 68, 68)); - // 亮色的绿色 - BorderPenColorGreen.Background = new SolidColorBrush(Color.FromRgb(34, 197, 94)); - BoardBorderPenColorGreen.Background = new SolidColorBrush(Color.FromRgb(34, 197, 94)); - // 亮色的蓝色 - BorderPenColorBlue.Background = new SolidColorBrush(Color.FromRgb(59, 130, 246)); - BoardBorderPenColorBlue.Background = new SolidColorBrush(Color.FromRgb(59, 130, 246)); - // 亮色的黄色 - BorderPenColorYellow.Background = new SolidColorBrush(Color.FromRgb(250, 204, 21)); - BoardBorderPenColorYellow.Background = new SolidColorBrush(Color.FromRgb(250, 204, 21)); - // 亮色的粉色 - BorderPenColorPink.Background = new SolidColorBrush(Color.FromRgb(236, 72, 153)); - BoardBorderPenColorPink.Background = new SolidColorBrush(Color.FromRgb(236, 72, 153)); - // 亮色的Teal - BorderPenColorTeal.Background = new SolidColorBrush(Color.FromRgb(20, 184, 166)); - BoardBorderPenColorTeal.Background = new SolidColorBrush(Color.FromRgb(20, 184, 166)); - // 亮色的Orange - BorderPenColorOrange.Background = new SolidColorBrush(Color.FromRgb(249, 115, 22)); - BoardBorderPenColorOrange.Background = new SolidColorBrush(Color.FromRgb(249, 115, 22)); - - var newImageSource = new BitmapImage(); - newImageSource.BeginInit(); - newImageSource.UriSource = new Uri("/Resources/Icons-Fluent/ic_fluent_weather_moon_24_regular.png", - UriKind.RelativeOrAbsolute); - newImageSource.EndInit(); - ColorThemeSwitchIcon.Source = newImageSource; - BoardColorThemeSwitchIcon.Source = newImageSource; - - ColorThemeSwitchTextBlock.Text = "暗系"; - BoardColorThemeSwitchTextBlock.Text = "暗系"; - } - else - { - // 暗系 - // 暗色的红色 - BorderPenColorRed.Background = new SolidColorBrush(Color.FromRgb(220, 38, 38)); - BoardBorderPenColorRed.Background = new SolidColorBrush(Color.FromRgb(220, 38, 38)); - // 暗色的绿色 - BorderPenColorGreen.Background = new SolidColorBrush(Color.FromRgb(22, 163, 74)); - BoardBorderPenColorGreen.Background = new SolidColorBrush(Color.FromRgb(22, 163, 74)); - // 暗色的蓝色 - BorderPenColorBlue.Background = new SolidColorBrush(Color.FromRgb(37, 99, 235)); - BoardBorderPenColorBlue.Background = new SolidColorBrush(Color.FromRgb(37, 99, 235)); - // 暗色的黄色 - BorderPenColorYellow.Background = new SolidColorBrush(Color.FromRgb(234, 179, 8)); - BoardBorderPenColorYellow.Background = new SolidColorBrush(Color.FromRgb(234, 179, 8)); - // 暗色的紫色对应亮色的粉色 - BorderPenColorPink.Background = new SolidColorBrush(Color.FromRgb(147, 51, 234)); - BoardBorderPenColorPink.Background = new SolidColorBrush(Color.FromRgb(147, 51, 234)); - // 暗色的Teal - BorderPenColorTeal.Background = new SolidColorBrush(Color.FromRgb(13, 148, 136)); - BoardBorderPenColorTeal.Background = new SolidColorBrush(Color.FromRgb(13, 148, 136)); - // 暗色的Orange - BorderPenColorOrange.Background = new SolidColorBrush(Color.FromRgb(234, 88, 12)); - BoardBorderPenColorOrange.Background = new SolidColorBrush(Color.FromRgb(234, 88, 12)); - - var newImageSource = new BitmapImage(); - newImageSource.BeginInit(); - newImageSource.UriSource = new Uri("/Resources/Icons-Fluent/ic_fluent_weather_sunny_24_regular.png", - UriKind.RelativeOrAbsolute); - newImageSource.EndInit(); - ColorThemeSwitchIcon.Source = newImageSource; - BoardColorThemeSwitchIcon.Source = newImageSource; - - ColorThemeSwitchTextBlock.Text = "亮系"; - BoardColorThemeSwitchTextBlock.Text = "亮系"; - } - - // 改变选中提示 - ViewboxBtnColorBlackContent.Visibility = Visibility.Collapsed; - ViewboxBtnColorBlueContent.Visibility = Visibility.Collapsed; - ViewboxBtnColorGreenContent.Visibility = Visibility.Collapsed; - ViewboxBtnColorRedContent.Visibility = Visibility.Collapsed; - ViewboxBtnColorYellowContent.Visibility = Visibility.Collapsed; - ViewboxBtnColorWhiteContent.Visibility = Visibility.Collapsed; - ViewboxBtnColorPinkContent.Visibility = Visibility.Collapsed; - ViewboxBtnColorTealContent.Visibility = Visibility.Collapsed; - ViewboxBtnColorOrangeContent.Visibility = Visibility.Collapsed; - - BoardViewboxBtnColorBlackContent.Visibility = Visibility.Collapsed; - BoardViewboxBtnColorBlueContent.Visibility = Visibility.Collapsed; - BoardViewboxBtnColorGreenContent.Visibility = Visibility.Collapsed; - BoardViewboxBtnColorRedContent.Visibility = Visibility.Collapsed; - BoardViewboxBtnColorYellowContent.Visibility = Visibility.Collapsed; - BoardViewboxBtnColorWhiteContent.Visibility = Visibility.Collapsed; - BoardViewboxBtnColorPinkContent.Visibility = Visibility.Collapsed; - BoardViewboxBtnColorTealContent.Visibility = Visibility.Collapsed; - BoardViewboxBtnColorOrangeContent.Visibility = Visibility.Collapsed; - - HighlighterPenViewboxBtnColorBlackContent.Visibility = Visibility.Collapsed; - HighlighterPenViewboxBtnColorBlueContent.Visibility = Visibility.Collapsed; - HighlighterPenViewboxBtnColorGreenContent.Visibility = Visibility.Collapsed; - HighlighterPenViewboxBtnColorOrangeContent.Visibility = Visibility.Collapsed; - HighlighterPenViewboxBtnColorPurpleContent.Visibility = Visibility.Collapsed; - HighlighterPenViewboxBtnColorRedContent.Visibility = Visibility.Collapsed; - HighlighterPenViewboxBtnColorTealContent.Visibility = Visibility.Collapsed; - HighlighterPenViewboxBtnColorWhiteContent.Visibility = Visibility.Collapsed; - HighlighterPenViewboxBtnColorYellowContent.Visibility = Visibility.Collapsed; - HighlighterPenViewboxBtnColorZincContent.Visibility = Visibility.Collapsed; - - BoardHighlighterPenViewboxBtnColorBlackContent.Visibility = Visibility.Collapsed; - BoardHighlighterPenViewboxBtnColorBlueContent.Visibility = Visibility.Collapsed; - BoardHighlighterPenViewboxBtnColorGreenContent.Visibility = Visibility.Collapsed; - BoardHighlighterPenViewboxBtnColorOrangeContent.Visibility = Visibility.Collapsed; - BoardHighlighterPenViewboxBtnColorPurpleContent.Visibility = Visibility.Collapsed; - BoardHighlighterPenViewboxBtnColorRedContent.Visibility = Visibility.Collapsed; - BoardHighlighterPenViewboxBtnColorTealContent.Visibility = Visibility.Collapsed; - BoardHighlighterPenViewboxBtnColorWhiteContent.Visibility = Visibility.Collapsed; - BoardHighlighterPenViewboxBtnColorYellowContent.Visibility = Visibility.Collapsed; - BoardHighlighterPenViewboxBtnColorZincContent.Visibility = Visibility.Collapsed; - - switch (inkColor) - { - case 0: - ViewboxBtnColorBlackContent.Visibility = Visibility.Visible; - BoardViewboxBtnColorBlackContent.Visibility = Visibility.Visible; - break; - case 1: - ViewboxBtnColorRedContent.Visibility = Visibility.Visible; - BoardViewboxBtnColorRedContent.Visibility = Visibility.Visible; - break; - case 2: - ViewboxBtnColorGreenContent.Visibility = Visibility.Visible; - BoardViewboxBtnColorGreenContent.Visibility = Visibility.Visible; - break; - case 3: - ViewboxBtnColorBlueContent.Visibility = Visibility.Visible; - BoardViewboxBtnColorBlueContent.Visibility = Visibility.Visible; - break; - case 4: - ViewboxBtnColorYellowContent.Visibility = Visibility.Visible; - BoardViewboxBtnColorYellowContent.Visibility = Visibility.Visible; - break; - case 5: - ViewboxBtnColorWhiteContent.Visibility = Visibility.Visible; - BoardViewboxBtnColorWhiteContent.Visibility = Visibility.Visible; - break; - case 6: - ViewboxBtnColorPinkContent.Visibility = Visibility.Visible; - BoardViewboxBtnColorPinkContent.Visibility = Visibility.Visible; - break; - case 7: - ViewboxBtnColorTealContent.Visibility = Visibility.Visible; - break; - case 8: - ViewboxBtnColorOrangeContent.Visibility = Visibility.Visible; - break; - } - - switch (highlighterColor) - { - case 100: - HighlighterPenViewboxBtnColorBlackContent.Visibility = Visibility.Visible; - BoardHighlighterPenViewboxBtnColorBlackContent.Visibility = Visibility.Visible; - break; - case 101: - HighlighterPenViewboxBtnColorWhiteContent.Visibility = Visibility.Visible; - BoardHighlighterPenViewboxBtnColorWhiteContent.Visibility = Visibility.Visible; - break; - case 102: - HighlighterPenViewboxBtnColorRedContent.Visibility = Visibility.Visible; - BoardHighlighterPenViewboxBtnColorRedContent.Visibility = Visibility.Visible; - break; - case 103: - HighlighterPenViewboxBtnColorYellowContent.Visibility = Visibility.Visible; - BoardHighlighterPenViewboxBtnColorYellowContent.Visibility = Visibility.Visible; - break; - case 104: - HighlighterPenViewboxBtnColorGreenContent.Visibility = Visibility.Visible; - BoardHighlighterPenViewboxBtnColorGreenContent.Visibility = Visibility.Visible; - break; - case 105: - HighlighterPenViewboxBtnColorZincContent.Visibility = Visibility.Visible; - BoardHighlighterPenViewboxBtnColorZincContent.Visibility = Visibility.Visible; - break; - case 106: - HighlighterPenViewboxBtnColorBlueContent.Visibility = Visibility.Visible; - BoardHighlighterPenViewboxBtnColorBlueContent.Visibility = Visibility.Visible; - break; - case 107: - HighlighterPenViewboxBtnColorPurpleContent.Visibility = Visibility.Visible; - BoardHighlighterPenViewboxBtnColorPurpleContent.Visibility = Visibility.Visible; - break; - case 108: - HighlighterPenViewboxBtnColorTealContent.Visibility = Visibility.Visible; - BoardHighlighterPenViewboxBtnColorTealContent.Visibility = Visibility.Visible; - break; - case 109: - HighlighterPenViewboxBtnColorOrangeContent.Visibility = Visibility.Visible; - BoardHighlighterPenViewboxBtnColorOrangeContent.Visibility = Visibility.Visible; - break; - } + var penPalette = BorderPenColorPaletteControl as MainWindow_controls.PenColorPalette; + var boardPenPalette = BoardBorderPenColorPaletteControl as MainWindow_controls.PenColorPalette; + penPalette?.SetUseLightThemeColors(isUselightThemeColor); + boardPenPalette?.SetUseLightThemeColors(isUselightThemeColor); + penPalette?.SetSelectedColorCode(inkColor); + boardPenPalette?.SetSelectedColorCode(inkColor); + + var highlighterPalette = (object)HighlighterPenColorsPanel as MainWindow_controls.HighlighterColorPalette; + var boardHighlighterPalette = (object)BoardHighlighterPenColorsPanel as MainWindow_controls.HighlighterColorPalette; + highlighterPalette?.SetSelectedColorCode(highlighterColor); + boardHighlighterPalette?.SetSelectedColorCode(highlighterColor); // 更新快捷调色盘选择指示器 if (penType == 0) @@ -520,39 +334,13 @@ private async void CheckPenTypeUIState() { if (penType == 0) { - DefaultPenPropsPanel.Visibility = Visibility.Visible; - DefaultPenColorsPanel.Visibility = Visibility.Visible; + BorderPenSettingsControl?.SetPenTypeVisualState(0); + BoardPenSettingsControl?.SetPenTypeVisualState(0); + BorderPenColorPaletteControl.Visibility = Visibility.Visible; HighlighterPenColorsPanel.Visibility = Visibility.Collapsed; - HighlighterPenPropsPanel.Visibility = Visibility.Collapsed; - DefaultPenTabButton.Opacity = 1; - DefaultPenTabButtonText.FontWeight = FontWeights.Bold; - DefaultPenTabButtonText.Margin = new Thickness(2, 0.5, 0, 0); - DefaultPenTabButtonText.FontSize = 9.5; - DefaultPenTabButton.Background = new SolidColorBrush(Color.FromArgb(72, 219, 234, 254)); - DefaultPenTabButtonIndicator.Visibility = Visibility.Visible; - HighlightPenTabButton.Opacity = 0.9; - HighlightPenTabButtonText.FontWeight = FontWeights.Normal; - HighlightPenTabButtonText.FontSize = 9; - HighlightPenTabButtonText.Margin = new Thickness(2, 1, 0, 0); - HighlightPenTabButton.Background = new SolidColorBrush(Colors.Transparent); - HighlightPenTabButtonIndicator.Visibility = Visibility.Collapsed; - - BoardDefaultPenPropsPanel.Visibility = Visibility.Visible; - BoardDefaultPenColorsPanel.Visibility = Visibility.Visible; + + BoardBorderPenColorPaletteControl.Visibility = Visibility.Visible; BoardHighlighterPenColorsPanel.Visibility = Visibility.Collapsed; - BoardHighlighterPenPropsPanel.Visibility = Visibility.Collapsed; - BoardDefaultPenTabButton.Opacity = 1; - BoardDefaultPenTabButtonText.FontWeight = FontWeights.Bold; - BoardDefaultPenTabButtonText.Margin = new Thickness(2, 0.5, 0, 0); - BoardDefaultPenTabButtonText.FontSize = 9.5; - BoardDefaultPenTabButton.Background = new SolidColorBrush(Color.FromArgb(72, 219, 234, 254)); - BoardDefaultPenTabButtonIndicator.Visibility = Visibility.Visible; - BoardHighlightPenTabButton.Opacity = 0.9; - BoardHighlightPenTabButtonText.FontWeight = FontWeights.Normal; - BoardHighlightPenTabButtonText.FontSize = 9; - BoardHighlightPenTabButtonText.Margin = new Thickness(2, 1, 0, 0); - BoardHighlightPenTabButton.Background = new SolidColorBrush(Colors.Transparent); - BoardHighlightPenTabButtonIndicator.Visibility = Visibility.Collapsed; // PenPalette.Margin = new Thickness(-160, -200, -33, 32); await Dispatcher.InvokeAsync(() => @@ -588,39 +376,13 @@ await Dispatcher.InvokeAsync(() => } else if (penType == 1) { - DefaultPenPropsPanel.Visibility = Visibility.Collapsed; - DefaultPenColorsPanel.Visibility = Visibility.Collapsed; + BorderPenSettingsControl?.SetPenTypeVisualState(1); + BoardPenSettingsControl?.SetPenTypeVisualState(1); + BorderPenColorPaletteControl.Visibility = Visibility.Collapsed; HighlighterPenColorsPanel.Visibility = Visibility.Visible; - HighlighterPenPropsPanel.Visibility = Visibility.Visible; - DefaultPenTabButton.Opacity = 0.9; - DefaultPenTabButtonText.FontWeight = FontWeights.Normal; - DefaultPenTabButtonText.FontSize = 9; - DefaultPenTabButtonText.Margin = new Thickness(2, 1, 0, 0); - DefaultPenTabButton.Background = new SolidColorBrush(Colors.Transparent); - DefaultPenTabButtonIndicator.Visibility = Visibility.Collapsed; - HighlightPenTabButton.Opacity = 1; - HighlightPenTabButtonText.FontWeight = FontWeights.Bold; - HighlightPenTabButtonText.FontSize = 9.5; - HighlightPenTabButtonText.Margin = new Thickness(2, 0.5, 0, 0); - HighlightPenTabButton.Background = new SolidColorBrush(Color.FromArgb(72, 219, 234, 254)); - HighlightPenTabButtonIndicator.Visibility = Visibility.Visible; - - BoardDefaultPenPropsPanel.Visibility = Visibility.Collapsed; - BoardDefaultPenColorsPanel.Visibility = Visibility.Collapsed; + + BoardBorderPenColorPaletteControl.Visibility = Visibility.Collapsed; BoardHighlighterPenColorsPanel.Visibility = Visibility.Visible; - BoardHighlighterPenPropsPanel.Visibility = Visibility.Visible; - BoardDefaultPenTabButton.Opacity = 0.9; - BoardDefaultPenTabButtonText.FontWeight = FontWeights.Normal; - BoardDefaultPenTabButtonText.FontSize = 9; - BoardDefaultPenTabButtonText.Margin = new Thickness(2, 1, 0, 0); - BoardDefaultPenTabButton.Background = new SolidColorBrush(Colors.Transparent); - BoardDefaultPenTabButtonIndicator.Visibility = Visibility.Collapsed; - BoardHighlightPenTabButton.Opacity = 1; - BoardHighlightPenTabButtonText.FontWeight = FontWeights.Bold; - BoardHighlightPenTabButtonText.FontSize = 9.5; - BoardHighlightPenTabButtonText.Margin = new Thickness(2, 0.5, 0, 0); - BoardHighlightPenTabButton.Background = new SolidColorBrush(Color.FromArgb(72, 219, 234, 254)); - BoardHighlightPenTabButtonIndicator.Visibility = Visibility.Visible; // PenPalette.Margin = new Thickness(-160, -157, -33, 32); await Dispatcher.InvokeAsync(() => @@ -932,6 +694,32 @@ private void BtnHighlighterColorOrange_Click(object sender, RoutedEventArgs e) ColorSwitchCheck(); } + private void HighlighterColorPalette_ColorSelected(object sender, RoutedEventArgs e) + { + var palette = sender as MainWindow_controls.HighlighterColorPalette; + if (palette == null) + { + return; + } + + CheckLastColor(palette.SelectedColorCode, true); + penType = 1; + CheckPenTypeUIState(); + ColorSwitchCheck(); + } + + private void PenColorPalette_ColorSelected(object sender, RoutedEventArgs e) + { + var palette = sender as MainWindow_controls.PenColorPalette; + if (palette == null) + { + return; + } + + CheckLastColor(palette.SelectedColorCode); + ColorSwitchCheck(); + } + /// /// 将字符串转换为颜色对象 /// @@ -970,4 +758,4 @@ private static byte toByte(char c) return b; } } -} \ No newline at end of file +} diff --git a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs index e91bcb73..0349acf5 100644 --- a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs +++ b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs @@ -1556,7 +1556,10 @@ private void UpdateImageSelectionToolbarPosition(FrameworkElement element) toolbarTop = Math.Max(0, Math.Min(toolbarTop, maxTop)); // 设置工具栏位置 - BorderImageSelectionControl.Margin = new Thickness(toolbarLeft, toolbarTop, 0, 0); + if ((object)BorderImageSelectionControl is MainWindow_controls.ImageSelectionToolbar imageSelectionToolbar) + { + imageSelectionToolbar.ControlMargin = new Thickness(toolbarLeft, toolbarTop, 0, 0); + } var pdfTarget = GetPdfSidebarTargetElement(); if (pdfTarget != null && BorderPdfPageSidebar != null && BorderPdfPageSidebar.Visibility == Visibility.Visible) @@ -2431,33 +2434,10 @@ private void UpdateImageResizeHandlesPosition(Rect elementBounds) { if (ImageResizeHandlesCanvas == null) return; - ImageResizeHandlesCanvas.Margin = new Thickness(elementBounds.Left, elementBounds.Top, 0, 0); - - // 四个角控制点 - System.Windows.Controls.Canvas.SetLeft(ImageTopLeftHandle, -4); - System.Windows.Controls.Canvas.SetTop(ImageTopLeftHandle, -4); - - System.Windows.Controls.Canvas.SetLeft(ImageTopRightHandle, elementBounds.Width - 4); - System.Windows.Controls.Canvas.SetTop(ImageTopRightHandle, -4); - - System.Windows.Controls.Canvas.SetLeft(ImageBottomLeftHandle, -4); - System.Windows.Controls.Canvas.SetTop(ImageBottomLeftHandle, elementBounds.Height - 4); - - System.Windows.Controls.Canvas.SetLeft(ImageBottomRightHandle, elementBounds.Width - 4); - System.Windows.Controls.Canvas.SetTop(ImageBottomRightHandle, elementBounds.Height - 4); - - // 四个边控制点 - System.Windows.Controls.Canvas.SetLeft(ImageTopHandle, elementBounds.Width / 2 - 4); - System.Windows.Controls.Canvas.SetTop(ImageTopHandle, -4); - - System.Windows.Controls.Canvas.SetLeft(ImageBottomHandle, elementBounds.Width / 2 - 4); - System.Windows.Controls.Canvas.SetTop(ImageBottomHandle, elementBounds.Height - 4); - - System.Windows.Controls.Canvas.SetLeft(ImageLeftHandle, -4); - System.Windows.Controls.Canvas.SetTop(ImageLeftHandle, elementBounds.Height / 2 - 4); - - System.Windows.Controls.Canvas.SetLeft(ImageRightHandle, elementBounds.Width - 4); - System.Windows.Controls.Canvas.SetTop(ImageRightHandle, elementBounds.Height / 2 - 4); + if ((object)ImageResizeHandlesCanvas is MainWindow_controls.ImageResizeHandles resizeHandles) + { + resizeHandles.UpdateHandlePositions(elementBounds); + } } catch (Exception ex) { @@ -2470,7 +2450,7 @@ private void ImageResizeHandle_MouseLeftButtonDown(object sender, MouseButtonEve { try { - if (IsBitmapLikeCanvasElement(currentSelectedElement) && sender is Ellipse ellipse) + if (IsBitmapLikeCanvasElement(currentSelectedElement) && e.OriginalSource is Ellipse ellipse) { isResizingImage = true; imageResizeStartPoint = e.GetPosition(inkCanvas); @@ -2494,7 +2474,7 @@ private void ImageResizeHandle_MouseLeftButtonUp(object sender, MouseButtonEvent { try { - if (isResizingImage && sender is Ellipse ellipse) + if (isResizingImage && e.OriginalSource is Ellipse ellipse) { isResizingImage = false; ellipse.ReleaseMouseCapture(); @@ -2513,7 +2493,7 @@ private void ImageResizeHandle_MouseMove(object sender, MouseEventArgs e) { try { - if (isResizingImage && IsBitmapLikeCanvasElement(currentSelectedElement) && sender is Ellipse ellipse) + if (isResizingImage && IsBitmapLikeCanvasElement(currentSelectedElement) && e.OriginalSource is Ellipse ellipse) { var currentPoint = e.GetPosition(inkCanvas); ResizeImageByHandle(currentSelectedElement, imageResizeStartPoint, currentPoint, activeResizeHandle); diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 2788a77f..050f6234 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -688,8 +688,8 @@ internal void ImageBlackboard_MouseUp(object sender, MouseButtonEventArgs e) if (currentMode == 0) { - LeftBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed; - RightBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed; + BorderPPTNavBottomLeft.Visibility = Visibility.Collapsed; + BorderPPTNavBottomRight.Visibility = Visibility.Collapsed; LeftSidePanelForPPTNavigation.Visibility = Visibility.Collapsed; RightSidePanelForPPTNavigation.Visibility = Visibility.Collapsed; //進入黑板 @@ -820,16 +820,16 @@ internal void ImageBlackboard_MouseUp(object sender, MouseButtonEventArgs e) { var dops = Settings.PowerPointSettings.PPTButtonsDisplayOption.ToString(); var dopsc = dops.ToCharArray(); - if (dopsc[0] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(LeftBottomPanelForPPTNavigation); - if (dopsc[1] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(RightBottomPanelForPPTNavigation); + if (dopsc[0] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(BorderPPTNavBottomLeft); + if (dopsc[1] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(BorderPPTNavBottomRight); if (dopsc[2] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(LeftSidePanelForPPTNavigation); if (dopsc[3] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(RightSidePanelForPPTNavigation); } else { // 如果不在放映模式或页数无效,隐藏所有翻页按钮 - LeftBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed; - RightBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed; + BorderPPTNavBottomLeft.Visibility = Visibility.Collapsed; + BorderPPTNavBottomRight.Visibility = Visibility.Collapsed; LeftSidePanelForPPTNavigation.Visibility = Visibility.Collapsed; RightSidePanelForPPTNavigation.Visibility = Visibility.Collapsed; } diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index e9fd850f..e6f4f79a 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -2217,22 +2217,6 @@ private void PPTNavigationBtn_MouseDown(object sender, MouseButtonEventArgs e) { lastBorderMouseDownObject = sender; if (!Settings.PowerPointSettings.EnablePPTButtonPageClickable) return; - if (sender == PPTLSPageButton) - { - PPTLSPageButtonFeedbackBorder.Opacity = 0.15; - } - else if (sender == PPTRSPageButton) - { - PPTRSPageButtonFeedbackBorder.Opacity = 0.15; - } - else if (sender == PPTLBPageButton) - { - PPTLBPageButtonFeedbackBorder.Opacity = 0.15; - } - else if (sender == PPTRBPageButton) - { - PPTRBPageButtonFeedbackBorder.Opacity = 0.15; - } } /// @@ -2248,22 +2232,6 @@ private void PPTNavigationBtn_MouseDown(object sender, MouseButtonEventArgs e) private void PPTNavigationBtn_MouseLeave(object sender, MouseEventArgs e) { lastBorderMouseDownObject = null; - if (sender == PPTLSPageButton) - { - PPTLSPageButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTRSPageButton) - { - PPTRSPageButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTLBPageButton) - { - PPTLBPageButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTRBPageButton) - { - PPTRBPageButtonFeedbackBorder.Opacity = 0; - } } /// @@ -2286,24 +2254,11 @@ private void PPTNavigationBtn_MouseLeave(object sender, MouseEventArgs e) private async void PPTNavigationBtn_MouseUp(object sender, MouseButtonEventArgs e) { if (lastBorderMouseDownObject != sender) return; + await HandlePptNavigationPageClickAsync(); + } - if (sender == PPTLSPageButton) - { - PPTLSPageButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTRSPageButton) - { - PPTRSPageButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTLBPageButton) - { - PPTLBPageButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTRBPageButton) - { - PPTRBPageButtonFeedbackBorder.Opacity = 0; - } - + private async Task HandlePptNavigationPageClickAsync() + { if (!Settings.PowerPointSettings.EnablePPTButtonPageClickable) return; // 使用新的PPT管理器检查连接状态 @@ -2500,23 +2455,6 @@ private async Task HandleManualSlideShowEnd() private void GridPPTControlPrevious_MouseDown(object sender, MouseButtonEventArgs e) { lastBorderMouseDownObject = sender; - if (sender == PPTLSPreviousButtonBorder) - { - PPTLSPreviousButtonFeedbackBorder.Opacity = 0.15; - } - else if (sender == PPTRSPreviousButtonBorder) - { - PPTRSPreviousButtonFeedbackBorder.Opacity = 0.15; - } - else if (sender == PPTLBPreviousButtonBorder) - { - PPTLBPreviousButtonFeedbackBorder.Opacity = 0.15; - } - else if (sender == PPTRBPreviousButtonBorder) - { - PPTRBPreviousButtonFeedbackBorder.Opacity = 0.15; - } - // 启动长按检测 if (Settings.PowerPointSettings.EnablePPTButtonLongPressPageTurn) { @@ -2537,23 +2475,6 @@ private void GridPPTControlPrevious_MouseDown(object sender, MouseButtonEventArg private void GridPPTControlPrevious_MouseLeave(object sender, MouseEventArgs e) { lastBorderMouseDownObject = null; - if (sender == PPTLSPreviousButtonBorder) - { - PPTLSPreviousButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTRSPreviousButtonBorder) - { - PPTRSPreviousButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTLBPreviousButtonBorder) - { - PPTLBPreviousButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTRBPreviousButtonBorder) - { - PPTRBPreviousButtonFeedbackBorder.Opacity = 0; - } - // 停止长按检测 StopLongPressDetection(); } @@ -2572,23 +2493,6 @@ private void GridPPTControlPrevious_MouseLeave(object sender, MouseEventArgs e) private void GridPPTControlPrevious_MouseUp(object sender, MouseButtonEventArgs e) { if (lastBorderMouseDownObject != sender) return; - if (sender == PPTLSPreviousButtonBorder) - { - PPTLSPreviousButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTRSPreviousButtonBorder) - { - PPTRSPreviousButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTLBPreviousButtonBorder) - { - PPTLBPreviousButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTRBPreviousButtonBorder) - { - PPTRBPreviousButtonFeedbackBorder.Opacity = 0; - } - // 停止长按检测 StopLongPressDetection(); @@ -2610,23 +2514,6 @@ private void GridPPTControlPrevious_MouseUp(object sender, MouseButtonEventArgs private void GridPPTControlNext_MouseDown(object sender, MouseButtonEventArgs e) { lastBorderMouseDownObject = sender; - if (sender == PPTLSNextButtonBorder) - { - PPTLSNextButtonFeedbackBorder.Opacity = 0.15; - } - else if (sender == PPTRSNextButtonBorder) - { - PPTRSNextButtonFeedbackBorder.Opacity = 0.15; - } - else if (sender == PPTLBNextButtonBorder) - { - PPTLBNextButtonFeedbackBorder.Opacity = 0.15; - } - else if (sender == PPTRBNextButtonBorder) - { - PPTRBNextButtonFeedbackBorder.Opacity = 0.15; - } - // 启动长按检测 if (Settings.PowerPointSettings.EnablePPTButtonLongPressPageTurn) { @@ -2647,23 +2534,6 @@ private void GridPPTControlNext_MouseDown(object sender, MouseButtonEventArgs e) private void GridPPTControlNext_MouseLeave(object sender, MouseEventArgs e) { lastBorderMouseDownObject = null; - if (sender == PPTLSNextButtonBorder) - { - PPTLSNextButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTRSNextButtonBorder) - { - PPTRSNextButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTLBNextButtonBorder) - { - PPTLBNextButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTRBNextButtonBorder) - { - PPTRBNextButtonFeedbackBorder.Opacity = 0; - } - // 停止长按检测 StopLongPressDetection(); } @@ -2682,29 +2552,72 @@ private void GridPPTControlNext_MouseLeave(object sender, MouseEventArgs e) private void GridPPTControlNext_MouseUp(object sender, MouseButtonEventArgs e) { if (lastBorderMouseDownObject != sender) return; - if (sender == PPTLSNextButtonBorder) - { - PPTLSNextButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTRSNextButtonBorder) - { - PPTRSNextButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTLBNextButtonBorder) - { - PPTLBNextButtonFeedbackBorder.Opacity = 0; - } - else if (sender == PPTRBNextButtonBorder) - { - PPTRBNextButtonFeedbackBorder.Opacity = 0; - } - // 停止长按检测 StopLongPressDetection(); BtnPPTSlidesDown_Click(BtnPPTSlidesDown, null); } + private void PPTNavigationBottomLeft_PreviousClicked(object sender, RoutedEventArgs e) + { + BtnPPTSlidesUp_Click(BtnPPTSlidesUp, null); + } + + private void PPTNavigationBottomRight_PreviousClicked(object sender, RoutedEventArgs e) + { + BtnPPTSlidesUp_Click(BtnPPTSlidesUp, null); + } + + private void PPTNavigationSideLeft_PreviousClicked(object sender, RoutedEventArgs e) + { + BtnPPTSlidesUp_Click(BtnPPTSlidesUp, null); + } + + private void PPTNavigationSideRight_PreviousClicked(object sender, RoutedEventArgs e) + { + BtnPPTSlidesUp_Click(BtnPPTSlidesUp, null); + } + + private void PPTNavigationBottomLeft_NextClicked(object sender, RoutedEventArgs e) + { + BtnPPTSlidesDown_Click(BtnPPTSlidesDown, null); + } + + private void PPTNavigationBottomRight_NextClicked(object sender, RoutedEventArgs e) + { + BtnPPTSlidesDown_Click(BtnPPTSlidesDown, null); + } + + private void PPTNavigationSideLeft_NextClicked(object sender, RoutedEventArgs e) + { + BtnPPTSlidesDown_Click(BtnPPTSlidesDown, null); + } + + private void PPTNavigationSideRight_NextClicked(object sender, RoutedEventArgs e) + { + BtnPPTSlidesDown_Click(BtnPPTSlidesDown, null); + } + + private async void PPTNavigationBottomLeft_PageClicked(object sender, RoutedEventArgs e) + { + await HandlePptNavigationPageClickAsync(); + } + + private async void PPTNavigationBottomRight_PageClicked(object sender, RoutedEventArgs e) + { + await HandlePptNavigationPageClickAsync(); + } + + private async void PPTNavigationSideLeft_PageClicked(object sender, RoutedEventArgs e) + { + await HandlePptNavigationPageClickAsync(); + } + + private async void PPTNavigationSideRight_PageClicked(object sender, RoutedEventArgs e) + { + await HandlePptNavigationPageClickAsync(); + } + /// /// 处理PPT结束控制按钮的鼠标释放事件 /// diff --git a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs index 92ee533c..da06f76a 100644 --- a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs +++ b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs @@ -603,7 +603,7 @@ private void inkCanvas_SelectionChanged(object sender, EventArgs e) // 显示墨迹选择栏和选择框 GridInkCanvasSelectionCover.Visibility = Visibility.Visible; - BorderStrokeSelectionClone.Background = Brushes.Transparent; + BorderStrokeSelectionControl.SetCloneButtonBackground(Brushes.Transparent); updateBorderStrokeSelectionControlLocation(); UpdateSelectionDisplay(); return; @@ -664,7 +664,7 @@ private void updateBorderStrokeSelectionControlLocation() if (borderTop < 0) borderTop = 10; // 如果上方也没有空间,则显示在顶部 } - BorderStrokeSelectionControl.Margin = new Thickness(borderLeft, borderTop, 0, 0); + BorderStrokeSelectionControl.ControlMargin = new Thickness(borderLeft, borderTop, 0, 0); } /// diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs index acacfedc..51d3bf12 100644 --- a/Ink Canvas/MainWindow_cs/MW_Settings.cs +++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs @@ -868,11 +868,28 @@ private void ToggleSwitchShowCanvasAtNewSlideShow_Toggled(object sender, RoutedE private void ToggleSwitchEnableNibMode_Toggled(object sender, RoutedEventArgs e) { if (!isLoaded) return; - if (sender == ToggleSwitchEnableNibMode) - BoardToggleSwitchEnableNibMode.IsOn = ToggleSwitchEnableNibMode.IsOn; + + bool isNibModeEnabled; + if (sender == BoardPenSettingsControl) + { + isNibModeEnabled = BoardPenSettingsControl.IsNibModeEnabled; + if (BorderPenSettingsControl != null) + BorderPenSettingsControl.IsNibModeEnabled = isNibModeEnabled; + } + else if (sender == BorderPenSettingsControl) + { + isNibModeEnabled = BorderPenSettingsControl != null && BorderPenSettingsControl.IsNibModeEnabled; + if (BoardPenSettingsControl != null) + BoardPenSettingsControl.IsNibModeEnabled = isNibModeEnabled; + } else - ToggleSwitchEnableNibMode.IsOn = BoardToggleSwitchEnableNibMode.IsOn; - Settings.Startup.IsEnableNibMode = ToggleSwitchEnableNibMode.IsOn; + { + isNibModeEnabled = BorderPenSettingsControl != null && BorderPenSettingsControl.IsNibModeEnabled; + if (BoardPenSettingsControl != null) + BoardPenSettingsControl.IsNibModeEnabled = isNibModeEnabled; + } + + Settings.Startup.IsEnableNibMode = isNibModeEnabled; if (Settings.Startup.IsEnableNibMode) BoundsWidth = Settings.Advanced.NibModeBoundsWidth; @@ -902,13 +919,17 @@ private void ToggleSwitchEnableDisPlayNibModeToggle_Toggled(object sender, Route SaveSettingsToFile(); if (!ToggleSwitchEnableDisPlayNibModeToggle.IsOn) { - NibModeSimpleStackPanel.Visibility = Visibility.Collapsed; - BoardNibModeSimpleStackPanel.Visibility = Visibility.Collapsed; + if (BorderPenSettingsControl != null) + BorderPenSettingsControl.NibModePanelVisibility = Visibility.Collapsed; + if (BoardPenSettingsControl != null) + BoardPenSettingsControl.NibModePanelVisibility = Visibility.Collapsed; } else { - NibModeSimpleStackPanel.Visibility = Visibility.Visible; - BoardNibModeSimpleStackPanel.Visibility = Visibility.Visible; + if (BorderPenSettingsControl != null) + BorderPenSettingsControl.NibModePanelVisibility = Visibility.Visible; + if (BoardPenSettingsControl != null) + BoardPenSettingsControl.NibModePanelVisibility = Visibility.Visible; } } @@ -2804,16 +2825,23 @@ private static int InkStyleFromPenStyleUiIndex(int uiIndex) private void ComboBoxPenStyle_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (!isLoaded) return; - int uiIndex = sender == ComboBoxPenStyle - ? ComboBoxPenStyle.SelectedIndex - : BoardComboBoxPenStyle.SelectedIndex; + + int uiIndex = sender == BoardPenSettingsControl + ? BoardPenSettingsControl?.PenStyleSelectedIndex ?? -1 + : BorderPenSettingsControl?.PenStyleSelectedIndex ?? -1; if (uiIndex < 0) return; Settings.Canvas.InkStyle = InkStyleFromPenStyleUiIndex(uiIndex); - if (sender == ComboBoxPenStyle) - BoardComboBoxPenStyle.SelectedIndex = uiIndex; + if (sender == BoardPenSettingsControl) + { + if (BorderPenSettingsControl != null) + BorderPenSettingsControl.PenStyleSelectedIndex = uiIndex; + } else - ComboBoxPenStyle.SelectedIndex = uiIndex; + { + if (BoardPenSettingsControl != null) + BoardPenSettingsControl.PenStyleSelectedIndex = uiIndex; + } SaveSettingsToFile(); } @@ -2895,22 +2923,46 @@ private void SwitchToRectangleEraser(object sender, MouseButtonEventArgs e) private void InkWidthSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { if (!isLoaded) return; - if (sender == BoardInkWidthSlider) InkWidthSlider.Value = ((Slider)sender).Value; - if (sender == InkWidthSlider) BoardInkWidthSlider.Value = ((Slider)sender).Value; - drawingAttributes.Height = ((Slider)sender).Value / 2; - drawingAttributes.Width = ((Slider)sender).Value / 2; - Settings.Canvas.InkWidth = ((Slider)sender).Value / 2; + + if (!(sender is Slider slider)) return; + + if (sender == BoardPenSettingsControl?.InkWidthSliderControl) + { + if (BorderPenSettingsControl != null && Math.Abs(BorderPenSettingsControl.PenWidth - slider.Value) > 0.001) + BorderPenSettingsControl.PenWidth = slider.Value; + } + else if (sender == BorderPenSettingsControl?.InkWidthSliderControl) + { + if (BoardPenSettingsControl != null && Math.Abs(BoardPenSettingsControl.PenWidth - slider.Value) > 0.001) + BoardPenSettingsControl.PenWidth = slider.Value; + } + + drawingAttributes.Height = slider.Value / 2; + drawingAttributes.Width = slider.Value / 2; + Settings.Canvas.InkWidth = slider.Value / 2; SaveSettingsToFile(); } private void HighlighterWidthSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { if (!isLoaded) return; - // if (sender == BoardInkWidthSlider) InkWidthSlider.Value = ((Slider)sender).Value; - // if (sender == InkWidthSlider) BoardInkWidthSlider.Value = ((Slider)sender).Value; - drawingAttributes.Height = ((Slider)sender).Value; - drawingAttributes.Width = ((Slider)sender).Value / 2; - Settings.Canvas.HighlighterWidth = ((Slider)sender).Value; + + if (!(sender is Slider slider)) return; + + if (sender == BoardPenSettingsControl?.HighlighterWidthSliderControl) + { + if (BorderPenSettingsControl != null && Math.Abs(BorderPenSettingsControl.HighlighterWidth - slider.Value) > 0.001) + BorderPenSettingsControl.HighlighterWidth = slider.Value; + } + else if (sender == BorderPenSettingsControl?.HighlighterWidthSliderControl) + { + if (BoardPenSettingsControl != null && Math.Abs(BoardPenSettingsControl.HighlighterWidth - slider.Value) > 0.001) + BoardPenSettingsControl.HighlighterWidth = slider.Value; + } + + drawingAttributes.Height = slider.Value; + drawingAttributes.Width = slider.Value / 2; + Settings.Canvas.HighlighterWidth = slider.Value; SaveSettingsToFile(); } @@ -2923,14 +2975,25 @@ private void HighlighterWidthSlider_ValueChanged(object sender, RoutedPropertyCh private void InkAlphaSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { if (!isLoaded) return; - // if (sender == BoardInkWidthSlider) InkWidthSlider.Value = ((Slider)sender).Value; - // if (sender == InkWidthSlider) BoardInkWidthSlider.Value = ((Slider)sender).Value; + + if (!(sender is Slider slider)) return; + + if (sender == BoardPenSettingsControl?.InkAlphaSliderControl) + { + if (BorderPenSettingsControl != null && Math.Abs(BorderPenSettingsControl.PenAlpha - slider.Value) > 0.001) + BorderPenSettingsControl.PenAlpha = slider.Value; + } + else if (sender == BorderPenSettingsControl?.InkAlphaSliderControl) + { + if (BoardPenSettingsControl != null && Math.Abs(BoardPenSettingsControl.PenAlpha - slider.Value) > 0.001) + BoardPenSettingsControl.PenAlpha = slider.Value; + } + var NowR = drawingAttributes.Color.R; var NowG = drawingAttributes.Color.G; var NowB = drawingAttributes.Color.B; - // Trace.WriteLine(BitConverter.GetBytes(((Slider)sender).Value)); - drawingAttributes.Color = Color.FromArgb((byte)((Slider)sender).Value, NowR, NowG, NowB); - Settings.Canvas.InkAlpha = ((Slider)sender).Value; + drawingAttributes.Color = Color.FromArgb((byte)slider.Value, NowR, NowG, NowB); + Settings.Canvas.InkAlpha = slider.Value; SaveSettingsToFile(); } @@ -3953,7 +4016,32 @@ private async void SpecialVersionResetToSuggestion_Click() private void ToggleSwitchEnableInkToShape_Toggled(object sender, RoutedEventArgs e) { if (!isLoaded) return; - Settings.InkToShape.IsInkToShapeEnabled = ToggleSwitchEnableInkToShape.IsOn; + + bool isEnabled; + if (sender == BorderPenSettingsControl) + { + isEnabled = BorderPenSettingsControl.IsInkToShapeEnabled; + ToggleSwitchEnableInkToShape.IsOn = isEnabled; + if (BoardPenSettingsControl != null) + BoardPenSettingsControl.IsInkToShapeEnabled = isEnabled; + } + else if (sender == BoardPenSettingsControl) + { + isEnabled = BoardPenSettingsControl.IsInkToShapeEnabled; + ToggleSwitchEnableInkToShape.IsOn = isEnabled; + if (BorderPenSettingsControl != null) + BorderPenSettingsControl.IsInkToShapeEnabled = isEnabled; + } + else + { + isEnabled = ToggleSwitchEnableInkToShape.IsOn; + if (BorderPenSettingsControl != null) + BorderPenSettingsControl.IsInkToShapeEnabled = isEnabled; + if (BoardPenSettingsControl != null) + BoardPenSettingsControl.IsInkToShapeEnabled = isEnabled; + } + + Settings.InkToShape.IsInkToShapeEnabled = isEnabled; SaveSettingsToFile(); } @@ -5878,4 +5966,4 @@ private void BtnRegisterFileAssociation_Click(object sender, RoutedEventArgs e) #endregion } -} \ No newline at end of file +} diff --git a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs index 9fbca2bc..6e0f5e87 100644 --- a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs +++ b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs @@ -252,14 +252,14 @@ private void LoadSettings(bool isStartup = false, bool skipAutoUpdateCheck = fal if (Settings.Startup.IsEnableNibMode) { - ToggleSwitchEnableNibMode.IsOn = true; - BoardToggleSwitchEnableNibMode.IsOn = true; + if (BorderPenSettingsControl != null) BorderPenSettingsControl.IsNibModeEnabled = true; + if (BoardPenSettingsControl != null) BoardPenSettingsControl.IsNibModeEnabled = true; BoundsWidth = Settings.Advanced.NibModeBoundsWidth; } else { - ToggleSwitchEnableNibMode.IsOn = false; - BoardToggleSwitchEnableNibMode.IsOn = false; + if (BorderPenSettingsControl != null) BorderPenSettingsControl.IsNibModeEnabled = false; + if (BoardPenSettingsControl != null) BoardPenSettingsControl.IsNibModeEnabled = false; BoundsWidth = Settings.Advanced.FingerModeBoundsWidth; } @@ -339,8 +339,8 @@ private void LoadSettings(bool isStartup = false, bool skipAutoUpdateCheck = fal { Settings.Startup = new Startup(); Settings.Startup.IsEnableNibMode = false; // 默认关闭笔尖模式 - ToggleSwitchEnableNibMode.IsOn = false; // 默认关闭笔尖模式 - BoardToggleSwitchEnableNibMode.IsOn = false; // 默认关闭笔尖模式 + if (BorderPenSettingsControl != null) BorderPenSettingsControl.IsNibModeEnabled = false; // 默认关闭笔尖模式 + if (BoardPenSettingsControl != null) BoardPenSettingsControl.IsNibModeEnabled = false; // 默认关闭笔尖模式 BoundsWidth = Settings.Advanced.FingerModeBoundsWidth; // 使用手指模式边界宽度 } @@ -365,13 +365,13 @@ private void LoadSettings(bool isStartup = false, bool skipAutoUpdateCheck = fal { if (!Settings.Appearance.IsEnableDisPlayNibModeToggler) { - NibModeSimpleStackPanel.Visibility = Visibility.Collapsed; - BoardNibModeSimpleStackPanel.Visibility = Visibility.Collapsed; + if (BorderPenSettingsControl != null) BorderPenSettingsControl.NibModePanelVisibility = Visibility.Collapsed; + if (BoardPenSettingsControl != null) BoardPenSettingsControl.NibModePanelVisibility = Visibility.Collapsed; } else { - NibModeSimpleStackPanel.Visibility = Visibility.Visible; - BoardNibModeSimpleStackPanel.Visibility = Visibility.Visible; + if (BorderPenSettingsControl != null) BorderPenSettingsControl.NibModePanelVisibility = Visibility.Visible; + if (BoardPenSettingsControl != null) BoardPenSettingsControl.NibModePanelVisibility = Visibility.Visible; } //if (Settings.Appearance.IsColorfulViewboxFloatingBar) // 浮动工具栏背景色 @@ -803,16 +803,18 @@ private void LoadSettings(bool isStartup = false, bool skipAutoUpdateCheck = fal drawingAttributes.Height = Settings.Canvas.InkWidth; drawingAttributes.Width = Settings.Canvas.InkWidth; - InkWidthSlider.Value = Settings.Canvas.InkWidth * 2; - HighlighterWidthSlider.Value = Settings.Canvas.HighlighterWidth; + if (BorderPenSettingsControl != null) BorderPenSettingsControl.PenWidth = Settings.Canvas.InkWidth * 2; + if (BoardPenSettingsControl != null) BoardPenSettingsControl.PenWidth = Settings.Canvas.InkWidth * 2; + if (BorderPenSettingsControl != null) BorderPenSettingsControl.HighlighterWidth = Settings.Canvas.HighlighterWidth; + if (BoardPenSettingsControl != null) BoardPenSettingsControl.HighlighterWidth = Settings.Canvas.HighlighterWidth; int alpha = (int)Settings.Canvas.InkAlpha; if (alpha < 0) alpha = 0; if (alpha > 255) alpha = 255; var inkColor = drawingAttributes.Color; drawingAttributes.Color = Color.FromArgb((byte)alpha, inkColor.R, inkColor.G, inkColor.B); inkCanvas.DefaultDrawingAttributes.Color = drawingAttributes.Color; - if (InkAlphaSlider != null) InkAlphaSlider.Value = alpha; - if (BoardInkAlphaSlider != null) BoardInkAlphaSlider.Value = alpha; + if (BorderPenSettingsControl != null) BorderPenSettingsControl.PenAlpha = alpha; + if (BoardPenSettingsControl != null) BoardPenSettingsControl.PenAlpha = alpha; ComboBoxHyperbolaAsymptoteOption.SelectedIndex = (int)Settings.Canvas.HyperbolaAsymptoteOption; @@ -865,8 +867,8 @@ private void LoadSettings(bool isStartup = false, bool skipAutoUpdateCheck = fal Settings.Canvas.InkStyle = 0; int penStyleUi = PenStyleUiIndexFromInkStyle(Settings.Canvas.InkStyle); - ComboBoxPenStyle.SelectedIndex = penStyleUi; - BoardComboBoxPenStyle.SelectedIndex = penStyleUi; + if (BorderPenSettingsControl != null) BorderPenSettingsControl.PenStyleSelectedIndex = penStyleUi; + if (BoardPenSettingsControl != null) BoardPenSettingsControl.PenStyleSelectedIndex = penStyleUi; ComboBoxEraserSize.SelectedIndex = Settings.Canvas.EraserSize; ComboBoxEraserSizeFloatingBar.SelectedIndex = Settings.Canvas.EraserSize; @@ -1060,6 +1062,10 @@ private void LoadSettings(bool isStartup = false, bool skipAutoUpdateCheck = fal if (Settings.InkToShape != null) { ToggleSwitchEnableInkToShape.IsOn = Settings.InkToShape.IsInkToShapeEnabled; + if (BorderPenSettingsControl != null) + BorderPenSettingsControl.IsInkToShapeEnabled = Settings.InkToShape.IsInkToShapeEnabled; + if (BoardPenSettingsControl != null) + BoardPenSettingsControl.IsInkToShapeEnabled = Settings.InkToShape.IsInkToShapeEnabled; if (ComboBoxShapeRecognitionEngine != null) { @@ -1439,15 +1445,15 @@ private void LoadInkFadeSettings() } // 同步批注子面板中的开关状态 - if (ToggleSwitchInkFadeInPanel != null) + if (BoardPenSettingsControl != null) { - ToggleSwitchInkFadeInPanel.IsOn = Settings.Canvas.EnableInkFade; + BoardPenSettingsControl.IsInkFadeEnabled = Settings.Canvas.EnableInkFade; } // 同步普通画笔面板中的开关状态 - if (ToggleSwitchInkFadeInPanel2 != null) + if (BorderPenSettingsControl != null) { - ToggleSwitchInkFadeInPanel2.IsOn = Settings.Canvas.EnableInkFade; + BorderPenSettingsControl.IsInkFadeEnabled = Settings.Canvas.EnableInkFade; } // 同步滑块值 @@ -1611,4 +1617,4 @@ private void RemoveObsoleteProperties(JObject userObj, JObject defaultObj, ref b } } } -} \ No newline at end of file +} From ef8931c717f630ade46401666da74a09fb0bf64d Mon Sep 17 00:00:00 2001 From: JSR Date: Wed, 8 Apr 2026 21:07:46 +0800 Subject: [PATCH 08/15] refactor: extract ResourceDictionary styles to separate file Ultraworked with Sisyphus Co-authored-by: Sisyphus --- Ink Canvas/MainWindow.xaml | 108 +---------------- .../ResourceDictionaryStyles.xaml | 113 ++++++++++++++++++ 2 files changed, 114 insertions(+), 107 deletions(-) create mode 100644 Ink Canvas/MainWindow_controls/ResourceDictionaryStyles.xaml diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 54fc9685..bf8d5fda 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -44,114 +44,8 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ink Canvas/MainWindow_controls/ResourceDictionaryStyles.xaml b/Ink Canvas/MainWindow_controls/ResourceDictionaryStyles.xaml new file mode 100644 index 00000000..fd8a173e --- /dev/null +++ b/Ink Canvas/MainWindow_controls/ResourceDictionaryStyles.xaml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From ce49904dde6a1e3e1426f3526d7f064f4f8b0a58 Mon Sep 17 00:00:00 2001 From: JSR Date: Wed, 8 Apr 2026 21:07:57 +0800 Subject: [PATCH 09/15] refactor: add IBoardCanvasController interface for canvas abstraction Ultraworked with Sisyphus Co-authored-by: Sisyphus --- Ink Canvas/IBoardCanvasController.cs | 47 ++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 Ink Canvas/IBoardCanvasController.cs diff --git a/Ink Canvas/IBoardCanvasController.cs b/Ink Canvas/IBoardCanvasController.cs new file mode 100644 index 00000000..804d337b --- /dev/null +++ b/Ink Canvas/IBoardCanvasController.cs @@ -0,0 +1,47 @@ +using System.Windows.Controls; +using System.Windows.Ink; +using System.Windows.Media; + +namespace Ink_Canvas +{ + public interface IBoardCanvasController + { + StrokeCollection Strokes { get; } + System.Windows.Visibility Visibility { get; set; } + bool IsHitTestVisible { get; set; } + bool IsManipulationEnabled { get; set; } + InkCanvasEditingMode EditingMode { get; set; } + void SetInkMode(); + void SetEraserByPointMode(); + void SetEraserByStrokeMode(); + void SetSelectMode(); + Color StrokeColor { get; set; } + double StrokeWidth { get; set; } + double HighlighterWidth { get; set; } + bool IsHighlighterMode { get; set; } + EllipseStylusShape EraserShape { get; set; } + StrokeCollection GetSelectedStrokes(); + void Select(StrokeCollection strokes); + void ClearSelection(); + event System.EventHandler EditingModeChanged; + event System.EventHandler StrokeColorChanged; + event System.EventHandler StrokeCollected; + } + + public class EditingModeChangedEventArgs : System.EventArgs + { + public InkCanvasEditingMode OldMode { get; set; } + public InkCanvasEditingMode NewMode { get; set; } + } + + public class StrokeColorChangedEventArgs : System.EventArgs + { + public Color OldColor { get; set; } + public Color NewColor { get; set; } + } + + public class StrokeEventArgs : System.EventArgs + { + public StrokeCollection Strokes { get; set; } + } +} From 0e4601eb148ccee1063c3cf890d3191c2b15624f Mon Sep 17 00:00:00 2001 From: JSR Date: Thu, 9 Apr 2026 20:00:29 +0800 Subject: [PATCH 10/15] fix: load toolbar icon resources in ImageResizeHandles Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- Ink Canvas/MainWindow_controls/ImageResizeHandles.xaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Ink Canvas/MainWindow_controls/ImageResizeHandles.xaml b/Ink Canvas/MainWindow_controls/ImageResizeHandles.xaml index 11dd334d..517800ac 100644 --- a/Ink Canvas/MainWindow_controls/ImageResizeHandles.xaml +++ b/Ink Canvas/MainWindow_controls/ImageResizeHandles.xaml @@ -2,6 +2,13 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="Root"> + + + + + + + From c0bcc334bbd736f149955b1dc7cba55233378ddf Mon Sep 17 00:00:00 2001 From: JSR Date: Thu, 9 Apr 2026 20:00:29 +0800 Subject: [PATCH 11/15] refactor: initialize board canvas controller adapter Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- Ink Canvas/IBoardCanvasController.cs | 2 +- Ink Canvas/MainWindow.xaml.cs | 1 + .../MainWindow_cs/MW_BoardCanvasController.cs | 151 ++++++++++++++++++ 3 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 Ink Canvas/MainWindow_cs/MW_BoardCanvasController.cs diff --git a/Ink Canvas/IBoardCanvasController.cs b/Ink Canvas/IBoardCanvasController.cs index 804d337b..178e47a3 100644 --- a/Ink Canvas/IBoardCanvasController.cs +++ b/Ink Canvas/IBoardCanvasController.cs @@ -19,7 +19,7 @@ public interface IBoardCanvasController double StrokeWidth { get; set; } double HighlighterWidth { get; set; } bool IsHighlighterMode { get; set; } - EllipseStylusShape EraserShape { get; set; } + StylusShape EraserShape { get; set; } StrokeCollection GetSelectedStrokes(); void Select(StrokeCollection strokes); void ClearSelection(); diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index d0bb5900..c1bfa605 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -119,6 +119,7 @@ 处于 PPT 放映内:BtnPPTSlideShowEnd.Visibility } InitializeComponent(); + InitializeBoardCanvasController(); BlackboardLeftSide.Visibility = Visibility.Collapsed; BlackboardCenterSide.Visibility = Visibility.Collapsed; diff --git a/Ink Canvas/MainWindow_cs/MW_BoardCanvasController.cs b/Ink Canvas/MainWindow_cs/MW_BoardCanvasController.cs new file mode 100644 index 00000000..40f05ae7 --- /dev/null +++ b/Ink Canvas/MainWindow_cs/MW_BoardCanvasController.cs @@ -0,0 +1,151 @@ +using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Ink; +using System.Windows.Media; + +namespace Ink_Canvas +{ + public partial class MainWindow + { + private IBoardCanvasController _boardCanvasController; + + public IBoardCanvasController BoardCanvasController => _boardCanvasController; + + private void InitializeBoardCanvasController() + { + if (_boardCanvasController == null) + { + _boardCanvasController = new MainWindowBoardCanvasController(this); + } + } + } + + internal sealed class MainWindowBoardCanvasController : IBoardCanvasController + { + private readonly MainWindow _window; + private InkCanvasEditingMode _lastEditingMode; + + public MainWindowBoardCanvasController(MainWindow window) + { + _window = window; + _lastEditingMode = _window.inkCanvas.EditingMode; + _window.inkCanvas.EditingModeChanged += InkCanvasOnEditingModeChanged; + _window.inkCanvas.StrokeCollected += InkCanvasOnStrokeCollected; + } + + public StrokeCollection Strokes => _window.inkCanvas.Strokes; + + public System.Windows.Visibility Visibility + { + get => _window.inkCanvas.Visibility; + set => _window.inkCanvas.Visibility = value; + } + + public bool IsHitTestVisible + { + get => _window.inkCanvas.IsHitTestVisible; + set => _window.inkCanvas.IsHitTestVisible = value; + } + + public bool IsManipulationEnabled + { + get => _window.inkCanvas.IsManipulationEnabled; + set => _window.inkCanvas.IsManipulationEnabled = value; + } + + public InkCanvasEditingMode EditingMode + { + get => _window.inkCanvas.EditingMode; + set + { + if (_window.inkCanvas.EditingMode == value) + { + return; + } + + var oldMode = _window.inkCanvas.EditingMode; + _window.inkCanvas.EditingMode = value; + EditingModeChanged?.Invoke(this, new EditingModeChangedEventArgs { OldMode = oldMode, NewMode = value }); + } + } + + public void SetInkMode() => EditingMode = InkCanvasEditingMode.Ink; + + public void SetEraserByPointMode() => EditingMode = InkCanvasEditingMode.EraseByPoint; + + public void SetEraserByStrokeMode() => EditingMode = InkCanvasEditingMode.EraseByStroke; + + public void SetSelectMode() => EditingMode = InkCanvasEditingMode.Select; + + public Color StrokeColor + { + get => _window.inkCanvas.DefaultDrawingAttributes.Color; + set + { + if (_window.inkCanvas.DefaultDrawingAttributes.Color == value) + { + return; + } + + var oldColor = _window.inkCanvas.DefaultDrawingAttributes.Color; + _window.inkCanvas.DefaultDrawingAttributes.Color = value; + StrokeColorChanged?.Invoke(this, new StrokeColorChangedEventArgs { OldColor = oldColor, NewColor = value }); + } + } + + public double StrokeWidth + { + get => _window.inkCanvas.DefaultDrawingAttributes.Width; + set => _window.inkCanvas.DefaultDrawingAttributes.Width = value; + } + + public double HighlighterWidth + { + get => _window.inkCanvas.DefaultDrawingAttributes.Height; + set => _window.inkCanvas.DefaultDrawingAttributes.Height = value; + } + + public bool IsHighlighterMode + { + get => _window.inkCanvas.DefaultDrawingAttributes.IsHighlighter; + set => _window.inkCanvas.DefaultDrawingAttributes.IsHighlighter = value; + } + + public StylusShape EraserShape + { + get => _window.inkCanvas.EraserShape; + set => _window.inkCanvas.EraserShape = value; + } + + public StrokeCollection GetSelectedStrokes() => _window.inkCanvas.GetSelectedStrokes(); + + public void Select(StrokeCollection strokes) => _window.inkCanvas.Select(strokes); + + public void ClearSelection() => _window.inkCanvas.Select(new StrokeCollection()); + + public event EventHandler EditingModeChanged; + + public event EventHandler StrokeColorChanged; + + public event EventHandler StrokeCollected; + + private void InkCanvasOnEditingModeChanged(object sender, RoutedEventArgs e) + { + var newMode = _window.inkCanvas.EditingMode; + var oldMode = _lastEditingMode; + _lastEditingMode = newMode; + EditingModeChanged?.Invoke(this, new EditingModeChangedEventArgs { OldMode = oldMode, NewMode = newMode }); + } + + private void InkCanvasOnStrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e) + { + if (e?.Stroke == null) + { + return; + } + + StrokeCollected?.Invoke(this, new StrokeEventArgs { Strokes = new StrokeCollection { e.Stroke } }); + } + } +} From 3ed9f2c2dd4043f66ce37ca26f7c28d78d949406 Mon Sep 17 00:00:00 2001 From: JSR Date: Thu, 9 Apr 2026 20:00:29 +0800 Subject: [PATCH 12/15] refactor: route board interactions through canvas controller Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- Ink Canvas/MainWindow_cs/MW_Colors.cs | 58 +++++++++---------- Ink Canvas/MainWindow_cs/MW_Eraser.cs | 14 ++--- .../MainWindow_cs/MW_FloatingBarIcons.cs | 26 ++++----- Ink Canvas/MainWindow_cs/MW_Timer.cs | 8 +-- 4 files changed, 53 insertions(+), 53 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_Colors.cs b/Ink Canvas/MainWindow_cs/MW_Colors.cs index 85d88ff8..8eff8ac2 100644 --- a/Ink Canvas/MainWindow_cs/MW_Colors.cs +++ b/Ink Canvas/MainWindow_cs/MW_Colors.cs @@ -64,7 +64,7 @@ private void ColorSwitchCheck(bool hidePanels = true) foreach (var stroke in strokes) try { - stroke.DrawingAttributes.Color = inkCanvas.DefaultDrawingAttributes.Color; + stroke.DrawingAttributes.Color = BoardCanvasController.StrokeColor; } catch { @@ -176,7 +176,7 @@ private void CheckColorTheme(bool changeColorTheme = false) inkColor = lastBoardInkColor; } - double alpha = inkCanvas.DefaultDrawingAttributes.Color.A; + double alpha = BoardCanvasController.StrokeColor.A; if (penType == 0 && Settings?.Canvas != null) { double settingAlpha = Settings.Canvas.InkAlpha; @@ -189,94 +189,94 @@ private void CheckColorTheme(bool changeColorTheme = false) if (inkColor == 0) { // Black - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 0, 0, 0); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 0, 0, 0); } else if (inkColor == 5) { // White - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 255, 255, 255); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 255, 255, 255); } else if (isUselightThemeColor) { if (inkColor == 1) // Red - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 239, 68, 68); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 239, 68, 68); else if (inkColor == 2) // Green - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 34, 197, 94); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 34, 197, 94); else if (inkColor == 3) // Blue - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 59, 130, 246); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 59, 130, 246); else if (inkColor == 4) // Yellow - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 250, 204, 21); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 250, 204, 21); else if (inkColor == 6) // Pink - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 236, 72, 153); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 236, 72, 153); else if (inkColor == 7) // Teal (亮色) - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 20, 184, 166); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 20, 184, 166); else if (inkColor == 8) // Orange (亮色) - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 249, 115, 22); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 249, 115, 22); } else { if (inkColor == 1) // Red - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 220, 38, 38); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 220, 38, 38); else if (inkColor == 2) // Green - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 22, 163, 74); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 22, 163, 74); else if (inkColor == 3) // Blue - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 37, 99, 235); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 37, 99, 235); else if (inkColor == 4) // Yellow - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 234, 179, 8); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 234, 179, 8); else if (inkColor == 6) // Pink ( Purple ) - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 147, 51, 234); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 147, 51, 234); else if (inkColor == 7) // Teal (暗色) - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 13, 148, 136); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 13, 148, 136); else if (inkColor == 8) // Orange (暗色) - inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 234, 88, 12); + BoardCanvasController.StrokeColor = Color.FromArgb((byte)alpha, 234, 88, 12); } } else if (penType == 1) { if (highlighterColor == 100) // Black - inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(0, 0, 0); + BoardCanvasController.StrokeColor = Color.FromRgb(0, 0, 0); else if (highlighterColor == 101) // White - inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(250, 250, 250); + BoardCanvasController.StrokeColor = Color.FromRgb(250, 250, 250); else if (highlighterColor == 102) // Red - inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(239, 68, 68); + BoardCanvasController.StrokeColor = Color.FromRgb(239, 68, 68); else if (highlighterColor == 103) // Yellow - inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(253, 224, 71); + BoardCanvasController.StrokeColor = Color.FromRgb(253, 224, 71); else if (highlighterColor == 104) // Green - inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(74, 222, 128); + BoardCanvasController.StrokeColor = Color.FromRgb(74, 222, 128); else if (highlighterColor == 105) // Zinc - inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(113, 113, 122); + BoardCanvasController.StrokeColor = Color.FromRgb(113, 113, 122); else if (highlighterColor == 106) // Blue - inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(59, 130, 246); + BoardCanvasController.StrokeColor = Color.FromRgb(59, 130, 246); else if (highlighterColor == 107) // Purple - inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(168, 85, 247); + BoardCanvasController.StrokeColor = Color.FromRgb(168, 85, 247); else if (highlighterColor == 108) // teal - inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(45, 212, 191); + BoardCanvasController.StrokeColor = Color.FromRgb(45, 212, 191); else if (highlighterColor == 109) // Orange - inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(249, 115, 22); + BoardCanvasController.StrokeColor = Color.FromRgb(249, 115, 22); } var penPalette = BorderPenColorPaletteControl as MainWindow_controls.PenColorPalette; @@ -294,7 +294,7 @@ private void CheckColorTheme(bool changeColorTheme = false) // 更新快捷调色盘选择指示器 if (penType == 0) { - UpdateQuickColorPaletteIndicator(inkCanvas.DefaultDrawingAttributes.Color); + UpdateQuickColorPaletteIndicator(BoardCanvasController.StrokeColor); } } diff --git a/Ink Canvas/MainWindow_cs/MW_Eraser.cs b/Ink Canvas/MainWindow_cs/MW_Eraser.cs index 0b1e203c..16c1f244 100644 --- a/Ink Canvas/MainWindow_cs/MW_Eraser.cs +++ b/Ink Canvas/MainWindow_cs/MW_Eraser.cs @@ -122,7 +122,7 @@ private void EraserOverlay_PointerDown(object sender) eraserShape = new RectangleStylusShape(eraserWidth, _h); } - hitTester = inkCanvas.Strokes.GetIncrementalStrokeHitTester(eraserShape); + hitTester = BoardCanvasController.Strokes.GetIncrementalStrokeHitTester(eraserShape); hitTester.StrokeHit += EraserGeometry_StrokeHit; // 计算缩放矩阵 @@ -189,10 +189,10 @@ private void EraserOverlay_PointerMove(object sender, Point pt) if (isUsingStrokesEraser) { // 笔画橡皮擦模式 - var _filtered = inkCanvas.Strokes.HitTest(pt).Where(stroke => !stroke.ContainsPropertyData(IsLockGuid)); + var _filtered = BoardCanvasController.Strokes.HitTest(pt).Where(stroke => !stroke.ContainsPropertyData(IsLockGuid)); var filtered = _filtered as Stroke[] ?? _filtered.ToArray(); if (!filtered.Any()) return; - inkCanvas.Strokes.Remove(new StrokeCollection(filtered)); + BoardCanvasController.Strokes.Remove(new StrokeCollection(filtered)); } else { @@ -237,11 +237,11 @@ private void EraserGeometry_StrokeHit(object sender, StrokeHitEventArgs args) // 替换或删除笔画 if (filteredResult.Any()) { - inkCanvas.Strokes.Replace(new StrokeCollection(filtered2Replace), new StrokeCollection(filteredResult)); + BoardCanvasController.Strokes.Replace(new StrokeCollection(filtered2Replace), new StrokeCollection(filteredResult)); } else { - inkCanvas.Strokes.Remove(new StrokeCollection(filtered2Replace)); + BoardCanvasController.Strokes.Remove(new StrokeCollection(filtered2Replace)); } } @@ -360,7 +360,7 @@ public void ApplyAdvancedEraserShape() } // 应用到InkCanvas - inkCanvas.EraserShape = eraserShape; + BoardCanvasController.EraserShape = eraserShape; Trace.WriteLine($"Eraser: Applied shape - Size: {eraserWidth}, Circle: {isEraserCircleShape}"); } @@ -382,4 +382,4 @@ public string GetEraserStatusInfo() $"- 模式: {(isUsingStrokesEraser ? "笔画" : "几何")}"; } } -} \ No newline at end of file +} diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 050f6234..9022fcba 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -1559,7 +1559,7 @@ private void GridInkReplayButton_MouseUp(object sender, MouseButtonEventArgs e) FloatingbarUIForInkReplay.IsHitTestVisible = true; BlackboardUIGridForInkReplay.Visibility = Visibility.Visible; BlackboardUIGridForInkReplay.IsHitTestVisible = true; - inkCanvas.IsHitTestVisible = true; + BoardCanvasController.IsHitTestVisible = true; inkCanvas.IsManipulationEnabled = true; if (inkCanvas.EditingMode == InkCanvasEditingMode.None) @@ -1607,7 +1607,7 @@ private void InkCanvasForInkReplay_MouseDown(object sender, MouseButtonEventArgs BlackboardUIGridForInkReplay.IsHitTestVisible = true; AnimationsHelper.HideWithFadeOut(BorderInkReplayToolBox); isStopInkReplay = true; - inkCanvas.IsHitTestVisible = true; + BoardCanvasController.IsHitTestVisible = true; inkCanvas.IsManipulationEnabled = true; if (inkCanvas.EditingMode == InkCanvasEditingMode.None) @@ -2177,7 +2177,7 @@ internal async void CursorIcon_Click(object sender, RoutedEventArgs e) } else { - inkCanvas.IsHitTestVisible = false; + BoardCanvasController.IsHitTestVisible = false; inkCanvas.Visibility = Visibility.Visible; } } @@ -2186,7 +2186,7 @@ internal async void CursorIcon_Click(object sender, RoutedEventArgs e) if (Settings.PowerPointSettings.IsShowStrokeOnSelectInPowerPoint) { inkCanvas.Visibility = Visibility.Visible; - inkCanvas.IsHitTestVisible = true; + BoardCanvasController.IsHitTestVisible = true; } else { @@ -2196,7 +2196,7 @@ internal async void CursorIcon_Click(object sender, RoutedEventArgs e) } else { - inkCanvas.IsHitTestVisible = false; + BoardCanvasController.IsHitTestVisible = false; inkCanvas.Visibility = Visibility.Visible; } } @@ -2306,7 +2306,7 @@ internal void PenIcon_Click(object sender, RoutedEventArgs e) GridTransparencyFakeBackground.Opacity = 1; GridTransparencyFakeBackground.Background = new SolidColorBrush(StringToColor("#01FFFFFF")); - inkCanvas.IsHitTestVisible = true; + BoardCanvasController.IsHitTestVisible = true; inkCanvas.Visibility = Visibility.Visible; GridBackgroundCoverHolder.Visibility = Visibility.Visible; @@ -2757,7 +2757,7 @@ private void SetQuickColor(Color color) // 设置画笔颜色 drawingAttributes.Color = color; - inkCanvas.DefaultDrawingAttributes.Color = color; + BoardCanvasController.StrokeColor = color; // 如果当前是荧光笔模式,同时更新荧光笔颜色和属性 if (penType == 1) @@ -2814,7 +2814,7 @@ private void SetQuickColor(Color color) inkCanvas.DefaultDrawingAttributes.IsHighlighter = true; // 确保荧光笔颜色索引正确更新 - inkCanvas.DefaultDrawingAttributes.Color = drawingAttributes.Color; + BoardCanvasController.StrokeColor = drawingAttributes.Color; } // 更新颜色状态 @@ -3302,7 +3302,7 @@ private void ResetTouchStates() isPalmEraserActive = false; // 确保触摸事件能正常响应 - inkCanvas.IsHitTestVisible = true; + BoardCanvasController.IsHitTestVisible = true; inkCanvas.IsManipulationEnabled = true; // 释放所有触摸捕获 @@ -3583,7 +3583,7 @@ private void BtnHideInkCanvas_Click(object sender, RoutedEventArgs e) // 进入批注模式 GridTransparencyFakeBackground.Opacity = 1; GridTransparencyFakeBackground.Background = new SolidColorBrush(StringToColor("#01FFFFFF")); - inkCanvas.IsHitTestVisible = true; + BoardCanvasController.IsHitTestVisible = true; inkCanvas.Visibility = Visibility.Visible; GridBackgroundCoverHolder.Visibility = Visibility.Visible; @@ -3636,7 +3636,7 @@ private void BtnHideInkCanvas_Click(object sender, RoutedEventArgs e) //BtnClear_Click(null, null); } - inkCanvas.IsHitTestVisible = true; + BoardCanvasController.IsHitTestVisible = true; inkCanvas.Visibility = Visibility.Visible; } else @@ -3656,11 +3656,11 @@ private void BtnHideInkCanvas_Click(object sender, RoutedEventArgs e) if (Settings.PowerPointSettings.IsShowStrokeOnSelectInPowerPoint) { inkCanvas.Visibility = Visibility.Visible; - inkCanvas.IsHitTestVisible = true; + BoardCanvasController.IsHitTestVisible = true; } else { - inkCanvas.IsHitTestVisible = true; + BoardCanvasController.IsHitTestVisible = true; inkCanvas.Visibility = Visibility.Visible; } } diff --git a/Ink Canvas/MainWindow_cs/MW_Timer.cs b/Ink Canvas/MainWindow_cs/MW_Timer.cs index 0190d673..2568be9c 100644 --- a/Ink Canvas/MainWindow_cs/MW_Timer.cs +++ b/Ink Canvas/MainWindow_cs/MW_Timer.cs @@ -323,7 +323,7 @@ private void AutoSaveStrokesTimer_Tick(object sender, EventArgs e) try { // 只有在画布可见且有墨迹时才保存 - if (inkCanvas.Visibility == Visibility.Visible && inkCanvas.Strokes.Count > 0) + if (BoardCanvasController.Visibility == Visibility.Visible && BoardCanvasController.Strokes.Count > 0) { // 静默保存 SaveInkCanvasStrokes(false, false); @@ -1221,7 +1221,7 @@ private void timerCheckAutoUpdateWithSilence_Elapsed(object sender, ElapsedEvent { // 判断是否处于批注模式(inkCanvas.EditingMode == InkCanvasEditingMode.Ink) // 判断是否处于画板模式(!Topmost) - if (inkCanvas.EditingMode != InkCanvasEditingMode.Ink && Topmost) + if (BoardCanvasController.EditingMode != InkCanvasEditingMode.Ink && Topmost) { // 检查是否有未保存的内容或正在进行的操作 if (!isHidingSubPanelsWhenInking) @@ -1455,8 +1455,8 @@ private void EraserAutoSwitchBackTimer_Tick(object sender, EventArgs e) try { // 检查是否仍然在橡皮擦模式 - if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByPoint && - inkCanvas.EditingMode != InkCanvasEditingMode.EraseByStroke) + if (BoardCanvasController.EditingMode != InkCanvasEditingMode.EraseByPoint && + BoardCanvasController.EditingMode != InkCanvasEditingMode.EraseByStroke) { StopEraserAutoSwitchBackTimer(); return; From b8251b9312feec736e227afcca320fd7446402ed Mon Sep 17 00:00:00 2001 From: JSR Date: Thu, 9 Apr 2026 20:13:44 +0800 Subject: [PATCH 13/15] fix: use absolute pack URI for ImageResizeHandles resources Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- Ink Canvas/MainWindow_controls/ImageResizeHandles.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ink Canvas/MainWindow_controls/ImageResizeHandles.xaml b/Ink Canvas/MainWindow_controls/ImageResizeHandles.xaml index 517800ac..6580554e 100644 --- a/Ink Canvas/MainWindow_controls/ImageResizeHandles.xaml +++ b/Ink Canvas/MainWindow_controls/ImageResizeHandles.xaml @@ -5,7 +5,7 @@ - + From 1ba7ef0596822c01e52312c83004f04b3e826069 Mon Sep 17 00:00:00 2001 From: JSR Date: Thu, 9 Apr 2026 21:00:56 +0800 Subject: [PATCH 14/15] fix: inline ImageResizeHandles styles to avoid runtime lookup failure Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- .../ImageResizeHandles.xaml | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/Ink Canvas/MainWindow_controls/ImageResizeHandles.xaml b/Ink Canvas/MainWindow_controls/ImageResizeHandles.xaml index 6580554e..a9555796 100644 --- a/Ink Canvas/MainWindow_controls/ImageResizeHandles.xaml +++ b/Ink Canvas/MainWindow_controls/ImageResizeHandles.xaml @@ -3,11 +3,25 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="Root"> - - - - - + + + + + Date: Thu, 9 Apr 2026 22:31:13 +0800 Subject: [PATCH 15/15] fix: disambiguate reflection calls in hardware fingerprint generation Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- Ink Canvas/Helpers/DeviceIdentifier.cs | 30 +++++++++++++++----------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/Ink Canvas/Helpers/DeviceIdentifier.cs b/Ink Canvas/Helpers/DeviceIdentifier.cs index a78e1a4d..020d4e54 100644 --- a/Ink Canvas/Helpers/DeviceIdentifier.cs +++ b/Ink Canvas/Helpers/DeviceIdentifier.cs @@ -129,10 +129,10 @@ private static string GenerateHardwareFingerprint() { var searcherType = assembly.GetType("System.Management.ManagementObjectSearcher"); var searcher = Activator.CreateInstance(searcherType, "SELECT ProcessorId FROM Win32_Processor"); - var getMethod = searcherType.GetMethod("Get"); + var getMethod = GetPublicInstanceMethod(searcherType, "Get"); var enumerator = getMethod.Invoke(searcher, null); - var moveNextMethod = enumerator.GetType().GetMethod("MoveNext"); + var moveNextMethod = GetPublicInstanceMethod(enumerator.GetType(), "MoveNext"); var currentProperty = enumerator.GetType().GetProperty("Current"); if ((bool)moveNextMethod.Invoke(enumerator, null)) @@ -143,7 +143,7 @@ private static string GenerateHardwareFingerprint() hardwareInfo.Append(processorId?.ToString() ?? ""); } - var disposeMethod = searcher.GetType().GetMethod("Dispose"); + var disposeMethod = GetPublicInstanceMethod(searcher.GetType(), "Dispose"); disposeMethod?.Invoke(searcher, null); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); } @@ -153,10 +153,10 @@ private static string GenerateHardwareFingerprint() { var searcherType = assembly.GetType("System.Management.ManagementObjectSearcher"); var searcher = Activator.CreateInstance(searcherType, "SELECT SerialNumber FROM Win32_BaseBoard"); - var getMethod = searcherType.GetMethod("Get"); + var getMethod = GetPublicInstanceMethod(searcherType, "Get"); var enumerator = getMethod.Invoke(searcher, null); - var moveNextMethod = enumerator.GetType().GetMethod("MoveNext"); + var moveNextMethod = GetPublicInstanceMethod(enumerator.GetType(), "MoveNext"); var currentProperty = enumerator.GetType().GetProperty("Current"); if ((bool)moveNextMethod.Invoke(enumerator, null)) @@ -167,7 +167,7 @@ private static string GenerateHardwareFingerprint() hardwareInfo.Append(serialNumber?.ToString() ?? ""); } - var disposeMethod = searcher.GetType().GetMethod("Dispose"); + var disposeMethod = GetPublicInstanceMethod(searcher.GetType(), "Dispose"); disposeMethod?.Invoke(searcher, null); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); } @@ -177,10 +177,10 @@ private static string GenerateHardwareFingerprint() { var searcherType = assembly.GetType("System.Management.ManagementObjectSearcher"); var searcher = Activator.CreateInstance(searcherType, "SELECT SerialNumber FROM Win32_BIOS"); - var getMethod = searcherType.GetMethod("Get"); + var getMethod = GetPublicInstanceMethod(searcherType, "Get"); var enumerator = getMethod.Invoke(searcher, null); - var moveNextMethod = enumerator.GetType().GetMethod("MoveNext"); + var moveNextMethod = GetPublicInstanceMethod(enumerator.GetType(), "MoveNext"); var currentProperty = enumerator.GetType().GetProperty("Current"); if ((bool)moveNextMethod.Invoke(enumerator, null)) @@ -191,7 +191,7 @@ private static string GenerateHardwareFingerprint() hardwareInfo.Append(serialNumber?.ToString() ?? ""); } - var disposeMethod = searcher.GetType().GetMethod("Dispose"); + var disposeMethod = GetPublicInstanceMethod(searcher.GetType(), "Dispose"); disposeMethod?.Invoke(searcher, null); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); } @@ -201,10 +201,10 @@ private static string GenerateHardwareFingerprint() { var searcherType = assembly.GetType("System.Management.ManagementObjectSearcher"); var searcher = Activator.CreateInstance(searcherType, "SELECT SerialNumber FROM Win32_DiskDrive WHERE MediaType='Fixed hard disk media'"); - var getMethod = searcherType.GetMethod("Get"); + var getMethod = GetPublicInstanceMethod(searcherType, "Get"); var enumerator = getMethod.Invoke(searcher, null); - var moveNextMethod = enumerator.GetType().GetMethod("MoveNext"); + var moveNextMethod = GetPublicInstanceMethod(enumerator.GetType(), "MoveNext"); var currentProperty = enumerator.GetType().GetProperty("Current"); if ((bool)moveNextMethod.Invoke(enumerator, null)) @@ -215,7 +215,7 @@ private static string GenerateHardwareFingerprint() hardwareInfo.Append(serialNumber?.ToString() ?? ""); } - var disposeMethod = searcher.GetType().GetMethod("Dispose"); + var disposeMethod = GetPublicInstanceMethod(searcher.GetType(), "Dispose"); disposeMethod?.Invoke(searcher, null); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); } @@ -235,6 +235,12 @@ private static string GenerateHardwareFingerprint() return hardwareInfo.ToString(); } + private static MethodInfo GetPublicInstanceMethod(Type type, string methodName) + { + if (type == null || string.IsNullOrEmpty(methodName)) return null; + return type.GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance, null, Type.EmptyTypes, null); + } + /// /// 基于硬件指纹生成25字符的设备ID ///