From 81cb626e3cc0e0ebe9733cd8d6d0118d22a87527 Mon Sep 17 00:00:00 2001 From: Leto_b Date: Mon, 20 Apr 2026 12:44:44 +0800 Subject: [PATCH] add unsupport none security in opcus --- src/.vuepress/public/img/opc-ua-un-none-1.png | Bin 0 -> 92486 bytes src/.vuepress/public/img/opc-ua-un-none-2.png | Bin 0 -> 17121 bytes .../Tree/API/Programming-OPC-UA_timecho.md | 94 +++++++++++++++--- .../V1.3.x/API/Programming-OPC-UA_timecho.md | 34 ++++++- .../dev-1.3/API/Programming-OPC-UA_timecho.md | 34 ++++++- .../latest/API/Programming-OPC-UA_timecho.md | 66 +++++++++++- .../Tree/API/Programming-OPC-UA_timecho.md | 61 ++++++++---- .../V1.3.x/API/Programming-OPC-UA_timecho.md | 32 +++++- .../dev-1.3/API/Programming-OPC-UA_timecho.md | 32 +++++- .../latest/API/Programming-OPC-UA_timecho.md | 31 +++++- 10 files changed, 339 insertions(+), 45 deletions(-) create mode 100644 src/.vuepress/public/img/opc-ua-un-none-1.png create mode 100644 src/.vuepress/public/img/opc-ua-un-none-2.png diff --git a/src/.vuepress/public/img/opc-ua-un-none-1.png b/src/.vuepress/public/img/opc-ua-un-none-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0d29120baf9810b7834b6ca0604d211af596fc57 GIT binary patch literal 92486 zcmcG$2UJsAw=W)1YzSB=N}* z1fppt|2x;^UTO;hk&4t+lnnhX*X9B;&F!)_x803={P6S3+74V{e=5GYV$H#Ok@A9% zhq-FY%EPJ!|E|@nJ3h@2wW@n=lDP}l;w&2kBhlbwkmwf;} zUJaS)}Y_kG30#L}GxZ(h;oSlZZ_h`PlkDlP3SevVxD zH7|N{vh+y|Ls?DDC|J6;PEkl)y!iYj8b?RRr-_CJ1{MB~->xt-(Zk&hLu?A1ot^vL zfX9ruUR^Yo&AImCAoe^+QS5u+sK&ck-h|smufT@g)sO6ioz(T8J&Q>Zw5p1TxL5=8 z3(G~Jtd92A4IU&VaQgI_l@3tG^oasB=_I^|Z7N5z!iS3G*V4i}le*HB4$pyfugsNb zm*V==)%CTsVg;JFl>5^~aG5MFXB9R1t|xMKFf$>nhXcypA07vgXGsF``1m6i>mNps z!*Yk7yJ72J9#VjG-E8i)ONZ>F-LzS-V*lhkUJi-AFvxrTU2N=fx&@1J}NOt!8$VCkT`#Fpw!-H7`;ENTC2Hi<5FtaJw#ciHQ}q%JizKr`iQ>@QT*yAv6`Y{_;M@fe zNY`_5_RmydpY@3odAK)&CMmg;E?qE^(Uv(#&LML`wy8*AW+-d ztwKrQ1uE{Vd$3~-`MQ5{ryT##HI6Y!e3RbSn0}okD>;k z4?E<`mTqNh>ZUBBf7OF#TWoj1YwQF+$ zN!`Sc^?=fS5u^pZo+>T&ZNB)vcX8lEB(g(TVviVX2~^Bwrn6EOpyTvVy4Y5rEQ?S(He1!2!cBv@LKB_mr=)D^<2CC}UI4JtQZhp#4z$$ZxOzSVHVQyRLBZ zm~N;p21b&b8}^ROb_+CJHaDGGJCM0L&|1ThY9Np^>aqJtl}WX4`5dTC)SyhO&eh!P zVW~c_o`hJFixfSOLhrKy7H;$ z;zKQ_s5tHUUXzRFy>YzLEWH(Ca%zA51ph?meQS4(+%IQgo8{S>y;~&H znoHWpkW^=~=PO%(7H%AjWF2tG!ikr<$kTJbB(7(f+C~mK&89`59IsoTR;3#eBTOs z{Rm?k=Eg-rkHx1n+Sd4>Cbld@gNK#G~^UQGX3;)>uhMG zS=36)W)KRvd)kmx`H+&r?`50R=kAXT>@Pmn{|a=Re|)&SljB_IuF`ucr9yC`2wL4U3dmX=gwAbN;A~^q6!E&q4b^w{Eo%+)0sB zl%Ut;zW`5h5jIe6@bok`?T?nF4z#m%F6Nre*GPq(?Ke*-{5*fOvlHv5WEXo( zIKJD{MX4B?nN>_rn?BjO(Jv*ehL-oKOkuMqCm!KeJ1$v$Oja}Ioyi$r)Um4aiOi{R zgc>#^WHM=sF9pnGmk`x(e978Qy;MlYT{~FvU<$763%SSGJ}0yf8k37|`5Ak7>W6YI z)@;Z*K8Q>#M5BIc+1~Yazj;Cd>pi8Z3E~bq-26C6w1m9HjC| z8#M}rgc4@d@Qm)z-YF^fdi%HdKq;#alQT1r{Ud6(mPH!}w3E$|vg%9#@z{a1_`<~( z`@T>o^!VP2W8A9X{Amir3k32wpa)=r!6q{y*aA?$)x#g8!%tHe-c~*pVvRn}YZ8`= zz!N&cb_Zm1a9MuY4E&~r0|VL!Q6#r8lU}G0yw6d!+g88KR%5xkR(0o|^k}eZQ0n@) zdk)F$WGgbw!@pE1kmV^k2l{x4(&B@mMX8LksAu5Ozgs<{zHd<$8J)GpPJ6mUO zFA-K_;US3hm1Uh%aPaw)PIRm3C0Z6CSkB@R<^*}VWrudL&Lyp70#5~^W#(6i;So^c zK;7z>qs=5vF^M`y;tu`9n>U+~ir+?oP#}jnN}g7ip}^t-(mJ;iui< zWIy|eRqO7$y`NM5caI|nd4Ba~)+?amhF7gN9GBtSyhJxjkfO(#94kosRz6*+8)HSO z7H;D0UoANOJ9^k&lYt<9Ix2JvV_?am>Q;vbW#pa zeK#uZ?K>d@`|x~2Ke5H&Pv&+c%8Hq=WS z7F#2rel`jG?$AhSX>5km%KG~7VeiBe-raw+2J1b63OE{dIPw+k5_8aQN`XJmgEp;_ zvRVcJ+v2x!e)GsBWHm@(toQUsXN`>{8V?xF!2KrL`K@V_GI*T{hWI6Z@Wm)j;Yg4y zcWGQ^^G^hPT@+T)Syht#p=X=s4PbY~#Kp@I2%}wW|LAAC-rBw6 zBIoC$x!I|EOG`#-K7or)S?Lhfd(}7WL|*WeZQm=}j=w>7)b~d&e2$px5K=`#z@cwB zm(>&wPNlX>e8FgP2mMabDA^Lp+$cY`=3R?Td9DZQexb`TiG{Qwzo)EJJa@a?9zAZA zKOWXuav;c+u3AZ-_8bGEdyb*rDhNWsPfz7nGdDvAttwC`ohCn@tXrF#o1=cATMLk@ zchMFkef1H+&{GkU;=Q+znU6<@TE}S+`OPbxw92 zcxXUv4^8@1QEBp^*E>feBqAno(CUP`BkXSQ&MkI1GnPqU>@}@PxlGCC9BKaN-@K|$ z`?XzfDq}Y8uT&taQyw*5s_j!AHI_E_pg#n4po1q6vQGTN+KFjjEUaV*@H^m8@NpKM zUt^Om0^6x+UTLOTmzwL1Ll;F@_~ZguX8k~#is1%8hGSVf^}Q;FZITA96x__*v+soH9B)X=A|a0yV`N6{e+yu!*m z_KxbgjZKyVKnsE={B9an0FV@b%moDnOn2_+`PG^o{W|h?Tzh{w62jE|jyvHQck(kH zg(oN^iWnQj86UeIcK*ocN82f+^-p&XkD+myG+?Gg3>i#Xww&d*wp2sbQq0IE&U=+B zloUXZ+dUreqn(WFc$QMHy1P%-$HSwefzT@p0Crey3p>FDKQ4n<&J(Nr6kOPFlUw*H!pU7vZkoM^{0)!YNtMFyFOF`-q?I`{92g1qD8;-iKcLq5zok={fwn z6u4DYiUgvxrph3}Tt&`CPFm7SH%LFI7UErUQTV*Qi90bWo@1;*wt%cZ>$9h(p;-dV#9`(p&8Lv;`TmLdVHUzkT$u8@(yT}SMLFU(20RVdeYC@I zR&V%0?^^G;nu^EhHq zohgg^@^ABXg%rAD_{octrTOhmMt?%ksp;m)3~Br00vUx&Sa=qZ;bTt7(dqrc7x&ax z0f>WJ9+F`_fI|mvyLA0!}+43WQ0U`T1$9F7h8l$cYK=Um1)ve6-K<5F2=|}aC zb!cSExcn5#)`!=pTkPw!-(~A=bV)5MsULBMJR9-joV&ODXJKq&EB`Vqap378G%=KO zxxUa1g7nyET_rgWWcp$Tzo78z&?-QKP7c3Z;#4=0-wenQDY3{oSn9_GW36s6`W ze0+}ogfuOiWG>m?S9MeV&+Mxh?{JV>a;S$TnT|f~> z6#PB|mgBp94O8Iu`@qh?S_kiVBn@~xNhW)&DyzvG>*w$xD>XTgE3`l``+#7PD3GvM zTgY`kOQAaPB$0`;MO(k5kgsp*O^|b!FQ9TM4lOs`yjnX*WL%QrFLshc!tbsCMv&}a zlGsUq$&;p_!-~j&t-TD>f3)r|$mi6???N)0nejy;UIzmR{`# z2TI_Oohuf*UvbM3F5;P41ONmvv|#B4Qvu%}>z>u$Vomf4`2h{p)se4$BG|P5!~u6q z)^s%LAYA$r6y@^!tL6SB3G(#Kou=!!0L{s-3Q9Wu61=%bAS{c){fSffGY<2Sg09{IB>~~29zrsdYHt%tZ<5%v%f6>#M`7(1a$Q1bpJeM z%=tK4=Kl*{UMe%w+Z_9&|BSmffoI;~pPhPVo{z{CvpOxu|k=u5A z6P}oHAE85cfr*np$s7F3>k7M-->GH}5lyAZ_z*zOCgx?AHc>hNEPBt`a!Tz!QrAj& zOg6!FQ0yq#z3N+8!9(|UtxQSLN@`u^A-GEl6EYaQn_P83jlAz}q&FJfT3(0RwK&{T zdy9Je<6jZZ%I2z!%;rSY-LALs$NMi}`?S!#TZbzsOr_NN`Was8ayxwwL=ZLeB!$xw z`Q53(tR&`dGNe^2ja!@Lp8}@XXG?SD2)V%gJR7XqoZk#pBSWpgtprTQGU&CF_2=mG z1I6>cbQNQ#px0lKaxG>+Ea)2X^JbJvZ4l;QPU!n;kSiYMJx`Uetq zCq<{2aXNLZw%L*G3Q*L(vl%;NM*=(-P;w%WnkvT$jVfP(H7^atA@cr0N=iOd_1iPQ! zvw8c+Itd7J6@UnJ#f+&FbLG9DhvP5S^GaT>YTD)TVz+AmNUksdw+8qvWsOssH&q3L zOD-~~kJZ1^rVNd##i#>u_cte2c5`e1mQ;wZ!75MC?~k_q6=<3i_~aZ&(Z{RxZSHRh zpgY`_oWDC~D)lKT;QcL9k(lY0PNBuezbQbkd$=*Fbig@3!1dExkHZvU)km`!LF=Qc zbGx5Y%S-_y{;5C_VD&^9d?D-LC0FJkwaG{H)|v*70IK5 zT`qCWiyk}Ao&e0`>lKwS;Qtr7X|XL${?>eVFDN|%zAwKe_lVxG=VCy)e1R4CQQL1s zCtwSTEL}}<12zWO1?805koMGDXNv)6u|4NK`Qoz*DP#l@|3Ou{3{8Hk3QS-Ew zcKC#aV@UWRnPWJsp4Wu`$vL&5{uXq`+kJr2OyWx%#O)^5I*mS1A6Xf%=w|_%0I0yn zK0ZF`&2P`Xfc_#62RN=%0xbXs$5ntW1P(=VTfp&}`})}#q{s31IbZSbGg&(1vD5|e^yhA1Q^kON@#H21ZaH&8=HbD zL(vk&Hot#{_|MQ^|09xIMRJoM(ErCstplS~?&8kmsavkjf4z^)o3}@4Q9@Y7!>1i$ zmOa>--E`mw-V9MH9|m!QQrtJmHF1v@(qG2*r5Bu@oPY`iZ>7V*rAhmEL3Oq9P(hpWdLPAYdatqKl4Z5 z`m#{he$Q@Fx9!;Qu;)H21(G7{h-AqQEHpr|Ae=X^;PLpf>gr)Iuc?Vis$nc8#Y|@} z10S7)4Gl^hrc6ZczY;GG^{iO zqy7%xw+cmT28!liC|>jxy61k|E%;n}Ckp_Y%+Fu=#BD#CLF2{zs)gu8(C22Ho-gs;deKmt<+|l|?(rcEhmK0`gJA8E zQv!gBq^&F23f}=@d4Glrv)nY~F4jB-xO*$B942Pw{^ESHHA%AINOJ-+>qJ^HU;oqU z%rdmC8Fo{ADGd2Wegfdq1pz^N%-g%k_!G`9SWD+A>gI>`Vj4?;ybExox&6!3{A(Se zUV#iN!QvICr(`;B7EHEKLeE$wJruRHw94Ud30QPzj?{&6^N^61)}3UyqqTM0KZOto z#Ihi1M=<#*=igS~tO*CI3&EHEws-$p-2c|*f7$Fk)#uC^#NBuLk97trZd+O^4GaoO z?p^GAKyI(b5J(aNmghg@M0ff1iqGDX9xxnpV5N{rJix{9COlng3p+2p*}MyMR*I5B z9vFC;xquqrh5+X!1sE&7eF2+)iRItS6EK2O}dvQ00YyG_Y%ENS`>o z`PF16Ust^%4-gIGOaIh}cNd|DkR^HBWSc?>3I!l&fBURQ6J+j@+3cJ>tbh)J?c=F8 zHpuhMW%)d{HU*tiYmgYLe*Q6kA;@#^&X{c_HSl!WGOs1a)-Brwesn~Luz$Z@%(?OW zOqhR(;0v%$a>@m+8=85xAsKdMuFj^m(Dl?HnrxH~0~W2Z zJ3)+LM>Qu%mYV)%uuYs(FEummy|qAKK(EVo>Yzt;(!OhHcjUX!t@~mpYYqw`?McoW zR2Lw@S3#k!$#i=*v@`@iwt7@eTjx}L(=Hem0J&BZ-z{DxB5p6?FlxReL)ABU3QN^O zK5FSiY)41lux|nS)MgmCz>FzHk&aM=hc{;fa9M#XWhLGxcr;8a$$8}J1#HDkC?%-G zwOqX3l9}Ko1g{C0vX#-n+M%A`uR34MI8!`@OeY%=-8;x?*8z0BJeNPX$dct42B3^`t4hnN3)UHmxAx=|R&uY||xx2m8%x0h+|JWx9_iDrmvfv1TQinbVC|G?mf8z%`E5Ru=A)adj~r zA_H!4vqvctOWh)A*(Wl@Tn3^7TuZ53_xnSU!6IEZMA5-rZ<=z_H-Bf?zyjRtt6=D6 zpqVz!y}eN#m#NQo_Vtby78WD60G6TaGUfp80o|s*T->1s(e7WU<{z{JqNK=m zeo~-!|K=4DauI8WXPh^qRrzX?anG)X@sjhqEkOj{WQ~8pk;X>pO7jN&*w|QmgW&_d zGf{$G1BUDD2#x>GYxV5LKTG-l*V=IM{2PSJ%(oN1Q>4$MrFo8yoOUoVDapuSs<}e0 zRree)Sp6cZ3jh`5?Cx$N+QUqLT~i>{;2%?cW|I^tH8sMlZEaPuva;-NZ;j8*xkd=J zZx7r6DzIMBRZrrYMlE2cDg>H)Xh-*!>%@C6{1O@+DBT2tVKuuhL)1RHhgj z8F>|P)!E63ryQf%9zecrUwp@i1N4U57a}7nY8zpHf8b1kMEdI~!q82Zqlr}%eyvst zX055p0f67~RLc{aoNhjx{Dr(te%uC6?iW zkDlp7RDOwSI%?SMH^*7QNjiQ&#{CH@iTo_cKL3RQ2X{CoViMkOi_J)lv18_P;<+iA z`Rg@o{qq!N!oAVS$?3{5LjbO3KQyO-;7o{yxrTdziJ`m+%x6Px+fxnW;DFey)x8j3 z2>0rbt>?FAZfBs%Pm{0F>Q(vUOUR^nmv;4+htmEXt_#zhzK2sg{pMV7{RX8Sau+nA zbeFFUU}vSuvw|wIVZS6{uafwUonB%eilJwZO-9dTq#HnY`C%euE0?u!J?6;|g7!Ir zsjC{#o2r+MLK4l`i2CP9&%Op0k}CL41nV3{`UCv)#S}@Z+}Zi_fy~1%*IUGH<_?COAK$sU!Rmb0f%2! z*w}9Fr1?65c9B!^ijh0h#p05Gk20dgg@yBhbdbn9r?vpbH|ukklPBipDkmn4Ma)Ha z>Gxhu(|rP6FPyV=`{tU;YUvp%)yhw{Jt-zjfebbt9=ZS+0n*ZdH3=s}A-c;yI*12f zY#A>ZhEbd=zI3+K+r~VuUKjv(( zq!kGkcM+$L734XK$gG(>p?N{~uU-iL2T|#A{Qcm6n69($|L+30|2^gNH@2hvNB>iUYUNf4l^}1?JL%8Y-$>xp5|4zo0IWAlhNyyPkx)0 z79L+H&u|>M=bDfx73E8`Y-2sieEr3`ycQfk?p;)*2k1CDvWtCvr@Xbb^&|74MxG+M zH~=aBQ`lB+B+Dl8IPD7nb?%Toq)>P9lQ0gp_#?JO<1$aG^zwjqp~02_f1WV`8}K{# zjI4W4n{UoSrf3Air^UL_WD}$Kax`D@z2<|#Qx~>m-7?P-4JnD) z^A6t^_gRfTi#{I+ZpzEmHT>}V^Jijd?*{jeVlASGa|@KLm@J201cH7A=>6-d1$WZE zyU*I>Baz@Zc*wfTA%G8njSrPh795{EEx*KdEesyMYj(ZGC<;&W>^Dcn7A7rltuf8o zG(xz{?qjJTbKtu0^~`jew2a=Wf$@td-<;Ekb5Wlc>*~x(%sfa1^ ztkldfV-8eLPB5evhlC$M)^E%}N3LiUj+zH&Ad8K{+NPF>uC=U6;@$%nhiqe{z^=&t z;#-6!^N(J!2GK%wPsBcDiNI&H*a+0Sp9`3-UZ#QAxL68Icn8_d`L?(|p@=kK@emON z#%Aq1_37o?(-rt>k11z8kjh0saN2W$tCfHPDU`TM!;C2@9PSxwF$*)#U`Kw|@nmV+ ze|7y?k|uA^jr`(s;QH>Z7wYqdn2y+%3~gxiGFe>dgT|a`WgX|V>L||XUfZ3c8C}kz zbz7WV8oY>YVl5t(VF!k&8#4Rk&0y$$jR;aQciEC7%?-XYU^^acmbU3DMEj>nKfE4B z{tGC|@v!9S5C)@Q6LUUegOb7;`O|{DcH71#fv(G+ZpRN!{(5b%5tchW&zrqR%no~{ zaLY>D(gk*f7Srl}B!pJJLyy!^3^Dzx_9&feL^qiRT!uL{Fi|sHhVmOS5+n8)c7xc$`AmV zuV>xm$jSy_<2=Rd?{}qqfdGkoq(uQXz=(q(h9}|aKXoeJO-N&~`l}zH1&yqM)U%A= z#&1?$plsVUy7(@i?)#~wMMWLpt3@ML`cMBhy|0~eN6uodvpWB?RXMx-U*^XW>AG>d z0qWDWPDz|j_?2;c?O|0_)v>85r-;YIy>%`Ew4<#~Cjl{6#h)z;-UhvlC$cG^5Q0;9voVh_f4|0R70z zk&}AyQl$6co)fE-m!^&!zIK0erldVG&KWbmz{IMRW^wj#nm*m-o`=aA%gZG>6P>Z~ zOWRt^2-g{4dLYkXIsO{73db&T9wb_Pzk7%YvxI!HEw7F5-&3HW%fVfc#HF+P&{zR}0J4 z3=9lJ*c=&)AqGaf_jt3u3!tNoVtm$P7*;YWu&dLI0>eIn4Z6L8DCLq@t77^!=3H^? z!#dC%18UlM=U;HG0n>!1DhW@&T_bB9=)o1rH^R5?+?lu+FI!lQ)MnNGIQINRwzBD? zI*z~0NSTqf24gFP_5mOqDr=? zwQM*nn*JP+M8husiiR8@gW3wo1c%DqyvLEW<&bS&RxMGUd6vml z!c5~Hs!ZDI_ne$0`HO^a@IP(plWeug_EQann7&Qcn5o2RRhU$) z{*j7aZc%8nkgnA|u?dYbTho$#U@xXvF|b90mnkbVwx(fNLh6y9<&eB(YRj3idcC3u z%m6htwJGXUgBnlZ7WUSh@-{{2@mPwShMdRWQj-<8y!}^K;h`x{>Yy{G%7RI*S`D!+ zZ4rVW#}3h(^hLC!$^S!N87cs58bCp3NWcvkAEI$~pypAArikI=sW*zU`$un- znpLBJi%i!!z_r&ymHDZ~Oo!(4q=?Ns-Gx%ewNLcO@&^?&UcF#U26RHGx4CJ4WVZ?E$|Yc3HXiTvdY=+2YC}dBrcuOm>obSU>r;*DO-Q*a z)_C`^lt^e9KY{c#NP?vC`23u-@9)2804HH27}6k(@ol&}oU?LZB41*t6EEdG{)6?* z(g}&^0X7KO_9EvuXKE2N=cDm1Zsm90oOH7bEN(4WU(L^by!)*M(;dlzXMz?Leyt0G z_zawRe$mMhofcR>#J*q}4%ZX)LTQJrVm@qaN<<1W6H>2Fiyv?Jfh4b<&{LT8(Q%%c zJ0UT^9K6ud(oD5LYPg52n(akMH0w#sdb||}Pv*M78;qelUC?|K5k^=Mg9pT>@S7DU zo0#Xt-HP-%O%W{pS$#w|7o@*yHB;_*0{7X=7UYqW1=Fzqb+k*uzO?DB4q<6~crz_T z(>~5slPokvpIk-VKdPT=va+(8Hh2|HR9RF29@B9+|4DS$f`i0ZEMwK!u|fc9Ut#Ry zX{^HsDE9rUrg-P=UMBjSqrdh;e;VKC+w(k++Ptt8-CNSXI(ISj(OJd#Tt%U9APHhB z(4Z0{@6i-z2RGgvecQ7sUH(10z|_O1B_q{s^b}5Vzu(x@UuC=@cz#b>)4qwn%N9Fx z=#PM#o^ z9k*mK@(YiWI|<_EyL!Rs!Of^ro5d%MOYxXIDyyRhh=-Qo;C=BqqLw4S}F9Fa1P)E<> zWq00ZOiTMnR_oi~cWXC3Kgg;pG$uYbd|MDuCXio@WU>f;nN-z?y=#Yqo1g@SPEVS= zNhh@2Nj#V?>P+gCqt{sh*}OijU*EC*%@FlOQ7A=?EWh)Wud(9qr(TJFXyRUMyk7YN zzh^fl_ujw{YFu!Kr|hqYTQ{iV)R)03d^t6`Q%_ctE3C@-VG_$gIt)9MM|6GI@~b8p z)1V(dXmY=c+~?P?`X?#AAYEtn7T8J8m%XRKycPdTmtjH;M~d}X9_^Y)9?7N zn}-q?1Gi(WJ_3%_r1q(hsA#!=vt_ztRt9sSqajnTs%T=IvnccEQ}ObjwknT#oP>B{ z3k$uq%VX4CJ)M3YOKI2_Ffp_0@fxLz{hGS!I!1*^ecTXp#*XMl-!bEOU&z?}gOXnG z=GcGB&xh(uxCWQr@{2(K)4 zAeJKb*!1-WC|@AsD~Du>bmb2v#tAi$$NLpFOi7`ooIpnS$r|PIDMruCohwqOSBv5T zowVEiAGNW%yQgu}h(4{{Zg&2VAbiCRB32G}7mcLtYe}cB3ESxbxITZ^LRRhB+1rdg zwCxjJ415w08en&TGOjPiq}61$)7{OiPp@x%X`CS?hy@Z#Zg=s~0@a0bkAz$V!t*$p zwD-xmK>u0R*f0k|LLI^kg?eir&kRdivN%>HtvK&8Eh!X$omJ8`0knX?Zsn!rWC_+v zLEH~!Bd6Q|Cp~d2)Fb7WSIygjWZ+^`9XeJ!1SXdvL*Yt;BVX>ps2_1Eo9;U6XM zBEaU0iHbU&9P){cVG6zvJ+d2h8dojy?>`_=kLj>%Px`;)U`twYDKeL@2x;f z-nr_HA2)$LX5@DdFq&{l!qQ#uyZ2EUro;>x@anVBB$d(aH>cyuCs)BRv^z^lKT^G} zqvuOYwnjhM|?Gak`$mDT&+2BADaD*O&cRt>Ai>+tRquKZ^COLF+o1{N-$x{##D;?eX! zhoJUqb+woqm0^p@E)T~nd6J~yNBcW4zt30ihaOLm@lLKRV8N_`*UpkmS>6}^Pa-VB zVqJGl2bC+f<(CrCmA6;UFD;l5*nHTqfW(_9=LPhH4D{sbhJD$Tzi#+`h6?D5VnE*{ zMHpwLDZ+Uq`g~kQMw&nqIC=hXqHc-W-M_%C{^v#4$xljXOGxGE?|705bXQ_?+{JR2 ziQf#V$p^1jX62$;J?6L4ZMPxtG!hE2D5TNwq1Eb=oRxl{|0GK*heHikp2d<`Oav+{ z@e14AG2j~a^PNr80JeBk795cD$5JphkSePtHvoH#T~r3UT$PE44G1D@Wa&G=PSyhx zgI_U01?tC~cl$phHmUytVmlu?+va{Rg>VquXkt#;xx27|lTeky?e`F(`Pz;xT@AY3 zEs#JC;cDW&oaRq1yeUBsqsbme(GHN&7w_v)Dq~*V_f7Z0W_%t7Ap&#Q3`5a+Pxe{H z-&CxQH+#eOp(jwj;W<}dgqOGrR`0L$&G9aHKfhykk7S)xgjE%6itDKYN)|2-ujlzL z-G`6pM(`l}`!l=XI@Rk+ooC)(_UZ+LhX9^hh~`5qp)kemQ>mq!Wuc3{tOnr0NBpfw zOGGSeyvem@>MZ%lU-4^4VC@ z$L|PIsS$LW;A~m@UGqP%W;%d1FsCT z5aI#qXzNb8*GTBP2mMiR z?oG#G2U0JD*c7zalCwF|oz#N$IIGQ&1&Fw2kn6Rr`~5A`UZO=fi#iqPDRwdN1fON< z_tG5KA6r(SzT(*DtRAGgDj2;KE9f*agQ->KgEy<7rny3vXDp^0PhRg3o2AGv4g)*g z0N&u8xT|y(>7e^j5o6!*s-=QeDqK@zN@Rsqy5O{0DVFmV6ASama^9%4$ZX~OPq)}O z9~W)cx~eA8JZ5+E{000j9t!o+L0_g#%vt2GAdL@7dLb}NnZO-{A6X~e~zZ^b7 zjAiPQw(d~JQ9Fqy8S*9>1ElVzV|<`mplI6dA?sI9&qw`1{f?SDS-K!*MrUP2tYmD4 z4LzrzkjI7G$QtvzsdD!Q@E)v)`3J8!U>30+5G<@uiab}=p8?kDZ4#Fnusbxz80w(S zXbx;5Nw~$N@vgMESj#o`+1OOG;kwqYSV^A6uw(4So9CG{uQ_u+D$M(qd$IGPsE~MR zo=VPy?*mc4pElCtETb*7Y@@>kTz$(F5O>FZ8*$;muz+0Yv^uIfvi1u}ky)hlzNI`& z=GZNV!?DQ*gP4_~=iYhKFmyS>Gu-(VRVcL>>%?eNj_%zi!~Xt?LdTfSk&)-B8n%TAwi=Pztm8kE)W&s3%Nn0Y z<|l}ctKgiyMN9I&=mBa!HY4#-?ugdO3Vos>j(1sYy|F$8)od^y$eiw(eY&_ybYQK? z3Xt#HeU<$sM45HZ>4r@OeN6VBNaK%>~_3_{d_iIT%uFM^^!GZOl zppTB5V`7^v8l6&goe9wFwjIeleF26&WJV#U9zIO~B`^A*_Q)@Z13OHB^kel?heiUgzt_s18lJ>Y99u~9H*jFS2UgD*rXo1%JQzSrO*&c5D1qN zBsj>NO9$_0%~5tbei0!7@m>AVWnM=GkwL*a{Y;4CzvJfuybTC z^l054!aW7HbU5r3&6Lay84Om7pYyB9_CK)l-uu4!p=VL-L!x&41ow1c zT{2YDjCON0Fi6%ZRb@wP4A+p6j zpm8K^xUURbo$6%Cw^&S-ie|)do5+~BSZ!JPEWldx(anq6mCeUS`g3W{Ohwbhe>rF5 zm%CKyK}p6w56$xiC~>Pq!N5p?rk!!qMsT=Sv@`hOOKk}8 z#g-y1qs7z=M_CLko>h7w9tZCIq;=fPCK>W_#TMVyScHuY`R4uN=d1M~j+eW;=zZjY zXB7YSN-LmDzHBkI*<28cS6F_txQZaP#g7~23_roajYMziiNnN7X#1wX>1x+EWM?8e zqXJ@a=q}rsnOCD>4I8;Qy+6EK1{z?%{sBhF1TFvn?6=qA6KnmT?~I;A`7}q zbm8iS&vaMjkFgS|Es`AS!+(wGrkc3AW&y%-d`su_oo|Ap1GYjJ+wq}aeL3?(k499j zXvT*Xra^-cGuYkj%)8V9Pky~X_y`Qsuafj*#q?Dk2X614Y6=E!^p0PzFp*Eve|Wg2 zHDa5w7OOR>+-d0PKJoUWSYN=y2NK_zST-Q$J;eQt8TWhZTHd+qAvpwDM0Ogl@u zXd0{>OO40wg*8Z+zm#xEa%yz@+!qT*m`6H4e_YlFkx73LM9%P8mjf(Cm^qMU491Gs z2?9TkU}2%cDClnR>{PaY+0jHkdt`RN&J=~^Z*-jUasEpq7NKtwYpCG)%|`#(<0RmH zR>2ODXo)VL(-B7JaiXBHS+jBf_Pa*4?2&>dRB@IXw5UK$yA&Z`5Vvm(IfT&dUUd}n zoN#3jDbCORY57bSi8ttOynJlr?Cd%bGjSYc*|;HRI_=qNx>7h%KXxV6D-?0&EN*kO!SMG-5NSjucg3!77=rFG_@F>ai6zGr8O#cCe(*2HCkN6c(M$ed;YlWcU z0u4W|RyJ8@VI}Iy3gpZ8FP6209;X=y_B-7s)$y~9hiAFqSNP=fm?uspDl_X$vtoUE za5|1J%$nwX$8%PTncatH*X)?&JQY*nmgT??yFd;dJl!>W5#65d82}#>STs4&^>e(d z9}bmDM+<(Rrh63G>3WKLXY z9DoJDJJ?cc-rV1_p`2(bXxObQkFjt;H9^Id-8+XhV4=<3xOSI5NAHfJ!ct>m(0D$D6bm)_A4v{ zQ`2oM3pV5HfK%M!JBPRhznO#T#S9z9UY4dI(>L69*C6~G)y-8k=~g|*FVlCmv9mz` z6dM3yUC+XzvZ~2GDy4IE%op5Z%IsX5D^(HRKay|nl(+hP=pjEi{h-e2mj}XXXd-vl z^lmg?h5PB!9X!i)F}n4a7kN`hwCY=oA(0{{Okm7yrx(aSgV&MUeZ7{|8lNjGuEUS@ z7eZaOqkA3sKH$bT=;53wsg{WqdXup2V@>ofIS~Euc*}xImjAhs2|Tdlt{p8`;dxv| zO||i}nNF$;F|Hk<5nnSFP-|DuNTq(1aq}3|gs_gLa*Xf(E zny5##f=V;(arDUebO%cTI>M_sceZf<#q@Ly_r|& zVDxXU?0)zE*dYG*2A*rDI3id+hM%xawiGR& z%$FA%?5$|!DX(5Db-u+PP5V%{J$-kq$^EHA-1>OF)RmKAzU&J8Dtzb-B^5VK?#k5s zoN^d>i2g`3dAwA}*7?mx?RnmQeigvG%84KT7j5qW*5uZ0jiPQWptvo7O0!Z$IvA>; zg3@~n1nEc!2%(ptpr}-p7K&8q0wNGPQ4tVGC{jX4T0%z%0Rsf?3i~_dIrpCXm-}BH zgqVlCb-ioNIp!E+;vE2%^p6%LV;3Zf3AZdiDg}@9`*)2H7USXUkDKRZ@1x90dwmFx zClYOC_xc@{cg)oTut;4#>3!n}j?;_9!Je6lzX_$i8dm-dY_}{PxHI&!q?gl2P_E3l zvaT`^r2$q^P|y+Cpjwk4TIeMX4gM6oAXq=ku9R$UvVjq%v%I`qSX7k#4{$E=_v&Tz zEI1kvB~q_%xLap0Dt+V6)yeTKZhk#793oh`uc?Rgn+^|+c^I6@YkDf@eY+ccIhnMrx#3DGqkr(B?Y92=tHfvoMC3T}|l_N>WcpY96E3)1G{KoPTnpCXETjp$f1q z9ilDo55!|)3JnLrp@&3%q(*xH11sPdqIVg6LqF-`yS57b0^E?TtWd?{L+WB^zdCbX5KKuwh)tsUw2;hRl-h zLDi#zRCNB#V1DZS6D-Ip`>(z0icwk~`R}+FeR!FMu9Ho7=@(9^abpc>bL8$dV7%2o zZrecm&anuuw9$JxB_*}6%+r&3ZmgDE;wH57C9$hb=moXiL021lIcV1dp%abpW4awZ zs#*dl91SI`vyn#QZcH zFF^w>hO;1hl&N2Am4CT@p;bYxTal%d!pPMMcZIq_w1|MG`DFr-K2jC`JljJ5J2yrv zu*;%`&Yr6eedM6d+q*rKt@B=idkl4_i}QAlpS zojZAjqL-&n)Rsr9m++lkOXHh6=RvNImyHf=5i}OCO$nl*ZT<1K(ev>pCy^+|>Qmun zcg2DVqXNcqTvVE(4VG+M0_)jq1xdHU0vazL>_VHqi)UZoI?|d$GStdOb#C+Rye@4U zl}sMhdDqeGmUelR)M*#tcfx-xLa%-B#Wq`ZH@bPW)7pcpdDOdkLm-S?Eg7ROO0ZnA zP;M2N-nE`F_XOuUNNwmnykTT;>hH*|^3GeWPA{G@=Rg1f1kD{RLZIO)F%l4JnOjg)C<| z02t(gF^9jNj1BtLQ40oK9f+v_t)rT=z&WuV@reep7~_i-z9jjc=j>Q5AE_r3 zKKN4;o()!YGQ+V!d!a5Xq5Oo~&FCd6Z|n|AVQ34$3%U*bf8*{99cv8iyz;Q7K2FoV z6H*Vr{KiXCW;!1ohtF9c?>ch#zTH7RTTj7}IX2hWBuoFsy5m}3{aZMv7lr$Fr?Lc8 zl{8O*spOt`lEBE;sXy*YlOH`ZGv3)IHW`+bzC$L8dkX~dMbxyFBmNXp{0%)U<2mch ztAoAqlIKBQa_4Vwe_m(ye9&*hLDX&-eb#*x?WouzELpnq@N?8qYrV^K;@IG%tObOcU%p2+&Bb27M zabEjz+o7>$MO~cq9#<18NFjkW0j&To_F-_bKXO5NdP^MBu?2ZpHSh==jox z8>T*2BqcTsuI~;!noeA0-I|JDWj);lKM8n&a(q8j3%k*?w;elWLx^&I%F-n;cWQ-S zbLek59;WV<=F)V4_iiWcuGhD$g%^GCMUB#STk^k;#_MXqLCD_4IQh|l9=(m=dOFB-n1sHYd=1HEDMVL^PzEjId9`j_OXi9Ul(u0 z3LwE@gD*NWiRreV$Gxq+KTlU`w=z&8QXe|WavQ*9<29H`y|!CV!wPgzzp2}GSidwF zHCd_<`pFbKC|xKL>=V{yQngPP6feb0#|)59xo&VNOCDit=tb(VxV_03k z+-Px6nJd0vdB7`?*K;~b!?PaMxVNekJ?|5<3Yf)GdGyUPWLyQ?Z5t@g+i2L)=Er6! zi&`=-y=n^QaIUZDm^8rty{nt#}8QLx(uYV$`myw-Q*I?#(*x74^ z1&-pM8IN^jzpA^^=eJ#qz-}0AB0N-;-DQ{si9g4_aHQ z)pIqp)pKL+1hV$aD2JhR(PR<{f4~KM#7pN~*@+5RYiXe_Ldd>B1g{UO*Z=%LS4B*jl$O)#qudvx-uAy`(QC zQ~EAT_>zW(?L~pNZ&lw3aLIZZzSQA1x~rA9V8a!zI&66EeNj(OYS>XVDfv`=w~0@i zOG+PtEVqP)`bvv;R4W|!#b!MqASK%hlS=P`#CAzW+l=4}672-}MsEmYw zXM+Zqn!ZlDO*L_~=inQEk{JDonuZG5Kb-(lyS~7|{j>8(U1iV~%c+eR=dP~`vQK=m z+y2MA7G~VN(jhr}jn6lEgM7csS@v;fboF`tx4-LtPFG0RIm4?OS9TZASQ`xbP5 zAkMvQ`q`5Gv(t6{Nw7Jz&fB>I)9STu7<2UKyM<&fXpNZn zujYD=9NC`C#`bIl(==$mCU-VM)lfMBJbRUmf`gl+o}!G&CsPh( z1-huen>*>1ii~v!!)F`uI}Y>(`NVk=6grtqtvtKUwKp_D>oVUjbs|{4s~i1M1-W{Ki17Se zfx=qiCCZkYQR_F>1&b$*Y5Q3|bDxE*igP-Q`SbEyTFw$T3|bmqlee!bN)Y26T`d~c zT|n|BHGxqqM-&bY5WOs$Qd2~0n)xeSOUVmf9CREiUs0m)&gJy0$~6&3-kpC9An$vX z6#b8otYjj3!Q45%i0fze>EJs7Tf2GskjIj&dV&)l!Z6INZf2P;I!cX$pb-EE?U%fN z9^S4&c_@sXnf0d@?LP!2Bc-%ssE@hZk+)=ni?iOoqL-_J`cKpyl9Z|Bb<0&k7OZr{+kah(qfKE^%J$bMK*vL@eORVi?`OW@}llj~_lP|{h; zvOST0(`)x7Kd>vUc5P&l8ZAzh`OiuSG-th#@riA2m^}G;{-&KY;%ZY`ohT_6J$f1b z(RAiH|);S+^7$hUNZt{2#jVS7q! zl?ZKn2)g9Qx%`BbbYDuZjsTgJXd@F*u2-2>=WI&98cz!(Y?=S^U_GHoPU?!I1BPB+ zXDsXMwS=i;$-Hb!s;@dyF7YufxoR%Uo=|W_5O8S$(o6e(Cg!2=DJ|es*l@m!f1Hy* z)v(GpB4JGtYvxj|5)0gZ>M<*O$==+wcu>d59N3PO9fsoPyCx}xE;nX{(}mM<)S~-h zrGX~o8gec7iquH7XlfuymL17LA3t$~$XkCqWj*+v7rdQ!0Jq+~TYSrMte~Z*##}Zy zKG{5lk|hS1f6Ii0BrK8)ME4D!HgGFA9)4F8Y>Lf98Nhhu7E9h`7%5?$PZ?qO>}aBQhJcJLmGs35E>4Jd;c~keJ(7C*^ZzhNd7`Q^NsRnC z#Uw@8HKK-E+%E(Z-W^zJ7Q*&bPng$Fi4QZ)`c(!TkY6=LzWTiXUGeCvMZ*GXM4UqE z8}T=-Du!qtKLTrpwSPG>VH zOd}a7i#0MI5EMqlCrE0LQ$DPWKUWOiGNw(9r_c3sByY5vz)GoP5}EBE{X;Vy>jVS} zl2R}j+g-*B-_sPfeBv@TDzS_JCHc4pKH^Rmz(&nSk1-V zF7i;|_NK@JF=gB_tjJg~9r&y9d9KD_77H2_7K+;h8=MTw?gu%iC7J{o7}^f$_4Asa z=P}I)lOPrNOuXsj94WewJiDE3B5wkK;7nk9s>}H$(l$WmSuJ7J!y`~IuH?bo@!>MjFJ?AwbY6rZBnSDx5&yX6h?hXSiB)pW8M|CVo$er1!fVzDUtq_ds0sS z;Kje?ZvO?9{GYJ)`MPwbZgQ+kR=4(n-R^M!3&l@WvhlgXnG5^&B<_omGJzK(2xtKj z26woOW4w5E+%IB<`VGH5j72@LYNXxW{)XKxExdKMS|%TJ1bwo1dCx&nJGXZjOf8}m z@Ts#yF2;2_oAZyhGNLIg3!W2ilEjNYQI&IQR;~I`R^$MA--GAw-2WYPq!#=ObhL^@ zrt^^9#rv!1H5R&}q5Pg;tdV$ivi zyGo5^wzn!+PiA66QQ{;IW|i&FloG80v#ON&3Qi&iH~yg@J+2D?KoGBMcJJz>v|y(= zGv!3Gi9j>XN;6%(V8*;%%p20e9|kG)gGAbFhs~ekW&iqumc;mITO&vR(uE7UvI+|0 z_9x;r5QyU8;b9=(ca+Y=xl;Q`fa_D=dh+GZf0W0Mr)+0tfA;s^0FbGljZ8gse=R2_ z{T#=IOL`OC`J3E}3Vh?HRz<84vgb<+^xXDevAmxfc<&Qb_YnyFgvzYbTwV@s{F$vK z`3$a~e*$bZB2&mo)Xy7YNwz=u2s&@v>j$P-ed26g%!WBJYg`ybOdu4dOB}{`z;IqO z%Jp+T-skJ{4k$eUT zGte+WJgE;D<`X;LYrM_)223QL#$3SNX|pp|3fL$pZ_OS#J(qMO53nb@Alt{(DBnx6 zx0id5RW1%*yx}n$z{cqw zKQ+4n_-l=gFre55H$yZ;S?PU-PybkylQ4 zM3aj9+-D?=0c1O}wAjko3+F~^0%H|4S?CKw7k4Rq-qvG_`E!!+W~0M+SAJ5_lk-vIgFOY3GTtG`rt=;A+eRl8JBZo^DIQ<5!ZXWkP-$DEC_c{Gb3QjA#jb?|n z*d?C$7PO*?K_>#&=LU9%R;6eV9uo0BKoI=`B&|=Ap8t11=9vR*{$EIDePP(;UFos@FF_MhG9|rhD6S6= zbOmA+ChR;WcnWEXAm#WQC^|3l(_wYUb%DghcLg}eOA}WyoJl_~JXEwdEx*p{5QeMw zOes+EVRs_^Cd6a@#hNXAYjz=j!0YfAm*1GGhUKM08TIrjq|GkZWkTjxEA4yD&le%; z(UvR*HI3?>mhFQ%8}Dxt9r`iu?^y`8;x#;EiBm5QF-WhR5=`m;jUzj7Gvv~%88%Lm z1%~3tPQ8cmH_xM|lXM1|@r$U>Znm3ZA|roheeu)APNB1`GOWYjhi#PO#l15doB1i; z-pt8x_*UJrix}%rYXpIk*lLPGcF9=e$7>bjF)AMZZOQ zC+v(J_lSSUxc96L^zIcf?8RE$V`ja$al87&(;cZk;v|;BzH}=F2ez#+%A(bNEd{M9 zVSNsfrbL$aw^V}Odb$quKg@PKe?EJ=1Zmc#`K_mB$E|W6FB;YP%&g$P1>Xwq_~`)K zwCNy2L!+z!GoDV5mp@r5RzKysl6slrn~H71bSh-=c=GBDIn$`pPJ9mLdNnn3A7U?Vrb*aq@?izyAHdk7C-| zMxUuTpeg-BU;P(uc|P>;mzhb6BL)WrAp8GTeEUxUh@P6*yYK#S?;?Hd6dG)HF{N!E zeT@7o=)S@a)Ab**_FAyjRMFOrOI^Thiw9aF?0|u|Kv*P96sgJ{w1L^*?I*+=Blnbd zZr2mNK{*q?Hr4EK!QQhYPciQ_>X(AU?YNZ{*GddV{TqPGYPo@wL%6^D`XAU96EOpvt%$;%eb#J z;Q>66#9>k@p8|$IVjys28;2>dfu<0=P9a^t&4A)ZZ9``f0r6K{_<`|^Zu2)+2E0~r z8}Q9h#4E0Jpb-5(EUdbb*?-r-NIiJV9K;*m;X^#$$MaEaVK8X%KDaf z`E3rP#hRipDF)?#aASGj20`dUtExaupg5_Nt+{^P5>M(}^sgqk$bEaV{(jK{2l>9F z`i#D>IirRFRm?ql4G?Bl#b+ljFK?+;w zQUaN~gdp_hb|W6Aj9A28`{B3IAz=96cR0IEr#ocIdM++e);ZT@G*Jd`zd9#(Y81qr zvuiAeH46*{bMn$r=0M4v)hdJN1A3@Rc$YN-H6@_1`@59#g{IUegQZv^M*pDS6+{kk z(Ql7v1XxHiwbSH_kMRWRDkwO{6mS{?x?isx3S#GdQnR(q}Fb} z(C{47xYf7bQQBQF=pWU0lkj?4ZKF4R*RZK6JNZxF35JZ2t8ae{*$Vm{H3DwJg-El`T84`?X6jtIPn@@ zXQV3o=cbrbJo}~C1>}Mow!NNhu1@6atOnmnI>{rGFRh$*;TT@vJMCWmS?Y_wxUS*q zt$|2KTy+rAL}Wkf9hpI$wQzj1*NkJ&)j?aRi3QCp$c*3y7Nh20vOf?t_!G32$^Os! ztNi~}%Z66zJO{_}jK1&)kyqYoFKafuhq?lr9vWPC5%c?wD7zd|(vv_}@*ps#e=8H_ zj>o!nls7Y-5YID-7A88ttD0xdR5gzR+6}s`ZOuQj)3BW4Z@XPkTnyr3$)+zAljj+~ zu^r_EZ4ZD|p2LOmzrmt>9r)07Plhg7)T^tV(*k@lNy!A0{U@plw8y8SXW}ANrBdI9 z8T@=;eo0%SK=U4Rf=J(^CiVV-X3F<-I_SGyrm&PZNm=N{M7rap;iDsV#KJp`0!x?1 zI9NtTU02-k^`DSO@m2VFAMPe%z=?8I)}+#>q%n;_h&_aF9U@{q;3T(-k**S*KBgBf z#@U=YGXEi!#PsPg9Nr7!%CoQk+LFKt{zK^i&NI$%xC98{)*M+J-<;zMsGzj9_W4cr zZ;vIhH7{NZZ(T2pBC;C6${yV7Nq)6XedXaN5Fe|5QQ&>7Gn_2z_bb0*2WIIvBuM+p zv-=FP8##meW>p;W5nNZ-r(n9rN;5k72=SU68pwZR+rc*>mM&U1AlVC{lR! z3F*JKK%&?Cc%-=v3uw#&_JO61ur<+d(PyN2`18O+_w3oBoZiRfC(u3MU;zl23)oua zC+wxU_Hb7~xvB=Rm04fk+eoOYZ+7udpfi@i+0kXjzyQa46#~HF%|h!T=6k}3o0(fsrAL`n7KQ~Cz)&qt{z(Yc;&OMkF_57*Frmw38T40!aQ z28Kx%+H{wr3R)8`@G33&ZPi-6Op^Hc34XFje|n@dHiatjJptZA^RT}t5vjjD{QP2< zNFLffWG2NAV*$#uCeaX#u$pQxo$qz+0mzzNfrZ8lfa?iir#L)E5LJL9Oy_Tpd5<85 zfrSel<1dF){4e_zC`y*{-B3>ZG&qb9V?A@a1I}4mEkEp1mgFE_nvGOiuTz3>$okZg z_dVP;9U?B18uUXt+3lioMrA@GtprQmBi{EGr3*XQf=4`r-%HpPQ9OYMb44h*!cne6p86-KEG zd+Do%_Kjc1BX(&$kTo~8X$g$l2%Anf96Q^=W@mDela&I%VNp6Kq@IMjhuAwk}=0 z-za;@?yfEiG1d;b>`-!%9MJ^rCcDB#US8fR&47E}N)f|Wt3+GfBwHk>nxd(@o$rMm zKFd;kqJY6eQN`gdsx;U~Ea zq~9AO48sYL!4r4rFn1LD(J8TlM&tI`^5H6YqN>i49->~`#44x~;;F~G*ru67D%kiV zZJidF05Xh?aJf;ALY11?M=4Eg66tewr=cvnL!D*9#;(>YRv2&S$HAR2#7!v9n&TQj z*1gD5fFO60#96a?4fQRx*Ty6CPTP z>;2x>KBB%@P^i}!+M8DY@Dt3TU2K0%l})gpoRR{br#+1d0bb5q=bRts_k?V+;M+*? zI=uKvF~$)28s>NB;%dwUB{4NUg{l~@A)9=~_{Ly*8n15jS}ZTLt$KU~qCVu52$lMH z2uQO*d~sd-?JtRRs^)#5@N<$Ztb`Ms#_OrF7-Vc%%#v=|iCTr1G;zXTei3r?bDIBV_!4R%99XJK!^kV9YXmK?!$3 zIc=1&E$L(|WZ$mS=qCAfZOXDVbBYpcuE$;m@)%yoSZvy)W7$Liv-7d=m;Vlav6ATV zJK*LK2GRHQ@Cz&(lu<9Z*RmHuKuoqU_NDjY?-GRUXYxa?u?8c))83EmensAD@GKsu zMk^8EX~@?Jo2v$rWe+JyQO?*#)t(9#2p5ujNT!*U{&$L1RY3e5#nU2SM5m1_x4IvKinkW15^#+LKs4O z#80I4Qp7TR(Gi+GWXwNF>0sYn4*`{{svyuNIbRtWpeln_dGK_<+B(V&@S8m5D?VY3HC+bZ~ z{qS(Q;5c;MoPMApDw`2$%yDrRD&xxKM_8p zBDSXKW6xr09T|`0aoF|vjCU--<8e|$EzDViC{(*xE+kAM+Alg}lqij{KrY!N*|M8! z{5^XC+^RZoLX5z4PF7a7!edq)D29#U10R89M+ESk>QYQ{s(+G0+;7{d+|P8NxXEYl zO1wNj5@Z-*HIV;jRIOr*xk~Wj)bvrm^e#RBW-j27-9iqpi+^{Hccltdby??5=*;;h zX;`1AX)S@ylBBW$>Drv%=e7mSqzf%o}u03t|`ZuLeXr zf9hnkB{%>)l|E}7P6bg@pL=t>`No7> z@8pt3-gFeLn_b*Oh7==u))9!HFPOaT0EN%>- zW^1GQKX0M0QlEQJQ->Js&(18@D0?tyz8~7Y@V=N(XZ~dG5W_4WFdP5B`H^I4hSWz% zK41Z*PAE?{2(oo8MUl=R0r~4e2F<|m0GPc8^!^X> z-F$Iqbkt)S`(}zY{j+F_^ge}&wzN_@7s}%sGjv|v$EV613cc}g$YlW74FKbIV0k}# zmTIK~C+`scF;+uU2KEwWb(>2B5pG}8Wh7}nMkCwe!6G%!w&r>{Gl~~Ff z0q#-)Ae?*lG#7cUHN*SF9Wzl|f7mD+o5@WF`)+@J_z>^dmtPragSB_*Js6#|8jMRU za%yX5~o_!s6w(SG>h8%FYGc@`Cex%O@@z*?!2-M^Y z2$S>~zlvYB$Ou%-G8D`PvcPRBp|HH%5|57pAJvlr}7S~4e{kX^c4j5#vMPJK^w)Pnm0wRgXfHR^>!!R zo)LmoMl!i884JC&deANQ4adPN^Xjtg^Y;=is4Ld3$CIr(y^hXX;R3C7 zmE&C+#{2Df$B&*rE?RIkoZervy`ZK>nVGEuKx8%Q*MBa|U%XASJW^RHRahJ)a7lP| ztdDj%?eXckp~5(x&YTVM;v#{__oMp7aNgmVqV^}9v&2|GkTCr{v&+^luz`-#i5AYi zy3V|IsjDTyF{167YXsvN&nOHh2zlTjI6hvhs)i1PrU@HAcmrwha1oP%)(P{*RR5C_ zYidUmY&~<6!NWa#o22w3$g7rrwUe3uGI;v(9Pf0=Bk%BOd%`^>GeJcTlt4{yO1s}P zGC24Cl^P$QqLY+mQV@zs!2@SL;6+;Bo6NmLmeDj<0+Be;>0}xc1<+pWltlXn0$fxa z!fi^@m)90#!jg&(Q*%GTJ>71*AnS%u+(W}mAn_eZMUli@K*bww_?F7#JKpg8y+H!< zYC8F>Llg#tpGam26j)lC^l&xrwcGtl9E3=t__&=DjE6OA17X0&Z=tUM_FlHX$WA=R z$+P~BuE9B@n`{cu3$IkKg{xk(7y26)ckEUt>rC5AEivp#JfEU;bBUUw?a?F?#$mx5 zOJ4UxSNL%Gx0HEe1fR(HD-={Hn8}E+gS|6VYjgOdSfyzVO38kkDSQ=J^$C7cdLjWH zF$C`Y60K-Z>S%-8c{xShC|o+J_Y8o~f34K54k&Dm+J+Uc)R4Hxg0{vSsspd;1Lx`M zXN|z%1JzZo{YjpPD0aq{h$GW44w3k`?&4`3?!5AE#Hcz~neZn04W{vzsyKZutYz0m z;%+m|`ZgD}X_{qEAgp(4&Pikc9=VPBMg**69Hf8Om6YUyfvq}A$GS2DWcf==6o(hc zIp+cAN;IVts8W6Aa#LJ?g17Ox>unlRQqw%wemEf8Nv)x8f84wBXbLn|PG{`^g?A;o5C=c-CBJ&@ZoCbnA))K?pQE zA_h?0eP_|OgB~*yJ`gl{Ckl=^w#=vD+8s##Y@&p8fu>zNo$Lk|dWlakc~qo@mXak2 zIH78un@t;@sB00WT6fhEXtKCe>lc=`;KV1q(?)UWS1=Y5D~UoKXzRG21YVpk3ep^T z?)n6-97tHl>OF8}2#EN03UJTkRQAX%Dj4yz{y7R{w+D%7-LiDo)vt60-H2gSdF1}~Uh}~xid0?h!t-BC9IH2UD zsd&Inwtp-kQs-Cc*W9#zDG#vlWZ^_YSYcSP#QSWygtmaU6|_~Ms; zCky?s?Hq88D0t;-3Y+$Ap6zjnz)QyZalPMpJ3(vP{Nuj2>Vo;_J4Ofml5$E-%xM9!_7#X6PBY7NXs1W(ikeTP! z&~z~O)C^2FV|byOEw&A#Bsiw*y)E?P&s|rg5r0rC@|*Y+Wgh_nI5UyEYtixbkSh!` zEBM7%dNJZp65EV_K-9&!fM}KJ=a4+$(4*%xh9dPPC_&?WNG}R!jjp3{Q(vm-%(Tx# zsp3hg9yPn)(-m+!=Z|@If^w_`>@xpa*#hOr75FY&ywqT)y;O1}*&!`Lf2H@u@R$pE(1rzyE7lFr1=55U+(=Z= zXh^5QN1N8F<_4QivHnr`Z+{&7l+T1v9_5O(5RC9uh{a90tFE|#Gh`GCpvfASmfa~P z2&xQ+eC%OkO(e_t03Z?omW+A}<{^NZ@2|~zRptk^%F+bP+;n52bOgX~uR0tM=g8OD zk9~0AEy~Ok1HK4xZISFusWBJsb?(VOY4o|Am6pbh7~icP9!>^bcNe(}`B6#?A-i{& zI;i%hPA*ul_|O0@Wx{#Y9D>!Ylqf!){^}KH3xg{tIE%j$Qc3Li&(?a8W6O?ARQN=Wy5Q+d-A_!HF%1zke?6kumT_WP4 z=$*vkF*c#iMxeL^X@AS{cDGSylXePA6GTlp82bW}*F1C7EVRk2-0%6Uluvgn&QtZ- zqXc*M1GVu(VIc5zozmfCITb~BTC=r%n4_Ome*f@8;K>R48)d7pz&nVo=i8zdnneN| zWr-E(62`hK$1v2UZ-L#3cW<<+QvGO$(I<(qdGi|`xo2a9$S3RsY~yVNiQi|K*L~@E zIMq}{60?Ic<@W(BO8bb+ZNu$7dyZZ4wF4@VEZ4ZaGdz zxjOC8I4U2q#D=N>Y)#AtcMC-0$;aNyIl;=pFJjGIvFc@Gjz)}x5jR+=RAT6a?M1-Q zVu*Df%PI1FGI2{`x4X15XvF*df?TE{Fbi;Y_Wbkv%JSga2j{GZpbA1-TwqtUVkUN( zfF4#5%}2_?Xg24qolL|0(!lMyona4`GEpX)E+zcfEcb-8aW~nD3AyqKIW(}G*Nx!4 z#_g>D3&9l~M!3FcA=j}eyAgo37e;E(a9eTNXG~DR=kFXvqDv6xilX%jPp7$yAM9J? zDv>qO9`^}eczr~+-c<-%lI{UB8My#k^sHih9S@IMM>pxb+4U$DJ2{eyA;Y4j*hUBg zT^QB!VqFktkvXsza`tvB)^-{mMI`NdeEWFU-ZTOV*1o;R9*G72=lz^`OdX_v)@JVJLxPrSoY?Z#yrn~KuqTediwT*w^Igg_Cny2350RFJpp zTaN#nC@M|VZ#n7lz9CM$R4a4M#rB0+aJL243mruBn2mL78N-P+c;Mw@foyS9dc_ad zXidmq2r|5<#5Vyi#xxQ+F`R0dWtuQ5rn-iu>M|r(C1`iRZF8-|Yp^8tq718fHWLo9 zN$%)B|FNe?r+e3cBqw zKb-a39m*Y$J@lq%|S zuVsVtqWb;=<;-IRZEfYWCuLD(L+fU|AcDco#7_eW6Gj`M z`mC2mO7Sfs69dMbt??-YUrhA`1e9N==#Eu4h?q5wqBzisBjO?`9vG`@qpK&j$3jMZ z{(nL+)?9#3xc!+8uD_%MyjP7UzPx(ZR*!L;$chkY)Fr@nra-6iI|U(ocaA>w5F&M@ zdqhjIwwLW)w*9N^kf@i#qOB)AjyyB7TW58At$mv7ucys>chx-Sez(9I9xDC2L3Cu>j88y}WSEg3!3W+%Prv_qy!&G07 z0ZrE1`3_(0v5ntusJy*rhmf}!7?_yI3o%yz0WX+<@_^EVPEUYK#5&tu&++8VGL+5o zl+Efhg(clnrT)l2fAO7UE^rm{d;fgN8JsL#i)#D0A7T7pgddi`95&@u;oAY}uOC$n|4B4~}sgtbai* z2l}U@$aAF|BWl6LQ89bwSihM=H)0FefZFX@&QIbZzk~$bn1(5vx|T5 zK~grkd(KIPzA*P*-1DbHE>F!sHxGvfL&0K$yzL4kNtw3dqq8{qvT8o_Wm;cLl-$Nl zY@OH44*}4wP$01*$?{;&Eg(}jL-_h?>L>->fmW^beEIT^%Zx?KvL#GleoIg?B;xtlo2Cn;!l}zb%iqR_@kr z{A7;DJAeiG#PYD$17>z%D92<%DxgP))@(6&G5)4W?RtoiCJ->>@_}&P=B$3VvObbv{eb)y7DT z*r3fj5#Q7rpZst#L^;h z{4YBFQv!*g#^NyvZHj8~x&Y?xQ;c^ZvfPHb^q|A%`9;4 zpht&LlBOW|1}|dU1cA-#C55dkXF$_TJQ4UqfLjx{H zJ{2@D!n+AOjEb1pU+4wdl-2%agfc-_-8C~%1Qiro!735_1_eVn)OX)zL26?Ied>l< zOVe*I9$^3vv61!-oyD>=VOc+~L~bp`TrH~baHCVvX7Nx#F=b?9?$_$ZVsFe`rUVue zAYcCb;j&c&R7cX4u(}TQ+#Vhq=AJ09ou9T3;Cn{y7{VM{+ivFKb&a5|0c*%QM*NBG znP$EG801R*FtgYWIuQW>(#jspmR2b?+i`_`NNKK7ErXW%q4of33`&;z2PrF08&IK zD9h0cN;>pj+k4S)3fMk0|I9J>>B#}@zKm{i_ZCTyW+)8pca5j3wYrb_Wszjc&R%8+ zzh0ek{zl6A>(1FX!#|IXw^Nop;>V0uOqTsi7VNj{3+C5wDVvaF8QTUKwK2z*Ufa5& z^xCn0ZX=^D!>W4Enx#U=s$vt25yl>I)1A@h>950Q8Q2+KOKnBIiliPnZahZ{xaN9K z_3&%lDk=50{_e`^Eq4iViK(j+ey6N>_NAlqbiRJRIb@U{H>IlGsJv5?%p)G_Hok{3 zr1I_}jC-}?0{7+f^V*=jL|8IB%3YNzc|W5EKN`iXP4nZSI{bSZ85 zUE~d4g32_8mhIkFEZ^y!LoCKOw^&r81@KdK=O$WPejW|<-g2`AZnoHs9Y#TAw(5PyjB8d+k>Ej(LW~+JM-q~pWur3o>`J7exwdUYb8S`amQQO_&$C5 zw4uYTN-KOOv?u;(`)Dc?6`oDd){Q>VyXLz~yI;)Vy;~@5gwv5K?Z>^;9-N*uaYJ6G z#@uLkrxy3s6OvQq`qvDR7JGjBc(clPP95;O+>WD2-{MyRD;kxlJXB6Cn|giIx;^sU z#A!!ao^`b5NKBUT@_>5fG-7}xex|vV@v!qH?XRlR>1qR=SK!Sf;>K(Q4}v=+fVC!& z#khpi&;1VHoR)lh^RxP-*ZMLn!6Ovk%qyg9b9Z9JI4Pg)UD}p8bDb#+-g=ifC7;Kk z*XQ@9>ovcZiFreejyZh#MpnzWgMExEm+9UaZ@ad7{;HdqT*TV$U$^W_F2hN>H_!i? ziQO@c3HNdTrMe5x7A$3BzvK}}5iBTcn>NCiUtjDK@{@lUSv9;(QRR*qb(0)l^CNxQ zw{ShbPEG2ovC{BJeHbaTBA>rr=vVqSr~@Ehi#g&Aia)EdiAd9p94@;Ojqmd z6cIU#b|VkSmyp0{mkAHCyi;S7Y0CetZRB%G?K#rn%k7M?)J?6v!m)ncBHIF^x(dvF zzrB*@{v2KE52nzuPPR7~8@P)rZBP7s(5iCp!@=3H)*bHn{Kkjr#}Fi2815)$sXp!R zda^3Q=S?~JlLa#d{uSe5xMbG|d-{rNNW&A!#PlWN56$sK7D5p1`t~d=Gkz@ zR!$A@5XaPfyz-%rZYEdz0e^ zK_|XcZtoNFK{Vth&!OpoC}rY9J&&fjmcP9%JWeW8#R(kcAG0|$Ms52l`F7&%CakI4 zW^Oq@P+F}VEi)JDQ$K89&#HXE{8yi$3qiHB?aJbeUSV8fqu{SN`u!O+yJ;GM7U;66 zMYm`^J_-inI|G%P&lUW-g>ib`H%+5ogr|(=9m}X*`)%`1kk}JHKP6imXjyMwXuFj^ zRTx;an%5q4w?9nKm|3|s1E3sy;6~)z>dqG0RGyWDndNpA9jh&ypL(cIxkBpXiMjSM z?PlT*ivAFbeB?X?(VMFElen?i9;9THMBn@k*3;J(+YbH*CYqv6_Y>L9P}XZ#3t4ad zt!v;u%Cr<7wQ0!lss53!w{YB;_{Z7%40%&uJcLb4qCD*9vBu3R1^OXIWh)7gSB-am zS(@fcb6KX1Cb}DOVKc-pR9x#Y{J&`X4yY!(ZCeY73W|snr768vA#_A3KSdBo=)G9z z2^}d4Qlv@;se-i7QF;dZV5^$l>R8@!;48QpSjXW$WBO)O0#NV zM5)f_3Bl?WpWMFhsZd=R_QF=X!AlL1@uZAx*FrxQ?I~qIBbAVW-jeAM%(PTpM^}P# zFrGw~06L@l(ev~TZ4K*_i7=po<(5_bWJ*jA$wkjfQm&PJ{dqnIW5q1dOOsFy5pVQDDxzYm;K6i*JjAZ;p@;IZ0qn z3H|m;2&{+w4NBs?%+g9f$HX=GOndq?8lK3!2BVjT%DL*~ z6#rs+nT*q?h42j@C+tQ|yG&@)T$Od?Bbm@}FjVdfIodTQuekhdYu6JNa=6LzlmL!! zzTx}n8E?E~@F#%U}t(wD?4wXfmRP`GiFLH^eZM4fp*! zxu_(PB{~!D&s60B&EBN7DowZx1E?`(ngx8zf$L zWK{5aTHowPW%D|iUj4+<7cV8~+u9^zuEKNIMaZ{#lqhJyfz_bBrCR%q1oWZB$ip9V z?jGi70{iE^q>ErdL-#GFbmMBm{+y|z%(;QXiQ&V&z-8GH2d4a_!1wZ<23~@~?%S;A zjDfjm{!1(x3l@FjX^HT_`cZ5gIi$v!q_)0hT> zqz*CKJU2(}?_Y>ntKga58Sb4f8@>deYZoE99%k&}akEPQe2k*3CezuET2kuYP0Nby zCbyqyW>rb85ApM(c3xjaHTfRe|D5((ovb4R+q0+;VdgsSee8F5d!o*Y+ZTzN1TH8R z=obc(viQRndN^sl_9Uq#kM90j|L$L3&%M3lWU{-?<$ADm(RKFiaeN|rcBCXYJ|zXq za^>t4bME2BHfG$N^#WsJSxnf@xvox(-!}oc5{AVxG5!1g9jce+^BJ> zpTQLyLn@4zqqd!(L>=rTyDsMvz?b^)n3-)`Kms`TK1wlj-L@M!8tz?|-|Apj5b9D8 zC{SdzadeNKUYDct!Gp(3dmHzxr|PeWId3zh_F}pcI4G&9<&2CtfV$k@m*5Agv5`9@ zTy5j)ACkBebJ>%t`x5NN^b^~-E_SC@kq53hmhT52w-QnfBiC@s()GHw#D4lZNUqH1ki{HnOIt$-}k6T zdVgzl`tD+#5>smo-Jy#^7NnU)pmo9CU|qAeQd;@+t|n|p~X^f=0dNAX}rb=+fx(7#vIL_1J{I(`yp<` zg9lKMY25hvz~3CGLT*kg>xHyU(r#Obb$zJ43FK137h za;h%Ux0yg<{tde_>y;&vMKPFCEIK){)Y;N5ikKo5EHsUza;{~EFGKUj+;;oRJ_O~q zi&xRLp|vE4kIick4dhTyC}|#PR3ud}r z{_FU7z)+8-$7VwKY^lS4hHZwz2LQHtMN!23FJK!lca)cTLKiVdoOx=sSKa9_w(yq0 zsdTvC65soGHv1TM_`%?gw2aK>q09-aOZmSOl~E+o_6I*c?S62E%IpyTQ&h&pDy5RZ zy{=HLzpllRQC+)t`?JLD!oyB_Q5cZpPt^5)97eZYs2rE6iZ9Q$Nm@FJ3Hqe zz)q3x?~98Q{UpU3PzGaPlzpvz)U8WrtE9s5#if=6k`OKxV-u65RPm4l*hQ_Q*3Ru_ zUb4*%cu{g1HE9-RWA89n7qSYVATmDH(l9T9IJp?rQZzaL$0nUpG-gvT*NsKcZt^j$ z*uHS$z+2>R;Iz}*kXk{vBccGV=N()~ZDAW}pWkX96EQDv)obgV)m<0mepW;u*W1(? z!@zTW5zjzhuIhOVf z;Mo{D``HdLR`RRuVs3NE59e^8A|=R}rNnj~m&avAPKSzKaIG~R8X)}EornOEABCY^NaL-!%!%ckn{ zNQ5~5u$5R&SZeLeyR|>~Sy+u?^AJZzkkBkA^Fpa9$Lr1Qzgos(_K_v{*h_B(zwcD`s*>7q!9<=qCHtBv*b|dd^z5i5EpnXgyI_YL- zOs4E>^~{h`vnB*5bYf0Y;uV%q#w~(%*NHE@P?=&F7X$~@X=>!jw6Gvwhj~#Wg`g$6 zmqjnZ#95^jq&;P5eA%_g@?t(7UbW)MpUCLc=q{MpU7Te$HvkxiU85BWbwipdMi;5>_M~+!e|<6S%1zRdxgdKEw%cv8f(JEb3vGlAl9l0VH3@vbXvwvt{8JOKgg+~ zOL`ms!Ve#s9lgCUUS=XDw2C-BCA=hK z^>#UHf({dUs{o(5fx{R8i$8;d*`wV{6IEUWb|JNXW&$j5Q|B8j&j|R0UtaQE`Xnso zK)cXKVefT7@1GUGD=y&^vBXiy??#rPG0Z3GMq?IbM%f?`wxMK}Gg11je>9^u_g=c| z9C2I0C9j}Y=|PAd1pHNC;PP#X%Q-JR_L_)iNq0SoGCABPyk1_2lD9KC7-7r`S2dac za_gz;M?P=MOToSl?Ma3Y)~zr3eY$%P(`@bQb$fcI@o6#}ZF}O=0;8 zmH>8C`$MM55u&Wtu$%m5a53u6qme37O%-rv@732gYX-h$$e%xV@!~~(mU4aWfRhui z+hKDYJhg!fsfV>hq_XqE*PqTmvwyiPL{3gIBfR1LD2*xRp{f>fx%HS2*cx<)g-3v+ z2d~fdd)T5`!d@>Ge+Gr@{>7D*i?KiKBKbjV2jlK+lfax`L(Lb?H<&*76HDmdJxiQH z?)+EWK|*mkFcz1>fV3tyqL%`^)mWpAb%eZa-k<%*`wQSgEybY8nOPQi?>o}iHF%yc zYVf*LR3{Y3Am3wRZ;yw;M73kD=0Mp?*>TW-M6Cq}M9QqoUlCHs!4I}AI63Ev9iB;D zr=1A!CD=9FT`vIJ+42?KUBMz`lZ5#~#9W?k{A}5s`8h*S z;_^cXAc_w~MT9jjc1``Nbd98{tEdTma*+Ce+1}=qQuuw2*WQB2{JAH&CMY4njau~n zE1Pj4pyCC&=_Rl>uJB7|JW|q%;$q%#E_*RN+36_Fk8+O;(K?wT1JQ?#M7?KkI`CaRsN#9VBf+Cu9nscS>5g%U@! zt}SnLcbki!K<0Jl65rV{584W*hse*j6;Q-k%iHEX4$C%dgQ?C<LSx-&+UL;s=c|LS6Vp931fqa=mNc z`UTd8(|gd?wccQHzZASDL1HG?fVK~LZ_?7`F1g2;HcmJn7) zu1q%-L#rjhm(0*mygB$$loqBVI7dCWSkdTIe~#Dhee1BsD1vt}Ct>*-Sg(+bi|dDnA{bl3D)?cTMmV*$CV%inuM;Zt zpohb>EZtymu>)Uz(jAJ^NM)H&{~s@)cDP&KQBHF!xV455PYH6g9IP^2(CB0^QXZzdTP6!!v>SLE9(cqjvb_H)xkS(~s;U5B?oJrgT_&30vpkoD}N;{%zcVy)Y z&MVSuNZYyE({P84A9g%BMl?F|>o3#WV9JO(aQNczWf`(<%G`tdq4(~l;2Dfp3t#AT zgoh*b$&_@>%Fu3ZpGN4JT39!o zK(f5SA-ugDiiv^4))fh1qv3hWIh#ky^EOQJVbYSZ{8KzV9s@pwc5c>Q3X5#LfIszu6q@dQ#Pk=2bJFs@|Xp z!J;-2zNgCB=@oGb%{R9yzaXDV-jfuH6`KB3<4pyk#YyHA&({dM2_%1irF<;VB^(ZMcW{F`w!a9m>(v)WQN`6jSaP=%^u+o6!kt zJ%VD9@kZKiebDd^NV~yGD4&!;6*sMB)+}9vr8O8y<6pbNQ>{6k1GeeAuoKkg3zx?4 zFTG83hojF(uLh#`2(}z9%4jgo3E4H&uz9BJY6~qgPo|_T*g=VWB7_e@l z#endCp44B-oWjaxW=vkC-c5T7==!f}F90KB*7H8RE>lT>vM0pY8V&W2g`X7#V&vXawjnY5yb2ZBr1yt`f@-ndECOnQ)P}0fe?#*n z6RSpxCUm9i-SiyDs9dOr zqW2?uzcIFP_?1!Zlnpyd&haIb)5#W$6~tJg#`AkEEU9r5-OMd(^DQ@kze+W0xy&r! zTrMkNyM=FR0@cM)bU!LDT0vR0jtSTn#y>PSMF68fnwOD z3U%?AtjZVd9j>nI?H^=BC46zk^!T#(ZaZnn{^A-BV^}XKh}8`l&KqwB*F^v9n#|dN zd}D6)Xp{c+zK~rv#@&lZ%OQhx1V5UCJjjnesg|pTkACVE)J|@&b|#N;KP%c?FZ844 zmU^DEZ+md!U4?L-{9Z73sTX0=$MPyr^^=!DSuQ~Dt_I_Gc8MBQF2N`c$fJlfBM%LxU;OKy9FN*J3bmRO>DJh=uxGH z$L~r$;mE16+g;HM_MhyjAcPgg#$0K0(Iz!QoWl>ROq<{|#$<*o8udRq+!BMjHZ~(& zeIwU8CB-)%%EnN*h?mwejzyavnyhtt43799eE00;l~no=0(x_XS%(QCs@P-!3@S~5Ma zEme-wB6c+EZ;kr6{HP~cidJ4*LWg_z7=#iKDn%|J(!V%uJyirG>KS{N!J))XD>np| zH2_?mvTTgj8s?_lU^%gaC>> z)g>d$RJ@|uTCF$V=<)h)Phw(W7{#s~JHLD!3qH2<7c?>KMaq>?P3=T!ESQ1E5k@h2 zzp--qJOQ80qxlX#kac0(J!y2LRA_DwN9_0@B-FN|7!R*gJ$h30f+{7gHm&q7f~ZfRJ!;6vbkNX(B5luEG)#Mr{^V6TAI`8&M+F;;Pa58pvM&pQ8~~ zJQ$=XJ3oXIB%CzhL#h6H-fVSsWT8HV{DXu-)hasj;VYej`)|&FQ^XaI|5*Yr@Xie$ zZG}x+dso{VgK_|6|Ni>_3}e@NH@ynXG0d_3HK&#M+``W@IUsQ8Qq)4J!u8*fJ@ndl zD*J^4np(b1^04ltFK^Fm_a^MapV@6hAVu>~>v3)zrzFwt(gg&B#iVFf~Tv_w(YoMjLzZ$nTWiW7KL5y8ASbKCD`bMz5eIw zg1K;{qiAS-y`=H}2{T(uOUpTcrGLLH?YKB^{N%Xwk2t(Dlu1GYO8L*5VV@! z-uEB@Z@-6EVlB2Po}OXh95!6`YglD%fML#91v^Tkxt!mWP{P4P%%P-7ylc%t&y_EBh$sn*jjqFW)$ApIS#zTJ<%%@ReA9V38)W`E{>GjFo5!MR@PInetpoVXYv3V z6A}_`jg(qkOz}E6$Dbe$47Cp>Qx|^xW=YjraD-weC>ofdxTn8zLkzIE&x<-q7!Q!xvb3|^N>9z(j+}= zMuK3dZ_D^^`Mh*j+)@5ZbY4l(odJw&T!-rsMMzmY+#rbx%md;+<;(;s9;uuF!p)1 zm|W8=N3#bpYnqQB%rK(!8@yoF*1l;uXiNEB-`%J4z3f-&rP-Y>DuIT2*|OBhJ;#au@SIMknT#{nq) z{Ka`tQ^CQ0&_Z>6-pR$q2w{By3$q7`o~Ka3iQ1qS;3PvLd# z^O;tWKjC%YAAUtNGBPu`3;B1@I?>@jL2J5*9XnBGw-fxJrzAowv?AUn`(?8`daB`3 zOSSFd2DSrcM7q$Z<6Hz|LQx(AT6uZEw|FBr?2(pyn?;@Om1Xe9R=Wz!;J4$Hx0>+= zA#A|{m!jOO`EL_jp%@N{I(OsHqS8BQlyoE{erL7Vj=o#CfS$Zdj49~jqjplAT@CB6 zbT_`7J)GR67i@>2(6E~>TY~(srKljD9c#R-;*{DtzOJC``5f<=Sb%+hHQ8Yl9-K$p zaR&Q7&Z@J>o9~v5r{2BH;33+Ds7bJOFWFkCQ+FW>J=}^y{ zz3Ug-!9*$^_z3N>*v9ShybmF`k9>^OGAUl;Yv>*}72-F3+$f6JN z`5on)G0ifH`)z<6?DyywmvR%|+}K8mOIw(jdwW%v&r-*Iw0uNHNSYZ2D2*)*z#V#- zU==hZ{E_uAjC$*lBevRAJ3;Y@R}#O$M3iIIM3Lr`m;V^G%E**$xAJ(C8M*#);HOp) zO$O2kx^s*NMaXN!#21h7&I^J|`zB0L4B<@cFyyhyW$?bq{wbbWFpw{3AFvQ(JO=MB zHh-ycjR3H98;LlkC_-*B?u`%81UJ}0+KfV)8Na8feAQQC-b!Z(msJNrPfa#K9`xvz z6jz()Wy|tB*iv3$l>SALJ;fSM!^G3MB`w**?39j#)s(5PxgKx*SXg7(IQTdAn+Q!`2T9ZFYiM_>`DU6ZSu>3olu6bn7deVE8B={5L6EYIB(@J%9 zLM2!HJoKMiw7VHCZP^JP!sTj2MSgOttJj4%&_t!o z0g#mTn;o9{s5hrYe#pn_F|e0v^Mi3~L%tu|7{b*A!z1%Q#U_Lp39_6xDD?!ePxS^T zrlg+yg7H=1M^u55+NkQyW7wZGrG9Mqr><~@b&&?$KS|2vve$uuT{y9Te^do1Fh_ja zLI>l`kJk!@uk7>bcZa4MQvmjkl|0CPvwXEJu$EWdfUzSOZOP{C2L@KqH?>9mtG06cMyDq|JwHyQOUn(Y zw_8c{S5;t$u5*5$*?HDo&0i{fX6yLB1m?z6SHe(k?7AzKvKF4RX_3N? z;#o}EptE}-R;u!(P=07*HP4ydDW!7Qs47mySr(ZhHJG&L7xRdZMU=l69V!q| zy(N{;HR`QhFF&NmR%+D0;m;>>iH9Xu@@?Q9TyZ>iq%bro>d{a~29%A*6V}Lf@5e2G zeYK0p`7}~m9r;2N`iKCsXUcwquy~=C24%}w)h?zcB!ld$61yHjd{5#F0b2Rj0pL=7 z^B5t=Zq6pufn!&qy7G#S*7{*CkjRt4QkE&BKAx#C(+6>?EcP(H*9IluQYWV<-Wm}AVzIGmm1mDR zDsL&bmp6|Qu@C=831;96Dt^^4>0y6v`Sq3d130Kchvid5uK;k)IO;M&>C^dm{3jk3 zKSq{pAXXuPn!`u09iBP3isM zc#n9+l;qcwD={X7bx|uD5nObQA0$-MK7Hz6yx`~4k$7uRZe}hiSBO4*-JflFw?3-) zj;A^(gSa$zz71To1L_*BuKz||(*>vQ>gt{THDJTZ$=wW}J@tQ}#O{|;NNYX%86P+# z7MGW2Ln+RH)eFxJv{5TX%5f5re56YDx8Y#|&Z#Lz3s+Z4KuZ3`UTSLve)t!>0Gs{$ z1upcTK<)1cQZBdw1)yBCIT=!U=u>&ppRhKSTAyt4o&AU)KCWEP5yz#h(qr;`QFPMl z@PeWDF_Ga*n;Y_BNiEaUm)lS*5ood}xlnT$POb>_icMf_SOUEw1$W5o_7WPX_e>Ug zyr{)1i3y0;QS0CJ!1ngDUwBngs2_?-#4Ymp{l;~Jq_~}RVuNs;smprT>`cIqmYEh} z(;t&IfcSj~5E{UCKG~^~uUJw>!mFw{!)R&(mzH$AB7dLbowJ%~vX~2*fWVfpwB7c85_^;K=Kn`hQVnVA|Zrupj)d$Q`s9cRl?F(B+1{cl_-clHsrAGsy z=;{bQwdnR;A#3e$WoBOhCO0a90!5N9B>gP1;OuC;wg zoGQEfe6`wDLL*d%EMpKW!F;4htp<#kBt|Paw{h^KZ*h@pb!;#k@UM>Uw3+H8;J!5v z73cxw<G+5OX;Ni!WEQ#BY9pY4EE&LvA9VauMj3J-IP)Y@EWd~twRCDlExST32H!bAd$-h- za$osnx|jbQA^HuMRs1grQC=j(y2|L<>EnWrfGq~hn3YXIPlgKDSiW3cC=2`dJ*N%# z1-e~b34b~AZFgyz!Mr#t;dEV`n1Bgg`h-0Oyp46pt;eOUtT=RaC--~~-u-;tc`@$C9I;DD?fZo2q8Rri`F^(uH|Z*PLb=`him~RlY|-lmG`Hh+ zW+QD($$C`Xr~&hpnwN(ON9zNYpzGTj+Ev@O%x8>`jqpxz2mzMbAU zqSzxjt(w^aegMhM=7`!Tb`~$~P4n=s$|r>q2W^o2KGFov$1@{c3KMRpyp!xSEo!@r zJ?p}uc?ACU?%!|MmhB07@$FnPO!V4XcZMI{ExZ;o4c*nLT}$~g5Flq??r<3b28Wcw zjoofJEmbl|Xm0$Rtefx7mt2N@DI1dPYkws>F5jx7iy(}` z^kDKa3(xrNIGP-ZHcO)Sz2Ng1Vv~W3*pG3+Mo0(-s@ZZ%C|-&Y=5;N%-L?_R3oWD;*I`i93sLg^+PfzkD2Z6sE&bj(vk!kyWcIR2*-5>XTvnTK zFhXLF+83VR#Kbg@g&w>&`_G0ywHvrWYkyU!bYHyG`MM6rWNb-kWo%6tdNi*c>rjlq z{ti^I1m~)S#CKzD}9*=f@Sxo9i z5A0!+a^}?{ord_MHuC1bc-waDKf$ud4wj4elH603rS-LD3A0=org9TUG<QJuEOQMtpDJAwo~0eP%x!h8s}4QVXAbiDXLYY~bBXVluNA%zz8sSV zsZJ}k1l~Y*SRSSTRwF%!ukmh>GBs>TTX`#IBR;90BlqtJOp(73n1UR*E1xq$rXA}C zRGmFNw{3v=Y)Spju!C8pL9K66asXDh*nqIyBEwYv)Lr_k?1lSS6NnW*_pTGDlzsG| z+tCO$8dL>qVR{=ya;MxfIIMPsa)^Yh?H$5G?*&<|943@oyw@UBNG_5tI*-H^q||A$ zCyZ=P76JjsuT8mM8+8a6FcYUJM%2CC7MbqdFP=n>aHxn~sX-N;TwGDG5`3ZMP5z&v zTIg2g7n1wrq=;HX>TmgH0O1H36@GT0kA^EM_EVf!;$5?65dgY<76692nWr;Cw&b=Z zO}Y;{*jk)zv9tu1(iZ^yH6wW>V7G_xnI zzME0gWi-y$(UlX!t;i2ns=zuSPoavVDe1&ug~0bIjft_Su60kNO5{#qgwY|^k2Zvx zmpc%@CAvq=oh0u_nFHBdZ}66;{Qks_thJ(G5yn zaRKO}B?d2X@=!(_5L#3aS-Fuk<_ZIoXRK9*zRp1rtOQsgjbZsU7T3EdF3;AQEHAsl zPqXM9pl+r5WeTPGaV)ak#Ps7=tpsxPwX&@A*7FdsGmoMAz|q|-n|5)LO9oWc)POG} zra$~T7$;I)tNZTQe}@igJLb>A%9FzxNbOsAEs9zyp=b=c&n|88b(;y;EVHUijt^uz zLLUxh0skV7igk240!umek}?6TEAboaqAQVMLBMrHoM8zxIXK@Tva+!7Bgb$n$&;)V zjrD+5CmjzNkWt`pIBhjCtu1W3E!q|oup)uaEB#AVJT0NNBxf|Q)rvo zx5@MqYJig-qQ>?Pc;oZATZER@DqYlLD{PuCM;29EV*&mz0$3gIk=P z4hg{*2b6ID1k*z7btAR%hZ(Cu2jyEc zZqsKFFL&(4#gsj{P(O*1hw?P1aF}3aLK(5#scZjDnvj4Ij!#H!TFV{R*4BT6`Eq*g zbu9F%gn`6J=?g-TRD1&&H5JbpTI)NQjcW+v5kC~U9mbff0+gl1+Vu?zoj-r_HvYv= zm_DXQNQie7^d~6B5t9E159`iWbAyb#L|abMNCvz=Jn^v@JsQ;gjS8>g?vWO^UVKtg z%h#_?wa35kYflbt*Zvy28%8Y>(9}c%jB)gF9BJyg?a1FC`x;KwFi<*rfm@%lb*VqD zr1)J+Px3J!DCvMeIQ)A}1=xQ2%UhEqagjHU?%dyuuKxBa{&sD}pvm9>BCk&*w6+jW z1+)aveVMEq|2jPE2V951uZRyi@tji?FQIdA(4iJ{Ch710bj0|lwD(M6C+f1!{`BcQ zeDUi!(2FJzl%{iYZxdY$on0LzQC6O4Zf+JYw;p|k1JlaP;TqZg?|K*ZYyPA;?Qx@o zEs<+_q=Zn|aZ%cOq?i^UKb%1l8y7ykw?QcE>5f-ai@1O*0)$dwfLN4NRbuBZx54|y zFJEl5W0?{^ipDBtzEjLJkI&(DTUgN*eKtJiIvgatRZZSY2h3@7xNG_^D}=ERd%V?d z3(+P}RT!4x3YR(steA)@_)06&c*MA3)N#?gwxu*}zpi9qnWPueNW3C2P?O@{1%i$6 z3Wo3_)=icFc@VtS)>Wjd#^t&&sOw>SgGBHG4!HdbM#PyD*^9$YKWtOd2=9B>BMVbc z{pmR&A>PWRb(J>E3WBi!;7N_9ER9&nhFO%MG(v?Jtp0%;@mnV@ssa4@ZEVa3Q5Aw1 zeW*lO?Bxl;ail{-&XA&-8p4$!r*!@DcOB;7KS7959}69rcWas-& zs=NenQdzm?f?77Yjb_GV8)=N~QMGH`RZ(I#C>zL+}E_k)#bJElE0Cs z!}{NP6Y~xSFZ?j803zS}MViYyMWI;^^k*X9WjO8Q1=)FgY@5Yc{fkLULaNkdVMix( z{h_>=G%s`gdH)zN*T%s+?(--=@r)`JHsk$=@Rj7-G7hN6{JXeEpEK?;K1jhZnovqL zNi_1bpBz5+&S|cm#ZteO5z>?NC6_d2xX@DV;b8U)Kz$2CZD6E8q`Q!pT6hh}jpjR! zd8HTLq*`mO5Bng)Ezk656uTPO98+dzenF%gdbNC#T@wRAF#W*1HkN)n4#pZL-e_M6?mH@=C2&2Hzd z_yTu}5wNghCI1@>d%Y7zj1nD=5vY+0oh&!hvF`E33LgRGYy#UT&wU$w8V!I4U(~-yNfl4g?af&2RUOt$ z!bCdS;Dr*L-{+z6^&MRNbO#3r zWuOvgNObc$Ff(qd(7I*ca6^yjgehq7Iv;i=-pa~RGo zjCRL@%+0^CJR*s4lhVvTrCjAHhf)}B`jqKPQy5EI3<3|x4pI}PhZC<7?%&Phlcd32 z*>7X!h)L7XRDvwjA2KqxaFOo?boDAH`r#zo-De9S<$y1BWD8xX;+x=}l6$Q(eMQ&00H5d(2 zrstH`r@qk3aw~f`uzzR!PFj#)R2pViipOUYc@M}D&RV`$?oVi4`Af?enY>_-rHJb{ z7LKqA%icE@=&d2j~!RwM#g9k9X|=o@v{>X{lskyR^}9A7bpzcUOUUGfATb-Miu<0xe6t3xfRAGx73FzjHYl*FU(i@K8ky6?_Po+KkR9Eb?(A z7Ep(lUN`=GLFjR@>y6QX!uqan*g>CFNd9RWqF+c{+D+O*4ZqAnJqvw>WA{rpVJB$S zqV!)vravc+f0{7V9Q_Z3A-y6k82P!;988t=arOMu(SRHEL^L|vjF7!tf?Q%((sSGA zxID>nc@?XA3z#a$OHAT0$G|-)1JAMT#16j;Ts9aPjxml0?#VJ7zjTMH8ZzCpBj##0 z$3>ke@|N_Iuds+%VAH4orE+TPXu_6oT>Y!9ehR+(5^rXfNJ5m2nqoTgD3hzhzICin zCQ`TTCBs9E?mWWAhNkq;Vr9ih)VTJ%Ic>`fU+%G82x9LPLARc#PakZ>?TgOqr|;eu zPr64-inJ9|DUEaA^x`Fj-Y#J@;zjuUMoC|ErM_>Pou=l`rg$foC_Q6+sdY;vntRT~ zfU}vF{R6-C2N#5dWGVKd@aKgqj?T_^47Q)}x?wWLSd)?j2IZ`x{sCo}Qx2Szc|ZSk zC*?+4@EPFw_ch+lzc2D|+5x zT88^5dF-_`_z=)izOvE!I#@>ga(5D-Bw|d$ zGs!mwHNR%ErH*f}PgF4^g8nApmHq}0O_~#{tDFF^`3OAgnMrvmg!wtM`ytN?2wg5* z#U}&;)vc}D`c(*03ZAfgiClmQy_?#L&iV}(S?_^|m&|Er8FnY>-=OOA8*3EbMhp;GhR)(9h|h;!f+eCk>$CH7dxj4;dLW#D`)iVDzb^WxeX&En$XgTA6<59u)Ow<22&x8GZ5?KHO^u{yQ1|56@{smj_pGOw%L zX^Ee|XUd&`spaNNAm~rxJz0QqZMMXhlVnb@RxvA&1&%!%IO0_s=j|?XP8u8t*Ja@} z3S(l`Vp2(#`(xK45TxooC77w9rlsMnPBxUTX?JFV7jjy% zGjH99CH*xa{U8jO&Gt{&Rg6I6Li z++-hg{L|mubnLB?8wAH_SGy09FzTSDxct5=LEzcX7P=Gr!IO?gD7#-GBzt2%@tHlg zQ<$9M6V4e4?#tNt_}9rv|MK$8Q|?xPSo#3Jp2k;Mc&L=9pz|b5if8pPy{$w?D$jUG zUtvClCM4g;+mpTl+J5bc_P#Fp!U(iCFHOjt`{8D0j@dQ>hKYt2Q6Wot)!K5F1)kGp z%&*AYW-y&^v7ZF>{ammFakbf7FWMWU|Bp%xy|wPz>CO54A1?cuzh3kkBiG7j{Q3nB5xKsVy>vAHrd z87zw2rgMj~G-eYXpael2`=v?>^@bm-s~~`SUfgv9+}| zjQol^TO*wP`HL6Q&z=#SYb@sgWae`_J6WrhzS##>R+esXvWQ}mce+1!8NHjf$+SrX8VguW-R#yU0rqbcpuBXpS4W-u))E69_-^|R7cM2Lsbk)b{m>=HQb$%*dw3^w4G(TC zBFw3f)Og#;AJd#I{)!seI6>|5O5rTe(GGJbWt|&;x2j?^Utw&HSx6+E)1;NB;qa$o zOl;8=r2cK9~>OxHfPYTnQ2C50*TzP>`%gmP7fz1m?ZrnqKS)FFs;iJcu<< z{jIV-2r07Nuk)ErjM2E zOR&HR_dCV1^ddWna@+5L1$sXK ztxb6H%Wd6=`i~D~f-!pyrqkYPe4f%^^$2^0qj$h~vY(!hWa-%0!$h984t!R*1#fH6 zRSycTcE9tiE)4y~yLR$aUZkSAN28%w-=Lv-;qk4!(Ta~&8aqkRhlZT_`jMW?2iFo= zG?;q{qLNsFvyq*gId@|*2lR!K7H5e{DSDdm-VCOkJxNPwN3GUo_I_a@HKTYKA9ru0 zU$V2c4D(AxVTQ_HbWX`@i>ZNCUu~(uN_6ivV3Gyg+&Au5fr-ZK$7CHP6;;d6pT(So zuWwn8zqS!8<|HUL03`i6{g3KgK;Es+W~YRU#5Oi3_-|Ytd6cuDJi18A`*0Xh5QVh@ znJ+!}u7tGRQ{Yg{!W225Sg~d5>=<1!oI(&GtMcVJ`0NneNRjN8&SU6tjwvm!QJ^@G zb4(QB!|0IlVO>rui_K3YhmZ?T={_Ak}7HTNQd8Ct+B_Fv}j_*+6?q+3sPr z(9AmsTSgx8%&9apSSuqiAL8y_{JXXI9ya>9_gxLk+AzLw_IV0Tl{`?me7wH+Eu+%w zSoGKGs4rOjS0_mrU5cBUg!CR%S@ZCaL#M0PH;GBO>lDgAb9xp4}I#7HnG z2aoETOY_Ju^Mt5n67lf*w#DF`3M->-$rhkeZ)xd|3}Px*;L0XGZPxB7`#evSm)jji zKc~$77>-^Qu$>C!T*l;@s`oOoT>V~^AN=wNbvrf@4|l@eUXDec3cV%_8r>!ASvPk| z0^PyM?Y5V=?l>*@aof@_k1Q()qG$~@Iab_kyAz?6Z z$vmc(IJkt9Mok@mpKAK>DB$b&?_7y_Vw1tywUzpBA<=gcoCvF1C;LVCMF#zlj*o4m zWm9F!PKL-Zy_6P&l20McXxzl2UGBW>j_Z)vcL$yNc~YisZ{J1l^>z>?v53@VJ&6YA zWy6)Zmmen5e{R;94b@%Ju(5xgcBNow_FQc0h=zvC*Kgl^3iKf9D=C^#QNrgoTlMO^ zuTxKtiui;4JFLIM(2bByMvK zxnm14Q;G(cU5~%eJo_Y&T)`Ti-O-w+(4(l`aiUdPROyqVibQc*o>*$Hovg^#iPM&) zixQ|2plAk)Y`YXLyW6URW|GoTA`bIiNUrPWK;yh{OhJVq3R1t}baa$0g<4GJV0Gq7 z2ahLMP@yHS=!7!1?3Jq5CT8yoi`TUpmmh_e|A)Qzj%w;#*M+H~0%AcxX)0Bvh$tNb zHbf9aK#&#@0i_yx4@E>lKtVu6snUXU=_Lq4=%920gx*65B|t**&A`6Dz0cm~?D2i) z-apPA<69$Rk;clLbItP3_kG^yd6zD}U^cBH9&YAx;sFM#ADtR<`^45nZfHENG|#%# znUsB=5Iz)ZJ*-m4Bl*U?XKn7&M(F#i$o#E<@Shtn=F51UFqO2vS?8{T-inptb8{T^ z9T%fNPKbZaR=a*|L^ipFIdZB1G1L{-4YfR}ZvC!npMir!f?rR-C8ahy{kh<;-iH3cF-SnB`yjJwaC1$H6UuN*Yl{uMc(ePv>cK11*{ZJ zHB(Bx!1nswMa!a)e+l%Vmq4q9*s($^1@3&9hNjjS3bS*Ow4ep|*N2mwG&DzVU9teT zhGooW#fz81e-{(8D|@?|{m}^H_rx}4PwgmiT)NLK0kmd?kMOQ?o%md#j|Y>PPjdxn z*UV)vfTyU;?(^YA{SMVnNn5(I#e%4@u$$6{;sCooXrvrHj9MwD)M&n=aJY%;j7NC| zs>n36k?YosY8GcO`KiM9yk5`n#ocI&gv_1n^DR}`bKwPj5x0-a9+OQl)ZS!wUb?FP zu-NK?ef2qjO-8Q{eQc}(V zSwk-ytgG0gbS2bcQ$tmg&t|ByN2K&&;}4&``Kin$aDhHr@A7wS($(lBZ@tHnotGgd zUI_OtuDJ;_;%2~5=55R+wG#TkEx=BMQ0V>A1Te|VR*vCuQ@@g}wOqWj?_cK`kx6Zg zN&!$}kbkOM(EIJI)<=(?Y2Z0$?Mbv&=vA84wew7AR0P)QuvT>H+0=R1BH&BqHt{Wn z^%i(I!`>9;D}Y3O%}wCI`C(0|qs!tWF847-ccQ=IKyd-5N!Hbe_P5g;Pi{O-JEe=d z%-Eu$4A@_vDFRy~{QXsq5?=oA;kNR^{hj>!C6`ODT!q{lxl*VYC3Sy2ph+qFg-*$d zo<|Sj!e4L$$ToLeb}P%Jb;rR-dLrlv%_325>e%ua{&Di%WS+zwrVv+HY) zC{MR#*T(UlgL@u#AWiU-meAtk@^F$1aVHVZO`b*)FBT4pK&jqjUR=8n{pQW*`vYDe ziJ3z0ZK#c0mq&)Nz_(Y%XnEavm56Sm!FcilgT&4#{8enYVn810nGk7XiSI6QQEfkK zua;pnn8ka{$DK?_Y|K#FR0D*eCQ|xN-fQPCOxT=1aiTW?Z(5I!?~Qhh<@Nvfc<23n z`2|DCeiAU*X^#Q05VA}_eaEY};qdW`#0YZi&FwIx7Zo?!bwbDrw>^n0dxs?c78ov< zyd3|xf+0ZCB>z%d+(qJiY2Mh>tuw(&RgB~*{Bk{p5bew5?Itu@Tz)#fk2b!7duizT zWV6pj;$FnY7%zOrw`#VUWuiB`mea0#EYh!hy>BiRf2Zbsqaqe$FMqh;i|uzE@2kk! z))L43LZie5c2^7!0NN+$$7xh%l{63*Nit4oB!#)HHuo*#M>6C)+U z%ARjvd@KEvN_yFwpgJ11qoGZ#v#T%RC*n(a>z`>|uEDRzfBIA=TG@@myhBKZXm%tI zA9SL#z!8toy)@{KZI_q1t{A*bI=^JV@T0^Q)tC_cyWa;gWVqswEva`zzb`WW#?JOY z*q~`vRODG<6PxYF?@}T&A)h**X^ZKtuBP)0n4n<3H38(^{+kBIZB6#(t5kG_k#^aCH&&(rk(~q{Dt=LxJkYM#>XvdQRaXu21u1Fcs|+I#pEa| zYY;8AR8H2HFsT8gchstae#zIaNI8setRB})kPVlQk~A<7HuIGVp5LIk@ug!7sy?*`G>cpzo%|`SxaW0>#Bxov&n61P|K*ny$Qo;fqJ9PiXW}dj#L-X?k zpX%zcQ|Gu1l<--^GdRx&YvT?iU0+T$op{WumNhjtG;m=^+BM}O_UGo}Z0V zZL?8r0s3Oq^$I`oZeRR16ux$}hP(@%Bsf%stW=X2z45(?6P@tgQ^bZ&-+)9eA6lJh z&7@RD6TGdejTeKZm3>m0#j#V}9vYfy7WlVOkXj+~h1?Le3a-K2OAIMBV*TH^BLF}t zqSc81J(gkfjD_)4X<_J0mZJ*{ViIm^6dmY?x|$h|;s;qV;E3#fz(^-vwMvuVF>}Uy zULE>J?4&o=23j9mvmv0c-X`fj9>o3(#veZU)HB!57RIVC?#qrM?RtFi+=Ku8wT%|m zH-6Sqt6Re?y2miS1qn#bQu|Wraw-FrJ26%4RQ7WHYHqvclRm>+7o%_6NOz4OkF0o( zy;$-bQ`@jb2k8d9CO2^gjlg?CIjpmj*$x8{x79!D;xE{bfHYW!1&jZtkLy@vbe^+lfA!w$#D z2YSO;`|s3*m74A#&8!zhzObEhNPF-C^DdZ$tmKQ8ga;rAEF{{|^#LLOaGIeC|E0#Wd=<_t?0cX#VlCa?O_;gC-HV%qw@SR`v#b zF@ys9o8pH3mCub5Z!CJU8|c^hu=q0Z5_*tzqlAQC#lLxtg@5$sg95dDOjP9cdmVO^me8wJ>gUmR|Ek?C3No>@$$;FGanYX0e=_kyyXP)k_4YDt!j{5zyW)NUc9+q0N$Qzm8j399+}nLyQ!w0ViU6*bj+ z!YIHi436gKP4qNxZU^+6dWo)qCVg&4Ut+g#Lmz#|d8;J3xb^m;9D9}v+ZJT?%rG1S z4=m~Vb0ffwcdA0!%Zpvkt3NfTGN2@vRm#?voyTXJ_i2AjwL$Eqam(HN#uYn!!*P(n z=4Q1Y^0%Gca-v2!-xl6IuAeic_W^YZf5@e{cM;Z8&#`}BpSxUJqM`NYeGK_Ec?|H`T6i#2aa(q2)LGn9-mgY8sr1ww)?if5 zpLwxjwKgHbtiJ<4@sr@othG!QT^jwt9rWk4^N(lw4*j$P1$GRs_TE&CrRi(ASd)Q@ zVyG+c+p06!cOvcdvU%(Uqdo;EP2NrM`ReH@vcI4_cezfaQ4uXJDVeD8BIE-k5PC#t zb!=4V<;xWnTkN3U{YAt40>*(d`xli~+%L8I|G=f4OU6d_SSEF}h{)C7!Q=?{&KT+q zH@8|B2lLL?VcV)&}ER@+o`AT zsNu7tPC^+UwEKs=Ad|LqU37g~B|HLngtQ)L=FI4B3E&S3ISs7AdzG#ufheAVS2gp5 ze7AKagJnBgQ!8^P>HKna+r^j?QZ8%BhO^m9BO$-Yic!j~`01qF*dCszF(Hg|wW~zY z{Rdg?-LcWStpqL}pJ%*aU-hj2L(qt~hjc7S^kU&inO&AGEmug?fYo+96GowAZY*(mV zH>l7)=n|eMUMo0wzqmsUu9~xAHFuO%ZhQ<4DSH#gX|-yU=*|ROzPHuYud+lhi2t;& z#iQ;|RB-*WHBybu3lSQ0c%S6!?7Y+47}%H+Y97s_zHj{@AkD)rQssc?VlpamfZFQ& z;di5&D*9$@Wa#G5M|8B<%Mu$h2R$o@f18)M5R2p8QT zfZTcQ11m(>16XrSsS%?Qoy3u^GMl?+h^xVT&kI@xijxEGD~1{%#ll1v83zU@pL8B# zuk^fBR?0Ha&9Jmg>$*v0)K5D}X{qQtDeX&dRBAts$~&-fGH1$^ z-@gZunv8_AwQzFf%1>--?3yZkL)snNB%`U3*x1QNJ_#}0?sVrP%yP6L-zAC@*^NcW z*Z+uGjhBc%v91Be_`FQb#)|3Bd1j*jMTzpiRLnp$2}jB2u=_c>jSIS&*s!>;2#aL zoBQm`ZkcC!#b^Df>#)u*2j2;p!p_twKqkY<&X9RNOX&niE~eZ{Yv+H(1yO-TqoLq{ zb3g_6FpCv9{@%iIly=^m6k6kCS*hLA;l5j4cuWT~SKAA*Z^$7J1ZKkx8>3fDQP@-P zz^^0b+rh{kdj$f-`z&%d8ySE_mjVK#&o_E77Z0jCG%j@5y2-@^NG`OsgO;*pb6O7- zW(@&xJm3;_c5`_;*=TBuE}`d?w!fvS%D{eTf9e8^P7sx@DNrb|*5?DsO9j&Q&F!Y( z#Kt`MME!P;5F`WxJg7fam2ke`qtt-{a|V#-hXSGY{loBj72g30_Mfg4+4ZC25GB5;ZzNe@ z3lDtMCS)lWp-{$j(HTN^wbt0l|rNblwafAWN3@rj&Q z#f~-2v%$l{a)u;b_6U zqfIg!dso$3vf(=PRLxO$7FEd?NlOu= z#FaOq&m2FsPQj*UmgFZ!7KdQu@cVPNHuX#1fTbv7jn{Pd*q6k;HF+Fj9C7V)Bj|C?SA#p6Xxz$Si{f5s8V&}k&Qymzt-t>(U!kZTn0`Xvd#kxATms0OHa=8(%UY8$ z-BkS4p|IA}R*4t9)DdZ_dZ^Sz`4<&V6n^rUfAufKz^%mgnXEu({d7-&5x&{CQ;9aR zQiZ{sPfizZhTHi{MCil{u1d4#PX1|s!FsvbL?F!@!|kR&?^T9i)Ok}Npw^pyiR~6h zjadZ3aBITOb|4k7xJU*ocu#gmaQhvC%<~w9A2!~3QsOJWTZXLo-`_B zEt{Zw4-+vTl<}q18m*#i1k>v-`ObN(Bx@0vW38b#w^#yE=Q=nhdVa4Zz)8&1>tB0h zGftLbKe~%~NYMTGyV)z=QqC=~NI6m?Jc6CZU&`W<&E^ zR*39O&PH4$#wO2-bKf%xKHQa1?Zx$F7iXeQIP=`wkNtdbdf~|wnd{&HX@T_wkazef7`z@PFvg#N zt}0==TZH@-L0Uk$l_GtoGoIV2?fn@@QGioXy||=yOGOt1COg+kWFQYXHdA6hcUwcZ zgVz!(ae~i96Z*B;j!XdJl}kAHv(vDw*vZUbi5^<=r1nbQV=!2YYe7R!5tkw`1=Pw7 z^!F?X-0@=4$9D8%qbmk%e=y2A@VKB2ry%0bE#kgN;<%#XkC-Ibs@rR4Eg(8B4@L|} zvd&(=`=3~dS6(=pJ-H6V(9=iv!tK4SBRiYQvM&N@6V#z()~^}36G zNY$G52whIl3I ziS{}sE0+N2wz}O-C=&uGq(B9PRr@2L0}T~oVnHLn5Kq$)FXX@5bM-29_@L4X00%4gwL^5j6jhua*`Xs}`2N{j_;$lI&{>1P;#HHm8)J^6Q`AfV6ejIiOX|z@ zZW<&d4RbT%j@bU{u{;67HBGbXmvKjEvW6JN$w7$=G+p29^nCObJ+znY0A^MX0&8+j z0VY>?CN@)-()okbAc(b3O0H_!VdphKrf*PtAlFSGeTQwdGb$M`PL-F6i+4uyn2_ZP zMS-b38`{>dJ>60=8EF?B)^O{j-7h^X0SH5A^MM~f_0o3>CF8csA!fqmje6AXaO_s} z#%+UvAd?5>V#jXB4TFEB4^t5khO+OAC}>ltuJ?$tg3^b~>;xsOv>j5a6v*2yfV>{) znoacn2{Y>zs618FG%SWCa9U{1-FNp=f!Xm*Qk-LC%y)!2-a z*Lgq76~gn3qZdEy2)Y1>i;D*c9& zaTWmgfV#$VVu*#3)QZ@Z2m@1(w!+^%tNZKg@0O6=ULLTr8J^kyB;~U@4#f-#oGEp% z>Rt{(o&f_{H}T-*brkO@;DAKH|LHpW`_;evxBtCWyr*%=_ylCTnS+Gw4_5{@^y* z99%kCo4YBKZ_b_Ijlbi)n&mUFKA_?~85ZxpCLUf_VmC5;q%XFzKkoegOSogqKL(vWFuAQk*hJ6JAb&M< zoh@Y1>jQVi8_e#&vF|ID3_d>iq{_-uCME!0_WY)*>SYRqO1vbt(q)sfIVDG>K^paJ2p~ zcR(rlE_U<&s@cPjhe>OW<&hR#+B(FVoS%3kC#9yIUaY8C1Jd$iYgminGVFw_hme@b z*$?x;=V#5aRp1lH`B8k`xx7$B7}^-^KCY_B;188|+mF7Oj~R39 z*_@o#g=6iU-P|ZT3MWC(HCW<$rJn<7kY!bsJTJe!jAmb3=!}?{X}?I(mKzx{`SjI9 z*~;ix(8DwH57}qfuNE?juFP~H&yT(ChuY)nUz2=HxV3sp6ti?MU4zDC;T9hc3~vWb zFU)AiYV8;783GjSc>di7p}?7xKg?Eky4J;3CVVfPvkb^xj7!5eUo44Pz8@*(^cp1` z_FdHBt#jDxQw2AS768vwfpkHED3x*nlR@7fGAgZ7mWkqgn_{l`R`G(lRR>TGAU`yl zhsi}~uOD>!fNR4v)U2U&NW2$PKMMTj+=^p`Ec zOd$qJVpX9(T}nfh4}hi7CY4>jV^n=EKlr9Ack*zs~nQhUaH%XtQTf=dTD6*BvFPsBaNQB zQ-LpgUsD03V7*CRXNSE&FqoipQEP{5kKj@Rg{?144iSqT?V(>^6PJ(k~QDGqrsY(QEto@9TL_pWdF3rhTVQv-YjuPPHAsG0y!yt6fuo7V>Xg`zm|`5)bHN1elI=c z2+{bm^B|i3tz3l44uWHU;h|6|@Q*o>$Ef7Qc^eK(ov(z+n|9habWI;INW1VJ@dV(E zbaZrpYx!PUKys-5YGbGB6--}nfeU(VmzR8=MCd#=_Esq2{e9F0hX-jN$63aj<0taH zg>eCnlZbSzjEjQcdUCv1+)D4;&v~Z=fG!v~?gC}oBcOw$kh?@BWB4?4Rb(~$A`hI- zwSXZICG>Ku=e}{dH>bWBrg2A78a9Dl6h6J%RSbuaEMc5Aq)zg2@|-!FFWwE#o|BVP zI6t5ZH*uw{sW-J#&_rv4roA4}m~=VxWQ1G~~@-7>zoJhCilg`9tiyp*_?*wx+5 z7vFQV;_XKFvuPg*g!8F~5-8?41)`$v2I;49**K9f%VhZLI7*`@+r+r1wHzAqj4f*KnK`Ny(Rt zhlIk35pV|N8YeQGfye#aZ+MPh&vvTML7{-tOZmP(1|_sVjE+)-G!1a7g#9k?<}S$O zKls|M{~)M(U=RI6?lah*%uH5@0d3V>lghWeqxDA{8^aU<4uSXQ78ZZ*YeGYBwz-Ul zy>@Ag*(WiD^kioe_Yz?^B{e{09wjodfK#{k?1a^i4fZ;fK4!0JfIb z@2LH7SrC*s!8+=_eholF>I%$f*ZPdCUIN`BAlI6boy`qYnQqD{1`iJY)1^8(jwx(( z?KN4>j?1v+LXmH!M`Z$cc06o{dcstBM?wjJTiZ$ql!Dn9>3b?P^s()rBTGev9KdTc zOc#pAANagd4%Gq39|d0yK;19}ToaY47nTl`hU;D$&7nhEW7R7@hY5I0L@+N;ZED2w zO*c0oF=#?9AT0)b!N0q^gS=~~(BUP@AnTfvcr9}>kGZ@3hbc!KZ(1(@qJDP_>YKd* zv{2!>)WS#|uzAzd#S6fQ!H_ z;>M4ZvIEX+2yW-3ppcarnhjWYK#NsX3Htti?&IEJ@6Ubf`0k0U!Mj@p&YDz6ZXqE?LCt#}M3`^~~f!+ApLKX<30;R2d z5l)acU_ETp%xT^464nynNc1q1eh*vpm@Z71iVhxWdmWt(f_FUe*6X;sxuIwamB{C` z60;%u{WXRHPqZ88a&vMnlxCiuY|8XNQT3`zI}WpPr#$YRW07s- z;*p9IG147oMCm?~fi9xp)!Xg}-TR!{f4kf$$g{YA&xO`~@zGh($!_ZFUtTWHUY6;mT@X&iDkJT$C9~^06Hr!rSPhp1W$?rD;EAZyg zQGx1#3#kZ72D>4>7yvvvz^1>Eq7&R6PxzQ9mHE2LEZmXy(?=QUMD6Ve_03ox$cRDR z!f(uk@qS0v1Lin0!rPoF6ta87-e(d0X=fRKWp5V#wi!YYvm{Rt%GRwgKQ|J|0+bhS zr9mruR5_^dC-`kWTLm}|BZPFOgS>;!x3lJo&zTS(DSLFYzt38f_0!Q^b+-p`K!iT8 zSlH>TGuM8hdj^1?!0#$bYrJute6m}dbmAe(*T1D8v0jmM>7fub&}qZ!x$KVI@MK<{ z>~2wIycbbVLB@$*D@LfmWrM4N0aF{iKIuL;uqaF#=jGd*!PEk2V!daic)b^OWmHDB9eQN*8r%M;M?k=!S1v+n{#0RG*wT5MN2Gh+4^Q&PKvs+7 z3-`qK8}T|1#o2%xaP(U=NCwknyuZ202 z_^RIUj5I3}e&BUxeGP6w<{LIvwxZ0oXMRB^^B;uQw8#35dpvPJaXaJm&e4;PxeONj zS~9p4(nD#DH4bKf%1=Hm4SE_+KV^50-P}l+HkRE#l<{TgMOHa(*2--1p1)_&S?Pv~ zprCJ!6Al?eCHp-(vmA73>eF(ftcD`Gj#BRnQtak0ycD1{zDU);I(+oO^CImz+wb%= zBVnG#xF~u@C<&SPT_@+;kVLYaX2d+~Z{z)h9#|)sn_Q`~b>D6s33x|8+)UelwbqVN zm^PEjK8?QQYXG*%G-VxgIJd7oX-VE1ihwO9&5K*P#)ZiVVGqk#x*k-#|SUK8s#3iY z9-}Vi0&6v`n-*C{Xz?;#PIn4S*-*1a`tiq2rX-Y(t z?c*iCNiq11Bs&iyQ`XFHen+V?PG|lQ+k?N0zZS*$qCD*SG#^qy0H3GYaw_kY+>D)Ziu zu|m!kPvR4d)!zzKPuP@eav`bWN;u6i5wk5vJu)lY_bk$;B`e+P^p%zCDg;-aLihXalo2$m3 zSb`8Q50INCDJtBCMp1;{H}+?N6wB3rC0VP5o!l;+i={-uKrk^f-ug#ZuKUmhyMQ-B?YnP&fIE?fX)&--n5;vZ}! z&^f$~`-AL&=58zSAcBW5E6}OqY=x*E032@J2N%5m&A8->tZZ;{@}fHd%jmwhDd~Y1caKB z9B0oq3>NVL%v?}VkcaJHAvJ|&CQgGVLzDS@V&}Tsk^KSl<})4p;j_k405E0F{&KD> za3J3dBvCSHe&J|r73clAHp%{ScjK_B$21*<9*0x9vB1|y2#|`Z7*|~LfBP1lFQP6r z=nTSyfQ+8$pqE}}1--Ov5*3{9Ll9gV_#FX6hb66YpS*m@;p3AtfP`}%1D+~c+Dae? z5)>sQJ`Oxs1LaPPQua#?V`CQ2iUxnxScC387x_u@?`DrZ$6$h5<<hbqJ;A}k);ZJ#T~fDBgJiN7oZ7o#kv0H9p6PR^o#j+9b2srD3N$wBD=N6PElrwAXrpzL)tDzB@uQ2j0@(`>HC?h5WyZ~;gaMM060HU6~g zm!8C_baP!mK>#yq72q*u`;&XZv;SAJvpFvth zq2XK4cN?ul=_ly{_Wbud*6G#& zevkO2#gJPTF)5LDeW`cOq%OlYP{ar`kOGTv4Y<_~=0n35l)JLer95hK&Y)skA4)8< zr_WskF6EE+1O~Piyo;4hKgOGWZ>>r)j%WiJv+r!t-!xeZvER_rCuURRj)L?Y#>Ip5 z9FZ1TekYe5(p4arG5LGCNlI7t@SOY`2uhEbHmc68>EAcw1!+ZAUV8{94ANCC-e*Y@J@OyfgYp?zG4ewpQ~80PQeD6@LmO$qckiWBDPX2Fn9gV=Jug>=^)8CHxOj}MloSb zjJX;UjeU+l5{MU-e76JhjqH9nmrRhb_=(k86=%Gwd53AO?!~a?iH#8~X`~YN62mu# z#on~Bx~#O*rV1M@f1MWr=R|d9Jb4_m)beQ|MSkgqQ1rc#z3fopVkpA?qcL1VUn_EQ z4JAOPFL?1)c;X$rI8)4i@x_--Ik8iuHBU0{^zc!6t-U%&m%W7qY3-hhm0oY6p1FQQ zU61DyLL%$w@!1LM4m-XFAlnSML_dD)K|3I^G_`Yc!c=3Y61QLdr=k|DV@A?7fdxbv zr6NN2oZVt{L!)sSV4#?&JcU6u{yF6Bigz$ypJ_*K5a{Jdp&TAC4(Hz-x`zTCA$s;* zWxBd{bbvSqs8skOi~+Ib0*Iv6UqPj|Y)0q^*`v*LUFsV7(E7#NqTNz~xBwnSz{WRg`u3rVnc+erD6+xA+(KQF&nXqVZIn=}i-j4AA1z^a z^^V>d)@euR(aZgB4aJ3_(xqk=z}-mx*MK=tXDlw~-J4UT+K-s0os_$T1BRP%|M*?gkHyLG+5q|i_Kq0KT6U-LFFoz*`{oV>!V!&=M(e`vg>kMZPk zQw+bT(e>$mCuO2`(n)Ad-{glQ)1M{62)RNPs0Zx$?FdB?=_3dwT?z7JvR6mmCdyVI zYsTO-aQ)nS*y>M9A*rTb8ZJL2@3#DL`o|$zdd@*_9>5Lr{j@`?!DHiA6V&vQ-V{#O zpxp6W12y?J5J1aopnocgPM>NhSJ4Qmf<0DeA1-z`ZH_Os9zrx)Z#-t1D(7%j+MT^9 z;#Qp5m=*%;0PVfiKHBXgAe1`=a_;D-zAE4}&*Omp14pOU*u$BlfF~8GFKQ~4N96Ih zS3ZehAI$bqxrDk1!*7mN3n1-??WJieAW`CDS1{k(;*8J3n$dx&TCIqCg0t>?h1rzhR->+^*$(0=FC90@yGOVB+v7`QS<#{ z{_aMvRTpJ?6QIm*P5&*C#OU1HM0P7gr~o96)0tYpp+|%8=3dEHXTpOG|5xHX76cqe z-TqFbeqonh(GrHfcA_uuOT-lwY?h<-{qUch!S+m7r5Dyf6^-s=M%S7>@D65x!c&n4 zcv$SYNFGNQZHhbWOpt|br>?`V-`bz=_<^0LGWfqEZNaV*iD2%fuK-k_{3hXIJVDl9 zcuW*R3`-p@JZCbS=wn8(>psfKF9~eX4Z!Jv9Pd0LAVio@aY_meUh8MHPG$4qt5fI= zv0hR^RT%0{{tlD0R=7yvq@l1R7~My#^?33Cs}!u*N&lZ&K#i;Dde?ws=JZ$#rsHgW&s!2 z0ZnWD4@}DLI8MXn7J-my^*4@Q)w=ESe1bDAB;p1#~-I@E0ibDdG>NE06;Zro-*NSU0w(&u^MQTQo5DsN?uupi71?8jN{XZ;P5fw^z zu$f@K6y5yHm`cWFft6|uc>AJc3#J`q!G@{zB|p?-{I&vlc-G<*4G40@?VK4-s0a&c zxGkee#2kOFme$qX8z>rIl7vL^nwXdv|F7NE+<&4RSR;PXs^bgwUsyd|FB>y|Kd8jP zhU~ur`?aH7Os3XBB8uxN2x$$yJqmKm)W!D>V@O+_s|Run$J5hi9*7wgUOL#eUB3c$ z5g+a~G)zs2nEGteQ6wg^bQ>vR2fRB?Dpe~!3_yj>OIsucHeM%uh(X*OCLt7mP>Pg8 z0RAMXomB=lYrih%aRp7vxKF&L_9jkhnRO=Q4Al7Wxh@aCQuHdBSRD^uO~6+%Qh{yG z>9$TQ3!Q`3?C}F*i0;y9_WnFf-Q~QhurN-qRT3To0G2B%a*CnZ`Y0fFf4n0R83KTl z$q$;$(Iw0r90P$dY-26a@c>|1sCKXuwY~xt1ezUh>bxqPAaFBsuK27dQJn@742;O_ zhKp4@GcUf#U4Lbc>Ht~I9b;{Amp^^}d>h2u0UGqRv*)p*qR{_%sjpwTfpeblp}nIX zCPMK-J5<3A0qnrQk1Wmzr3!XD1{2Yt2};2U^8N(@@~3%Two#V=Wd&Qs`@c zZP#)*R$PQzY_xlb{J+j*XhzzBw*PPjG`#=TmK12>2oMrD1cH@9t26Pl4=$a)awVSu z6#wP`lI*KMT&3diaptY4l!xu$=)kUo!X=rIAU3s5Kj6B_NLSSrN@1meK8yc%tTgmd z5jI~?pTO9AE=o!B{@?UnlgQ{wGKcI6L1}em&;%Qz?x?1-$ooOV$o^TV=!KAJC*X zZwb;Y8eFpZZlvV}&AZ*5kB%N9w8}EXl@90jmsD?|YZRk0m=4Lk2wTyAa0O7wdwG2E zl4Ymr;-&sc?YuPbC+B67^K?sbTYInLT$i_{)huqvCN^s6nZ139Ef(!t6=%6Ig!#dO zJIk_ei8TJEe`d@5k41;?Ry>b+>eV^(smkJD+CA${PZG7?3;uI5Nr=(m8eEH^srMS* zX|BsQoEP#rEDU)1qaiIH_}r{~NtN}lREpszb&KJGo#z;{tGjIA)s4Z|5gzyexPJXS z>#-jl$Dbpqskm5aXd?Ng?T6b!#cMupZuYNNV+e{KX!Pi340*2?C{haGhl_MQN`7X3 zbZ8;?6q#$;iVS3*c18Beg=bbzVyg4%ooc+PRQBq5;qIzh&k$S9W z#XA>7#?$XrnA~oIjNK%;cFAQ2gb}LGj{1(9*Us*vc0Ik;5#kGQ|nmLrxVZ z?m%?Bwjj@D2jQ_Z4rD@42mE}P6EY@l9hpFReXV0}D932Mla4WuZsxgdnI(PTcW_o2mXPse=>ta+D?o>6xj$vLDL#J=2 ze<>oP+SD38IlLkj$T72xSI?PJ!cXVwpxQIA< zXLPsbYt^QYJZ2NWg~k)trfMJ(QEm#Ks`h;3%gJpfJEOebs+LmF)&_AR3UGx9fH5__ zEH{LWuSQ6h>lHg^>i0fe6RgqIQ@>4VO}heZJx*OD3W=VDf3)US+N?TdNDzxiUMS~M zb(`?GoESPn)WDy0&@WCz7^>^#nB=Wh_bggveUHY=_g0*lDL-QwU#(jlfjCQ*522&e zc`m6o2?m=fF{dX1E>(;%I(D6uZ5my8oT(5$= z-&B}AWsj@-+#MgH7m!yplnF;EhNF7aOU;+@v)`|)A|dh9osLK_1K`nlj*0clUOg4n zVqcd~lNS?FnuL`N!{TL@b$4pNHGy-VZuCn=wL3stJJL3%79Kgec&(zNbEfK|r|L?b zswLvXzA}N4h>R1#_{BI}!`BJVTCTVlIu9SQFpyAV{Gv^)w1yKazuHJ|nI{rnKoV`J z{4_zu=5{B-j1wzA*bZwf+#Jre7lQ7&;u3SyJ*s2cgYM*tAA|4tYui-+6l3=xRIgr+ zNUORZx-|=DHC*4Sd_R;udBzzT^?hNsZ~+zzsh_qJcmA9)tna}YgqS_&wJIrfjBFK6 z5OuI{7z+0)jo_u?fPxP2qx>abyrguY4l?dLhGVJ3Rng-Gcu1C;syhh{eyNOW4;rTl zz}>g%#WRv1bozR*--`9#A zBf@x-QE~EU?r?g~3wgQqFVwZ$$B%0y$A?Wd_H{h5I{qDVx2E_5k>rUBmX5^o%d0tA z2}(QkITmRzrxlqxBpG>zxp{RD*r1&UYx*xB5K?at4RZqG~FEV>3K3P4x zuM?JDFQM0aZ*Swr;?}Tk?;rDc=d9R>@+wT8=DHQT6AhJ@s`8bv&uaEd{F~URp+0P> zgF`jU$G^27Q)V)xLCR04GS(6sy<20VZZ9|(=ds?W;gqq{_=S+P7v@na9g{VO-Lfq5 zmc*h{b0ZoQF~k}voNt*cJ3*<$&_0M*>#wrUSAN!EcZ0eQ8v zMa>;coN(T;F!U9NjS9Q&vx|LEVm{M*56eyT95OsT-=%f#RL&RQmvt*0b=}*DS&u0- zZ6T?YVAHBI0myOvSSy^+SDO?2#uC3%OfbgT|m z(=)8}azw#`fm~QD-m6zfLO(kXEj3?gB0jRa8<&Cc**eQWwFTz>&)lC09sSJq*CMfB zr!3dosgkxVIj*cXKBko~mZtUZ(`Ou7mfrhB)t&8g-Y|hQTJiWh4HbibH0I;b7qzqN zj1F`(M)G#!%GmZITFX(H?4-5EhQpY{bfd(3KXd%fy|`vmuGEdmu%wFmPJC9Gs8!Aq zqJo^Eq0$hf{>fTFn0r_wQ51(MTYPEy$*3jvb1*JVWJbM66_++xzw>7}*?T^h&tomO z!TSa2LCp`adHD=&i=A2N2z3*mQfCatO^h%;mX%7xC^+#!y=F(^pbCHR^TkveHCvLx zRDOZUB{emp8j+ZtuNbvRV5HVtbapLldd9@Yw&IjYzacwu#0|_&bD;)%o(a*CG}(>( z=s?;k$}%bcY-pZg>oIwj-hn9491j;);;`471THAeAWaaCA5ht?%q zGP@|(Yb^xT7S!uXKAIe{hdf5rj3W2LKO^^~N%tP}Gyx<>OiWB9e^?_GGPEXmHW99L z;leSlruFoI33?Vzvq_>yTb<_U9K47EANgJEYoYz3Liy%D zeE-}z${QE{uR2FQn@QYjLpDJOaqtgte31AI#%DZqS_V|)N`s+CZJQSPYvREvn6$() za}&PB(5eJJeG*cPqk>9+XH)>90h+{*^7Qy|%K60qfBv^Epmw#Wpx{GTSeUJYgO!(8 zB^Lu|v~+{ZEH4jH`rSc4`iEA1;|JcQ`k!{b8yVNo&>$ivX6fsz1h&Y3bs9g(zmK7R zsEhJ`jsC}-BijH0=QDG2J~SFVI65l!f9Lp)d}axQNrZ-m#w8|p5{cfj$3TzKD0sv( z#`JIIw!db$Vnfkl!<_G6qfEunq!D>7zP*rg0j_hBb(9`id;QT%-*E`k#nBG4SC_<+dK{;=)7VDc2QAwF~^^y`k*a%#JGT0V^pvY zH^ATjVov_6+?<@8g98IiTU)LrrKPO^^L;QcS?v!$nt!Uf-~L?vKkm#Q_t@CDZDQi- z%j z4jMk0_c6`?drpqUix(Hw{ye|dGM;Qw_VT=1Bjg;o6xAKx<7NN-i3JRE!<-oKK=HyA zA|NF9{jSADb#R{_+DOH>^UJy|8%Iv{Wa<3f9JmU8_)1c7aj}S~sDRqpusgB}KN#7? z_z(W=V3C}-5Cp!Ze6W!Ix_uPX=gHNwyXPtY>iExh?;qFXgZuxFXRu2DmwjOaXxS!< zgi*wNYL?u@HHHeb{;ZXR7w>&S?F|Uc@6dzJr=i?cpUEawJu@;ibV;3n=wAzuSCb$0 z6%i46W@EEhf;Ls^P?6B7;1ma)y6+(p50ccXFTEQFN3;5fJn==45=i(1x{ zY7F-Pvk2V0L`WjPtk16VpyXdSPhtpCjNLe5e_2Kt<=Lxl0Ug?UY_HRc{*zt0SLV5y z{y)PqM6HO_PGViBbXc-L$xG$%1g<^O5!OT(JFy0!sPP!wpb zfEI;TDk`%mgUF;-#Q_``WJZxerYOi55+YQoML>~JCVdf+FhrRmkN{2~gh{3VfuMze z3;`h|5JKQx2ivDUZQp*+_g&wQ_YarmO#AG!_geS5@3r=3`>l5|qxhiP>sSfjWftSB zIKjRCV=6r4(U6z^#YiZ~&sPu%pX`( zYnC%@%HAC@`#5%`9azu)F&JXE`|~yCUOrhRB)x0m;=^A9n`854&MPvWi)a+Yddk@9 zW1B8;?Y4G|6tHEtzODm%81c2_wRbi@mHG_kALyFVs<(-%yc}{8?UHxs*l7bRhId@) zHa}hg&DkTYFC1*o$CE}i=RGCXi0_H&o$5YyzGK@rFtUjoCCxw1-Wu8|EmfI9q+a#^ z_S-I>;k3tt%-Q0i%!;k3H9@KiObU)1*!FxI47c0c1z-GJBDEvX_xjmV!d1JPvWej! z8nNKM+cypT__?D69%20%1Y@3J{YwF=TK!(tM*h+NXY5Gyf#(;`qUr(8*tR<^Et@h6|5~UkNoqq zarjUE{=a#>I|`+)#XTqEV0n85ld4ZQ)Z+CI$cKAJXAZg1@5}Mt>oqh%lasGxop%<$=b1KHN35`cDsoHQ0Sa$v zQj=Sq!R_*dS$U3Gzl_>fJ=5pu z66_=Ydk`7(!KnCdA1R}+J7_R~71H+HI^YMBC0^K7NR-=g?R!}`OL z*gkYDDl8dgx6ph;6m_}pEgzNA6gHo^6h&Gpj(yA(GfZ<_lG|3#pKIKqH?URMuIG75 z7}u7N=mOWvd@B^LYOuU$V|_fpXLxC&AGbg3liN(r^1N@18a+XQD;73`o~c}ZFXFd+ ztCFr$`QXzHF+x)IbuVvk-Ft8Y+}*DvuT3v%6B4p7jkqq&$)V>h)mta$f3@dw>z0cj zP4~Nfb)ect!%9v{N~)-|)FKg8{PgJ+r33DKGP%oyP-Q$^uw}|pY1zTQ+Pv8Uu{as3 zbpUIww2F#WJXr`aF6epdIDc>8Tp~)BRp@L|Y@Mhy(yLS;aN$Ff`a`~DX}7n^O-fZ! z;GJMwa=|pdnz-C!;1+y<(Z>klX)$g5lJ<8}bn`eH;FhOFMb~tAOy@CUt4 zX(icGQ?U=bT~NW*_QYoa7Ge`!-;>O{8hF{hBvQ52k$r0L*`IHOSDZvos-7^>44#zO z?`ZZuDbrr%gh@_$$WCdhh1e(K1ivy`6nCx{D~rnEgQGdADQGM$Q9XXl`uMQaOwux! zFw#&Ppc|*eW-hWb!?aTPlj9o?gce;aG$=96ChX77=)b&reTFUcsGzY`*usmAF1u3F zTd0J+EPfc@kIV2II2LD@i((j(=8sn`qZS9a3km6$CM#Q{<{wUld0LNAET^|}uTqzC zu|%`wx*vIdN;~0Z;(MSS%S;iv1DCe0=xIEGFpwa(R9BtRE3xcFpK-3fvpnWpok*Zc z-@B1rq&HPHGP&3-GH@nwvnJCR-lN7C2J5f$zuI9rYU#TvsAR)5S*)$^gnfM*2DOMO z47tENuBUHV{~eW0qlZFyi>qSaMokgU{T%%MJ*HJO*A|BHg;VM-C=1kJBEu zr0*QeF)G(lor+DJnQ!3rmxSb%ndmPVSY11pE8${4A^fB8&_s)^a(2E zAx+kiq-4lT+SVwMzIpQHPwh1azXhYBg(la^cC1hx^yicIS?_j6Mh1L%dE>R!`ZcUU zs7M%6TK*Kl?Ww-D+wj_OLGYaZ0M~o*NOfF2DoN#@6^7>nxe@v>4gY*ubJQY2XK~8L6CKA?GZrM#bmPmzhJ3O1f2R? zr2hp-J8Xpf{MWw;r^zUmZTrxSvxua_gimy>qAYh`~mO?A3F`dCU4_G zulXCj-|}Z#Vx_V2|H)qy(A&r<3b5j}SzMX{reb2V&7VGEebM@jSq=looOABl=t9pO zcHfbbp3?N;RTM*VqkA_9vG*&VWy{@%^U{ugXK%c%0Mm ziMcI)9fH?A|M*fhR_mSexxWYs)Li;@SZNK!vD{v2Rbo?9Qy(d~Saxz$1r>aP&YuKv z5L+dCF^PkY)*T~&+jhFW77XAH+5^EC(37Ajz9I3Ms1_O|4!{;P2`cveq+m^W5fB%x zW-tSDn1kW^WnZ{=^_AN5Av$`h2{YHPeMRSvf}fvXaGf6gE|JXiMp|Jhe#lA_!cru} zSzIJt1E1q0M_yVONBc@~^yt$uUOqmFE>Ajsqtn!n+|>1Zuvc4KyMry30eJ;9pMotS z5jdxlD$2@z73_1slypZcW(0jN$Lp^1sbsGc35nLU78Z8)Kv23Nx)X-b&CYcq$1V0f zPQt-(5I9!Q)?x9C8;@$lHSHO7kRRW_~OF&uCF0=|~QpY2uM8p3J75;TsoJ;l}Rp5GA_t+maO ze_%`QhfLWz`n8WJssVk=c*&_edas*>87$!O&UT+$=Mp~NFL3PJKp1fa# zmChxRE%Yr|0b@$&ykTW9f0eRR9ndR%g{3>y4DSwzF~Z3tN4(8Y(p+Wdk!cz6aGFp! zgl;6h>c+y-n!>aDy1c*Zx4A}C0uG;Psp}S8ZN87rd-yT168Hd@~?V7eQu9j#Pk^&o!JMe}}{7=p~nTV0An zu(CZ9!(f`y#`#GsCZi8=u($n=wXW0H-!GGfbNa<=(?I!D$xffCyo&y{1%tG4OcE;r z@Z|f-Xiw3abWqOD7OcLSbH~ZBR0Oe6vpXYh`nbtY4DT1}A3pWwYHOyg;EQu+`u;r8 zjoAb853Jl4ymv}YO{FxYYEx!vZl+{;oFS+F7+UE&IkWT>Kire&Z1A&3 zlWQ@|>*n+macTSg@n6ns4lmGr@idZ9T zYirAGOR9=TPm#4L6iP~Js*-I*1ytf!u?tX)PAkWzIb=#xc^3oRz+MT3+jmb%O9Y%S z0vp`3W`pRA>#@7favQ9QDk|=uNK*a51nL+w(hdagkuY4mf^2{j zpZel7LIJ4vz!mmKp4G~}e$pcUe3N9FuHO!mnHy@MA2`kS$z{0r+>y){SWP>(58f$w znKzJ$)cq=&rU7Ch1!+jDIW#sj9EWm>gaZp7v%-Y}POZEPXh|*vYI4LD@Ciz5Fbj=t z2KQP*hc&skGUsol>7%t`p}Ml*ioD5WTc)4HeH#pBf~-&n0Nsv zyME552$)KJn}s()-N@*HxjsK#G{;MP>wa@_tKPo8MyLx-5s?d3hrNBy>#oOGJ36+& zBD;I^^lZfi1=IzB1%WEj;q~FWo>_S|UWi^;FGK~1p5m5K-)?4@9*dpL!bGl8Nli`V zzE(823+wYwbXn;*NdmKRdGD6oPLCB|@Sw+wzR($QvWk4(dGaQN#++Z@@NzR3a-qd? z<;-#6h@er(B&avT?tzNsI(`ncUHt{;Vs!bpS>mF0kai5qY3!H-tKIs+C=POBR+Ynl zP^;CE^I`zzA6Q;wA)JNvw(jk*2jbMixD=PoaIp3!?m<+NBUX2=KhO~lq6c_%(&Ee) z2jTlNO^mKU$qi(W#y1 zALfV)H^$oDzN!A6BB)sz=*e`h70dx_g{M=JL%!)r^`-4<#@=VOh&d*vS#BDi}!$MXfs2bFnS^ z1VZp-gwE85&fLpvbdJ^Eu@Vzr)QNBsg;H?o;-aEBV1w+cLUm1ip)JVto`T^qb6p}- zJ}Rop`SqkOphl-6-3X_O+aA$9gfp4O^71&19rB2^5(*zJ`T|z`ou($^2odX6)cRT$ zM7FJ|00_Ljz55r6N!AnMkJ)w*G`FVUoP^dQF>SZ!3dS=sQa{z;x#^l7E{s6O zKl7Obar#8$G{>ehfLse>Vcth5d~M0or=RQx@=%=(ww*%dcp_d6!zqi&9x!Y#`&n(I z;C^LaAtv>#F8w~RF}O*<8il3qKGhZ~w*x)z=!%RoAE)Jj#|@dV_+XrihvwBVk#iRJ zlG-m4&tW7Z8qaWi{JD>+?4BpV^HX!$wV;s`pcOa7yM1eZS>J;dPqtQp;USQix>b~-&g(z3tPK zRmp%&=4-2_Go`0;%qHP=taw(NdPkH;yrWB($z#(c@qT4;p1RpfK;^N}Z=J1{SP;aTHZpf^=?rUKPXoi2&hPA`WI1M+% zq`wvvyiEj01V|iIhtIg%OG{HvFBRk~-=Ei(40xVIrqo;%(#x~ma0lQ7sq*j&f0Z#l zOPiNh3xi^^LWaZl{+HBPd25zvuGV25>H=L~G$IFg%_(U5yC zry=7ZSRrLKwIqg~tH1v~MY9ZL3WhhEV`!fU*Caa`E@TS;jyE|=vi?VTqR5qH3Q10%pGRh`ozRU{Hu*qg_V;HkP)y)Q`0)>4Gn_f z&;1wC|22eHC(AAfg~Pd!Sgiv3ruF&r#|pIUtsZ%3rGik{%pRxu&3=4$Yu(zQ z0jv*hl@oXgFjnQf$;up6*<*1aoj{o=2nqA@UX3dfRPEd7Z?*RzpD(8wLDr%-+mv1PT!ZPzJFIy>M@At>+mcLs&=nfFd48TjSw7t zRw=N`aYxHrW;9}a9V_=W*TLX?3dEa6myJ#m-ed4lY3tO{PG{vQ;`%+nHwi?19?e4G zS1s7}A(f`i%mD^r|JEvxe3}-s)Ks5&b9C2~)o4zRJvxl&-2mH?Go8sHwhJjRs-5ga zMIRsb{Hk}!ehELtO3E2cqQ&=)_b=FlMCV+DY|aFSK^4A%L;<~saBfPzPVX%O3U7-+ zmP)S8(*WD#GO1@^LGHQBZadVeaSg2kM>$~E*O{x#@-!N?2J>mG(-s5>QHaiPNX88e z+PnP)*WpiXLZz>@CFJThg9MqmvN z=j7$R;fisk1G&HU=DuHa13hIkBKbPdKgZ&bXwvM!^kM75y?BQm(1b<{m7TVk*rYY1 z>8_Q*+j@a(&vCS%anQ&_;XSk@P=VlCTI4F!kGAJf{%#&`%(3$du)V|?Q>n9UsM^h> z1&k5yS0kQfYe@UU>T{^w3wa@w4D&R>R?kZObfWK)4>>*mZ$o~M70>SvDZ~k~hFFra zS+)r}9~ch1zc3?!o;R1RdH&X(K=&n`b4BU7>PJWI#m>JCp*wucXh z6E3cnXY39Rzd)F<4d2B;*$s4g+Q|i30?s2zIRz;8_}MhqH>| zs{RdPSChS7*+s~kAhWT&JOxtx;}2~_L36;SBIu;C@e;;W|CfEkkchcKNbrRKEYr#j z9XprVK%S$g!jf+M;P=->5S*b<|0YV>58z{de*RE`l|y}2tikS`PE;h*;GTCk4mVvw z^=veb-Y=h=|J+p$Gpw0e?`FVCS$u7_c(^%3KlLbt`<6gkAcz);{9(6Txn@{)`EKYE zE3*YaIfjNH9reOAkC^4Z?n;B z<$^IB$odsQ!zpgQQ{*}Et)NN3HfVPswwkjP01GZK2z2TjR*PY^BK1!m_q@W;WcqixyxYeh}dbnZe-kl+G$0|fxal7Nv>Ym@$5 z-#tL(NsR0E5Vs+Lz-PVUJD`Bmr$XJT7CH%ujO%2GErLh%2CV;p_McveuqKLIkb|FI ziXkwUf(XsGHvs!Q6}HS{H7F5=vXdNkM=k_#XBbFWD7W}tg!0`=13t?>ek094n3$&T zx8SS?X3{M#>={A9 zL%CG#w(iT1EI|=e|LVSptDCFe{HKcu_=o~u{Z}3SeO0ycznsgVWtI6%FRhi?dH**J4f{LYvDex)(+w0(VcpaC^J%=P6ju%Q&l`N4>5 zHIS=7o4y!2ybp$gNX`G~fJ-n14~`dDQc@L5Gy8zsH43S(!Wu1z{kNBCl zXo90rfCIUJ&uqgIiI;6ilT_!+VOW}{1!S?{A|M30&e^Tt?kLH+dE>_F7QhEr6Oh#P1%qB>n#Q?pwYOi z+vSsu7#GVH@kXAceB!uPSKBCW95K!mP^lU zEocR%yj~@KqyE^64;DcZAA)ON`K-8K6$|5ImA=(kh!@52_x>rREs`eHB4%%J3Z;@P zqC5Cdju8r^;LbT~`f*!~fg5}SUO|EgqD8#hw*DlZ^P@iWC1^lS`SD`24pAH*XS7SV zv%9x;{X^)qdxNmf-`kC52hJoaMdOp|cgR0bd!-sclWs|uYU4lY4M-jw&9;>}Z6Wst zK^YT~K-Z&o)N@%Q_Y`u>GF8zx!D$zhNOp-+$q=VPcv_@v_7mrgJ7KkZ=gWQiWqG}i zZNnDMuMfOmOm!aJM?c#Ok_z=O%fN&A4c12cy8qhL*!ajYj{!nMN=iz8Oa2_95_n4fp%Oe56db$^ zs2WJ59ZH2TfCY}c+$^kK`wt!unR9L{xA6Az0u2Wqkg(zvfrahqv6dc8{TiUmH(-je z)j@E>ld*gU=a~KfoRIrv+RuOTZ;<;#$dI(m8fj59G0ilv|C8Nc(ZO#9%na2RU90y6~jv~NR{mYNcTC{co;E@0#eu%{Rh5m={2kfH{W!{2x^1V5)X{hQ5zL;p*&VgJV* z)IXDBfk2Lt5oJ!`kj?LcmOCP7ne6GsIRylitsJY|dvztaRHxerUXS_)@$|pBd!!4# zOuUO1d;yFVZ3;O>nfv6j61jaAwBEqx|Z{m>aY6)N&UKo`=cCZjZ`Y#OGP$P$SzwcW-BnlSsFZ2p>a zHfYGTb;->`P99n6OX_-ixve|WPBoK(tA`(E1#oV*)(uD{~RQ5 z+2AuGu^tw4lqEbS5dS$3jiFIS<>mV45ofockaD%4oc(Z50~^5?TdUW+K;C?~u`-5k zIj$%xQ|kNGIXa5!onJzuD{acGEgK7+W1Xg>c8xRmSNE>1>psi&+YLA#SMOW5D!h8p z&k^a3xdDjW^<+Pm{hVtvd;1{Kd8hw4(_HSxjLu|-U+3A$>VBWt>~>P%aYCIX9!VKk zKNce*jPxG&Lm0=-V2)a4xZIyvfpUCx{i-jC8Q7deyt;2!oo>DfI`m!u2|id*`JkY2 z??Kp8p?b;TLrrR73BQ?(r|I1P$yxS@=XL#Eu_(Kkx#P5yZwm(D0XyodgoT4O6@pp@ z7TB1zBB2$>6`5j86ZOk=Ft~0L{*-S$f7oMLp*YEh95{Ba)u-;x_pLIIh^bf}{#uAb z$X1$9JS%`^l`~j*Z~sM?C*Q!N@X*;9`Wa@Hd1)rrageVA$resUoqtMC)hs!h zxoF01O5zMF3Co3iRN>x`Fg%}#-YtE!U&@L}w!oy<=8ajD`mhr(#A@q@wAWSf-g(DB zhT4c?Q~$6hwSXWy?r*rMu6Ik`m^an)fc@~~qY1*83c8IElow*#P%bj+O&#|K;}$Eh=>O zVd%$)8yTk^W47L>WQI7I=m$E{H7AN^Lv=u z2fiTBzOeB>qjl?PBn5OSWT>4i)DV2jX2R%v;MK{N%0)PhB z?on!^+mV#2jdBGo0rBfleiE5-5ae{-tG^zGqVR@?_LWyY9Q&SJyNd115ywz7Q*s7RK@rA!zP^ zg8OP=Y#e-IIYj>t9KZxlLQrsB`j?ZBKXX}7E8Pzj(noar+8K}<7ZXU@jzZIDKdlmZ z4Y&o0fdFcyLF%t>P|N&fh!rp;5Ga7RENT>d`t+%Kht+W{EiK>0`Dx?_I2EXcB9a@@ zsZU$dbg!s0hy63t(^XE$3INHwojm*#4!ZcCGfouh8zEH%Zd*hq>$eT$AQu02=I`n6 zPt-wzON7?{DH8>z=+8iEAg0nX`zsQ}mP=HYXoql?Vb*S;CE+-ZZTa(z!_3%`2P-Vx_IK+u~24nc0F_C%w-HMjx{G*OKeSf-s>)Cx;dU`y2;#oA=3RQWAz3njK zazO(VdEDalrgR;?(5iKv6n=q1w;b3RBC!V;5Z{-pQBM0y!{(Mv!#o@((bX}|eJfO@OiI^5(&Ex` zy7^=!X?o4dy#vyIR4?x}Oh8GjkqKM5y2ao2J@3@&dj%S6q&egM>zU3Gv)fj50Vf6g z!Eoc3*YV8Fau#CaU7J^tOh_ybTMCUEnjLL-k$|>;51KYo zwr`!Wn;Er;zw!XQ!ouEiU&e7H-t)C`gw17H5W^-gFlSUN@}y`;YHKH<0;$$M+w9oc z-e!jCX)nYto1$S)P~T<#ToS|HdL^j{hF-P!K_er#d)p+hj70B||Fj8Qs(_IZ{P|Lk z`U~KkAi$gec0W;9;3lTu&D9mjzuzNL^TaU_>63{pI1C6J8R=wlx=n#)BKkg*Xn;mx zJuCprA5sBHo==>+jf3ZK-od0VD=UNa#eK7i4JYBgDNw77#JuI>g_R8-GLX3i2?8*; z?uPwWV-Sdg!R$^e)>s~4`1P%gj87T4f08yq(vW!ww?T{u5~E*SSK7SgIo#~#eqi8y z=%f^6_u2ALZjsZdKyrF|(=+Efq+{HCdXLba#V*AYIbk-QC@FpM&4ud*5}} zy8rR8d-lXRht`PoR7Sh7p4Xqnx2iok#5|ZlADLTM@!~p zjW9spzGtQQhOv&@f{z0BmkNVH_#i%U)hPo0GLFJ7H!e3GIqx)`xLoLbYE6OqEBLlK#rBS?sx!jp_+TaQ0gcqh zY5SqMKET|MU?JjM!TO>iEW9unEisUa6tr_J{UXYt7-S}vK2Sk+*xBOv(o1JmrHtu_ z%CFZ)h@>7TUzhKfT$|5R%e^1>Ymv`otYjdo<+PH4J~KLUIf^*8;-;WV-DILvy#&O#`r`S%mn)4#6K(WIWOf!kl}dPD)0U?MGHnv;W4+&z&g-H9Cp^iE64gIJ*AO$JD zcfTH1CHT%~Fy&LyG$RBFGU8)vz}V3cnuJxru(2^j@IQ%0*q8ZIr1}%*GdhickLtEb z<_HE4@%N|Ve>d&{cLbsN3a|v*G_y8G$B&^l-L*Y2-adfnZu{YZ>0c&BXTW|WisHMr z7Uh^FKJPp$Kty#%nv6YdL#GkSpir0CU=sI`%NrH5`ZYV3Q9<$wyN{5&e+!SQs&9G= zig4oMU9xwV$b7kZ{%}FsPnVHvyHrgwS)dmZ^(y+H?Hxv9IrhXmbO!SDtw#zD8Op@V z83p>%W{3eS7X{<5*ox}HyYW@8Tv1{*oI@=sEwN1v*IlUasA+Tv=uuDrGd{lCW*h8r ztj#z9zB*nWmX?XneZ5}YN$9mcz2tsnmwvrG1nqr+Xvg-+ei#1u`JACu&ts(zoh860 z*C4UeDRhHL^f@FdzBBWQ}?Fa+8=Pm@P=q86dI~1w%}$ zZzq6KojpPL47ZU5^W4+7|1|Esp=4@i_DgeM=qPBR`4P$bW8)c`t}ctR1%y6;JQl)u zunuGKZrHnvW}3y8O;@ype>q;g)^)vcUe>)i^hZQ{DpxMM>pQ@;phs{Y$eYVM(Sxa= zE0NTmt1=tTyG%Yo^CeM4{gEB-yY(W|eJU9b5yFHOC_&zC`r|>>??LuoUIy<6 zGo&9LJUq2?B$X@HokT&-H3G#WT|h8)>%IPOt-Ax^?TRRcZKiUkzMzR6?SCvHF6&;)a%$3{7AGz>X{)NXTKsZTbB-rk!wY(?g9KX6K7$=+gF$NpoE=iPxRDB4BPg zSldqfEIVKAOBK5e2J}Jq(KZRI<%eVRs42G3P-s-u(Q`p_d0qaJb2@&;?n(qy<(SsX zPcy$spZcqGzi#by#PR4pw8!ukzL&1kd%X5O??)!Sq1OqzA_qjS8`QWO-tzTwQeDTr zH;|j{Tl4ed^Z7y5a!L%_isCJC;OmeikSyF>@1=xJdUWINZ@NQjkFUp>gq~}v>5|#0 z9?LHKt_p&O@W))o*T>EKWt=UW*YBDy__v=|8+31ro=2p@L7QpM5su3j4J|sxBA+O5 z2@My)cgrYPV0mt(jC#<+Yy&gj^+K)p3hZ&d4f`S$AK0PCI*A3Vaw9^xxWd~$EErkH z4yv&nzN}E^d})38`*~4=Ugy_Oe10n}`$w*+Rl7v3oqAQP1koSwywum*;49yn)0jQ2 z6-zxGY}?*Vxwg1&s*-XYA8y+xv-i_n1CoebH{7(nu3X$bZOifJ(lRn50>P6*yY{o9% z_8mjjOWrY77P<_5*dDkIu=*hELw)fh-aEi_d?l1%>A=0i?$NCB`BLWjX>y+$rF_GTV)rWvqTbX<1C1ZPR9yKlKwf51d3e%7yR+Kb@fZ>GdYty!)LvdNPUm3>dB(xXnpWNuhwxLlN(?# zSQ4w71(WWG?qTol`S!Y$g8-k+&yCUNy9$q#%b!ED5c7iVfDYa?%4Jom3%50Y}ROi;WZS6igZJ*OE-KeTyV z*gYi`n|2^e!E$}#qHGF=lPLB}dkf**G3<;&Yc9`@JUiR=wRqi@5Jh?nX3K&bxp4 z02*fA6-D7A`dpG6`S?@MllV$TuMvO0XV`$LUQEOIaIRzdA35JE z0F6qk1HE)m>EhSP+~lR(CT|FAeCe!mQoTgOe&BugNk!$^Ed!yfcal`L(?`egaLyCj z82&beucO}!PyBgXB0rpb){oHSjW}E+Gpe}dF6p$p_UcPEI%b{awQk((M6&%^IQ9Au zEeSPIqXmu{MN*S7hVJ9*@-~8-*bsr!;&T4}pv=XS==jfMWaCBp2^4w&H8HR=0%wwS z8q1>|Gn)Sfx-+YaOPqRl{ZgB+G4QpepJf}hs^yEM*31dMb=rpp~&Yw?o z8W+8%th{Fha!9h6&i1uT54SmSCRXLi+`6rp6JbC z$YC;WxZGbI9$n9WgofJ~PyL)(yzEVNJoNZ9zeEy!20(H=ADDPOmtUSP!sq7oM2$_4 zVy5E(nNg`uSW7Fc>@IiJnT0;Lr~WNBZ_D^oPRwB}FOa+jKb$=HI?9(`^?U4%wccrk z!)-H3f0M5`ZI>x2Y}}cM8FD{NBnpJuzS%C>7I7&4i-??(OnO(0Hn+S;vHIYea-XFB z%-7;C;SDu#_VrhZnC6rr8Y7&!b;;%jsSpmw-A>$!_X=){n&sOe!Nz6RWRXEbxOPu4 z++^l42EuPh;b%^ghrRsm@V48-z5A$VEq{ReegKG#5k8u-?rILL>G9B8XuhXV>Z0*{ z>2$Q^c0VNrI+$mdw)w+d==~9UlJuRO=onc_j;cm*>-*?!Gz`3YSOwQM0))bZ~WKhSSod6WrG{#z-cJmxN zTd=6Fc}GEa(5&$gV;~^uJHar@%F2Qdqn=_(fAUGc?v$CT69?udabUZB zre212V}3nCQ(}Og8Q;1RCBYZbP%j|Mjfyn>?8c&Ax^L~s z;U?wz#Ehg_QI`8AE9BPJV8wGszS@8zPAC4G>@}UkUA9k=v@e0236|u0|^PE^v4EgEWlOFu!3g? zgJR2tXov%KVfvQ+>0jV*PAeDfh?E3=@c!h7e;$!g3znjU)X&LU2qF;zU6lFoNFNgv zy#N#;P!8bL=FmehtnU+TMo~M3c+auU$0rJ+D))jG_%;1^IdfxVNF zU840%^gklLSI+p$G4)Y`&R+HBUOG(Ci*JqxS)fBncmL&7U2=dcZr_kyPXbI2xv?5` zz*lb)@B42Ga$tQduoU-yPKGYf`-*^$qSyxy;u8v~0pBImh5%y%{WAywufHBF=lJsZ z2-dGIF3JwOdK^D`xwJ`06oBVim=_R4!1b&Fwvp}m-1YUko(GsqTn3nGv|exSAARb9 zbycpH%*`MR0|Xo?FWRGhR8n((nJOj^phM20y-xYdx_S^|%4kj!W5ZV~0CV*z0V^?5 zsRC9VAmJ|1DtpHuH2vay(8~CV@Jef{{%eFpE`W7=8@B5WUk>CAT=^V8;TZ=1B2s$BcA?_HM^%SjUgl5?zLUrrJLlRW`O9TNDnf0aJ>*zx@5 zc{N;tztR3WwfxIjL^{tO?|#WwrE>r1t?O&x6ni9EN;>n{QDv#%xnA+%@~72)a4Emr z%$&Q;)qaEbi93IxQ+|Qz%a!-3>KpU)J#`Cuejd)-WQc)(jTxiA+HP!WayEfkOXT*T z+@&%u|NE(EE9f`F%Mn~bVUiM3s7GH`#;9a~{?P;|or=XwpJEwPT&2;KEaD;XAjsuJ5?Unn6Q21{goFj%cPw~`Smzq@$PhWZ^q>^XI6b)Q~HG? z!lGcZN5FfCR|~GAh9rsyk7aebN>+R&l#SP&RsCs*Wd&4-5|XYqsxPGX0)+`lBrZOo z^)~b7#h?4I{&acMfb>yMvxdCzxY_f$MnTJXXzzu2g+Rz^zI(2*#>bEGOqz!286zqO zqd8<_9?DXr%5hW*OOEywQ?J64exV)D{^r*3@PS=;pPuP!@QOmj3XJDiaq}W}844hk zrtATMyI%i>mVRZ)J15p<;Vlo!M6?)FrKPHow-5`@I{Nj zfdI<9A&oh~iq;iUN-pADx{)SOpwQ5;R-!QIb*j8Sx}Ml`{sZ!>5)gKYp}g6?Hem1X z(D2({$BX$*iTS}e`=1P$&?)Xlu-?yH_8#%NJ(=^x%GwY1s+@GGXU9)iI`W&EiYa-Y z@!r>X=5bW&5#7mMlbkxelKJjN=sw|4(Y5~Sh1;9y6*nW4mK}#XW#aONNy8(ecd4ep z7+yITrwNr#JYUYrz9ZZvM3;TqNjBma&a^0vDVX9Z2zgNfuRtobz->NGv@O=kk*X=o zBlS_X@#-M^vTaRRjx+2bx-RkD?_9#cLs$i{?G-SphqRZlUyqvIcE>KtlXF5fhRtVE z8*rMQQfVH$NYiir#=IUk9e+EhSr1CN7~#P3 z2xp?X4o&3=mw11$$RnY&jTw-W<~3LxyTwi-6FrwDwrkWEb8zmVp`dM|6fL40}1 zu)tHeXQUTNJNJQ0tnq6PJC# zsq{wAy2m%=l;7&%J7Q(V@|0wn#HY>KF@)(98461^GzCv?IIjdAhQop)axUYK2bDZ_ z1JxOe}KQXQ^oX>JUru6GY-il3}ocrAcn{VR<>2^k#2l&U!xu zOO_8k26ZIsIK{Z9vJ*%~iCa>%@qpsGV_|u3*f-NdUf3QOYzI$24xG24#d~xt{}~lj zYWU=c#r{fLjNemOYK+<8tktM*Y}a`DP@O%xfc#~@K^d(ZjG8|IncKm=I!6Mb(dK#1 z3A0AN4Okh|ZKsf4$Iop$;WCtbb~eO|lFyHnC9bJ&e*RT{=(*$g`9Dj2q3Ubt6iYdK z`S?B0EL!aQE}oNL7uB$HVAqLai)|#`CD&g5c2;0w)@cTvE$5(qBc!Dpk>?cBuJsPdePiJBFUU zYY!CAjG$e^{XCLboA_qG%x}ga(*3swK`cBkiA2wfyvO;LE?Cg9rf+pT<%c_8vZgJ{ z56abqDOgg#_3?RYICNmhkB=Q!@8^7U1C6Pum2v;^-k-j*oyw;xKbQRBNES`+pK82$D|v9u@7u(+{odo*2}}i5DrLCByK(zgpo)k{nm&?q&uSVf z>h}PmOTjrHaP>i8uL8kGju7@7>4;j}uK`dcJ-8)1kc)F9L-Qa^K2a?udIJ!ADQ>q!0 zNO9los9M$Cpt_^F&ZiH!W1S^PDXaq#fWC>HXHHC$k7JZ_OOU*W&Tnb673)af2W=@( zF_=YD7W#LnPubvL5>t+=q_~>(jv3#E-VNF57zP%bBA&RLAVoEu zdDTzcxR)*6=w_8!2VmowO3b!g=FLj9)EoY6%Ka&zI)b)?vV@?dLl_P>c6x?O^k>iJ zYng!SwTyy*{%wvX?iY8%cA85%51ho}si|wb$FrqD&S*g=_MtIuqvYLvsnyQyIApJx zy(aBAs9Bz76)ZnA{GgzygGDo$jB6g);#S*_PYyPiXZZ>a6S_t-QaG9A(*lhVO6AA( zm+dCwy=zqA_wzf@>`?VE`GQjq7i%%qvoq*kZ7OG7dI^t*>c^Zx#wimVm6EN9^6gMT zd`Q0*hV1l~BxPT#Z#39HdM>D4$j}Z8{(K!mc>&f3k{q7_at}G z_LwHlc;VxRSIZb(yID?5Mj5RmJbjq8Iz0S3+jW^;;P{ChXdeV9S+yYcZ}}gU6YMBA z&~qPGd?plLDfi~(H7ig;FGt6}lQUJLjP#D_j=ddtdfvFJ*A7so5G^LZ=b z`<Hf2@2(7aMy%Um!$9(%znrTt1d#88TZ8-l(NAe_rtc?LA@F6+-|I| znWD^^6ywFo&$fM{#_TESb8W-cfsErH>z0(NWP)XP=6N)`Zt^&iQ%sWNJ(338WF?_nkBvrm9; z4=~3IO1i7bHCJP={wA&^5Qbt;WRqy^H(VOR76#$2hpSGR_*q!#Ib^OKWp09SvdcwZ zn;R$in}Dt8iKmTc#=AO4+~zd+K6Ep$()=+4d5E<<_qa;@PPdW+Pl+7EI7zKKdfH(r?2$PJ zwBlIC#s&!1rzESy#jC=q;Yv_`#UZTwz;&&2=_j>gE|3j+lz%e{)9&|mb?d<+Op5$% zz+g40CAM0)qW>yM-q$*5DmEv?SCcEvzXKgFG6vS6hf{+fjJvZ`j?=2Dp4JevG(^*= zuku#A5_@ni)S&qm=YtiuYK_PaU}l%9z4w_I)Tb?=-tzAdqS0O<8-!i@OpxnFyQCsS zs^9nT=kH0SmZN!^_HD`M{$daIfchp^mous!&2B8hSX{#0*lc#*G9+-OYN-y_=p^(9 zUss4*L^y7lBYePbr$E2jwv8$@f7Y}o5(gBVnLZd`0ne~>d68#QN}ZW!!Y?fxKr0wp zLx7Wry(!vJ;eh9`Ow1~hPFBGXdSfoB#SoB~xlAwE@QIy)pr#1(bheVxNj>!2o4KiP z7+D4?gF#{rjE)*LB@s$a&$N~2$?>wo6JONyBZwb0qFnsuKB2Abn3+rR3b(KK66rc% zEK+9Xr??2;bw_MFNEUo(CKyB-1LZkqe51C|dmr7Mow(~iZ&w%6QxQdU_p=H`_aZ1I z1w*7p&0L0Y$%0Olp0(3en{w9CBaW8@M0_=ZWe{<1T)#Z=3r_o&g|PjY%aSQBNCTeC}JAmOo8C0;j-|PF} zJmfy)I`oBv;A9ut)LzN?)qsC>)a^{e{`Rx`W9oD6)9GtM(j4}&v6LWxq?mC_aRb;A zfyQRn^TDsR586qeeC@ny~aIZV-0v5!QwcXSRNf2t`tbyYklsg>8C!n*^B%*nccu|Sht zp7WCm-o2h+Q=?XI{QZz!Cx4K_-?-_+3anR@I(YcLU0^wqI!erNNGI(p84e;h?; z|31*tinAonkT1@dq$Cq9-YC1RaNBX!VKF1We2xQCw?9mU{n^uNqPaw9 zgrDaY)P)Crxa7sA(@YbAmmQaJuWTOGq~%*(JM}{3j$3Ju>UIOG$^CJyierTzZjem+ z!bY5LgOZPCCHv`|B$BBvxtcV4&+2?#Vm;9o8v$?yxFC9`XF~=$zE@D@uQU*YTkaiE zK{*GX(ksY!OJeiQD0A??#W+w7lcC@vMOKxZ)*4(1oCG>?9oT(s+dLpo)@Lpci40O3 zVLeS2PpxJrjkfDy?Yf?vGu0s1;wOk+=|TDu!L7!ZoNmI{5^|XYenY4g%fs=P?zL{6 zO`Ah}jdRt9D%tt)O&X1l+V5z_#~d({f=aB}ISDvYXV6$1Y~yyj>o=!}%q0q`5cB^8 zhgb18g>`8vz-APF{yY4h{W}7h$g9^1Fa=b9w|-QfH*XH-k_ZoRCW}bQuqP9Fgi8A( zmj6Vrfv$evZJmG~$k=9`U@ALxcfm6IU|o4?TZP0e>spnBV_m;ZJ09P0`al~@28Q)| zMX?x^sq4WUB9dxu6h&5v#FFN-j01jTS>9jS$O%;Dxhy2g8sBZ&2;RSPb2cc{tuc1& z7z}6@6Co^{XJ?abHM1ROzX{dPAU5e`)2;Vjo=~njCv{Fhkh)7#onaZ{h$0$;&9gjL z7WVRTpCe2O&M~?jNkRA`sikB@b8nU(SL)5(mg%pKbYc@AV9Xxy-uRZ$C{aTgibhy+ z%|9i877Misv%}ogt0s@_NMqC7oRTAWIH(dCJJf&oZC_-9xunBiQ4x%K5fvH&7j?EI zF}WxzioE?yT-ROu zQPYm5@0`n3Hy^tfzmvk9cOV|=E`Y9=f8RVc5Pydeq)K#N)&V-yx~;N#yDTz4EfbU$ z=Q00t^=Uu)wz7MSj*9P zY7ckhvRQW+!HbT%LvH&{z=y-aXR{uPOYFCq-^6Pi*J8eIz+7kjxG&&+q4`{C?rwvG zQ4|1)K?s4^vGANE3`XH!rIm{rNFT&Hu#{U&9BDfa_;+^ZxU4F0mCQ3ZMALP;*=V&}Qu8 zxdQRVu1D1UyO;j{K-AAfQQC?aa^BWI3>guuCA=m70*335fZ?A-uukMlltcpv2_nmU zDFqTP0QXICa+MC~%y-!Bx>?wzjypY_z&Y9ZS53L(ZH=nmO&@)$4x5Tg@SMi~qMbtA zpc!AhIfp&eBI!Sl40 z=jy>ea3a$;bz0il(mtCPFSF_`rhY8yyz&Z*O2bstJKKZQq#l(czN_}85`h0(rl`KrF@sLMpoyOy^{EgAW_iAp;H+Kef$#W zWrMK!kXi#TAg&Y_wEnq^s3h>S(9Zox&j<$SP0)f}@=D^5ahEJA_EhZXG*i^6EUs3M zD&&v6!0?5w4e$xt+)^v_FSVGm69X->emZo*Z zdxv}1EFBky7o@Bl{P0B&FFkEN3gHE2-mM1r2R4_&!wzr~qJ$sB43=TPAC0mx#_v(< zp$-mn7R4JW@;jXk2-!6;ml5Tlm&8I?F@AFfAfo}Zth!MaGg}TeLwEeG65hX2JbgZY zw{ttZ3lOw15W4Yz1NN}N;dHLKLW5YR(dCEFSimqM$>wonA!GWCmT?C5GgwufX21K4 zjnqK%^xZes)M0_bGQ<)+@jF$v)o{p{secV#g>}Dge9&=( zU{V;vXvPh=yVjG}!9Mni`c`KMmJcVzgR0hziFY9=BA7dEBjyo}LCljQT4 ze+%T<2Xw_^S2|eOE|@YE=Bw6zgsUzQ&tB}3M0v##tg@G1X2tNf zY?DffZ6Xb-811PTe1_g=F|AmXVkDgj^rz-o5E&qRkG77`PIyJqZt!jj<1_h&M7A;M z93!dP!Y?Z{n?D8(INyUBZ*RfD60cbO zOh1mK{f?B~4dd)6xi_Znem`oyod3E7V~7)YIsd@ajSUVXa`v169|-hG`?6w(3# zIffqOjDIs29AWn22BLfQO%;Cz11;)@^C){!lhfq-Sq0!}1f~75B|VFv(+%bSVwD&< zCeIbad1%Sit^_kBr8_NS6hDM zy*b>W8^PQHqbV!_b~)M!Ct4|-G@+~|ZvncyD7)?YnBRtc3o>xP13j|jOQcu6rN;oI zZ-WswQH+DBf2Je~&GY+JulQ@Rj+*b$Xq6Uny|m#(QBs&M4Qk=lZJmVjeER1qK8&%&)-!X(RI9QB3q@aI?v z?hH`9@Y;ispfSmjSA)qs@O&_#Sw*o-%)u$>Z+h(>4cM1!>rAT>OWpdb3$!T~dF&$2 zxA1nSdP23GV?&qU+LY6SoSYC;O~!$jH@p(yCCh(OyEr@q2K;ainrh=aL3^XDr9P7?c&jACPStRuhSF`vIy!O=-&V7F|VzGcV#NTYlZ+gjmE6Qm- z;g$Y5F{1mQ@%##TjGLBcdkIY|y;Tt+rcx1U#=@h4cVbe~AAwjvE&Ea$c!X@9N0X$s zk`IZ+lB)-v>Jq({N~|6I?@D^m0|t6-vzwoPV16QugUQZn&2fqa*OAWUzbx+rS$^@W z`eN!iI&4ux%jq1xlK*Kvwa#DxJz!0XT;=cMU?vrX8lqqn09$-kjdS+j&TxU9xr56` z7AU1cH%_|({XNd@iO7rurm}yC(7xP)E8ZF}UeM>IloW?AFwgTFY-%%>t+M|1~o3CD?6{Xik+6r?E(v#zg54o6_xM%uQYkR6spJ2~7DM zvvif7A8CYSa%()Oy(J(|HU+N_cF(a`A#qoN-_vG9_`S-_Y!JR8K-q2&=;%Sq&OElz z#6WNpZjKooV7}GHC+G`sNN2yzX%lAIO8A{gm4Nc)ysGAg zk+qbOqaNepBhzxOoNarzt^n+*VWzw7)=^mX-& z03|*$s8o2Cy;$4}t1?qUiUktb#UN)Th@K)Y;d0FOgP0c^1Le8A4{{+};v(r7r+`*S z(h-X#Lh&r)y+yhOGmrHlj9bq+@1b3Z$7+JSUefA=cEdb+wt)i>R#c&;KQL33739{PMllNjTQO+W@ zoqQngWMZopGu_;t+1%cCdUGk~@?Kq;2l5~NOdQ3st}x98TV zB`)*z<>7hP_Wp73+Z5KLE@w-#UGEqd<3M4?WvRIQA5}Dbd>whOiM&{I&$^yoJ#y(Q zgQpT-F*&8>pWLw8o`$$e5{Wa~f}GxP&r(cQT{flGARLtQhLcj2 zqrY1pwfU1sP?CpJ_|%AV>91383p#Y$_>TsPR~3u0lVp+FF5azRS32?sh*TdgNxps~ zce;GMT}O3$r1xkzsu=I`1L#Du0D= zwjnpx-!hX6nb&W+Z8tZ9N%~Fj`^p~x%lvpNf+x;=VLr1Plz^J034p#6vc%TlEo1z3 z?OCfCsYi zkFhZ(l}NKGjF^Lcq^!iE+`yFPAHt}`JJhPQPG@&D^ClO*txbXvJR81{`I)QYNno92 zQr(QC(NMXpZ?0eXEQzwO+;_q^VauB;$a^G^}Fhxs6P;veiC7y+Q zZSutkc!-m%9ZFtrHPe`s)PLJ6)c#U{%)Bs>nTm zK{`Wm4WLi`)%8=hf6`rjKpkYTdSKZ*U4ZV;3WI7*+Lri=VlgsdRBb$GyFgzWPZ_0eTl{3m|% z10l{VGXDWLh>lOYR#m5hJR|S4z?_2iXn&Ctyx5`~Ay>e>IOS_Qo6RQE&pyuTEp(WQ z7~W<2*oq3Os1Ak#bWu7b%sC7XgPAJ;PQOR%j`E+6#|?~(%{H2+zaj~lw{8v|u=uIp zxT$XgVDwj>q{3^kM2I5#B1HZuBJ;6!(yaY%wJc&Qw_C>fc*lUVcG{FL=3J8TWHDO@sPDzzEm2u^V{+uyUh)kQ!9HXWh)t;E?Rt%4-%cgGywwhM zJ}53iVUpX54p_w9hMT8!{`64ZcGY=m(O&Qm^Li=?ZgGy^vXRjS5ctp0FSDxAe7a>; zD$(m2U}1xqwNVhFa7;UB`h|`t+16tN(^;b@C=<=7gGk1H3^@+LNZy>O&AO*Q9!6CW z&|@vGZD{ZjKA)*bw`klZw(mp}M$Bf2+sQMR!5`+$*!c-eU(Ye#(2fV+B9Y|!wb8I5 zdj^rUEAD7V{0zS_H|O4v@L;FRn|!9@7g zpEkWR@m(>;c;3n`S<(2XykpjDgM?C+*l?3tGI5ZK1i*oN3$G7FAsogs2MTkLz_;1# z{(Su~w1k!IRw%~|=YUl%_B9T8o(Gr_U5V3k*cknFWII7N!_dx=2bM1G+`1&dL}SbI zTP>5~`H^T$zGSaz4Mn~OJydwiN0yS@b31k8 zVR|!#jNcDf;aM_S%?j-KcM^V?-Oe9$Ku$o4l(cKTGfV#v4E2ono+-Ym0a=x(C%IRC z1^J9Tjp?~3p$Z#Uj9d*|E#O0*Dgp4l?-yAkY!}ViHBxg5_b7cc^!KE22RwqvPG;5{L!-LU-Zv`yJ4~43E&;jZ1^Awu+#M8kU1NdcBGVV@NkFrB6}%NZ<**QxNwj=E*lS7vu(ZlIpk5B~Y4WZ2`LqI)A`o32K?mWz{?42C&kwl4?14y{PiZ(={ zyoK-51bD~3xuKrpB~bGgf+KV0I&@|BUzEpPA#j0$ld3i^t(1_+jFhYPH2uF&jVi!R zola5z<&fw?Bu@3?;J*Sd=zncY3ec)RcAvfy(3m*ETfPsxY72p4OMz);LyOWN;59=K zq|#EvBYk=N!-e)G4+aGwjrh8NMf}VD_aF-D@oNq-hq6!#FkljxIoJJKl=olNR331g z>@UmJR*)?M0i>N=U@qo8i!#XELLfe1slIWoo)=v$>8lF?^kV#j#IEp8o+dG=tiXa&12?2N@!;P7plYKg`ac!Cg0x4D@~*N^S`Q~7)b8l#-gLnum4T} zM0+IERe!>CVk_oh;X#yq*QWd)&x@7mfLy?gtI$7^c8U2G0VE$)ohE}E_W!p!uOJC# zE)t^5fmFL`4Tg)n)<<5nwA)`2>E};O#n1Qt?X6fhrTZizw`;XWt-i2mf)6K;*UN$~ z-r0>~xYf@4YO%~-$#Z zn+o1HZ!VY}p1CG!tY<4NCyQbf1a4J4QKWrw8&}}XBhGg8HaJk;nz8csK?O`=Y|@_4 za31~H`6;1$axPJ#n>TIA9gS1yH@Ds7ari~B?yBW!{fhi{zSd3;D7^Y1K~kshYpeXG zt*`gvAq9cne2oo5zTvQ{)BV>tMfkhIR>3FzV?qVJ$zg1jhFln@SZ&fTMJ8OY4rZ&& zF83y($y`5!MwEdfF~L8V4(du0y+0+|K(wvL{n#^|l(q(!m4Uow`|#x+tL=dndCiDr zP<_+;Vs^?cuK6#A2U6exy+{X0p=@93l=F+}y@RmeGnSgk3uhZcI9u~tTm9vJchVt5 zA6NScxNAF+FhyFbzM0gz`EyAWKmn89O80_kCl9{5vV)T+H9GkjQ5z z*3LSa?k@)7Z-)Q`_-ivp4J_WHyrRGU9r**EC>}Ww5}<94E31bgQb4`36o{YzVt?-J z4zB`3vXGhfP(?ftJJ5&vcO`vm2!fDqX4j&iNC;sNxcmiu0m*AkUh1S$Sis`NZSN04 z3jRSVF0wpcNr`+C;6am|XmZ97W>T&EChNgGL{u)3Q7Ugl1yBoll_9Y(g)rf@N?Wo# zwx@&N*y5c|GICoJjHZIqf{Zdts1gg>vRJsf5=?+FT;k`9Z*=HzNLB68#<+AlHyvWHRJ{F`4ZR-{G_)R&IYI+hLLmSDabP%nSxiFp z+$go!FD&2KiA3Hxblq2cHET2lQdp-SCni-?eM!*X%2&TqZ5sJ_TwGXTKDj86q_$r+ zVLSxD|AG6mV!%f(^|?k)LC^M7&2E8s6)nN*j_~!-aiEh1N9F323?OGN2)O4CMI9@E zBNT&RxOL(X;~%i+s5cbUs|$f9Ig>ZsqoB|7_K&0AFj1svUzOviR%D7fN^AO21zTuR zheg!dP22VvmsexkRb_c7a0C;fZ_SKkkqH_;Wz+zXJKEgeL$BytE!Jo^Wlt@+c1FQ+ zc>((MKzSfMeArlhgIwy74c{5yQmqT@(Mzknlmkz`_v~<)rmtjF{)a_+ev3n9FJhhOomK?DOxoy?E%GdBa z$nR;deEb@wY$Zc)fSK^S&Qg_C`}dbWC(%${4oW!)dpfsi`#c zyv|4G*dwR$5@@;;+?MLCy>dR6OZA$4DHEYk&bW_<-|aju){;q@)>MlLLW-0600IbZvC!9*inCD%5$xTu?@KuHY4P= z2B8q9-7jos@!hGz?a^Y_y_pMw*dzT7Y`pXc*0Wk++<%Fs_Q1u6KOk7%zZld$Ahx2E zsGS)u=^IL)VI$?61!zVrRp~E~R%p7YazL*&3;gp?a)iLZ*id?tFO~mVN2Gm)iA~!4 z*bf1lQ(6@A&)WNfRsPlcE_=_>rv8Y6K7RpXui>V*YpGom}d|8@9?2n23jYOXI; z{wq2z%Jv~XfIXxQCU(J_wkt)Jc(L1(zNi0{5VvFr57PoAyarTOCS1ZT*ovMnDqA0` z!haF&^c7_{wx);=rE~JbSbU zMv?qAX2T>zFB@R-1DW?LFtpz55bcH?x^?do1GUs|B!~>`s%;kQe_yMr{f=zz+zRLVhn`hI`3g`r~LsyJ0u6>q3^;cSvEYKZeMEW5iXUBkWNffn8i- zFlYKlu=4YJwjrr=pPh@2C6Y{Qi$G1O<#42I#Z-vg@)ZWCYO`(e9>gLsdlk+`-E2u(yC+)9U!9 z*F`od|4Az>AP4gR-$FmKF@-?VGy$8WvUA5B$DP8R#a+N%#$7#2gviy+70m5bxAP~v zf=@x}AgDVxv5S;$sp%`{{9@x5w)w~A|2+e;{-3)2aUHH|?t1Q4?k?^D83|6}P7ZrO zWK!Js3iDGO`l`|{OMnWRciJ^2CEiv8d;Kp~H%BP)|BQG1ln(SITI8P^NL=!i_?6Wk z&n$SilMMimjd6M2LkO2AHs`cvg3Kua0-yy@CO2f<6xnT@7Rg3b(I2u|3FEJ$%~c=>-+sb*EC4h literal 0 HcmV?d00001 diff --git a/src/UserGuide/Master/Tree/API/Programming-OPC-UA_timecho.md b/src/UserGuide/Master/Tree/API/Programming-OPC-UA_timecho.md index 80b5446b9..7d139aea2 100644 --- a/src/UserGuide/Master/Tree/API/Programming-OPC-UA_timecho.md +++ b/src/UserGuide/Master/Tree/API/Programming-OPC-UA_timecho.md @@ -61,22 +61,22 @@ CREATE PIPE p1 #### 2.1.2 Parameters -| **Parameter** | **Description** | **Value Range** | **Required** | **Default Value** | -| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |-------------------------------------------------------------------------------------------------------------------------------------| -------------------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| sink | OPC UA SINK | String: opc-ua-sink | Required | | -| sink.opcua.model | OPC UA operational mode | String: client-server / pub-sub | Optional | client-server | -| sink.opcua.tcp.port | OPC UA TCP port | Integer: [0, 65536] | Optional | 12686 | -| sink.opcua.https.port | OPC UA HTTPS port | Integer: [0, 65536] | Optional | 8443 | -| sink.opcua.security.dir | OPC UA key and certificate directory | String: Path (supports absolute/relative paths) | Optional | 1. `opc_security` folder under IoTDB's DataNode conf directory `/`. 2. User home directory's `iotdb_opc_security` folder `/` if no IoTDB conf directory exists (e.g., when starting DataNode in IDEA) | +| **Parameter** | **Description** | **Value Range** | **Required** | **Default Value** | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |-------------------------------------------------------------------------------------------------------------------------------------| -------------------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| sink | OPC UA SINK | String: opc-ua-sink | Required | | +| sink.opcua.model | OPC UA operational mode | String: client-server / pub-sub | Optional | client-server | +| sink.opcua.tcp.port | OPC UA TCP port | Integer: [0, 65536] | Optional | 12686 | +| sink.opcua.https.port | OPC UA HTTPS port | Integer: [0, 65536] | Optional | 8443 | +| sink.opcua.security.dir | OPC UA key and certificate directory | String: Path (supports absolute/relative paths) | Optional | 1. `opc_security` folder under IoTDB's DataNode conf directory `/`. 2. User home directory's `iotdb_opc_security` folder `/` if no IoTDB conf directory exists (e.g., when starting DataNode in IDEA) | | opcua.security-policy | Security policy used for OPC UA connections (case-insensitive). Multiple policies can be configured and separated by commas. After configuring one policy, clients can only connect using that policy. Default implementation supports `None` and `Basic256Sha256`. Should be set to a non-`None` policy by default. `None` policy is only for debugging (convenient but insecure; not recommended for production). Note: Supported since V2.0.8, only for client-server mode. | String (security level increases):`None`,`Basic128Rsa15`,`Basic256`,`Basic256Sha256`,`Aes128_Sha256_RsaOaep`,`Aes256_Sha256_RsaPss` | Optional | `Basic256Sha256,Aes128_Sha256_RsaOaep,Aes256_Sha256_RsaPss` | -| sink.opcua.enable-anonymous-access | Whether OPC UA allows anonymous access | Boolean | Optional | true | -| sink.user | User (OPC UA allowed user) | String | Optional | root | -| sink.password | Password (OPC UA allowed password) | String | Optional | TimechoDB@2021 (Default was 'root' before V2.0.6.x) | +| sink.opcua.enable-anonymous-access | Whether OPC UA allows anonymous access | Boolean | Optional | true | +| sink.user | User (OPC UA allowed user) | String | Optional | root | +| sink.password | Password (OPC UA allowed password) | String | Optional | TimechoDB@2021 (Default was 'root' before V2.0.6.x) | | opcua.with-quality | Whether OPC UA publishes data in value + quality mode. When enabled, system processes data as follows:1. Both value and quality present → Push directly to OPC UA Server.2. Only value present → Quality automatically filled as UNCERTAIN (default, configurable).3. Only quality present → Ignore write (no processing).4. Non-value/quality fields present → Ignore data and log warning (configurable log frequency to avoid high-frequency interference).5. Quality type restriction: Only boolean type supported (true = GOOD, false = BAD).**Note**: Supported since V2.0.8, only for client-server mode | Boolean | Optional | false | -| opcua.value-name | Effective when `with-quality` = true, specifies the name of the value point. **Note**: Supported since V2.0.8, only for client-server mode | String | Optional | value | -| opcua.quality-name | Effective when `with-quality` = true, specifies the name of the quality point. **Note**: Supported since V2.0.8, only for client-server mode | String | Optional | quality | -| opcua.default-quality | When no quality is provided, specify `GOOD`/`UNCERTAIN`/`BAD` via SQL parameter. **Note**: Supported since V2.0.8, only for client-server mode | String: `GOOD`/`UNCERTAIN`/`BAD` | Optional | `UNCERTAIN` | -| opcua.timeout-seconds | Client connection timeout in seconds (effective only when IoTDB acts as client). **Note**: Supported since V2.0.8, only for client-server mode | Long | Optional | 10L | +| opcua.value-name | Effective when `with-quality` = true, specifies the name of the value point. **Note**: Supported since V2.0.8, only for client-server mode | String | Optional | value | +| opcua.quality-name | Effective when `with-quality` = true, specifies the name of the quality point. **Note**: Supported since V2.0.8, only for client-server mode | String | Optional | quality | +| opcua.default-quality | When no quality is provided, specify `GOOD`/`UNCERTAIN`/`BAD` via SQL parameter. **Note**: Supported since V2.0.8, only for client-server mode | String: `GOOD`/`UNCERTAIN`/`BAD` | Optional | `UNCERTAIN` | +| opcua.timeout-seconds | Client connection timeout in seconds (effective only when IoTDB acts as client). **Note**: Supported since V2.0.8, only for client-server mode | Long | Optional | 10L | #### 2.1.3 Example @@ -110,12 +110,13 @@ In this mode, IoTDB's stream processing engine establishes a connection with the 2. Install UAExpert and configure certificate information. ##### 2.2.1.2 Quick Start - +###### 2.2.1.2.1 Scenarios Supporting the None Security Policy 1. Start OPC UA service using SQL (detailed syntax see [IoTDB OPC Server Syntax](./Programming-OPC-UA_timecho.md#_2-1-语法)): ```SQL -CREATE PIPE p1 WITH SINK ('sink'='opc-ua-sink'); +create pipe p1 with sink ('sink'='opc-ua-sink', 'opcua.security-policy'='AES128_SHA256_RSAOAEP, AES256_SHA256_RSAPSS, BASIC256SHA256, NONE'); ``` +Note: Since version V2.0.8.1, None is no longer supported by default. To use it, you must manually enable it via the security-policy parameter as shown above. 2. Write some data: @@ -124,9 +125,70 @@ INSERT INTO root.test.db(time, s2) VALUES(NOW(), 2); ``` 3. Configure UAExpert to connect to IoTDB (password matches `sink.password` configured above, e.g., root/TimechoDB@2021): + + ::: center + + + + ::: + + ::: center + + + + ::: + 4. Trust the server certificate, then view written data under Objects folder on the left: + + ::: center + + + + ::: + + ::: center + + + + ::: + + Note: Since the SecurityPolicy is set to None, mutual certificate trust is not required. For production environments, it is recommended to use a non-None SecurityPolicy for connection, which requires mutual certificate trust. For operations, refer to the Pub/Sub mode section below. In the Client/Server certificate directory (search for the keyword keyStore in the printed logs), move the contents in reject to trusted/certs. Follow the sequence: connect → move server directory → connect → move client directory → connect. + + 5. Drag left nodes to the middle to display latest value: + ::: center + + + + ::: + +###### 2.2.1.2.2 Scenarios Not Supporting the None Security Policy +1. Use the following SQL to create and start the OPC UA service. + ```SQL + create pipe p1 with sink ('sink'='opc-ua-sink'); + ``` + + Note: Since version V2.0.8.1, OpcUaSink no longer supports None mode by default for security considerations. + +2. Insert some test data. + ```SQL + insert into root.test.db(time, s2) values(now(), 2); + ``` + +3. Configure the IoTDB connection in UAExpert: + + - Do not access the URL directly; endpoints must be discovered using the Discover method + - The client first sends a GetEndpoints request with the None policy to retrieve the endpoint list + - It then selects the corresponding encrypted endpoint based on the configured Basic256Sha256 + SignAndEncrypt to establish an encrypted connection + + ![](/img/opc-ua-un-none-1.png) + +4. Use the same username and password configuration as above. After selecting the relevant connection mode (Sign / Sign & Encrypt), if the following prompt appears, click Ignore to connect directly. + + ![](/img/opc-ua-un-none-2.png) + + #### 2.2.2 Pub/Sub Mode In this mode, IoTDB's stream processing engine sends data change events to the OPC UA Server (Server) via OPC UA Sink. These events are published to the server's message queue and managed via Event Nodes. Other OPC UA clients (Clients) can subscribe to these Event Nodes to receive notifications when data changes. diff --git a/src/UserGuide/V1.3.x/API/Programming-OPC-UA_timecho.md b/src/UserGuide/V1.3.x/API/Programming-OPC-UA_timecho.md index 31890ac50..5cca37d1c 100644 --- a/src/UserGuide/V1.3.x/API/Programming-OPC-UA_timecho.md +++ b/src/UserGuide/V1.3.x/API/Programming-OPC-UA_timecho.md @@ -92,13 +92,16 @@ In this mode, IoTDB's stream processing engine establishes a connection with the 2. Install UAExpert and fill in your own certificate information. #### Quick Start +##### Scenarios Supporting the None Security Policy 1. Use the following SQL to create and start the OPC UA Sink in client-server mode. For detailed syntax, please refer to: [IoTDB OPC Server Syntax](#syntax) ```sql - create pipe p1 with sink ('sink'='opc-ua-sink'); + create pipe p1 with sink ('sink'='opc-ua-sink', 'opcua.security-policy'='AES128_SHA256_RSAOAEP, AES256_SHA256_RSAPSS, BASIC256SHA256, NONE'); ``` + Note: Since version V1.3.7.2, None is no longer supported by default. To use it, you must manually enable it via the security-policy parameter as shown above. + 2. Write some data. ```sql @@ -135,6 +138,9 @@ In this mode, IoTDB's stream processing engine establishes a connection with the ::: + Note: Since the SecurityPolicy is set to None, mutual certificate trust is not required. For production environments, it is recommended to use a non-None SecurityPolicy for connection, which requires mutual certificate trust. For operations, refer to the Pub/Sub mode section below. In the Client/Server certificate directory (search for the keyword keyStore in the printed logs), move the contents in reject to trusted/certs. Follow the sequence: connect → move server directory → connect → move client directory → connect. + + 5. You can drag the node on the left to the center and display the latest value of that node: ::: center @@ -143,6 +149,32 @@ In this mode, IoTDB's stream processing engine establishes a connection with the ::: +##### Scenarios Not Supporting the None Security Policy +1. Use the following SQL to create and start the OPC UA service. + ```SQL + create pipe p1 with sink ('sink'='opc-ua-sink'); + ``` + + Note: Since version V1.3.7.2, OpcUaSink no longer supports None mode by default for security considerations. + +2. Insert some test data. + ```SQL + insert into root.test.db(time, s2) values(now(), 2); + ``` + +3. Configure the IoTDB connection in UAExpert: + + - Do not access the URL directly; endpoints must be discovered using the Discover method + - The client first sends a GetEndpoints request with the None policy to retrieve the endpoint list + - It then selects the corresponding encrypted endpoint based on the configured Basic256Sha256 + SignAndEncrypt to establish an encrypted connection + + ![](/img/opc-ua-un-none-1.png) + +4. Use the same username and password configuration as above. After selecting the relevant connection mode (Sign / Sign & Encrypt), if the following prompt appears, click Ignore to connect directly. + + ![](/img/opc-ua-un-none-2.png) + + ### Pub / Sub Mode In this mode, IoTDB's stream processing engine sends data change events to the OPC UA Server through an OPC UA Sink. These events are published to the server's message queue and managed through Event Nodes. Other OPC UA Clients can subscribe to these Event Nodes to receive notifications upon data changes. diff --git a/src/UserGuide/dev-1.3/API/Programming-OPC-UA_timecho.md b/src/UserGuide/dev-1.3/API/Programming-OPC-UA_timecho.md index 31890ac50..5cca37d1c 100644 --- a/src/UserGuide/dev-1.3/API/Programming-OPC-UA_timecho.md +++ b/src/UserGuide/dev-1.3/API/Programming-OPC-UA_timecho.md @@ -92,13 +92,16 @@ In this mode, IoTDB's stream processing engine establishes a connection with the 2. Install UAExpert and fill in your own certificate information. #### Quick Start +##### Scenarios Supporting the None Security Policy 1. Use the following SQL to create and start the OPC UA Sink in client-server mode. For detailed syntax, please refer to: [IoTDB OPC Server Syntax](#syntax) ```sql - create pipe p1 with sink ('sink'='opc-ua-sink'); + create pipe p1 with sink ('sink'='opc-ua-sink', 'opcua.security-policy'='AES128_SHA256_RSAOAEP, AES256_SHA256_RSAPSS, BASIC256SHA256, NONE'); ``` + Note: Since version V1.3.7.2, None is no longer supported by default. To use it, you must manually enable it via the security-policy parameter as shown above. + 2. Write some data. ```sql @@ -135,6 +138,9 @@ In this mode, IoTDB's stream processing engine establishes a connection with the ::: + Note: Since the SecurityPolicy is set to None, mutual certificate trust is not required. For production environments, it is recommended to use a non-None SecurityPolicy for connection, which requires mutual certificate trust. For operations, refer to the Pub/Sub mode section below. In the Client/Server certificate directory (search for the keyword keyStore in the printed logs), move the contents in reject to trusted/certs. Follow the sequence: connect → move server directory → connect → move client directory → connect. + + 5. You can drag the node on the left to the center and display the latest value of that node: ::: center @@ -143,6 +149,32 @@ In this mode, IoTDB's stream processing engine establishes a connection with the ::: +##### Scenarios Not Supporting the None Security Policy +1. Use the following SQL to create and start the OPC UA service. + ```SQL + create pipe p1 with sink ('sink'='opc-ua-sink'); + ``` + + Note: Since version V1.3.7.2, OpcUaSink no longer supports None mode by default for security considerations. + +2. Insert some test data. + ```SQL + insert into root.test.db(time, s2) values(now(), 2); + ``` + +3. Configure the IoTDB connection in UAExpert: + + - Do not access the URL directly; endpoints must be discovered using the Discover method + - The client first sends a GetEndpoints request with the None policy to retrieve the endpoint list + - It then selects the corresponding encrypted endpoint based on the configured Basic256Sha256 + SignAndEncrypt to establish an encrypted connection + + ![](/img/opc-ua-un-none-1.png) + +4. Use the same username and password configuration as above. After selecting the relevant connection mode (Sign / Sign & Encrypt), if the following prompt appears, click Ignore to connect directly. + + ![](/img/opc-ua-un-none-2.png) + + ### Pub / Sub Mode In this mode, IoTDB's stream processing engine sends data change events to the OPC UA Server through an OPC UA Sink. These events are published to the server's message queue and managed through Event Nodes. Other OPC UA Clients can subscribe to these Event Nodes to receive notifications upon data changes. diff --git a/src/UserGuide/latest/API/Programming-OPC-UA_timecho.md b/src/UserGuide/latest/API/Programming-OPC-UA_timecho.md index 149f989e1..7d139aea2 100644 --- a/src/UserGuide/latest/API/Programming-OPC-UA_timecho.md +++ b/src/UserGuide/latest/API/Programming-OPC-UA_timecho.md @@ -110,12 +110,13 @@ In this mode, IoTDB's stream processing engine establishes a connection with the 2. Install UAExpert and configure certificate information. ##### 2.2.1.2 Quick Start - +###### 2.2.1.2.1 Scenarios Supporting the None Security Policy 1. Start OPC UA service using SQL (detailed syntax see [IoTDB OPC Server Syntax](./Programming-OPC-UA_timecho.md#_2-1-语法)): ```SQL -CREATE PIPE p1 WITH SINK ('sink'='opc-ua-sink'); +create pipe p1 with sink ('sink'='opc-ua-sink', 'opcua.security-policy'='AES128_SHA256_RSAOAEP, AES256_SHA256_RSAPSS, BASIC256SHA256, NONE'); ``` +Note: Since version V2.0.8.1, None is no longer supported by default. To use it, you must manually enable it via the security-policy parameter as shown above. 2. Write some data: @@ -124,9 +125,70 @@ INSERT INTO root.test.db(time, s2) VALUES(NOW(), 2); ``` 3. Configure UAExpert to connect to IoTDB (password matches `sink.password` configured above, e.g., root/TimechoDB@2021): + + ::: center + + + + ::: + + ::: center + + + + ::: + 4. Trust the server certificate, then view written data under Objects folder on the left: + + ::: center + + + + ::: + + ::: center + + + + ::: + + Note: Since the SecurityPolicy is set to None, mutual certificate trust is not required. For production environments, it is recommended to use a non-None SecurityPolicy for connection, which requires mutual certificate trust. For operations, refer to the Pub/Sub mode section below. In the Client/Server certificate directory (search for the keyword keyStore in the printed logs), move the contents in reject to trusted/certs. Follow the sequence: connect → move server directory → connect → move client directory → connect. + + 5. Drag left nodes to the middle to display latest value: + ::: center + + + + ::: + +###### 2.2.1.2.2 Scenarios Not Supporting the None Security Policy +1. Use the following SQL to create and start the OPC UA service. + ```SQL + create pipe p1 with sink ('sink'='opc-ua-sink'); + ``` + + Note: Since version V2.0.8.1, OpcUaSink no longer supports None mode by default for security considerations. + +2. Insert some test data. + ```SQL + insert into root.test.db(time, s2) values(now(), 2); + ``` + +3. Configure the IoTDB connection in UAExpert: + + - Do not access the URL directly; endpoints must be discovered using the Discover method + - The client first sends a GetEndpoints request with the None policy to retrieve the endpoint list + - It then selects the corresponding encrypted endpoint based on the configured Basic256Sha256 + SignAndEncrypt to establish an encrypted connection + + ![](/img/opc-ua-un-none-1.png) + +4. Use the same username and password configuration as above. After selecting the relevant connection mode (Sign / Sign & Encrypt), if the following prompt appears, click Ignore to connect directly. + + ![](/img/opc-ua-un-none-2.png) + + #### 2.2.2 Pub/Sub Mode In this mode, IoTDB's stream processing engine sends data change events to the OPC UA Server (Server) via OPC UA Sink. These events are published to the server's message queue and managed via Event Nodes. Other OPC UA clients (Clients) can subscribe to these Event Nodes to receive notifications when data changes. diff --git a/src/zh/UserGuide/Master/Tree/API/Programming-OPC-UA_timecho.md b/src/zh/UserGuide/Master/Tree/API/Programming-OPC-UA_timecho.md index cb545a4d1..f53d8d036 100644 --- a/src/zh/UserGuide/Master/Tree/API/Programming-OPC-UA_timecho.md +++ b/src/zh/UserGuide/Master/Tree/API/Programming-OPC-UA_timecho.md @@ -61,22 +61,22 @@ create pipe p1 #### 2.1.2 参数 -| **参数** | **描述** | **取值范围** | **是否必填** | **默认值** | -| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |------------------------------------------------------------------------------------------------------------------------------------------| -------------------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| sink | OPC UA SINK | String: opc-ua-sink | 必填 | | -| sink.opcua.model | OPC UA 使用的模式 | String: client-server / pub-sub | 选填 | client-server | -| sink.opcua.tcp.port | OPC UA 的 TCP 端口 | Integer: [0, 65536] | 选填 | 12686 | -| sink.opcua.https.port | OPC UA 的 HTTPS 端口 | Integer: [0, 65536] | 选填 | 8443 | -| sink.opcua.security.dir | OPC UA 的密钥及证书目录 | String: Path,支持绝对及相对目录 | 选填 | 1. iotdb 相关 DataNode 的 conf 目录下的 `opc_security` 文件夹 `/`。2. 如无 iotdb 的 conf 目录(例如 IDEA 中启动 DataNode),则为用户主目录下的 `iotdb_opc_security` 文件夹 `/` | -| opcua.security-policy | OPC UA 连接使用的安全策略,不区分大小写。可以配置多个,用`,`连接。配置一个安全策略后,client 才能用对应的策略连接。当前实现默认支持`None`和`Basic256Sha256`策略,应该默认改为任意的非`None`策略,`None`策略在调试环境中单独配置,因为`None`策略虽然不需移动证书,操作方便,但是不安全,生产环境的 server 不建议支持该策略。注意:V2.0.8 起支持该参数,且仅支持 client-server 模式 | String(安全性依次递增):
`None`
`Basic128Rsa15`
`Basic256`
`Basic256Sha256`
`Aes128_Sha256_RsaOaep`
`Aes256_Sha256_RsaPss` | 选填| `Basic256Sha256`,`Aes128_Sha256_RsaOaep`,`lAes256_Sha256_RsaPss` | -| sink.opcua.enable-anonymous-access | OPC UA 是否允许匿名访问 | Boolean | 选填 | true | -| sink.user | 用户,这里指 OPC UA 的允许用户 | String | 选填 | root | -| sink.password | 密码,这里指 OPC UA 的允许密码 | String | 选填 | TimechoDB@2021(V2.0.6.x 之前默认密码为root) | +| **参数** | **描述** | **取值范围** | **是否必填** | **默认值** | +| ------------------------------------ |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------| -------------------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| sink | OPC UA SINK | String: opc-ua-sink | 必填 | | +| sink.opcua.model | OPC UA 使用的模式 | String: client-server / pub-sub | 选填 | client-server | +| sink.opcua.tcp.port | OPC UA 的 TCP 端口 | Integer: [0, 65536] | 选填 | 12686 | +| sink.opcua.https.port | OPC UA 的 HTTPS 端口 | Integer: [0, 65536] | 选填 | 8443 | +| sink.opcua.security.dir | OPC UA 的密钥及证书目录 | String: Path,支持绝对及相对目录 | 选填 | 1. iotdb 相关 DataNode 的 conf 目录下的 `opc_security` 文件夹 `/`。2. 如无 iotdb 的 conf 目录(例如 IDEA 中启动 DataNode),则为用户主目录下的 `iotdb_opc_security` 文件夹 `/` | +| opcua.security-policy | OPC UA 连接使用的安全策略,不区分大小写。可以配置多个,用`,`连接。配置一个安全策略后,client 才能用对应的策略连接。当前实现默认支持`None`和`Basic256Sha256`策略,应该默认改为任意的非`None`策略,`None`策略在调试环境中单独配置,因为`None`策略虽然不需移动证书,操作方便,但是不安全,生产环境的 server 不建议支持该策略。注意:V2.0.8 起支持该参数,且仅支持 client-server 模式 | String(安全性依次递增):
`None`
`Basic128Rsa15`
`Basic256`
`Basic256Sha256`
`Aes128_Sha256_RsaOaep`
`Aes256_Sha256_RsaPss` | 选填| `Basic256Sha256`,`Aes128_Sha256_RsaOaep`,`lAes256_Sha256_RsaPss` | +| sink.opcua.enable-anonymous-access | OPC UA 是否允许匿名访问 | Boolean | 选填 | true | +| sink.user | 用户,这里指 OPC UA 的允许用户 | String | 选填 | root | +| sink.password | 密码,这里指 OPC UA 的允许密码 | String | 选填 | TimechoDB@2021(V2.0.6.x 之前默认密码为root) | | opcua.with-quality | OPC UA 的测点发布是否为 value + quality 模式。启用配置后,系统将按以下规则处理写入数据:
1. 同时包含 value 和 quality,则直接推送至 OPC UA Server。
2. 仅包含 value,则 quality 自动填充为 UNCERTAIN(默认值,支持自定义配置)。
3. 仅包含 quality,则该写入被忽略,不进行任何处理。
4. 包含非 value/quality 字段,则忽略该数据,并记录警告日志(日志频率可配置,避免高频干扰)。
5. quality 类型限制:目前仅支持布尔类型(true 表示 GOOD,false 表示 BAD); 注意:V2.0.8 起支持该参数,且仅支持 client-server 模式 | Boolean | 选填 | false | -| opcua.value-name | With-quality 为 true 时生效,表示 value 测点的名字。 注意:V2.0.8 起支持该参数,且仅支持 client-server 模式 | String | 选填 | value | -| opcua.quality-name | With-quality 为 true 时生效,表示 quality 测点的名字。 注意:V2.0.8 起支持该参数,且仅支持 client-server 模式 | String | 选填 | quality | -| opcua.default-quality | 没有 quality 时,可以通过 SQL 参数指定`GOOD`/`UNCERTAIN`/`BAD`。 注意:V2.0.8 起支持该参数,且仅支持 client-server 模式 | String:`GOOD`/`UNCERTAIN`/`BAD` | 选填 | `UNCERTAIN` | -| opcua.timeout-seconds | Client 连接 server 的超时秒数,仅在 IoTDB 为 client 时生效 注意:V2.0.8 起支持该参数,且仅支持 client-server 模式 | Long | 选填 | 10L | +| opcua.value-name | With-quality 为 true 时生效,表示 value 测点的名字。 注意:V2.0.8 起支持该参数,且仅支持 client-server 模式 | String | 选填 | value | +| opcua.quality-name | With-quality 为 true 时生效,表示 quality 测点的名字。 注意:V2.0.8 起支持该参数,且仅支持 client-server 模式 | String | 选填 | quality | +| opcua.default-quality | 没有 quality 时,可以通过 SQL 参数指定`GOOD`/`UNCERTAIN`/`BAD`。 注意:V2.0.8 起支持该参数,且仅支持 client-server 模式 | String:`GOOD`/`UNCERTAIN`/`BAD` | 选填 | `UNCERTAIN` | +| opcua.timeout-seconds | Client 连接 server 的超时秒数,仅在 IoTDB 为 client 时生效 注意:V2.0.8 起支持该参数,且仅支持 client-server 模式 | Long | 选填 | 10L | #### 2.1.3 示例 @@ -107,16 +107,18 @@ start pipe p1; 2. 安装 UAExpert,填写自身的证书等信息。 ##### 2.2.1.2 快速开始 +###### 2.2.1.2.1 支持 None 安全策略的场景 1. 使用如下 sql,启动 OPC UA 服务。详细语法参见上文:[IoTDB OPC Server语法](./Programming-OPC-UA_timecho.md#_2-1-语法) ```SQL -create pipe p1 with sink ('sink'='opc-ua-sink'); +create pipe p1 with sink ('sink'='opc-ua-sink', 'opcua.security-policy'='AES128_SHA256_RSAOAEP, AES256_SHA256_RSAPSS, BASIC256SHA256, NONE'); ``` +注意:在 2.0.8.1 及以上版本中,默认不再支持 `None`,如需使用必须通过 `security-policy` 参数手动开启,如上所示。 2. 写入部分数据。 ```SQL -insert into root.test.db(time, s2) values(now(), 2) +insert into root.test.db(time, s2) values(now(), 2); ``` 3. 在 UAExpert 中配置 iotdb 的连接,其中 password 填写为上述参数配置中 sink.password 中设定的密码(此处用户名、密码以2.3小节示例中配置的 root/root 为例): @@ -139,12 +141,37 @@ insert into root.test.db(time, s2) values(now(), 2) +注意:由于此处配置的 `SecurityPolicy` 为 `None`,因此不需要相互信任证书。生产环境建议使用非 `None` 的 `SecurityPolicy` 进行连接,此时需要相互信任证书,操作步骤可以见下文 `Pub/Sub` 模式,在 `Client/Server` 的证书目录下(可以在打印的日志中找 keyStore 关键词),将 reject 的内容挪到 `trusted/certs`下即可,采用连接、移动 server 目录、连接、移动 client 目录、连接的顺序。 + 5. 可以将左侧节点拖动到中间,并展示该节点的最新值:
+###### 2.2.1.2.2 不支持 None 安全策略的场景 +1. 使用如下 sql,创建并启动 OPC UA 服务。 + ```SQL + create pipe p1 with sink ('sink'='opc-ua-sink'); + ``` + 注意:从 2.0.8.1 版本开始,`OpcUaSink` 出于安全考虑,默认不再支持 `None` 模式。 + +2. 写入部分数据。 + ```SQL + insert into root.test.db(time, s2) values(now(), 2); + ``` + +3. 在 UAExpert 中配置 IoTDB 连接: + - 不可直接访问 `URL`,必须通过 `Discover` 方式发现端点 + - 客户端会先使用 `None` 策略发送 `GetEndpoints` 请求获取端点列表 + - 再根据配置的 `Basic256Sha256 + SignAndEncrypt` 选择对应加密端点建立加密连接 + +![](/img/opc-ua-un-none-1.png) + +4. 用户名密码配置同上,点击相关的连接模式后(`Sign` / `Sign & Encrypt`),如果出现以下内容,点 `Ignore` 直接连。 + +![](/img/opc-ua-un-none-2.png) + #### 2.2.2 Pub / Sub 模式 在这种模式下,IoTDB的流处理引擎通过 OPC UA Sink 向OPC UA 服务器(Server)发送数据变更事件。这些事件被发布到服务器的消息队列中,并通过事件节点 (Event Node) 进行管理。其他OPC UA客户端(Client)可以订阅这些事件节点,以便在数据变更时接收通知。 diff --git a/src/zh/UserGuide/V1.3.x/API/Programming-OPC-UA_timecho.md b/src/zh/UserGuide/V1.3.x/API/Programming-OPC-UA_timecho.md index 917b211ee..6661ae168 100644 --- a/src/zh/UserGuide/V1.3.x/API/Programming-OPC-UA_timecho.md +++ b/src/zh/UserGuide/V1.3.x/API/Programming-OPC-UA_timecho.md @@ -93,12 +93,13 @@ start pipe p1; 2. 安装 UAExpert,填写自身的证书等信息。 #### 快速开始 - +##### 支持 None 安全策略的场景 1. 使用如下 sql,创建并启动 client-server 模式的 OPC UA Sink。详细语法参见上文:[IoTDB OPC Server语法](#语法) ```SQL -create pipe p1 with sink ('sink'='opc-ua-sink'); +create pipe p1 with sink ('sink'='opc-ua-sink', 'opcua.security-policy'='AES128_SHA256_RSAOAEP, AES256_SHA256_RSAPSS, BASIC256SHA256, NONE'); ``` +注意:在 V1.3.7.2 及以上版本中,默认不再支持 `None`,如需使用必须通过 `security-policy` 参数手动开启,如上所示。 2. 写入部分数据。 @@ -106,7 +107,7 @@ create pipe p1 with sink ('sink'='opc-ua-sink'); insert into root.test.db(time, s2) values(now(), 2) ``` -​ 此处自动创建元数据开启。 +此处自动创建元数据开启。 3. 在 UAExpert 中配置 iotdb 的连接,其中 password 填写为上述参数配置中 sink.password 中设定的密码(此处以默认密码root为例): @@ -128,12 +129,37 @@ insert into root.test.db(time, s2) values(now(), 2) +注意:由于此处配置的 `SecurityPolicy` 为 `None`,因此不需要相互信任证书。生产环境建议使用非 `None` 的 `SecurityPolicy` 进行连接,此时需要相互信任证书,操作步骤可以见下文 `Pub/Sub` 模式,在 `Client/Server` 的证书目录下(可以在打印的日志中找 keyStore 关键词),将 reject 的内容挪到 `trusted/certs`下即可,采用连接、移动 server 目录、连接、移动 client 目录、连接的顺序。 + 5. 可以将左侧节点拖动到中间,并展示该节点的最新值:
+##### 不支持 None 安全策略的场景 +1. 使用如下 sql,创建并启动 OPC UA 服务。 + ```SQL + create pipe p1 with sink ('sink'='opc-ua-sink'); + ``` + 注意:从 V1.3.7.2 版本开始,`OpcUaSink` 出于安全考虑,默认不再支持 `None` 模式。 + +2. 写入部分数据。 + ```SQL + insert into root.test.db(time, s2) values(now(), 2); + ``` + +3. 在 UAExpert 中配置 IoTDB 连接: + - 不可直接访问 `URL`,必须通过 `Discover` 方式发现端点 + - 客户端会先使用 `None` 策略发送 `GetEndpoints` 请求获取端点列表 + - 再根据配置的 `Basic256Sha256 + SignAndEncrypt` 选择对应加密端点建立加密连接 + +![](/img/opc-ua-un-none-1.png) + +4. 用户名密码配置同上,点击相关的连接模式后(`Sign` / `Sign & Encrypt`),如果出现以下内容,点 `Ignore` 直接连。 + +![](/img/opc-ua-un-none-2.png) + ### Pub / Sub 模式 在这种模式下,IoTDB的流处理引擎通过 OPC UA Sink 向OPC UA 服务器(Server)发送数据变更事件。这些事件被发布到服务器的消息队列中,并通过事件节点 (Event Node) 进行管理。其他OPC UA客户端(Client)可以订阅这些事件节点,以便在数据变更时接收通知。 diff --git a/src/zh/UserGuide/dev-1.3/API/Programming-OPC-UA_timecho.md b/src/zh/UserGuide/dev-1.3/API/Programming-OPC-UA_timecho.md index 917b211ee..6661ae168 100644 --- a/src/zh/UserGuide/dev-1.3/API/Programming-OPC-UA_timecho.md +++ b/src/zh/UserGuide/dev-1.3/API/Programming-OPC-UA_timecho.md @@ -93,12 +93,13 @@ start pipe p1; 2. 安装 UAExpert,填写自身的证书等信息。 #### 快速开始 - +##### 支持 None 安全策略的场景 1. 使用如下 sql,创建并启动 client-server 模式的 OPC UA Sink。详细语法参见上文:[IoTDB OPC Server语法](#语法) ```SQL -create pipe p1 with sink ('sink'='opc-ua-sink'); +create pipe p1 with sink ('sink'='opc-ua-sink', 'opcua.security-policy'='AES128_SHA256_RSAOAEP, AES256_SHA256_RSAPSS, BASIC256SHA256, NONE'); ``` +注意:在 V1.3.7.2 及以上版本中,默认不再支持 `None`,如需使用必须通过 `security-policy` 参数手动开启,如上所示。 2. 写入部分数据。 @@ -106,7 +107,7 @@ create pipe p1 with sink ('sink'='opc-ua-sink'); insert into root.test.db(time, s2) values(now(), 2) ``` -​ 此处自动创建元数据开启。 +此处自动创建元数据开启。 3. 在 UAExpert 中配置 iotdb 的连接,其中 password 填写为上述参数配置中 sink.password 中设定的密码(此处以默认密码root为例): @@ -128,12 +129,37 @@ insert into root.test.db(time, s2) values(now(), 2) +注意:由于此处配置的 `SecurityPolicy` 为 `None`,因此不需要相互信任证书。生产环境建议使用非 `None` 的 `SecurityPolicy` 进行连接,此时需要相互信任证书,操作步骤可以见下文 `Pub/Sub` 模式,在 `Client/Server` 的证书目录下(可以在打印的日志中找 keyStore 关键词),将 reject 的内容挪到 `trusted/certs`下即可,采用连接、移动 server 目录、连接、移动 client 目录、连接的顺序。 + 5. 可以将左侧节点拖动到中间,并展示该节点的最新值:
+##### 不支持 None 安全策略的场景 +1. 使用如下 sql,创建并启动 OPC UA 服务。 + ```SQL + create pipe p1 with sink ('sink'='opc-ua-sink'); + ``` + 注意:从 V1.3.7.2 版本开始,`OpcUaSink` 出于安全考虑,默认不再支持 `None` 模式。 + +2. 写入部分数据。 + ```SQL + insert into root.test.db(time, s2) values(now(), 2); + ``` + +3. 在 UAExpert 中配置 IoTDB 连接: + - 不可直接访问 `URL`,必须通过 `Discover` 方式发现端点 + - 客户端会先使用 `None` 策略发送 `GetEndpoints` 请求获取端点列表 + - 再根据配置的 `Basic256Sha256 + SignAndEncrypt` 选择对应加密端点建立加密连接 + +![](/img/opc-ua-un-none-1.png) + +4. 用户名密码配置同上,点击相关的连接模式后(`Sign` / `Sign & Encrypt`),如果出现以下内容,点 `Ignore` 直接连。 + +![](/img/opc-ua-un-none-2.png) + ### Pub / Sub 模式 在这种模式下,IoTDB的流处理引擎通过 OPC UA Sink 向OPC UA 服务器(Server)发送数据变更事件。这些事件被发布到服务器的消息队列中,并通过事件节点 (Event Node) 进行管理。其他OPC UA客户端(Client)可以订阅这些事件节点,以便在数据变更时接收通知。 diff --git a/src/zh/UserGuide/latest/API/Programming-OPC-UA_timecho.md b/src/zh/UserGuide/latest/API/Programming-OPC-UA_timecho.md index 6a7d2678b..f53d8d036 100644 --- a/src/zh/UserGuide/latest/API/Programming-OPC-UA_timecho.md +++ b/src/zh/UserGuide/latest/API/Programming-OPC-UA_timecho.md @@ -107,16 +107,18 @@ start pipe p1; 2. 安装 UAExpert,填写自身的证书等信息。 ##### 2.2.1.2 快速开始 +###### 2.2.1.2.1 支持 None 安全策略的场景 1. 使用如下 sql,启动 OPC UA 服务。详细语法参见上文:[IoTDB OPC Server语法](./Programming-OPC-UA_timecho.md#_2-1-语法) ```SQL -create pipe p1 with sink ('sink'='opc-ua-sink'); +create pipe p1 with sink ('sink'='opc-ua-sink', 'opcua.security-policy'='AES128_SHA256_RSAOAEP, AES256_SHA256_RSAPSS, BASIC256SHA256, NONE'); ``` +注意:在 2.0.8.1 及以上版本中,默认不再支持 `None`,如需使用必须通过 `security-policy` 参数手动开启,如上所示。 2. 写入部分数据。 ```SQL -insert into root.test.db(time, s2) values(now(), 2) +insert into root.test.db(time, s2) values(now(), 2); ``` 3. 在 UAExpert 中配置 iotdb 的连接,其中 password 填写为上述参数配置中 sink.password 中设定的密码(此处用户名、密码以2.3小节示例中配置的 root/root 为例): @@ -139,12 +141,37 @@ insert into root.test.db(time, s2) values(now(), 2) +注意:由于此处配置的 `SecurityPolicy` 为 `None`,因此不需要相互信任证书。生产环境建议使用非 `None` 的 `SecurityPolicy` 进行连接,此时需要相互信任证书,操作步骤可以见下文 `Pub/Sub` 模式,在 `Client/Server` 的证书目录下(可以在打印的日志中找 keyStore 关键词),将 reject 的内容挪到 `trusted/certs`下即可,采用连接、移动 server 目录、连接、移动 client 目录、连接的顺序。 + 5. 可以将左侧节点拖动到中间,并展示该节点的最新值:
+###### 2.2.1.2.2 不支持 None 安全策略的场景 +1. 使用如下 sql,创建并启动 OPC UA 服务。 + ```SQL + create pipe p1 with sink ('sink'='opc-ua-sink'); + ``` + 注意:从 2.0.8.1 版本开始,`OpcUaSink` 出于安全考虑,默认不再支持 `None` 模式。 + +2. 写入部分数据。 + ```SQL + insert into root.test.db(time, s2) values(now(), 2); + ``` + +3. 在 UAExpert 中配置 IoTDB 连接: + - 不可直接访问 `URL`,必须通过 `Discover` 方式发现端点 + - 客户端会先使用 `None` 策略发送 `GetEndpoints` 请求获取端点列表 + - 再根据配置的 `Basic256Sha256 + SignAndEncrypt` 选择对应加密端点建立加密连接 + +![](/img/opc-ua-un-none-1.png) + +4. 用户名密码配置同上,点击相关的连接模式后(`Sign` / `Sign & Encrypt`),如果出现以下内容,点 `Ignore` 直接连。 + +![](/img/opc-ua-un-none-2.png) + #### 2.2.2 Pub / Sub 模式 在这种模式下,IoTDB的流处理引擎通过 OPC UA Sink 向OPC UA 服务器(Server)发送数据变更事件。这些事件被发布到服务器的消息队列中,并通过事件节点 (Event Node) 进行管理。其他OPC UA客户端(Client)可以订阅这些事件节点,以便在数据变更时接收通知。