From e453d927d3bd75bf5fc10cf50da600d19077a7a6 Mon Sep 17 00:00:00 2001 From: JacekNaruniec Date: Sat, 14 Jan 2017 18:48:27 +0100 Subject: [PATCH] Frames are now saved to the file, added FramesFileWriterReader class. --- LiveScanClient/KinectClient.vcxproj | 2 + LiveScanClient/KinectClient.vcxproj.filters | 6 + bin/LiveScanClient.exe | Bin 0 -> 111616 bytes bin/LiveScanServer.exe | Bin 0 -> 64000 bytes .../LiveScanClient/framesFileWriterReader.h | 41 +++++++ include/LiveScanClient/liveScanClient.h | 7 +- src/LiveScanClient/framesFileWriterReader.cpp | 109 ++++++++++++++++++ src/LiveScanClient/liveScanClient.cpp | 51 +++++--- 8 files changed, 202 insertions(+), 14 deletions(-) create mode 100644 bin/LiveScanClient.exe create mode 100644 bin/LiveScanServer.exe create mode 100644 include/LiveScanClient/framesFileWriterReader.h create mode 100644 src/LiveScanClient/framesFileWriterReader.cpp diff --git a/LiveScanClient/KinectClient.vcxproj b/LiveScanClient/KinectClient.vcxproj index 9c01116..4ce212d 100644 --- a/LiveScanClient/KinectClient.vcxproj +++ b/LiveScanClient/KinectClient.vcxproj @@ -13,6 +13,7 @@ + @@ -28,6 +29,7 @@ + diff --git a/LiveScanClient/KinectClient.vcxproj.filters b/LiveScanClient/KinectClient.vcxproj.filters index 679951e..8bed42e 100644 --- a/LiveScanClient/KinectClient.vcxproj.filters +++ b/LiveScanClient/KinectClient.vcxproj.filters @@ -54,6 +54,9 @@ Header Files + + Header Files + @@ -86,6 +89,9 @@ Source Files + + Source Files + diff --git a/bin/LiveScanClient.exe b/bin/LiveScanClient.exe new file mode 100644 index 0000000000000000000000000000000000000000..14811a41dd6801afb67f5b4632a7a78ff3e1c8e9 GIT binary patch literal 111616 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 literal 0 HcmV?d00001 diff --git a/bin/LiveScanServer.exe b/bin/LiveScanServer.exe new file mode 100644 index 0000000000000000000000000000000000000000..e2684b7d546d6c537d0c1bc461d14ba55129ffd8 GIT binary patch literal 64000 zcmeFa33yz^l`md>yVaW{JH{@9k~_ znVIi>|M&l%z^Ch+I#uV?sZ*zxd%Jqomg`kmDHXxLx873fQGD`mp}@BX2ar7?^Mw)W z;l#HlJQ`a0tqJRQ^c1uGj=kN<@5*-N`}*vGY-b_s4EAMv`m#&bbYyqg-Gy28^~uSm z>a|OiS{VwfPjp_i$(8nFWrb=(wMxAKN?cRNj|eH1MLLU5YR9yt^+rlX3HWy&@ePw11 z6!r`NpZq!i@}#XsZ(#D5MQdg`MW+jx=ms67p}*7lE?fwM%yJ67HW;a^g3e-tKf4_I zbD>g;gA`!2EB>gPrD|03T}lmXSMUi-oeODi+@VyiOfM;L7|=Q!B~c~*Pg%uArIN#N zuZUF~#U#88$qJ^hc5(#U`@BA&{I4rH0YUh&5_>1V3`k z$b>e<7JMch2<~rbDvkkCYei#rD-r_`W=Wx#jZOsjD>YLAK(&TgR}olr7)2x2kibJx zXclEHQF}aqvWl0I1(pDdhHTgHEj|KUH+(Az)CsMc0Xx9`l-i|ce^k}918szT7K1|j z_*HIh)+$G1S|fWL^)%{grR?dVh)A~&Fpc_I-)__gl~QaCjhH?Z(#CYLWc0`*m8m4> ztK?#xJ_2PN*r}gQg>l;2T;>Xi){rnCQ(_h!EHw=}z#wSTR#cjd>Q)RFP&LxD>F_qD z?F>cCfZh?c1!Z6}=q(KPY^sw^h6fs8pW3#$E*&DGD%!LuX*sJPxIyKzsKnWYbZ!Dt z*(=~@Id~OJ9|1#1ZQiqNH!&IepW*2Z!(K&aC_P(SZJ6jH@DkQyV!nf$2H zU6qQYYV294u`!y8HrA!;j;xt?9VMWX(v7inW4x_ZrDCa?RNOui<;a`d)EHB#c+;lF zcq*QX*hhhMC?bVll<3fyka*FEZvHSddb@6hfO+?_$*BZXiPLkE_8b6}N|uBkO@emB zA!KS%CPBe69z+lGTDL27A;i?1O$#`y;*g+vY!DA`zR zrD{D%o(@JB1V?gkVi>%7i|4n$_10TH&Ctzah!a&zv?MCXq6$9r) zOAfvD7CN&LzMO{|IzITunHyq<=rE9v7!k8_7)Xe9!LcDD=Ls}khX-p2p)ul(9C)6K zKpe(SL>&!JKpa9Wpz9>Xb83snA?No0G&+6S7WrH#v5Ry z*z+_$N0ohoPQ%6#d%jL{aM>p^ooVD=_qI=r?G}u3!QQS3fm{K z29=7yRU;{cEaR!MRP4x4TSF9L0@eiRYo9FKuZ&97uouY`Pep^{b(G1d(_z6rU0kEo zUnn&Hb=_ZjOrM}W_qxK2$^MI}InWrhq8BF-bE1u-QlpM+QkL^0bc`*0(#(- z+dRi^!62qGFD6n^dm)X1;Skd)m8yXeYf?2)dl7OB=Lgb_iFwD<10Z_dC??FvXW*EQ zno~80LbN99wc1jtBxL*g(32gg_G_u6y%2yp@zAP9oBuNW1K|$lOn9Ro9vsm&o&O-RjaN>hdmQ0&(Z-Rq^Fy?= z+qo?*#pTeXF~vywX=I=)8rl{~cV9<8m~sK3*P>LzO{pW$%u`Wl=pKkoHKgLX6~MM^ zI!I2HYJh4DsRq{_9xm}CQX@$FtA$hDq|2p7y0unvagq_cy3Ag`8zJ+TA&jyGPn#CZ z`-Dz3wk=nw6#S?mcN%omjq$pvv1LmtzNx%HjbIKms1XfnOf|X<`fRB|VgOWbM6gs2 zV>(%C%;7l7%`|@vT2RrfIYKl;Cv}7k1Dmlkf4{H5^nNT4??&d~ zf^{Isb3GPT--GciU!2LJlBPpua$u}!3k74%Cs|-9f$r54$XH;UEz*HyRSw##w*6R~ z#x>_KKRpZ+&vKM2tyrufL_V_`)AczYg<${e;|bvGV-STUN11r3N5rcc^O1=W5V0{Q z!8B~|xmDWR?6!9l+WW;|d)toD=By^YOfq&ErS&A&y5ELu7%BxaqfX0N$#8RS6;ida z;%a=<#foe2Q9pvFl2_^c18A~Lj-8CXZDSIc;4m6$HrX9uwAYi{joEa3D)IwzW>t;LxdBX#QAYcX zWUt`=o;P*6Z8a5Lt>%5s$e(v36V5YX)z9T(P1{kaSU{D=L_;Enm2@(P)pOGMDj21W zm|)GgaMk;&DIU}>*^t!5vDSY3;&Dt?V&lW8J%0m7V_aJ@VPmQ8?aO9xehw*Y)!cC- zUW~w1!$H_^Mz zIA(VP8Nz}oVi%YnYuZ#B3)|a}J`}<3>xb45mcUp(ZD%e_h4x!&CO##`glE=TLnFX| z#ZgIM*XZIez{H3reVqHBj+<5QmQdpGh(Xm?VRbRoqDi%C?HV zOkz=s4n2%F5{v*+ggRGId1T zr0)+%C((hXUfYGMTsnzkT-&4{3dgWG*P{1`?fSpDH9| ze*nMD^agr@^j23J>EwN=w&@x~MeL^1dO+S0wTHDZa-_3gL_L9)lk6Pl6GuXJ6Q+wy zIv|epv3_y7lrcRW+gZzM_G@t@q%$d9#l@ONmv6EUln_`5JD+IrAV~Hl0XoK8lxJQ^ z`#qY@L6W&3drNr(gr2kCTjFwd_?jcx=VwL*+Ct(uw=G1R{VZbI!Z8RB$p`F2qI0#c zV&N+H5FysOHA|U$%4+spgt;&PJSFHNGVTvWu}BFT#?Uc~2MxpE;8|57#i1y|SFo_5 zBZLJDGn{yZCAJ)j)|D4#pvlx_KT>Xb(w#5+Y$A;1HqoVBn@E|Ld^RD$vk4K{1dbB4 zNvmj(nI7m85}jZ9#0yuscp=ui;-!pLQ|fFIJn=*zzNTEf#MDF4`f|etzkivK! zq;N7Zl&0J@qG>vJt$aGmV1t~to6}vg2Rbjz&bSU-x$A{h=D)OkLkY3pFX?nn({h5& z;QAn}X2V$U|CBW}1=5pIEGcpy0Q&%{wd$;Wq{d_1RktOhF*zluPaOG@tmmth{m{E8 z%k$m^kPG+1`6!kp=+MZN`i78q_=NRXL{>IQ^-4pGD|9SYkBlYUW1eVTn~IzB*s#h@ zQZP8r!omtm4F&ha+6n!HwG$SFQhQ^h!7|ljJvCn8keouys%k#v-AF6xWtGk}Yb&0o z9QkeaN@JXg5W&fnr%8RAO2C%-94VnrU$5W}T9f9y@rR$|{5OlLt>TB_X2bMJlbj^Un@FWc zS~)UsH9kB6sD9>TDR8-a9u7$?;<13oo>_*iaaY7MtSGoTyC{st(50qg1pm#&Q+xr`4}vYuA<9ju9ueq{L8Ve^f4 zQxk~|pI}-)uR+<;aFBhE9*dLJ_{Hvcu+(=T69W@tvAz@$!fr%Jwqg0miuG9JiL`zK z7951)7ypc&PgIEn2rE6RskUmwNw&FOrUeWg3t6t0)xyj8Ag79~!+DvKn8;9c4P(z( z`bJo_FVnHdQeA4zLv9?h$e~i3&$=U`Oc^B;CW!O<p9P3zn!@>q`ZNB?#E(zX$6>{^ z3!hiv)6dU^%Jrb#;iGfD{ycE3SjzpU#=ej3#F3lpMx|$TrT&eT`nNoiEut4y4rV!M z^dcEg9dRt@8lxhT#Y$_Zib!@G{f8C6e-0DLnCnHdGFdv3k$4TBA-WC{D-DYzo|PE~ zF|o6{gP6=R2Z7m2VSNYzCQ|$qz30>7J%_Q&b>8SISJw3^P4}KU`uyZb^e_FSAOHOR zKtEZ7e?Kgv9|C?A{$1ho2l@}Trs{IgZu8MOcb*CQyN~721S^8dX8t{~9D4-lfPGL( z&HEFi!@p%|V1EWSltq=qxB8NgxGQ?Bxr0mkXmJ6wu|G@W>yFV-*0@cZWgYCF3l7V3 zC^`)l@ey~F&!YJl#;l5DQmwi!LXh%iP2U0@8w_t=g$9& zJQI3Hfiprm#)9eUrl;L`Ijz3@lHRNEiTy8LS2Y)4`ewgkkNS4~y3*Lo%+bryX7u44 zk9xm0snH2pRZW2BNmYH}j<=uJckgxQ^|1OFe4&ZHAgA2PDEc0M3$I(K&$y%5kRHRX zIS&fyN>*Qe)z0H6Fm2IOPm{e2wbae~HZ$Vs8xXSHC09$3ahOXfH4j@` z@->zC(g8ku3Ef1s^@6Fn#FPs%EhUroI-|!h=SS6cEQ+<1icJkL@u6vXF^0telWCEP zU)xh^%=|2$byS(;>1O}VC(zZ`nwey!SKbEpsD5<8cqD5=rLdh*b71-N@z0G%e2(!o z8Ww++enLGw75chqj4i$q2=9$pndIbI+YLjEb>sc@TX&+@_gk@}p@OVJ~7e z56|KUiX5d;91yS~>=MX>Jwa)AGem)DEC+6T>NZP|CO^{bBGg6L7J`k4u(^n^Exb+k zJT>Z4v=Qfi@J-CP$z-PPnhuOEL?e+EOK0kG4{@B}Ek&rr5G1u%%V68-a6EQMMw{$^ zAb(ptn${_6h(^gh3~FtuHd-h5xgd>ZvOf=6kU3p9?{bFMtJ6gas-Z>0|s9c!G*3ydYK=w}!|hdg9q38a=-gj%f|Cci+|w?C@ZP zQGFodo-JV>!`ae8u=&oGFc5jRL@LgfFx^!@TPiR6AsA=i9m>+TKTONw&uS9m4$p-g zxFG`tJ~%S*!Ep_zeG;|AkbZf39NhP^G2o zX>#ka_+Ev1=DrNojNzCF+YpHtMQ!ZxU1vcf(a|P98BnOJWp)UQls{h z$g#f!Fm=Wy7&D@Cizh4Xnve!%+cd)%9|JAUw(-5lTk+XSeKPrERQrCqE*5XSm40Xq z(c;GSy9^Qbx^jQxk` zIYhU0-`u0$x^MK+arIk#S-7Oq9nsck9H4PTY6RXeeHJ4VrVw|28VzJ5V9v|NT;tRB zm+2NU-Tq{3jM$+rI$F<^9ovUxCC; z^(ql9$#^(!rhN*;ySpENpjzxE@FJopghg9q4BjnFH%8lbV=onJ8;54mG~k$mw~it= z=&+70A27Tf$afuB*-K=eqgc^1kh_x`ory|awB)Qt#7r6#@5%ima_}xgGwP|R;2D*| zii>aU;uSlobN&z_tEU-Wr!|_*TZP$6H6#y>PQ&O8NmsSpS5f`&KWSxkb82;=hGeR? z_%-G}k6gjNPV5C>(0krXs82Q29U48F71kdbjeUdFQ0K}X{ub32@jl|WeZ+mw0U`T0 zSnXYh&AI!qIiD=$)O!_uq8jne5-~Z%_TcTjXCW3A8DfJ{_4YT3dKOOA8hf_LOht#r z`-0GzJg&_XhUZSKjr2S4r@x^h^ zo8lRP`_4wDRB!e*jKQ=GYw{%3s}&=tHaauPeF)#dK5WY5@2s3D$x$%Z@Fq#Z zXOsH9ef^!4EkecI6P0)MtsF)~a`H8#MIO)1plJqi3|01Lzwux(0EM_f1xJLC5 zu2J#+t~JEwdTc~IHX>w088u_EvZf5NMNONeVKdBk3LOY_rE~N{X5AmSw0XK@)%A270KvmOrO|a)D2^m!i5&mW^0JpmQB~N%ZIU$ zip)4!xpIHaf-@AyP(%&la{}#`PFuOxkz?h41DJb*Oj(RamHRD|6Mt~Tic>VlPR+9O zEZ0D%F3$Z9JV`u{_`MY4Zde!F{|6BE{|CVz0dju=sKp70@bRlL5&O>|?cBeL`VPY- zao$DWY4*LUYYmaUS>Ey0dWY4U=y&uI#=Z=wi2Ww2p$30pb;JJ&Sf2A&$@v>|hE79; zwXvqnOEErF4gMk4Drl(YU5JV;U35s-f+7|A7XN| zZq5|Z-msS%m<}|MHR=YM(GtjIDgCOlOkl2hZ!7QJ8g$-eXti78+cp?u{O@V7W|sy} z8Crv~me_66u%xF9A&P(`O&ew!U-%N+`D|~xksaVO@i5yx1IGj&26n#iv;Pm2JFh|0Bs4Z!zAH~&b@`QwhEP8NMvhrNXR0b&$4S& zPXyncq)Z9C)(|6a4qrUPo2huN5k>-UF3Yzu&cqNu2f4jfIV0da3*R`(MOD8u7a)4| z4VWr&HK5BTDHlZw>(GCKcK-OTaxr9JJY|l~#gRf(6LAS;*$Ea=$l4po$}*BNc*)@1 zq$e+5G-HW9ffC1CgJo*e@ zSkd9x&ECu$3=l6zj$8S?omNMGbeBQTKHTffk}{j30b!7H#m$4)Q<& z;lj6@--ZiX2p7I9omBV=NCyHt~}v$9;v$P%T@QMbs7Wq$+8XMYTy zT%#!T_UzhWG(TqPHm*>l$8)1ux+y3_6LV=%G1tToypNSoUx$6BFh*zUlFiXAwc)xp zd_`4;NnD1B_Ttj$@Keu2OZ~j*;d}+96BK=57>;d15Ay|tkKr+7IN|!(RB)tkG7d+i z$&WO<$h3E0%fT6=D$%^@zfgBT1qv!t;eV{|K=UZ5`KGFMzf)t4wE}GKR_{QefI>vx zg}qt9->tVU^p1M}_v;SyWuSR)Q};U+@_DD{s;tiQlXqKppwQv%U4^Zxp9J)-Qs}>< zH>-QQ#=c`;>gH9|`(4(3_~x+!zYj+7Wn#=Zh-q1e{Snt633K|K<{@k{72DF7)Rd+Y zrB+j#OB8%h))lo0@1uZ$a+_}2)L5IUa|Lc{tYdiP7ejG|2(DCJsS}LYCM`Bz5?i9U zVoQ|&F|o~BY@#H#L~+HIDF1!2(MCL4O4V}@^v-^f_ALVap7Q_v0uBmKaXaY$Z+AObYv@(ykbbZS>y!seH!+-`>S{fU!a1`TULO zYWdTXVp!JsvgeHWwxT|A&2VY&=_8Mb40E?>YH8Y3s%J!vzoI}6E`~ZxnV8fzGGXn~C#PZY(NQ=^S36 zOsXQrQ#3c8$r+uvf@(W>+$*T8+9d#0+O96KAp}MAnM)d0IQ|b`%2=zS6vM&cOBv%;lwx$KUdk6NDoQa} z9KO`yG`#X{OI6d5cOTG+tsw>!dkQS2UjQ`Lx)J$|DWZ#J)q!QI-={+Caw}o*w^|DVdCchm~4iTa@p4ZA=!*r<+8(XFB|I^9N|{X7x1gKZ)b75sLE(q zE=*}*F<-Ec-e!Ur&wV56zb=o#_MPQ5{g26GEPrQt%>j9q!m|+GV^Ti#>F2n+Q7$SKwtrd9e+z293~lrRA;awlz`x+IlHN zzi!=joLjsNYRMa?wYbxiTIh8b+g%q&F}&VGs;-ZLvGRTxuC9ak!;n&WKTM5kpQIF) zbiLpH97ql`%v;4H$_SPR z%H;4KNlLvOpXOQ__O=l`RH8C?80v5-iJgO6j7u_e!_0va!@*MWk`gZ+*hu48HFw{< zw?yTLGR?ePlKs^8iW0+>rQ}tmDc=2(K>nx)SyJQW8(mUEcRgQcMl$ zZZX*rX!~-CH}w`vNgSQHys|^k9k5HNv)FH3HJf7Cb|NWM4hf?#=W4@%zHyTuk>pXV zfo^UMvH#5lJwtQ=H_g6w(=?u&W+U7*)iG)Jav!>$cliX7ahauodoxHIlOB^U;)_hU zwiEzEhD2u}UO;efqaY#ERd#WT5WVYvq|92DG3#5px+j`Q_EwDPvYUQLAJaOfH6Wfu z=X{@d5;FTU&4J4>gxKU>h9PAxst}LCzy>iFZ@Qrm%vB<|7L;_3K~F~_<1!Ni<{_=Z zJR~~r_vuGM7UM&eS%~zEcSVsDyT_*@hrKpRCLomb3ZszdJm(WiLgx6)n1E4)*y0+6 z7@7^AGR;0lH(Q+SeK3useGJ2j*6@+V-73lAd6i^wLLWKPkZB0Ch&5NVh(zaSz7_?! z=9YBLJ{-pTbYH^eCD2&%XWHDx5=-01mP$E)^x0a*l5Vn0H&^Q>`^YlM`N)|O*`<_- zfZ$z=MfQqzkmyW|l}1aD%d~^U>~2(;DFhlpdgds%5yZSk5OHvB>J2Gs?zt5{P>@7tiBCZivOlE128WbXIoj1lik)2{evh^sbKzT3tkYy!Wsh}*tE6JST zt5hP(XCHU=M*4ox6KJanPax5G-scHHE;F1+%r@XeGs|z22SyaLGDo@|Ld+XcM4X@b z+=bomc`K3Z=1Mh5ub2c#bn4=zQBOi{sCFfl6sH{ns?EFx&I1DI9ObP}CAe2S2eSzR_3gm{A6bSd*` zU(*@rJPn9se^_aG(ksN1=zQ5Ho`g(enRp={(aRY;j`pLkA$Is$eF8ccdczmVwc_emt7!Y4G*Z7?yI z9rHraCpgt=XABA^y+SaF&c}R$NvIGk#A98-#2^@Z*`Q!f=H8X0L^7l7Ks3MZ*9aYFY z`=~;`zB-v_B2~EGUq;T1C|k3!=@lj?(fNbVa zB$K6}z>e^O0ukKL8eE}}SP>CObSASNEI8;?QgmxsKoX*NL#ULQ?UT*k&f?W*mDw7I z2&7k7g+%96pF|QW98rkgIR-H};*N4hq(5c94YQRACcQ#1iOwdUU=k_>3(-5jAqK(Q z%LUV8rN1)A1zJpcgfgG||;Um+`HF7zRD@M6$1PkOjq)ULl@D=S81* z5-QgFLTqrwOBw%qpW)UMPbB;CO7Wyuh$qqcp-(&s72<`Ma>Yv-|NgTdWo!&U90Xp# zB!&bdqmS%VCu9FmjT@1*8d)BD`|8Hg+C!WHP`P)sMwu0kMxygGUn7HDW?mst&nuWK zg7XTqN@oGYym^I)^H53?^o-|*QtVU~GfgMK+Y1nZnmwMH=CGW7?x{%x z;b~F8QY2P5Dv3_7Pe&=*SvKzq(L2_YGS~YQq+@xqi9mL66GCEzY!aROe6poz`3>+w z^ri(V^PEpMy;t{0Fc_0w(IX@}ulXdBP~jIs^rl{7F!)Z-;N~1;7wBem-pr&KK|bK=e>SQcfsws#zRU^Z~ z!RISqGbe{F;NJ7P67ozv$9K;|PUKQMFa$I?qB9eWD zVSI8x3(_k(ibUt6wh{#8PabPZr~ucg`TeZ9aSz7r2G-ni$^maJGT@j%br}wR|=^*UM*% z^MHJgaUPb>R_9Uq9P2zTpW~dT3l~gYMqxPVV|f62ZhV8SycWg z1GAi0!0k3xc<*In#|92DNY7;5#u7shD7__$`*R4McjitKdEU<>L`IZ;9>Mo(7f|s$SH;}P+8C_X`+0;9 zlq2T16686V$F-Z9yk9$m-nZXSLfj0!@G==h+zhtNt4f-wt1`dGz;}Vd3UiA(O1}$q z8~E{V)7i?>cd}pdMHuW9C_nsBQ1no)KSJFCHqNA5lBQmYoUh=TY6C2EgM@!iAzF{-hcxqr_+?AUv&*=%RqX1+Hq zZD~g(_?0V9MCsC4%7_+mVivWRP*SyfN~>MfO8xQ1(?@5RyU`of)D!gkn8;8oR+a8u zMSqm;T{TT~<>UVUSXjOA)o5SC&iZjh>cdNdR8u>GG#)OSErTdd>=V7eU)Kn}c&5!_y zpU|*>iyL8r_0thaz~N@M9tX@5y;h`H9#t$;R$ZxlVEFT-bf-xbo;oZIdM?UqhLn2U zTs9?b&_9sQhFHZ@(Ott-!~7%z{Qx(vP=dMLamF&=HIEou=64w)a;NinJ#I<1SD-2k zB#hsqc%PU@3*09r)YHHjO^5B%@j12PQZfF{T?#rQSn~ZqDX|iq$usf@ZAx--5#HSyHrIpHj*V@Ro6+i`>3AB5zPeOdu^bK=`Rxa<;qf%? z!POf3s1dnqGTjo}qO&lxq3bJri<{#`sngX-SGd3H9#M!3YA)MheqD9=9%$xXE`}-0 z?L7XF$41^xemt&zmA5O=J)RVaF?b%lI)!I_!eRqV2z-k#2x*^LFK*kkvdGt*KG-`j=oC)s zD+~@e`QDk?wS%3#Jzb|4_O7>g7Wz)=JpTCnv0cX=H|K<7<`!npJ7H3#u))58o?Qi3 zdPiZvf>Q3^+C@wFKXv|pdjFrb_u`Jzu$H8k$nTM<-R$&ZW*;*LPRCp8dI4{pgnQ5S zXn?Q{bzSS>dQ^tl1uls^bN&25eBIBD8CmtD#{w#qLe!i zutC|;v!e~_j`*zb2(_!0(*LEFnoO%3Q#V3w6?nP8y9NHJ?tbL1s=pty+D1}hhrpT! zrcVTHQ2h<8^D@As`tIm2kH&A|q<;hWv8Idh6EZ(-`Uc>L=Dz|?5x7`jUf@LnKOpe4 z0>2^fC(SJTM}d(RmK`T>Rm=RApQ=2fPf}gq(%+I)4+#8G3;Cyw`7D$L#18N@Rurc(XSdK>3m<%ba z0pV#GYH~-WwY5S0V}`x+yukm+{I5)d3TFvN078>2d5+7n@3v)GYM;PM1%5!_*R%I# z8&rA%c}|+Z)-6MNggSQu{l@`iggS`y7)g&2j~%c6IN|3L#;Z30ld5?lYd!{Wyjnkz z^n$>CfwurA)jvq?SB3I3fwL$5e8LEI;v{j*&h0^nmCoeR@OO{ z?fv-Ft3nf1V%p!P;_}jI()MYyrX|%m)8@m|E&?T~E*AKSX@6~MP>)Sxe|<;bFQ$D{ z!kYlZ0{%A=_jJ!hbQ262Cjd*R3~p>^-c0;g4{W>&Wk;%Yf=$JW7nd`tyl@_)juXz^ zl6Q=nFG1{5M4Oaaq)x-ykc01PG36%R0uom?Rb+ussCfHrTsOPVR^B#l!O|bj$J4w_!9-0Zw zK7*A2v9w?h0%M(7U@hu7gH09epMX)%HemJm4L7bJMyds&WubcYUG+iPMxP68ocf-+ z32pdmC<_>|CIcR4wE z9|9ax^D)4Q0%r+4rREM$w$$7WxToem!0T&13wVp<-Yb;P3;c?}=Y{?Qfj<{YJo*s$ z$3#C5xI6kHpw>!De^2x!P;L}>PxJ>!KN9_^imJ}|26*T$fqUZ1KsgZK49X4hvjHE7 zZv}ip=>H_}70G==pp_tJLxQEI0EX0}1m&(sTnPGlp?3+~Bk&r5w+sACVhB8s3H(Ol zVx<2$aTMzLaUuu!s|2n3hr}hJX!MTc=Fr9i_a$!v{Jg-g2z(weq<)0lka|tv?~)H7 z{m10lbcEWQLMc^Sdp2N3;2eSNfFZR(;8ua#1)eW(u=aDvy;R`!wHuKBIABzLww78w zQcDe=tUV6!+1ir80_^|TxN zC2G7&d&Q)Y?7O)m(^g0=ko5AA^ntTSwt`X+*e8^Il6$34J|vWTq|}2#|BApDh5mEl zc|$1wF_K<)Na!O{ta((55?draUDC4z9wU_Y6!}*O2xL@Fh1l}v~34zZG zd`;lr1U8If4O0cq6L`A7tpXi^?-h8nz|RW&vcP{4_=dp9Xx7sza5i96Egb#tfGZ^3 zF&a9n{AiBZ^GE*%X=n7GtTPT=Hu_?Wl%I}n3#Zh`^lZTO>GfQUssrkV?4Lu8u<+U} z@ynWDvNm8X+CPEVLG^oUGq9%&c0~9*l~hY6>b!Bl>eL>Ctq*U<@94f_u*<`Jh`Xb( z{$?%rA+JF_XRs%cH%k4?V6PxAt$sX3bN&u_&1x-XP?l?mY{$%Y+cb?$1vXaws7+(@ zBYl|X;xje2C32q1s$Uwc2iQdQXM+s^o2&nz$;f*#7iDK_&hJFtr)H^M!JbinirkFT_d8AATc~BWy494sX6%_Yl7aO;?fC_T zvorjK)mKB4aV$31!SDhI_L{-Q#r^`U8xuQgnT5Os>J5XnBX5D~JyGXvibX;vsXuEBdd7jx zPo=|4E906`cKw*pAqb5275%X^G?xu&j|LS!Cs1u z2%W4(E!KIzh)oVHR13KIQkSVeg0o#cAlN|_j}v=*8S@URX2C`oY+3fqns)V`Q>C2v z?ozdBg<$Hq#P-lqCcS=eG4{g-wcO-=HMA^hhe{axVTF2)iy>I>Z;8u7r>V&}+9Q@s zUKToCou@I#yE?Q|g;z?R8k5|hR;jGPXo*#-*ITdngt1>1Lq#_Z(#L#x$`2D>mB39V7%)-ms(x*VKq)Lg+X zQ`ZajX^n}^)~Jc=buGy{avmetLA9XnDbzAguxHe=y03-KP=yWTd`7JTwodIa*hXL- z>P^88s$$)@LhIG+jpRJ2K2rB$XrnrIlg7SS_k++Twa{SS1hz#zEZ8&ZS9L!Lovlti zhn&x-zW_T&Z8}$%i`V}$bgr7&rLm^^*F#&?l7hx20L!bhw`;7e{y#!p>W2n92IaP^ zmFMfclj`3J?NF}^c0=>ylN&5sHSc7ei%rm&Iv>AJXsZQ+>8NO{O@bX%cKvy{C*!tV zy3T|38`K5r0fSv9*m_&%-2u)E)Kv!iJg}mA%3#j|8&rQZ*ek#;R5SZ^x!(cXt2zx9 z9dVu-Qa2fF46tGKsKJf~cCmWJU}pe3s773%Yq5b{s*W_+<-p#nRvPSfV3(^M2746P zmFf+HJp=50s?*W6d>7a?s@Gt@2X>u$&0t3yaURy#-EyLGP_+U3fcmk)mIM2cT05X? z=>qm)^_0Ob26nTWJ*e|;0d|YJ&S0Mb_EGhK!M+CU|<4(eolxm)e~sFah@aksh} z4}h4ra_X5icdJLeyam=h>N$-mj=y_V?qgC;as1tdl{eVU4X0Y4QnwoH z&W2Uir_}+$Zcx`uoss;kI`!iv>G!Lb16blVE#b+AZtH$E%V6JX*l9ha)(Un|{jgz! z`W)FXzu%a>c62&i!ag~AZ1@rN%Cb1Fw(?yC42$WaiES|ON|zuQaY?A3dL_>zeGy04l8Arl-2d0 zSW%DeFF*84c{gc)*~L;np@sE2TjWolF7yt-usRnoBDtE!&iJdj%=&)pTgw#i|#t&i7M#=+#Vf7HcxlD>B6#hQ_ zL(=b`LJgL>U+Q^8(q9A&E7Bu|{uRlMG@TLR{$(@Z_HbTckH8BA?iF}Y;FSVz5O}k| z+W~J@_e%OffsYA%8n8F~0${uKGT;XFs?h5c)1w5A6*yVo3V{iMzZCx80$vkNSl5lY zDV(xy8M6WRseWqAJ>dz~6JxdmeifAI)(c}E3(v7$9rHx^2KCyQNN9qkT5rbeTGzTk zonXyv{bu+CYkuo@!qe3$pxmI^0Vh~%S|1B9vie(J4bK#ba}7Mu`qyxsy0Vq0YZ{U= zO5NUSMd}33vF>ZFk5FQxz?R4YDZANvtaUSZzJ&Tm37jl&tiT0|^-Pu;#tK{_rIx7Y zTCa`F6tsjppky1?G6IluV$0B2evQqu7^-G}qvGpGT54AoA zI<>vPijAFGv)6jbnq6~H;FZ>#vD?E}S|&_P4p0-Af+f(xm>rYr=BxEPJS2zy}yi(xp0&fs_v%q@=POy$b%`ZUKW048g zx^dUnOt7|&+a7+|PM4(PlNJX>&_mKt3^^zLT$_ZlDdI1!MZd98-_oU z`BTjq;m>Bm(G}q*ksd2nYLS+nE%0f;)1ptSAE8uF_^r(P=mn^4Gbl~jJmA=DyLC|N z-;9>-h;FuM`KJ}f$l2m=GX>5S$gyTcW{MP!J`4UvuUjCw9DNqjq&%&T%H9<{TheE% zb0FmgNZEj!&j@c0UzzGR9>OZqnWA}#Dgi~TqtN4UpLw`HD5@|cR5%h@@^07K2YsQ2fu>t7N zZtW9zZ+Py6VNj^aK7o@3J{?{>;UlQwj0yL|URE0?JQAA@{>LKI)s6{|$KHeV7u2ia zYbSg&_G{jhHwto`^6` z5K%Y4guVo4S&G3qebHRV^#07wVOtu5=op>tXexY1HaUIh4OxzqlA@YTZ zABnsf{{F-~IVbJ}j7(Y=e>L1N>DSP6Ea02rX_GDnefFfwa9fR0)e{$H%InOx-I@obty{aBcGh~XuK!#Akr_$313g-5lKIQQ@uCUHzs`*?fT@T z=i+;XXRqYGtbRG^rTD?fpTT)B5}EuHY1hx8&)CV^!#6}un*6Ky&5;AGzeCyih;oyq zXA>cw8YV)lIT7Ni;hW(vwbm!z3~#|c@y&2y@+hS3$#c=(3nsN9ec9yk0%ri;GWle{ zyTLhKJusPdGCB=tUxGac5-$L5P%lTqQyQ$7Bk3taiI*d%v>r&LLi48Ftfq&SOu<|r z>8Gs?Q+_Qo!h)K-H8ABm@C;9hgr*~XYob?sh;`+ZcB@x>dxFjl-7@7-a8gQ(zzG7U z3;ZRde4RjzM}3>faol6XM976JlJwQ^w<*(1NLdNZcvf-YIstQ?$KPtbHdu z6Z2Y#P$sY{YihkrD67vQUaiJDQ< z_9r=;T$@bQd|~2;C4DR4#A$aWTWVgiK9`&Th*`DfhG~CIPOtg&w3^yQ(6hF75$Ka@ zvswD;GZAUeeHOsz8<$FrteLvd9Xx*c$2=x)GKp-%xmYLWi9Mfy_~>0cMhb3%Du zC@)&%e90QN;_8RiC4fJ+E(iRXbv58?)(wEavTg)?!@33V57upff41%d{Ht{zpbFm) z7zsZN7!N-NSQma0aAf!^fTO}+2W$?13vg`sJAm2n_W>t|e+ZZhzX~`r{BvuBIyL;3 zH4CpY-cmaYd-!wfX5sC;KOudo+JN+l>fexVSAPQ>QY%53B)M$@PZ!uKJZDL|ON|Ck zQJqqEuli|nM(sBQhQnV;-X02ve+mnP!(U8(F`1S0Bm=*gJf`-%D082x{XzWp(1DRm zpO+$BG>Y)!;RnJGho1?5KRh9FZsfa>_L||EH)=*lGtp_$`O!sDJGw7=N%Vcuo1^zd zACCSa`nTxJ*zvJtvG>Goi#-qvIb zi;LssPPJHIM;vdf;hlt2!%D48uLkT-p94?9ebG4G&H!2}iDTW4mKtiT!izm$ARbew|o=7em78&mpL0O$uE*8f~(sgg%MS$N{dY z{eRzX;TpO07gF1WAxJwYG(J;y|B~wdDtuQ}&@QhzX&lSYuI^t*RjcoX3Cs`5{VnzY z`i~Wd@P^K#{KUU$NcSVbbO+LSu?-P&WORDy&(Z1D35kzeXD08mu1X?%!796Zu(xos zTG_L^(9xCe>nJ$83(l;YK;9M7eARiR3bnL7zpLQnp+`Zj=`ZvxU#Vp(ypJ|e*wa3D zuyf-v+tgae-tOdgDZE1_HH%8?oqS($Tfs3(d8n>=t=-c%a5ReY6ICqQwhc|tOl;7q zytA|5thI{;1!C7uDBLlSA1J8PSYZ9$ev?v*?e4v5OUL>pOA1}~u70ObEZUB8-)bv* zZ5GQx(SB&&Qz&}6D)VBTZdh>^buTJuf&2QMVNt8_&RtJezBsU?&|BC}W!7|_53{SK zeS^EiKI>0c%V9CsNcrBuf~aa_wA+2#dbSTb`2oDkrxx}1Z;Nuz2U zwxcOJwXk)AeSI*q>Rbm)I^B}&$nTa*M!i6r6(PKScAVl5r0iDr7gT=*p$Hk31 zC_CUgv$_V*L$q*vuU$m-OLrIg1{OJZdyT|7TYXuol-D_c`kjHT?J(L-1kf@Tm8Qv>R;5f) zEE`lKK&w(_u)iB#7cAoxIB?#ER;8ZK0o}!(E!*>W%M@-|@F?q~TA>>nlq;;a*Y@t^ z;9^f~@M**T*kNBtH*x!;!2Z(yu%=IYgf2lxr7ywJ?Y;rTF+?T~UFo)>TGCVO=dfSV z*E7%qy)G)SQzTO@9vm3J$T6;fPfu~Ab(>@yEVlQkUN{Q;fYOL+W%!z8zk>QuOwx1I zVnmnijy>4dt&OP4d_=7;?2#G<_Q2;ZSdB3x!f198ALxGN??dJ9Fluc~#H2em{Qala z+jg(0rL|p|?}QI)ZFO41UW{0+$cnz*c->d6SXA8G*M)vTgi?}*X1$$gnOa=f-qUB; zmiBd6n3j?$CEP#Nh1G9-dE~bsBv6bLZ_A*3zyfu8mAiO{*#?Wp(1;bpLepJ4@ zdutW4Q`lw0U#jG6FAQw$)1uqaGXsi*UOgG<@Kr1)2nTwwx7(XUib}Z3iRA1=l=OV3 zyK=^)yExu_I$-ykc-)@v=WEv;u=Wne?t^o7i#?QA877v#Zm)NVxLJtSOY#GGwVWfv zcHELcS7PK92TVo1g}md-FN#AK7@3WK!p{pm49f-&7%E_--twlGH9Nnmr*APmzo_!7 z@_S6Ob6HRC0LEmW{#;$?*}kKbQ^+<=Sib|4><+uPTP?-{1bVnLPifBPoHF1P^1Igb z_3rg%8F+ukPE4H`!bR1?QH_fDTKmevZuoiM>cL%@`&K}ctb+4Le%pXIe#3n2Qe zUm~uySE0{*Sy0FASroEM&Z#)(_}owxwH_SP1=Xv^&+^44#km@@u`yD?tj6?^aS?Z* zxVX_@JB%5MKFtuI_2|S>#pR*P=y0WtE1qat7vM2t0il^IO0Cz=?)tU_*OSejG0g4CATTVVXb8hYWbuudB6 zcKHy4xwcq;`m7aw{euGvU-{^?^G-KDON*8@eL$Dk7xt+&eJkyJH$FD>_38ws37S`0 zdghKoq1RumM0K4_D60^tE7(ZX)#!P-f_$i`632zsJD6On=eER`k)a(al(d zcpCz)KDUa^v`Ts!DjN6KqL=j)dJ#0SB0vP)w3RCa*Ib&mxe9Gd1ueg)vTS}&W!e0m zVA-x6IudVf-%-F;uiGcPEM}LB)Y({K4dnZ}3gx*b`WDOS5`!fK2XeZ0NIWjrqH_So z_bnu4l7|)HxV=3^ZNTEz4on1$FDuZ|dwdO8<8aj`6F`M=e0dc{^5q4Mg$|JwL2vas zeR&mi`tmC3T+v--3q14z>1kJmB-E{*jrsYyxFiKtFwG|tZuJfJtHcqnS;Z0 ziR$fi`;t!TrI%x!+fTmjj&^G#%*qCArEW&~HG`OP^|ZU)(Qd=23AQp9gG^09q4F%3 z;yPTZxJTLU7>_{lO-IYhnhrxwf0s%#y1}#g=(4QMAg*A}mhzlUs12@&EMG?g^VQ3` ze3@Iy@J&9CEz8;r)45>@bs`Rs0jnsf1D~4(M|d!F{n^t;eUWW)w*ccmQa4GJn2fr1 zxXz^3VY0H#w#PB69Bjd0Sn(<4EGl;O^l(?^b0-Dw>9oZkDjZ4ma#L}%@*NVG6N2?! z{aiNjI6>K73RL4NXF5Ft2$=&)63Z}~49Ma@N9j#!vqIBxdj|GyJzO^U`;UuWzu9$Y zU1#fozABGx*&gKtk9xMQw%IofaAg@Q`f#p<1#}tNW%iDUws!Pm4v<5YGTJI=SR$=P z6!oE}Vuj#Cv1=Rb#cZ^)ux-FcUfSD<4R4SJ%V1L!q;U=}Be^xM!^*m%%5tLASx#i7 z6||oIGC8OB6$)jfMSVMa%W2DOyF%%n{_^TsSvgH=D<`tLa+-96+iaf^*^c!UdavIx zxT~{Fal=_&v9OjC^=cBHsF!Bvdq;)?fulr*1@W$4aRscx_2-H{84(@*`L2TM?(LN= zKaUuBBW-N5eGF39Vy~9Vmy4huRHtx|P7F_xZzTUCqs(fF5JBAtdKavC7WnPXi zX7bcSW-DdB<_m|nJ!V6bJ+WK0TOkzO>gIFv>!#h$?!vY_&InfY=>>q)u|(6Lxa29W zWQ%k3$I+@!HYjt<=h13ceh+5_Y^}LM!&juX_4F3{(DI zvM4(-1{KvU=R2HBY<+sVt1z&`MwDh|mwRjh%kV5ib{J--R9xq6nu=!EB%!CsV5z#~ zw8!lD%(@PZbOu&nfsY0FUVeI>FuRnTqxQ^JduOYQW~)7O)ZRJjBD6i<>-GnZ&jzqm z$6_0;*5?3nw2Jw0(E!3$C+109n$*RA;t$bJI%;td~86wBkaX z6qYJ9=QEg*%{eblb&7>uoxOY4_YCwFN{lXfNuk(KcR%YP1 zynC?A*G^YjyWPLnVeqOfgE7@z*oD*k$}HoAr3_3{8+(d9o&E+bAMEKaakv7F%_=jn z;wV&P8tX0T$#3toi`bUoRI$)GxP5y*AWGBF4?HWz0hswZzUgqTz)-oYkEF*nLB{2} zLT`SLq>3e#jHi$dS)Dz-Jp(?Q2A|=mCB3~XaH{F}EQnRwEJT}fJ+MBLV^9$%k0x@%TexP&>CH zy?Tkh7LkQqtYT>&yR5r(K);9woo*X>5~Vlut1zDURADJcDHQ7&U=bW4uv%S)p;0ti z(&NZxe=m-jO-kZxJ1QF}cr?)qp>CH}P!1?o@JSDjr=SxawP0-n|)dg zr)jeAa!ijKgiSI@`H)?&q|~zB!Qu|xjK1A@^ibb`I}e!d#Q@*k!!RxfJhae?;^M*L zUbVD0-(U1U1zCXg91pPM`HnfyKe==3)}y)BlyM@@p<>KH8ISfqPpey@#F5jO-l`3vbw z@|aOP3P;v5k_3^NT_QF0@)GOwow6-8&l_X`NrnwYJOnEa=5a>9w-@V5p4H&tntn*- zZ-CzIvWOW*(7|tJKW zn?$sFi@1X`(@S7#Ts*i9TP&pmmgp$~YH`m1I$<{!h{!~=(#L0Jtd)AJI7>em*Uw-} zbi_>hHf0YKyar)0iVAfk)oIyQVtD9jgGCnY&i7#B%3&_;Th^P$<6_~Ma~wVwxDUG}EKRCfL}WGY311diFHS9cA}# zU5S}uJ^W3)8&fHE%qCDEc6+n4%tYt~nICCHJU_rpDds%22X9lzDpWBk24TYFn=vU* zE)d|gTNDu&=^myW9n$yJA#?*kX zUd^aBVD+#?ZNUOxlAF~^+r|P`#6Sf+w3DtcomUIW`LG~7f=UW!I8be~|5#io<_Jd^ zm*D9Fc9uNy#~!nf=IR*iDzTx6 znYG_k)p23I-|eYcUGkC#d>8u%9X?A7WsT#NC7cqiU!-GLDcAQ}jB!HWoGa@hcL4Pk zI9cgO1sL`2{*|HC9JR{K;GQ&-S^B~y=s6xw9XriLf{22Lh*+NKUaeM%E~C519AI;a zh!vo>X2tprkKASCm!0@BHc$)qxSN{#OJdz2OD58}S~4EaVga4q@;b_v;;YD%M;CfB zD4pF^n+1+lm~go5)Qd~TbCX)f12DD`!QMOt#QLvKKkDWLf~_*=emxPKhc#fwMks?cg>=YaQB8*;XISe(spd}N?xY-eg$W>-G^13 z6U>x2Wwvun>$L(6L~NO3?=lp3dn(5Akfq(+i!65R3uR?m5?Yp_M{0+8Dkv*1|BD5| zSJ#3s{LR81!JH}iU;Ud^dckcL7BZUSaJ;Tyu6}$xxD=;|W1Ru~*Q5Fr_F=dkpi|PS zsRLA7^{XtX1svG!7N}ZC&jTMQ&&jld-Vgd9a&el5{B20()h=LJyc;}A1#8WtPAyj@ zY?Kk0T`*Iu?*{^1+%D0 zbCI99U7)-6p~hMKE7u+p$CY}ZGGFaoFLg6#o3yx^?mePo7S^JDOS;h})Yadbqk+?c zr6t^q8-;rxOc~ay8L3;a*qTJh5!z9M0R{S$nQtDswQ%| zIV+K(>-Q=(dI069UjY{htOlJOsp_#Ff&~oL>T2P-b4gRxLhW3-e~7Bly4^ca(}jw9 z(lJzH2dqR2UEI(NXE5BU6m{|kK-Jg_t;;mUP^9MUhdx+|L(SD2w~~xog*GtgoGB1* z2to2PKn@Ny&ef^|B{=|CmlsZ_WvlcOL+452z3jgt_|=rR<6{p{H+AM3@%}!%39%C8 zhcL{B@yXuPL56MU0k;l6IWI7<9~e}#;>WZhOV2^+=?s3g%hX!vJs(t6%Ub87eZ%lN z+G-WJ9ZVjOkI6x|k&{L#gu_NhaD@0co9F?$6nS+i+_^BCHLie7)&g>PU2^z%IA zvSl4=Cv;_qV#x2K&c_!$A1qenQg?u5<^;4^OD{O|UzCbo^^3ePV0XDBV#+?AA2HR-JB2#|qDwrm-Z z4Jo!8+OW{ru@fb=3L60}QjS{DKVno^0gQ5q=8ysb(nAhD7^o2lunz^&Lr}DZQM8v9 zx#duxJp||_hqh^RX%9Ix?f1>>Qlv$@xfDo?thDn#Z{ECl@6B-jwkCusXHk{22*v)W zoQPMc=Rs{T(p@jouLdsE@!wL=P|hQvp;m*`7RQm3@U;CvO?HwB3#bPr70ZOM(|U-} z{^7tvx3rVDuBkx)U=k(8s?QNzw)X_Oq-9l~LY z()NQ|#>ubZ@zW@ge9JhUy2)19p<9ud+`!g=UO&q0#4|TA@A#R%+s}BUPs(I0%cTAA zGMNWuy2LZJ0Ymu#`*GIyB=BBEOH!XOJ?_;R>Jv7m>(L!^26fAZ0l4}|>b>la=go&MvS^5-Ak`uzKUnftpZT(3}&vgDOKnQ_8A-f71f33nTw zwrp4V!iu(o^QL1W(HP!gyiZ~XY&f`$u^8^v)`YgEv~_4lWEsAKN5eL4r1fPsG7S2| zB48Z0;3LpEyvOmLz&nrkG~RP~Ut*?WAs1!BMV%|WShSHTTtsZubczX*gyyLT4|qu# z36;FkDXxNGpn#miBavw`mam;UyeFcJ3h50^ql5FAaey69z`_HxOP=XS)A5Ky-3U*) zx>VbZ%y1EiB83gSDyHMZDyY)6S%te~gYH3Op}mA<&@gG>u&A({QZSCl6}%18$!dyT zR{#?D$NKZYcV_QzpdIO~xmJ_z#r12Jw zAJTY-#;t^=GxXfnkZ-f4Bn>ZzCLvioMJeeFdpyo69MBI%WMSn!{sH&r@Se3;L(5jx zqQN7x7S1gTD@%h%F)iHhf=?0Az@1J4-&lgNgGQc4Km%90;4>^VhG~q@z@OzG&j+rHPj3Syfy2$L;&RRNw1*wv0^MwnRX&a$_mco%(LMKt$zkF#0Sz7 zXQgX~u?+_p$ADGLxQ1!DMz|kL>pLRj<8j=K4ChTpKp^s_1%!%OH=`ICY$%X#%+IFm zYIj@|iXj0OpxDKG;f6^0GGhzFFZrlEVf#bc8uLuS?RV)^Q3)D7zBW9>c?mHj|R1G;zv0Y<q zhulGl*f5?88OIz=#^tW_^K!<5zjqfUP3bzOG~vhsks$tY5dQ=+ z62Gq*_Iy}lEpLb*#ch-IEU=yh{z3hN!uKKe z;P^puRw5D9p^_YFpu7RyTu=p|i-iDacwy4ET@xl096dq&(Et=ITy!D@biIVdBwElH zv^9%B4}l}@4wYKs@nmpb1`EL~z90wjlCGPf?lE2TOaS*Ws7?Y|7`G|z2;x7nj(;`6 zn~5O*1I{F9V=HJQ30mI@T2F$mZv|b~&GZ?Rh99&Ir4J;S-wfL}{*}Hd7NHub&poQX zpq-E|D^5Ut~Ku ztOj7AE%C4l>XBfTOmHkXCbO=~7^ESQgLa*CLn}i(Z0XwJDWo?&boHS8b*Pm*=xdsO zUP8T_;V|Sa7m6OW2er33MHg4BU=Q&p|)rfPa)b%!9Xg8K8>_fEqEZ z0i+plt&#)I4&xj|9Tf+NTn>Vr(8luy^XMd$sO`d}v4Kt$>fVOBN6OJb`U*+WMgdZf z2>44jb)N4ZGsMAU@o8(xg`0eulUPo>itS$;Ts5ktkzZe5;cjv_`IHa8k79)FcY^jU zRpHwZG3fL5ZPKfC2meq|?Amp6ZAv4#k^-MH`o`&%rM0WgtIMxVrfa0@I4&@$*O^d$ zvb2P)dn=c*4Au$InVeGi{;``YB06APVPs!t^w z5a#eW(c-Qd=Rka?m`OoX(7A-wL@D*Pnjs8T#`h_JJxH2U?uC_1oz z3O`%+;+B!6r)Q?>2c{2CEKk*I6Vp@G<%yZY)k_o8wM$D=wOW1V(sB*A*W(714*H;w ztKh=HQJerHU_yMseC(UpWPt_0&dvxdJ!6edrA4ZDFTIYL0e#~~5rKCB_3qzpQtIK`KR(>iL+Zo0Z4cI$*G}B1tK)a-vW+zs5v#Y+H`6 z0{&kqzG@Rf z8i2})v2>bi9+N?w=;HIF%GH08S0xbdSu?=h08Xy~2B%~$_klF5((K3LjQ*R(ugv`b zP*Jxur6pG|*~95Hy=2#!+D5vEP4*Cn{p`6qWxfm;oCwvEU5wW&x?I&&E4$(p?(V{O zIe@92a^tk%>ej*^rUCV$T)JG;JGsO)-8#VnP6#-hth%fqa5C!}rWc7lr(}5%_x7+z z+!GQ04geoDDTe7P;-e?xFDnWXpOhx)Ql9w2c+D!B>PfH~rn@*nb_N)7(vZ)iXgRHD z*_-!4iatos8I^|u309BAA~{0LdowjXh*s;kZPiav@lS6;5JHtR{H6p(#=ut`zh n*Ms})z77$PV0K^HLhvZI`w|-%4+6XBnJ+PlU!nG2qrkrbm@GCQ literal 0 HcmV?d00001 diff --git a/include/LiveScanClient/framesFileWriterReader.h b/include/LiveScanClient/framesFileWriterReader.h new file mode 100644 index 0000000..48a4429 --- /dev/null +++ b/include/LiveScanClient/framesFileWriterReader.h @@ -0,0 +1,41 @@ +#pragma once + +#include +#include +#include +#include +#include "utils.h" + +class FramesFileWriterReader +{ +public: + FramesFileWriterReader(); + void openNewFileForWriting(); + void openCurrentFileForReading(); + + // leave filename blank if you want the filename to be generated from the date + void setCurrentFilename(std::string filename = ""); + + void writeFrame(std::vector points, std::vector colors); + bool readFrame(std::vector &outPoints, std::vector &outColors); + + bool openedForWriting() { return m_bFileOpenedForWriting; } + bool openedForReading() { return m_bFileOpenedForReading; } + + + void closeFileIfOpened(); + + ~FramesFileWriterReader(); + +private: + void resetTimer(); + int getRecordingTimeMilliseconds(); + + FILE *m_pFileHandle = nullptr; + bool m_bFileOpenedForWriting = false; + bool m_bFileOpenedForReading = false; + + std::string m_sFilename = ""; + + std::chrono::steady_clock::time_point recording_start_time; +}; \ No newline at end of file diff --git a/include/LiveScanClient/liveScanClient.h b/include/LiveScanClient/liveScanClient.h index 9c83d7f..350a692 100644 --- a/include/LiveScanClient/liveScanClient.h +++ b/include/LiveScanClient/liveScanClient.h @@ -20,6 +20,7 @@ #include "calibration.h" #include "utils.h" #include "KinectCapture.h" +#include "framesFileWriterReader.h" #include #include @@ -54,7 +55,11 @@ private: bool m_bShowDepth; bool m_bFrameCompression; int m_iCompressionLevel; - + bool m_bCaptureToFile; // false if capture frames to memory + + FramesFileWriterReader m_framesFileWriterReader; + + SocketClient *m_pClientSocket; std::vector m_vBounds; diff --git a/src/LiveScanClient/framesFileWriterReader.cpp b/src/LiveScanClient/framesFileWriterReader.cpp new file mode 100644 index 0000000..dfe8482 --- /dev/null +++ b/src/LiveScanClient/framesFileWriterReader.cpp @@ -0,0 +1,109 @@ +#include "framesFileWriterReader.h" + +#include + +FramesFileWriterReader::FramesFileWriterReader() +{ + +} + +void FramesFileWriterReader::closeFileIfOpened() +{ + if (m_pFileHandle == nullptr) + return; + + fclose(m_pFileHandle); + m_pFileHandle = nullptr; + m_bFileOpenedForReading = false; + m_bFileOpenedForWriting = false; +} + +void FramesFileWriterReader::resetTimer() +{ + recording_start_time = std::chrono::steady_clock::now(); +} + +int FramesFileWriterReader::getRecordingTimeMilliseconds() +{ + std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now(); + return static_cast(std::chrono::duration_cast(end - recording_start_time).count()); +} + +void FramesFileWriterReader::openCurrentFileForReading() +{ + closeFileIfOpened(); + + m_pFileHandle = fopen(m_sFilename.c_str(), "rb"); + + m_bFileOpenedForReading = true; + m_bFileOpenedForWriting = false; +} + +void FramesFileWriterReader::openNewFileForWriting() +{ + closeFileIfOpened(); + + char filename[1024]; + time_t t = time(0); + struct tm * now = localtime(&t); + sprintf(filename, "recording_%04d_%02d_%02d_%02d_%02d.bin", now->tm_year, now->tm_mon, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec); + m_sFilename = filename; + m_pFileHandle = fopen(filename, "wb"); + + m_bFileOpenedForReading = false; + m_bFileOpenedForWriting = true; + + resetTimer(); +} + +bool FramesFileWriterReader::readFrame(std::vector &outPoints, std::vector &outColors) +{ + if (!m_bFileOpenedForReading) + openCurrentFileForReading(); + + outPoints.clear(); + outColors.clear(); + FILE *f = m_pFileHandle; + int nPoints, timestamp; + char tmp[1024]; + int nread = fscanf_s(f, "%s %d %s %d", tmp, 1024, &nPoints, tmp, 1024, ×tamp); + + if (nread < 4) + return false; + + if (nPoints == 0) + return true; + + fgetc(f); // '\n' + outPoints.resize(nPoints); + outColors.resize(nPoints); + + fread((void*)outPoints.data(), sizeof(outPoints[0]), nPoints, f); + fread((void*)outColors.data(), sizeof(outColors[0]), nPoints, f); + fgetc(f); // '\n' + return true; + +} + + +void FramesFileWriterReader::writeFrame(std::vector points, std::vector colors) +{ + if (!m_bFileOpenedForWriting) + openNewFileForWriting(); + + FILE *f = m_pFileHandle; + + int nPoints = static_cast(points.size()); + fprintf(f, "n_points= %d\nframe_timestamp= %d\n", nPoints, getRecordingTimeMilliseconds()); + if (nPoints > 0) + { + fwrite((void*)points.data(), sizeof(points[0]), nPoints, f); + fwrite((void*)colors.data(), sizeof(colors[0]), nPoints, f); + } + fprintf(f, "\n"); +} + +FramesFileWriterReader::~FramesFileWriterReader() +{ + closeFileIfOpened(); +} \ No newline at end of file diff --git a/src/LiveScanClient/liveScanClient.cpp b/src/LiveScanClient/liveScanClient.cpp index 825aa93..1eaa269 100644 --- a/src/LiveScanClient/liveScanClient.cpp +++ b/src/LiveScanClient/liveScanClient.cpp @@ -53,6 +53,7 @@ LiveScanClient::LiveScanClient() : m_bFilter(false), m_bStreamOnlyBodies(false), m_bCaptureFrame(false), + m_bCaptureToFile(true), m_bConnected(false), m_bConfirmCaptured(false), m_bConfirmCalibrated(false), @@ -183,6 +184,8 @@ int LiveScanClient::Run(HINSTANCE hInstance, int nCmdShow) return static_cast(msg.wParam); } + + void LiveScanClient::UpdateFrame() { if (!pCapture->bInitialized) @@ -203,10 +206,19 @@ void LiveScanClient::UpdateFrame() if (m_bCaptureFrame) { - m_vGatheredVertices.push_back(m_vLastFrameVertices); - m_vGatheredRGBPoints.push_back(m_vLastFrameRGB); - m_bConfirmCaptured = true; - m_bCaptureFrame = false; + if (m_bCaptureToFile) + { + m_framesFileWriterReader.writeFrame(m_vLastFrameVertices, m_vLastFrameRGB); + m_bConfirmCaptured = true; + m_bCaptureFrame = false; + } + else + { + m_vGatheredVertices.push_back(m_vLastFrameVertices); + m_vGatheredRGBPoints.push_back(m_vLastFrameRGB); + m_bConfirmCaptured = true; + m_bCaptureFrame = false; + } } } @@ -515,18 +527,32 @@ void LiveScanClient::HandleSocket() { byteToSend = MSG_STORED_FRAME; m_pClientSocket->SendBytes(&byteToSend, 1); - - if (m_vGatheredRGBPoints.size() > 0) + if (m_bCaptureToFile) { - SendFrame(m_vGatheredVertices[0], m_vGatheredRGBPoints[0], m_vLastFrameBody); - - m_vGatheredRGBPoints.erase(m_vGatheredRGBPoints.begin(), m_vGatheredRGBPoints.begin() + 1); - m_vGatheredVertices.erase(m_vGatheredVertices.begin(), m_vGatheredVertices.begin() + 1); + vector points; + vector colors; + bool res = m_framesFileWriterReader.readFrame(points, colors); + if (res == false) + { + int size = -1; + m_pClientSocket->SendBytes((char*)&size, 4); + } else + SendFrame(points, colors, m_vLastFrameBody); } else { - int size = -1; - m_pClientSocket->SendBytes((char*)&size, 4); + if (m_vGatheredRGBPoints.size() > 0) + { + SendFrame(m_vGatheredVertices[0], m_vGatheredRGBPoints[0], m_vLastFrameBody); + + m_vGatheredRGBPoints.erase(m_vGatheredRGBPoints.begin(), m_vGatheredRGBPoints.begin() + 1); + m_vGatheredVertices.erase(m_vGatheredVertices.begin(), m_vGatheredVertices.begin() + 1); + } + else + { + int size = -1; + m_pClientSocket->SendBytes((char*)&size, 4); + } } } //send last frame @@ -692,7 +718,6 @@ void LiveScanClient::SendFrame(vector vertices, vector RGB, vector if (m_bFrameCompression) { - char buf[8]; // *2, because according to zstd documentation, increasing the size of the output buffer above a // bound should speed up the compression. int cBuffSize = ZSTD_compressBound(size) * 2;