From 67302f9813b8af83abf9698fb5106878c261fe09 Mon Sep 17 00:00:00 2001 From: Ali Najafi <202307397@post.au.dk> Date: Thu, 3 Apr 2025 16:56:49 +0200 Subject: [PATCH] f --- ExampleForDocs.cs | 2 +- FinalClassDiagram.png | Bin 0 -> 31660 bytes SmartHome.App/Program.cs | 15 +++++-- .../net9.0/SmartHome.App.AssemblyInfo.cs | 2 +- .../SmartHome.App.AssemblyInfoInputs.cache | 2 +- ....GeneratedMSBuildEditorConfig.editorconfig | 2 +- .../Debug/net9.0/SmartHome.App.assets.cache | Bin 228 -> 228 bytes .../SmartHome.App.csproj.nuget.dgspec.json | 30 +++++++------- .../obj/SmartHome.App.csproj.nuget.g.props | 4 +- SmartHome.App/obj/project.assets.json | 16 +++---- SmartHome.App/obj/project.nuget.cache | 4 +- .../ChangeAmbientColor.cs | 1 + .../RadiatorThermostat.cs | 4 +- SmartHome.Lib/DeviceBaseClasses/Light.cs | 8 +++- SmartHome.Lib/DeviceBaseClasses/Lock.cs | 6 ++- .../DeviceBaseClasses/Thermometer.cs | 7 +++- SmartHome.Lib/HomeMediator.cs | 12 +++++- .../net9.0/SmartHome.Lib.AssemblyInfo.cs | 2 +- .../SmartHome.Lib.AssemblyInfoInputs.cache | 2 +- ....GeneratedMSBuildEditorConfig.editorconfig | 2 +- .../Debug/net9.0/SmartHome.Lib.assets.cache | Bin 228 -> 228 bytes .../SmartHome.Lib.csproj.nuget.dgspec.json | 14 +++---- .../obj/SmartHome.Lib.csproj.nuget.g.props | 4 +- SmartHome.Lib/obj/project.assets.json | 12 +++--- SmartHome.Lib/obj/project.nuget.cache | 4 +- plantuml/ExampleForDocs.puml | 2 + plantuml/SeqeunceDiagram.puml | 19 +++++++++ .../ChangeBrightness.puml | 6 +++ .../ConstantBrightness.puml | 6 +++ .../ChangeAmbientColor.puml | 6 +++ .../LightColorBehaviours/ChangeColor.puml | 6 +++ .../LockBehaviours/RotatingLock.puml | 7 ++++ .../LockBehaviours/SlidingLock.puml | 7 ++++ .../LCDDisplay.puml | 6 +++ .../LEDDisplay.puml | 6 +++ .../NoDisplay.puml | 6 +++ .../HeatPumpThermostat.puml | 7 ++++ .../RadiatorThermostat.puml | 7 ++++ .../ConcreteLights/IKE565Col.puml | 6 +++ .../ConcreteLights/PH500Amb.puml | 6 +++ .../ConcreteLocks/PhilipsLock.puml | 6 +++ .../ConcreteLocks/SamsungLock.puml | 6 +++ .../ElectroluxThermometer.puml | 6 +++ .../PhilipsThermostat.puml | 6 +++ .../DeviceBaseClasses/Light.puml | 10 +++++ .../SmartHome.Lib/DeviceBaseClasses/Lock.puml | 8 ++++ .../DeviceBaseClasses/Thermometer.puml | 8 ++++ .../DeviceBaseClasses/Thermostat.puml | 10 +++++ plantuml/SmartHome.Lib/HomeMediator.puml | 15 +++++++ .../Interfaces/IBrightnessBehaviour.puml | 4 ++ .../Interfaces/IColorBehaviour.puml | 5 +++ .../IDisplayTemperatureBehavior.puml | 4 ++ .../Interfaces/ILockBehaviour.puml | 4 ++ .../Interfaces/ISmartHomeMediator.puml | 5 +++ .../ITemperatureChangeBehavior.puml | 4 ++ plantuml/SmartHome.Lib/SmartDevice.puml | 6 +++ plantuml/include.puml | 39 ++++++++++++++++++ 57 files changed, 340 insertions(+), 64 deletions(-) create mode 100644 FinalClassDiagram.png create mode 100644 plantuml/ExampleForDocs.puml create mode 100644 plantuml/SeqeunceDiagram.puml create mode 100644 plantuml/SmartHome.Lib/Behaviours/LightBrightnessBehaviours/ChangeBrightness.puml create mode 100644 plantuml/SmartHome.Lib/Behaviours/LightBrightnessBehaviours/ConstantBrightness.puml create mode 100644 plantuml/SmartHome.Lib/Behaviours/LightColorBehaviours/ChangeAmbientColor.puml create mode 100644 plantuml/SmartHome.Lib/Behaviours/LightColorBehaviours/ChangeColor.puml create mode 100644 plantuml/SmartHome.Lib/Behaviours/LockBehaviours/RotatingLock.puml create mode 100644 plantuml/SmartHome.Lib/Behaviours/LockBehaviours/SlidingLock.puml create mode 100644 plantuml/SmartHome.Lib/Behaviours/ThermostatDisplayBehaviours/LCDDisplay.puml create mode 100644 plantuml/SmartHome.Lib/Behaviours/ThermostatDisplayBehaviours/LEDDisplay.puml create mode 100644 plantuml/SmartHome.Lib/Behaviours/ThermostatDisplayBehaviours/NoDisplay.puml create mode 100644 plantuml/SmartHome.Lib/Behaviours/ThermostatTempChangeBehaviours/HeatPumpThermostat.puml create mode 100644 plantuml/SmartHome.Lib/Behaviours/ThermostatTempChangeBehaviours/RadiatorThermostat.puml create mode 100644 plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLights/IKE565Col.puml create mode 100644 plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLights/PH500Amb.puml create mode 100644 plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLocks/PhilipsLock.puml create mode 100644 plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLocks/SamsungLock.puml create mode 100644 plantuml/SmartHome.Lib/ConcreteDevices/ConcreteThermometers/ElectroluxThermometer.puml create mode 100644 plantuml/SmartHome.Lib/ConcreteDevices/ConcreteThermostats/PhilipsThermostat.puml create mode 100644 plantuml/SmartHome.Lib/DeviceBaseClasses/Light.puml create mode 100644 plantuml/SmartHome.Lib/DeviceBaseClasses/Lock.puml create mode 100644 plantuml/SmartHome.Lib/DeviceBaseClasses/Thermometer.puml create mode 100644 plantuml/SmartHome.Lib/DeviceBaseClasses/Thermostat.puml create mode 100644 plantuml/SmartHome.Lib/HomeMediator.puml create mode 100644 plantuml/SmartHome.Lib/Interfaces/IBrightnessBehaviour.puml create mode 100644 plantuml/SmartHome.Lib/Interfaces/IColorBehaviour.puml create mode 100644 plantuml/SmartHome.Lib/Interfaces/IDisplayTemperatureBehavior.puml create mode 100644 plantuml/SmartHome.Lib/Interfaces/ILockBehaviour.puml create mode 100644 plantuml/SmartHome.Lib/Interfaces/ISmartHomeMediator.puml create mode 100644 plantuml/SmartHome.Lib/Interfaces/ITemperatureChangeBehavior.puml create mode 100644 plantuml/SmartHome.Lib/SmartDevice.puml create mode 100644 plantuml/include.puml diff --git a/ExampleForDocs.cs b/ExampleForDocs.cs index 5117233..ec99037 100644 --- a/ExampleForDocs.cs +++ b/ExampleForDocs.cs @@ -1,5 +1,5 @@ - +//This is a example from our report, it is not part of the codebase public void Notify(Device sender, string event) { if (sender == thermostat && event== "Temprature Changed") diff --git a/FinalClassDiagram.png b/FinalClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..e84f81ef1ee1c9e71147ea809dfce88f05199757 GIT binary patch literal 31660 zcmY(qbySqy_dYz-Py>i4U4jpz(ji@ffJmt*-9w0U4-HZxF(A?mA*pmDoip^n(A_a0 zT{1B6<9R;c^{(~)F>%(q*QtB&>)L1U>qNfMRG}baBm)2d6soUYz5@X8L+<`Zk^t|% zbw3Gp-2LFWy;D&Dlnpau?iz$PFEm~N0F^NEYjdKzHmUO~eK!Drvg_Xu9@44E5&-ah zq5AU0d#K6Y!i6szGG6X4&h((rcmI6<+&6vr+`we6s>G}>De<4z96#GL+=eB#)IS4W zJO;iUU97#@oOm<3HiJikpG8FyWDMO&O^uzHSeQ5{%e-7>dzYi2l`VIBiNfrbw`nf< zoeX{dJLlA<A$N_r8r+{l4?dpUl*3`P<UZxR$x#R+dzhB~zTGUx1=Du3+xE`X)Rd8# zSzS?4F=2CMWo1V)j?cL9n>Q4Ch^!cGh>wr=+j}f#1vTIr8%h@we!}y<=-*B@pFI@N z`)Gt+iC{x7G<l8Xs=&C0+Q+Asq+b)CXKEhY2KZtRhv1lz8(~b-0d$EqpO}g@@9N^9 zFoKG$pu83P%y+{m%>Nd5@f(CfheZhWZ<xD31gkR~D=lc7TbZ^6$Rr#8Hxk*<hi7IL zBMpQgN)X6WKvW+%xxculmF4fujyvD78{@xqur;`uNgWTo&}?*BQ#NSz^EPO3HaDpK z^kEYvcPm|L^joM@znW_(OHPj0pyr9gOw~W7hV^{@=QB2!-cx195_{=Rt*N3;iy319 zmmA3v!zbYsOz*U`w1DmoLK>mLn#Xu4cf0oNebI<fK0c5<Mhy-Kx!YzBMn*<;Q@>{Z zmcI#!7`a;yTZ7AupYFFeuOz+pjj+ohR6+o0=Vf`I8-L5`JKz^7&p)rC==e1cTCW@p zT6{bt{r);*w{u}=--DLqjumj0-!~J#qn>NfWBhRW{2IHdvLRLl`5KLaNN2o||0b~Q zo&DeVF6w`Z+^az9GCrptBz-qs4MYO944TcHB)wPtfRO;h<}BhM?^dq^li{sQ8<en) z=JzeQ{DELU%>jwB<c2Dk&oTuh^~_V<=*|rOGl+rz45DwUrWsQ2xX_O*(_WGC!lF00 z>ChVkbib|^kt;1NEtvDYxy!}pnY-pgzRZ}kspThuRVC7yYS~r)XII7lbwf%|Na+98 zZ)+I-w3^dqo>q5Db0Pw4NDJEzBd7anQ}N%!L$?3D)%BEyt@Ay1C+On^HddL>9(jf~ zDm5+#DWb7HE}=?|bv64emyHOwypxh)abT=pN4#kNuLz_+Zl;!X%jB|yIyTYk@_56~ z(&+zZE9=CCD&flLiKcq=Mlcg*GA7;j>U<B=pU8db-*{)L1)M6e>yU|)E!5W122Csr zf0m4|sHyiBp!m)(3W{~hWo5r6?*BbnvpraB`ORa?f_lAHG?i#W`KHNp&tT`^0Oj#g zM#^hn{jOKF2uc<oW>%GE7o!sO%XRQYPZV7>&uZuqz9bnC<ozP?5uDRv%2oY;Gu#xq z^PBC!k-*!FKpTM#0y5JzS?0zpTKIg*qFl51!rrcyS~A~|=_U5lluS^401kWY#?Kab z?Q$bDjcWap>^M_p#ZZD56L8a`)n-3e#~X-u-9u-(?%tm5-pWP0RcLYDJouT2oHgV% zDnQ7(=j%h;HAKv%iMLu3kN0)8(0WHd?S7%HU#j1q=}Ny3Qw197uEywB<cCLm_>t>L zTKfI`X8-qsJpO$_kYfUrw6i?*p$7(?4{FqeOD1B0`+0``GMD~xnPLE5*=H+OQr^dw zK+ToZHB$G)aN^-Bua$h72=DVyyv)uG57<W3@vb*Vv=~1+l8zSDPwk04#nc4e-WU;Y zV%A8<ftd;bmy7)ciE@DrHE>|>yG4foVT>D`jNWf}n?LY!ps2naUwko=AT+1};CkeO z%#`sJ%KjE>^JgU_0yEk*n)T^u&~BTN83hSbkvRKXi5BfzkGbwRJD%+)JvR(q^1m=X zC%hSGyH=C!2dZxn2dt_5tSv58mptab{Liu9<ote31R8#e-8H>Ud!Zh%ResKA1Rd(+ zCO&)>g4e^2>QCV&oc9J--V8rt2k}hK{U0{TIK6LQW`5Kj;}vB?Mc^0f?H_~(i0o>% z40{I*Zly0^L(VtnEHd%5|8GzKdz|O7+y(xi_~iN#fi)Dn>MvzBLj5r(k{YmG=m34) zqD{gs$;#LM`#&#{p}OlI1ZI^py^!4TD2epOHLq<g3i6MvB6G+!;M?(<82TrKb^dzq zP7VJ*To&&l`MY*Ra09)B;sA0gEwO?uXGyt(m|St6DdN_uNh)mN|M@HTUGKtNtYDQ! z0I}8s*aH|F?0fF(_VS=M8!dTBs*={DqsTSOi`ZR%d+q;oFr8;+hYa@s)NQuJ?+<Uh zZHBa3zkA`Vi7!<d&17Wd@fN)ux6pLc|AVW`JGd$g4w6R3NUOFU5;0#-!gH7LS*_(R zN!c=u0j9Ud`}ki0kpD2~naJ4FkQYIZV>t`c2|zMx43ZrluJ$AVeE*;q&esK|ctLK- z0L3=jqBj4Pm=>FDkDyKQr~e}(YkXV?{|E1%*TZQ_c9N-gY~}pq?EJJKXJ<!W+}l~$ zU%1TMR7(tA;;7PE)~t9l5VmHz_^3U5<V01z4W<#j`}dM<E!QvT-G6JezK<iIO1hX> zU2@W(D|WJkK6a36;Pn6PuWHcdyS8?*+5KD6n*2Nye&}PAS6WD8UFlF<ZKy7K5Uc+O zuU#Q*w)ZMqltLQOo>Sfvvvgej{C|6)kCp=n-Lb6q+fM|N3#$ihI9V1Mf1Z}sKQIjV z04LqjxE@n;`#1P>`6lF#{vB87otIroP#u_Ge%7AOQH($ztszf-_^kKFXXsqdRNI`O z0uP(jy$r{Z)%^noMI$ds1WwuBMC+%M07j+qHlF;?fHcHp6b1eo&jzlVVJEJa3Ieaz zw8jjXmbB)m_IejPX~3F!F-&3w&+R7jD40a^_U7uhu4?V33N{9k3;A3BayTqDU%Fhc z_C$@{f#-=Z6$_QQA$-B2kw5`w6Q>ZCnbfR8MuH%Ia%5HI@_!iYkuF4EbJ!qh0p~kU zcfjGi&|B%W`KH6Zg8mhLCOeot)g?dN&>9=|?0)OTVK1HOGTFrk$Lqy(JHPA|R`K-x zx+0iOMNo%=_CE&<vqtm>(&5q(CRxj>JSJWLlGU?uiheTz*?^B%;y=>u;|aEhO(nBB z=9k--A?@H;BznSaUIhvdR{C?JU!w?L{}<1|q<^bt1X@==L_$&j^TdZc4{#y5PvpbF zKWGM}bOY;xYQu;xbmVKw>&qL@>kuf~&5oyR_z!ltQj0~E5lqh8dZ}~^sF??MQNW$^ zB;@~LsA-trYfGPTDI@|*yO(tuahAmN9DP%|A#vLnB0qr0IOHXOGuI5t2mEor`-YCw zyc5|xUK-7-%)g&O^7RPoeQYEFtW&^rAFryNAD18fFTfak2MoDT-p^l&xIn+@kx!=* zUj+;B88yUdX34@~W-`QatBKB*8(<-60>6DKHrb4>%9<c_s;~|E26uIWWa<3D<8mx{ zUKRKIg2O*ZYOy;3thLD>=Kp~w>rj$gF_l(X=;WmV{l>#`Ru}0fdJO1DaCufv>W)<S z2E0Q7^$nUA16fN$j!cV2^h5uL!!$V{U|Z|$6JEJ$34d36tHyv01MKOT7F*!YCZDsN z8mob%8r!jg8n1)JYaY!M{(xj&!z7&&z4%yGnY6&o9=E(i$Av}@*qThaLG81>`QO5Y zE@vQdd_OdqZbXB_TwVS@YDsxYQM4QU;XUQ1ZL(8LrnFJXlx7dPG#CFe>ie*dqo9C% z!+OV|s;C6Yzl7UqrX+F{$>ovcLyxO4f~*c-?V<MLgD3wP$NQofWtot!3v^<W*w|%j zF=hovJkw=H?Q+^z4OGW_w-~kNeb1(n`hel2fpo1eVF|yxxK}$OxaIGH{4z=*-w3t8 z@u5{jKHn#iGsbz!ZEJW#d}H-4#4Tiz@?019AW1Nl_4qSW4Mv`P3*D;ZtM-Hc4c@tn z%7$JZHzl_!Y}SgR{$)wz(~6I>>fhP?&z|_7Et|LY+d(Fh%9u*Zj`<w_#XFB=A$n$3 zMomtt{lXREi>gA98GZ({7@m4rJ6wrq8^0#hSGSLvM}WAwkKh5B8{5ip#Kq7DMgYaf zuA?kPqduCc1}BJ|294REn~W**f<Z%&j2VRr^!tize+rpgx!K5-ZO)t|?ED`Y*twEn znr3AH&#C1P?(}DC<JZDj;LeL@zRoM?uo{P@bNAErN)hOk9cyAsQD<e<=OJHnK*p61 zbiRH<kkywcbnrg_EAl;E6Fkzj#b7irxw!*ldrUI6J;xiDMU&LrvA5SN(22^jHNB%| zM;D{rSE*aU#G@0{oJJUC27+&%*nXE1Zj+hJ-S&N3ali{h=74v8g?cO~PWti9Y3Aj( zFniO70a8v+%5>+a#27DXm=_nol@t+zMj!pi_?e7*nxXg8lk0sP^NG^sw90wBWm?WR zm@t2T(_pR+S_7L^Yi7PuBuk!3F`1c6laLSqy9ky_)>L_5m2dt-^hOm15Vo9cirBGm z04H`lyu`u8<{+-=A-xNiKA00cr^QD}hseWyy#WLm7Ea#_swdyMWN(&#u04GpzP2b% zS;qf{Htuk_$3kE%H3Jg-B9nVDCf--k*3z<Kbw!7&_kC(%;$lJ6wYX4_Q+)ZwjMtKX zf+lNQ%4SOoumAOMo%`x^*eQ-G@MJT#;F6Ecw9&$+E0$pGH>>GZ5xH-Hm(T;otRNw` zL)*>qtbo7Tvw?r)u^V9ig4?s5wgS15Kr!CMW}XGM-&t}bCnjaLln)N5e8r{_2kpTG z-ZW2Qbe}g5n-grenB$goru0gjW|HpgYskN<tev#0YjWUgu}8u}Rd`*g?^wst=&sQ% zX*m+v9s4C>AI5qF`1rk@guu<^6mkU1HM8y3{x0AWEu$3^rV;>9nic2z8fNIXPQz+m zc1)^UF2sv<i0W2fJ!)TG9x)^GLFMlmUKDy1dlhPfwRHEGa6efcrj)&nLu97(^<*3b za4ORLF;^Il1RXg{{YVJJT*&|OXytU4U$lTOuu6zm-?`>nlzq#kDarn9E%zPw@Uuum z1qg^Bo4AW5lsta+Jx9(*^IU`@haOEaA-Ady(uCPA<+2xHh{C?0jsxxr|2=H&>Hb$L z^zBtdpc;SRQB%!rckt<+*wW?=;MyL9gB=2Vn?IKUvM(YQAhr&S<n(u#Hlo*U>wGpl z;eI}USred98#!Mkx6tgpCa4ocwPR<NFgJ;6XB;|Q2KfC^7jClw9kdI&r3%qsZ{Fmd zUPgLg;EGY&2O7w3?&BkV&+h|WHZQCXd54>WTe}}3g_jp^f#=miwC*Z>v_3Ahcu`Hc z)=|M>kK}{-eZrJ%UhQt{`&bz|Ljz}NBU8KAf;)(*4nBnVIQblS`JxB-OElDISzi%^ z5Zr~^QToKdlrTwvo8KRcchiran(Fyo@(e$`_f1)rN4*jAqq3cSq<%Z03zMH!s?m0H zt5c9q4$Hr3^7p>>ySd!*_T$m3U=OUkIYP2+m7`4Wj+UqCOV?a2*T)0D50;>7G1s?+ zcrQ)A1^!)$uwCg4n=vdMdTWXoLIcKG#xiK{BUi1PVamfM;>n^1OKImUGs#E;{}UY> z+`Y?rl@y`MtuI+m=0cMot9Nk#6}G@YG2?NWi7QXb`9KV2D7mgcMoP1ACB6eWOt8z_ zbkCDGJkqYD@K3CJXQ@nvT4xE{YM5_0|94vl7e*_JhmH>Mh_pXsxy!%RVX#OiswGu1 zpwkvxX87m5oxS6=0b`Ri=%l`UhJgHNwetlaqj+sqoH8ki_|bkMC+r%%t;f<`{KTl) zU6LynDEzUsQUFfNqN}A1OQ&R|0xdSlWo))oOSIfJg<x*4mrT^SX^qs1bxVuehd!Tf zraKkzw_OXhxshJ~y<|q6Yz_@b2i{zRKF_xu_jAvLaIv<X3`;SH^BXsc{F^mk5RoXz z;v*CI7(aEh?9_^rWRY^^8ww26H8||pcRwAOIbFC|+LSHGJ$y3f@Ef72W!gmispq#C z^~58X2-oq_#D}w5Xa6@J{eA?x9eSd+o$M`qJc#OM#nGorKRq`HCd&NGPHVCmO!*c4 zWSUtc!sIBJ#>OPd$R9pC{j+_=)~e;}d7w2wXQX<26X>5};%#nxmwD*BW8k8b?fN#H z!@s$Q8%JKhtG)W_HTKSyOpa1tN@BASM!T3AN3t#Z)ePvxg4Y<^&0z$yHA|u<qaD9Z zjLq;DXT+eDkDvM<yVdxJTx3)18vQ<W31-1Uq@Tw-tk+C5|9NPw-I=_8`R^xc_U|T) zx>0q1U$I4fm8ADIdBv6x>c!Lk*)QINB{Pvtj-KM>EJdh#d%jR@G3jh$PY~&E1DO!2 z{d|vN&q6Pgg+vo9?73|Zoyu4r4Y;_YfiFZNdx~8&1p^`}3?vW;@EQ#oCzk%SIJX{5 zbkCTj__z*l_Ef-_5VRxKSa8wi;xs|$|8PVueHbp6zW@HB^UO4wZEBgG?rdw*zx&o- zCf8~<6p(iZ6)E7ZP46DX3F$&H_W1a&%~lCo)XGrTaaywbzKQISsL9({$<xHs&LMJh z@qXB0WYuN<@c#gGrR`0rRWU6~dC)TUG-AnKV@`}sE4e&6AgbMV)!%X#em3g!k#~Jz zP22_jnAs#gHY7}CRMNbK=rrS<fwtV`dcxo_AOc`EzOtt4o#FT^#Mp9eQ^-o-?_P+C z?aEOtW{<$MAal3A>VA&pYdq!E2D)#+SKW&J01)bdJEccduF>mcU^`8LB7hb-@Sxn@ zyi5{6f;NxM&ei@A!U1!g$Y*txzojLWkB@HuCe*Y02P17#_c4YD7@=}~Iy_NhvsGDR z)ivslK_@<=sz2Fo8>o(B?3FL^C3oPNUtw`e6s6tAewck_^C(l3tXzX8&%A26u0c}} zPA4EP=;M6*f)%{W&#X>d4p$W`Ga1PI`?sO%8p1wghywi*B%M~Z;hQq05!|BJR8Czv z+lkOs8dOYw;14mGD|v<DGK0u$s=Kk)R$~7J-R(>Ebfp6llP1qx1AbVZ@f=KNw-=6N z8rHii@zrFRu9>!9ovxXjQr&$c!=K)X>Gb@aY|^Udn_GfyIh$gXO2!-sx-2;dHa?$D zf2e!}5^w?$y`k??f0QF`F8O(s3KmQ>n^^xu^6__i7HZ5cxz7`m7W6OO6iE&(0QrUr z%PIxyM*Kg`s>h)=FQg}j9lgns1R=8rVbj;oU3v%za!pVGwPV|A(a`I%GZBw6<ivqu z@|coz$j+%jM@!DzaxHb%wXTPDhM`2{cHzFBF@9$PC4NR!+NOXcg|)Ge*ShYWZbgjz z6XMPKLu@9P!<UfuA!RZ%8an@9Sv`1*nq>5EnVuia&<7rO`*y}!=8b7>7Kya->99KY z7PGmzaxl9U-yJL5vIf0H5fRCgY6oNp10?16R0q~y8s=5Hg!H*@-f_027qxH#dM%fX zK|)qPnGYjXE~=<u7ia8Fh`F*Q3u<z~e1JqHyGnzS^!Lrosa^~DpPBhIThG{n=)EVv zEjHP2{H3Y;qa-;>w|Z$<$k?Cp%Rh|Ul<4f{UOIW%a-U`c9Q-20uvy82hs&*ZhSt<3 zBtdo~Qotd>tC57Bxn$PUX4|n*bR=P;a+^tbef2rM$f?$!<x_^B<zH+TCEHW<Y_pGy znDTSvF5K;nUV+;rzjK#1D6G*K;}82!&|~%(7Tz-?lnHKbzYiSo3LUMqlPSIWOC^im z(Z=xxwlw=-u`NQo%x5)WyQY^n$H{G$PHk+G{CA8!|JZEAy1KPaCX#@-g67N_HRKvv zsc)XJ;{vI4x6i2k$fpeqY2~^Z6g=us`nfeb<afPGGDTg!#-2Sm@I5w$Wn~f;2``n( zj9D{PX}D|CNzi^nwiM@DAT^G~zq#fW`=R<>AC!Ppbel=eAZt&wQ`RgniI0q$tJXa- z90c%aX`ir?S1B3ODiM@XjB6y_Sx*qTyv$@fjiZ1Xjj7DjVqRX+I6SL8v?js(1|@BY zF{Sq9uJ|k4-5wlfLx#=DtRat)7^@sOD=*$J<{3?e+uk0fzgKV@&8hMQ5lZpJZ}G}G zQFN7A>JwOirksLMs&hOm3;|{;0{vpsVakcfm0PzjVQ7;sUP%-?*iO~toX;?~PkaPo zIw`{vF>ReeFL!iZI_{Ez=2pc7zOf?x--k2KD;W-L|6Gar-UaY!zUxsYCw@QVhYT3X zQ+p6^8@Q49pnJPN1#GA9d62L<m6ldlO&9#fzP=H~EH~|USy{_*cEcwEmP72qBl}OO zw#^!zPFe8GE6{w+J=AMn5I(2o%DP^`vpC#{M|?=FJp7UXZZ_HPQ{b~r<dj}_<&W0w z;3$kP0{2(+*1E7vo14?f7~HWjHs`e!RIo0lr;q$4ftckco~>Hcgt_@OGVmJtCo-2) zZqoj~#um&1KSZY92fe|hJC?eed+U^Dlrlv^0F4E$Mf6riKB0hBI<u#2z0V>QuDr7s zOpu%|3jJ!=&doO19M!IzbJQml(lsG%>e`5p5z{PC+v4B!3TC;*Iu9s!AIOo75odA^ zS5^iP?1z!N@h@^wx7Uw;8@>wZ<Ydt)YlYEO<w~=&soBk^UtqOy{nX$rm%Q>BM(=#; zVam|b_Dz+$Gn}=U{u;tiI3&ONru7u9hB=!uMcH|lz{~!G##s8xBy#;peopB5r2$;| z+=*`thU|X0eJneNTWM}T85FE~K-c6O)bnGIeXdsfM>87m7;iFf>P2+5pFBqptvRi0 zI}iHzoqvAzU6Idn?IAFf<ZK3Ju9>vZGDL-7!=_|F=x6+TQh9D40)h-MmDtdqrc8ME z97>W$*YCpfgx=4acK<~EBy#%kQkgj@J)j_c`@nIcjWZ-SdqKEBN?mpZJD(y%8C|?> zxYpk7&UV>l*X{Oq($Hz+h?7tJ7`V$R-!Ssml5b?{m)jhA#n9%Rsg@JaMY;l%ds)a2 z5Lg@0G?ab=%ut0yPX>}d5IAXNuP6+J(;ku#9A+jCxj7|3K(FjdkX$eHS0|KY{k4G0 zZ&Df|!jY%7?$RMC@nQveq@o3bk$|u0X&woa%w0tDo1Cr4lBq+IExftO$8|x(aTG-f z9+H|2>%1bbbCKOttoc1)vAhc^e$^>H<33<oVgFQctc5Y}FsKD0bwNuQ6~rm8yfjf} znz3d@{+Xz2bWerN|NB5CNpHD5G9#9<hg&zr1{u1_OkAAIvxAS%^Ng0pst+7fgNEvq zb1GZKca7FK+vjw~{^<M3w^6LsphR@IjJa2+Zgtekpzgpf0DWdQ(z!7P-CO?0*PyCh zpPj;yrVFS3$Y)G;`LmzK4<{P*m6^t>@$uDLcf*f6mKn3tpamB7kcUlFP7;%J2(}>N zd*R884T#m%Ja$o4YOqoBDPC_k6RaIxyk+M7{SiE%E<QmwrD|Q!I!FOAJD)|8N-nA- z$RGT|gL~;OXS(Mq;OoDxY;4&gknDYfNbBl!kau`ex~Cy@yFxux^_DrmO^U1axj5E} zyNjX84k6O4^__|Qvl1t*w~M(u15}rV9j>Inh+y?e)}asKDfPAGEbmbOb88vz)Ct57 zREwLVpDCsYh5ZEg*L*pY1*ENWMY;C!WJzvp;Fd1|k`>qJry=UiZ>6<XSiU1#lp^+} zn+%pSX+e`MOqRO)?@8{Bb6Nd%BG4aGb!SxxZ5H<6NO#7)L~000V2tHP9CChA`!lss zdAG4$@5zOCr--Ty+Ac@y#wKevxS!RW+34Cb*H6Fv4Rh~6xC=L%C=V7xMNtmJ00kyN zM6-k^m)efd<lrqJbMvd9^<uS_WlztXQPIdC=Wdw?K_)#_J04U3Fa11EgDt&_Rr=tR zlb%`ApOfIH*Sce)$<sJp{s*xPuT>g6cY<i-H#q^yQtdQ{Trqxl!>gGc6!*aDnPxzS zj|sX4<Zb0|Jbs+63XYh$w4;lK<<p@TAaOIIH$qqs31-zJ=rqL_SYsb8kGiY}QFiz0 z_|xH08z^%PX+s{3k58JCnt`jchu5rPj#ghGg=GM3_Q=cHq8&Pa^y7rYeP%g)R!F?- zX+rDMruzN3BO8-Yx&zxYduAp(IN=*aDP&{%LD~Sq1B|Sy8dNO#Gi`)`YJ(?b<wvdg zV~g&N03t2jTzU~%o2Pah2cy+qleti(J@5Qc$m$ggjUG!!tEePx+-fvKu44T{`-?Y8 zrbkOS_2oeTLP9+Ds0dD7)39TZ_;8{otL{;(U9g%;S?rhmWSz?+tDjKQ90Xledv>lF z2Ab3z|H3C|xLUG1;jMAM^`Q6jP>CO0$=5q?Sd*r7`(i&Q7HXO@CTPw5aCGf2W=4)# z)(8Nc&~YjZkBIL{y%qTQb|qf`u=lF*IpB;}066k%%eH;z{VN&TF);7^>=5U3>aU*a zTPi|s@F01dWp$UZ&5iUPqFc|J{B-Rl%nke+k1wVWDo49r^IM><Nfl8h@o7bHYl4AE z4J*XzKvp}$A(X27@-At5YFVW@`@rIY<{!~jTj_udy3IyERA=yU38vDfBFn}Zdb%_q z=<eACh$ZUucMtbPpfnkTzo5w>6~;0H$hgL>=WbSSJYtDnNpz0WNgX~xCa%OBFAQ*J zJkkljKK}OBTYUW?Eb(bf^XlhasX$#72q07XZKkgWMCF5?Z;fF8_bldF@X|{<!prYg zc$t(z*7)%#h1ZLkz8t%G_EFm}cb1RAV=p5YrS^h-SV^-*S%d5(;bekofNv7xLoN?3 zTjOMc7<>g6)*dx4+H2rWL)AsA_h(4gn6#$2O77}X%I&E%4Smy3-C$xzwtarqx|w1= z*Tc(uIb>!O7lqu(<(4pp4Fbw`I?k;xDTUD&D7D+z#Afc7GxCfmfZ`JwD}x#ahsCUE zec^9GDem7{+8;%8>C@}$qE<N;pLZI&$dqKtuFiGtV0JIlj>_W2QtUf2IpMo6+q0E| zTRWSGjI@yWjD!z%ro?|u@x!?`(8!lx_Ir;-2wyUJp{k_<pIN$fH87ULkE?db-2x;@ zNuCExKdD0iqcpsA%I|kywOLxQ;a5~e*t0T4LUIJ@`miPIyzf79C3u@t>a%e*W{ULr z*ugVFsi@6o5kn^m44?qxI}no-`L;CG6>GxMflVdJ6jW)ARbe@j<nXxuWbQe>lQQA* z(-~QD<e0@G6tXQoA!vV1{~VRx$om+T#&A$~m%9maa1oEbg_@15D$&Uce%sP-{1N;t z>U-D&`HWu|3Uh#%Lj8Fz0wDE*%w7{GN(%1=FHN!qZ}dVG5A`)#0zf{!x+g-{R5_Z; zle$Iw@MO@Ic+Q6Nl@2o?p0&?dIx;NNW)%~`Fu3)zB!1HR+_CBbTWxAG%C$6;uiq># z_*g0g#~E^|Qn;Hb^VO_7NLDwKH$3V^HDDU&BQ_$)y%BbS;@}TtE^UM@R8m@;A_(-V zBeMvBVPk4g3my}90h(rfE)%G3XYoai>x>cul~z-f&^b?d!XwE<-Ig!}mlVY9ftF|T z^<$q&vkFZF2U8C)jQCWQ^~&Z2EnQU==_ZB5456E#{m14c8o*mA$&I0Z_xxRkk-J5% zQ>@I8RJcPP$jwD)chx@kE*n@Mjz!1hEV`c^Z{KoIwyRLnPlrr~;f2SB@gjmA2O+g- zGKm-YFBX5A_qy}2KV``#ec}_q+Mazr<^qL)o?vX!-qufVyWy;<(O$I0;CNO1kLuw; zG;7vXFJ-IH{yA-6$f%LXRCI?US{*;cL#UO94<W*Y;M1^Fm$S2A>K)c3d}HZ*mVY!H zo|cv3zze7xu?It@nQN2OAGQ<er_Z!&#+{AM?|!!zju)ao%^i!<ba-{ZV)AXD0%W6= zb%D=9Ll7Pt7$$*#PQx2uHal7Yu{gMuz@8<Rt(n@cpD0L#I^~RXbS83^@_Piomj6Lo zV$E59ci2gvis>k0y9xz6avcc$kXhlaVXx)=G3z**_J{l$v1l0^nQqx>$dg5^dy~-H zFy?hiMxsGH^j<&@40(R4pabw0{ru$Q9)QrkQdB>0@PixR&3Ijfnw$60GZC>~y$!vu zx<!&on_ghkNWm-t;%OrzySubMGyN;C@PmTIoSRX$>@tx0wKY4WD;FueP1Y+Q4#=b= z{M$^veX+`n0z@1ivkEo3)G$jKDyzww6df`Sdrnd|k_vpx{^&Hu*%e2iQ{A&*FJv3i zqZ~+Je3tAjqeV;dLo@h=WrnA#uEbn#3jWO?Z)1uk)wDez<OQNe;-h+ct_z_^dQ4NR z=)Qww7p-lwtjlw)1@b9R$#$!g_uKk3g>laTy*nZ<@7=M_IZlAUs!3Gs<p~wzcdwLs z-!b@NE9mse8~XAjU(iU83@u%gwlV_$v2^Em8Xmsb=NzUo0X#bUP!xQ#FNr@ZEahzh zn4pQ`vEVowrCim8zl_IcVqvyqnNHRxmk3$qir4b?Xva#&xmamiuN<5rAJOE@5CV5C zV`n#*#)2L-S%wHDlgJYSVyJQ5H{A$kcI)aHKIutP`5Xl}mm7+nu%z+%=Aaccm&vls z*?#CBYy?|*Sivh7qfaijO!J+f;hCHJzdZHid7f~&LVwhh1~AJ~@8sDC^u`mItxHak zZc|X{ig`}b<j;`Zjaul$JXR=Z3lV%+eqqmULb*5YXs>OjXfADTz8UZRspMg{UJ=cD zO@%gFWVA~22Ewua%g_kW?#AffO7|;Il4e2a&(XVjk2AN-MH9k0EZ!C#(i=$g<i+L% zDUo9mf}F(K+24slgmt-W6M`J&Gxh<MHX2ydB@~hCJN&;R<$^<YADM^FHRfOT;eXOh zS41RTsuN?yV$&)m90?RmQBjU$8Zq`<(cqI`Hv#_jy|eQUO?fPn9w%0HPDy0+8H9o< zo`mfn0tr@<mq1d~ioIwWs7*9lEV7nHz<J&BKECDY-P#uC^Yz`E@PO3qd4Fao+jn2K z(VF|@ucZoQZr-Oap}`$n=(TTW?6cI%mRs%<eA#rnmJH1mYQ&=-dVZAB@`SzeO<Zl) z({B<Y#@!~G#M>|J&Bope%@qZ8klybCHVZ(@7F)dUlYmyOQih^P4#~%VYkuG6Zsv(i z=P9E9SRrir0Kj<Lw`mJY2EX0`U)X2mxvT27?~O$_VK}1XWKdRB6^Hv%$OCs?5#iK9 zL3>JqNC1a##8A`WGqkQfSEck_zWI1DlcLMLt-tefq|^&I_a)}dlD+XRIX!bkCsd!1 z2MU}T^Q;ML!ceDc5Qe(%;H0v{`L+{nCXlQ*xfF39sqq*wjbjI&^iz0VaqZf3t_{U9 z0x&ful1eB7`jP}e`waXo0F1~?G`7?+;pkHtM1GWhMV0X0kT-yO&P+}FqhtKd)Djk} zZ*L~SU%(XP8lcC2WM5561iDjy@p+cYM+Oh}Htj6;fvlI27J`Ny*`mU$3;2%~HL3*I zvynf7FdzW_^7z35>}S8((RqT(!m)y9TC~KTjk**OqDcwGbT<o^0TV#D`<vEYIQ<<v z)_L0w6M#gePe0C+7pe^gRON?RQ&p1MH^>I)Sn`SmWD<2y&dR1E_S~p|yHdJM@69^g zz>-J$f7B(F7K5{4j`ulHf5rN!?=Rp*SyqVaeKhvI7p7(1F@bE37iP$?6Vu{q*$$bJ zM+wt|s$8lLyGNh+15P)@-7UHo(K$y{PbA|3_b|dKnl8=1IA!?cT{h#6h69E|6F{De zdfqygF;yl*r$c@tZlpj8J$`xOX~2!7!+Q{6)Mr;4CWdBrv;+UFo>@iAX=)Fxyv0Z8 zAk;F`^TLYy?UuT4xgygauDt?=iWx!<GWu)ZDw0X0ZBVj80vJoK^(dQ!ISuIoQbl&o zoTWC;qz_oiOo0DPtFzl3R0H$eKhK1u23Q;#1;1$0<X_%pM&zcOMMU|C@&VktMl_M_ zRyDy{efKVz|C#X?ly4{Dw`cK-5d5+hXb%E>zRA^WrhEf)suKJ>w<_7OBS!1Z6QglF zB>K$E*&f{{njsn<L~bmzOZ2IXI=zQ>L>NekVU*GU+;?!CNuMe570ns)l%}}FM7)(c zFHCCqDTF%#W=eWIa~kfOvlcF70?mkT-`Z$Yj*0<os{8}_+S%jok+<QY_aH<BY_C!s zy5sO)FHCC1^^Hc}$}23bZ$?&b3#rpCU`OA<&tlw>u`C0K&ehQ*O^JVVA*D<oGBf9L zFFwpxHk3vm>9L+&>BjEca6c6IYq^T4mB<6HjZdh&AA3HP3I3ri8r%ZQRj6yv5L+6w z69o`_#VXwnzI2iX^oT}V4RCe-Zb{s0WbiEUY4zT<Ui3r1Fw9)8aOfC<S}~w*xD$(o z=Fp>3@*?mxxG>-i{3#(jQwU;HJx_uH7%Yzja$UKzlJA_RijZWz<a*Mjsyim}CTlYV z`r~CllXj+@l^xy4jHL$?or8;BMwrFIB86?oCTgsp#qd~pHNCv854nv<lGTYVmhMd3 zQ2##hd<;g7;K&Z|;1?0Zmt<zrf8~vE=!`B^7*pJ2!a-P-*b4&I2PwZ+_jylxW`Idk z9A={;g`^62)6X4Lvz!dSPae#q%w2d`A!{DWlP}LBX4y)bEA2CUraSAz?fvYK?)Z*p zuJ}WbKT~Y0vJKV@Au|X=Xzlt%0Thdv#~#C?<?JDcJc}m+Pq}>6uOE}4vL&M<3OCqV zuVfvhDr8#z&J18om#$TP954rCD>M;fy@%UPX6-NtwMmPx&9JmA@FVxGs(r4-+cX|} z!p#i_NYh#a0ypL=YA_ML=x@jn!~+-UYU=Zlm`CYQF<qXuRFXyO3GjBVonc<4n%tBf z-1xfU*yhK*jcjIrh%%sogC;2hD-wh$&|0Ybp!Y7>axRSL&q4tp#K9B7alJRSRKQsX zD-hGU7Q|f{%Bhv}1jy`31+e?y?s;9>w1_&)e%E?+jsAQq=0r182A2zzjbM>*eJsZ& z<5R;a>L`i)8t`sQol}xMSx_V)HfHMqy~s95N9xg(&5O#AGz!Z%X?d2J!>Wugwcz4h zj=4WWI@r(!I7777Qs5)pnBDES#l^n?vu;o)MpnjQ;C&LKnvZX1f4kX8LJ!SMM7Rv6 z-gjhQ$J(sIe`+2tx0~&>EToqiw<H}v)&Ky5ym`aN1idwhk2DOS;M8Oafz%<(YkK15 z_wCQi5%1j#Va>B6f0}$!hqel>ywBtg4vijrR_>pnt^Fa*NbaXO<ly^o;1_M;kfpqk zLdyIlznj<CLfzYcT3UBtw#XGY1|@ebK_Dydgu|ZMZuBSG-Z>JcJCbIm059@R-l=If zS)%%{zV^Z%#8NYH@;HFjEKa7PZs<Kn`jN1<Xq6j2h%wt}q0-J*hcI-QEBBR?{9rYQ ze@~HTNYD!ha_5_x4DhF=z0;meCCpjRUHNc|zaMA!mSoLI#bFTR#!QYF6M{%2LM)=< zu<1bhlW64geQ+l_K=%wav8y}wZEs)<xw}=kN9<XkVk+~?UFus4*G}}>V|AO3GaDT9 zwTMtO^2~L6Ay6Ee<kmK3>DN<Gx40iEurSiIVW*2;-5WrInP~H5RL(bB$y*|)#00Iu zX#O*iGuJ_3`4w-@C~=vTCVGKQCBn_hFcUU>1<h!#6EaExl9v;EJ!2KJty0cnyt6fr zTh4o!Fk{cjwVh0zus2NyYy&+y_!(u`@#b^pbQwrI2(2}Ns11Hm$6?73mAFz9uA;5) zV7tQ;GxVUn7&ePmPg10EU>~;5=G97QE3?F|T(Lc4lEOxDZE6*6WRTcJ`JAcgwwp2k zGcNI<5MB4TuOiZdJv9heQI(G5hUDy9H(F!cG!-;yme}p1m|(~`-k8KP)|(o8q$S{+ z2M11&HYUGod1OP+qbSR!g4gkfbkhE57$ml``GeMKtCYX(^8R)ko0K=!QuL44mCAqx z{VqZ%<;XUPM%u)PSv5wC62a-fLJrbQVpxi}V9TSp5-X%@gZ|SZaG;AR{c!LB06D#t zIeGA}pofhY&%!-sK?>_Nzy5b#=73=2fYmvsCr7(PI;uR(sVwehyd1AFGhF3r-`t?Z z$ry{e<S)qbKa4tEDbN}#os;oaXL3W--Yjo;!tJy49t_2#o;yxfbGW7W_qf02AA-qA zk1-q)u^S)}$Dg7S0;I2~c{GGsq!5mHf52K<zjoRZkwNa}^@BE|rH%s}JkxIDZ}|g% z47S#KcSs|DDg^CF7S9z+G*?Jb?!Uf*v8a1JW3cZO^j&=h=Z3FZOW^hAJ0XZvQeDai zt<%hKMS<y$jeO^h2@_VVCkmyC&;Lj@$_0)m%w6WPloyhxDr8315NOq~tj6%SSFD-6 zfvgsnnyEb0<ule)p<+{=Dvu3lc`D7NEaQ*>;iwHWga(mr)aDEJiqxqB*%{JZpKbMT zaAUUPb1y&sv;KYx>Z&Y-_y&>oTwk75mXxs^^l5OpTbvIMT+X+ZQ9k$9Voz1l9??_1 z2EZOM8)?y%+*EqvI(a)CE>ABvqCRBlHZ}+BIr*EEtKr&Twm4qobX8jZs>brZ(h#z} zURr}5*i`Yzt#!rK_IQ1+RlF1?1Ic0~Wg0HnOPAUNTMm!-$I9uhMO*4ua^3gQzptrd zyuJV;^VO37l`_i7TDUf^Pxp<YH;2;4zCPqWmRW4^y;y^PG=wK?{3ZeNe#ClInY~#m zoo;!CL#o`SF8RXi9ReCh-GtdLcfq*)tRSp$ljnxSxXxrkLr_O#!jK&_aF8Gy?_Pau z7`)aQf}<j-B3+&C7M&A(3lyKO{5jjzC&aWh3j~%1BknJVT+TVQYAA*%+G5ThViJ|g z3zvBOo;%3Z2+y&f5M;+w7U=+u&DXxkw68{M?czz_E2M3nJ#*iTX{APFidvB-QJU$P zCY)+dH;CSBB7gsO-P$>Ioybg<^?e>V-=$rA8$*ogeWi08YSbJ%O1T&787C%<8|4#f zU{ujy*x@O!d$r^uQ1s%FJbhH_r;+m6S}y;J^R*h+xt;lYaL~dhOOfopPST&!8*g3< zx8Cr?NJ7kd%xu4rS|7df%Db)W_boiooKP*U$|$ZY|H-wn4eLQz7?yLVfYv!}jFm53 zVy>XEl7bA|B@(J}3*Q<c0@DmbhPSq9ZI0%R&<*qwMxdXHa$zLo`sj~|p1(p7Cs51y zCXVWfU3z!4J`+j&)Z6akJ?=5zV!7AFUL`DhCv3aFc7-gRdydlyJA3apMjgGkIf`at zNYB%<f1n&5exfNJZSO|RXx>4sqXp~BQ$HFyU3E6pr=~;2%at9E<f_W*3%uf!%!X+S z5qMl;6Hkw3FEROACK^nhPOquhq8SJ1h1bObWOiv#*zSf01rD=6{X5qkitV1+`%UZ7 z%ejS}{`3~o_s2AyBo7x->H24w82?qCZ4A76(q4`o{80isRxaFOTdOXOjue3J-rgPm zl<%Yk_U4qn06hTl<gc9Ie$V%w(F+26odGqK67<qZ#=i<9oo$C^tY_Y8t`{Ro#mbF2 z9oAtrWwTZpA`V7(#NssTb&acEDpZ>=xH#Xr7`r{%y_IS?-6*!j>_4=HI*YdzKoqN? zN2}L@gWvv9L*EJgj}c>93nX(D=8CfoE^BLlrwK`Ew!8<Dc)b-L9BBAxp?#M(P14mT zIsDgKRk0-w8Xz5O)L!Q4=%&_~+|B0gPtn=7*I5U88T(63S-TlxPK%J#UUNl<E@f-; z*%z9qRRx_3Jw}HvQ4BF9bMHxw1Fn0uCd_zSoL=M$Lsii{d5LfAzD7BZzYK1UEif&h z{(9(Ip%`((NB;*Hf=A^p-xAm2>msRI_`ANz`GLpv-=hq^&b-73mna`&3j2^6RbXBZ zCosEa>3z5>s<H($@vu$n)}-$e`&Df0=md<;jes3%rgioeRU1z*naIGmLhuj3af&`j z%gjD5nENBhIOa7_(vBd6D_&HfA-UW{^Pu$h32wcG4jq-%mZ5WCY{>8>=MP-s?y^l8 zr@J!WUNxk!P`oU+zES0k-uBqONbKM4FuuORKcWI3KZ_B!N}C3rdCdCynPQFe75(?s z>T+#j^UGQN5@DdelCo*RZ({CGS)0JV+Xixs4QGwg!UFs0mY`$JbGf4S>5xy%@0$hy zJRXpuc^<b9w3A$znt|saeB*CwetC3-AQwIOqg?T-c;j1q9&{S?PBE&?DijyFWhV64 ziRTY|Q{1A_<wSXrM{r-Fxe*=a8G7U-i&VJB>@794vtgd8W;TLvr*3O#m=5j~eKB)B z-;jwtINhppj=pWs%r{+so*Z+g0M8fyG^}!U@vHUMpA?#$JDiiPdupERGA%$Z)pXxZ zZMx-)7_c*P`4{uW=I=9kzXgOU&AHM{XCgRD@J=AKRbjQdk)VS^q&8HxXJcolr92SR zpDD5mO#`qNK309ZwkN^7-Yr}Sm0KPUC1>g!3{7^&ZCdJv_2z<p>N%Bk+}(*8kQbVi z2~suK&_kM2#)ghKC165hYbsSYnOJH!x@I<E^J-Cbe5!33x9O*7y7GbvsVQqMFiR!G zl0DZ0Zm;=X+AddgTl?5H7wS-@gQ&iq#TWl%dg_}lJzK;(MhI*hV&Bz0F@4SNcUpXk zJUhr&ETk;FX}tjfN!e6hzbTEq6AK&f>#^HS{Q7`7LCK*mzT-bsY(f9_0n$FQeElW( zS3pQ7!2TT*J)xN=>kK?Vdr!Lea&y*etkMm6LfM_2W5n{q<ji5IRmT6Qht6A9!NlB> z_JCXaVm6ncCjnN{9~t|`OMUuIF42_hHR%`EF=6-6%=kla$6USR79QkqmUJ|+@vt+D zobABfg6>6~*>PM?W#&1C*dbfnmFXpr?=q7Sgg=SAC|G(=VBFSLdxLX7ov-|4BbD;P z6{LgPA9!9h`j2Q3!(-P87~QTs_w<S0odTk(5^Dq2$$w7gnO9wivSP87T4?w+K<N7Y za>gbr|4xX#(MqF2i`pq<!`V)8MGv}TH<C>^7r2bc#56hEj2UQe`@mV23zF|XIEMDb zPQIL+(omFmYrzw&8IDgZ9<%jRC^stI%Cjo=r+@^&V{!kt0`2=KOGDqRa2Bfbn`y6w zZT_`Re4TbPuU?=_o<Yban|?ekd@;_aY-#ZPE6!YHx>S#U#?cPY)V25p;%3oO#cEdf zb?B?Ev~+dlAKCQKnU;#E&WW7sioRnN9Qt43A<Q91XhM-zT~rhf|3nZXdi^I$a0xNl zPM*w{ch)49H{@Hl=>i53ZxdM?m8!@W+3=V!ly!9GcO5Zbt}$ND(igCY)Rw6-Kb@UP z;-8j^qvJPLXF9ikZFufD<XsasZ%O8z=DOn3#5w3MoF%RGiCD)5FkKe(;xo~GkMG`v z_!LoM{2Jx{H&->TSKES>(AOln3c+RGU_)Me&qv=`P58(vJ}Mk`GUW8;W*puHCS?x< zS?NKC-!@9_9m8*=Y%!A?m^1z*^?|yQUV?GD#C{#Np5MCsB9x)tcO)$6$+_Q0L!gp& z2vUZpfYyRvH~{+d<^r5mu(;$vb+(d}<c=KCPsDGO3oYZ3`y|dE%CSA9HWhs@!oQ5s zN)~uU5$Sg`yn3{BSIA)hRZl#Y4_W0G<@<%bj;ZlMrtyS03;j}AcvQ|k@>*^OoGY^a zzTW4D>8?6I`YyTcLjZIFofWjk2VYY@X$L^@-H!FU>7SlO5I<ByhA<xOz(g|pHf24N z))As&$HI;-8@3-Z-H!oX{Yg3jN5|+c%MSL1ow=3Z4r!+!urNqt87zdP*tD{ey_I*+ zANR}%K6JW&ceRV}czkX3H?J`?ldBVJQ|1lC<QAqybP*)V7N6VNY(F~<-Sz2mUtu(N zd05sat&-U=dG&bO?NqC~$8Ei9KV}6V*ra&${HV5Rf>CHXJ($q2Te(_E`eo*fuxPkO zC9qP?+%8Wrpc{hHES=^&Q8w7nCk`ctD28&wD9(9er28xOLyZ$m#FI?n`y0vOEbr?) zYl2^_MQA(^PaBN=eQdvkDc$s0+BW)fcqEP<(GYh0HE3-ZlJ>xVEQ$CQbsjxi5m{5n zq%MZ7;x>De>s|r`QoRRuQ=aYA7GL&flThW-gmdk48tKtz^wMBBT2sM0me=lI?Giw* zXd*c{WHw{HYCbL_=w#6%8!qMZ&@!Y7w3l|ur_l%AFIF+zp4~jl4tHf4Qzc)I`;a1( z+xn!9&#-$XuIr%+RE9@<>LS<gbQB2eoBXqDb}WG&*)lOesjz&2j(;ex=W{X!@~9hC z`|)Jt2*#y9Fgx7G<+vXd6Jt6r$-N_fNec-(M{}Tlk(NmB;jI$*5!}u?sjJx?`!eWD z^S{TnsPXV+8i#NiuXms=*pshkC1)TO4lNhU0gWcSv=_y7_)XGyvr3-2{`8Q(3Gw^L zds{~)YIH7mKKXR}`r`0IC^B48HeAUl=;KroQh{SJqgsA6U$%Zk;N>y$GkdA*55>k* z618Gx$xLobMVWVJyJw$-h5Z5_6Liuyomx>(f)R4?Q7~@I|1`e_`_&P8gE2I4LH9Zx z=_J_+XSIG)35;~(m&K~5c;~@liWT66fV;X`qC>M>#@6@WHmxJSThVOT&n$wb-pA9* z5Dxi_OR&sj{c)v7XCgmbpe_au(OyRiip>-^4%t=PoozLUsl?cvMH2!0wD^uU&UMaw z%G`_tN@CEHV<Nv(ZAvPv=k;tk=Kr#hgAmspqf}=?pLaLZ#$xIko;C5t2)JxIO|`QV zP)CJu4=XG%Jbc#4u~-|ki`hX9RWy`GtO$J55CZHOxEsi{T=8td`iqn4F3u`Q%8@F6 z^^S(zEzQ0o@k3_sU9#;~;D^P_t*#pIH!+xOSz~>SLRaF-W9S+D7Y1oAyemE&e{0Gt z@HRzFozEjy6YX;Dpf4H~!v>4gg)by|jZ1k&-^h#Hqd`7v&xTL|X@ksDI*VR+K`>9~ z8mj1p?Sm}9-oMNaS6YZMu1ja9$NN-c6FHggH>Wf6!{V>M=B7bm-4?+tG!i?W<D9%L z;+@H|cWMABj&HQR-?L)#sQCw}6FC1dkIfigD|+R}Y#y1cD-oN>Y~15Q#}K+pd`1vM zn=WcxTPch8^{ygtnxlzYSe!2eJ7(V9h#QK&$k^6f8m-oSx;<6x4EY{g36b=n+dLz| zKzlZFd~u2gt3!B~XJIxF6Q6P^=-vxS|DWpSnP-VU>qLw*zZBr$0}9Ez>Zbh%>}q%8 z_>wOeRlZGi63)_vox2`|VU;CUHdBv&9CYtW*>*ogHpJ0R*W*nlYqmraLDUR(|1p~q zz2)lEOhe#@wEw}8`32l=&$*Z57crBd5e3WyCLXkOOm9z2^$ZQ_9#+I8@RiuhiysqB z!3<`6Y}e23_+uZ_+xVnJb#iwlXJtN#_+r1%Zc0V$^;unL^xHP^-BgcBxABLz9Pq}z z$AO`4-{Zk(LOXJu*t%C^_T)OOGGqs2^zR!uxtsLKMJMs}a*YW{iHZAR+(`)GvL$WD zJo4qFU?j{6@gd^3(>FX@;-L-cX}O)se)(Ob-+pdvQQ<H(D~~De>+W&4Tc{G_MJM}7 zW&5&T<9LVr)4*}+DW8_J!#WZ1b&^XCbxCsvvkBoDtm8#NPE#&2!Goodk^HSwf@17u zi)W9&vvw;<f@r&80?043BVF-f1v4w|#fP;QK4;zqawgQMeLS*_XQ;<xvdoa#^`BbX znw8jI0bA5^Z;ObCPzK+^?@XDHn>oUTk5R3hZRchPZR1sdEriN0@RSYr8d(vxh4kN6 zoaxWwzW{yp>3+&7{p<K?u}QfNMtXo|qlvBnmJeayofq*ub8dGj3w{x`_9h?6jT0Li z!HwQRN@Cm}FbP1CGt+VZl-l@AWMPwrV{p*e*1`k&-F{eQj$EF0rmqXF!&E~ucr(V8 z%p(&DBrcZyE%;_8yQB5`QO3~ymfb*BQ(RD2Q!$my|Eub}<C^H&H%}4JhX^W4kt#fb zN-t7F6QxKKkt$U{L<lvM&=moZUZfZZAWi8_dM}|1BtWR4mxLaIKxjL@zuk9t|A+ZZ z&Y78W&V66k_kxF$sEjcf63YLvBr$W}YU=_2+8Z)%8?G%x6Cur#{D~`EkTtRss8_Ya zG5m7!lknusxo<+)x&%oG+g$l%(qymnpBQcM$ou7;e~NuCS+CaI`-)t9DhmvgxzRFv z8&v|NaMlKAHcrVfVt+msqEKzwB;wZ3phlzJ&nZYppPOedS#TgFT(CV;vtIL~vq-uB zo_+N_Y$j&n<X~Nqdfzr_;;r0@hb~hLwy$K)_9iFX9hUc4)olEy7G#8ml#1qoK4o+x z{aCh&!#vM3qVYxTb)Mon>PNj9K)n6DWXsBFQOV?NSYb-cLR675Yot`j>Z4)>_0=l% zO$l0m&>PPOM#hPt-c17CQ2`?U{r+YvoJN`X`Ij$r_D<SthhZQ7g;$r7i-2F>wyBI) zHZ^ij$mr<%DM)yhE;|jFcC4sOcjiy^QjSnl@4Zzm`%wxZ+)=IWy$lW6og*Ox`NU|Q z?-qp6C=w`9*LQK66*mo7Oh%2!ONv6|9dgCM)Ltuj;)I_mQKitQQl+T)XVP>T{RI|~ z&wuJvInf!!(aX{{<wOb)w%Ky~%SP#4zt^>pA;>HGjL@i+iFsT7zzyY~uvy}UiMb~a z=9(d3X%t}o7vtJ3Rn)y?alck_s!z@G_3hlzw-5=sK@IAs&7>#kf#``1+TjW%pX6k{ zuSRw5x$R5kP$K?|4V^~hoLT@$f)E#5yu!dMn8DAFtZTVPJ0aXr0re^U(7yQ3!X~;M z|IZC(G%4(&It8(jLWj4}xEt^$aD=ZMB;9D*Hj6g+q-NZ;?2D+7UOHq=10F$w=>FXM z7(=fKeqjY_ire3JhpcM`*re!)jrI2c7(iaoAiKcete6lnt>QbIL&pRRiRz-Bth?pH zQOWN_L{D~<yKP(TsbYyuLGLsg#ykWwqyxdVw4eWR;aeMD8@j#o9C^H_*930LY@<&n z7f@wUx;3(rMsxf4mUGEE)jEs4)K|4kf+J6(ZRt;47<1eAo*K`dBE9AiZ<HSmQ-QdY zaDG+6?-kz<FYOv=+P<?d&Pf@K^G9isQq@wJj2fR<aJ@9?*Q0iQpwQF^t_LHhzjLsX zTZ??D+0eIhP$RQjR#o(-0?|c-@>0A4;{I65#S3M&rkan%+?R+UyIp4OCh_U<OX=0F z{RACPvuDb8i$T{bm?KgQd+zp9OWTFNer<wc`J^qz<uYIQH8}&Dt^jVRPN-Kbv3N}S zTGF(lCmb4&u5uq2MpX9YiuW$wWzPi>ROUZibSvX|LyIb_wJky>uQ=u`zGw0|-N_*0 z5ip0{@nzf@&ZFL$)Fo>go~WC#@*-2L@4G*)o5c*e`uTS-MiMg0i({c~;Pzm<?+{tN z1U$?ki>D3;p#iwsM#VvDO}W)}Qlvk1P0NVOw3g~&cQbV7x*=i2k0?KvsLy)cR#lyy z5PETar$$4D^mxCddatXndTDT?cmVRcc6IKh*4@K2P)rAyRhU;no=hJfqp^Wyu6iMP zeeRVEXf-!BVpmZ;#kb7hd{0@{WAmk~=b7z}(fN&rF}h_XIou1*4b~%3n#08XCuLCQ zC>CJ?E5jtv%qQM!_9ce;1=!Q!(bCBYF&Dkc^T<4~tzLM`jRMQ>!xhkeJD$nwhe+nf zG2Lo@N#qj0?~5FdhlG#M?rI9}_$#tEyUCgtZasj1A0j>#wvOEBTzV=6ExaTaNFOj+ zIkI|ZSOv$O1DpoAmDEXLQ-60`7-?yx0a|;cgK%_8u6Nw(0gD_BvYc}$aZea{yiBjQ z#tf>st-+-|`kD3LPJ+(gGrS4(H7t-`)|#)4j*z5d#ZXh1y~-L8esOkqdZ}Z1c`VHE z!3uJuGEkZt0IK02t39lnOs`83#=1c{SL3_iR$3tZS0af{P4>9S+lzV@PDx}oc8?!Y z7QNrOI1F#ib>WQ0^G%O9X_}3zNZkxqiFrrMtC@5!9YNHtzOJd_b)sT1jEaA4T<)dm zLdm7w)6SJ6Apw@~ZE|ywZq&Xm!XZf8LWTMMyBl&d__Jupn|sMIOnj47)kz@rP|Ve< zal+tm<GN=bj-HqfduaiWW!WpwIgX8i9d8FN2hTqGt5#g-D-jvN4ZWpK0?p8lJ{{i5 zH=c=8S)+6(V=6khzKue8yu(Mql}=W&mG_q=62`cfu$5N`|Na*)X5*T%wjP`f2U>w7 z?lK8u7EoBXxjZj(eU8>iZwXdXWFw#r`#}z8dOx#0-wC#2Bq@Uvw~Y+MI9F=$#9%l2 zCSSNj(YT9(m-^Ja`#*d2Y1Y(eXmGgIhM%G{tSzQS=SLHU7mN_Hz2A2>ERnjfrE%76 zzQjIz_q3<dAeC9Q^rGtan@q)LvhdH-Z$IjWHQ9?h`GX9Dv)->qzb{~4Hu8Iuj;gI` z_{X~}XckRHsar5TXp<#Ov`%^!L{JSHx!*hz`|L?jcY2g)A={$u3rYE&I#+{ID5B!D zw=8fN?^Y%tXKdGHmKbhU>TwNZ%H>1ta{Vwbo+ih_SvE@rl4rk-kwOfa!=fN=s8ODC zMiFVhhu{$Tkbo(<ccoPo$d534I(XSyh-lVuN$pZ-8b9($6nlW3KeIS8_Jr!yLk50f z@IZg%+wOGn;g#<GYkqG*<sNPjRzB-xU}f?1Ja^VL^?K_e>wWlUx&q?oOiAa$F7o~W z|DKXw&d1vz{gB1O$0zx>DaBR(PPUt2c?>()Fk|0+XpR#?(#>|<Ytc5&uvyY#`W?c- zC~+Y}PQ@FYfMx~k0!*l#jK(Sfr>rKYV&Csz0@+eva+Cm`KBnf=83D(0)E`f+5K##( zQnU2Srzb-cJB92kQG531fCFY8i@Z}3QKGzvb)5e(Bg5z(B2Y@50bP>sG4OW<4StSo zIs{kzSiIVU`r^1Ll5}wRC$I5NmK&$1szq^=2vpBmUI7)Jen^_bn0$+Sj9Q3mj^051 z`>)MLrG<+txKR~$2ra#*cFwUG5;tIA+-$ZO^^A4ZCj8OmoLr8Y(V^^&@l<~i=H_e? z3x6W{7ytNLMA(^^vUa~!xvA3bY!PaXRh~oir?&Hnjh0vzZ?k<^=O;ZH75*p?K7xml zt@3k<4u`vXftHx23&qj{wY#`Y)myskpqLhMAIO3sH5~{XQsTUv!WV2^z(6R9^si|A zqg6w8du5yvLL6LZ4AWs&!HwtmpH!1?#2JFE7>6eVz&-Mk$PmD-%*hrRRV0STjpbPa z-Qp%GlAi;H+84FZ`y%kZ$~=o2=~=7w`2q{q=Rm84!(R$f;OthNs=%wPCO-~<gX^Cc zcA5MlsX=MWJ@xOgl?F%+@TT{9`;5I7GY=}Y7S-)9CHV=Cv8D&BaaaSZdc&I<?evxu zqvnoiWitKrlPNa7<&W)-81&)$^kKyoS@RZ8`R%D+av^uPu30VKaP4o4j0mL!gR`3! zf@39gc%-GAw8$0sSax9A-2+SunhHvfbR;Rj6jn_?vTcGNfeT6}u1c!GhpKoFXNxC_ z7C#X8EAHU7N(OLk*z<ajdt8cO47y5Mko-?|iq>=y2cK9|-SiE&NsnrpV}0tWTs@lD za@S$99Fb*Z%bz_S)oSKzWi_97r2(_sJKh%xyrsNrYHBI@ckFBPJqm``H2REFU&XxC zdeA69jm&ii-$Fh~jj%^OxA~Z+&g-FNY7L6ha3pB(Sp<e9S<~5Y&;DB@Zo{@2dGM;; zN`ZH$5fNB%UIN{ko`SBe;AVBgRN>5Z(!7j13YG6@DD%u?*jebexrB2%dI=-(u@y-v z*-1K6gyWkKYjV;zh@&3@6l)abyMC9M?fhGv@VWoYYusm>B@d<p=I@Tn6L(k(NJf^T zBu3|D5k}DRv}zXQ!_E~N<|{(LhKTJv8WfXDPbWBJg(Iyx#;%tHO3_!yI0drO1Hv^L z%(BRhe`o#QGMVK?@T`{y;IEFf#q{x{d-qFMjsA$$aBJf(A7kSKZ1cAIeR7i+aeROT zB3Kl_7r4vEut~18{W$$xR=}{+&w6**sk;6qeEI=gup*7lg!{JvbDKcR5LSIXXy1`m z*m@;aY`Ts^S7<eHAfQ)JXU;g)K6uh&1x+XW1CuA%!Q;{_WW?$Zn+*R;W6-#J2*Rp| zT-?c+cPL`yZ$sva9&aZwQ??;vMm}BZTzG%0UQBFf`8^@^lb3$K8z=T@qYd(ARwb?d z6>Vv?T-2LG@#Mp9;E*k{d(7{Z1if4g5hw`dj#=u<5{!}#X)CA9Tl&>=XEKKYnIM|L z8+BdxgV=_y3@V~*{aX3kTJT)4v-{9}k#}dlbNTi^re6X3y&k$@FCQx+%Y<{Wi@*qM z_Hwd-q?^gQ4js#H<lXFy$nS2;+IN{v6hvxf{~q~azvtW_CzeXR8{6{MRtP2D3@;kR ztbH#M@j?PPkk&4w&UE<)B(*LRYqkI`^r4!<a^ITqG#ML;*%Ib&crKuGQ4R-dA)ijx zEbO;&HLkPQ_((a6Y3bGpmi``+fSe#+(V65q@NC21zb@BSdhL?|cR)H07>kY1yacdd zG8$0{^DJAfQZL9m7Ml{~Ua~ypy6S2($t<lpEKk-=+iNU_=;-LBkgGu7;*jeXNr?LH zo@;m8#-2}+r<WNi8UrPWwlJE54McwUx7F6#SIgUS+f<J(-K=bU&LaR6rR3F8z0~C_ zd>f*87~L4Z;NCW{IcBGo*eZ_$JJrisL`#nF=6P;ev?W%FHGTvBIi=udm82nk9Q_S2 z#FC;gIP}DhhvEU_H(8S((c3MH7yZf67k97dvaxpPL_}8Hu$ukayu5fomu4SuTk_t{ zkooFE9s>1)+c9}x`37FBiY8CWENgRC$xG%C5|!)3z6HC20ifO67XWE(?RK}3L164A z@(_-jQ;9@>@c`^ceqOu3)gHC@o&)5QgXZNo!rZ5_yCL)ny*)WGCX52cahCYQoiLxR z^IK{;fw@!hpL1?fWAwgA+sVj!5toirN9k1X?^FXi@@#Th26cj!yLxq!nhQc^mhj+s z=n_j1#}&Du8VPi}M?5b|O`0*N2i7FRFoZ#ZCnQA~UB{C1`;-ZL3RK5j40{V1Sl@;x z416_P*b#N#%Y`M0-HrY+zZ^c!^D14prh(FO%dLdV%>VfQUE!3AF<<AZtd~~oLYxBG zX{%scw^;L?$|8>Ear@nsM#?L(%l5GJA6K%Xc<k*S4Iq^=rP{ehjNh%j{5upNatp?% zaz<f&ty!%8(h1Z%(Sd{QKBDR|QKByFE@5*{K08Z=Y^!}KvDV?LLAbd$ujlpTgxu~h z3B(eW5(s1pC%LrA!r%~8qP?V0Dp|3Y=~<-I#?%e6wE$t8N`{rk)YyBNf;>`~YT&`W zre|wIX0rX6bW1F`wQ`-_`j@?JHgZVBC;2ZtuO&Z0$dOa*Z2N7g`|YQEnLxXD@)>UK zVDH%p9vx(RgR`dJ-zZ;3xP<VnMld+b59cGES9Pt%`k_P>AWVHyg<xi-e$<lihRDpW zI+`-M?{Xv0dd#e+VK}Vz`9PbfQ;Z^u%J32%H*IWT78Jt{&ENq??K)At#L6t*$>obw z%f{W0EE$Rood_tn8mC_x+Q@L_%H5-;P+KYiUP{SKsY>O+Klv_W$rY@gaD(-$E|IMK znfBNjA9>!TWmEdd^*Z{~JHzd$r)Kie7>y=mo5BGHqs#u__rD)2*~+3TPl6wC(Cp&K z9Xpu68Moyw|4apmziP{3T4oU&hTvqotI{?&tb`iRarYNujmq_dOEhAl$UAgCN*-Jl zxuUexNd^Brr9ji5p<iLcU=4RTUr=ulY|)P*duB7S7VkaE%r7DSpK%Cd79<<urtsgp z@Ek~$#_w@AH;n1Ob8?5S9RD04-VA=L_n5CigRG!Tvyoi-1Dj3HCUZ<4WQVM?@@J|A z#cy0-L+{#Xo%`L6mN$r{C&Pf~SU|$2&l&aIUh3LecM1d?Jjct0)<nf9$-&MfnIi7( zj-9>_MQCLxbOhX*VwPFjTssXU%W~_o*<hYp>tF-LzRcc<-+#J0{LiON`*VoOf;vog z%P;#<g9^m>O|Od!COV~ar|ok}j2!IM<C_G#V$uNZt}d??`3vE(0K(V&OxbTc-deCd zvJsr|kMZmlY1Oy1`F<CQy2RpktGJ4iGRRq<zSA!8@AHh1*>@$o?G?Tc4~)4reK9l( zjX%1=lKVuLSItiW^kB@KB4IGre)XrM8q8%$?R`PWBw0<{@fZ5~e!sUFd1(~XAwD58 zWYQE))KQI3<_dth)0Q*QV&=+<jbAtDV60Db73g{(_GHz^=gli{$Q+;2jT@VP<UZ<h ztJSX+$6n7*9Mq8A`*t-}zU-b=Z;0i)_qO8B7r$?dFhAuec)D+qeSz3<I|AzgcbXr{ z?2eU0&c+O{P;+k)?7!WtY&-rL`h+0|XqRXrb9hYE3dBE<J%Q)h*Sk@EY1RaBC3c6~ zt)6%E#Yflcr=`6O-@H;zurQTtGBS>dlhXx86aP=Q@JLS&r`JJSR;X?MWlPfhcqOf% zgeY)=^y`YGyZXC2N36$35-M&jMA=71k!8i^n_1}-$E)M^Ts#pN%)nnUKIYsCVvojH z0DbJ;K3f~Gd1Id*23l!eKL@||&+$|VaQUW>45Gi$Kj9U46y3s|I7s9!ucCuBWB`3# zRTs^)|J&;Itk%N5`k7WnqU5VU>;p+&h(kj=!~ID2+W9+>#IinR@Q?k)YcWRhgSZ<1 z_Fhj}WILLW==6l|bBeZQVHy1P_Rrc~2bo^qj-9TD416j?@%L+R!83uM!R-#*jRwxn zJ-PcuTN$>i*b-jioSe7*{C10kv<S&14DZx&F!sw$d>dWveopM#nQJ@{9*}$U3k`)b zcs?&UhwLt<bv3!op|nLZW`9Ce)buQy&r5ArBGL+Vcsrqz$$Hd<F!^bM=SM&O-<J+q zWr~M@DF*s@uTHUdOp8-X7bG^qeOWa!<D*qz`~LMSh((vThYo5^>2iL}c4J+`_m&IW zHzVS7az3k*__};a#I32pQ=O0}9>M1#oHHv<HnIbxQo>XmD&w+XAW|Z^C9hdO+WT_O zCaaql>?o;V-gq)f=eK=X>3zWNuxZJ+Zc2PCse5LhIFKS#aBtJXrZn2VwQDH1h1xaq z&K(hH?c5v|9fsds8xlbWhZ}Nt9FK~1HEV=5)pR&CVq5N>U&fi?N~v4eU&&`?REyB& z9J%7%bO-c|#xPMvOf285!fCo}H<Fzz&0<@0dWI3|170Q1i@ZuTYMtl%A(AK6nS;|V z_dqgcp)#uNC~r-qRlp>**+x&tcnPWX=XB5^X}tRFa6`4z=@;mqj;X(39)+E%^!)ch zt{WkNKy|w(Z9fXe&MjCv-*fP)XU?ZsQBVoOd3VEaRxsnPJ_*u^)rRTpD0*=P9J)fa zM)f_M78?{o`EvplCuZ?i_%Zo5#YX><CFs2%VDP)bv6+?tz?BHNnC;kg!)B0;?zrE_ zj){jFTCvNx=hARj{4B1zsqz}Xcc~7h)N-KVEqxU25o&RRXLaIKogFcQ-?&Z5kAHVd z?%Uy!5y_))-||wWmccsf1VC&KdRBKU3f9I)J4tOB?erAV6X{Q@+~(J+ZF>l#^?$4+ zus#!#xXBQ8VJ!|D0TNRqpxg*3SS=HmnJlzly(eJh`c0h=4x-K?AJ@1rO`~rq<n72O z!i6m~6k)rHC_wq7g>i|w@Hht8q_(khe}!rQ^^c%~)#)!i*<0+yt@I_HsCV!GP@cNZ zQW0_WM(u}o5g*7&e!tRC3F0*_=Xz#t=J2UqUXBrZx_Q$>y4h*E`r)NixZvxWTtK^) zM@d6xdoGfCk}fc&(boIaVK4ROoO6nPI^q$BpxvX9G(g=v$ggYV+9WdR^;d_wY> zE11$>qB;ktsB8RL&zZp2kY7Y(M+=a{$Y|E83m?1ORlz0EDDV0=Q4z7r?6W1X57G8n z-y!jp8_T5|)sGI~Wi2{#u{%0|K8WZ1R8CPd$m~R?0lMwpAmuN7DJMkAVKQo1`ikz! zZaq%BPtddnqh6E6)%X^4^k4Z%*1=0|4;H}`Uhl-phoiGYdLFT;$&ZspQe8PM7>#Or z0_4Hd3`f(C4Fd>WYsF|M>)q{5ZB7^CxWGS)!YE;d0MU}^DqhN`zLIOpNz0QJHuXWh z&uK{Nmm7ThE4vfN-NYZm@Z2(hP8T1;DHrdx3x3tNc1epq+_+@SZv~2n${Uufc()Gu z@O7aj{Q0vOU&Mm%U0H|3$4IYQ<Tl1q{yBhARBtsWHWGz{&NN7!gj#fWQ3|SePkm<~ zL(co{Yv@u}gi{DHPvNk2t2-VZg{)MFk?5F`Hae(=|Cu)~=%k=tm-b`@VF9|AcirXw z=wBIQOFDLDPfs=o=ilIYU}#$JZg;`i$V;VC`=<L#wb%CanUmPDFzZe&WF~oFbImG< z*Q$Ja%Dln-VRO|*Cvn*2%+EJqoD)rGE<)w}qa=Pz2HIotH35jjEu{cn&+=$%Dlr*g z^ewYoUHvtVzV_A_@F|F4RVY;)u+zHeOW$)#bQxn)lEUQPzKw`Inyl%QkkcdP5zozu zJU~pjZm*Sc;W!Y(E>}qhk==Na?zYB)&a+>BDeJ-GHJ7nwe~mi2Y$&|eE^EK)C@>y7 zbqq8B_qC`))}{fDWR=hc<}8<=l=r&Hb+MyKG~3UO_$+0Z0)(0e#N+6R!ya^F*|yeh zON$`;w08|^{)LW<bCruyf_=bya!=veChsziqmJrM`MA+s99am)1*`ra!B^S*xudVm z;ScS)pxr=@9%!j05&ivHB&yJ$i14-tc~koKZ|7ow0v+<ndHNI3ZtLxJmGva}f4jtD zi9Peq+M0?pr_4#@;zXuRonV#KYgP3IrLK}{^BaB#A2Q-q(}@IHOl=3iwGG|mvFj^v z9@fV5GUvi+jyQ53H)0Gn=Y#SyTMiD0;p4lxiR-!stkWNyW)7L)IrKyK4}P;z5(i}# zt*eNlYiuK}PU%eqhceRiO6nu@Yx0m`a-1zg%uTUW*}nd>ota$}j<x_j!;jT${dV-y zv;s0#F7Lm$SD{?9ESepn?UX3dbc+`%wL&Yo&<E%S8cn3=xn3+>J@3}F)F~76=iy{Q zo3N?W<8vnOHHaZrx|cTkK5gg65H(ntb2(M(UN48o&>_G{fvqdCxbD~>cn!xa;xK2s zNe^EZ%RU?|TC>;1eKS&n{i@Y)>Hca3)n|p(Dy8ba@oR=Pfo!xO{E;(`2w?Yg*M%+B zU4(-aoA)ltP${e_xr^DO3S)ov5>Of&iS{2a$Uu>I<}?`^CKw_3<U!lfSna=b-GmzF zDMYexUDCxlr{eS06I@|6bTPi#4IM`8E67}VMg-(qx&W+LBQxNSiSOaK5n4BhgeHb7 zp4|(1h=Coftww+J!3oqbn%iV)v~gvWvp_0!zWy4IKS#>LQ3ILHh`^(6PQvkJ%iRNL z8*d#2nAE{Low_=QbovC#QjE%RCaQ_Bn878a$1-c2r8BUwRV7lv<$0{b#Y_R}PYDfr zH|VmF2<W6%E>abP0!<sB4p`%+Khusdaq_dX1I0@Z-^EZS_q%SuT4U#XFeHTrRG99U zO#mqjc3=&9q>0VEJX^<MS}#0(*E75c$m8wWd7ZxqXF!70#6}Ap{g;GKKJQTUzf}3t z&|0+=LL7j#{sdkQaIEz6$t|+tNou3ayWXT2GwYn$0kw6KiE;Ubq)@{+wapxWpm2@R zCj*5DP}}jD)E_V9MdAie#BpB3+h?~*L_%0uHyAf6jK9@X%5{?&%>3@bAQ>B+an$gw zfaU-bsT3j0emT`cD&uzO3yj{zbu}|7yDrcRR%YAJ4Kjh%t*w{NvfhjSvflgt4QM0s z#ph}rol0RAPo&&9_p^IGM*<>Wi9`R=xv_`K&kG<{FXkAJoyRkKjPg1MjD!l%<8|n8 zD3{qx&benss8F6;v_$(&jN$w%lX_byB;jb3j#D8iSrCk{IP2>tl7wq>9}m#wB^Jck zbG2y>dVsdbVVQv>2Wn8$!{FP(4}=E*;%ya^s_BW(4>AJpiD{CymGHFf_LcQmP@!8O zX*LZC04$-kcQ2<omg}&>HWfa&>Hgi@Xv*@D-1zwRYWtp_#NS1J=;6zgNMhd%%_9-7 zLeybOJ$=)yr#&QcvMXmkT^mX3`gNF3K0{=x0Th$C&cDptqn{TC-{O6&=#_4-`K0#@ z9sqdN%Jo59!akbU(dli2jMvaFeoSe;{<>}f;&l+*@vsF{I^685h(V8^%GA9k*qlEJ z0%+21m2rMF>h_djp3byzfg^)P_N*Rm4CAH1)OW2?Uh<H|4A4%l&d0ABQgy7Wx?fo| zvEL<axPCiJt_0pa;VBXO=H|&UKD=?97C}k_!M&mV=&^sPTV-|{+M8?nr1%co6G_GB zL56EeQhjXAuOJe-nGJD<g7T>oC9=jiM)k!!w!^kCZys>UqVi3{RwhndXClB+ic67b za;;;vafc3G4)JO|okvgc;Zb}<Om22|JM>^;2tbBqSG(`GL#=irpt~393YB!{6e7X8 z8y2iEuspxM?7lQ%@pF-4WNhHdJ&$NVhgr(U2>9)T@{;I`g^k3B!C%a3X!%-17xZbq z{WB_%4g=1XcG&8dpS6=sPlo|yp=SG5ZX&>R_rA_3RLmk|DPEeEFK8)WTCx@A$358A z6Ofc$Qa2?2jvJui;fdmG1~Yk%MRL#&DlO_py7NtC1^R{?k{$RX2#i}`XJ+LcUcL?? zM0n=Y%ytqTFFDL*V{IL^?{TVTu8MsdpeJO0*YdF3ciI;rt7a_TVxszKe1^jT4g(6> zVL5}6C&))qD9M9ywAFS2T5>o`^m!RFy`n&f4Ys*DZW3@$Utaq)qQU7<+Wnc&YkzrX zfznMbMBi?UiE}S2jvGu+HT8P#pE#(ui<)bm$@F!eFGgZZpant1jOw3z#)sq~P9M9Q zhj@D##FpQAXKX@{JMa^3_L!Ek0?ys~=$zkHcB&b5X{{G*F#I9`eiUq&*frO(UEu9( zM7FLv&Y8m}T+5#^`W3bdlW-#1n*&mKdguJKe-b?fL>~NBb6ERUoxM8}RBgg$vQ%Fh zD@z->=X<em)iGbc?9`XE=4&vFM)tdv6hyf9ECXk$=^>6g!wYPDi4a%U2iFyt`z&1$ zirxyXojuySR7RFEz*$@Li=P@lZ=63U|I~Qw`o9*))HYE!(7ThSV}VkI#jXA=5gyBx zUmn$zM;uhJts8mWghHbX)I-a(!w*`La)Q<<&E-O&L`78Nqu2f(<$m^Y@pYHuof5?H zjYdD{oBex<Jl6@M*H8MAy@BiktXO0-K}FH_4sV&gySgKH0>)2pAK(y*^=)qObmSSR ztuPgU?KF!5mU5$sURW4;5dx=_YENij5>gDfDzzW_?3}Prfn{MUCeX>V1!VSB&<8xw zOw&s~Te*YW{9Y3Cp?4u|a5^-n#rM+ssGo<yu(m~9XQM~_{Q0JZshS4<s`*nm5w4JE z;WM_Hrqdm&v&zJD_$X5+Z(P^52ak^3$&0rP=#Q!A)?pdlg;<R+jUDaIYf_G<pW#Py z-tVOM5ytFZ#MBh2$QZM#r0n3}T6hD?+;NU!>HY+4#kUp))wOrw?os@{f7oDO`RExr z1MZdiCM`coH|zg-RG`3<DS^nl7cOFVmG=B+?D`K4qP@Z+O0K9%yg)HaDFosWl5<^q zsqd?IE}qi{;g4+E*BXXqm;FLliB)UL%Dya>Y<Lt-2jH(9aO&ryd|Txec#9_Y*{TB4 zD05Qs?>GMCG@_hIcPu9~dCEj~3pH3hH8gwfd5k?%z>P7uq59SX1w@!htYx}mtg}&N z1rCv&@wFvqyqk%VBI<lo7m7c&j2;(62lY&no?3ni$fDuQt}yAqsrnH4WH#o-10EV> zER{<;5UF5YnoK8?Y=^3_cx>HB3dywPK`gjqg{MfA7ZSy}+W0*DE34g7xmpKz#-FF~ z@p~C9UU!TDaz3Bpd*A(uapIr$P#kev(_y*c@TB`aHQn(6A}pn_*?V#BE?IBZ;m2Rz zPPqra^qaz$1Lz!@DVNS~97UyhOXco+eiv&-FPh)5<5#g*ZTu2@<h^v?Mwqz=Q{8`4 zNHFK!!s$nyfVOW%)%X|^vq9xgAmHF=i^_vx%=VZQ(f$vJjvkaJ$aIuXA1hSCySnOh zBS|=@H%o9@t>$<-k`C8aB`n;ncKUrA8{~FhZsZB0B~2LJ62BOX<=*a4oD4pBVq8wD zKbg8npTh`ZxAomgHa<*8K75w(#wuD6Myv{qP_PF9t<H0{CVy~q#V#6p>TEe(Z?nF9 z6gU=f_(7!dk$y8NVsYG1%pq}z!lZii>lOjo>`Hj9TY&%E@-JUADpYLThJgX{J@SDf z@qr65!u>F%8u{686|afg&@#oX{9?X}R<q3&hvnYSys-J95-zGRz6y{LBC{cKyn(K} zffK8o^a6h&j?W8XG6p?SoKs^==d8=Gr%KnpNhaJ|%OdsNsa%TdHXt3}8W(4Oda{Gl zyo}I~Ia?y;c(?Z2HYMuSK?#~_;i77xKQ&DVcSCNfDk8Z|0O;GKUb4HOKVuWHn60@8 zBxu)+bT4Vm-*gr&R+KVndRDFh4&kBfbl40%2cWr@xvT~a<(AN#SbWWObzAYSYYb)P z$nRd)(8AM#oNy&R)Vq|xDB)$?Qx5C?eDRZVQblDKu6BdIA=#1>mW=h641W`~xx7KU zOtvZI@TrflL^ju^EclvQwKjzaUg_#)NL_*VAtk%piiIw#fNpS(ukq|a<al0FjYPYx zr|s;&yXEr@XgF5(*ks!8<ehBw?!vMpTC@5!yu|M&lcc30N-*EZt#mYY?Q8i4<%wAU zD96cRGNN1q^-w<pao7wKEOB?8<aS%DD<TpSOj3PL#&tQ@zBfeOJF$tntAb2yi4ijk z)o@|+4KmCGTID@`ZaqU-1ayzoHzqZf>1>#YydojZ%+p90@>LYsVN<*GXwWu^QFGwO z%)Q2xFg=49Dv>7IB|)<eZ9}B#6oQ2oHYd&;&qy0PKXEV^_rS8@$M9oRqW(!~KObwS z(p!cP_n69}fc382|KxWx^f>IYP6WRyA-bV1-;PI7yMI0aZGBF(c>ScHqdG#Z(}1-) zEvjRMN!60KQVgdxQ(pd#^Bn!t&#m9JETjLHn$VU>y6jhWcl8`CSa~&`M>ymjJNqwR z>eHQEet8V~gCie$q<OJNHaQ$D3JBxo@OhNmHf`h2-WJmnqoJs{K98jPW-|Q+=pQtV zM&28*GN6xUee{w=9L9bQEsf_mTlYuE_A;%0@xH^SXp$RC=z2(_CfAKllU`LXvh3@* zLCZA1#zJJZJ*V`p(s8-|Cl8KsS@DOeC2w4AsK~xqU<q8D7B(}5@aaeOZ6wBNn&P_n z)%<e#T8Y!QA#Txuqa0%0shvwntad%k?l%76PK3gNW`Dd<zN`(n5dFs1`j)*uS{1C& zFNMH6fgg5K&?K>l-*o=)_;Sd8c&G{4%E{~U@(*ZQ>ByqUY3*lIMAR8F>W}H*P(TC5 z!g~4+sSOpbz^xr+?mKGXuwm31c9D0pAhuUMsGm{I1=?rvNnnXvd(Ii<5_JtY#fuJ) zW&eJllGc$+F7`dD#+!OM(veUvX`%pEUg$UbaRk&C3t5ky_|=$S+~=5-WSS<4qVCE; ztW@DmhOQgPpU`Dz-3GKA{sUv_5Ru|IOeblzFm{l~)0a_Lpj5O4_X6Ckrf9Wa+L2@( z({;w{(betyJ?JZ@`ZY-gP*eMzvkg~xbxmfW<9PaC)VNn01RjxkXFF~6Rmnp<(zOyc zsRy@P&hiqKgRj3aYjp|h=7MPI+v9RYKby--E%Ow!aGor&U^4Sc25w+vHTCIZ{X!J# zwy*wktY<Vl^beZ>Nsrz+*+^JQx+9mJKcHGAUE(IA-AY5yAnSg-!cJyayi|YW9x34U zN$O22t!fh=R?#J-?qw_~LhPH};@dh|6-n#EQ+4zp6U;UDr)6d?`g2i_n(=I{yi~oy z8lKG>vbt<+yD{Ox+P2o-OI?S;ZF8>Yis2zeibVx<S$F|D%<`-hx+d@EJZ5>hMIj8i z+-pgnC`HOk<J~b=F`CA#v9QHDtqnpV5jLZ;578grohb})^Ob~-?&gMRb2;{EUcBou zCb0~JebSl59NsHNw3x)MFVw6rG=T4^$hZ6^Of2UJSd+MsE^zx(jV^evN}daOc7=Kn z<r^$5gvY{kn=B!Cx9>)yOVn(=`LB|1j?+e&Go^=q`}=I9ADa(TOY_9%H*szUGW}5( zKU4U?(g^sz8|Uz0Al=C~+{c_I-zGmcz~nSZ1oH!Dx^EHjex`KqBjG}b=jY0Yr;<QH z`vJ|bZf!nY!?1$vnzOluteU#1HeD6S$xNM&P50wYds^L4vg?STwmjSiDhk*Wp8_NW z>#`oaxLtX<JG<r>x70VGc;~x4S*+B}1(dK&{3Y$M<{c#;0SW=w2C={$=F7)pUzO3W z3~|$40xphQ`Z=bk|F=c-7xypWKtbno=_B{8E9Z_y&y%_PTyZpXx?_#BQPRJm>GT`g zpM0iZ5ZJ`I>WUVHL@4jy_QHRnF*I%tzntj-HZ7t=JD=>|3~k%Znr%+sgG+Tt<=eCi zeDVI0WRjG1+Xhijs=|TZ(f`D0aPL0xyLqXx(k#CFjQmEZtV$bGfbZ~N#kTFW)N~Lt zC?Rtllb=Q0-TIrq^`9gzeTLxmqg`J7&4k~hZ)6O&K>PhLj7uShjK#Cyz{2w<bezh! z>G!sB|NHleJbi1JPF-%xUY!-=`jN>M6?$x2pTG62s*+j3z|upf)78&U#8dvyE$Kc} zFiZvg@Q5;wVc=5(f56fb^%XKGTzXFf!M+*9$%Ikn{cH{L(5jIC`yVlPW-gvhKkXfT zEAu>EdcV!Lfc{4M;P3%Bg6zOKDYA*tDxK^T<T5RHWH9^x+}EdTu6r#DuRhxsHOWaU zkPkNf2=<-{a=_jGNvX8UOO<+Psw_40@*UxCvKBBi^5Ivm_#ACvdz=4eW?f2Vl)cRC zy11TlG=aBnGO`gQobc&V(-is^$`<<mb#w;J{BGSUOxgd}kcJ*@MiU=nT){Kp4BNtA znbci%Tq?L{BY=F)7ux`Y3H|Tiu^v}y-iWv?>iQ!;gT|LQq9XM9P;(cJEI#|U$J4y~ z$Nd}+{Xo^nQ_PA&bN^Z)d#(Vb1>D{!kHhNPxWmzhxs#w@{4^qQmatO2x6NlicrH9K zwpfGoe@>#GF5Fi#Wz__v(&sX@wSs})K}qC&;CKDSDN>AAsS6SRa&l-QrI97!+F?Du z^wmO~Eaex6L76=1S}1LUAe#!`eEbk%^S>hjT_#0WpY~#j6W@-|k(td23UlQm8D+t} z?UXbJt*OhS2XY@LX{Zt8;hzuaQggI|>B<40DB~M!&rEYIx}(H0-zd2$-r_a!6uL4v z3f)AOY}sA;lSIBnuH1h`-F%#!i=4i+BVZ4Jjw{9Sx4mbj9D&0A#$fs4xR<K=18GJA zg69`}O+Bw*&{l}anoD6Vg-ds5@X21=+y{Z>ZcQe1Moa5>k=8ca+qQT>zcuJq&n1g< zLRsWjhTxXp9lZgyUs~rp<St(~VGBWG&+fuhT<RV!KTW$>;g^sEa>D+GR}9}XZ}E`< zeCe`)$Gr@7c{CA}>n#<SB)L18kSt)4An7z2XINtTHCfma0rU(~)`l}P4NJ|^IvE8` zlP)pkLDn@uefz8lpk08N;a5PicNL&`bzjI7CrYuIB#ir-=aOsCIFZ}jc$7~?%a{u| z=HFTX@p;pgcA9{r*rxOdz-F8@{H;9O_9a07Y)yf*3K&3yH{>^!Tv>yTw!Lx45?0(m zi6&~M2&?PpT{;|W$R<L&x7R|U*-xI@HA+j*S3ckvy16=G;`a+~RIRZRDc1AG&ayu6 zzThnJS+d()=^+jX@{*xzGi*6MmPy^4=$4B_<VD0Pe`6#3f>8U=eyFP;Jc3&!J6j^K z<_FfMO)wMc5Is&9nW~kJ3{kyxg*!(A6~mX~3Qv&~G2Z|}x&HUd0zE(uRUa&r67k=q zP{ZrzVt&-*9~ZOr7TVFPy|=C||El2H1!5=uhSCV1P3m!SY^F;4QPYIK1T4}LE^`IA zb<PX1bLahCbUQ=%%gc<5o|ADZ336S(qaAG^%y4+&WwY@V7>wR#0f}5?ek?;78y<`L zW)7qhD!@d~iGT^2)37BYCR4`Z7fhsfvp1f{#6DYUn<6)sT`t)~dZZ|t?5o%ee$m{C za)z854*Mu>>`T<1_HorGt$s{F4P!5#`Ib?fua~9ko(G(>_#{RM`2E?^X!PFw4g8e7 zxdSXp8SbP<b28obK3F-cN^l+nbn4{jwzY(XPs~Z{QWx^grjXlzIOj9x`5!Yzw}#Nr zzn$vEzxPj92$0>37K#NjdM>5Bf|qK1gZn9{d;Yexf$!^v%)g3c+dj_o@#hZbJJGna z(1WSXj>x6=<gw3Y4N~dJ1d4ZfqJ3xqvBeb-MZCgGnV@}t(^f~7X+IwzPLlboQTF5V zyM~7$eut)e_P3eO@SD|vyZJ;;&I@}|pWkIX*5XK6*7E{N-4;&I`CExLOV)Lv%_gof z;Pg+m(^Tb_0T9UHv39tLS@*3jDM38^&|cQ60jGm#T*_QZeT@>%J(3DY7c#4l+c660 zXarLErUe+Ro-=Y-ahNP<vbl(4{XUg6WKX0Dv7PaAvLqQ$y}CRc%FLBAZ29`P_|1V0 zii_b?L?}NL`P`=(Ys<@854<KM<F{fld94)GnOgs|oQ-&>H@U^ku`Od+TT;kP56p{r zDFy0Skdd7X6aR8vA-fhsN-E<(^t@&9<Pg@8M+0P}&ugPL<u*%LfK77p=PPbIZ#Pfy zv^G!8GMdAHLYeReLg79~sS3_g5{u(ECu?|nV(j-}4=`F+P7|mS_b0Xy)jk82#EArN zbPZsrANWk}Vigmm!~i3v`7PeFZyuBl_XnhOShL__LE)*f3SZ1L(d+&U9^y#wIjeaj zj;+cSKgw3D^pW)HV{RCYsR8!fzC!=c*MvMI#`428tA9(|5h3IsE0(|q{}2Wxt}(x& zp|_O}a;-|QSei>zmPcQs4p{uQTGofM<r>F~l11dWv`KZ47ccmfhBpFxzt{FkMcd3A z%(+MVE1fI<umtSg5^GRBU+!bX%^0&yO_Mm8qhd9u2}@>b^BHH;Pl7xT&!n4{8U$?S zmMd&;m(Hy`_<wF{f90f~2=oen_tY(VF4lipUfBCx*W+e8pcw-5^syBfv|(p>9mk0c zO68D0epHYmjNdO7@>I*{XIQrYvvB|JP?$p~`~D+B9``=BX#HwYh@IHPGGB+D>gzhO zzL9)OtMSt?-2~xMTli=HA)jFg>{F<}B$GDbv8ao4Z+K(2BG`~)vF#DdKhfI%o%q1_ zE57q3MBKgsZZJ9$hYF2^E&gc_PB~~U-t9gEkWaQ;)O+<z-uSVfXF_bjOXgx^WkViR zpcp_bsm*khXICJ#o@ud2^)iO(a(vPJ@hUmF(swGe^jOL!n{{)!#h5cPG>$q%sjGLy zRbh$RwmOl`vu%rmQe5fg4SpeMlxhPRdf!ZuuKVV?g$bGVjHtj#uQ*sbeaDC}nyui_ zUjRN@q2UM(b@Hs|j&<x^F!3c&NyieF5dM&|YkQzVk9Srg13e*X3U<#}`auCKHVSud zy6AI(6g3o1Rw0SHslJEW*%g3f;_rUXmkx*gwTVM!Aga%{)}Z@;#(~VD{T{OGBL{jP zn2tZR8rybL1$PF&r1l^G4rT<BtC*krm2zmqg}1c<Fc~2wiwr^d`U{8wGvicRY?jID zNU2qz+tU{(%Xa0up`Pk2vSHq%c`k(-Z%2%I92h3ESW%P6_&H_kDBdV-<Hw6Qd%6Kl z*4BgZI}7B#bChbOZ5Cu)WY49|M-*R_p7F*HkK%uQKtORjLuYaU`@c%WR{26mI81Zw zlQCgL(@q{b2z9b6GX0c#c<ECFA1e!a(L36cq@pvRGJ(Ch&C-x4M2u~bdp|pp>0VLO zr^|^y5RLY+Q<M7?j>zTX+*6}=o94nw|8l!}u2CdFi2VQ7-+JHsL3-aVh#2CbQ7i}N zD!CUUghP?+1+#8qw^Yj@w1jir)PDwS)W%gd7!-80PQ>h9$_e-OQ{p@Ps5Y)G59yVa zKQNNt-zqEyCcFt?)>>w?NY@L^ZEp`-Q3oGB=KlkaLXaC}G5Q>a7C~ofAOo$58;%$t zly9Z%P2SOCfe}h#KTR9C0QAXv;1X32rjl&P*vhp$h^s`p>T!Ut6KtG5;6$zSD{T@* zU`tE4Ef;67u7x%J&uTdozZgBvYmNHkKdr1l!qB(i@8k<klc)cJVT0Rgc#hD?ku(4? zIwcog>qjt}m}ZoH(bCYD6=-2|w68BlROKc7NKyC|?PP4>KpA&e3ZErMco=!{4>Mcl zf47Tl43@a&_%(KOL~H~-Cpd}8KC+Aov*egf#Z5*NDIr2uOm@3NpeB&Jo15;2qysV4 zN4i9=R!&gim*`x}c;X*J+NNi0se7-z$PEQHz=@2W!6AIlrC9_n$gZ@BW?aV5O*WX5 zM-|n&<Zm|D5=5n5TxlYxj)vrTR-)*YK-Dm>uQBTa3S{>bV-0+&Hb7Usg`)yLIA^JH zxS<9%TQq`52bqL$CfmjdKXK0XgRr0BOxM*D=@V6C@K;U7a;^g+CBojsPkp((c%!r? zSKtesNTV4!Cv}avNk6Z7%3IF7K7glI+XVlWMx7_J0jHZPF=}xb2iNN7<CK|A1SG$q zM=wYt*1h=x0;MC9|99)L{r=b0qoZ6v0G{gzWINT1uM;Y=slM5V)_&omR$5-AFeX!0 z8ro;iYDag^*nX(Vl6uI=Ku?!vZWNoZo$_am-jI${Hl4{OvR;f#<FJ87O8~z}^(wGQ z?&`m$D+Orr4a%$72J*|Q`UH6_oR%KpXOxaU??rT;P9*~sM8M@NKY>(datPhelI*+W z|4lf1kO|d3!P`A!_cZxN=sq`wg={*EZ~D|k`}m&^)VDY0$U00g9358jfOnSb5oH{V z4x47WE&}_uOn2e`ooycjA4tnxSlp!za<6w@;hpOkqtne_lbW2gPUouuP8F-q-oN}) ze2CRK0s?qL7X2Ku3e|j1Htn7^o8%W38*k;D^>&J1vHE*htorX*b!~RftOS5D`;(1+ zb%Hv9ZcVQsSDLhQ>CSR}^AA4P0nq^AFG-i=HOB}TyNPulkg!dr@l5Aw=@YAu{|gyb B{I>uA literal 0 HcmV?d00001 diff --git a/SmartHome.App/Program.cs b/SmartHome.App/Program.cs index e1ad7a3..ba90a13 100644 --- a/SmartHome.App/Program.cs +++ b/SmartHome.App/Program.cs @@ -12,15 +12,17 @@ public class Program var livingRoomThermometer = new ElectroluxThermometer(mediator, "LivingRoom"); var bedroomThermometer = new ElectroluxThermometer(mediator, "Bedroom"); - var livingRoomLight = new IKE565Col(mediator, "Living Room"); + var livingRoomLight = new IKE565Col(mediator, "LivingRoom"); var bedroomLight = new PH500Amb(mediator, "Bedroom"); - var livingRoomThermostat = new PhilipsThermostat(mediator, "Living Room"); + var livingRoomThermostat = new PhilipsThermostat(mediator, "LivingRoom"); var bedroomThermostat = new PhilipsThermostat(mediator, "Bedroom"); var frontDoorLock = new SamsungLock(mediator, "FrontDoor"); var backDoorLock = new PhilipsLock(mediator, "Back Door"); + + // Register devices with the mediator mediator.AddThermometer(livingRoomThermometer); mediator.AddThermometer(bedroomThermometer); @@ -36,10 +38,15 @@ public class Program // Test temp change Console.WriteLine("Simulating temperature change in Living Room..."); - livingRoomThermometer.SimualteTemperatureChange(22.5); + Console.WriteLine("Expecting lights and thermometers in the living room to react"); + livingRoomThermometer.SimualteTemperatureChange(40); + + Console.WriteLine(); + Console.WriteLine(); - // Test what heppens when we lock the door + // // Test what heppens when we lock the door Console.WriteLine("Locking the front door..."); + Console.WriteLine("Expecting all doors to lock because we are looking front door"); frontDoorLock.Locks(); } diff --git a/SmartHome.App/obj/Debug/net9.0/SmartHome.App.AssemblyInfo.cs b/SmartHome.App/obj/Debug/net9.0/SmartHome.App.AssemblyInfo.cs index 27f1609..88b7d08 100644 --- a/SmartHome.App/obj/Debug/net9.0/SmartHome.App.AssemblyInfo.cs +++ b/SmartHome.App/obj/Debug/net9.0/SmartHome.App.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("SmartHome.App")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ec661a7041a47f852d27b8ec01f922fd5a942b9c")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1468f64e5fc1a79d0625f44aa17f6ab6734d8137")] [assembly: System.Reflection.AssemblyProductAttribute("SmartHome.App")] [assembly: System.Reflection.AssemblyTitleAttribute("SmartHome.App")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/SmartHome.App/obj/Debug/net9.0/SmartHome.App.AssemblyInfoInputs.cache b/SmartHome.App/obj/Debug/net9.0/SmartHome.App.AssemblyInfoInputs.cache index 6582a89..5870896 100644 --- a/SmartHome.App/obj/Debug/net9.0/SmartHome.App.AssemblyInfoInputs.cache +++ b/SmartHome.App/obj/Debug/net9.0/SmartHome.App.AssemblyInfoInputs.cache @@ -1 +1 @@ -6dee3d4c944744a222ca58771e7b3c3dda395da25d98c781600bf95c0aed4e9c +bdea85756725658e5a129b3ff564a6cb67c37aeb03918225c466958c630f380f diff --git a/SmartHome.App/obj/Debug/net9.0/SmartHome.App.GeneratedMSBuildEditorConfig.editorconfig b/SmartHome.App/obj/Debug/net9.0/SmartHome.App.GeneratedMSBuildEditorConfig.editorconfig index 0251ba8..a6aa069 100644 --- a/SmartHome.App/obj/Debug/net9.0/SmartHome.App.GeneratedMSBuildEditorConfig.editorconfig +++ b/SmartHome.App/obj/Debug/net9.0/SmartHome.App.GeneratedMSBuildEditorConfig.editorconfig @@ -8,7 +8,7 @@ build_property.PlatformNeutralAssembly = build_property.EnforceExtendedAnalyzerRules = build_property._SupportedPlatformList = Linux,macOS,Windows build_property.RootNamespace = SmartHome.App -build_property.ProjectDir = C:\Users\nadda\source\repos\SWD\handinswd\SmartHome.App\ +build_property.ProjectDir = C:\Data\Itm8\Repositories\4semester\designSWD\handinswd\SmartHome.App\ build_property.EnableComHosting = build_property.EnableGeneratedComInterfaceComImportInterop = build_property.EffectiveAnalysisLevelStyle = 9.0 diff --git a/SmartHome.App/obj/Debug/net9.0/SmartHome.App.assets.cache b/SmartHome.App/obj/Debug/net9.0/SmartHome.App.assets.cache index 7143cec4bd16b0069a30a5d807eaa490c610b17e..a4bb6a1e67e327ca2c0d454d9e39624feb6cc6f3 100644 GIT binary patch delta 75 zcmaFD_=Hh2z}wxChk=2iVvi9E(;pZ0z-iL`F<x`m$?e~yoVj4i1%ZyJEy1zwn;uLw fRG#R-A<P6+EAMO-6Iz^FR2-9-lb4t^F})T5+Ws1P delta 75 zcmaFD_=Hh2z}wxChk=1XH|vrA1ml>Kt8BbAgfBb0YfhhXD{{}z<KGh4wmI(et9>xh fP<f&QhcFXRt-P~UOlWaxQE^OOVoFNl#PnJKBH|nY diff --git a/SmartHome.App/obj/SmartHome.App.csproj.nuget.dgspec.json b/SmartHome.App/obj/SmartHome.App.csproj.nuget.dgspec.json index b69132a..a81da9c 100644 --- a/SmartHome.App/obj/SmartHome.App.csproj.nuget.dgspec.json +++ b/SmartHome.App/obj/SmartHome.App.csproj.nuget.dgspec.json @@ -1,23 +1,23 @@ { "format": 1, "restore": { - "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.App\\SmartHome.App.csproj": {} + "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.App\\SmartHome.App.csproj": {} }, "projects": { - "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.App\\SmartHome.App.csproj": { + "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.App\\SmartHome.App.csproj": { "version": "1.0.0", "restore": { - "projectUniqueName": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.App\\SmartHome.App.csproj", + "projectUniqueName": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.App\\SmartHome.App.csproj", "projectName": "SmartHome.App", - "projectPath": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.App\\SmartHome.App.csproj", - "packagesPath": "C:\\Users\\nadda\\.nuget\\packages\\", - "outputPath": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.App\\obj\\", + "projectPath": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.App\\SmartHome.App.csproj", + "packagesPath": "C:\\Users\\alnaj\\.nuget\\packages\\", + "outputPath": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.App\\obj\\", "projectStyle": "PackageReference", "fallbackFolders": [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" ], "configFilePaths": [ - "C:\\Users\\nadda\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Users\\alnaj\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], @@ -33,8 +33,8 @@ "net9.0": { "targetAlias": "net9.0", "projectReferences": { - "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj": { - "projectPath": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj" + "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj": { + "projectPath": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj" } } } @@ -74,20 +74,20 @@ } } }, - "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj": { + "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj": { "version": "1.0.0", "restore": { - "projectUniqueName": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj", + "projectUniqueName": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj", "projectName": "SmartHome.Lib", - "projectPath": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj", - "packagesPath": "C:\\Users\\nadda\\.nuget\\packages\\", - "outputPath": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\obj\\", + "projectPath": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj", + "packagesPath": "C:\\Users\\alnaj\\.nuget\\packages\\", + "outputPath": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\obj\\", "projectStyle": "PackageReference", "fallbackFolders": [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" ], "configFilePaths": [ - "C:\\Users\\nadda\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Users\\alnaj\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], diff --git a/SmartHome.App/obj/SmartHome.App.csproj.nuget.g.props b/SmartHome.App/obj/SmartHome.App.csproj.nuget.g.props index 26f8ea9..ed5ee59 100644 --- a/SmartHome.App/obj/SmartHome.App.csproj.nuget.g.props +++ b/SmartHome.App/obj/SmartHome.App.csproj.nuget.g.props @@ -5,12 +5,12 @@ <RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool> <ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile> <NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot> - <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\nadda\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders> + <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\alnaj\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders> <NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle> <NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.13.0</NuGetToolVersion> </PropertyGroup> <ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' "> - <SourceRoot Include="C:\Users\nadda\.nuget\packages\" /> + <SourceRoot Include="C:\Users\alnaj\.nuget\packages\" /> <SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" /> </ItemGroup> </Project> \ No newline at end of file diff --git a/SmartHome.App/obj/project.assets.json b/SmartHome.App/obj/project.assets.json index 1e6b3fa..6ca41f1 100644 --- a/SmartHome.App/obj/project.assets.json +++ b/SmartHome.App/obj/project.assets.json @@ -27,23 +27,23 @@ ] }, "packageFolders": { - "C:\\Users\\nadda\\.nuget\\packages\\": {}, + "C:\\Users\\alnaj\\.nuget\\packages\\": {}, "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} }, "project": { "version": "1.0.0", "restore": { - "projectUniqueName": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.App\\SmartHome.App.csproj", + "projectUniqueName": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.App\\SmartHome.App.csproj", "projectName": "SmartHome.App", - "projectPath": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.App\\SmartHome.App.csproj", - "packagesPath": "C:\\Users\\nadda\\.nuget\\packages\\", - "outputPath": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.App\\obj\\", + "projectPath": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.App\\SmartHome.App.csproj", + "packagesPath": "C:\\Users\\alnaj\\.nuget\\packages\\", + "outputPath": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.App\\obj\\", "projectStyle": "PackageReference", "fallbackFolders": [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" ], "configFilePaths": [ - "C:\\Users\\nadda\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Users\\alnaj\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], @@ -59,8 +59,8 @@ "net9.0": { "targetAlias": "net9.0", "projectReferences": { - "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj": { - "projectPath": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj" + "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj": { + "projectPath": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj" } } } diff --git a/SmartHome.App/obj/project.nuget.cache b/SmartHome.App/obj/project.nuget.cache index 3b82782..be6270c 100644 --- a/SmartHome.App/obj/project.nuget.cache +++ b/SmartHome.App/obj/project.nuget.cache @@ -1,8 +1,8 @@ { "version": 2, - "dgSpecHash": "R74As9VQkhM=", + "dgSpecHash": "3YVf7fiQTug=", "success": true, - "projectFilePath": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.App\\SmartHome.App.csproj", + "projectFilePath": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.App\\SmartHome.App.csproj", "expectedPackageFiles": [], "logs": [] } \ No newline at end of file diff --git a/SmartHome.Lib/Behaviours/LightColorBehaviours/ChangeAmbientColor.cs b/SmartHome.Lib/Behaviours/LightColorBehaviours/ChangeAmbientColor.cs index f6f2939..48e5c86 100644 --- a/SmartHome.Lib/Behaviours/LightColorBehaviours/ChangeAmbientColor.cs +++ b/SmartHome.Lib/Behaviours/LightColorBehaviours/ChangeAmbientColor.cs @@ -2,6 +2,7 @@ public class ChangeAmbientColor : IColorBehaviour { public void SetColor(string color) { + Console.WriteLine($"Ambient color changed to {color}."); } } diff --git a/SmartHome.Lib/Behaviours/ThermostatTempChangeBehaviours/RadiatorThermostat.cs b/SmartHome.Lib/Behaviours/ThermostatTempChangeBehaviours/RadiatorThermostat.cs index fb33def..fe50267 100644 --- a/SmartHome.Lib/Behaviours/ThermostatTempChangeBehaviours/RadiatorThermostat.cs +++ b/SmartHome.Lib/Behaviours/ThermostatTempChangeBehaviours/RadiatorThermostat.cs @@ -4,11 +4,11 @@ public class RadiatorThermostat : ITemperatureChangeBehavior { public void DecreaseTemperature(int temp) { - throw new NotImplementedException(); + Console.WriteLine("Decreasing Temprature"); } public void IncreaseTemperature(int temp) { - throw new NotImplementedException(); + Console.WriteLine("Increasing Temprature"); } } \ No newline at end of file diff --git a/SmartHome.Lib/DeviceBaseClasses/Light.cs b/SmartHome.Lib/DeviceBaseClasses/Light.cs index 975eafb..599c8cc 100644 --- a/SmartHome.Lib/DeviceBaseClasses/Light.cs +++ b/SmartHome.Lib/DeviceBaseClasses/Light.cs @@ -1,5 +1,8 @@ public class Light : SmartDevice { + + //Base class for all light devices + // this implements strategy pattern because it has behaviours that are set in the sub classes. protected IBrightnessBehavior _brightnessBehavior; protected IColorBehaviour _colorBehavior; @@ -11,16 +14,17 @@ public class Light : SmartDevice public void TurnOn() { - // Implementation for turning on the light + Console.WriteLine("Turning in light"); } public void TurnOff() { - // Implementation for turning off the light + Console.WriteLine("Turning off light"); } public void ChangeColor(string color) { + //Delegate call to behaviour _colorBehavior.SetColor(color); } diff --git a/SmartHome.Lib/DeviceBaseClasses/Lock.cs b/SmartHome.Lib/DeviceBaseClasses/Lock.cs index 5f02ee9..6633963 100644 --- a/SmartHome.Lib/DeviceBaseClasses/Lock.cs +++ b/SmartHome.Lib/DeviceBaseClasses/Lock.cs @@ -1,5 +1,8 @@ public class Lock : SmartDevice { + //This is the lock class that will use the lock behaviour to lock and unlock the door. + //It will also notify the mediator when the lock is locked or unlocked. + //Strategy pattern is used here protected ILockBehaviour _lockBehaviour; public Lock(ISmartHomeMediator mediator) : base(mediator) @@ -17,7 +20,8 @@ public class Lock : SmartDevice public void Unlock() { - // Implementation for rotating lock + _lockBehaviour.Unlock(); + Mediator.Notify(this, "Unlocked"); } diff --git a/SmartHome.Lib/DeviceBaseClasses/Thermometer.cs b/SmartHome.Lib/DeviceBaseClasses/Thermometer.cs index 3974519..703081c 100644 --- a/SmartHome.Lib/DeviceBaseClasses/Thermometer.cs +++ b/SmartHome.Lib/DeviceBaseClasses/Thermometer.cs @@ -1,7 +1,8 @@ public class Thermometer : SmartDevice { - protected double _temperature = 0.0; + //Base class for all Thermometers + protected double _temperature = 20; public Thermometer(ISmartHomeMediator mediator) : base(mediator) { @@ -9,9 +10,11 @@ public class Thermometer : SmartDevice public void SimualteTemperatureChange(double temperature) { - _temperature = temperature; + if (temperature != _temperature) { + _temperature = temperature; + //Send event is a SmartDevice method that notifies the mediator about the event SendEvent("TemperatureChanged"); } diff --git a/SmartHome.Lib/HomeMediator.cs b/SmartHome.Lib/HomeMediator.cs index f95b868..1833885 100644 --- a/SmartHome.Lib/HomeMediator.cs +++ b/SmartHome.Lib/HomeMediator.cs @@ -4,9 +4,11 @@ public class HomeMediator : ISmartHomeMediator private List<Lock> _locks = new(); private List<Thermostat> _thermostats = new(); private List<Thermometer> _thermometers = new(); + //This mediator allows for adding Devices at runtime. + //This is the notify method the smart devices will use to notify the mediator about events public void Notify(SmartDevice sender, string eventMessage) { if (sender is Lock) @@ -39,6 +41,8 @@ public class HomeMediator : ISmartHomeMediator _thermometers.Add(thermometer); } + + ///This method will be called when the lock is locked or unlocked, this is the handler method for lock events. public void ReactOnLock(SmartDevice sender, string eventMessage) { @@ -46,17 +50,18 @@ public class HomeMediator : ISmartHomeMediator { foreach (var item in _locks) { - item.Locks(); + if (item.Location != "FrontDoor") item.Locks(); } } } + ///This method will be called when the thermometer is changed, this is the handler method for thermometer events. public void ReactOnThermometer(SmartDevice sender, string eventMessage) { if (eventMessage == "TemperatureChanged") { - var location = (sender as Thermometer).Location; + var location = sender.Location; var temperature = (sender as Thermometer).GetTemperature(); var kelvin = temperature + 273.15 * 200; @@ -84,6 +89,8 @@ public class HomeMediator : ISmartHomeMediator } } } + + //This is a method that is called on the mediator to turn off all lights in the house. public void TurnOffAllLights() { foreach (var light in _lights) @@ -92,6 +99,7 @@ public class HomeMediator : ISmartHomeMediator } } + //This is a method that is called on the mediator to turn on all lights in the house. public void TurnOnAllLights() { foreach (var light in _lights) diff --git a/SmartHome.Lib/obj/Debug/net9.0/SmartHome.Lib.AssemblyInfo.cs b/SmartHome.Lib/obj/Debug/net9.0/SmartHome.Lib.AssemblyInfo.cs index 35b3dbe..796137a 100644 --- a/SmartHome.Lib/obj/Debug/net9.0/SmartHome.Lib.AssemblyInfo.cs +++ b/SmartHome.Lib/obj/Debug/net9.0/SmartHome.Lib.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("SmartHome.Lib")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ec661a7041a47f852d27b8ec01f922fd5a942b9c")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1468f64e5fc1a79d0625f44aa17f6ab6734d8137")] [assembly: System.Reflection.AssemblyProductAttribute("SmartHome.Lib")] [assembly: System.Reflection.AssemblyTitleAttribute("SmartHome.Lib")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/SmartHome.Lib/obj/Debug/net9.0/SmartHome.Lib.AssemblyInfoInputs.cache b/SmartHome.Lib/obj/Debug/net9.0/SmartHome.Lib.AssemblyInfoInputs.cache index f3be5e1..3f43e4f 100644 --- a/SmartHome.Lib/obj/Debug/net9.0/SmartHome.Lib.AssemblyInfoInputs.cache +++ b/SmartHome.Lib/obj/Debug/net9.0/SmartHome.Lib.AssemblyInfoInputs.cache @@ -1 +1 @@ -d7dee6328978ad7da1ae295f9180fe568c02e17152d61238508adb1c8e9aab5d +16caeba47c6be3e6e9a82dbad912bc106fa29efc531bb7d6751d27eb684ef347 diff --git a/SmartHome.Lib/obj/Debug/net9.0/SmartHome.Lib.GeneratedMSBuildEditorConfig.editorconfig b/SmartHome.Lib/obj/Debug/net9.0/SmartHome.Lib.GeneratedMSBuildEditorConfig.editorconfig index c7f31d5..9a4e4c0 100644 --- a/SmartHome.Lib/obj/Debug/net9.0/SmartHome.Lib.GeneratedMSBuildEditorConfig.editorconfig +++ b/SmartHome.Lib/obj/Debug/net9.0/SmartHome.Lib.GeneratedMSBuildEditorConfig.editorconfig @@ -8,7 +8,7 @@ build_property.PlatformNeutralAssembly = build_property.EnforceExtendedAnalyzerRules = build_property._SupportedPlatformList = Linux,macOS,Windows build_property.RootNamespace = SmartHome.Lib -build_property.ProjectDir = C:\Users\nadda\source\repos\SWD\handinswd\SmartHome.Lib\ +build_property.ProjectDir = C:\Data\Itm8\Repositories\4semester\designSWD\handinswd\SmartHome.Lib\ build_property.EnableComHosting = build_property.EnableGeneratedComInterfaceComImportInterop = build_property.EffectiveAnalysisLevelStyle = 9.0 diff --git a/SmartHome.Lib/obj/Debug/net9.0/SmartHome.Lib.assets.cache b/SmartHome.Lib/obj/Debug/net9.0/SmartHome.Lib.assets.cache index ed4691e5e923e2955650612073bfe8fdfa42cded..c6c0ccf93ea3cb615bde128e96932c384bf93850 100644 GIT binary patch delta 75 zcmaFD_=Hh2z}wxChk=1%+U}O<e}}ZDyT=^Qs`JTPAmSFj^#2N{c?%s=7w=M%R(mkf fP<f&QhcFXRt-P~UOlWaxQE^OSPF`Zx#PnJKKd>A4 delta 75 zcmaFD_=Hh2z}wxChk=2CYoXN4Zkx*aE4l=qxf}Mg3th@HvrXA4cjj<{<BI=5nhz!# fDo=Fa5M~0Zm3Ov^2`x@7DvrrZOi4+cm|hD2-X0on diff --git a/SmartHome.Lib/obj/SmartHome.Lib.csproj.nuget.dgspec.json b/SmartHome.Lib/obj/SmartHome.Lib.csproj.nuget.dgspec.json index ef4c81d..6cbc392 100644 --- a/SmartHome.Lib/obj/SmartHome.Lib.csproj.nuget.dgspec.json +++ b/SmartHome.Lib/obj/SmartHome.Lib.csproj.nuget.dgspec.json @@ -1,23 +1,23 @@ { "format": 1, "restore": { - "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj": {} + "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj": {} }, "projects": { - "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj": { + "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj": { "version": "1.0.0", "restore": { - "projectUniqueName": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj", + "projectUniqueName": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj", "projectName": "SmartHome.Lib", - "projectPath": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj", - "packagesPath": "C:\\Users\\nadda\\.nuget\\packages\\", - "outputPath": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\obj\\", + "projectPath": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj", + "packagesPath": "C:\\Users\\alnaj\\.nuget\\packages\\", + "outputPath": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\obj\\", "projectStyle": "PackageReference", "fallbackFolders": [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" ], "configFilePaths": [ - "C:\\Users\\nadda\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Users\\alnaj\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], diff --git a/SmartHome.Lib/obj/SmartHome.Lib.csproj.nuget.g.props b/SmartHome.Lib/obj/SmartHome.Lib.csproj.nuget.g.props index 26f8ea9..ed5ee59 100644 --- a/SmartHome.Lib/obj/SmartHome.Lib.csproj.nuget.g.props +++ b/SmartHome.Lib/obj/SmartHome.Lib.csproj.nuget.g.props @@ -5,12 +5,12 @@ <RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool> <ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile> <NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot> - <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\nadda\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders> + <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\alnaj\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders> <NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle> <NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.13.0</NuGetToolVersion> </PropertyGroup> <ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' "> - <SourceRoot Include="C:\Users\nadda\.nuget\packages\" /> + <SourceRoot Include="C:\Users\alnaj\.nuget\packages\" /> <SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" /> </ItemGroup> </Project> \ No newline at end of file diff --git a/SmartHome.Lib/obj/project.assets.json b/SmartHome.Lib/obj/project.assets.json index da90365..d19202f 100644 --- a/SmartHome.Lib/obj/project.assets.json +++ b/SmartHome.Lib/obj/project.assets.json @@ -8,23 +8,23 @@ "net9.0": [] }, "packageFolders": { - "C:\\Users\\nadda\\.nuget\\packages\\": {}, + "C:\\Users\\alnaj\\.nuget\\packages\\": {}, "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} }, "project": { "version": "1.0.0", "restore": { - "projectUniqueName": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj", + "projectUniqueName": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj", "projectName": "SmartHome.Lib", - "projectPath": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj", - "packagesPath": "C:\\Users\\nadda\\.nuget\\packages\\", - "outputPath": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\obj\\", + "projectPath": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj", + "packagesPath": "C:\\Users\\alnaj\\.nuget\\packages\\", + "outputPath": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\obj\\", "projectStyle": "PackageReference", "fallbackFolders": [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" ], "configFilePaths": [ - "C:\\Users\\nadda\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Users\\alnaj\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], diff --git a/SmartHome.Lib/obj/project.nuget.cache b/SmartHome.Lib/obj/project.nuget.cache index b4cbd4e..d3927cd 100644 --- a/SmartHome.Lib/obj/project.nuget.cache +++ b/SmartHome.Lib/obj/project.nuget.cache @@ -1,8 +1,8 @@ { "version": 2, - "dgSpecHash": "Z8BYAI5QS48=", + "dgSpecHash": "XVUkJaqY93g=", "success": true, - "projectFilePath": "C:\\Users\\nadda\\source\\repos\\SWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj", + "projectFilePath": "C:\\Data\\Itm8\\Repositories\\4semester\\designSWD\\handinswd\\SmartHome.Lib\\SmartHome.Lib.csproj", "expectedPackageFiles": [], "logs": [] } \ No newline at end of file diff --git a/plantuml/ExampleForDocs.puml b/plantuml/ExampleForDocs.puml new file mode 100644 index 0000000..7a1a009 --- /dev/null +++ b/plantuml/ExampleForDocs.puml @@ -0,0 +1,2 @@ +@startuml +@enduml diff --git a/plantuml/SeqeunceDiagram.puml b/plantuml/SeqeunceDiagram.puml new file mode 100644 index 0000000..cadce02 --- /dev/null +++ b/plantuml/SeqeunceDiagram.puml @@ -0,0 +1,19 @@ +@startuml + +participant User +participant HomeMediator +participant ElectroluxThermometer as Thermometer +participant IKE565Col as Light +participant PhilipsThermostat as Thermostat +participant SamsungLock as Lock + + +User -> Thermometer: SimulateTemperatureChange(40) +Thermometer -> HomeMediator: Notify(TemperatureChanged) +HomeMediator -> Light: React to temperature change +HomeMediator -> Thermostat: React to temperature change + +User -> Lock: Locks() +Lock -> HomeMediator: Notify(Locked) +HomeMediator -> Lock: React to lock event (lock all doors) +@enduml \ No newline at end of file diff --git a/plantuml/SmartHome.Lib/Behaviours/LightBrightnessBehaviours/ChangeBrightness.puml b/plantuml/SmartHome.Lib/Behaviours/LightBrightnessBehaviours/ChangeBrightness.puml new file mode 100644 index 0000000..5422cf9 --- /dev/null +++ b/plantuml/SmartHome.Lib/Behaviours/LightBrightnessBehaviours/ChangeBrightness.puml @@ -0,0 +1,6 @@ +@startuml +class ChangeBrightness { + + SetBrightness(level:int) : void +} +IBrightnessBehavior <|.. ChangeBrightness +@enduml diff --git a/plantuml/SmartHome.Lib/Behaviours/LightBrightnessBehaviours/ConstantBrightness.puml b/plantuml/SmartHome.Lib/Behaviours/LightBrightnessBehaviours/ConstantBrightness.puml new file mode 100644 index 0000000..63052df --- /dev/null +++ b/plantuml/SmartHome.Lib/Behaviours/LightBrightnessBehaviours/ConstantBrightness.puml @@ -0,0 +1,6 @@ +@startuml +class ConstantBrightness { + + SetBrightness(level:int) : void +} +IBrightnessBehavior <|.. ConstantBrightness +@enduml diff --git a/plantuml/SmartHome.Lib/Behaviours/LightColorBehaviours/ChangeAmbientColor.puml b/plantuml/SmartHome.Lib/Behaviours/LightColorBehaviours/ChangeAmbientColor.puml new file mode 100644 index 0000000..20a2b6e --- /dev/null +++ b/plantuml/SmartHome.Lib/Behaviours/LightColorBehaviours/ChangeAmbientColor.puml @@ -0,0 +1,6 @@ +@startuml +class ChangeAmbientColor { + + SetColor(color:string) : void +} +IColorBehaviour <|.. ChangeAmbientColor +@enduml diff --git a/plantuml/SmartHome.Lib/Behaviours/LightColorBehaviours/ChangeColor.puml b/plantuml/SmartHome.Lib/Behaviours/LightColorBehaviours/ChangeColor.puml new file mode 100644 index 0000000..9bae47c --- /dev/null +++ b/plantuml/SmartHome.Lib/Behaviours/LightColorBehaviours/ChangeColor.puml @@ -0,0 +1,6 @@ +@startuml +class ChangeColor { + + SetColor(color:string) : void +} +IColorBehaviour <|-- ChangeColor +@enduml diff --git a/plantuml/SmartHome.Lib/Behaviours/LockBehaviours/RotatingLock.puml b/plantuml/SmartHome.Lib/Behaviours/LockBehaviours/RotatingLock.puml new file mode 100644 index 0000000..4864d75 --- /dev/null +++ b/plantuml/SmartHome.Lib/Behaviours/LockBehaviours/RotatingLock.puml @@ -0,0 +1,7 @@ +@startuml +class RotatingLock { + + Lock() : void + + Unlock() : void +} +ILockBehaviour <|.. RotatingLock +@enduml diff --git a/plantuml/SmartHome.Lib/Behaviours/LockBehaviours/SlidingLock.puml b/plantuml/SmartHome.Lib/Behaviours/LockBehaviours/SlidingLock.puml new file mode 100644 index 0000000..43c8d24 --- /dev/null +++ b/plantuml/SmartHome.Lib/Behaviours/LockBehaviours/SlidingLock.puml @@ -0,0 +1,7 @@ +@startuml +class SlidingLock { + + Lock() : void + + Unlock() : void +} +ILockBehaviour <|.. SlidingLock +@enduml diff --git a/plantuml/SmartHome.Lib/Behaviours/ThermostatDisplayBehaviours/LCDDisplay.puml b/plantuml/SmartHome.Lib/Behaviours/ThermostatDisplayBehaviours/LCDDisplay.puml new file mode 100644 index 0000000..6113f8d --- /dev/null +++ b/plantuml/SmartHome.Lib/Behaviours/ThermostatDisplayBehaviours/LCDDisplay.puml @@ -0,0 +1,6 @@ +@startuml +class LCDDisplay { + + DisplayTemperature() : void +} +IDisplayTemperatureBehavior <|.. LCDDisplay +@enduml diff --git a/plantuml/SmartHome.Lib/Behaviours/ThermostatDisplayBehaviours/LEDDisplay.puml b/plantuml/SmartHome.Lib/Behaviours/ThermostatDisplayBehaviours/LEDDisplay.puml new file mode 100644 index 0000000..ae58bc7 --- /dev/null +++ b/plantuml/SmartHome.Lib/Behaviours/ThermostatDisplayBehaviours/LEDDisplay.puml @@ -0,0 +1,6 @@ +@startuml +class LEDDisplay { + + DisplayTemperature() : void +} +IDisplayTemperatureBehavior <|.. LEDDisplay +@enduml diff --git a/plantuml/SmartHome.Lib/Behaviours/ThermostatDisplayBehaviours/NoDisplay.puml b/plantuml/SmartHome.Lib/Behaviours/ThermostatDisplayBehaviours/NoDisplay.puml new file mode 100644 index 0000000..dc5bf4d --- /dev/null +++ b/plantuml/SmartHome.Lib/Behaviours/ThermostatDisplayBehaviours/NoDisplay.puml @@ -0,0 +1,6 @@ +@startuml +class NoDisplay { + + DisplayTemperature() : void +} +IDisplayTemperatureBehavior <|.. NoDisplay +@enduml diff --git a/plantuml/SmartHome.Lib/Behaviours/ThermostatTempChangeBehaviours/HeatPumpThermostat.puml b/plantuml/SmartHome.Lib/Behaviours/ThermostatTempChangeBehaviours/HeatPumpThermostat.puml new file mode 100644 index 0000000..88e6e74 --- /dev/null +++ b/plantuml/SmartHome.Lib/Behaviours/ThermostatTempChangeBehaviours/HeatPumpThermostat.puml @@ -0,0 +1,7 @@ +@startuml +class HeatPumpThermostat { + + DecreaseTemperature(temp:int) : void + + IncreaseTemperature(temp:int) : void +} +ITemperatureChangeBehavior <|.. HeatPumpThermostat +@enduml diff --git a/plantuml/SmartHome.Lib/Behaviours/ThermostatTempChangeBehaviours/RadiatorThermostat.puml b/plantuml/SmartHome.Lib/Behaviours/ThermostatTempChangeBehaviours/RadiatorThermostat.puml new file mode 100644 index 0000000..b56897b --- /dev/null +++ b/plantuml/SmartHome.Lib/Behaviours/ThermostatTempChangeBehaviours/RadiatorThermostat.puml @@ -0,0 +1,7 @@ +@startuml +class RadiatorThermostat { + + DecreaseTemperature(temp:int) : void + + IncreaseTemperature(temp:int) : void +} +ITemperatureChangeBehavior <|.. RadiatorThermostat +@enduml diff --git a/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLights/IKE565Col.puml b/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLights/IKE565Col.puml new file mode 100644 index 0000000..f708b7f --- /dev/null +++ b/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLights/IKE565Col.puml @@ -0,0 +1,6 @@ +@startuml +class IKE565Col { + + IKE565Col(mediator:ISmartHomeMediator, location:string) +} +Light <|-- IKE565Col +@enduml diff --git a/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLights/PH500Amb.puml b/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLights/PH500Amb.puml new file mode 100644 index 0000000..b205014 --- /dev/null +++ b/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLights/PH500Amb.puml @@ -0,0 +1,6 @@ +@startuml +class PH500Amb { + + PH500Amb(mediator:ISmartHomeMediator, location:string) +} +Light <|-- PH500Amb +@enduml diff --git a/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLocks/PhilipsLock.puml b/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLocks/PhilipsLock.puml new file mode 100644 index 0000000..0562300 --- /dev/null +++ b/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLocks/PhilipsLock.puml @@ -0,0 +1,6 @@ +@startuml +class PhilipsLock { + + PhilipsLock(mediator:ISmartHomeMediator, location:string) +} +Lock <|-- PhilipsLock +@enduml diff --git a/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLocks/SamsungLock.puml b/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLocks/SamsungLock.puml new file mode 100644 index 0000000..0408828 --- /dev/null +++ b/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteLocks/SamsungLock.puml @@ -0,0 +1,6 @@ +@startuml +class SamsungLock { + + SamsungLock(mediator:ISmartHomeMediator, location:string) +} +Lock <|-- SamsungLock +@enduml diff --git a/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteThermometers/ElectroluxThermometer.puml b/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteThermometers/ElectroluxThermometer.puml new file mode 100644 index 0000000..e82ba3f --- /dev/null +++ b/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteThermometers/ElectroluxThermometer.puml @@ -0,0 +1,6 @@ +@startuml +class ElectroluxThermometer { + + ElectroluxThermometer(mediator:ISmartHomeMediator, location:string) +} +Thermometer <|-- ElectroluxThermometer +@enduml diff --git a/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteThermostats/PhilipsThermostat.puml b/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteThermostats/PhilipsThermostat.puml new file mode 100644 index 0000000..396cc57 --- /dev/null +++ b/plantuml/SmartHome.Lib/ConcreteDevices/ConcreteThermostats/PhilipsThermostat.puml @@ -0,0 +1,6 @@ +@startuml +class PhilipsThermostat { + + PhilipsThermostat(mediator:ISmartHomeMediator, location:string) +} +Thermostat <|-- PhilipsThermostat +@enduml diff --git a/plantuml/SmartHome.Lib/DeviceBaseClasses/Light.puml b/plantuml/SmartHome.Lib/DeviceBaseClasses/Light.puml new file mode 100644 index 0000000..1f1c42c --- /dev/null +++ b/plantuml/SmartHome.Lib/DeviceBaseClasses/Light.puml @@ -0,0 +1,10 @@ +@startuml +class Light { + + Light(mediator:ISmartHomeMediator) + + TurnOn() : void + + TurnOff() : void + + ChangeColor(color:string) : void + + ChangeBrightness(level:int) : void +} +SmartDevice <|-- Light +@enduml diff --git a/plantuml/SmartHome.Lib/DeviceBaseClasses/Lock.puml b/plantuml/SmartHome.Lib/DeviceBaseClasses/Lock.puml new file mode 100644 index 0000000..3181506 --- /dev/null +++ b/plantuml/SmartHome.Lib/DeviceBaseClasses/Lock.puml @@ -0,0 +1,8 @@ +@startuml +class Lock { + + Lock(mediator:ISmartHomeMediator) + + Locks() : void + + Unlock() : void +} +SmartDevice <|-- Lock +@enduml diff --git a/plantuml/SmartHome.Lib/DeviceBaseClasses/Thermometer.puml b/plantuml/SmartHome.Lib/DeviceBaseClasses/Thermometer.puml new file mode 100644 index 0000000..4fd30f6 --- /dev/null +++ b/plantuml/SmartHome.Lib/DeviceBaseClasses/Thermometer.puml @@ -0,0 +1,8 @@ +@startuml +class Thermometer { + + Thermometer(mediator:ISmartHomeMediator) + + SimualteTemperatureChange(temperature:double) : void + + GetTemperature() : double +} +SmartDevice <|-- Thermometer +@enduml diff --git a/plantuml/SmartHome.Lib/DeviceBaseClasses/Thermostat.puml b/plantuml/SmartHome.Lib/DeviceBaseClasses/Thermostat.puml new file mode 100644 index 0000000..a689ab5 --- /dev/null +++ b/plantuml/SmartHome.Lib/DeviceBaseClasses/Thermostat.puml @@ -0,0 +1,10 @@ +@startuml +class Thermostat { + + Thermostat(mediator:ISmartHomeMediator) + + DisplayTemperature() : void + + SetTemperature(temp:int) : void + + IncreaseTemperature(temp:int) : void + + DecreaseTemperature(temp:int) : void +} +SmartDevice <|-- Thermostat +@enduml diff --git a/plantuml/SmartHome.Lib/HomeMediator.puml b/plantuml/SmartHome.Lib/HomeMediator.puml new file mode 100644 index 0000000..5cb0648 --- /dev/null +++ b/plantuml/SmartHome.Lib/HomeMediator.puml @@ -0,0 +1,15 @@ +@startuml +class HomeMediator { + + Notify(sender:SmartDevice, eventMessage:string) : void + + AddLight(light:Light) : void + + AddLock(lockDevice:Lock) : void + + AddThermostat(thermostat:Thermostat) : void + + AddThermometer(thermometer:Thermometer) : void + + ReactOnLock(sender:SmartDevice, eventMessage:string) : void + + ReactOnThermometer(sender:SmartDevice, eventMessage:string) : void + + TurnOffAllLights() : void + + TurnOnAllLights() : void +} +ISmartHomeMediator <|-- HomeMediator + +@enduml diff --git a/plantuml/SmartHome.Lib/Interfaces/IBrightnessBehaviour.puml b/plantuml/SmartHome.Lib/Interfaces/IBrightnessBehaviour.puml new file mode 100644 index 0000000..e28e760 --- /dev/null +++ b/plantuml/SmartHome.Lib/Interfaces/IBrightnessBehaviour.puml @@ -0,0 +1,4 @@ +@startuml +interface IBrightnessBehavior { +} +@enduml diff --git a/plantuml/SmartHome.Lib/Interfaces/IColorBehaviour.puml b/plantuml/SmartHome.Lib/Interfaces/IColorBehaviour.puml new file mode 100644 index 0000000..8534f7f --- /dev/null +++ b/plantuml/SmartHome.Lib/Interfaces/IColorBehaviour.puml @@ -0,0 +1,5 @@ +@startuml +interface IColorBehaviour { + + SetColor(color:string) : void +} +@enduml diff --git a/plantuml/SmartHome.Lib/Interfaces/IDisplayTemperatureBehavior.puml b/plantuml/SmartHome.Lib/Interfaces/IDisplayTemperatureBehavior.puml new file mode 100644 index 0000000..84b1341 --- /dev/null +++ b/plantuml/SmartHome.Lib/Interfaces/IDisplayTemperatureBehavior.puml @@ -0,0 +1,4 @@ +@startuml +interface IDisplayTemperatureBehavior { +} +@enduml diff --git a/plantuml/SmartHome.Lib/Interfaces/ILockBehaviour.puml b/plantuml/SmartHome.Lib/Interfaces/ILockBehaviour.puml new file mode 100644 index 0000000..dc8a854 --- /dev/null +++ b/plantuml/SmartHome.Lib/Interfaces/ILockBehaviour.puml @@ -0,0 +1,4 @@ +@startuml +interface ILockBehaviour { +} +@enduml diff --git a/plantuml/SmartHome.Lib/Interfaces/ISmartHomeMediator.puml b/plantuml/SmartHome.Lib/Interfaces/ISmartHomeMediator.puml new file mode 100644 index 0000000..ae1f1ee --- /dev/null +++ b/plantuml/SmartHome.Lib/Interfaces/ISmartHomeMediator.puml @@ -0,0 +1,5 @@ +@startuml +interface ISmartHomeMediator { + + Notify(sender:SmartDevice, eventMessage:string) : void +} +@enduml diff --git a/plantuml/SmartHome.Lib/Interfaces/ITemperatureChangeBehavior.puml b/plantuml/SmartHome.Lib/Interfaces/ITemperatureChangeBehavior.puml new file mode 100644 index 0000000..103435d --- /dev/null +++ b/plantuml/SmartHome.Lib/Interfaces/ITemperatureChangeBehavior.puml @@ -0,0 +1,4 @@ +@startuml +interface ITemperatureChangeBehavior { +} +@enduml diff --git a/plantuml/SmartHome.Lib/SmartDevice.puml b/plantuml/SmartHome.Lib/SmartDevice.puml new file mode 100644 index 0000000..d4e806c --- /dev/null +++ b/plantuml/SmartHome.Lib/SmartDevice.puml @@ -0,0 +1,6 @@ +@startuml +class SmartDevice { + + Location : string <<get>> <<set>> + + SendEvent(eventMessage:string) : void +} +@enduml diff --git a/plantuml/include.puml b/plantuml/include.puml new file mode 100644 index 0000000..7e4d92e --- /dev/null +++ b/plantuml/include.puml @@ -0,0 +1,39 @@ +@startuml + +!include .\\SmartHome.Lib\HomeMediator.puml +!include .\\SmartHome.Lib\SmartDevice.puml +!include .\\SmartHome.Lib\DeviceBaseClasses\Light.puml +!include .\\SmartHome.Lib\DeviceBaseClasses\Lock.puml +!include .\\SmartHome.Lib\DeviceBaseClasses\Thermometer.puml +!include .\\SmartHome.Lib\DeviceBaseClasses\Thermostat.puml +!include .\\SmartHome.Lib\Interfaces\IBrightnessBehaviour.puml +!include .\\SmartHome.Lib\Interfaces\IColorBehaviour.puml +!include .\\SmartHome.Lib\Interfaces\IDisplayTemperatureBehavior.puml +!include .\\SmartHome.Lib\Interfaces\ILockBehaviour.puml +!include .\\SmartHome.Lib\Interfaces\ISmartHomeMediator.puml +!include .\\SmartHome.Lib\Interfaces\ITemperatureChangeBehavior.puml +!include .\\SmartHome.Lib\Behaviours\LightBrightnessBehaviours\ChangeBrightness.puml +!include .\\SmartHome.Lib\Behaviours\LightBrightnessBehaviours\ConstantBrightness.puml +!include .\\SmartHome.Lib\Behaviours\LightColorBehaviours\ChangeAmbientColor.puml +!include .\\SmartHome.Lib\Behaviours\LightColorBehaviours\ChangeColor.puml +!include .\\SmartHome.Lib\Behaviours\LockBehaviours\RotatingLock.puml +!include .\\SmartHome.Lib\Behaviours\LockBehaviours\SlidingLock.puml +!include .\\SmartHome.Lib\Behaviours\ThermostatDisplayBehaviours\LCDDisplay.puml +!include .\\SmartHome.Lib\Behaviours\ThermostatDisplayBehaviours\LEDDisplay.puml +!include .\\SmartHome.Lib\Behaviours\ThermostatDisplayBehaviours\NoDisplay.puml +!include .\\SmartHome.Lib\Behaviours\ThermostatTempChangeBehaviours\HeatPumpThermostat.puml +!include .\\SmartHome.Lib\Behaviours\ThermostatTempChangeBehaviours\RadiatorThermostat.puml +!include .\\SmartHome.Lib\ConcreteDevices\ConcreteLights\IKE565Col.puml +!include .\\SmartHome.Lib\ConcreteDevices\ConcreteLights\PH500Amb.puml +!include .\\SmartHome.Lib\ConcreteDevices\ConcreteLocks\PhilipsLock.puml +!include .\\SmartHome.Lib\ConcreteDevices\ConcreteLocks\SamsungLock.puml +!include .\\SmartHome.Lib\ConcreteDevices\ConcreteThermometers\ElectroluxThermometer.puml +!include .\\SmartHome.Lib\ConcreteDevices\ConcreteThermostats\PhilipsThermostat.puml +ISmartHomeMediator <-- SmartDevice +IBrightnessBehavior <-- Light +IColorBehaviour <-- Light +Lock --> ILockBehaviour +ITemperatureChangeBehavior <-- Thermostat +Thermostat --> IDisplayTemperatureBehavior + +@enduml -- GitLab