From 01bc39f645c8428fac6c20c801172b26405d773e Mon Sep 17 00:00:00 2001 From: Neil Dorin Date: Wed, 10 May 2017 08:55:57 -0600 Subject: [PATCH] Reworked GUID generation mechansim to use program slot number, plus processor MAC plus room name to generate consistent, but unique GUID for Fusion Room. Added console command to call method that ends or extends meeting. --- .../PepperDash_Essentials_Core.projectinfo | Bin 1277 -> 1281 bytes .../Essentials_DM/Essentials_DM.projectinfo | Bin 1137 -> 1134 bytes .../Essentials Devices Common.projectinfo | Bin 1155 -> 1157 bytes .../PepperDashEssentials/ControlSystem.cs | 2 +- .../Fusion/FusionSystemController.cs | 153 ++++++++++++++---- .../PepperDashEssentials.projectinfo | Bin 1860 -> 1861 bytes 6 files changed, 123 insertions(+), 32 deletions(-) diff --git a/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.projectinfo b/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.projectinfo index 840b16a5c1534e3933e71129c9f3a0d4ad07aeaf..b84c3a2c26ad765e436b0ff7eaebd2919f5a0cd5 100644 GIT binary patch delta 1093 zcmV-L1iJhE34scbg-~LDo6>hL^VKS^pJvVc_dji#eAyQC-S2-=)j7R1yQx7=4d}v07yZ`9k{YSey<4-?*uzPT@z4Pg#ogHd6r)H7b8ZGXA-{1H3 zkN>{EZ*KeieScrqe~SM7#_p>pSwr7UilzT`7xnRURsMibDJ(6MAps(Pi|*^|rp*^G z1j~(6L<761v&Gr$O?Gk1wu`)$2|b?8ingehSqZwxXD8KSMFg6CxxC$MoAy6Ms@`() zPZyJX_PScv)BL!e&Wp?3lJ}%qUB9WGRpl(Nn~xqDLE8K1myAC8qF5G-_2OAkFRrpW z|4C{=B!ZZYcXl4q|Mwn$67VnA?P}e=%-WxQZl~V9$d<)<-n0(Yd-Umz>|rSJMOG}2 z>8r)0ymlb==^Jm>Hh`IxCAAGGLI3UDySE24It1%d>e~bnpY80-@|}D6-oeA&$*0-g zrw`9(5AW^I4j$(D{{6i@YAJJds}U*TZ*KU!nr7t>Wtwj0OCjTb(|naLXZdnUU4QiG zduBH7hqG}~({$I>a{RhjtjgE(tX`4yj-Te2#Wa7tUahLSRe(z1X_n>tll{H>53}t2 z)7^(V_aC0`Wcj`Q{Rj6Z=d*yo?*U!jxqTnEo0&)Nfx!=X3j0&^{n1CS@`mZafBuq@ znY2%DH)&slGc}oio!`%<=h?x|bb4!%xBpADU2b0~|ZDz`V45sH6fIo10 zOt=3po|6Z+nv>IZp4ZE~CG)jdFNK(}t)}R!vv78H4j$gy z-OF~Slby-_{d*5~9_-DC;rH(C=MQ%Co!iWg1sP1tEdYPm#Mo~CUpyzfJK>~wL-m{y zL$RIN?&RTr?BKzJd-oq6+&|wxpXB?~+5P*|y~+K3_VZ)TnFlDGfSbYHasuL={lA&) zyCK;fxdB<;iINft)%Qmk;k8nDF@_Xm!2l;F=$qx3X)7gXF`}Zdg zA0F)IpFY?>IG6-(^liWf^KuK|?>#TWUH`v%g6<7X(CeRg{_VV^UIympd}n%p=l*P# zPiF_&gM)js{mFy-d%F+r@9a(|lLrIyGYB=9o?F0v@97!r`Tu>h)A_*8RVPv4#`ZL8 zv+*n|Yu)S|?CnfG-JR|qOb@cXDGl~u@8SIic|Id{zxUw5bik0rXn1R4cW4=t-UJs2 Lv5T+BM->17h3I*! delta 1130 zcmV-w1eN=N3jGO?g@5wVqqbhtFH`#JWxiVF_0z1G|Nf^^ z)PR1R%a05CvA47PV0-8O_RhUGJ3Ehd_8;x+j&~m(JbbXXyS?-2qn#aUH>Y+dkAC0Z z_q$d7wpd=IPm4OAwpCr^&F}mBy8eFO-}m*8|GvL(Zae*be;r?kKneu>#_p>pSwr7U zilzT`7x(dWRsMibDJ)f!904MKGj*@8n>Js(5F|HF5smAj&K760H`&E4+b;52CiHkV zE83!3W+liXpPf{T713w*~xQuUUTf4Z3Dv)9$Sp618(bY5KMmK#p0)%Ba| zSyj&Ry7}ml5v0A3e#z*gFN$TcSTCLx_2Me4^Pi*^L?ejVcxUG!{eSO&Ap!q#-LBT{ z%dGv`=XUDti)>k(=S}NSy+@zk$RCChUu4Ddn7&#}%4-K=pT6;CZ3CEDSyJ1867=8R z!KVj+(IHruQr{+s^jSWgJ=l48aDVq8->7Y{$RRyuruA+ol;Agt6Pmo z34e3L=hZYTe<;&*GhYgS8K35>d^yXPQ|kJoN8dBEaX*}mlbWWxu9oB1#bQ;yo@e!n z#CQBOzbvNt>-B0?)vW?l0#CCn-=FO7-G7*6=b!FA+`0eod?(BA?e9OhH#wi}`2>Cs z=An4j4|X5k-`(HI^H0xrC;RzidjH<}{XBbci+S4EO)z)2=%H=f4Vohzt4Vt%sKM_g%fZyxLZy@ytDr|lYKWNyJMUe`Bh5_w>t0mZ4akA52yEM z_jYDkKAX+X4<6p1-upD0PR_GwzB9Y;(|!ZAU;=Id^Oh5^p~wF>&%)l&EWFCkON8Ck z@@(1WHRut4PDg(4{QMxFO(xmF{*+>t-TU_`PC3}mKYg%&a4-qn=-Yq|=H(W^-+Nw$ zyZ(Rk1l=2&pw~a~{M&g+y$sCH`OftI&i&bp;>m;T!NI-R{^Y^^z1;`*DTbU(9t_OS zAk<)bZUOtfr)RL||M$&K=L0)e`$Kc}G;6c*ENk6C>>TXvOg`P6?jKAKG79sj`N7`9 w`w#MbM(lp?!Gj-0lpjIwmwf-1{1VPz6zA&q(m2;;E5rVO0B-?3rAHM209mnz?f?J) diff --git a/Essentials DM/Essentials_DM/Essentials_DM.projectinfo b/Essentials DM/Essentials_DM/Essentials_DM.projectinfo index 585e6e4c08d62f2a6c7a4244f818cf12c42bbcb1..88bc6093c887d9fc523cda7e361812cd5a8c6262 100644 GIT binary patch delta 927 zcmV;Q17Q5|2<`}wg@0myo6>iuO_ML%f@%a05CvA47PV0-8O z_RhmMyZevs-G8+E>3Hwnr=K3|(`TPP+S#FYb82_;==c47zgyLBi{(Z7w5aoGTh&G0 z{Jy{M%Y3!U>!(>W|9yYo*FXOI{=T{G^7s9HUH9qJFZ@4$e}DWrDVCkj#?w{#1M0A_ z1AAFlKTUm|EzhfGMVT+NMgFscOo+!yx-F<%Lg%cZPTFgW)a&b}%@;2OmoAA3=HLcs48AqFQDp#weeiRErf2cJ}4+mJ?)N_}L}V@O+&vCi(1jwXUc6 zaXpzzfACR{K3&3mo8aNI-O2vW-sIDJJ9~TQ_s$ z>O3Uh73&xoP#J$Nv^*+P7f-ycEkmwf-1{1T34it}QcK@@0=>#~(0|36Y@(d5Js002;f B2#f## delta 925 zcmV;O17iH{2=NGzg@5wVqqbhtFH`#Jv}y8XThKSZ|I;t1*(~x|PM^__bNO*WKlXNZ zA8ha3-`=_RW@qQo&iJ=dRD0d%WRSV>>v~3v65~J>Xy(sYp9d<+7SEob<^gH7lKNc z!i4Zeoh{C0Z?cQwuNQeOQ*b<+6>U*1vl2s;&rYhvipDzoa(T=7F)#e=QfPR(P8XAW z_PScv)BL!e&J>Hw+|J)gwYq*&J*&!DUN;{-GHjEP0T~u1AMflur2p?dB;a4J+ts># znYBMFT$8{7F@Nvg-`o4BN1rZXzD@AxvxoO5JCpMVpFVhyW%sj#eD~h&9{oStIe&O? ze!la7TFTViVl+zSo0>hZrdj#3H6zMsH_+^9zRH)gd^x4QK6>;$L-_k4;ZJIs*ScDc zUl)s2`Fft!D-yu*)BLiS=C9YQRaLhNP^mf1vV4ECzkhfCVV0eLy8CeF{=@T~EWfwE z|KQ%_e75IP^F5%;JGbxSHWTsaJ^KIIpRxX&e1G)OtGwZX^Pj(DWM=8p+s%@hYbD!c zc78vbo@WO;)9Jm*i-tH`)96a3J-8-1<&Tca`24pZFw*dS>^IFmJ{(PsA`->7Y{$RRCT)MM6y;-Xd5&ssD-wh^k6^#^uhkY!6dN6w*eap!OfG<10a1y3gjSraBy$7KY4I}Z}-7{QW}%VgMkSd zgc{7pEnvUrd<^#c|BC78d|)SMZ)kF!W^Fc}Wv!czgT0-}r@PbrgXuv=ihP^;2y zAkSyS(DxoZxP^uIAiqC?+AsP3FZm@L%@pUwG=nJ67}sShL;imNu{^wJ!Vmxe?E)0| diff --git a/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.projectinfo b/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.projectinfo index 9c413ff623a870f4743f3e47b8d62a9287e8c664..5725875d1b74316cc82a975d26ed8c1aab0b87f2 100644 GIT binary patch delta 954 zcmV;r14aCU355xeg@0myo6>iuO_ML%f<8!}=9k4ZZ_<-$v8a~x&Mf%;_t)=#{}cKu zr?2S8x%{}GAA38y54LyiZ|^*Ov%CN3-u*|r_r~`>efVJS;lu5nPao~>bJ%6B7Iua`LwO-B5!`*-}hy{TIKcAteOA5zwhfG|9^dd-`w{6`~JRzSZ@4k zQf&HuJYAJPAfyUQkC%1z(}d62^1OOhl=(7SwEO+P26H= z@XH~DmSzJKpvx^w?vGJUXnPAz59ZZjU8fE(LAucle~!=9}h8CA&nG+*V* zS-zYS5+6PKo|zO-)EBRsCcUPYUKfj1`Fft!E0XN7KzzMkt*W|JfJ*3TmgW1C{k{7S zv+VrS-G7HW_aC0`Wcj`Q{Rj6Z=d(SZ(C-0V-no4rx0<3y?}5P2-CXu3>-(dRUgZr_ zg#Y{{BQt%U-fH?j&)WPdyKcgnd$6~^m+$TFW!b%h{d;?R2ig7E!`*xWsd;#QklkYD zI)H;oy9M|UnzT;e|KFIe2jP4HGo7~@L18L_c4k(z9TY$UWe8l_u{|5aJ2I=qmh)l&U5ij4lm+u`s+?{-y?S1<2 zeD?6({_Nmkp6}n^3zXcAlU)N?f6+y?JX^MT4a$TQlixc(Kgeg3Np`S5oz5QY-oHP2 z`0!vq|MbEB!NDYuncIL3X6P2c-*<+Fd;b5(RP7E;)$5;l{_VUZ>;`7)d}n%p=l*P# zPiF_&gM)js{mFy-d%F+r@9a(|lLrGcH3&7Bs9V5(--#OR`2W@O)cL^9RNCIqtUb-z zY&^?aH%|w9JCjd$r~3!fgKTd~<0ePy{)0T9kqF#-@L=lC(`IVkmg*g%Mv(g@-~T1Q cgk!bhyqIQ?9vbDkY-P~@4^RhY<4zI)0LXkJ6951J delta 952 zcmV;p14sOY34;lcg@5wVqqbhtFH`#Jv}y8XThKS@)BLiS=1qE1Ef&?1UYP~o|Ni>@ z?|(vH<@6Q(IF}z6^kZ*l_rdng{q3E5Z+3Pb?d;S4#=8&q9_;TNZ0~&fXlIAo&8gkV zqu=-U{ccsiEtVJQ)1uC&ZB-X}^ZWk3FZ0zZub*bk{P+ERUw{Aj@B91aw&&mX_Z`G? z<5!bn)A!@)s{8>VRanBjtgD|Ue9o5V)w80^m)Ro!;UYYY>q<~72sJ|atRY0&Ycr3p zubVbsybyFZO(+fUqRtj)vp3mA&@`A^ZMDd2ncd^rtZ0jBnU$c7d`2KwM55W3%Ue#p zdEw`Vu(#uc(|^SzpS`Zu^)x@Or}N@6x2$net*+lx&#H2k*Ud+dj9~43^h-t`eNiln z#d`6qs25jRo&O}YAZkJE#ydL?>Hm8V3HX=mcC~I_X6+AE2&m&PvSo3eH?70^9({Tf zw-}mykrm5hYP6V?*ABuyedEpKFqBzYQqzDW^xyvO{eL~^qz>h}B>Ogz0q9QeKm7F5 zdwchG_h!@C-rnrNgDl_K-`m}}pC9Z@XVg+A?Kb1l3AnM{^JJ>@$SRlS$uU1vvDnKRlG|Te+$^PE` zhgo+1>3{CSo%;{Zce4E6{{Dk|lk?f0Pw4l6F7MpFk6TUAqxV4I=WZ_hllA@4N3ZgR zDZ+pLl98FdPj5ASpJ#1;m0dUC%strK-^=%Q_pRmjXpPilA?&RU@;K74?_a7eIKi@x} zkp8ZZ$W-Lh*@GP-+U`NVH_aa0 zKfkv(dHC@B!E}#o$r!9}$^Tef)(%5-Gr-ud}KKATLkgZ(LS`R@Ju z#MuY?`KJ%|4-O`QV{jX=q1fCE{C#I=xaa?mOx5ntRK5O*=ikmt!fs%u&UdEwcka(- zq>B!+2M70N`;!OcYd^S8`e!nEFfdbtP=krO1?=~osKJi^Up-Hq5A3Y%4b9q5)2z+L zv#fRVbg;KG`E+->e=t4B$XHBsa-{A*$nzPAz`X|#0xPtcnzyBTho}+ce#!TL$uHqp atvD~H8Kj3sxh`87^#23c|99g|5&!_a8Z*iO diff --git a/Essentials/PepperDashEssentials/ControlSystem.cs b/Essentials/PepperDashEssentials/ControlSystem.cs index 23618c22..381d83b1 100644 --- a/Essentials/PepperDashEssentials/ControlSystem.cs +++ b/Essentials/PepperDashEssentials/ControlSystem.cs @@ -21,7 +21,7 @@ namespace PepperDash.Essentials { Thread.MaxNumberOfUserThreads = 400; Global.ControlSystem = this; - DeviceManager.Initialize(this); + DeviceManager.Initialize(this); } /// diff --git a/Essentials/PepperDashEssentials/Fusion/FusionSystemController.cs b/Essentials/PepperDashEssentials/Fusion/FusionSystemController.cs index a52aede0..6b79c2f7 100644 --- a/Essentials/PepperDashEssentials/Fusion/FusionSystemController.cs +++ b/Essentials/PepperDashEssentials/Fusion/FusionSystemController.cs @@ -32,16 +32,24 @@ namespace PepperDash.Essentials.Fusion StringSigData SourceNameSig; + ScheduleResponse CurrentSchedule; + string GUID; - Event NextMeeting; + //ScheduleResponseEvent NextMeeting; public EssentialsHuddleSpaceFusionSystemController(EssentialsHuddleSpaceRoom room, uint ipId) : base(room.Key + "-fusion") { Room = room; - GUID = "awesomeGuid-" + Room.Key; + var mac = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_MAC_ADDRESS, 0); + + var slot = Global.ControlSystem.ProgramNumber; + + //adminvar guid = new Guid(); + + GUID = string.Format("{0}-{1}-{2}", slot, mac, Room.Name.Replace(" ", String.Empty)); CreateSymbolAndBasicSigs(ipId); SetUpSources(); @@ -63,6 +71,8 @@ namespace PepperDash.Essentials.Fusion void CreateSymbolAndBasicSigs(uint ipId) { + Debug.Console(1, this, "Creating Fusion Room symbol with GUID: {0}", GUID); + FusionRoom = new FusionRoom(ipId, Global.ControlSystem, Room.Name, GUID); FusionRoom.ExtenderRoomViewSchedulingDataReservedSigs.Use(); @@ -73,6 +83,7 @@ namespace PepperDash.Essentials.Fusion FusionRoom.ExtenderRoomViewSchedulingDataReservedSigs.DeviceExtenderSigChange += new DeviceExtenderJoinChangeEventHandler(FusionRoomSchedule_DeviceExtenderSigChange); CrestronConsole.AddNewConsoleCommand(RequestFullRoomSchedule, "FusReqRoomSchedule", "Requests schedule of the room for the next 24 hours", ConsoleAccessLevelEnum.AccessOperator); + CrestronConsole.AddNewConsoleCommand(ModifyMeetingEndTimeConsoleHelper, "FusReqRoomSchMod", "Ends or extends a meeting by the specified time", ConsoleAccessLevelEnum.AccessOperator); // Room to fusion room Room.OnFeedback.LinkInputSig(FusionRoom.SystemPowerOn.InputSig); @@ -95,7 +106,7 @@ namespace PepperDash.Essentials.Fusion /// string identifying this request. Used with a corresponding ScheduleResponse value public void RequestFullRoomSchedule(string requestID) { - // Need to see if we can omit the XML declaration + //Need to see if we can omit the XML declaration //XmlWriterSettings settings = new XmlWriterSettings(); //settings.OmitXmlDeclaration = true; @@ -110,7 +121,7 @@ namespace PepperDash.Essentials.Fusion DateTime now = DateTime.UtcNow; - Debug.Console(1, this, "Current time: {0}", now.ToString()); + Debug.Console(1, this, "Current time: {0}-{1}-{2}T{3}:{4}:{5}", now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second); string requestTest = string.Format("{0}{1}2017-05-02T00:00:0024", requestID, GUID); @@ -120,11 +131,44 @@ namespace PepperDash.Essentials.Fusion FusionRoom.ExtenderRoomViewSchedulingDataReservedSigs.ScheduleQuery.StringValue = requestTest; } + public void ModifyMeetingEndTimeConsoleHelper(string command) + { + string requestID; + string meetingID = null; + int extendMinutes = -1; + + requestID = "ModifyMeetingTest12345"; + + try + { + var tokens = command.Split(' '); + + meetingID = tokens[0]; + extendMinutes = Int32.Parse(tokens[1]); + + } + catch (Exception e) + { + Debug.Console(1, this, "Error parsing console command: {0}", e); + } + + Event tempEvent = CurrentSchedule.Events.FirstOrDefault(e => e.MeetingID.Equals(meetingID)); + + if (tempEvent != null && extendMinutes > -1) + { + ModifyMeetingEndTime(requestID, tempEvent, extendMinutes); + } + else + { + Debug.Console(1, this, "No matching MeetingID found in CurrentSchedule.Events or invalid time specified"); + } + } + /// /// Ends or Extends a meeting by the specified number of minutes. /// /// Number of minutes to extend the meeting. A value of 0 will end the meeting. - public void ModifyMeetingEndTime(string requestID, Event meeting, int extendMinutes) + public void ModifyMeetingEndTime(string requestID, PepperDash.Essentials.Fusion.Event meeting, int extendMinutes) { //StringWriter stringWriter = new StringWriter(); @@ -139,8 +183,8 @@ namespace PepperDash.Essentials.Fusion //CrestronXMLSerialization.SerializeObject(stringWriter, request); string requestTest = string.Format( - "{0}{1}MeetingChange" - , requestID, meeting.MeetingID, extendMinutes); + "{0}{1}MeetingChange" + , requestID, GUID, meeting.MeetingID, extendMinutes); Debug.Console(1, this, "Sending MeetingChange Request: \n{0}", requestTest); @@ -151,33 +195,75 @@ namespace PepperDash.Essentials.Fusion { Debug.Console(1, this, "Event: {0}\n Sig: {1}\nFusionResponse:\n{2}", args.Event, args.Sig.Name, args.Sig.StringValue); - try + + if (args.Sig == FusionRoom.ExtenderRoomViewSchedulingDataReservedSigs.ScheduleResponse) { - XmlReader reader = new XmlReader(args.Sig.StringValue); + try + { + ScheduleResponse scheduleResponse = new ScheduleResponse(); - ScheduleResponse scheduleResponse = new ScheduleResponse(); + XmlDocument message = new XmlDocument(); - scheduleResponse = CrestronXMLSerialization.DeSerializeObject(reader); + message.LoadXml(args.Sig.StringValue); - Debug.Console(1, this, "ScheduleResponse DeSerialization Successfull for Room: '{0}'", scheduleResponse.RoomName); - - if (scheduleResponse.Event.Count > 0) - { - Debug.Console(1, this, "Meetings Count: {0}\n", scheduleResponse.Event.Count); - - foreach (Event e in scheduleResponse.Event) + if (message.FirstChild.Name == "ScheduleResponse") { - Debug.Console(1, this, "Subject: {0}", e.Subject); - Debug.Console(1, this, "MeetingID: {0}", e.MeetingID); - Debug.Console(1, this, "Start Time: {0}", e.DtStart); - Debug.Console(1, this, "End Time: {0}\n", e.DtEnd); + foreach (XmlElement element in message.FirstChild.ChildNodes) + { + if (element.Name == "RequestID") + { + scheduleResponse.RequestID = element.InnerText; + } + else if (element.Name == "RoomID") + { + scheduleResponse.RoomID = element.InnerText; + } + else if (element.Name == "RoomName") + { + scheduleResponse.RoomName = element.InnerText; + } + else if (element.Name == "Event") + { + Debug.Console(1, this, "Event Found:\n{0}", element.OuterXml); + + XmlReader reader = new XmlReader(element.OuterXml); + + Event tempEvent = new Event(); + + tempEvent = CrestronXMLSerialization.DeSerializeObject(reader); + + scheduleResponse.Events.Add(tempEvent); + } + + } } + + //XmlReader reader = new XmlReader(args.Sig.StringValue); + + //scheduleResponse = CrestronXMLSerialization.DeSerializeObject(reader); + + //Debug.Console(1, this, "ScheduleResponse DeSerialization Successful for Room: '{0}'", scheduleResponse.RoomName); + + if (scheduleResponse.Events.Count > 0) + { + Debug.Console(1, this, "Meetings Count: {0}\n", scheduleResponse.Events.Count); + + foreach (Event e in scheduleResponse.Events) + { + Debug.Console(1, this, "Subject: {0}", e.Subject); + Debug.Console(1, this, "MeetingID: {0}", e.MeetingID); + Debug.Console(1, this, "Start Time: {0}", e.dtStart); + Debug.Console(1, this, "End Time: {0}\n", e.dtEnd); + } + } + + CurrentSchedule = scheduleResponse; + + } + catch (Exception e) + { + Debug.Console(1, this, "Error parsing ScheduleResponse: {0}", e); } - - } - catch (Exception e) - { - Debug.Console(1, this, "Error parsing ScheduleResponse: {0}", e); } } @@ -621,8 +707,13 @@ namespace PepperDash.Essentials.Fusion public string RoomID { get; set; } //[XmlElement(ElementName = "RoomName")] public string RoomName { get; set; } - //[XmlElement(ElementName = "Event")] - public List Event { get; set; } + //[XmlElement("Event")] + public List Events { get; set; } + + public ScheduleResponse() + { + Events = new List(); + } } //[XmlRoot(ElementName = "Event")] @@ -637,9 +728,9 @@ namespace PepperDash.Essentials.Fusion //[XmlElement(ElementName = "InstanceID")] public string InstanceID { get; set; } //[XmlElement(ElementName = "dtStart")] - public string DtStart { get; set; } + public DateTime dtStart { get; set; } //[XmlElement(ElementName = "dtEnd")] - public string DtEnd { get; set; } + public DateTime dtEnd { get; set; } //[XmlElement(ElementName = "Organizer")] public string Organizer { get; set; } //[XmlElement(ElementName = "Attendees")] diff --git a/Essentials/PepperDashEssentials/PepperDashEssentials.projectinfo b/Essentials/PepperDashEssentials/PepperDashEssentials.projectinfo index f4a74796f20f81c0159de50ab1de689c72ac2375..3503082a554e86d81e122dd6eb1b9cdbb053ea75 100644 GIT binary patch delta 1465 zcmV;q1xEVB4#f_Tg+gL~o6>hL^VKS^pJvVcv}y8XThLe3d^Y@5PG8ZFbNO*WKlXNZ zA8ha3-`;unW_SP5z59=LAC4dFJlwf=aBq9(k;+8@;FAymB7gCFeciPA;)S3!Kzkib=9Y#h)$009^{gsqdEI>U$jHFnN55qB(HF(CSgaS%ih6OC)%j0S3!(`m zWW2NUkp92-kbi)Gxo%hM_GQ-otnn;$@jG6x1+uy%`@KKL6U7CEGV4U(WL7l=}MU(f16g?}wy5 zsc91HYB_#gELP>~c~-AT_Qp^1%VL_pUawYF-6}w(;WW$g{mK5`{fAk0{^{<+o%;{Z zce4E6{{Dk|lk?f0Ps8_sF7MpFj~nLT(R+0L!ogVT1N*UP*m+p<_Mi)jWcWkgWPckk2u(@*d1KYXzJ@c!=pPM&{yzB}2^C)4}) z&hL{E13iCaCT=lb0oY)EZUOvj&QH+i|NG|S;jQN5^Q_IUvg?inJ=ojd%lCHovh3c$ z{=L1ugY5q7;Vu#K(}TT-=Lgv>W~2i+n3G$8|C)2s>Gl78v$DH$t7&ub=>11cJfB)Wtod0`hwh zKi=X03+JH|dB=y)4ZL?L!rCE?d~auO@BH5R!^zHr8Ra8)clNSbevk!9{|1QR9NY}| z>&?Oci^J}J-A>%?9EOwndetH=yqaI1E!(_4&!!!5n9cSdJlxF=KAj<@H=9lG?L3_B zlb+7^_NNpU`x9|Hz`=an0{l($al2msUpOtDaM~Nkx@oJ$aog6#WKC}Mz|;_-Ci}Df z>HXb@lTYv8&(0t2?CgG;&!*WPxiyoA154|WbF`GZd>wLY89;u8}Glk^2=e@j9SD6yU8d1$L+ zU;;Yd0@&^8?E3hBA%Q#5u*3RQeqLflxLOYAm;B!O`9VILOtORh>2&sB_x}CK!-og^ z`KJ%|4-O`QiyDHBgAFF&7Qk;m0mDQ2f8m65B4am-*FW)mqrN}incm;IKbz&#*+E9( z>ui7W;6Cx}{hi(EYh?0ZU_J(+hVpPT?AuSrV3+@|nT^f|c5XT`vm4UWtj)%=taY&9iX#93%J@t_ delta 1464 zcmV;p1xNbD4#WmT z&t6ySdYT{C(|K{3+bKS&R@ZN;XH_}N>*k|JMgsOe`X!@}z9^Q(V!e1))QhXE&VQ0x z5KSN-?)^Qy-62hvCf_Dl=;wTz?dZ5t7%sLY)-)@9urDEf6Z6|5Cc7bv-8_%xBzT0Keqt>HRmVj^Z$MG@$gpj@p;zfSJ`z(f*$Pc@8x^Dds%kx zVE^9U-a&SM_HdU7`RT#l!}Eje7BkWT9L&irz<Gb;lzFFDbxz)71$`@6ecV>kc z_S1Z4vUhK1fA3-b>BGJ0?B4yIeER9V>BF4|ll&Hcvl7A$Cgm2;zviTbo&LXYPIhlK zCtsa~)3I~#@E-B-&UCUf*}s49!Onxd87cm~d;9r=-F)XZ(_ujdGjR*RUvnmGfB!F> zguQSQ9H>-$$R>p$?Anfd)B6v}{_YXMX4Bc;-t57HEGG`$-MOEW`xN+KH-QZ8`ptlE znuME8`ul(3B-{%p!2vy~>ii|S@LBo#dN~c};9&QD{^`!abaFsJ-p;`+o9ur2;Naea z>G{FK$?pBYTHF9Jn1Wlty=e+==3PT1L<4p2M}Ga&vgAioFk z;~oCLa2`65cYFxl!298SvW({sJ|&f$-Omp4T~gBY|7_=+9Q^a0Ai%o;VlW4{fcy34 z;Qz&8_kV6D?sg8tNqxO)krrOfug{ikUY}>vjyTL_`wt%OW(S|nK0W{R!E83YxASni zPkK7v+n7f$(r2ifvF)vP4;K| z)BC#*C!gNGpPfIXMC_;eY?|%OKK*p^aA0a~06HFu%gtT9$MoFL^ZyH{s1sqkv3xr( z3H-psWclpDUOw5$DPctUR>~56`e5f^l0W!#fB*h0^jL2Klk^2=e^Jx}N^EC&o&`%l zF)#t0ZvpJ~bas9GzmUM4XxL%>DnBo=AY3g6^h!!u%VZFGw|C_!0=H1UpOJ1$k>hI^-nzCsPE5rruTR5&t~M{A7m81 z&h{q{?i0`6C#QZgYI!g)AA?XsdAJ$&?Wbd~%m3HRM&|=NH=UT-4e4ptX5(4by4fI| zG5K_Nx_>Y|$SBU5=9F>1{~*uFjhWti@L(W-3u$&URXaqBAoNSV|4V)eudWy8y0Swf STbHd2^#1{+zF@70BLD#L6hBM=