From b2e1e6f82ec16438ac4ccbcd8f9ee939e35774e6 Mon Sep 17 00:00:00 2001 From: Mariusz Pacek Date: Sat, 13 Apr 2013 17:41:26 +0200 Subject: [PATCH] =?UTF-8?q?wst=C4=99pne=20poruszanie=20kursorem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Przyklad/.dep.inc | 5 + Przyklad/build/Debug/GNU-Linux-x86/main.o.d | 1 + Przyklad/dist/Debug/GNU-Linux-x86/przyklad | Bin 0 -> 79514 bytes Przyklad/nbproject/Makefile-Debug.mk | 14 +- Przyklad/nbproject/Makefile-Release.mk | 8 +- Przyklad/nbproject/Makefile-impl.mk | 2 +- Przyklad/nbproject/Makefile-variables.mk | 16 +- Przyklad/nbproject/Package-Debug.bash | 12 +- Przyklad/nbproject/Package-Release.bash | 12 +- Przyklad/nbproject/configurations.xml | 2 +- .../HandPointer/HandPointer.cpp.cpp} | 0 mariusz/.dep.inc | 5 + mariusz/Makefile | 128 ++++ mariusz/build/Debug/GNU-Linux-x86/Mouse.o.d | 3 + mariusz/build/Debug/GNU-Linux-x86/main.o.d | 1 + .../src/HandPointer/HandPointer.cpp.o.d | 4 + .../src/HandPointer/HandPointer.o.d | 7 + .../GNU-Linux-x86/src/HandPointer/Mouse.o.d | 4 + mariusz/dist/Debug/GNU-Linux-x86/mariusz | Bin 0 -> 218003 bytes mariusz/dist/Debug/GNU-Linux-x86/przyklad | Bin 0 -> 218003 bytes mariusz/include/cvBlob/CMakeLists.txt | 45 ++ mariusz/include/cvBlob/cvaux.cpp | 79 +++ mariusz/include/cvBlob/cvblob.cpp | 344 ++++++++++ mariusz/include/cvBlob/cvblob.h | 587 ++++++++++++++++++ mariusz/include/cvBlob/cvcolor.cpp | 104 ++++ mariusz/include/cvBlob/cvcontour.cpp | 436 +++++++++++++ mariusz/include/cvBlob/cvlabel.cpp | 444 +++++++++++++ mariusz/include/cvBlob/cvtrack.cpp | 419 +++++++++++++ mariusz/nbproject/Makefile-Debug.mk | 90 +++ mariusz/nbproject/Makefile-Release.mk | 90 +++ mariusz/nbproject/Makefile-impl.mk | 133 ++++ mariusz/nbproject/Makefile-variables.mk | 35 ++ mariusz/nbproject/Package-Debug.bash | 75 +++ mariusz/nbproject/Package-Release.bash | 75 +++ mariusz/nbproject/configurations.xml | 88 +++ .../nbproject/private/Makefile-variables.mk | 7 + mariusz/nbproject/private/configurations.xml | 73 +++ mariusz/nbproject/private/private.xml | 8 + mariusz/nbproject/project.xml | 27 + mariusz/src/HandPointer/HandPointer.cpp | 127 ++++ mariusz/src/HandPointer/Mouse.cpp | 26 + mariusz/src/HandPointer/Mouse.hpp | 24 + 42 files changed, 3527 insertions(+), 33 deletions(-) create mode 100644 Przyklad/.dep.inc create mode 100644 Przyklad/build/Debug/GNU-Linux-x86/main.o.d create mode 100755 Przyklad/dist/Debug/GNU-Linux-x86/przyklad rename Przyklad/{main.cpp => src/HandPointer/HandPointer.cpp.cpp} (100%) create mode 100644 mariusz/.dep.inc create mode 100644 mariusz/Makefile create mode 100644 mariusz/build/Debug/GNU-Linux-x86/Mouse.o.d create mode 100644 mariusz/build/Debug/GNU-Linux-x86/main.o.d create mode 100644 mariusz/build/Debug/GNU-Linux-x86/src/HandPointer/HandPointer.cpp.o.d create mode 100644 mariusz/build/Debug/GNU-Linux-x86/src/HandPointer/HandPointer.o.d create mode 100644 mariusz/build/Debug/GNU-Linux-x86/src/HandPointer/Mouse.o.d create mode 100755 mariusz/dist/Debug/GNU-Linux-x86/mariusz create mode 100755 mariusz/dist/Debug/GNU-Linux-x86/przyklad create mode 100644 mariusz/include/cvBlob/CMakeLists.txt create mode 100644 mariusz/include/cvBlob/cvaux.cpp create mode 100644 mariusz/include/cvBlob/cvblob.cpp create mode 100644 mariusz/include/cvBlob/cvblob.h create mode 100644 mariusz/include/cvBlob/cvcolor.cpp create mode 100644 mariusz/include/cvBlob/cvcontour.cpp create mode 100644 mariusz/include/cvBlob/cvlabel.cpp create mode 100644 mariusz/include/cvBlob/cvtrack.cpp create mode 100644 mariusz/nbproject/Makefile-Debug.mk create mode 100644 mariusz/nbproject/Makefile-Release.mk create mode 100644 mariusz/nbproject/Makefile-impl.mk create mode 100644 mariusz/nbproject/Makefile-variables.mk create mode 100644 mariusz/nbproject/Package-Debug.bash create mode 100644 mariusz/nbproject/Package-Release.bash create mode 100644 mariusz/nbproject/configurations.xml create mode 100644 mariusz/nbproject/private/Makefile-variables.mk create mode 100644 mariusz/nbproject/private/configurations.xml create mode 100644 mariusz/nbproject/private/private.xml create mode 100644 mariusz/nbproject/project.xml create mode 100644 mariusz/src/HandPointer/HandPointer.cpp create mode 100644 mariusz/src/HandPointer/Mouse.cpp create mode 100644 mariusz/src/HandPointer/Mouse.hpp diff --git a/Przyklad/.dep.inc b/Przyklad/.dep.inc new file mode 100644 index 0000000..4560e55 --- /dev/null +++ b/Przyklad/.dep.inc @@ -0,0 +1,5 @@ +# This code depends on make tool being used +DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES})) +ifneq (${DEPFILES},) +include ${DEPFILES} +endif diff --git a/Przyklad/build/Debug/GNU-Linux-x86/main.o.d b/Przyklad/build/Debug/GNU-Linux-x86/main.o.d new file mode 100644 index 0000000..fd85132 --- /dev/null +++ b/Przyklad/build/Debug/GNU-Linux-x86/main.o.d @@ -0,0 +1 @@ +build/Debug/GNU-Linux-x86/main.o: main.cpp diff --git a/Przyklad/dist/Debug/GNU-Linux-x86/przyklad b/Przyklad/dist/Debug/GNU-Linux-x86/przyklad new file mode 100755 index 0000000000000000000000000000000000000000..1e19a13eaee4a4405739a7caa1cf5cbea2d8bcfa GIT binary patch literal 79514 zcmcG%2YggT*9Savx7?d0$u3I^5JDCLgr3k#fP_n6Lyd$8p@onHhysZuR8c9SMnn-T zJXRDQY}h+0RRu)_6crm{CyEM)h&A8;oVj~<6Uh5M&-;B}`0brJ=l`EGXZqZGXP2uo zM-J7b6rn#&3=||i(IA~w>MFzw&BB~?(MK2}U9=Icgc~duJ|SMZ6$^zstz@Cl0GIw8 z_&6z|(FK26IxhIr(s2g~Cwz$P9hrt@6cd>5xcHr$7whYd8#LoBd5i z5yj(LC_-F|bdH3=rAjSAVJO{2NJoDDr+*o42ZL01!$#+_=}>(nLZZAI;zLzH_~-rGw0q);k@3~N?8LtxqP3qVF6*S@kz#K+gIzBnwjsPxa6ukmL9omLVUAs^`CiR z&8gU##V=%i|K88BX^kh0Sd?|?bIFa_~Ka2uh$i7|&e_0*;;dS`)MIHQ^b?6_#ptz7fo6txX(l@Ik-|Ra4|D%q4Kd!_6 z8+GVkt;5fM)nPxg4*j7z?2N2K-?I*XF0X^1S4aK)ScgBy>!`Q6b>zFP4m(Zi@TYGb z`nh%J-Ixq~qM1l;GYusP|NR2KPc#*Ywe&~XPK?;tFrCSHkm>Ia<~KW!A8VC&nLnL* zp-VX;eo;@%s$WyD!A>h+Cu{K+Ge1_GiLc3@fcj}AVnnOvNG|C9ijs=LStWC4o)1-&pRZd`QdE2aE38JlMOOZV)Kp5}OXN=+-K}sz_fZ8E zL%L-yh!A_vE1q3kP+n{+`^+dPuNaErW@bn7hNRjIvXYuoR9rB7c4=WjML20{w~NU& zv!IL`)lAJSp^Qc#^imbV1^DD%J@dfkBvP(hYMVz_%AAvK>fvGEbLEc7W{P+^wNE}aLL0i{OrEmgP3JTgnT zMz}(XFPo2%x}-RWq4}RCw;dl=Fu%OKq+ssg+4KM7yy0Na9AucERg#%mR21^0r-@;< z_&@ak>84v=^q4Wbr0hRU7s{u0 z!j2uS4xV3DF>79NK~est#f$R`5v#ytHgR-Ld8p^+RP-q+Ezh5h&fX&nbC<0zN7HAI zC`7L-$SUN{!4YUN0P<%pT9jW_Jg>ZTE}E-iasGl7HcM37LM_Xj68_Cmt|2zFurQxT za;nJBox2d-9FubS{5i!mb@J?lA(~&fs30G1FQR!hp8#tbo>NdVmxxvg$ts*EE-I)f z0C9SGx#B@Jw@3^dnKjtV@7ASTm!4vnY36qamvs{+Al^fm6DDK~&dN{i(%o89Y6n;% zBmS^J;m^gpW^4-VKPNO!?6K89+HJczu31_|B=jqo@Ig$(XMVGiD7rJLXKnfk-*z7E zs)64ffoHc}T#t6{P3-iV_yul}efq0tzYezuPSFxL>E3(%Ql!>IM~i>F^)zVJy;101 zf@C9U8U?)9mmE_UUxYrgUg9G3k+qT-p-0B{Uvh-ra)q&!2)%Bzh3FHZkMuJ=LXV2H z|AG;EkF6CVJ3`+fLO&rwj|#Q_rbXzZZLJWqBJ>?2^kotH*a-ci2z{Ff{jvzXH$s11 zgg(@k1h0+I*N@pjl1xLZ>LANwNyctgRPAJWILS1`s-9qZFv&Eusy4FRk7OEBRcl%9Mlubhs%0#9 zAeo9)RmO5Fl4cUkAS$>yf>bg}sS$>n`1|&bh@@|r; zt5$7fc^k>p6|2^={1nO51*?{^{4mMX^{UEPzMo|3a#hnz#YZ(W7>Hh6_JES`^V=eWc7uumi<_0^{{a$e8x!7Rk zHw(2XdtQJ&?ucim>>#N6n78FJ(!D@Zh`;Nc1N>m+?%=NP2LVs3NE=Lk?OHoy>LNb#RTz+C7dU)k4lTib~%4f4FShI@ib36M|x%YVMur3Jk z48)Zu<<&bYJTJjgbyW(60Mblj3ww_r!w7)5(-P@%0>m+}NU6`Vv0GVOvx?evyMYIB z1Wh7}rK3?ux^`h5iOEU~8S4viZ{~4wbZ_R@S7T`I%{-Rw7Gejfjt~Ef^2|IET%CEu zF3o(UJQ!R(3ZKj)^tb?7y+h_J$+^|Jtlv8%$yY>%ha?#sI+Ms~#*2LAD(0wd_%1RG zgJkH~pViebEc2sWYu0c@thtq{l(YG;`e1O)tz27cR#8U}R(?QfmLd%RMPF4G23nKh zHP1424FjCM@v0H&^46#*CwtU3tlHkwGb(}kS7mRm98 z^|7$2*Z*Lzt;}hjv5GT?OmTmPiS!^>7{x}eVe=>uTUql8rFjuu2>IL^L<5}m`qoew ztXyS@9FDBqef;+t1)@pM$}GKx7wKW(I|8h{v(k|%CtC9gQB*C`d>+n_qGOokdTbD8DAmF&S9=B>$GwoP?l?o~OFmNGY52}W^(%mY-rUvND4KyXdw zPJ1|vf#G0V29CaeNdOmvc6-O$^ zCHX4Ri}%*igM*c)xf37%80ME>ae@ZWmHOVy6Q~)n{EFi=u1Mx_7V6>uoU5+hkpRN+ zSCQ(sgS(Emyn3hiY8?%?_9aRf3{L?KF~lHpAA#pCC8`0j_jm=;S01T)nbK750WY0< z*WTm(Q7b=Snj~Fl#1A7~_7BATAxi~=f6!Ecix{$-;B6K0Ix1;>9KzZ#weh~@FU!|FJ(v&?kv0_u=tGwc`%K7J3Uh$Wl z-){L8pkVS&*pY-);J6PCZHq%}JBd4{VWv2K0~l{`;_XD;K|SdB6XwPeB^N@zvQW99Cv0Te1o(vlA^@ zg_YSpmiMN|*=hHt_n~;m9~3cY`4n8EatyBAnQrw}2mEIXD|ZH|j$%SG;+;{dH>^@c zS^<=7JDMKERD3SDa(8yH@4*V?&1xt?TK?OG)2~jCqb*N|~K$T0dE_6VWAP&xlhC2Uc1=blmNR_C5Xn@_=ZU*h-;ZF$55E^LjwFqf?KZkG@LVDhP1mQ;I4!>7}DIu4P6>^bJHjmbgwNm%d zMwT{{=YFlOj=T>I-HX-a3qjif;y?IHb#)@yj`adX8OBuIH~25?2%k!x`SR3I8?oelevV z9P7JD%Z!b?(UBROxW<_on|y;S7@Km9I~dz%r9LV)eRgc0jM$Wn*yO>niGyR~z#klI zaQ`?1J1MYZbs4h8f7R7;t4wz7^@!fCCp==UbUhFyHcQv~DDgDMzmQMM>pbE?hwGIn zvCrXpDN20da6$8j!}V&ESnqW0juNjqU2jK;qfXcUDDjlb^+uG~?;_6EF4y5GagW>e zZj^Z5O`5meu1})GakuNEDDe+#?$uqVkV`cQw#t7`cHK! zMW$)#xQ5So_;e*>x5s}wwR8^Yfdl>ZvVhRDw>YI1k)TH#qMbYpU*zs6SB)(U%B;ZQ5Q*a~M@;Q}kX#tLtC72alrTda@^6>-6X|9*+d zINj1du}7Cacmr@3K-GCv7YMyDrvn)DH?mnehd1$6h)*p!(~@hy(60Sr+8wXbhXz!l zCHJw?Pq5_HmRvjd=Nfe|2SZCv>5lkP421@P+B6iRDaNGha1S63L$4T(KpJyFc4+$1 zR0K|aF)Q6=taJ^YghZbO@ytKD1c{tZ7v2>jt!qVN0NXJT-8Ym0(2~a>x`v`IBHoRU zn=Xgti&~z%Z`Yb=6Jrq&L+ft z4%8hcNQdEk8!e<|1(3tT{b5&|jBa8)mW^orJZz)Z8vEog=xzRwQlNiRaXSN{x3)_Krk_D%~X+H?3STIz9PO}iL z3iJyLJ~R?lxq+&O)l*akV>CSAzFdNc)$lRqctBN>XojJB$!5gsFB^;FY{pV;8s_>& zhH;Jd4iYsktC%N@YgyU2To~7BGXOV+tCiY(!e`7D#`W6e6fK%AjMds~;G&V!SgW0c zvPtjO$mV8^@@c~LzmDU?xJ~ne+vG_MW#e|m;O5$(82-;O(2XlC;bl;bt5|UQ$70YL zE7$?UUk~HkSjmXbe=l{I8?+mdbzB@3ATf^INJ3Gc;sT@ah(CgO3>Dbes4WNHbSK7s zqBPn$24Ox#=~EnUQ8~HvsSc_VE@?N1UDECjDk;@O4+qx-YNw}zYDY9PjJ}SOi20w1 zMHc-W-2eStg#Iizg(_Wp3;H*8(+&z!rR&5-tL0 z?v8=)+{!IQ3>C;2fe-zA#6P6xEHJji-hrn%Dcg0VLWN&%+>!C3x?`k zPqPp$VkouotfK&l>ks#mrB5C7Fj|%4sIuiRn+(<$mbIzvA$;kex;8`%B{IHt(0Wt< z7WiWrXB#Syu>;Soxfx2}KFWhk1`WpP@824?s^dwmTiznl)HZfZ?-~;~1$_Qw^XF zjZ~rGFyQ`Py#XBOxbUy0NvVnj1KzX*A%@t-4^E2LpA1)$jh~&* zQp(L({f$$WlSNSwPBUOMs3 z7WBWQJaD4Iv;AvYGeW`yl&uFChOvuFn2dM~mC8tQDZK}*`msonZj5lRgP@8w%3Xp1 zAR3exUnY!E?#2KNe+JF}qugZJr#u_w<{I>0OKqcsL{$JKB>R7(2~$~1@qdZkn?>s* zVklQ*j5{9YVxFMUyT|=7;teTYzhyV-kMFuagvQ^<2lOzz^5imNoh?Lv_A>R#NVK{aJ9T-k)aK z;jub^1)qNpb-sZ*RZyJ&J!=0!dJeKn^ncp{Lb_f7A=&>BO=cPT%@9)jLF$Qv^*s>! z_@AeqW9mOcNQYNX!mAjn5~ID|gW}g>Z)SAS^MM;iF|NF~Bdcm#7xN+QEV}B;m~aiQ z%_$e}B+R)YX2(c?Df-jjfOD{Ld-KrXQb)}5I2nXacxen zDK?c-?I^!O0ueJN08)4TPv%P01Y7qZqI`?T*)H6TPwFT{i}#SCVM;>O0@`UOL@lHZ zbVAhSpP*|bL@htZ!HO8n3kgvxTXAr8Zw{_0;Gl9T2dmd{aO0yK+_aB_wZC$(t`T;s z2~it*ad5|A4(=Ss!Ce&`+`XQId!FK8<30}V`-Ov3gV?3Bx5M3psNZ67ACeIDdwUN4 zSjxel13CC>3I~7RhM;9MwjQ#T$+t9~XL_J?S}G7g7vGmV31mvHdhEgU>Q zt`9L^xP*fjD>>NqAO|n)<>2Mh9J~_KmzX=caIhpk__pH4f3!{W04t_hPKALMrcSTtxImklSN9 zi8Mm1Q#ITLPa@vMZIDW)yf_K^7IGzsGMcRUb=<#u1F|#XqE*LE5EfAeYQFJap2~5W zZ@fzfaJ>Hz#IHKjnK+{^Mtu429Pdo}738jL)t%xiZ>M;>l6qM0ytg#N0`A$59^t)> z@)aJs$@1P#al4mp!_xjc)5_>$5X=`J(Vj2 zwaDK<9VnKv+5Nfzz%K`*9tdm(phF1cwo?t*u^7F@7tpRnS0i6WgTvOObyqSsx}dXwap9!2^V;t3)~Q{^c%S$>FyB@<56y%(P(KTz(fqSs3FEpI28 zN1X-Qc7Qt*MHz_4B;@TTvs(!9B6>k4kP%_@;buU4$-PKRXd#di8|^tb6=*-%8o?FN zt|Wvq7QLoo-t%V2>TyC)G42HN2%(gxs$AN|h@PM8khA1=)Zz}{hih^ush5epqT3^S zkxT`Fv?mb$bv{}2`V{k?H&1p>R(-HxBkT?EQ5mzTKKEf}^G=tapiKq=QUjVdRb1nJ zR-!7rm&&Iv!m58EeET@y74mr$@hTf0;qG$(<<4=Qd7_tJ+i9UoVTs;CzLRv;SPaj&7P!ZkPMuCaoU{G>X_gE?&>q zFkAZ$%Nx@%xB(5rNA(t)!)(!WJ%+mPb$J(TOaiGOL==5_PIy>;*HcXj{dUJAi)W>z z$H3RwwEm>_Jt;Rpvnixi1Ftnh56P#Y-flxl)O8f}ynF}huWCRMg;1nj@)ronn@KSCCP8}%hxKNx9+BWnH<{Sk6iOu1*Rh*vM5{yUYoB>{KbGZMd zCDMqVqRqgRKpjrTp(7^XqlTt}XK4pgg`oZ>djlFkFwX}A=z9;|GHnEwD^7hepviV> z1z)aB?r5c+59o3`b=sB`?ckvD?y zuNowgR!Hlz;rOJRmB&-SUmy+_f8Z-=$m3TThjAz0hWbd&jK;j}$HyxBPuP8V`#Dav72;8<_l|&igjrCa9Zp?e^t$}_VhfhRJkXez&#Obay%yeuq6{Iwq zNGiqgT_Y2tElw`*;u;*ai%DyPCCGcLYxn>w*DFC_=SLxSe4iw}QF9 z4t8WqP&(h;a$cx&eT_8#Tp(RUb8uEiTprXLXVnD#y%RpQszdE7RWVMwW`=r4CYbpb zU`I3zXP~(^VC%{mECPLvorD{PFA*hgtX$^02ZTEL9MG@Dr*Gg!usxyLm=Ct?#L%WdYy9S<&!I$-K2{c_!(ArpIaN+7tBw<`j(iy zijvnNEs3`IhWWdI;E z4AWC2-!biuiI%IA0bLe?dFVurQeu01@pE-9*!5uEVY6u*Fk7TCF;jmF6~V-(LE2*z z!!^!C-)~xdY?zq%DM%-5B3C=tQrbq!x={ZJy`PCLOm2~#qL;7g+2UUKM2HM03M_Z1E zqsR0%rbQeN(oCBe;V2P(10AD6b+inmTWzA9wN;~R_8+|z1kV34M7E#L7HLeZZ#;}G zD-%Bi={uVk;b{F-INH*<7lV_Df`%79=QTYMeL0RFup%(AJxBv>Vr@s+>_B5vqQxE$ z=FIciB8|=FJ7x~Gh|54)YZD_JU5eK8PBqS=zBvDfKzh+8M${+~eU~`?3R!#?r0;BE zZAaPc6^08FfGR&CK77t=dNzBNV;UwDReq5A+QbM)uf&q(y~i+7qXC)}#)356CQ@3f zG3g1l_etZe7U~g$yd0!!Y$BCNq!Gur-mx1?H$8@s_X2;$=GexpT^h6RcT7PWG5c*W zPt?I?Cn7xYJ>$qk**KjG>#Pr-a3xrt>~U=AZE@NIA82#Jo=^o_?Drf!8(Zx0U|v=S zTR9O;4`9>Z!U|1wnSTES?5i=`q_-Z3n=m|l6B#F>arpx)L^Rc_HZm6vo(EENa0kq= zPJj3Qn2ycw(EQTul@5lP+a7weHJ;TN=26)2ncdJ463udKh;|C|Tkw}j^GmeUGR^D^ zUp(heg@^T zWlk~p`Y3W|W(B!Zf{93)&pOGS{*%a^t(ZIv^AJFv8JkV+41lwo@NYm)|4sK%!pla& z5wiiJ(tHg!aGFW)hn(iks9z@cKn*$l&+a4ggQyE(9zr!p^Kn$6X3iU>XhU|w_&=Bi zGVe(Q>TjgUcBqx174XI1LZe68L-QITo}ke^Z$D!Bn`+VkDHflkq0|qD-A!sdmT4YR zSuf>URiXs`>aA#68T=kq@7H7oI8sJaHd#f*g~IPrDlIqxD!-v5XV$FZMZ#ZCNk;Gs zw2$AXBww&6>eAm(Nr_pdg%!fzL`mtvDwNpYTuIA@(<=>sf|7(Bo`P2Nx3WZScs!i< zx3xs)@N%@Ozr7_I!~a0*`a4;oZ}@(+vcIb(CJsM}#`br&#Pr|*a;cXRp9p@0ruX+% z((vIQq6hfXl;o5nj-rkH!zFb98Ej1Mj+W!m2B?)Z1i^i1Pyaby&y(#fzCJNiQ-#D}~zhr7WfKb`0k&b6tgSNmG*~&}tbego(8>Pk>;WyZg z2dg*OPh(g%9wVD~!i7kYK;yjT zxcmA9zROa;ONg=$3BA8SB@|^!5r*`4L|F&;Zktlgl;iNXap5VXVJpu9evK&PnfCxF z>d?ZNZ;3Z&7wTJn1iZ@TP%Ce&EFpo7E^f_ryVb9VeoemJEnSc2aG$jnvn?K7i zrLzokv~I&CWH@7bUtC(E#O)qUVO#0wqn51<^m5A*Hc4Mkl|<)REM;3#-bPJAr(2XV=TEe# zep=fMZ2@WRL)+f=P^rs8G>f>HMzZd696_AU!+6O$UqnuW92n`Y(Fmn8GM4GiUTFOe zI&DKoX1tU$UqntNx`{rCk808}8cx7@iJT9I0Gi>T+>aB)7v2Su3dQ~jT8Gp168dIN z;%JbkvK=~rQ=2?~WESvq8lB4VQW0wxYQn`ZrZ33uEqyc9 z?Oal_7ZigRRMy-jSdI1P%MhirJz-o`OYR6v)cQ-*z39wOZ8&EI28{j|H!B?mVqD~u zpj>*1DnDr{BkysFh02e3G*v>*W7zxX)4B9C9V;p!BBzrVP@IG2T$-XI=G@#7)Z%y3 zBuulm$~E_S>SBjTNppB@S91e-fIlb$Omq8r@E)qCt#qcA=KL@$avvwVkJHjY({u!q z$KQm=<1ZK(22C`122K2ib)_w2p0N(s=rR;2nl?KQskx#sRNv2_*92#0W4L&t-8g;y zTL~z_GjS~9e^G@Qo}yU9|E9Rlvjk1h^dE}Hc{*U)YFbV4ME~5@hzmaQknB%%LXa$^ z_%BO`ps~=$PY02jI#@{ee;t6}Vj<{{qYT|FWc#-dg`l%A!GARgQF74=95D5dX$Ya7 zyb{7J|5M1iX$<$cGXECrx0}{yp~7EmpVrcLG5u(r~FkpZEFyamE_{vXLeTZy<>>+gqYyJ=TRy?%o~gM<_oHu|&LKuBfb zLH}q%y0P$tKbM5=k~-Q8{sgM2p6uIB|7B1$?Je(s?N^1?IEdo~=|8}$cJwkcuDPK7 zhG#T-W^<7Rs_-XmS##FgXvp{~jkH5aOBeJ$>Qp&7Il$ZwntJGHnwnN9KgG(STg3R^I4zx7 z^U|2JpuY%;;W2qXCq+G2&=EKvKZ3_Qbt%?b&OC>Th#$)kop)0Z4f@F1xfR zikcIJ_Kq*%4zY+xbb)~@5k#|7_+2@4Rd(XC!&}3X|w~ zVc0_pe;zr-&u08X8&^qh@&I~~q0_aXud@Knqctg)-beR@wC?4ne9EERjBgNxAK}?)2 zZlZXi$8#~_>&g&M_Dq1wE!NX0Nf9|`8iCr9YnTpnvezQ_u8W|(hiZb3cZO?1Ezr62 zm6`Z0WSNeAhO5JZd*uMWjZ)Kb(AueU?ts7X_i&ac2;TxbUXHb=m^Emr8FLb`#KjAy z(pl1QP9o=fFQDC$b}q>_L@{9)lyy$54}>=)E!lMPRHbD?PBVg|po5i4@u z$I29+$yz%98ZN7<)tp~w0?T5j>0oSx)5>ZV%{rqQrxUa1;icGh$B$*4j?yZer*)P7 zd71|Dco@W2hw@qFl4puhBm;zm$VV&lfRUQmy#+x&!E$;dB$>F4eP2jbON>= z?eeB2@S#-CVw5YPAN6kGc@9mU(4XRlryDFLWKi7a*@B*yFpT1Hp355`9;A4phfg_Y zQ9Rl66r~+b@f1%NN;`t$eLT;MKzt;{(>+m`2opw8Jm`ssYYC(2hArEZNbxZgzsR#5 zk1Z1}qWD-(tcG|F#dACh8X}%c@o}D>*zP5ar+BXC00w8mREl5hxfSzJLO#XEdu}2- z(5gI0vsS~P=d^j&mGpV6chUHy z1FZR=(39S1QWyq3@zENfha~nOh1P8xqT8l}Xc)6_jh+f^Zf+B3AEzAY(UMwK>B*DG zZGj$?_!%v;^t4GK^k_=twj|_ZiqiuqRhHcGWatq}N;k<$89g3!hv8TnMR&!Hj_7Q8 z{Ef>z<9m>zX;yP2I%u00U${U7h88VBg#<>^BdvtM7E`t7~)2U3ygBKO~=FkMItcAL4^}?`r=UBDGTZA zjTU0aLi#G8B}L1AFARlKCAwS-Yq#N(^w?6QSL#c2`2bYALTc5RltDOVQ7_fyyP$n$ zQ#*vs%+}>k(En~@&xEl#y7ZvYn&HDad!I&~cpt^ZGF+<5jsW}DBoIrT!E;pTD< zCQQn4Am!Uc_FzE8Y~fg_A8UcPDJZF22>1%3yhc6@m_AQ97U_%8-x$3W$elKtMrYI< z|I)W(<#S>lm(Kv&7KZ7okd8a_x6l=+PUL%lJ_^IvBm%xyZ-c3pzIrN813DLmkK)F_ zu}MFQR^>xr_0!QU@L|um8q^alZqI@MXhz^IM=Zj^I21VWVW_3)iK-O=|qDJzkYcggqw)yyQp%|<4Vil`UlY^1q(*G<` zWOhZGT#8f={}(AElNW39B_#dnzfB%#V}>THk-j&!#Q#BwFH{v`CijP#nhe57j%{eT zv^zzKCX1jiwXrzrFtfNfUaED(y50aSB(Ddqd>b%lK04}L?R)Gm7}^BrF-krTDZQLL zZ7UX+z-8Jo%+Ac&3;gX6N2Gm~0CJfsKr;4*oJJnu@4~a7h_ypq6ps+apKFDUd_8HbewsRTq zrM2uZXN7jAwPlAk1RHDGQ6ubXoGpa@bsHN@8Sy0+)4J6uS80--f}Xels|m6A2|dkc zC53Z&%G5;0D;fs;*Uf0acW_L@6s=aP!Pe}iRx2f8c8jHzEX5%QVmcmzPtpT411WW? zL(+4g;*dJrZ!AJLhg<+~xlK^Z4BPDPkn5no+s2lJ4fk-!$Dn`F##V)~o(}mY^t8=q zU)03SC%*%|9lLrW8OZV{;J@1(&Nq#gk3e6?0W309C(@6?$KjK-gUqMxasnRYxEr06 zzRoXG0rd{US|`Bi4*Zapc#z<1Ko{GvUDG0(R<3AT-3l6_U5vmHZ7$|<+AEyn{lD5P zs5ojk13f!%RFfN#Vhh>x)38zM&o%ixRC`0}$QtH!$255a;8!+**J+jb3r(JZzS_oU z_hT9UQj@-6c)o@Y=jSaAV_#{q6ZE}pOtl*4_cg{p^f@-B1}UB24}7c9Pa-71dpR5U zLYt%Z4y%!Q;0J9XMhX2IgIo*zHsT~vdDE`J=nS0De#SJFPVnP^o(;pZS^@r1TbFH( z^LGFpw&4Lqr4=G@Qgbx4n)XLP=R&a6MSzLGY3)+fH*E}MeY8qEKJ0+S;pyazmWwgM zoSwkbYjNI8hMlt-y>R7yL>}-Wo5P!+aBsK-{|kti7Fg>}K(?1U1GnM1FSzEPn75WK z`|Eb6S%PN@!knv> zmh&>yi)WW-^`+QvQg){SpCihCYTRCQf<5q@o)xd=Cm-xK$A?ihg(=GOdbgHpdg=~% zAW=Av5*QJ^HsC%Y@PfW^5?%+Q7B2=onJ6lcG-|~c^;gjGsctHOToppSpOG8A@4{>! z*rvaV1|`b+ny`qb>Y4pAZffHKJ9N2exGMcV{VPh{VEX(SBJhS@1;Lm@tiUe)W0*Kb zW_~A%((cwzLi1-xt8Qpj`S$3I;CMB-4PZP0pCr%ap;=r}Ue$Y`mVD6m0-Qka*Y%X9cy$T`3xTY#4G>=xGiAU2Ao3uJcDs$oL&WT{ z8GaYi&rAgFQQ!2Jh4jNMfsN{`{<4sM>?UwOOSr+HAGWciXjw={8v~p5X_(G@vXFkk zCh#Eloj6(8a3Z8f7)z9e?_t#pY-K4~7B-;??opOfWFdXIJMe_w3J&#=g|smbyrWaw zq{~A3eVM=koxBXn8PvlAx42~iZlq`8lax$_Q0m*=auHN(LhA4Yrs`6$Hn`^GpjF#c+m<(ib&p&6FiP6s!|p0u)S)A@z1J;! zfstJYE7IWoC_iYkZEBCOOPk&D3h3{$v0C15royzx#j3P_yXB+c?zQ>hBGjgCamyp1 z{bp0yv|SGMDzjhMm51EYz|BJod{nu~O>cVWVma`zTXq3sU`^K0u$f2Paty%yngqT% zQ7!tYTb2P_W)ntI7Bt?iEFO2un*rWu6UNsfJn5EC0o-j9rrU&>+~an-<$C~++Jrge zU%xV%UiP@<&(Qx7!XmzA7I@7)5|na~WrNWe|M-NfLfzs9UUy%EF3z0Zzz5r$#gxZ@ zd8G?63AtbDjMu#w5pojn8N|7Ye55820}4yAx83iq!d{d)R{_7iCMT`23%E-oQuE=P3K=kV&`nQAIKz{`1qOK7Da#lW54mSztHi{n zM6!v>*kg@h>;v~OtWwMw06b`OxP)_=bHrVaC7C&ez`fk<)9Cj?0-w0kuoY%#DWDah zn0~nNdw?{Eh%}|C;hr{x z?k1|-o;DU|0`OTjhkR2GrXB1B;t6+YbE^`TgLE?y?OtN#%ETYtpJCqS+IkqI9p@9h ze6KZtHahOD{lUdtEFLz(;$2h~=fOFBq z7okXhyANSWXVP;-vL`+Z|HplE2>--3V$XIUMIonZ_vu*6h`__Wa3-p{6-ns7;(m{F zN+eQbPGm&tG1$s5o@pBi=QOK$aWVdjMEwIisbbP4Hi6fJ z)-&;NOvZtg5Mqjf^ou|Nul}|VPNMnD)y0l&VL`rT-#$AzKA0YDA)>o9O+3DgxK zNKFX*-OWG~JsT5(tORz8jkl+o;;)7Vn(B+ujpReXp1Ba-Tz@zf_#41Js)4JKIj|UW zZJ>qT2qxuEApCBV_(y~X(w77S0sS-Vwqz_kX^Kz8)Iac=PQY91&$R&F1z2AjS57u3 z`)&1cLx7J4HkEK5%s12Ya62v{jeb!ikgTr&##6{bL~bS`Pa$@bhI^$*<86CK{>dmc z{z2bHN!WJVbl9egMeL+^>xcdngcI+9bkrvD`mBs~)-`Oene!WP4TDA*Q_l|e-n*$GoI3kUv+(0+|P0TU$Lw~X#p!6`@57Tm>hrS0M(62qpJV5zjxDlSt z1_tO`GOgRAMS!jh!y7RR1k!b9PYb>s(A{A;nOqy9ALy(0*77+(w9RMtMOp^+&Y?Q( z%BW4``+z_U`c`5tXl!5jmbikB0ta4n9jV7w9Bie^wm?q?yi`+s!M&vuy(?xtZDMvg z=v&DJ!*EFqY;j~wgl=mQm*`5Wg@+xoC$RqbB>hSy>c{Fw9C9R7GeTrasCq5E-5@Q%zH3G`S;e(ro7JAB$l$|R6FgovV;mQ#7m*)rW)j|SP0i0O)|2;Apd zg?R+E-qCdS-`rVlK1ECwUS2R8x>9QBtA(G!VRI+v4)h$sxdySR=u5uo~jDP@)@!n7~O2vV`QN?gADtP$LixbqYJJL zBm6~zMD!|TRPa33^~AsqxxNTvoPKII&`hJB-4${~5G4xiVMO+ukpbZiDQ|#*b!21* zd&uhjQf`9kv5?yGi?O$)+yVW88dxOZZ7Gid{Plc7BZ}On zU+7}h&|xWakbd?5$ws6z?@M_Xj2!*H8wz`A`F2FgpJ6Vu;Qvy-u(dj4Vi9-CPo=yV zSrpjWyhhzwE#XJy2F$)W=#X+La8=+X{3zgac`N2;hL-Rh`!RVE`wdnU@s0Ht@)U*~ zE7W7AFXc8^X2qLiZ9iocJr~yJK4xG{eI>U~vhbfnxv4DYzK^@_z}K=xC`<2j%NvEO zCm7#J*~OZ=lYw`~C+QIK@P0@crC}=|0^iG)82miFj|4uxCPzIKJS&f2lAviomI1%q z=Fm)IJrw+%&+2noZUKI8O%AVbfxqM%m^Y|=@&(}ALmWYmf2w6$7`vM?c^|+hVUQpH zXxgNJ1)l*_9fH*=lICrKvbeS9P^SCIL|h?G$Kj*O`xzBlIm>V7qqIg?McCO4kVe`> zRWW?)8m-l9j=j~hHji#M=!DduLA`a$kn1x0oLd3zGLm+%e`BWi`@WGtpQ2i28t3Ixd6yRWvvlu6x z@!=$lMG|l@rwzb<=My4X(=<5(jN&?2kyISaSpeFt{}VNmkApc|z5q6%sJi3nhJIUdOHMLvl+kC zUZ!<#YfS~;0zX9@8Wa|XC#mIHZn9;^gTd4YA61%&`DumrMi0wQ7vOz~6SiX?%oz@S zzKzwIQWOgZbIQP2bpclRU=A%Mp@TV25ls_%G~M$?(?O?bK5cp$Gr56{<%zlBjpZ6N zUU*|kNO)uU4Kn)OoQg3meP!NHzYy zNEw+iHkPxH^v?e_d87?&EVm;4*Z(IQk%q9b{1rxeU;3Zd!v9u1*jNT(?w!FS1yX`DINH}_xm1SsSdCFnovufg@jpfp&*4^`R;5Xotl!iR`D4)Ht zq@w}6vHUmiCu(v+8_WLKPV-=Y1NdQ^Lk`&+%P*XkFFyi5SCbRkSe9WgLgkb7=inRo z_^?0L#`3-)c#%poN*4eEAYy&Ny0Iyl8DST8j@;ZU_F3%?YazFTAm&0$3YMExfVBFF;}^iPp}Ts^iiW)fr9goADIx zuL>SapocI&dRNWE>N2BT1P1yhQtiva9K19M4DuC2!h;p!1spzUmf}lb_#~APOQ~Hx zIT5N$LTWEr@KQpHp!?+I0I#tL3kXvuYNLFEv3>9WlK0~BFmaYr`W0bLJ>T=AEzTa` z@7Nsr>YZgL#@DBt#rY2SX`7>(l^-E_eK{U$B-Sg#4-DbMd08)Q{JsKA75vhs1E7>J z{91FAzM=1fcni(~G$su1$19gWW8ZxkR-Aekpt)iAx0Zn8d@IqV7`_$|{nvk1-W{U= zH}fTTu;49#wuWJT79H<(AM`a)DG3MoCat{ z82$^-4g<-)2_pplXI;Qo0a_J?qtFur9ef3tEO_F(2hip)JdpZdCtp9LWY=B+v?mOo ztq-`X?;1QOe5D?Ye+uYJg1KX+F`Vjq3NBDblz#$}=;Kzo=@*~_J$z$YVMhwBY=%ps z4fAg}2YUG?XIpSzK!a>};2~6Yps&x-2r0)wT@r%0)2df3R9~Wa`baSQ`^ICr+DtWc zWr&GENPWJbU=(K2K+rd}!Ww@wL*p-tULDP{#$VxM7{!4SAN{9HIMH_(Iz!+RALWrP z`;m>nNT2*1#=oHquA`x&)T4d!EL8Q%Ep>Qos^eygmF<)9V6?MYH}c@)N*wF^4D%%q z&~)HKiE|6X)#=E0obP131?K}Q4#PnVhroDW@i@HT1YceW=xT!5y)=gNe2oBe6Wk5x z!4Pb%C(lw2lYHODSSEG>-y7m!)Dk?!cL!iLaSYH8A=olOKY<*`_wCKHOgK@|UVPXK zi*ttT6!>!BFngK|yn9VfF}Hb~)S7t?QHR+Q6Ohv^9YojnJLA_B z%x|z{I?Weaqf?11oJno8EK2_uhMX`*AU|pPMp62Ak*mWzjrGH6UJvWKd1ntRjj7G1 zG%p0nUJ^!x$9x{cCehq9R^YeR$n0a<3ZgVeO9=CKOmmX7e#bqe?GAT@Ijb9G))7u= zge5qhA*_W)m;)OUPLbxwUIKXqYx`mh3Nt&A(slFFbta`Yo1iyprUwOcn0Jk%>%+MJ zbed&ygnIIqzOAe zqD9S{kXMZPFe)e3T!0+CCjHlpKJyklQ>$$fb>W*LZXi^U_Wj!)9C5K(aXtGkbfp6ZDM9#eYPjrJ4rpcQJco#_np;@A!8!_n<7@%^g1M1b95pDe9rOd38gak1(@?=$WP;b=A+@jrQ$t{(}`U%{-1$3^3QCRtK8LQNx4G z<*kI+Da;}08@q&==VvJ&9Rt!~NCVAw8N{RiXJEH5pG2Ye2=i$muL|=b6yP;s?uFN{ z3-fdIz`eqxFM#e7=1tf{ydlg9@Ek71-i z`a+neuD9gc%R%1gZ{o4XFb70LC#3t41El)(@Wb4~q%#^Pg*iWm zr4P_5kd~v8fju^yrAOR&aw$yu?awp9T$Y9RS;Ab6A$nGrk6<(dbF^cO{wp;|n^1Nz zpB{`Yzc7!Xdd>-RG@9{uVFvo*=nsl%GWIK41=!;#Etq$rIUwBw>`!67g-ZTQnBzOK zbR8yaDA%`Tr;c}&i;K++fnogpy{dfT06&|#N6gARunoHUQ!%QHr^W-J+_Lu7_Ag`#v|4B!8z zC>;*VGp2%;XPKe{5(b;fGsaFK{VcxH>Xv8Fng^FCsrnyu>D6kU@eC>GwJZLY;i+_` z$KVEk!8^~OmqCWHp@@j;`hbehB0W93Gz`)h20d8IGvrbjqr)SHaW^P=d^HSuC7oy7 z&l-y3KQUy@1Ii5R>G6PJoSI8abrq$gp@($_r$y6{dG-GkUP{qn=r@Kzi+-L#H(3T> z^Ng+-ZiYcy1yoQ4#p#;I8i&tyH+rkXr_;XKFz7j8p0SP0(YKoOSb0$0UTy`bYiDj zFG$zj=mReEURZFMl^CyXvo~fC-8@TPn^%%o<|RlQWhM@xYf(C_lTU(K&-`it{50$L zr*(2;eOf1-s7bHc9b?949tXd^`35Zb&9@V2og4|L8=B8Fpmp-`G+HMwMea?^ugB6l zIeHkalk_8U&CI^2hvsJ12wEpsVg7DmzK(8_U{;}sEzRAqmT1Nz$AI~H7g{GT$9QgS zUXAi5ng2?lb@DQluC2N6B3dWYG4_+qQ}Cp{`6|#(=65J#XY)Afp^Nzj(5~it7$hm? zZ}2(Q{F37{<0yV&5^>&XN}N+DZ#Q!ra_nyA_NI06L>8@+&!O}8GRI;v>1{sQkJia% zsGq)O3TnQe`6xW;Z&o1RG;<*I1I#?w9BAgk|3M~wD{m*39#D4)^KG;qq))K?LYj~K z2AZpM;ynuwuujfIWni70j+(?exdjC-3dX>*RMxj&-tiTV5ykdw88}k<2UO8B_{ZM*0>Y*2ztn!Xdo?r?5^A zM`yu0IUCd6F=74)V_#rni{1yxi6(=z7YVRV{sm)L{ceSWSQ!_h0kBTq2rH1bqsbsW zf+_%WbOtl;LN#LbYd4x#znf6sSQ)3GCa^MgL)Af|FDgJg`XyJ zP}qWlo+vw%1JGj;1W+ObO&f4<6S^OyE7N%`T!|{cS~vqPVP$NG27r{Jq;X1G0w=H* zrZnTVa0?n0Ql}m)wL$qHwMW;&s<{9zVf7n=j)~Q8P%B<1KQefoya#;(Sf8PcZH6z9 z-W+iSg!QpR{yhe+jKHQ{g!7CB_mv9;J4elhDhZ z=D#uP=w`VFf5cUPB5Bh*+wJUw8LH`hi;&uLJw`^;`zb0s8_{c zftvm^-(jRP=*RF}TcM(#;^U>6wB!V99}a07;1{eXWDODR2BQLm))ZZ}-84cQHfxR9 zH6EAbpXDwn4C8fN$7&7fKeZjJH9Cu7-r{XcWbH?f)#6BsB^T(h>ST~zEAd=b8uT;k zXQ09c#X;9;sH6XpIW7Gb>WGDbbSXha}7P%90Y6O#daG3E&{h`02c*;M1rzt6cJ&oNCFnN$x>qe2wD zCVx@#4}Z^^ z1a#z+`|>T^`4axUnqx&a_n91bbLH;K<$nn!-@?D7sZZtpSA`A_RQ`01)&468{{8Qs zmc~9Te>u+oj62`KzgKf?f{lJQ_g+-YZRS?(;je^;4}TKk0{^m;`b_Q{Ao1L{^7&)9 z_bmSDDERAhxfmIo-^vqY(OujY`x7~~@Y_}-&($z`&nK-qL+)Wn+|12@<>VjxWx2%gKa)EP zN*SBEGyjh;_Wyu?3LpNumAmtUKwLpiEVz~9R!_T#?&9$TKat~nAHs^hVvu`80Rc$t z|1_uu|6a|pT|vpWu9_e1a-twZuy)t}A%TQJ|hgR7s*Er4^rW$e+%UXXiV$ThH1ix4&+ z^Up_L&vjAu+()ox_4Cm$c|g115jg1l=-e01W(Ybi{UWoGNT_+~Z83Kquh-@B^G4G-xXV(R}y;78Ioqp+D^y z+H`0K)WiWQR3_8KUN{vBF+?vso-RxpI5AobGJR9|(m9Sy;1i zo({!QJ$e3Vxe>sb+;}EkBPsrHC>A&*H>Qt()VOG7@<#G!?#R&F?BghZ=x!X_LORr0 zl>$lbD+;}wOJj$qI3N1M6N1SB@5NNiHLYW0|=!MUYJh@Mpj?gw%D2aV;62szp zAzBsvm%NB*LaqtcnLI)2T?perg=F@NnEe6H{v!$fL-% z8%eP@!6`J43g}4$FJh=VIpLGn?l7LKw6z&fW5m`<#^kHCofM_}=%kB%?A-(~?-3UH z5+OnMJqZfLeygO?+`;$QlsV#la-)4{?%<{S(>Diu-9#d*bQom9b_(#A5yWf?HBzvX zw8cR?Aa7tL9^guRIbc6<1%`-}+y#U`W*`)5`Wp^UPT~~^9O4-Le$>SWM0*aurI?H1 z$8!|L$`(GJo5-C%%nJAB?z?mP{`%oBoDq5OiQGN`+vEdz5a=hvW8(*v#eOQ>r=~rT zD;#bg@+N*xn|KwE6b`fcXT178um0IkGF0hvY}Zy9b+l~DHn^WevCG2pVQs-W{VCKh zOQ)aD9fS&VAN1YVaCodwpToJyYtv(ReM{y-*+uaDO*B4sXcEV$6Cl>?Px~WSkgW1E zNCeM3g#1-$mE3Al#MRH?`n){+1^Lw$Hv78&#<+goe?uAkqW=cwzU05L&ZB>hKl$hn zU`gb1e}3q0{LMjCj_@ycWUJph(rni@x9W`}oo=ID+b$ldb$X2`bEo#i6GtW|PEH)v z;?3sjk@Z^b$j-^*@$tzgx7yd*o$KuaDRe$lh{bbXH%iHwKN`9=DsV^=_|I+r94EX0_eU-nvpKWDC5X zTBkkeHCJKSRtFOsT^N7-*=$eL@EadI*Q*Yiop#^vHaq=6uTgCQw^4skuQ%3^O9~_p zZgd-XD7r(6fh+t51xRsR!v$Kdp#tu(Dj<%&*P83N11iEPdYxKz(COh41XjCV+o<;B zIef>1UKRMWTYPY{!F#LKezO*1IL$VjLA^}LpjKm<-e0?3*GDk^7>_kVM;swr6GWjD zwm^Td8E-cGfCw9CH?GI&@x28_TdhV9eTRXe3=oUiR#J$%m~FFzW&jDy-G825-D++Q zo@}0y0IlmacBD7CY#cWjDQ6OhN6Oy{nWp3- zmsqB)X1ggwA_Z`&BuK*DD`*$Y{EDIwzkuRqTX2g|0UpSMpE1J=}2j#@MZV?pMEl;Nt)E8t%#%`)@cL zGRohP+y86$J9gj-{^kexbH|na7r%~9z8%_f@5IzV`nSFSf!TcmnRoe;a>t`w#Ge-2RIP zw)0QF{Z|kCf);+94;{`^I~%r76-YrCC)%C3*t<7^R+pODJ~ z6Sx}t75>@(_5680n%jSKKSw6t3ZesRa{UPZj;&tV|A+g>-us7RwF4g?dq@6KZtTVU zEcS<-{@TLcA9NmJU@T2Slgb&@kKl3`do9eG}kPYN`*mb zd#`)Pup_qAjL`no%PYk*=a**UGJZwzR(q@8s2BYXI-iLzUtPIs45`x_pWR;cUMu}V zF}@UUHmcWRu!}nTTWfAM+8y@0%aA7P&FXq->Ee9lXv~oobfhJAhe1qDO%*YetI?T- zrL(1___?K-MH|Uv@o2v*1NA8#!*r)ERR)c2a|ctYbz0rc#?E-Xv$YB?WiUB;4#S!6 z;H7fgl|F_yyD+z~6ceNu<|^^I%X4#4yEBLzoi)34rh22%J9C~rv1g8^h{vNrEABUH zggf~dc`;t37W2g3I0g<1#gpS(?S6B;-Kbkj23Uow&F}b>PGRkOv)+iT6|8gPat(GV zgR87W<@sfRV7@f7RH`gT=p*i82;F$~M%?dKYmMk^xw0J3&73LC#j~>u@P#VO372Cy zsi3rYu^Fv`on6b$+Cg(%&={ASrKwu4)9(W<6>QDK2$nCP%M0~$z-W?Zmu-D92brjGNUSkXrg$fy14~< zz;fvgc*>tbNf%3Vu31zPtZ_Nu78gss?X{y=3RPB<|W2ioHZD)sl3eudSaDAa7 ztBNh23J(^JWh7d;Rw^7#a9>)iwe}d?RIl2uw@XbOVWmF_xlk|h@$y1^z1MU~)Zw21 zl1e+>p09sAA1^h!C$Li2d(~Cqxr)9k#TW;z#c<13Yt6w3ijGf_o^mcW)0 zD!{?S%1uj?(3oBfBni$TBrDvbv)$;eZGtSTy>D4#_IKx#igt)V|hV^O-^lpnVGpb?r*Ke<(RrL zcznALHc0V9I*YT~Ao*}(z0tF|0`wywJ+9CzE!CDT*0RKijL6xA`Q`Hb<%P?T40AK* zBlHX%HsMrDSx$AL*XVA75tq_S`~*hT>9wkxF=#+$QwF~KB`!B1ye6avW>IZ}gLC<9 zG-}r%LEGzt4fdp5e{N=e_W6a%q=PPSpOejgMbvIUXwZQ=3eM0^xa$-I3>mVOkSob0 zq*t?F?*kPg50nn-SkGMJgAUGhPa*jjHf1O?G+ubT2D%xS#bqOAlGxcIkv~JTB;J6O?BQ?| zoZb;YGd~}JMw-zX(n;?UL_4oH!HCMB>MRwC;*u1hH<@Rpf3j8GiH!_bI|Hcs$+W11 zaNW2R&R$QCJt zYukmw>^858XO9)v2n1#4Q^M-}1_?W&UNMxeITBq?)4TS6i6{7NwhW@3Dv+CuUS zNy)U&ME;(1Ca(g=CYY*4x>n89mZ9s!v@tm%G^+%f^pwH^dV;bd3qgcA1f*D}Y=tim z2JkC=u+*A2b#=BkyJ{d&&dlZ9ijHsMwUo-_c2Rh#R=CtAAe+z_6@hrTPy_;n(#iF* zxbIFPd$}(LC9?@PYG2ie#Xj!XF*HHpW%OrO1U^!o}F0+h$%C> zrj1|1VdaC)01A)7WmI;xT40^P&CY2xL_Rb=DT+=)ghIHgFvFOjBx}EUdjM}GZnV0C z8!{51%ewuKPvCizRG2_Tc$x#0 zhlSoq-IL^>SUpXdCFC#-t>&Ov-6Y5Cibb^6tJa`Jt<%Z4$%U9qSEN%~|6FeLTC>#5 zdd(`aT5mwOcW!V{Z>FN3u;(!Gq;Y{IG~^x?ajGRC-NAAPx*v6!3dp%?>M54R6go?b zd8`ZKPAP(h0_LuA7{+93xh0nTF&th3Fo~>QgSZ1Q40r--B{SYr3;0I<^xD=>R&jj}WMZ<^&@TJWEKsUjtVhG}oG zkja&+&qvRpM;w-%!Ci53FO9I=DxHMf6*_^YnpmD(F=lyUB2M4{5@$wA73CSyxwtAO zY0BgkcZrG_YF%i_D;0`qQUjZxoZU{BaMs%Vu;FqHLJufY-*2b)K|Tk_Ltg}Wm0F@d z>ROp8wm>yA&aR-jR+eXQb|~(e^?s&2KeKcd`s51evwH)?sr*#64<$Z#cAzN%!}V69 z1^t2DCQIT?z*;L!#n8-mN@2)P8(AC9)x$EoeZJAA+x9}W4<%RiM@j-HO5QcP1iZQK z)u%HnYM_GYgb`x7o>*dn2~|~u%_*c@y$3Q0ij46%zkoN*!Xcp^Zahx}2jxg1k5!>= zwSI&*-uDn6fwSdCYgH9cW1BOk$f;VyeiEw((8e`pPnt;aU$C|!86t48*%7TZqjFC|zBmDP(4^l*$A>lC^4kU)gUs&KJ=O1Q zZZ}k)6Fwy?yktCz$Vl*fT>T2kQVIGhKvk{7gb)_9xY07ne5Sly5f(J>>hbmFU<08Hga{&c;EhvdNTM+r(H)DVBaTVH>K2o=gCa)+ zdNHWsS8#ZNWACi>0zNQCH`5Gwq$^m>cn;>EA*paI#aqEwMfL)_0cGjsq%z)Wo}m2# zq^h(Lj&@sXx*ygwjJWl2`2(V$!~|Z=qVFMaF&@X;Rf*-q zgX((riX$}oD^dmDqur7V5OHM?r$Rum^kxw}L-4V)C4QVyGr!n)3FJ|u0&U!eBB-*W zxNr6~j3bsR&2L{K;fbUYZB`;%ebYqeFlM0zDC$)a68%f&cM3Bzegw~+$hM3~apebG zM&v#O>B&*43`Z*1KK*rsnz2Yzjl>*JU|Bed9>u={HEla#$xjPKuxg?lzyO3fDe@hU z267g6L25oqkuHzi^)Ci0^mY1V5CMc>>Gql(s8*s(agt%RChIu0K7{mT+%$>OTBQ_@ z`pZ(%sIZHJ1@1I;u%tkwQUnH^%JND-tOx2|@Q1ui7X|vG0&`pz*=9A-U(^-Lsf@TL z6W?Njcfx4}D;JK0Ril@L-msw87+*}lEQV>+zmAMpnolt~Y1CTnaot;^s)d|S5^8{ntG2C^S|9-N z<>@e~>SAQN2z3IC08<@x|0MYWOdC;j0@axVW_O_y3~XTddz~gkD5WSDojACB@YF(5 z64{_kE=~ENaWWlEm}YIeiFE{n0OK)4kf(TFNNcbt%J5X+HA{8AYp(mw)xWvr#(P1rgI23X!*f$so z9lynRVQb)_ol>*zW=o>IVch|TfbA=3tDK?@xdsmA06Z`WLMRdTqh@v2Vws8Bk}`== z@q}1^SP_A0%v*-eDg%O&u_NiZ(kEwbt~S=2ZRLFdC+e6I8;&tUQCIP73r>C?w9HXl z0H}-ki0ctL6V*jm6%!1c>~`o@s$CmpLqg+*mc+~$Y@*pPhuZd2Pl1L~q(cdmP+%g^ zM?*^|#FS@PFNhwFT_dnqujTG0&Bnk%==M}LhssI0izDHeP}I?8b` z5qVs#Iy5o5Bngp>?Xx_4@>DzrC#=g0bM8U-G8XjG7E%hJ^tRiL%}V2?sB-ztrJ3cW z@)eDP1bUp^rac^;?{1MQUn$G9RD|y00}x%6Qv+i%n!(Q`M4@(*FhlVW!;qYn;UuIc zL?~nCV`RV4k&RBPaimr49hq+o&NLAISnPFP#IX8D5DchpK6wGUsf4y0y(5dgmv3C# zL}+qLRQlQNSw<#2G?$3?#MfY6asrp+6E*7Vuz^5p44pdsC^44q45$U5;6q8ytOqsud}B;*N6F-PCo8bq08&%$1F9Y;=}H6WG_5haVTepZ-XWc5CuENRE3m$F-UC7bYSEYB$>SIZmqe4JiSJ@--JGp2Bf=hF20#yN@ouYEeBbG zL=^I`yj_r#dJP8~P0+LPL`xFzOQ;j1SDRbH{MAkq?yr`zgPfF==2lt3F4+(OB0US# zV+v}M;zb`2^=-*vAh1VNUuU?WVZp}81BK$CBY8}LNxrtrbxArPy$VO2LUGVy%CScMys88cuF~YvT)ucaD<#w3mjopo7)CT@LFPKC(Ow` z6{EP3QKsaegyA71o%o4b5>aD_L>{ziDSwLDDs~@Dn!&qQ zobj|InT|t*hRjATQw!_Wwk7x9mBZzwnfb~hvU`lp_QJ;Bg?As!x%L~t!mKG#Zif~bHV1YL!q!7MI)(nOl%qa{@%`u6#%R1+> zQ|mshpK*@b1i?a@9D%dvMJ7GrQPWhEK$Dm$v?C^0Qb_^Vg4YoYOl+_9UT3RIr+m^1 z$14W*dZ?o}lMD?qi{L($w4LnIrn4%uPH4}2;(Mf;1+MqV$CMaS2(HQMXp3 z+2KwKnUPCSY=x5)CrTmsSm1U;E6OR*OOsrD_g zb+V9|sDA@_%!nau4;bolnCoL`j9xQGrme1!0WTIx%JPy34geXfZsitfz;HGR108kh zoir|wsGg`h+cSefZw?!#I6w9H%r4-73pA6_2b_nFifGbkD+2Q@&zG0u=gP|$;ApB` zOpy<#7egRQqZqx~c~0Bz8W12Pm?P|zbb$bOWf`wY;EzbPr=MpOKB9;zgU*)8hlx4P zQjm-0IUM4Tgv9(w*rHIcVSv?}nsl597Noa~u&BvrqVw~Y$7i2-VqA7Qjz8HNY_%It zuWP0PE~~xT#?#pH_~h})@h8`j>DK0^L8#%4mU5T?a?4H^C)>r@g$nW{%>ecsQdt4M zGX?4=Q%cn^MI)Jn4WG2Rm^e{9B0k8{6>JEZH-{(?;if88ah!RA#}a1FEHGKZVO6K; zYL^&VNKyu3E0eIJJu6JSQqq*OHOP7N_1w(TB6%i~=1U-%MS3${WO_p%k-AT1Q2jcs8M9HhujSnEYhJ4LS`5X*uK z)fhE z|D7Xe4?nV`O_02OCct=DIV!*-jVl0El9Fo6!N!XXY|#7>ePZ^qYKYLb#T0}+L2EkY z`f#X`l04dH4u?~~k!8aRyxhM5WTpT~vR&&n8nI+VigA>ZueSv&xL)*sgT3qGu5~^B z0i&&9lfw22X;98a&3vF5J>Twpw#6gx4IlXKN$n!;z?G6z7B z{f(5{y|gDPu-uzs8yD4Gb;CSV>AC85x1x@kv-?5mKbo^_W-uI#*%WB|(rkc?_a zy(}h3v-z`OF{QLbF(kN`?t9IK|7)Bu^58XiJLC4S) z<1o`yGG0mAnXLGr(xo(Flm!QsZIyDTf^CJhbrOtMAO90i*y`|#I^gr2)LyB)5%Ylf2gUH&*e>HLsa$5I!-oe zrbMPD%j!gv`8TA&QkKNHLQFLhlab;zL~EKrHN(l}7^r>#Ady(?}MQHqdC zk~H9(48RvOAgppbQNO~Yj_LG1Txt`ghygwc$Sfg54CgSi#2gP4QZm@l0Z|2z1j&?F z0$AQf71QNKeF7&pK?_2^8u|kfh%s)GOq_ek}g29ImMl#0z^0#kXYir6uC;UP-47Jw@pw2w9{I=s++?C z!;c>DIcegDWMwle5N5M_EQxn<0E$`{oOVQ;KudH9GBQhMR|L5(!EIDXAmc$q;04gn znEl+~t_@fe4EPuH3pw@N_oWw;`ZX0HehCADYPjZ(B-l0g)1Df+cyj;=IQjc_qJ&Sh zP;92M)5!?7;gXsFtY`e7C0(j|tODpZB(sT0aS$7t z%rQKLp`}D=wWRRfKe0$*l7ZQ?l`Pw!XrLcDp5(bY7 z)U83lB0f-(FcES1rP6X8<35=yIAe4jwC!UtnyUQ zk5saIoL5gV;GUdxC$;TULGR+ypr7Da5vm-tjc}frQ2qD1bvH%uOnhfo}y5bk%+}b#5p`+}$dU zL`N{)Qo4~=ykgiz!{cj$EH@`IQ3L4d*5Z{o6|kU7ae+r8I8203xEpJ?p$E&|=!-$^ zWc{3?LR#YPW1!5;G3NNh+wg~nXR&y3gv6(m=HXe9DiUPUg8fisbEZ)E4HgU#D zKtWO!6IY$N-ZU+L*^jqMV?ez80f*$Xm^BnB>QTPZQ9`V0u9PL=8JLK0))3M+uP`j~ zv~)t_qS(lvOi(gIH|mt*&O);)jM7d*os!&6v||Gg%L~C8`T?-RNrnr3j`pPmz?@N= z1uBLN!dbEDeDN9*ioHcyM(PC4DliPp9-q_)Z_A9^lnfLz<7gO(l9}>OV8B$361v5{ z3y5tiZ~;COrDX2HnmDWa3AdJ{z4^1Gsx2%WDvRXL)Q1wFl6>7P62XxuSJ`cPXa(ue zcC6Hh^QllsdEQ|`f-D5IAz?#_maGM_(orN?Zcy@+n|x%*o}}uCNQ?tjQaEID&ZB8% z^2;-4aAMc&koTqrvyNU z)ht{3up1>VBOX13>!NQXv7na*JSFBLIx(QI^^SUu@ulCY4PKC2Z5a^*bl`w9Zd0M%kr(uPN*v9(NjB1<^8|HnSL!BgNVEoWuFRTSUMgX^%5Du* zV5)|k(4=!V1X%qc>Xye<1GU}UmLdR8$$ATMLOq)&N!Cg+vfZ{uhqMlaRMbV{$I@vg ziyu`pb9s3ot}K@pQ`Aq0DutUpqDM!h!YH@fIngG80UWB(zn1vy%=e+bx-BGHaDNnp zBNhOUzEBF|5>D8LU1Ap=W*h2u*=*u~ z3f8hUl?vr$r8kH}a%Q-TFkZO4JXc0E+FOA$5OYj6ZSU^+F#oZ-U@&CiuArb)pOCgZ zsjgz?iaHBPn0ByWnFq?I$T-nF6%vVHPb>16n~^Pi)Vec{sRXptmgR`>1p1b%W#?#v z=7d+1mN-M&mLkWH#zQ$~;7`;CKWYz}D?XLo9*}LGn~1Jpyr-o=?U4IonD!OjYX6O0vosJ7?AyoRFXl&I`** zmy{SrXT^u$5XWGG2vd0uy_gUHr{xNyZl7UonUm}wLgcg(L?qw=qXdBSUI9h#l~8@k z1?WI#>L#UyYvj>Jy+`+MIJ{J_irPK7E2^`dfB;9C&sSEPG;lJQ1YxKI&1X6|@6EkPZ zPvS@#yTTdH6MQK^{mEuMn&8z252>1{-)N&f{f34tcNkbf3^sES;~w^}R9V4(bvFmm zgk&pE;CKi8#v*Cr9(E@~yPRlj#6n3iC_1@9qqSPx*r_3#4=3jESRH8tNAU9eY-z)P zzgR;>^jF2p2~ZDvxA|v6`qe&G`~7GFF_RXJ^a(lg3zg}4K)GJZK~8>abroSFzr)-? z|IN^fJ!I9>ApfiUem5%dbtHIQf`0PT_N`wJ=~wv6XVV|Pau4r!2=yPzPvZ)2QL_fe z6P;LUmV;4u8W{F6iV7p?xH*C%lBVST(dBlPd}KaVoP#KE+2 z?=-HWXalb~ff~b<32H~ftORt$G?9DSLym+J3KA-zlIkH z@pBe$G)aHFo|k@cZSV`mbC4*R8&~d;dPKKSSMg|9||*3n;-0svnWBuwL{k!N0fj z|8OH+|2vPoAdh~>>W}kg>f`nNdq3`{>)-R(3-a_mk7*?zr#IpC{Q53bW|>Vh8n^o6 zR)6^UVfwq*`akLo+PBxYWgPButo-=*gH~TllfMP)|Ba+betA7F{=gpf|FzZ6zv@rw z_i+8GJ?j6Pzpu}~I>Z2m>(A~{|9LJVKDV*_n6#t&W zKc^?>iv;g({hvId^;b;}<1zUR_wVJqeUEW;`RS2cW8l^g?OHw-o!+(l4(KD((eP&s zQt_Ml>EU9`XMf~+MEd3!G$q#$vgHRNm;2fBw?r<_v*mA%Tux`p4?^xvr;FtG7$mpL z)%4A==`u4o>azEp=lIT;AnYsu*y%H*$HDEx#{vIg>3v9OOr~{Oys; zg>3mdBIozn@^?ng$Ft?{0$+Y1T_nH9Af=t}rf-f#4@AySv*iy4KAA12Ha_|piyj&+ zM9G*d2}5_sqW2D!=;c^sLV4)!STsIV;?F-kQqJ{rNAy3wJ91->a<13io~L@1i$>u; zj`BR{>OUTy#;@cvg`X_H=k3!;A%0!3^2MQY>eV@Dk1mfmZhl($my1T}fqEd@?+&%| zhCDw?SKmPSZu9yzdH%u3-}~+TejDX%fB1Fdcj5t-55G(N-6+pNv$@CCi}Ss`;5jGH z-y8jw>0jthKFZ%m;mn)6jekuBe0XHNT(@%9&$RU@`keGTO8;+2`RF?OyC{D@=Ij22 z2dtrQp!`0RyC37K$-RFj<=$KJ{TJ4b`you-i4H@U+?#(O;N5Gy59Mrsm|uM#%E$eo z)b|;Aew2@0uy(#c3{lz(N9^4~-G_-^ZHkLT}# z;WnP45C8dnDCfM~&-$9(cpBy8Klcx z1E+qpbk{3)q>mI~3vwr3-|Vbnmt!4)qCVe(ffy;@A~|T(Cyt+D8su&d;q<6>Q+=_> z4;%DuXk;L+Z?#&?TT<_?T*+>p%%kBQzdVA(&nN8lzs6%9Z6 z5EjmztCW^wr2EX3(8}4X^D~!_pO=IXG&C|>;9-IC9yh&pvbH^#;&{h>Zhv03;k8wEtY7K8X*b;nZhl}J8 zH0{|B*#nPpgPSEJMKe_^^L*o_EqP7N1rXxx&JH7@^PV(-Jmo73*tQjpxQyY@_Z#Q1 z3l97JLxARNdZ6i}X9=80PhUXp0QQba%Ruy%C7gFL=kR}epm3lqoCvcwwV%Wa;ohc`_2@owhn>GQL*@iDwPTnBi(+2RW|7%cAZ z7DSJq-9}AaoU=H9z0bo|5#$}5^sQr)We_6gh^FVtXD|RXk4+ph{|wC#F+3D9jhR9* z4H3M2F+tsx=c>J~#K(D@XaJ`XtDkJi;HPhk(IZBz=S;(jgM^~Ecv5X5zAW3F14VI& z`l37O_r!I)X8U5}2Jxj;@m|p?-=c}r!EN4gaiTaOiP=n8$j%FI1thshqH<;?q+`qV zL#2~z2ppfoxdf#}MrCnqgs_Qg4ZN8WzXrq}LF`@We3WXqZij9IO+5a9gufeZre={3 zdgFGfzg|b2K1KhS#xN1=(h*nr?rS{YGn2obId|ep1z4#Kc`A^w`o}S)Igx`C5{8%oj3S8-)Uo7Ov~sl|?13SNgjy VkV+pQLvS98kBAyUl9Z0t{QqB2X=nfd literal 0 HcmV?d00001 diff --git a/Przyklad/nbproject/Makefile-Debug.mk b/Przyklad/nbproject/Makefile-Debug.mk index 44f9777..46b33fd 100644 --- a/Przyklad/nbproject/Makefile-Debug.mk +++ b/Przyklad/nbproject/Makefile-Debug.mk @@ -42,8 +42,8 @@ OBJECTFILES= \ CFLAGS=pkg-config --cflags --libs opencv # CC Compiler Flags -CCFLAGS=`pkg-config --cflags --libs opencv` -CXXFLAGS=`pkg-config --cflags --libs opencv` +CCFLAGS=`pkg-config --cflags --libs opencv` -lX11 +CXXFLAGS=`pkg-config --cflags --libs opencv` -lX11 # Fortran Compiler Flags FFLAGS= @@ -56,16 +56,16 @@ LDLIBSOPTIONS= # Build Targets .build-conf: ${BUILD_SUBPROJECTS} - "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/modal-handpointer + "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/przyklad -${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/modal-handpointer: ${OBJECTFILES} +${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/przyklad: ${OBJECTFILES} ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM} - ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/modal-handpointer ${OBJECTFILES} ${LDLIBSOPTIONS} + ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/przyklad ${OBJECTFILES} ${LDLIBSOPTIONS} ${OBJECTDIR}/main.o: main.cpp ${MKDIR} -p ${OBJECTDIR} ${RM} $@.d - $(COMPILE.cc) -g `pkg-config --cflags --libs opencv` -MMD -MP -MF $@.d -o ${OBJECTDIR}/main.o main.cpp + $(COMPILE.cc) -g `pkg-config --cflags --libs opencv` -lX11 -MMD -MP -MF $@.d -o ${OBJECTDIR}/main.o main.cpp # Subprojects .build-subprojects: @@ -73,7 +73,7 @@ ${OBJECTDIR}/main.o: main.cpp # Clean Targets .clean-conf: ${CLEAN_SUBPROJECTS} ${RM} -r ${CND_BUILDDIR}/${CND_CONF} - ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/modal-handpointer + ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/przyklad # Subprojects .clean-subprojects: diff --git a/Przyklad/nbproject/Makefile-Release.mk b/Przyklad/nbproject/Makefile-Release.mk index 6303314..bca5ce6 100644 --- a/Przyklad/nbproject/Makefile-Release.mk +++ b/Przyklad/nbproject/Makefile-Release.mk @@ -56,11 +56,11 @@ LDLIBSOPTIONS= # Build Targets .build-conf: ${BUILD_SUBPROJECTS} - "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/modal-handpointer + "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/przyklad -${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/modal-handpointer: ${OBJECTFILES} +${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/przyklad: ${OBJECTFILES} ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM} - ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/modal-handpointer ${OBJECTFILES} ${LDLIBSOPTIONS} + ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/przyklad ${OBJECTFILES} ${LDLIBSOPTIONS} ${OBJECTDIR}/main.o: main.cpp ${MKDIR} -p ${OBJECTDIR} @@ -73,7 +73,7 @@ ${OBJECTDIR}/main.o: main.cpp # Clean Targets .clean-conf: ${CLEAN_SUBPROJECTS} ${RM} -r ${CND_BUILDDIR}/${CND_CONF} - ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/modal-handpointer + ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/przyklad # Subprojects .clean-subprojects: diff --git a/Przyklad/nbproject/Makefile-impl.mk b/Przyklad/nbproject/Makefile-impl.mk index 963d09a..adfed7d 100644 --- a/Przyklad/nbproject/Makefile-impl.mk +++ b/Przyklad/nbproject/Makefile-impl.mk @@ -24,7 +24,7 @@ CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} # Project Name -PROJECTNAME=Modal-HandPointer +PROJECTNAME=Przyklad # Active Configuration DEFAULTCONF=Debug diff --git a/Przyklad/nbproject/Makefile-variables.mk b/Przyklad/nbproject/Makefile-variables.mk index 533abee..e484060 100644 --- a/Przyklad/nbproject/Makefile-variables.mk +++ b/Przyklad/nbproject/Makefile-variables.mk @@ -9,19 +9,19 @@ CND_DISTDIR=dist # Debug configuration CND_PLATFORM_Debug=GNU-Linux-x86 CND_ARTIFACT_DIR_Debug=dist/Debug/GNU-Linux-x86 -CND_ARTIFACT_NAME_Debug=modal-handpointer -CND_ARTIFACT_PATH_Debug=dist/Debug/GNU-Linux-x86/modal-handpointer +CND_ARTIFACT_NAME_Debug=przyklad +CND_ARTIFACT_PATH_Debug=dist/Debug/GNU-Linux-x86/przyklad CND_PACKAGE_DIR_Debug=dist/Debug/GNU-Linux-x86/package -CND_PACKAGE_NAME_Debug=modal-handpointer.tar -CND_PACKAGE_PATH_Debug=dist/Debug/GNU-Linux-x86/package/modal-handpointer.tar +CND_PACKAGE_NAME_Debug=przyklad.tar +CND_PACKAGE_PATH_Debug=dist/Debug/GNU-Linux-x86/package/przyklad.tar # Release configuration CND_PLATFORM_Release=GNU-Linux-x86 CND_ARTIFACT_DIR_Release=dist/Release/GNU-Linux-x86 -CND_ARTIFACT_NAME_Release=modal-handpointer -CND_ARTIFACT_PATH_Release=dist/Release/GNU-Linux-x86/modal-handpointer +CND_ARTIFACT_NAME_Release=przyklad +CND_ARTIFACT_PATH_Release=dist/Release/GNU-Linux-x86/przyklad CND_PACKAGE_DIR_Release=dist/Release/GNU-Linux-x86/package -CND_PACKAGE_NAME_Release=modal-handpointer.tar -CND_PACKAGE_PATH_Release=dist/Release/GNU-Linux-x86/package/modal-handpointer.tar +CND_PACKAGE_NAME_Release=przyklad.tar +CND_PACKAGE_PATH_Release=dist/Release/GNU-Linux-x86/package/przyklad.tar # # include compiler specific variables # diff --git a/Przyklad/nbproject/Package-Debug.bash b/Przyklad/nbproject/Package-Debug.bash index dc5b354..6c19df5 100644 --- a/Przyklad/nbproject/Package-Debug.bash +++ b/Przyklad/nbproject/Package-Debug.bash @@ -12,9 +12,9 @@ CND_DISTDIR=dist CND_BUILDDIR=build NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging TMPDIRNAME=tmp-packaging -OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/modal-handpointer -OUTPUT_BASENAME=modal-handpointer -PACKAGE_TOP_DIR=modal-handpointer/ +OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/przyklad +OUTPUT_BASENAME=przyklad +PACKAGE_TOP_DIR=przyklad/ # Functions function checkReturnCode @@ -59,15 +59,15 @@ mkdir -p ${NBTMPDIR} # Copy files and create directories and links cd "${TOP}" -makeDirectory "${NBTMPDIR}/modal-handpointer/bin" +makeDirectory "${NBTMPDIR}/przyklad/bin" copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 # Generate tar file cd "${TOP}" -rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/modal-handpointer.tar +rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/przyklad.tar cd ${NBTMPDIR} -tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/modal-handpointer.tar * +tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/przyklad.tar * checkReturnCode # Cleanup diff --git a/Przyklad/nbproject/Package-Release.bash b/Przyklad/nbproject/Package-Release.bash index e30113a..58f473b 100644 --- a/Przyklad/nbproject/Package-Release.bash +++ b/Przyklad/nbproject/Package-Release.bash @@ -12,9 +12,9 @@ CND_DISTDIR=dist CND_BUILDDIR=build NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging TMPDIRNAME=tmp-packaging -OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/modal-handpointer -OUTPUT_BASENAME=modal-handpointer -PACKAGE_TOP_DIR=modal-handpointer/ +OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/przyklad +OUTPUT_BASENAME=przyklad +PACKAGE_TOP_DIR=przyklad/ # Functions function checkReturnCode @@ -59,15 +59,15 @@ mkdir -p ${NBTMPDIR} # Copy files and create directories and links cd "${TOP}" -makeDirectory "${NBTMPDIR}/modal-handpointer/bin" +makeDirectory "${NBTMPDIR}/przyklad/bin" copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 # Generate tar file cd "${TOP}" -rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/modal-handpointer.tar +rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/przyklad.tar cd ${NBTMPDIR} -tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/modal-handpointer.tar * +tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/przyklad.tar * checkReturnCode # Cleanup diff --git a/Przyklad/nbproject/configurations.xml b/Przyklad/nbproject/configurations.xml index 18aabcd..fdc82b7 100644 --- a/Przyklad/nbproject/configurations.xml +++ b/Przyklad/nbproject/configurations.xml @@ -41,7 +41,7 @@ pkg-config --cflags --libs opencv - `pkg-config --cflags --libs opencv` + `pkg-config --cflags --libs opencv` -lX11 diff --git a/Przyklad/main.cpp b/Przyklad/src/HandPointer/HandPointer.cpp.cpp similarity index 100% rename from Przyklad/main.cpp rename to Przyklad/src/HandPointer/HandPointer.cpp.cpp diff --git a/mariusz/.dep.inc b/mariusz/.dep.inc new file mode 100644 index 0000000..4560e55 --- /dev/null +++ b/mariusz/.dep.inc @@ -0,0 +1,5 @@ +# This code depends on make tool being used +DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES})) +ifneq (${DEPFILES},) +include ${DEPFILES} +endif diff --git a/mariusz/Makefile b/mariusz/Makefile new file mode 100644 index 0000000..05de621 --- /dev/null +++ b/mariusz/Makefile @@ -0,0 +1,128 @@ +# +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: +# +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target +# +# Targets beginning with '.' are not intended to be called on their own. +# +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. +# +# Available make variables: +# +# CND_BASEDIR base directory for relative paths +# CND_DISTDIR default top distribution directory (build artifacts) +# CND_BUILDDIR default top build directory (object files, ...) +# CONF name of current configuration +# CND_PLATFORM_${CONF} platform name (current configuration) +# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) +# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) +# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) +# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) +# CND_PACKAGE_NAME_${CONF} name of package (current configuration) +# CND_PACKAGE_PATH_${CONF} path to package (current configuration) +# +# NOCDDL + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin + + +# build +build: .build-post + +.build-pre: +# Add your pre 'build' code here... + +.build-post: .build-impl +# Add your post 'build' code here... + + +# clean +clean: .clean-post + +.clean-pre: +# Add your pre 'clean' code here... + +.clean-post: .clean-impl +# Add your post 'clean' code here... + + +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# build tests +build-tests: .build-tests-post + +.build-tests-pre: +# Add your pre 'build-tests' code here... + +.build-tests-post: .build-tests-impl +# Add your post 'build-tests' code here... + + +# run tests +test: .test-post + +.test-pre: build-tests +# Add your pre 'test' code here... + +.test-post: .test-impl +# Add your post 'test' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk + +# include project make variables +include nbproject/Makefile-variables.mk diff --git a/mariusz/build/Debug/GNU-Linux-x86/Mouse.o.d b/mariusz/build/Debug/GNU-Linux-x86/Mouse.o.d new file mode 100644 index 0000000..2b0e22d --- /dev/null +++ b/mariusz/build/Debug/GNU-Linux-x86/Mouse.o.d @@ -0,0 +1,3 @@ +build/Debug/GNU-Linux-x86/Mouse.o: Mouse.cpp Mouse.hpp + +Mouse.hpp: diff --git a/mariusz/build/Debug/GNU-Linux-x86/main.o.d b/mariusz/build/Debug/GNU-Linux-x86/main.o.d new file mode 100644 index 0000000..fd85132 --- /dev/null +++ b/mariusz/build/Debug/GNU-Linux-x86/main.o.d @@ -0,0 +1 @@ +build/Debug/GNU-Linux-x86/main.o: main.cpp diff --git a/mariusz/build/Debug/GNU-Linux-x86/src/HandPointer/HandPointer.cpp.o.d b/mariusz/build/Debug/GNU-Linux-x86/src/HandPointer/HandPointer.cpp.o.d new file mode 100644 index 0000000..dbdb541 --- /dev/null +++ b/mariusz/build/Debug/GNU-Linux-x86/src/HandPointer/HandPointer.cpp.o.d @@ -0,0 +1,4 @@ +build/Debug/GNU-Linux-x86/src/HandPointer/HandPointer.cpp.o: \ + src/HandPointer/HandPointer.cpp.cpp src/HandPointer/Mouse.hpp + +src/HandPointer/Mouse.hpp: diff --git a/mariusz/build/Debug/GNU-Linux-x86/src/HandPointer/HandPointer.o.d b/mariusz/build/Debug/GNU-Linux-x86/src/HandPointer/HandPointer.o.d new file mode 100644 index 0000000..901bb98 --- /dev/null +++ b/mariusz/build/Debug/GNU-Linux-x86/src/HandPointer/HandPointer.o.d @@ -0,0 +1,7 @@ +build/Debug/GNU-Linux-x86/src/HandPointer/HandPointer.o: \ + src/HandPointer/HandPointer.cpp include/cvBlob/cvblob.h \ + src/HandPointer/Mouse.hpp + +include/cvBlob/cvblob.h: + +src/HandPointer/Mouse.hpp: diff --git a/mariusz/build/Debug/GNU-Linux-x86/src/HandPointer/Mouse.o.d b/mariusz/build/Debug/GNU-Linux-x86/src/HandPointer/Mouse.o.d new file mode 100644 index 0000000..e51be53 --- /dev/null +++ b/mariusz/build/Debug/GNU-Linux-x86/src/HandPointer/Mouse.o.d @@ -0,0 +1,4 @@ +build/Debug/GNU-Linux-x86/src/HandPointer/Mouse.o: \ + src/HandPointer/Mouse.cpp src/HandPointer/Mouse.hpp + +src/HandPointer/Mouse.hpp: diff --git a/mariusz/dist/Debug/GNU-Linux-x86/mariusz b/mariusz/dist/Debug/GNU-Linux-x86/mariusz new file mode 100755 index 0000000000000000000000000000000000000000..3409dcc5adedac1a3982f3186249793bcd9a4026 GIT binary patch literal 218003 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
jr9=v6tLM&|!nPLoE`7^5tqnCcpf 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 VwUab47#SIJ1Wz865}$6x`yXwt&wc;^ literal 0 HcmV?d00001 diff --git a/mariusz/dist/Debug/GNU-Linux-x86/przyklad b/mariusz/dist/Debug/GNU-Linux-x86/przyklad new file mode 100755 index 0000000000000000000000000000000000000000..88763c54b20b28337f4f26882442084934afb481 GIT binary patch literal 218003 zcmeFac|cV4_dk5!cZOjybYK8MF-1kiCB=Os1rZ(GB6m$iHWfobz%?z)B?(b8E!)h> z%B((FnVFe;YMaq!W>!>|;8Lh%W+uPaIq&zqb3w-6=Xt*0=f7v_&bjBjUgx~`>dP4ZjQw*RZMPG50aH_eIfW?B=?0o{*ngb)^2Meb3d4e4Z5 z(`=A-I@gs!kCP`#HjtWTNF#?NDLwBePMu1*b%<0AscDgHAV12hmdq;TM0uj*Xccsi z89b74${zVeD!)j@H{?Vr2tI~1%133Rqk$@413eBJ>2V~qzWnW#Tolqs zXzTXk^K~X?ZcjS>#qV`u>y92cC+V(j(TQITnlLx#vjz1>4}^P-pO(m^y9T5?Dyt?t z)oV@m&FB|3+1ny^WDW5r`iNiOM}880q?_s^-8DY!4Sd9T5e-mN{s;KTe^(#*obDst z6+YrW;iDdE`G~*62S3*bzrK(BPx4U@oqX6I@KLV)KGMzikCM) zbD3X9%jjO!elOxvc^9^j_TJ#pXP~N|$ZF|+tLk%NHTx(PXOD{WoD8FRe8ktVj^*TL zPEVhelAen5jv2g$we6&(449QNG;?xRenDnlLUw9?erCRwk~Dm9N=9a$G7le|kexF< zb9ic6cBYn+GI?6g^pyO9)VzX}6iKa_m^D4CKuehfVNE?}dO==RnvuFCTRC}|*IOrL zrWVZ1%gpa!=GW^nDLZxg^y^(F=gz#|I3;WHl*u!*t_QNFP0r2BNxvS*&YYZ@KKFY2 zwCw9`({rXz%FC=F`#EV-GcpS@(+jTm$w{vvQ0|nRf}HEQ`2|@8=~J?%Pp$!)nVXr1 z3c4OCsKGWXDNq&Hpl^r7Sr)Zx zUS@V?YJR3^>^3Pizn~v#B{A8`>)YOBP?YvD8JVfs**WQ{1zy+o9Y#_<6H;@j?GxH3 zW>G=|k#JR{TUP$<=+l`QX2|yKr>9QK%ovq5JtJp!;?RM^^4aw|&%FG^p+knHP!1Bc z^jQgc=w_Ko(^4mALhGMdFf3~xok{!fywvo&(o*wOY1?;5xqW6q?#zPtyu8%8$elNm ztey7lQtcOP^JckdvL0_g_0^p#(|Oho(-S zoH-1qeY3JrNSq|*Q&rU^Yg+yk)etolSFyUzPR%M9m^s%hYWuDknfV2IIdkK) zvt?7}dt10l-!OX9u!3$WL(@_U(A|=z4lC%Co0^rEG;nJ2kdElOT@q$dX%Z8Mp}VCF zLqAO~XrEt@G^}$9Or5eb^YfFYCJswwLt?j-!6}(})RU9J?`VWgnT|?h24=wAf+?u0 zjFh`F=cc4{-_b@>PwbnOpPQXJR~tPvC#OK>TpKMD2p$3@-mr1m5AbJ<>Z5$ zpV=u1v#wb!`P?w+7zn9J>4{9G6IdzU@R37MAqX}nH7#padrCE(R)Ca(xw)AsS<@%w zz=hLF!%8q6D+gvFS^(zENx`g>pEDgxNx|HdSuqGUefBgnz9pCFOord}`BeGH$i@_b zYM5qDIFr-UQ+WDnuceHbJ{!XsYgGQsX_-75sfyy9p>ximWhRBDDYYt1OU;^2MAb}0 zM-DU5kyAlTLjig9f@yk&)_+h^pM;bSZ9BB>to2VwNa+YJ+eVMZc_%Gl^yv6LNh$5y zc9csj7FfQb!$zux4_UFLv3zv%5*|xAfBfKoy*JrxxR%s$$p7fd(!u9CBXpff$OY^b z=(;l!$ISX!H_;V%eY$wWhwu-s!~Lq@uUPQp=5ueR95*-pb?pgcl;YE;pyg^@3fr`{ zykF9^FJ8L~sIK);{Ds3NG7llKtMPt}eH)dzgV(HWP<(Qy@)(~@7CY6j@!4XrTkCAQ z#cr+dJr+CV$@m<$*j3gUDzVs&YkmTbS?s7_^HXZEtF0tsWfnUs)cjOf>;a}#(=J== z)_T*1Ph=M5v5tlBwAfu1d!WT0Xt9S|>_HZLq{SX~t+`eCAl}5rz?Rp~Y_8 zTO)Xx#eR#0zsh27XtA%e*c(~w8!Yxni+z*D-q>Q_VzD=|*tc8k-7WS#7JE~R{jkLz zWwDo7?9D9pV-|Z0i@nrhkG9y$EcTWbdxgc`%3{B4vA4F^HFf<){lAUH?zGr%wb%nK zcDmPOe8MgEc7_o$(qfOX*gcERIz2^x#kWOjo+Wz<{K~!n=vj2Yx!*#}PC$rv)begKl<5+J(I!#gKF|5}o zou;PpNY>q?)09*m$a*c(X(}q$Sl3CXDX6^S8Vt>@#6qX3r@WN)3#8MOQ(nUQY0_y* zDc{5TPo&dSQoe=t7}gakxoOnyoB|sq|?wX-@|$u=`=LUx3E5zbQ+T78(1GoIt|70Rjdyny*cR% zS?@zS4axFc)_agnL$Q1!>m5j^Ay}TwdMnat=#|H@-h^}-a^*3s*C(BZT6rYvZqjLp zl?Sq3i*y=VPEsk{_=`*TT!pH1)-{^VJ7vLbnS(xE*QaR*M!tM?4;ge~jNvP-UsB z(L%CqC(YpRy=(*DQ@GEw_jGTMDDixDc_y595Ye;b^MXIddkPOq|DTlq!rOjCezloF zBj8zf4>B_Tpx+Ug#KrxTAJ3xOBD;W4(9q06$cWwH$;e&dFO?M#VM>7ywJG5nFhUL{{w`o@ z2P&EFAX&VY)#4@8d3LSpjv54Xlp$%OsgP{XdTpdWCsiZZR;l(T0rXEwws?;xQ#llswF`cuAnD zh-R2N;hn40x=^>%%|cIcG24pQQZ;)Dk9Z2dt}H29I|sy~CG+uJcobP%jG1`{WqTJ* z*_7DFA_}Ui{HMU;4&0z$8ZzgOz_tXFDH1zQlafg zHsSveydCfj+6?_pw&apHZpoumqXn0_Ln>gR7Z^wtSzOH2;w1!dJ8%a$R91{~AYLH# zmf|G~y>3xe;%)E(|1j_tQ;U}n@DAEW+d(rtW#r|*5UOZxBt2>=#8b!xegZ&|-)&~3 zc4nl;-bl0}8j%8IBw9ofi4Ya(4g!islyY{9iaDvmK~a&OqT(`6Z%|Y;&MVY;49+jB z^KLljfQ123IF06@gQBogE2hQUgD`_#|>rW83BUOB|;y~rusrWteknK-9LQmn6buhr4 zWm#_uU%Xawm&AFiJP!LkPP1qx(q$x`qjPOgf+18~iIDmWHk2yoq*jnxxFnY%Vl=Q= zQbK)9b`A&Pud?uugJ1p><*-=M4wXf69^#zHZCv;TSDQVBi3cpOu)vWL-m`GQ?^?kq z^xVWfMN4Sn#3?Fk!d}FvoffX4Q;)%Un-ZcNkh7|l(%(xtjHGDolI<{{uBM%dM~PO+ z5=pUSp|{35VX{S0* zxuRAhC684sn6R1)=JOI_UkRz2{`e0LL1YRsjd^Cod!))K1N{^|8hI>5nzZ+~=J6zF zWi6S3(#~HcP{au&?xN`TGHJvvPjTWFbG@x4v&Js4E4NP44eFt?W9%kFoRvl9bO7Ck z9POs%uIynrEKA(&+LgF_(dE>cb-Atmxl^9;+fI~aiNCK}xL|kMOy{byx4=H*S3VNc z=evNYU-8t7ko3v~RGw0yek)aDHE)1%0+dG@(2Gag`>gysp$g%P@ zNZo_ARBmF3=RhgWU~fq_V~65~t-QNQrTqs{zoncisn{Us7k~!OXpQ&_TpFq= zwA6Vh_Z^^Z?45E?jVts(?6eDKUS71|s+ig0z6F?lv6FAOdncCnvM=DhBZd}wQg_qy z(z4rO`+zs(yND_~;uiFMW0!umaAsLi;@QH)ilW4_!o)v3MTr$EwZa9LFSvpdEATbA z3|}Kk@iqP!X4T8Y@)YXow9Hf32MZFLOL2|`iOS_|P$eF}&+^eWgB)3E8K9zm=EROFw(rHmLr&XAY+>*wkFxgI; z=TIEq4dL^mo#lBqIv>A(6C{1 zJ&X3lsY%2}qlvs0?eS2f*EV#V-->4XpoS=bcq_yiiSuw}FWQ&v>0VMGb5jH(NQ)|J z_AiQ~N-Ma9(}l7F=~Py@_69DxB4+yYM1=W>%7AMj**J*y=WpnavV8yV>!~O%jvB_S zDXul6j8sdqcc8XLpnnA#by&Ur3RO9kz$NP*r^g74!GkN{>*^jwSd4__V5rh6KrZ`4 z)?tX(?6b)yvi-k6h9L{+#|z3(rx-tn$|7hMFWe_pUU#2I7z2F`O?0L{&1Q>A z7=32Z*+?#{npHeSx#6gx3Qv)T`UWJAI7rkacP~t2f#Xr(G@}KMz{vAugkc25oc6wsnQ zDAb{{?=11Hvk0IPYnxIH$Zk}W9FC0(Mh^F%Z)J;BRIMw?q?yReeEmA6cg{j;e^^ti zg2bYmnDr#{Q8=^oOcDxNN=0aXT{kMBeyh;>jG{i}r4ibI^BqcNu4V*Tw4hX*xkaU6 z%mY{}YN$D+*Uy@tDmh(YMQX_D9L|e%_*rwB&FFPGolNHcE~oLsX^c^pP)vD^MHTdr zku0{XJhFK^T`1#n6`rH>C410Wum@kfN6wvyaj4ALiK!XEfl-uHc)+OKdbAD1#Td{* zxECp}0^Z={Y%(ca^H4PJoKnWYVL4QGj&_ZOCb6_CakrQFy-7p?c(p{{lB284RSRiE z(I)Ls+3#gMR|Vb~Kh82bP=%&eb|~>G!fR*3&@IYvSJ9Jxm=_~Yq5Z=}iB|>oKDK*) zHu)Hhyrb~7W?*TsaH+8t?FqlmV)Q4YhhYdRPPLKer1B!lp*XsGC0qYcT%hHg*EFJF zM-geU)0!>$s0Z4!8{-mbR?80->;D9k=jrbP#$eXJx`+2em)_D>P!f4A(lYb^UqlwEJx z>HSfo?EAPRRm%PgnJi^jJ;Ce+k>)ysC4;&qH?gecFF4%)xMH?>=UJm4nll}>dpEP) z3r8HT)^xKd3s}RDE6Uwr3_>S&54GEC#R_`fvrNRiz$HLG;Th*Ko|a+4j-5jkCL#s& zE_mE8LzkSnr&^l21WG{!c|HXFOrQLW^y|s=5rWf)^ro+pK~G;$qPdpL zmMcivnU0vc${PM+&Mgn0q|-xXcmE7&7LPl&9aqt1Hli*%(9P)G*VVC_pfQtR@FLJy zTpXLLTb0!$%O^t5IjgQ#zGe#JVxSOUhi-z~4a{HAr;C~qE8^j%&;|L5iH z;*Da=|6DUw_J19jWVBRdm8HFyFAy=DxQW6j%krAFRPGK7X`s*wQRB){wE(y@u5mdq zcb=9OMNl6tioT=;V*=YZGsI2afX5Y7RtM(G`XleFl_r@{zm0Dv` zijrS_O*=*z$fDKKn9$UYxEbFlqBRb;2Fx{XFWraY+siP^buO8liG@J?B#vf9Il0$R zYi6!x=}?D!-*6YI3t2c+*4JA`>-C0NTL*VjE0)#!o#vmto+Td?xY4?phG_~$1mP*X z!)dH|*GE9zA1b5A&z_!%6|U9T=i%jxqu+C(&=w^gv4@`Q?k%+w@e=?>ENZvyBjm?# z{QgNsUo^{si{ii@aT@K{w6gs&B$Dfce4+Oh#W~G~p^hIoJpyIdlvhwp+JQL)#o&eF z9&Z~iIvYbhr*P&Ug=$OMRf%;dXr@-k0U z$`;j1Y0OKqJk{q%9!gwN-YMedhI!j!2nVX^ZUEi(;A%i}(af6UYJ{ea9~EC%89y?q z@KXGUq{6S_hYu=lcDZgO9=R9as)a>r!v?kdrTw>_z5m*@e|@x_D`DB*5F@6yHO-!?B@to zzvz8P>nDfbyw=k2g6B}Jzt%?^I$Y~BT46MHy2~JA zAlu+(S2AQj$Xv*KAXg#1b&y*i-+&Cq6Q7SEyFva6IT}*K6fg&}KIA&c0?0j(DKPO=At1dLV6(gLDCycWsu7t?YQ^539>olVMq^T8Dtuy6OUt-LqBM8F%aGBKwXl!zKsLdx@Lb3k$W@RNA-6!z zgDinu4p{-Y9x@OQGq*s-K<$Z$NrD}!tf=|n$Y2N?tTEMzj|E0DR6C6KEi-B=2@Ku&-xfh>TG z!MHd9nGD(Y8u*YCAXh;yhui|W9kK*68gpVey_tp&9u)CM%p0nSIe{V~z~8w__y>}m zUKR`gwz9I7r0{pmeDn>)Km2uNWhBPFRwuAuo$vv!n`b*0YQ5|CY}GNU2?d~-eQ``V zRar^rT6~?rrFueb$0#HWm24Sw03Qlz;`(4F5WX14BfwD1D;&GtbpvmM)D9IU=UI)i{OzX4A7BbVL)Uk-es51jJ&F^+k_ z$3ogC5Ao(Ragj|=_SVOji1Uh%I5gh=0RDmxoYLup{<6VHC*OBEv3AVG;EjimS!eoa zv%baw4@AFCtAdX=@%g}q0&ix;Cwj~AB=FI|ea$O7fe#1X#Og1@^Sp5a_(YJ6 z&E=JqShBtSD9PJS8-cF_9%IGt^5O@8ZvyUXemx2NS>V3v$&NkVnj7Fzz?a?t?+bj+ z4e$)$Q-P;i^RLT}$mIwA3UEw6-ts4U%eN8uBR7bD0QfQ=IJLt`;PZfISBZ}~BTc43 zX39qZ7VKT%`O0S-TF_7X&gUTDr+wsu;%5Ut;RC09E(d<(zsToS@Z89Uum18SaLQ*c zgm+$&9ftDp2k>OzHT4I|Mrolalj`4 z_c{K7kG=u^B=Dg(z;^;41Uw#TndO}C?KdZYPY2$~isyLotHAHSLHq{jkn@52s^?hX zQ*VHe15V{@WlcZRoBn*@X*Wp!N#Nsv`zqf~;P(LcRlXCzSKlE1Rp85k`zl`pT>H$s z0Uir{3h-7w$~O*p9`I&X+_JvS2R;Y*2rI4@a_T=%0)G{_ul}_Y_|rGQPXMR#qnO_Q zVVPI10>4rFHVBaIOMgUS_OCJC_KO8h<@XhT9B}HtzSigYz=z+!|4HDzfcr{+C-B%C z_@4mY{08Y?1s)B&ruL_KpaHHy>jIx)EkEtGCd)b?GqqD+@Fw0M9~r<0+yGw;yc2Lr z)2wH?%**Q^;N5`x8V3h}j|D!^>aX|XOj7<%0$&Q8ul0=Um)pJVXh#K%#Qyg-tN$D? z9tAufc&HV(>^J)Yr*@cP#r1SE{S4rXflsc2%f*NCw;1@xzwZf@wPM?+whuzI3WwjSU~PrJ z--=-EMSnk7_W1if9;}u6`>hMsUUQP=Z>QhJU~O?Nzh{HB^|j6lm|hI<-q%3#&{SCn7_d~Gusmt%9VC{Q8zv_wvx+T!>tq|?AK)>}N+NnUl;t=g3 zpRWkI4d{^?(T1_vn zrvF<_4^e|%nYDJ+^q$pp`V9j582o3km$d5i8wOULe)GVp({Ciu2TK!wjNfg-6wV*x zcbRyuBn$q+k3JFn?fv}&-gCkhsBoHR=|fv%`uusVGKb_uJr3XA-(EcIl)B1>c377> zukqj|;#z_}*gEhhTuELV)Hw-U`tfJku!$^KF=act_MWIrWG zDmh8XSxPQd@)0FpP;#4+2bDakseWk*Cw20%g zM5R~%fwt;Dw3ZPq`NjltkJ7s-|7}XIuk?~?`sr%Ay`_w2@EcasyH(SNDxE5qKCe{6 z4_4DltMPlZieo>%>4>v+N>5`e9!@H~nbIR$$MKm_|FKGMqVNeyZ>;o%N;k^$xYAoH z{6IDRw`zQ6n>c0~{?&gVaH+zL_Fh+w|3)?aW2I-P^kZ(7@eThzN~fD_^cmYWj%6MG z#s!+vjfr!e(v9|iL+M7m1J(4S)%3Dz`W2<8s`SRSlj+w|`Xr?r@#j?2A5?m_;$Kp_ z5pQ%%)p%)2H{umk)0ZmUh<8EhMtx}QWjww)gfw%NZp6D^>2&jlK3{f-V`<>OD&1&b zt)s*Zy?!;llhWfk3LdO0y_3>6SK}X0x{=?{tLddmZ>9Web*h?vl+um#CMn%W@9}E< ztx7l2+gD95QM!@d6{VZwtFughgv!rMr5pA2KsEhwr5pWYqtcD^-%vVV^dn|THU4p> z8{_wCHQdof=Ev}lQo4~|TcsQR$x1iUpP=*^syrpt{Et`DPbxi1@ts{|`bPZ^Q2IcH zKce&yrB@eiV9>SCTL`sPdqwekss315y(Q$^2e$U^Gmsq}e9lwtiodqYm-48$i24BBf z0|9K94PZHqB7H+2oEFom9}(&AX&v;16rBFE%JBoyPN(w~7;M6E0kLm#)=8V6iuX%k zs`YAPJX=mDKkeqc%xPMk3{Fhb7l2VG^G(=q3am4A$aC1cq6#GcE=o-Cv+3Na>9>PX zXWGw_Kg;tr?wOeU*>tM-bLiYj<(NU`NCL6W++eaflkpuu$vd5Q(kbQHkG^uDagp#- zXHNeFl&p3~)ODR-^hNAgi0?Y&NS7Zj^9ymFgCWpnxA&h*)ovfy7xmStHtJ?`Ptf%` zf8z8%$v6$FvjI3=LaQCw*P>wOJf%|9lHgTMlNO$p8C?{Bna^Jol z%J-~9yQ3N+(H~f86P%ZmrHN9}2OFXocN*SK6h8_Nly2_EL*et2*oe}^x!=VA6hDh$ zKs@fhjzT%f0g~N0*fEJy;sww~yVtgZQpU(ccR?#eD;Hznli^-H0LW=p3fx0cZ{iI5 zEYpGtgHbGTk@FCoPWkzhBWUhpUxRmv6}x+SB$U5camoT+W+gxt=x7esS9WiO#8^Ff2B;WnbUU!Q2#v{0v5uG2gEb#n{y zG*QgPy7`(|p-%!_7g=4Y&m??OwkB5TchhM`nkF97vw>@&cJYW_0b|&~2B?cibxJ3U z>wg`e6XQvpekD2Vx%-iyrzC@$YrSN+&-8%nVx>%b7OW+#*xmKdLs`ZdaJm=7f>y`~ zI?R3`tMwH~Iy{^T5E)L{h(b}{-~x|AMx4%OHnXJNZB$aKi5@nt3Dizc8`X|h-zj?A=*=$oQ^S!&oQ?axn~M<7 zid~bXYp0;}mf*!mNS3Yx2UVr($cQRktZg|$hX-e5P18gIXE;*xqwL;}ymKoz!nj6( zM565;n4Qjz$W+k5APix#)%G-4!E-dRO{N_@R}*iml)3u1v*MJU>m61CwA$n?-nFH| zIp|vqszC9RtrUtZ$4ME>tx;z`rJ{A*4W-ORb?ww@lan}Ydzk{9X@q4#T(JdW2vJt9 zN_Wc2ztUN&O&n2aJ4^g0Ft0g9ZF`*JyX@3sHR1>Isa>m09O1Up!``5sSfv6*qCHpf z``alK%=hpq@xXb3Tf;5OH3heXAXYq3KS!h3I z`rI#bB`a=`kuTzjC3bpoFQ_1z%JG^#0JjC)Zxi+UbFB&@C&` ziNyhXNB9KKO2u$H$mbZ@RHy`)jgd`Mao8RXQ_!hF0#$Iugu5T5PX7=4M7kfsvL>#wLW6Jt7*1y)zH3uD;+mb#gPPw&g>?DRqgR>RAU;>Q zb+h7>RTj)M8U{lgaudo*h#dEI{f5Fn90~l($-Ia9sZF6pxF1=961L$^k?7zT4V(Le zYXCa2KL+ZLrh@6^F;bk81PDuM2YuswzkA>r-?k;s5lBHhQIF#|-q7c^lc3w^GQ zdwxGwC~GmnJfU>re0FnRe9-iXbAKrlZHv$z_nuoBpzBR7Rt083^Qbp63#d z#(8ZjmFVIp?LFWU^e|TGIB|z#9~4=%VU8?hMhni*oS}(fj(z}~?l-2uahQWr36wb- z=HME1ufm)Ngp^2G0I5W~mp#M?MT>DibhAn8rq!lY#R$hBgsc7WAe?{TIF9oWIuA;E zjfUhghd(y3?rd6AkMp@|;cp$a0Z@M&fktyWf1n`bBffLcc~EWy`PcUE4_a_`=5$TC z{Ij@7T&02jFF?VtCZ2HnHv+Bp%514Rq}H*r#T zk|v`4X)MuX-jbu%#m^sWq7|oBm+P#xKh;^?X{qS-Z8(4yT#!0h6HR3{+^feSu_*r; zs1m2_j<@>HKzLf1hd~CdIF6PTy_g|8Uz~E~&KJ*$UH1MyDh`j;1Xcpw57Wk`uRm2# zxZ70=y(-av5t55^$6W=|&wnG7X!lbz;`;mVg%acTG=<{vzX+w9`^0J}N&bxj&^wT; zACartR3)OFe+Hf3MpIQM|CJy+oon&UdqIlIdqJ&s7;Q^B`_s#{PUkj!M^GxRJ26LV zwR1`VcJcp&!7uP#hnAgFMBuM;ID^{}RHM^58%piFXk>Ktuf)02>4#iJP}U@yN-1}s z!N{6cJLnxm@9y6k1gEn-zBzgv@oAr`HNbB;Yb~_nMVfX?Gu0?%&E{(FZIRf6rnmt&|O2g-ux$b!V|+IE$4zELJ_qV)afI>%L?0 zcsYwF{$cTC#Pby8sU9rWk72PPhs86GvpC$xPvA?Sz^$E7I(_RO=wfftwL|2V`9PiH_F-GzxDNtrqRFu_sIHVY zu!tt#Y`}T?D8vy>zM%7r@pRsF>uj9Q5QQME#1S?)qCC`{#p>ZK9?oI0rijJb z7g;>=9*ajmV6pCZ7LSE&CillXvv^`GizjEYSYO0q!z(PFIn3hOpIL0Y>1FbJu_cSm zLs+~royC6&S!~(J;`IY8-uRxyo0nN^b-zOHZ?$2utsjfG9j}scdjl5l^klJPEQ@#N zve>zi#e2J1>@H=o_a7GfBK||}`+KrDa3_oR=dn1rip8NVEDo2j_@IKthk=+H8wP#U zg2l(ZSbQ>$#gV&NeEJxRlI;-9gPh_7%bUbsENh9dEt=NiH*|a9E|10LPH%j$ z()3_lV!O{~;WYYQY(?A`8lTg&*IgKEUE$@r4PRQoeb8HCIdNZFc&pHg&^5jw27!{% zGP^)?UpY4ge<1;|qAJ)b=yRlTZKYjklumFUyb{Qjzo^G*txq9$Ze1LI7t1INw;CL+ zb&3bMa)|D0umOV89R}heo=m;NNO z2Hc_<{w$B&-!nO!7S)2*x&_r;UC|sf4H>>B&g~#;0n4Gb4y5{QAogHSPWmN+xe{AH zjVa0wsYzlDn@3)}Ff9A~-_=#p8(Imd2^(KD8ICVklpVYV8OQaf?F0QQP6{ zqJb`lyT+49$lMX|5;4ub0r3{`CWs<{qPc&35thbcJkGTyf7TOP$Q(*Q&Nm@Swn+O!kKwe>PjKqcrvd!mN<{6JKTv?fk<>!L4(7l{}QrPe2yr-jT)fV;ze1<`QZzuXNCPw*hwLpThuK=^icTON6i0Di zs0gHo45HSZ=Y-9|*-TCfJ^qYBif;+=1}NK2T2C^EzAg^K@`YiQ1FtDVFNvRF{>_Ar zzK-ll=xuQg=HM_RZvUAq~FY#nY}$?2?T4pp2e;O$Hf_rKVbcaYY2{WkOu>TtpXe2Br(Bs@hA!_^@5 zH!&H|G=h0TxsCqek&s+{dsjK)#Zo}aO>YU`t?R!l@8uyRxz{_WK63tu{`SYXsv%gfhZPKmoK#{Nep>%)yYg-fs0G2C z^H{p081j++8|s*vM#KT?=Y?s@6!MwAyG+g?A_Y*U7rqkm|O0dsEw5>~qB}z?vGk7JC}`3TbW2$Fxh+o`?n1hhSMX zJFs4d^ssFT720=HHFpAR1^ys$%u;H%r50!*6K%g@w&pO; z0)Dk>7^dXghG7rGQQik!QZ-6!?Rm(}M%zbYR3|P6{)fqtgMm4(+QzR@oZ9HF;W%V& z}-q3db__#4@|3 z7;r!^7y%qkpfF*%?vcEv09 z3NY83Y)dgY>=gUMkE^8L25Davq87`XIrgQ<0Vn+}@G~aIGJ;;%hGITrzt{*JP`d?9 zheOr{FQ8s#EHgi|yXUH8+k)B4WHV6~n~A6FT~90GD3E4cPqdbuTtX*{hbolIgP=cM z)x}Z)oIs%8=a^r(aNEH=d_7x}S#IIi09OJ`{1K!}Rf*LL*xfIGkeY~H4RMTIarmNP2-ZXkI~B1fbzEtZLCe)PnZ7lu@j=zgO&qU3}w70)`<;;{ty+A18m zi;1laMQ>W`SLRWL`433@O`@5qTHBcYvS0IqDvu|?{Kp5|+7jd!`jl8RRr!UWW3dsZ}p9I=?wPmriZs1dQ0Es)^{+vH|baNq{n2i z@2kOsOG0j1>tkCn!aj7g+9@xxo(EfYQtA+L_t&Z;rtr{puiY%K(hk=^iKSaAp`Yu` z>}rGZBS@DhWm=@=4&ThM)~hTHY=^#d2ByNBo8ZC^hpY!`GcEQ3+$ark`aeHj(3?hSGKzyGU(hX5Mxh2P5rT+jdSFEs6alu=9rl<$SdWze&lwwQ&|q^ z83X2yXC0-)4(a0Gv$taJ0P{nWP2+&s*n1K&(Z9I8BK{20MU&{QaVCcTrQ3TcVgTm2 z1~_C@akX>P#7>}y>HdWdMeGbxqDizQO~lZfY;&>dkf)dcQoczvlU5n!u=n}D+f%WZ zgZbq3Y>m?oZD_0axgx#=()%XSlF>A*>>(TcgF7qY_aOad5-k}eVrV`m)?%3$?sS}cc6u?@hx z7_$5z?JM7;d89s5QAGNK@$$r}_1&T8U_;i!wjcs9nVf$yfVm|=pGd|d|Is)hhY}`LCyy}eP z;y!9Ew3$%i9>RRcca-BR7U0kR?pT7G-c+ypiT5#`_oCB2gRy+s!#duD{YOHdGpO@~ zLFo8;!dZ+HdjgGpXF~P{+`LV=iu#O9xCY-edn_CDitnvh!R(KMT%`jce07r-bN+u~IGhGYwlP2BsJK7`6DK&f2l*~C=*v(RN zdU7_vIZ$eWp1GT#g-9(jDJQ)^3k#E4oafKwz#^o!aKKWuL0Chn;f0&;(28MAl&TLX zL~DjMSE_wLG+H&RrBa;(`lEHj+9)+}z)NVEuy#s~98epL9oA8)ah~I7^RO;b-Qvln zWV=gkz<_7a1HxjZW)}m`wt_l9PzMm6V`###A>skpP%GIGo`0#L?vN(kvl8tZHd1PK z&sMZo*chp416%$LElW_(7D=hOxmsAZ_)JFH29ZSn;&WJzH0eqBiL|iUQgJ5Xr_{8t zc~T1;c=Ig?R4AxxiKO(Id0N;?Q6Jp`S)xD8PNF+jVXLJ{*BXWot@8%<%i+UpEQa&b z*6?vrtY!9MF=aH1tZ5K^KfQ)q-iUYo2-fj$BhJUainz7Z0U3!uJ0!L zgf~HNb?p|sO*`pjY$FM(#Nnb71x(v<1$Pg~2PwMfL~9j+4s0tJj9G?=?FnFyK@8kI z=D75bY%PEa(PGg}$U?n|Z&SYM?U{O+lvl0R9k^>&ZxWq52k#yNd-lDcEWr`=4iTg= zcMS|14Wnx}5dPAJqzrGbkvC2{@QD@~f=Le#-E(fmL-+e0MhxRYd#&?y{>28Ql@Uni z#)I|?h=NA8AOW9?kg9?xIE)z>v(yy zO=~d&4?sozQzt1mbMd8h+&dHRI-dSZF+POtIF6`!$UHB2a@9j+3a1yCAy{B{&C zdL%rJ1%2qe6KJQ1!L{zrfa&(P|3c7O%g~7;lIh$TO;-mI!`{k4ilDpRgOR_qPW$!) z8TmCXa^iv9fg_4sT;`Y7>DgRR#(sfGGXwBcgQ9hE<2B%j@f~+*+5#At836lg!=8Ez zZWGtd)3iqo1lelXAZ0ZoHEb~P6(rNJL0a%t66vj3WY7yZ4I5;RWHBk5#pL@~OnH<= z)^-+CkFl73kws4UzvMTg8;iWrEb{MRF>?)zS({nR-o|3i$1E0n&*GkoEbgt1vE8u2 zeT`V$--X4JJ6SB9#NvUwA>xb2q0Q6Vq0NIa(TCTY_%qJc0QneQ!5ARH7==!K;DZ<- zX=GPpEC|mtmf_bcvGmjODs0B;|FY<3BjR7+WyRgP#YhgAA z#?3GV;fOj(0gN|L8pG1Yu)0n&qy|PT%>4~W4vggN1y#EJU4VH|9Ks2*P)1oeIfyvp z$kh1NN32;`0n-{BQS~b=S=b26YlhVoNs#dp%)5qJt+y>)xp=r`Tl72ZZD}sjY8{-2 z*>5SAJuVoJ0q9H%pu__xcf-HMf)ZmJESBAdi&)!uQr;H&3+)kraLv631Jw48puwZL zKZ=90Lr`d^yMGRpcLi~yM~+(u&xY7Wo_(hEhl6hW^(h=A?j*8b0ISdv9DvO4;kA8`JS zaKNtV19_DgCTPOc2l5&)T+kw*541lD-YCJ_?}3F=p^O$(Eh6A=xDNbc11#f22V_tT z+)40wQGtdR1GkYfL0n>mUN*3$3Tjd@klre=bP-s0OJM7%pN=Di zUNW%7>c5i`yNR-%A!=u#$tbPm9Z-H8QN5sP5}qQ4BQdHg@iL&-3GT}<-CVF`i$5__ zc7RoUh_4ba{1c`*+YHeVj}OCP)ywhqJHZ^h*9V^io+;c|8g+X|GzSibT*TI57hy`Y z%@Z$e!D0x59u2&s$)T#zdVLZEPN9en0PX=c%*17kAEJQ2EdB~sF|vWrHaX2Wo!ZnC z--)TZ&;}r=z6$sw21ko!_(u_Z3tnbG)99}OdW&FL2lrruX8T2aGYhXDkoOTlUwXY6 zE*CGos=Utuy6E+8HW%LK#DXr$JD?LfI1W|+44)SxK2+YV0ktPsracamzwJ+PKMKh; zGyqVt*PG$L#RCx-tW<$nfO5Rva~Hu|(~B=C?`42ic)c06>lg1<-Y)`r)$|_IXaKyO z`pz|YcuBzz19EYNj+u&O(iWh9iN8vqOGN!=FGLqNwm^N?T`J9M1bvQb)y6OsqMw?o z(yP}Q5Y@OghOUBa;rc}c<8pQ)NP02UK;M2sdEM^y;v7cmcl)axPW3{Z!zg{%^P0@z z5--HtvuOP+{v{|%LEqp_i=j69syeDQ-t~I%PAo=mg?n7=b=2#{P$zvHW(V#+=S{CJ zH>14YC9m}o@S57Mp#~`E-{9E08s(J~dTGPf&ECDUoHH5# zZevoYd&$Y6^M~( z>I5mQ0`Ykw(;(w6Ex(SwPG$9ALAMp#M?p{--UIP-pOKmTls)iq8TmAbmA)ePcp9~8 zTc(S^Zn$fJL(T!x{Gcvcz|_?+%k^s{cM+O;C2NH)27@u$WQ`+2kM$IIy)Lp~FEB8< zTJwtrwqv%O&+ys=$f6kdI)me4|JaGU;QxX?^=sT9xfPt(fxk^0ISbKy2)51oke#wd zLgNv2yn>KOL(U~3-`3x`&K|5 z36^QodkD7u`hd%rB`EkHKtoM$ehVR}u$_O<@_Zahpt1Bg?A&Us;a55e}W zp8UOn9X&AGama%4Qvus)`_|L&Yz%W7f@s}zQ8VEQNFgS zyR{WK)BP%7rmiZoa8gi>b9NLs@A_S6EC-4x2L6=E;fX^Ad+&V^osOgTt6g- za~o`xY=<56bH>Mk|5AmcN%*K^1a5);4d|wxM!7gG`qFyQ158_2+kgj<>4qS*G)Ytr zh4-|1!hrVzmSp1W&ksOtKRf=y4LYv+G~m-r4v%A*#vohcQ;2atu+=6`X}By2CEGkr zv0;A^gttvn_1ymMpw1&c2H}KB;^#g5n14waLZ*Z}-xGmhj8q**ZE)_JeW^8w(WR*S=&*|t2~PT@S4 z0l!!+&b1d2=QaD&{e*Unx^VzDuVFZ>WoOP2d)N?Av8xp^z0{g$plR89Y81Jc`Y@ET5!lKC0BAk;fxH)DH&HsCt%**DRaeefC#Sli}bVLeMZ zI)O*-+E_OJ=N}jxy_C`QF*L2Ce`C%;%^8w`9F(w z&eNsS;4SgU#>Kl4;yy}#eI;UzW#eC~V0gkXx>9kb=vOx5{4EpNSP3LxAoPw$u(;W- z-Gk9d>Ss8<#u2r-5{xeXjggd1{D8Z7onieQ$Ddx5Thw1PpM<7_wRRkCg5glU+-d>h zwj+4$xDrpOfwU)-^V@~dU=jZbu5#g<1Z22@%2w&ZjT#~9{w@P#1I{xjnnat3{lCco z4+2?hpeg`2Yb)_Jy9>8#Tk-rw)&Ag=R^@pcHvU*&p~WBE z4Bx-8Ee<)e6<-(H;prLugB6keg7BLMj)^Z~iPL}a6Pn`zV%0i}UhjA?1P!M(q047S zI$u3ES@|~3GwA+`XhK)gj!eFgZnD2F&L{DXh2P3|Oy=w4_|F?40Cf<@!#oG_EBKBz zJV)`H{*JZ0YVa%gjz@WCz^~>z*6}vrPWlTt#|E(-IoX9HY6{iDIJUkdj==K0VU^po z>0C>9!YEz0iiYU` zDGq$Byx#`&p6Sh7Ek}m9?N@A}DELu8Crob%PZL*5Fsl&!C!l}4-n7+n%o61o@a!Fu zfcvUAWZm)`p^kgS+ZD>YBcSdC%W~6B%<-z2f&C88{zCzc_QJFibG#wwQRreydj_D{ zUYK@bj<-d^OA1~E=n*eW?@Kxkiz~hG)0@;TuL0UYFg3etIaPc>YlNjYA{~ETo zVmI^_u=h=z6QVEqI*a2bTkoHc&~XrcF-g>`<;$&(U|S4!1>y=YEm0Lq&WWRw?dpfB`;G#XMzFV?cpK$Nu-%RZ z;1O^)@TEow*#NP$jdI*>oBXA!iKl^YuEwD)l4F8x+czq${lJe9$C4IvrrFZ=sI*Q2 zzfdg>ZIK+aZFjFwac;(xR~Lsh4s-6a^`52Tv;*FQI8-Yt&$LBytg*crsNcZ`IrpBDo=KaNR4 zFX6{AeByl^(;n9lcpQ@tURw%cJdU})z1&=kfh`M1)NzD$eQA8r{rFssVrc=CM&w4E z<7PNL7HXWZ4rcRy{1Y%eLlNoqNnH!cmR&5CX}0YZ0#*Z8WvYHnYDn)Fbw>m2V6RcG02V1_p2iYh+qJ? zEB)^fQuy1TNP*!9n~1{EER*@Hp`x?if-|MKD^V9*(FU6g~Dw?D`@migY|V zy&q1Z1E6kRm{!Gz3^5k_fRzN_0cey7_h=puc(M>vV46;5&ayP$CB(fjJ!qI^MfGS# zE^~!=0`?aSOg8C+YsWDw#eYecggXH3F<`CN$PTEmg<@w* zjpUO`QaMSd>M%P5UyV@BYXJ_}hkt+@S%Dy3PDURk3)+YFIuZK>^&c^iE=VHY7avk% z@za9{{6!Bdw9|<=#Gdl8K*VA3FT%(t0TCYv{SH#-89~H{!k-m-#u4$6e8wUB!6&jG z3_M;J$mfE(tIl`mBYqM?p1}A-L+Kx)%YKC;svk7hAZojScF=ny-UP3kb#VsDd4r&( zusK*4`ao=aaY(2q&1jcZaHJZZoZq^vBwLJhc z%>?Ko8}RI^lwS1Gdc-b${c2Rha$rxIxS5a^%YE#e9utj+qDWr61=71j%%EiWk8L6@ z>6hZMktX;{K*x*7wTAA>@~bh6Y;dIM{S%_h`}HY zGl&X)(e}h8Tpbad4JeObS#`h0Ab+pfX7^U!MSvdidNcg4?ZMN^do!RdrgyKuDeWV+ z3eH?Hy>4;t-udd;c(J&`xmjpJ_KV*d;`KslSJcBZvP@aw$H=G zu=pETrGaa`ZpQ6_h@b2cnB_$X25b}^+}>O&>CYt1ZxXJ6M0XH|Tu)LtVP-SGM#riA zU@h>$l=KP3_oEVii&z8pLts8>vUwWobrUAMMzutLdIRKjU~e0^*6VRBKaCoSsXYOG z4D;6pCp{~`NMPJdm@n+E=P>14( zItQz{VM~K$nqhTaWJtY0u>j^}1|(Pb+ow*UWT%MDu&Z~6j^LDEqG*L`)RIqOcv{{p z3Np}L6dIdj=#i(WKRCycL*pE*klsw52mBX~sHS#HCjCKl<6x_+B|*lnvY}x%c9jcp zmj%1Zp|DrkRZ{wLSIIdEpu__x@5AYmn0A%fn327^%Iy?@@S1m(j|1L-BdQ(c#@JQ9 zVpv?A$*cvu2ZOPzT#I1lt}+XNcUSo)LB_6s|`rl(;!MAr42hvEGf98o^J*xvRYL7ye*^;4DBn1ox-t#;&sbB7VOT85PR_ zt?~9dfyUNipr5k2f3j3Xd zpSi1?3vh)=C z`v4s#ST-AP8(*{KU_Zm&KLR@C^=9~8+m-K>w>BC#Z*WL&V^`S^fA%FJU~W#3x9c0b z%4=BqMNeSy25#;uzxWlIMuNL7-zZ>wEp@w+PGuOObULN<4mwJ`m2|E`70&iXiHaXD4`GIy1)ZbPc= zKpr2pg{_FDnG{tL_Y)8KUJBsBGj&Oz`Y;^Voiy_;q3+Hu5v1_2=y3XJx!cz zqlOi(Mb>Y4co?yO7A1ak8?l?;uI7id5%G55}V_K-DEdtpe8Lf>&CdkigBR0$k!Q4e20NNR#d@{$+Ya=!_=_uX%0Ucy8#f-gfvG-@sNb#GYz0ea!zv>gmk9BO*|tV1E& zbMC!oJC4qE38}camuooY*~QhaOqnuWiA>jY%`**#N~shnWsDLsg%nMcp%R4@N2;U(vZ(y)H`%pf3rjTpZ6Hvb>Y<6d#=!+o@u$W$$v*#DEwDx^~8hhIA?(DnfV(_Bz?tpZK zy1TRMPP8mO67!9XLb3%r-nZa=ljE6$20-82om~wRq~vxrA=a6t1qbcl8XK-PwiCn;aI4LS}dNkg{+`vs`ru=^UEf*(Knbk+y6X z)iS%Y_aYmjH6*HKc4wa`Yqa>nWL++IclIGnecV#L0LV%lx^pJ8gNL3&9^Bp8qw!dr zylvq8ke%o5&d!MumXz~=ecfDBCt)Nk_T1gsuf=O#L2ydlif49bcbthK7TWiK)7Im$ zh*Brvxg2@j-P!lzN+!8Kh@-QUHP7tM{sJQ^d9Q)@yR%P$amiy+69q5i(6^GP7!uS~gW(Jj`2U;G7$vK?_*q!}Z z19(fRodT#VVV!e7*1*6wLFdt9GYl$XLo_OkNsY?0;$_Ai0folijc(jzfxZ+G^Shk^eD>=zFgeRp^EK~#*? zE#F?56NfIiT*vP2?A7ma=Z!mBO`PBv^S!tU$>M@`Kx1N5N_>mkbBojn_SF_@_O4)}g@ zWQ>v$$+jZw&Th5Al=>2Ig*)`D9J4#S!`mjUg20o>k*+0Egu6TY_5J38tpmKFXGe1y zmq6zp>~Dc(uJnd3!28}{M>xa%OX2d6JdX!H`35`OGKAgPtB>GTnB900@b^7Cx?IBf zHb#Lumz-~b@AK?vj@g}EbGW${&jY{Wa`f)(hUhuoU5V_@-u65s+?~x)O+43JNLwX# zy@*>Y|17SZZ{D3-vpahl z1oK>BxHm%X?(Fw}K&2!8F^>^JNr!xEv+Eji{n5Pl+C&y$D=S$gM1OdUj!vV zvpf5}`{A92Fac$|8;5{d?)Lp(a{)#5%0O$n40m_-a)4BC0pMX5%yPHy-?tFe$ zT+|payR#F9=yq)kxD6>RTljma0;;;Zv#((=llBMaiR`>+!`2&##c;jXg6I>YF@ogn zjoa_MYbN5+=9LmEU?9Sc-zkfc$`3GPSz@fEesfFFynU#%pRY0kP zMO(w|)h9Wyl%{rTK{G34p`Y zn%SMbXRLwC0;(K^&F<`1v7e+f+ocJhbi%Bba1T~|Xfqna?9MJ;0Z&E98w$>t>^!qO zd-WwumZZE6_$^Y{e8$vnm~wY#Tl387?sJf~dbS2jnm>EQ@xEbCm^M2J(w`oYoggf1 zcX#%%M3#RLTz@!p2}tsGXTOIXnNmlUfY>cLaK+7Tc%oS>H z{A|uNNIi=;o@T62Pw*0_Tt&X^heu)HD^g(&^67cw{{pNaPWpoOU2lADNbYi_;jIE0 zZ+sbutGSRaeX|KEG~ZLTgWP!IMg!5iN%t5lK<`65j5*NQKWuk-OG>_ zV&Wm@zEv1)N^ktCahP#DZ~S*OK>R=O#*^!L<1-M+#F1pP#I85~QAnP5rFuHNjkxQL zFVG1KwK*WncS)9b_)D8{dkCrTcHCXx zi9;KAz45Pa1XLd4S}qhO+w;bECPFy8p@yPGV$ z4*V^T(?Zg5z45=n84aVpPk^s?Ii5E@S3K_MnT;O-{Y+Tbf$_$F{JPQp6Oe`Z#MGei z#t#c9t$hce!i2T9@y0JMu5{Yf0o93W8*lti-Ivx*Bc*?-=$Qe@e6>$QlYLl ze%sH+*Bu_^LB<<@5xrN^EJf%aUM%jrQtsPl(z}lkYuxk3C*v2XqSYy?WxVnAu!@je zJ{r|B-uSZjV0dK?r$!;;jejIf>E{J2qLA^%hx}N`B456((X@;=KKQF?jbEZ##v4Di zv(fUwgJ;TRyz$4-wWR;tO-Rb+dgHskrCsAyfTZD&t`n}v4jw9ioV(um81zuO+B<;L zGds`q#{Y&VFQkkCJjtVsfDvua^~S%5r@iDY1ZT~yc*YxFFSli7LVG(n$2=Y@MoJf6 z#>vC=#`k(a3Hcg`xgK-NA!N-n-uRR$+GsL3{t(kZq39@VxP_LO#dE^bF^E;}aI4zCl(W0^jIz!lLhb;|IN|{Z?u}@FV2tF-+X; zi+tr#eXJ4nHy|Hw56lQC@Cu)EOxJH&$d7AJDKu>tut~Y)yriYgazXoVlRNHvtThBJy9{~D4ccAFq_Hq#=n5&a|_Po1A#y0apYQZz47@9nyP&j_?#O!#v31pu|OK{L*Sb| zjtm^ynDNFR&9D2tItjUW3e@ZP|NdbsGj-uT)Hrfy#ZKF#CEb?kcMzkU)nmH}Jq;Y=f( zC86g2w?ZK81mTEBlA6hq+cR;2e7JnBfMAbxOMJ68eqml%x*LRIF3I!8?_6k_AQe!3 z7tZdDZ-=*PF;UeCcqTbAMrn_;D6m<$9Ut{9yOP4-f>v^;K*vnc;jE#j`cgcadqGh zIg%e;F5`{giVY3z$$1!f56_O~7;pTSeT+Y54Dj(T=LT;)m)YWt-}O8K*}U;wNLwXh z*NZovYv-H2@t?t}@d3|Sh}qA0<9Rb_yzyLs8*e<9?8Y0PfR0uGN78s+zs4J10)mRJ zFnook&AU>5!pp+;Al?vYGcsPFn(@Z>#Etf0fZYM~iGtc2e`gwoE0CWAFoB>XXuR>S z*M+A8nsWdwcEN1k_&y!9`g)*WxeV7E|JlP@{UCsoE||?5Kcbgu0aRWHhvYl_Ix`<) z!p0jv5gtJfnkk@E%1)CTez|kZySx#$-Tm_(PUX8oKNp74yq|o6)3JK^brkH&K=*P!v-%C%-Z zw=xGA&#g>2uID!XY4}obBsFJExSreMkW_W0dP;92HT51c?s{$;gV4q!Jxtv7+zyB9 zy9>+GANZ&nIL3239s@SbsVTsxk<(L5a9W1v_EW6iHxgb6XpL(EgA(C}Y8|#xZYR70 z&>m0Q_1uPoSS=7f3+R%k?RsuMxECu&!eOipZpUHL=C3>9xh<56*YXf93#c+-sU6pI z8^M5hfp8N*Eu-4Tb6dKA(e49iP*mG^Zc~0V+Rp=;9Mv|S+t=!wS$h$n{U*sewZZ79PTi4?PL9#&bLRSL|LR zuN*ivv-4cfEu49yNO=%&2U6I4#?(tN<$7+D_n4KyqacmkmLXL!W%zJt|Fo6Q4h zl}BVVhK22VZtt(o@`JD|8_DzB9?3A3a2og(k0YgYJ-07+gN1J>JRm;hn$_xF!t8yjNpjO;Zz>f%_(8Yb5QJ?dacx zU1pNjoxqEelO-+lUX9_7($`B};EisuV?4Lc$0pBRf%m(?j`7?c`_tt48Q?G9V8?iF z|Hf`+nQ|8c|KJ8Y#&f&35{4mG-!|YsWVfR|x4%O8hpTLyX4yQq9BOYd$A&t=Y)EFx zJ-7)^eD;yji1U$Yh%dM*(d90rTIAh+9M&hJ1&X{^Ef<1(FIkaQ^U-(Yd3cfc`Q7uh z5lL|7L1vZs1$*gL!3=o`TIZ2?=1~qXU#_vW1mN7Q&%kQI-YdkUOLUmU+<#OCy-(+U zZ8Z1mTBB#{+<(R|wM*_Pvr0YoEq*an?$`$G)xZPerqGtTkUPxvwzpC_F>2)~_sAny z*nu&?W$@`^m|Fv^QazEA9Od{THLgfrb{U-I!d$LcUGBl6-FIJYoaX`!C81us3|bGD zM(w^h7e)TN{8JFViaJ+uX0+?pV?Z0Jl9+hEO~h$l3*@%N>$t5bbYIW6a1L+AbdEp! z-hZ2aj&7Gf$BxOL)CMdkBMVu-#eg>wXA` z`W>gMr1Xbkco0ICrgRvB-BjI4;k#__!l5Zo2<49Zk?XFn;{^(0r83}qNny^yO+g9I zLW!)7`N``$HW_Bpf%o({R1>0AmlIQP;7+t471bDU#*@b!SsknHMt;XuSpsA_q>Hj! zVEtGfx59q#>FaP7sv zEWv*_+>3@=|T`62BL(&PK} ztX2##czxs~(mBhtEY^?LN7Q6g77h`II%ue5;HAk432gevV@=WN2;U2+Q4}_Pq+T9nC9sfP0res*3A=ryU~XlxbJ|*fD*ibimko0{Da* z?3g~X8e8ev8tP5p3tdih7LN9j5+jO$RRH;? z)8};w>*+Iij`E#zFeTihKXYTI&wa?rK^#f>!0@KeGm!l0O2c;vWTwv`uFczVh(fmM zv(X9MkU~jC09PlaC=|mhAabYA=Z;{r9x2TMxA!QY3Pn$!cOutfWia3;Nny^y6G6!~ zeeP}pGp_+(;BlxXM0fgJUIj1EWpeAl*+d?5sDRi1`qk}D1G709&89EcaYP_|a7h>ddPfT#^PeM`y#D2D4JnR4}ce}SqBY$i>2mSr0TYce5%AO zHUAd*&N;kRWVf}u)Qo)%>t-BD_Vp~SawjCkU1|6>flRAZg}9yzWowoC{m>zidDRYZ zH&XIKF}xolw^g3SyIFRS!XJt}<55lsMYqb8Eyl_lfZrvBISYRXO14%x{wB<90KU`X zFmWNet@2YPWl>R`0_Plg%#qtF)6o7Z7WH^L4xNfvVEwq)$~HR8O9HQ)jiXzIAJVZx zOOZh099~nwn!BdmvQ_vlKDSlQOIVL!S0uc14qN3PhTT?~fz;+Q#TfQu_Xc1EB%ip_ za8MxADqA7m<3ib5<$;svkU-QKoc<&w9*W_?2)V6t4mX}XNJ&8U@5Z4iqlKbdWeA1~ zu~G%_eWWmF;bx#@ZA#n~;e ze%w|mI2N3Bz`xGM(XGN))BGk6;i$t5~yc z*(!X)klQNPC9GQ|7On$#UdhR@d#!wl)V^Vgx#?VRua*6f{OU@>`2{kqas^`lOrwyk zRc2p9hXktb1YDeyyP+6<10uIoPJU}yQ%I=;xS>Z`EEL@;+$k$oIs+a^3Ud~I6qIbO z;_QW)r-8rfai}Ilw^f?&#b1&X zNS<(|;iUqZR(TQPX)ctlRo24|cQ+8V0;f+%c@K)=DhRo)(lMv9N|Le*r-L4)o=|kF zl*i;LRxU#rKq)0>;oOL2YnAO|VCGKXr9BSSgy^=)V-4V_gHSo(G$fBXa$BWU9UvVb z?MsB^4~qr)#h97xmw~Rv0)HVJN4JXn%p=72CnP?1H+aFCW#-(nRro_1w^ih)?`F2& zA#y#h>|xlwR{lV0SDE5|NWE6c@dg}bI7AvgB9Lj7B#6toP_|ZCcLg01rc`~v50Y{M zis3B~xvjD#7B^s|^aecCqwEoiZWaDgK&(szJc|_OEW7}eY^_r9D$J|^{<+7Ynh@Pq zX;%*mXC}7~oP*>sM{cXEDFWmVNd2fwor+js{kYf4+@0X$XI*FG=vLti8?4X_B#`(L za}%t&e(o(>g-%VkRo;~FK9~#EqifT>R=8imYn2IrUt)@@AoW`14M-Nb((p$DnO6A- z;!Q4;tyRurds9OoYClfDlJXf8!<`XwTjg4PWwl0JS;&4)9GcQsD7sZ%#t%ouN-@Bd zNMX*xwL!_&DqC3(^?|qbI8+m&+bVu5Wb7{tX@Vd9(`rR2QO`$#(whAC#G z*I|Z7sJ}>V2!Yk3wGWbctlQi1AVi84W(bu(pZF%?t68p^*>GJgJ@{SE+di%gxZN$_ zj6p>JZ$!Z&GcBwWM}bV4WI6q4)b9$ggYqYvz};4O-Zhlhq>3& z=Ch$FZ1q?{yYKQ56CdYfK{D+n$Y-YA9!j>&2NIb!9}wB*%rDnx+Us!+v3^6`YT{SE z%siIm%Y{8u$>nE3QX&U}dy8KxgqjF`^$(V%m)Vq7@Z%I^75^IyeEqr^dS~%#495p^ zy#mfZ3>OHF$4F58I>U(xN0EWzc%2|3DG3WlBcdcyK4D@8B0h;!Pe|N|h+iUU3Dw3R z5-X7g2|rCkBu*mD6P6xBBp{LWgd^yv#dD}p7{WRw^eT?L6x(ZHz2vB^9@L# zm#BDdi3~}o{|F*^)No{HM8aJkBa&a;gUFbK{*w?Xpqe8xE}`}ph}@yZ!`hPxMMH?( zt)?RKY(iriD6YnVHYwo(b5KsPW4xa57bE2*GAF@T8j%VTS(uQ6k%|&oo)FJSB|b5< z)+GG!03uZ+Z=WR`>WfG|`N}E~u+qcO`v`jkTzE^Qh zdAJigjuqUNhIjL~>V=>czA>!QQl%@eIa`l+KD-JdDE( zUp4-Q^n{PnE0pqtj>t}xaiAU&i1Tw4D)bI88IG8qW@QXag6?I}twEfZpMg#j$|aX) zD^Y#hgQjDUPid?#eL|8fty&rH^aS*vK+k&+um65lMiKO$lt%?ya3fZeg*Yi0`P9X% z-WSn~DQ88RaRmwIrCv${<$I70KLClCsoYr{aMA5$JgrvNAq@3DSq9 z{7XEmV$f7jlg%JJErhRxz$!ObzJ|bV_p_Cc5M#i!)I!#IH&OF1Hc~z2GKzwgWX&Y9 z_E!k21#e1RYR=1DSWIO+z#M)mq<%tjb7=6N4+8Ha_yiBvsypfe`cR;G zH$ZV00S%Js-bje!n66G~+8)R8$SGw8Gju>S*-2R~R*!nPu}yia7lKzjn;I!{6*fO3 zlCZ?kjZWSY(3wJOWdw;@o16&bZ^d3cPQY4QKcP%di7{Qzl%bvn;!kK8PW^}U zwW^nVI&LYh>-7$9U!Um(f)#AtAA1j;WjH2yDH-7j4BNrnD-eE;;ZSheaD<;{I6fG8 z9N`xj&KtaM48ju`E)Yyd|0?++!*>NUFin?yiQ&ZH2JERR`7&pml;8Dx@@&OmDxH)x8&B zwW;7|Z-sw}WkJe=g2%t>7FvcTovTG0EZWIsSVC|ljj_2X%Q8;Hb)w=@4`cC>a)@VU z@nIK{i_Rk6qkhD)uC0hwCzJ(VE&}yny}g}@JxGb zm@BvyINRo|C41sA?f<$5tD#a=$KkRKcEc@qshaHFR zDG1kRxInN_LxdYJoEYpx-G&UO1j|vk5yRz!Td3QZ;p)K>7*9$)z;Ify+Gd2CFx((m za4^D60b0$2g&1zeaEstqs}XL&@PomGB!pWs+%g!-hj43#TLovqDOjp4!>xlWo$`tr2!(m$HqdPD(+IC@_L-hOf zcpjas%)3ms4rF?2^&@2UST+&JeqOoh9&(!?%ZdEJa9<)!)9Nvih89zmkH)ny)E0=} z_P0;wU9w+czjLO|@hsDx3sQ(df1TSHat``h+&iEih3HjRtecw&L_>y}iCYZNR(RCSXFW500%|?v-+0*cXcBz`>Hy@w zd)R}hlkfvL8N>Yp>N>zM$|qS13xOxSaXm03@JRmLC9*Dey z?tpt2)fjLKQWi50wYvB-VDz|S3rUl-pjyD#32<2x1y%>eh;-(=m zJ#Y%PStn`%prujx)7*gH2w37jveW;)Xb~+rRb#E`|UEKYCm%L`JJ`u#~YQt$aIC=|v{&XWb5KlhM_RwD+md z2UrB+NIK09ro|ob{VRydx?(Ap!8-a>UC5hd!?F?{@u^M#hu%!c%If4(BH7mc1PyGyTEQV+)lwkjQGR5lZQ~97!_diq0np`)ZY7VU@{tL~l>KQ)8 z&&jU;Z`HHf=3)~pSlZ1N_d7EVf-~U)XS%;L+*IkYIc|r z(i<~b$e9JB)bL{>HfFE@^Rx0;RMn?Nu55d+}TwdxL zAR8Bg&V`Hynlr}tPE!ki&~YmnM~a(IaDh(<@+WH#zqKZ+?Rv;f(WzacPR3 zUciTBx1+DHr+n&Z$ftYQ&rC>8hcTU*Du3Fi7K8EGEm)_>k`3rA!N{)tWXSYc^>= zACL0)5>5hC%7eX{#+zHv8X?Yotriz$E${W+^Qm4dT#-8jy;jg+)bJ_}&If#I2sB2~ z-U?neT71x_o`-0LE6!TOqIbxrmH=Gs5u`S>^3Oi?734cTjH@4G_^?kMh5U?%-4?}; z;Qhy+py)UxFJ^Hd=^e%O4|xd>(-&!S5!B6bA75trDRQsUfH(Fyx`htID;+uId(*-C ziS^eFcyDqxu)L`+V*wxe%~$*xtkelV31~tT{_HWNaN5@wEExvg1hmkDYj^8E#EP8t z@w+OrGWZ5k<<+>7Zyl< z4HJ1kaIG?a+l}PD0KAoy-fY~eGR}PvD07z{=Z*q7yaI{Lad(F=h0RLBI^Qb_&QzsuL9$!ou|vt?p9=T;8{fMHe^LU4=jU;RW$QDDO$Qd zuo04Nu2j1Rbon*}e!hUcgy8-H_&h1^AdG=Z<~B2(#` z|AFn<0jYMC-W5qj=12@T7+>HUPLVeyh8v8xu%M~14abXkyo8(`a{sr0^Y z0^1f~E*q#}?BS7D;#8H-;0eN!^d$?S#jnMw2O#R~ilYOVu1n3r?~4b4G0tPL_huzb zk5f|sF7*hklq|NsiKYl|*jmtbdQ{I=I13AJ2RjPJRgWbG*`c#0`$n7!evSh1V4-x1 z9xJQCH&K4j(md+UXqM*1sTPnA@UR zW-mur`1_(+c_&W&1nxPH&uoSdx+l|Wi{g}TJuZD5y4=D#7B#atP89=KDLX-KPIQYd zjZ^mmY~>M7F$oTrCW&|BR0hDI9^ujrgcWgWJiw_QL2&^j7KTfY`z%f^0Jzd4gk;{l z_BZuytA{lO?3r>S3npLaQ7X)(?DBJPcHhLaOlQ$8HJA__2# z+JpKJ#~>89WH#RPf-6Fm174GyLd+wZz^dJ~Ki0Ne;&Rk8oR+{lX6K}Cc^P^ACN8F$ z(sqUeenOMo zPlI&DBWhzK?}V}Mb1p+z~s~fSXGEi3R&Hu17ZmH3!tj zRk!M_&x_IPK-}6Gcw90e9_B*f#P3iPjUS4e4|k4w9@va*c(|&N?qqon$5m_q(sB^K z&Q6j7bDj_LWYzf=tN+N+xFc0SKM3j>kIt@O>RCF-FL7mio5r^{Vamaw8(+qc)Ss|) zj+}_Qzczk_!%kENc&f)?-gE|2KPkl(P2AA!rV?6%ltH4`OH8UlJRLXSZbN(mq$xKO z!yI_5+Fa>$qs* zH1KO4M+zWSrthsT#}&EVbb@?ez&n6L7eHD;FTAeCO(fmS;tQlC8d4pP6irE!{DJ8|8B#}* zqGhU+aWAqP2;_JMtuPqavpBL$G*L^MX$NZaikSu0Qjd9~xg3F|17L1F2zxw|Sc>Mp z&V8Gaa47Ij88CkX>%7af>ZEb}3@UR0m)^J-j6Pv{i@S)sEZ|NW(Cs9tZa9t?)Yo zb2|Z_1#D?HTu;Px9?1_QcL!2%Q=`^{@Qp{B#Vbd?a2+WUn6Vo8VPK~{T!w!67Gb1V zAV(wMKGaYy9J)DlCJWM!TRf1$VW}vvip1q&E{|Rru8NbD`pOWLG$l~)bu)xC1}THY z=mMe_cv-r>b{v!r`0(2{8AzW1{Y9#XZ93?}JXxApCcs~P32^~PD?Q>dnFhqe5DC09 z&~UZ@|K8(h|KYuuMb13c4$!11JOkTIBKHU4PvPk-YDB#Q=-nuMswUtDf%H7)Ht;Jz-$r5n7A?{!u=8^R z{{rZA6wbg*7I`3WHy#W0qVc#bSc>B?<$k*;;HH7M>YKEa0hM=QJpiSOXSR7@K&mNS zL*UI^j+OeuT$p$;PzehV$$n2j{i5*Hqkvln7F;wLcm~i+7moHAy$Y&5V8|dVk{-Bg zG@hoh72gN*GqSy&W@%2lKswgbspvIoAMm5uEE>+kfr020V&@w0Tu_MG(S_5-Is~3X z1&FcYAXO#th6zm*I|aHmP}*WMkh+b@89m4(BDOVo_55sU|r2ij?a&@hW?li(r zhtA{4aMR#^JT~|ZzN&-ciNX+c!1@S3CMFhnKUP(Pyf%&`-ZfdH=d^~Y4`LNnR7;#X zx|m*%j#1pb8d)9NGadwAyibUaf%LXZ)Q#?q+~FZeFg(gT$vyE{B?I$^v7dY^X8dAi zoo9l+fiUYzPUzA<0LoSPC1mb%|8ay{m79pisge2q!dMOznXr$2zvioOj71jtRZbYq zjU(w54sTk#*sqF0lh!3YrGC{5@*y53%MR@@UhY4FmSOJH zOThIaE>%3aEB%e|Ga2#ZE(ElU>TlDk_9w6L|JcfCehFxg3x^kjW9*1i`D6dSkkUz< z1?iGYv{DatLfO~)+rkkn9-c7j<#rr88FB7NRznV~(gCso5!P&ppM43t-hm+bAut1I=C8f?Y<62m4=Q>rGDj=?&62Qsn;N78Dh ztHt=HTz^sq6cvJZ~Vy4KbyY&HU3C zcnfkqWy*5v6tg3yHP)1}xatjvD`bJqCC*!?nD1gT-Zjgn7lBX9&PnCXN6gNcg$0bA zmB2r}fy1dVW>-u})ViegJ@DfmCwkK>^J>iQn5D>|5U+z2+~H>G*cr%WF&wie=Gj@M zT*ZKw^*B;?Sq#VQjp^OkEQad?fA9v*5G&?~nA%uLNJ_nc_IDY2`5yCQ%o5xm3H&Ue zDK2bkhs*bvpJI~nxLP<%fPdm~c!R1txm*n~`(qZ3G^N@N(lL)Htt-7)p1Q^yjQOds zb{ndHK#D=7=_VV>Nj2tB%ummmS?LZBvU0uG5m(CG*d(MHssMStl@R2b_5!4D#FnCz zj}&uNTL!^!e@ifO?H+*eFuyp+_s{0TbY+*^DbCSYTRjJgvo@6*=&Rn3E97Z)AHEmw zv(ja1&ujBa!FAKxfQ@QqR*1KfTyAuH=!rG5tEuYX}>rEXIyv{eU?y=1zvJL`G;fSO-NS!L1H zR9oP>z~hy;1P-bsJOmJIypp@_L#i-_4v`FzJM5oT&T>Ye{Y{5eLTw{hKzqHJRHz~B zxBI0muBs!d2sX8fg{^LSI?;CZi62#S`x*V;vg6v7@ryc`ru6fn*gY7Wa3l>t8sT9~ zNIye5se%j52wxI-UR48eKQDP52>h|^9GT)G zf2#`h@Iy-0->bl9xE%2VT~`&c@*KrPRsvWP1;r2K^S$vqo+%RE0q7?e))Pr8UwjaW z^VMyEr7AfWfyeH3%ljA$tureQqa41?i6*m!Kq~1Gb;ZbSXUI3Z5c0SZ#_j?BpvRE` zR*dO;*j&DqcpCUBiJ2fhN+QR==x}UqcH@21elQka0qKow77Zu2ujVA|nWC{Zz&B(w zX0C)hKD7(-6CTD~OPhw}ak?J8^7_=DV1!W{Iy+I8JWkiFd_I*3MwMHzE+7*o#R5Kc zKNxL1);OkkjRbE2IkKT#&c&FT!<<9Xdnz zV~I|J72Tn;41`ro=UF6Sb_QUF&L)VqyJCF}=)DElq4P83=dxj03D}|IL$&9}AvOhz zo=g&*d@2Qud;W!$)nI3zY6;q)|B0HFj~zNsg1g{<GhtVjsm0Vs*bi|oy!?(Wd(566yhY6Ev%j<-W6 z27OlGhXM6)VPnGV(BX>%7ucd6Bk@Q99ismJ9J7wp6X%I!6N$(ohD#( zxdkh_Lx*+k?$C+B6L8dYh_}9>UpO4dw$paCxE)}f+JYN8cWF5hjTc>75{WJ?*CWBN znCLb(u^zavwA=^LQCF;MMPpc6UW7dMfKkaZ5^DmMmiYjdzL}8K43?IuV6^!cR#qyO zmOVfl|36W)^0Bmh4cw3aSAJF{EG@S};o^U$lvNW;%Q!64E8~zl6zo4ZnYzZ(@;<1J z_;1y-W&umf3DE!i|70VpAuKJwgOR+4{>!r5s<@_nSXw5-+@t?LOx`jXZ)y1gl6cKa zMx1x<(z5$Q7*o(|)k@&Hz~0ibTor?POUtG<1}L)Kr6uP$5x7gsr00#m_cQG6=9Lqg z2Mu>=S-rBsOAwDPYTTveSdMW_p?-GUU0P1}n_K8kz%y|q{m8+IyZXGPWv9YsY55fJ zm$Gx*rRBvS?reFvF9iOc$I+`bdGLHy?Zp5ldD#klPj-&GwA{M}Tiux7v%oL89J92{ zzZ;HDCX(wg9)jYK%$i4xK3_%-1D63*&4qO%xJ%2`4V3i*O*9AI$>VU(m?rA^C5LY* zHXKQ2M}qW}N7NN#mX;k~)ccmyEZ|E$PP7%=rR8hz8_4F$FF^X9M2>-3noASoeQ!-O z7SDk6XEux8(z5V1V=NEKQ3yxWn7IpcXQM7_99h_Zd_eft2`my=u56LTiq z?H9~1-3Q|lO?>5Zu%psHtOp-;z4*F_!MQ?SBsN|Z#iNQ897&DH(&9k8ssT|$R~)8= zFcl3UN4$CnV1`F%PE2pE%^APzG#2Q{ka`061ajI?|KTVnSA1+q!+8_zK zBwzf{2MwG8sB9GO4|$|O{C(*5;y11js7Vy=u^w>2_(g+_c6UI1qVSkifbWXGYq^1+ z2K0OsKG+Fxq4<eegJeRs?F~tM5@LQ$b+1t=c}uLu6wY22q98E zzStxK7XYUa4qYvEI=lz%TJhV8LbDRY4O~b%t$yah`m%=pdLGQ$@r`m|z-0|}aGAIW z*;iZb{Tfb!NTc}LC(QNN%f0^Ej)iJ(bN!{K;ZuK+%=q;%gw1`6QV{DC&or82uQqH% zn#QZOFusuqbm66=#m(c@Zir60;^?)hcb;k1gYoJwFyekS%Hf`J@kt%GivQ?dr7x_) zz>~@8Cotc98)*~&=`-fKs{`oXD9ktCM%u*>Xn{vP;HwURx)PS`$(wH@?c>9Mr3oGb z^o$Fe`Gjvrj&z7G(bt%m1AM;A(Qm$uJQB~3jEjkNfWCHNV|YtLoG-;8DWSrt>Rh<_*4os1>mI;GL0mGdUX9iM;^|4D-P%_lgp z5I_+(_WuZfky8s#*DPl@GHW?wZ=>ew`aD0@7W&TR3q1G6Rtvu~8tWy$v*<}YE^wau zljo;D!aamj4ta@n64;ZRrn4}TIHw@7ozKztZRawkkQ|P}w35SFumw+Aoa1j`ySY;y z@{qG5KMLdg`5Imw;yAdr!%nY?=nfu~ob&L&=W*<(v7~isVuHTisn-&B zY0lW&;k0mCy^FoWP6}@F?r`i1mQ~O>Sq8shb_%Y=b2_KhLvZ*yYmnzc&io$uq>;1W z0aT$g6%MH)&h*iELy|KJc`oLx!)2Z1oWT#!lbu#rcNTZLqw|z->f_l}ic_OMoM28W zE{QVEmtUanot~}Gyv~{lcsGzU8{pCHipT2CZ;kO~M(2$j%Bt=>gqEw}e6Si9vlBt<)Nr~4ri5lH&Ic?Fe_gN0#^7sStl8l!)TF!=Y^i4PiU}eAMTuOsa z({lFVja-OzD5IoG zi92G;nf);QB9^n#uNdoy%15l;REx}y&_rM^LUxa%vg+d}2$u7BK}?{yOpu8amebUy z82cU>MC_MSc+hA$HSjnH%>9!w?&4=r&&i)TXk*0MVyMBNBA?5jo@fBX0(UF^$&X73 ze@2bNd#^0#1V;7WET{Yj5_|rd#L5hl*d}yoUIq#qyE~2+!EW2bm#s3!U910EWbF9X|>~fnhGog1GjZ<7%S1hMO z4s4yaoZHZQ{zT1Vi~u%TW9Q(qL@a_IVS-ucAv|Y-Hz*xnmbIL7C@o@BF>B$^tW_cm zf&y$|WBKzK8vGjiS#5lm(Q+=g!*q<^gDYi>a@MSo*kN3Gh<%4aW2|zzqwM396K^TT zilC_wdu^4*dnoQ?y9$K{>~%QZmxLlB?(i4*N-49ztZLp2;xu% zl+?Dl_de5}$An0*ZT?UqQ^=VHq{Ozl83gZGLK2xa_pM~w+~r}5YNli_(@qk}IU3`B zFx&o{LGJys?Z8;!X$r2wWs(FhoEuXHHI;Hm58kO4XGpkZtqvXr|qg z0zNuLsW3FzHXYgc+4)L>e4Jz3L-#SP&rj*_e#+@Ov~5ako361;dk&4!TZjq-B~#9} z&F9LQ_GpnXY?}&yN}CZmZ|`k;`w=qr`5?l!O?R6uy0%?QYBd&fdWb;Px?(G`$gr$w5=?B04a zXLn2pnBDD~oZWw}%-OwrL(c9!f8^}`=kuK1t6kvizO5W*_d}ST@;hHo;Ot%_CujF= z7)uK}#h`nq^Zf?S?o*KGyB&U6r;yXKFK73`sP;ssPis6jagy=dy`oME=H_C~HVjEg z&da#`lbye6U}fd-7tJM{=iB1O)>%;scREg9*eT=q;yJtj+Kw~#ikCQZpJ>4u{b~|t z^rAm8d<{D`DmbT6qO#7oR^%MPTBoA(Txrhk8=Aq9=&VgtnBBMKIem7bQv-_jh@yl2Yz9=7N_W`S9cK@`?MU_L*xLT2|4 zVTnE1Qer|O!=4KaAn85=r7V*SwUh)qNWF=vl!Bs2Ig9b|Uz@TSb} zWBh_OYAo2udlZ?a>qx8*dM4)V7w?xjdn<+<%1TyJ($m5MFW6&7Z#z2 z^$y51BmlbCB7w(eT{VM7VvwPDXGM|5o zu7Owyj18FG3vZIy{dbfd^Z7vx5}4ijB|XH_w#e-M75XP;_b#}=F}rX3Rc7}+Xm`x+ zxCN>>Ngcj~LGGXCsBouD6%KVf%X4^}TAu@3H8e+z5T~o$mqGC*lNiG4UODeSK;kZ} zDg91SWGu!xH3ws#l_S1VzG4G$1w$d&_HA6;`G-Tx3NGw|Z~?w&&bE9>U{tz;MxR&n zP#wi*l-P-eDo}hbUj!I@yc>p_HyN~oJyQ^VYYf76Fdg=aFX#nvJO=NEl-aZ9BiSVo z@zs7Z`%_vE5s@x&rFkr038b3bk2$mL3o?1|++ruzIhC8{`5RAa|3c4=sobLO6_j%V zdVuA0y3Vn`ND@nX2wlqWyo8G?#%YV;A=YVHjAQ&#T&4dgXW}%pmU3Pdy*{EB5xw6; zZ-(f7sJYXGYu)o_4kp-Z0291~Mz@?QJDFg84BtNIZ;{jzNfSz}7FTxQ4yZt$Kk@cw zRRNc&T_xpFDCdG;qACr6?6~bjXddM6;z*kM59X160Tf5%pFp$e1RPJ4% zmYd(!Y$W%^$CA1Rw6!kPdP&jSS*3jEvDhDgN;6ticG7 z@wbbHA7D{f9?afEtp1(*jkMycyvdIdOvc+!pgNx|VEHF2z7o620_NTJzpO~C@?K*! zT?-sZGf6ViHJu^p<4X0LehjqkF^He>pf{=26bgqje@j9_8jmEu1m8~tG z$FIS`Tmy82%Lt2ZrQ{;e{beg|OUU>ED8H{L+0hAC`W4r1mD8;!X&Zk74WMwEK^?0q zxAj-CRjoSOds-N9GAYZ5R%wDUr^;<=4Ki5+(z>p)RkbuL?q|r%_-qV+Wy-URn z7FvrR0@5d`A}hqZnhC1U;GS0Xx+#4zhSqqn+9ph15QmRL!wUU|pl@dhAf@bj*m9~C zWWd)@pSKtBuc(!;Aku&lE79upeheHUHT}sLP{KT6w0Rk2>+!~1RLW^4ndU(mqfvz9 zRC%>To2azibx7-ow2vq4Q670pK2HNV=RuJa#QTkd`TJa%B3yFc1t~AULGQ%M; zqt@#n^z$KK)?N}A&`*FQ%NYrsfX6FF{vgf=2)Z|9%)}s>yvbJ*8U?OF%I+*aQhn0; z`(}caPxPykX%F;g}rQb>hOKgg$1$LNnS-^F7(G}$*f+xdxC!1SD0d{hF&MJgi3xuRdppgrHmAK2a}siH*KE{ z(oMjswFW%d2D%$)r$-oFD|rWV`6%g<-HgJty;ce&BRq5Db~uhiw$1A!)8;^wDPh}$ zdzK^04+Giu5u7t6oGD@3&i^VU3#Ss*=U;`>y*wpf%J~e=nG(*l8MbYH$|lq1r-g8f zDd$Y#To5#_0@3&699NOyH3-}GRY5PLQSzOjd8;y9tvb(It~tEyGVKF$UT{Cdl-RZo zR}=Y14&|};@>~{Y+s<8=;rDSyzZb1GB3XkJOAWzQR;v-uoVyO)kMUUX z)sk0*UnT7IVk@K01Sn5aY>F@k6)IU7YkiQWi?kG_0_(o?c`~4>G}|y6B3F%7>MQh} zTHo_bdJj@0HL+XzA1o_tB`f}+bi4!+4Cqd7 z+Z;JV4UsY1-VD`DIm6$ARbZw$b11ZJejW$D50NvRDPh}o(B7FgKVSrooJR<%8c>o4 z=S;hcgySUKL&EtmnZwN@=R0wR`$f*V8Z#Vf!87Hygz>!Fet4(EUAT!TklJrL z)>XlB2&WF9_sI%w7>w{him}E_cma{#G*IG|OPKjmfBMd+@XF-WpRwn~>dSZCq#kCe zUsZj}m$y=nFpPI5_k{casaAm%AjSmW9|p;Bsh{9B{7L`hT7_OePZ$)s_9N#q!##8MBj*ak19J8w=PJV^at;9HF9yft902Lx z3_crdf}WcC&rpthNJ%T z^y+4%{w6^yLF(&w#R`i_kg7VXsB9-lU7eFiC_yUgyhP#?q_+N$NZtggu8T_QE1>|^ zRjHQ+NlExV1(7QfDU+~^k*g9ZZ~5l4_4YBHT&s&BhrE;EOyKA#hpFfwVKJOKD)KE(J0Sepp@}nZpCFcjwBQx!P1WkLC;jWMKtmT^XD=s11 zX5Y=Ut3J(hf#-Op#5UoV1WkB`@(ywykF#yB8pre9!at2L#!q45%_>%i-ze`Ed;8Zb zv8y09Us{NN^7odie^;uEjzHUvi1r1Mw2=njr^;=+qR2l-IMY5D)R;SQ)9G=NAhOs0e%@4)2|KrT2H+IAPAXz})!D5+0y9>7eyC@kLA3qjt*_5;=x ze_vDf4``hS5zMrCpNr1v=ebi1Zu`_02h0CqF&`sKeAuuzISu;objlgf%o9+Yrkc$b z8jbrVKRiwGm7`G8@$~8Hu+fV*dNc4dK{XB$F@$_kG8sl3`y!kXWJ8QhbbQNDbP3&P|B>!fr7I~oY zO$-zDPwt5f%~B(=e)RRd1J^w(?tY_^U{uu1RmjS0RVEkn(DM!T$Rh(lCzWNHqmE-4 zk#3YqdP;|&MD7U7-+c)fPzAR@8QgB%#0}-}xIvXoP4x#GhfmrIJ3QKgIVTq#ba~^ElSqsvZRS;4Q6LB27%)Cuda0%&|b8$1z_~ zk>(aCzUd|=LHTAuvJyws)I2qO33q@%{cT0H6&M=F7^8JPqu&ELgk!#<2^w9f_~wV0 zKI$_=M)#F}YNkJ^tlT)V7ixi;@+lP7`+UWK)x@E5!O%Mj?EpyLMHb>~$rdSESaBU! zWJ;RYy+fNv3A+LrhGV{>C1hs4ib$XniaL8O5;^GeJqyVc96Aw(tPmfAEmBmiyB|Np zHij{O%Re>q6ChvUn6IeKQZ81-rof$ZcPXr&5(}mYFWQ+df%S$O23%h)eZb%KGWdml z?*k2LCVoErNLuPAIm&+k z_t>$;7hp*-`zHSVF2A_Te@i7|gp2FsYYV6k4&9tO! zYvNTJ#xY;f4jc9@^}_@)yc~i}IJ99MiW+W?3F2)<)p0f+Tij&$cOX}A%vZES!%Nh{ z$|zw9OR(IO@cW?7iJIxaoikhRZvB&I4xg>~RUrT5NyDeB&4&A);VxBOI}fm8OJ4h( zjI$$`sWT{KY=jp4leZ&&5<3QB%hEaIoBYU9HNuK5$3*>;SB+k(MtZU3qnD``Sh~kn z9*0WzPo6V;nY#1_;#FRh`1avT)u4=SR&2Em=V+?=QZ=M6QZ~^B%Ty^0+-@{&nQDU} zR!9Al*TDFv$YE>^J|^~09y4N@I=w9#KQ!W94lUMFm6?Go$(zajliwXZU7boyBVZL3 zoQz&Wtk|yk`qRv3BMH?@YNo8^>L5fXZ>ss8sE1)V^dQ3y!P;N0?jC^azhoNqt!M|B z3g*0<*elfiuB<6+=UwhjaN4aa;%MW(ty6~JQ7zgqeJfg}$e z$Y@hK6zxra!TUvw3vy2Y$H` zmIKD@LsA9o{ZoL=H!zS@dY%NA}2^br7G2zbSh^0y&0bzM`To z_iOudN824ZLm)cJT~$fU!&*y3;enWlM;!uvnpLu}McmHWf#-Nmt6kC2kd^ zR_I}=vH=Kh_2D6%Ng>%wVI7d~aLiYv3-iO}mni;hgMiL_lNk}k&z@TMjx~F>!k#+ls+}6>tzX7!<%so=rA~*on=1U}7g;2w;L8 z67v6l-}%lt_tw%?)1|!kdm~lfs&mgh_blJ}_U}6k1pB2NpZa7O?2&6TpqIbFo$ugt zF~_ITFTDNq9OBYl%~$xhziAka3>Qi(O1-drm6OE)O>AI?GNSNL!|HsZmi*> z9c5GKBWwQp!nH30y$b{>yO=oO|zvnWVXH+)O62Xhh#p( zZ2c-4|7hj~oUH}U)@N|zkMRk!1s0w1&rb}n7)h$J!+t5p=im1mFb})dky1te<=%Z6 z+&gZ@=VFdcq3aiOpO-I_keu%PF`QwtOFOh(p8%OUiRu#HOdSoyty*&VZWeNyuHrer zznDAoudzx0#Xtq6e-9t+9>0Ag_ffD_m;GK*U7C#;?^I16qE8t`296}^sW4+xHbQQM{qm2>H-%3$sC*g z_n!kyx%PtG@_aB(yYRV~V@nv-#oV9D7b3l%$0B{$JrWk_1gd`zJ~0$5p!WZL9_XT} z_8U<1M_bhXMb!R-rrJ-U=5MyB{X+EQ&zfp~0X4tURQp4@&k}|F4Q?b@e4QDxJpc~Y z{s`9N?_66YKl`_#>MndP=J=p)E*_OUa4!m{d^`FrY_9(Z5O^}j2mk2SB>A4*honKr zF9U$SA9sEbpNl!R!)BkzeH6rV&eaUl`eEF6d+EjjD&n;An^5_DQ{_Jim9O!YKbZTM z55qUkRbKQ%`wlAK3J2C0$vwbVttR;&$tjXM1b{jXzG>i2RNRk`P8*pfOdFs6>TWpR zxVFQzy%u*W_*~5KL7lck{{ZbY@bgFT(RTD(m^Pj?`(%y}uHFUh#-8l7eHeE>j?cv$ z+tHaQydLIeS2Il8pX0utHmdBj^3|x^XsUbzT##JlYX+?H2XjCo$y;6JFm3x#`4m1e zoQG*sTy_X>|J%TOUvp0f%+bJ;Z}v~~8#{It&egZhcD*d zFJI20!=J)%SKYH=BI!-I7atw2b@+q1Js<^dcD1L_6aLG+dm1%A=W8n|kjVi)KDg!o z5K?f+!PvnqoGc1v@5;TywY1N*^zPih{S5BiBUJ?FT{(P6-tn0HMTk7+0krl3S7Q>z zPvzbKeDH5v#V~|FLx;ZUJ7q)oSnfjrhOfBVflGMFEgl$N?t$TBx&MU9$=*Zq_E32; zRNmt&e<-(wn5Kw(kKm&VNoECGh7Y_GUAwudsh{8-d@knrAfe)^-2Xs3Bd+F{yqc5z zo4C)^=(;3CVXXbZ+{uUGS>b9!u$OgVyEr*cd0MF>UHlTV`3XYtVy^BW#fmFN{ecy6IPB-KXU@c#gRkOY5;-K}AT+Og@HQaw3AMFLPC~JQ(_aCtl=3MQta!;V<2YhXXTlVo5_VKrH z<6q&UebjGZ(LN*09UuPP@m%t*rY`??+}Vognu|HM!%jSrqd)Oeu4Y)YyHQIPjkXtC zG#2uqt9YdSQ@Nk}1vsNMJy}GhH{hd#&1T=ic}X zklXunp7DJm_b|}QnyVKu*RP{-N0@FIxDr63D|I_6|4>uq{}3u)=PQ3G_a*G80R|y` z6Ca%%ax0*-eBdSj6{4SODzGOvzX%%upNr6a=}JG9+w(9C6|QCgk0Yoxg^x~wVi&UJ z|D1^B5!`q^K8JWd2hEfEdSaNXS)N?=H-cQ)z^}dpOr>l71#Y5p@BTI1`9$0TL_++O z)oI8VuK#1i0KbQyU&2S9civgmSeuMM;lMlZ)_sjBynyahH@yy|Y*Wsi6BFBTNXDbgSx#ZhTz4=+( zc^^I(b9|8N{h{20gzt~y=V$Se$)tHx8|2QvS|A+CU)=upuY|66-yxa7FpuBBoy%Sl zJ$y08_GBJ^N4{_#pL_!ExdGMgz(Z`yYPv+R( z!Yg1Oa&HSD`k!#;@9?>pV-qsu-;^)h*ssLK{yz7}>pa-qd>iC{eBzC5Y|QI(yfg5V zhu)Q2aSuM|9&{V~4Q^wfMdz*)#_l))bOn#S9v>Y50TkVS7zLk$cjxC_Q(-#ai#xx9 z&&3=c6DfeS;BHEGJi#6&SF)-h*jlQ%~jo60N-5wQ`+r<=>)(FZovZjYGcb zn_D3{D=fC!_S4}w{m~^%W%4K zk6!N|{q5YoEntj(_3{4(m*m_iCitaK^7|)pzxs&Ubw8P_C0lP|vzO-&oPJoI{A6z4 zm)+ybW_;NpUsgMnY`s|@KH>}KL*WCya3&NUbA`W?n>d3(JYS!m^ri3kjZk{Zm5QG| z-E74B{xbOs$zlsiK9ze{9#PEsPaZrZz5i71zx{WP=JWpdmT&X-7yR#Mz)4)5|F~=V z)44DIIP(5o4Q-_Td*d^?zed>`Z-*{Y|Gn|kxqE*Cs<>B!LBhZD|1|die!di3C+@%T zGr2zl&9447ysJKwyY8nEJo!yL{ps9Me0>k}5|2Or*k^NR@Z*Xv!F~UY$yWwoSxG*8 z72r0v_5Z^6+fU|_-#?s7e$BzleSjkVd&f0c?%d#?PvbIh*_|NE16wXT4#Ye#c-aHI z|lQf z2l>SHgKxt38~F8ke}+HF&*0~K@wt(11N@TQz+T?;R{S}NH`$Uv|0n-)@BR$#{60Q6 z^HJ{J=W`U-9XKTS=d~KxufIa+4y^Po)-vkedLF}L;lNMM-g?1*e>k~;9e*AtDR~)g zzY-tcqZh1l#MiMbxqb)Ru{P1Tos_ZQ=O zN$%R*OSkX1GQa)#+fP65+T1nI!}B*J`R#XK`N}INc3=>~O8RpV#fcJMY2FU;jMqi#&5f zsD$+l4PeTjgBP)#o8&E9(LZ_OW;Yc1@%-y^eDf^_b2hL989Q#35RtfN?*v= z>l`G>&H?NAm3-nwx5%r8@v;|(+2+re?8<%jO*;L{xW|z|Gash=yKmy~plfnP0GjW7hB<|FGLru za9>;)8ra`l3{!Pns1tP1cgYX??ocZ%(<^=9l`Jf~e%|AYkPJ@~K|k6=^jb}3mw zcywk210ud+mv#GgoYLb+H=q zOlspndlGtRD@dHR9>x+T?p(Ui=KOppwkFuc3xFE{FyZF)fI98GP?PU>tLtFy4RIIr zZ8%dU0P3wm4Ibl^kW!6cvw@8b4;{PmR)IWS@W*rE&hqwSS02AHzWb)OcNt48@AMS# zEx8EX(N{(kM{_DAKbQlK86=K*YtAo;M|cc3cDqvsj>zMPCjUqd6jb(uAP=B-3|8`yXi&_;8NK6DXlBL zwbp++7w;Ob^UtJ90E9nlGbWJy_Vj&7?eEBuby76`&d?v3!E1BRz3kA9?>H@Qc3M&MOrr|DnH6mH4jQ(2nKp*2LR&d>2t=NJjR{ z_V`wN{8xNQ=AmD;K4Yju&v8bZf$m)%EB7Hmg`T4(bCotM2!& zWByNrZT_J2Ez_?LNuhQB!`4fIf!~n1;3TroPo*Ar-TKG&fLpz`PIG6^4x8gxT>+A6rNe;ifv+edEFPPCC1BjF^b(^8NHGD(0>RjB9K1<0p;AoC zuMNckmqX4mS!f5QF}W@vitCML-k=iH^SDzD+HNGCP`Tlz^nP$FeY0(}=Z6hGyTjeQ z#h&KU-I~S-FW@}`+!vU5ZB0^Pi@+B>DOlEMo4zZ+{N{<|y;xliR&kukEfb zmlxM&E4x=#E6e5e;oaqxS|v%{Dc^C&?vY&wcI|0XynCkFs3-MWdG`aQ<=M#$_#WC7gj6vVtLmBmutCl4hxyo8;iw8tx`c@9@!d7ja>_?tGpjg{;o2L zu;Q${R9e-l7(=bpsIDy6?TOOj;!3&HSgErl$%&je#IT!jM zOBSnjOr>-KeXp)a5A_A|b#=AK=29J&XIx+Ka&*MrR>cFx@Bl6aAOjAh)@QSL%`-^_v(H%fc zb-BV>z*9)Tp2_l2|&#YSmnk>f#y)l#jrWY0&Ci(4K}2zl!> z*gJRxx@)M!1}rWu|INYNFU&6-9T;FZ>g59#Mwb8Qm*)mQFgQQB_M(ApxV2>fH!ZL$ z|CdSbV_KX?v4w8s|1`<{093#O+jik^?ql12SDW3!N^g4EA-*}uf4xnmEvRInTKT(k zZ+YLqckLLsXUEe|OV_sWwuN2gKgIXoab0xl@$YiY|KvdK<4+GB{d#!nlXmMb269ic zW7|H5zxlzl>?%~?Teh6tcJyhy>fc4}S^QJ}cedhHqz}>qi(bnA@z&g%2llWSIfe!- zNGX3yuJL~V->>7_2L|6Vc<D}VZx!LJPdv%x0@ z?m&_tba&vpSUb1vDE|(;LJ9|7eBI!`!+&4!fB$IkeNt=i&A1H6-`qBY&T~BmhP8#k zuds@|mEUmV`}M}akL9i#{7L-xQ}}!x?--a7I`d#@e2F73+z`eou;-YWQ>tJ)z#1=lZRr`~!HTX3?D66sMV_NA6UVitdS-x!! ze`S^OT(A7LdtdB}bK7pKeNX=5Z#+Br%$M>PzMTJj^5y(fZybCx<}JT_U?P{lYVZ#R z4)4ex9k?eq@bc}0ugqTdH!{IR!f*_t02{M@cr4{|}bVL>gJ zDgP&gwCz@Gp-7oxi<8NJ0uUBzTR=?yU#5yJwk7{Q9R8-Yxj`&2CI6AUy^_TiSdxFw z)*KfTllQs7=MKEUx?}+(nbs`YBh#8iYqVADe`}Eb#Cy>PY(?7HN0U_5&6Hq zI`{Q~DSNwxGUR_FhvMs5%uZYALH=(!M5OxEVhbFwgB4q}K>n@RyV?j}X%7GS zzZ%Sa%xz6JZtng0U)`Gft-<%{M&}Llu>%nP>ip${a|4&NSC?Zv=JB21mHR=5jybvJoSnxR zGm5j{#$gW5ZJQ4RHD_x0_h3Q=337_eVLJbv)cDOaI{)QVvAIC!|3j+Se4X=ukt#N~ z<^0F$^0|F;QHFUggFnz=~SY`f2&fWzL`fTK<|}`?10G!QHP7 z<2QHH{I~MCAAC!gVsk9b!z(dDSmr{S|8-x?eP!;T`LCw-mHB?=e?Oo5f%iZCbw{8% z5_9y-|Ca$Ek=wW&Y{>jGqm4s=HfPKTpa~x4X_^0l9Co<}4|AW)e}iq`Y;Bw8W2Tel z=GdZ>=F^zzr1>LeI%&>_nNFH#VWyMjE|}@0IrinhmZXsDsDlX{_WX^(_dWge(-E6x zj(2(ZphmdKTgFdFy_1cbqgSSJ^UcaMZjM;l#?564R6d3RbBoIVEj%Qy`^G@wrlSh>?5O!G zMIDm{YZM<>@Or-zGt=IC&F zeRK+%hT=rEaDWN|ysTcBI(lNdxKDH}yiu^K`;V6zh4ZVm@}gGpj~0^gGsOo_pBWk6 zvpRhL)YyaW_wdyHhsTO1&I}KQ3iVYfl{OC+i%`N8%jeGz?M;T-k88RQ8coMQBOQl zm@Y{{VPElhv9dgi{&VF3D-=;1E3G!l^4#hp@D^gqd#)`KF7@ z*hr!+u_bm(ekOrDUw)KN$+USusUE8iE1>M1U1_ktLq#YFsDV1a8(mjONJGDFlT`9iLm3!rwmhMEk+v9iNjjeDW3;w^*i=Fo=1o&y*G-U4w zWa|zlj@;{Knad}zKRJD*32ZhG-qD+gK_{jU6pzj9DHKqCya;$|R7;E1*H-}l)%rNL z9JI)w5dtusutU_W4#4k&EWSwLwgWOkK;mAYtkKt3YAf{u@bc(1x*%w|nyf-|*>EHQ z=$GVx=yqs0A(p!bH}Bjzg#Yh@hOIPTIZ|qr4Dd-g9vm4Smfla-M{7`=%@V%rK$t?C zdf(6okRJoN#z3wav4>blT%PVIqLRTnEKfFSn6f-rk> z#?38nDb0^iIgSS}VD~hmaZev^&!X0FN3b16A5Wc;{EqZ)uM%tF(u(B@4On$SD;TIi zLENI}1-fZcmt%y}(TRg3<3P%LV5xMzSXWFIF>XK!Nv*PuUR69p+AWz|Tdr5#eYf&Lw}V(InP|BlwUu*NkBxSMO>%eK(atPLHgN&iXC|c&M6N3Y0d6n* z>do%)QCW-)7s63?!Iq$62f!UIFIN`pzzu8Ul(bt4>kEMB1+b-aHBe)Rmb#%7s}x`y z-`e%Afvkpw1abjpA~qng3}RG3Kh^q)(o%(NIk)8o-67o?p`eE9*oq?8-G4Zi>$v~B z+}DusDy14*5+RXPRBmuq?wP?f8<3#lk3v5y%o}Cp^)Eta?x|O>M2*02v-F0%9n! zjsuKOak;TN!|0U&Ne)qEe_%9<5fVCh`9QB-F`% zbXtSrG5WAJL&C`wXI9oITN9gkb{lF?N~G|{Y801?<$4kPXSo6_lFU?> zOSKE$c}O|%KIo46rGw&jf(&%LXwrTOzI+(h1Jj~_NQxA~nr5>JKljQ-lZ<$c7v$gsOXif~_r!vvlfgw!kIORxrs&LX_sUSOHjlKh8$a!psZ_G3dSMNF;Ontn z%DqRCI94DvCAS=0U0E%f?84Q`LUYq}`<3sG9TsJfV`_x$B1r=Ws=(*vg9&^~)`@{Y z$IT+sw1YRlwW!;v%@mP>qY1^02U3XsDFhZ z1Un^g99kDU<*Sa3oj6e(FPu09a#)-iJ8|UX@uXgXl2yL!KoX+V4$qHuDqH`>87Ik?7iPp+mN~u;1>#-QmC8 z<-gqv^zB&qy652?ypem~H%bhXlonSPO1Mvbq2sj4pN%O#tY4@%pxp)Phml-xKaDm9 z>O`*2#0w)EDAmOB>RMy0Rx4d7B(GarX$X%d)%&!$Q@SCrSVv)QWUoaBIF<74=r4s* z`*`VmNBcN9(kga#1;5guaSS73XSz#6;=J#EBz?v&Cc64>-KjJHb^Ws5oml;{lrz zg^2SyY zEtS(lI(ob?c4At(LKW^R;!hV~lwkgghwt48g>&auW6iZMae_(6^?7+z*qG6?)Z&@05$CB7WGcy^;ICb#Q-mFf9a~vZG@(=ZywK>5r z<+WO^Sii6|169KVr6t%k=8v5|1&c2fPP3QH_d4NQ%)3xrA>M6Wlt09s+3J!AcpYaw7==aufo@aXFmW{N$=2krX6r@c-Go~a z*_Cj0aU677Yh&D`?K*Yj^Y0VOeDJVS1&IhwBF)LtLUfoG$0%&RQmqaL#~6pTVk5;d zrT}s&bA4%eAb_y9kjSp5+ad6DcC|E6kUkAdrP`zLCXldBsOz9xSS`)MpNE%Wz3kP? zh+alhT$>_L1rg%=gA6uoRG_RcOr;#5_$%eE>Xb=EdT}Xax6+H~bHT~AhG!79EX^|l-nl(btp?#TL4gLQf_SXX)S9gO zo7VRz0E!W7ZMpiowF=!hJBVNKD+P^(Mkr>WjvhHRRVWmvCr;ddObD|RK=z5_?Hm<1 z>Mtw2wITPg%l6Jz*9+&*Co9l>z@O67CowcTO?%AIHjUbLN_TP>$J~{(VCZ491$QH% zJSg4@1(C|<;K2*S16(w~414!siW=}s$_yFGU}CzCV-7D6QsCvOHom{6+^r!P9#ed# zNMi!A#aIlpqoOTRNm@;*9sAJRysH?oftxM+x2B`75A6%g-SUbk!l{4aT|ih?*C67q zXd?QxZfTYd(iUDlak3~9ggOPEtIjqSrXlpWK5^fdrgh63`^g=#uPllZaFOShDoYfs zu>#l)W=hiaX91P?9)CyNb`#9^xc(8ms;lZjbyaSF9foW$MIjE%aJ4>5AHi|e zhbR}nCfWg8FWa5<5t04`Bp)+9hk|aSrQ*Yr?yMWHZaDS$k2l=rMJ$o*Hu6#!r!D~$ zUtDm5q^=XJqs0nlA}028M^<2)nu1DHu~o-GXJv^(0UlAZUD0+{X73c$va|$Uwn707 z5<*i1iIU^#xheDjOiH~7N2o_tUm7n!)2{0gSE1< z-`O1*zo8+Oq<}CXp9=H>rx2kVQlXAb42m9E2DRp>;8}{bL_{t)$hMeFWZWYgb;k}l z-SHAE<|*!AdhAT$NPsHp-neEF5mXQKxc3CQ_n?# zVBl0A2R*+BoU_1T3GE{PYli*)0zgaO2H-ld>@M38%Njgxr)gyIdFla)b z-RfaZlo#IpZ5W3wxu=}sZ0ZoxUfAa_lTa(eMXYgZC3#Fe6N$gAURF({_<*9OclmCz6{R@LyOErZ zD;t0j`(WeD0o??w5?${bQS!(2C$oaVrjSAtg!R~un2*l%+g2ruBMJp(pKwAA`V>jt zLcs_tZN0voL#ek`wyhWiD+a>?Owi-&;tWAy6-s9q)WAI;86dr;I5~z|y5K_(q5@2+-=#2qbG<{D1p zBa0jcu*udt%VCs5k>+3y87V831ingp;O%j?I04^DS;h$O^o-^FvcayIarpL3SWqvi z-=B=VBjhwW#|UN2Abo6F7%2?;i)yFR-P3d9j^@PxY3th&9!*Vdo*{cz8#Sjr6BRZM zU^2&!GL4ESlvh+@8;Y~6_PTH2&_Ri#iEgaBq-DRLC68w0fqyJP7YJC0!fb!BX4h|Hcp#<%z~&V zVqyjnm|ELpx-k`5ixdFfNu&Un=eMD6TXcv>b! zl4hOgh^hiD>c(555<;&ue%taK;|$$ zW}85F1xlRs#-Hu_(c~~M8M`Kgk?S6iJlCa8N+c9@?4>dimLZW6U!EdT`;e=IIU$ve zuJ2P?hUr7d2%k-R{faEqfTg)USE@SVAJGW0t5mzyMYHxM|tMBXf6#RlNGqd>ro^#*H`S#{koH&wJ+>lT4Tl? zkjgAPx1v3g%Z*+k8jGqYr36NV%dM8OXkT<_N2CDYYvEuPipxA4Ccuh$>N*5ffVh)DZs0(kiG-MY5>1)r9q`GKSPLo=xm+%df%oRwzfoS@1C+41V+@UoGXx!w#MyHrVHON$66J2J+a0E6kzI1gN^g=uqCshCXb5y< z4acV-l={347vCg=m~*JXU^>6S{>YTNCO-!2qClc>{Tl`NYqX$)#9oQAg&MlYTRDPD zCxTMAhdx67KLtR`!A`=8hd)1!2%dA0zDX{l4vRuVze9LV*^ zP-ZjLn6L(NNDfudi|3MpI&Uw=sw~kZ5NGdrvC>#zmO8J#00#r0mrQ21*kXw5j(4(U zLW9famL?rXBKdg4>9JOsn}sv31G>mCxmmj2Lz*F{kVT^73>3R46y^W=3}~LIR7tk8 z{iQcl;Z;F$=2Vp--H472zPg^B!k1{FRYbW2Bc-@{79Sdg!}Q@(An&FR$b@P1M-#w= z9xlQ|SlMnEnZSJ^x>7+6tnjFu5yqcWmHOJEgcM>|dEY26tm>{M0m0@|0^%4A{x+vp z*}Tl;4Kp`wS$G3@h19n0!hU2L)8a!ToX&phnp!D2qKKE6tyJ5frJ?W06q`}6$xZ-$ zJm#Ub(;K;1(4OMevkn=D~q#{V+naGr$<3+9UV3NRwG$UUL zgIL*qKLv!yxiJ+dfO0Y=QA+FC>Kw#69M9;;S3vChFh;UB2-!pEQ^eN8L~>kp%TQO) zy$W*lOlcO!9zx!nLinr$>R5l{w^&CB&^dRQBMNq#upe%sHT+e`!DN{z3z}Xo64pn_ z9=^NWOj$}QlHn)1?5E-;0Fj={3oa_U;$7P|g2b1VzG*Y&gh_6j zHAE;Y+H+y06ra1v4J<-F*+(jAiSuwiqGwXO!J%Pa3A(SJD~WQw&E{^45fuMU7m*wM z9J!uslwl@dbyHReP*zo8Q~rCPRQEOmZ&HC;sE)~S``6(CLS=A;0Sd!xQQ?BU)mxP2 zbP=sSq9!sWc z6)JUq6P4P$dV5pi4&t^|e~&OQgh`9bSc0Q7nV6x7?1F{lH7BQzOiw%nOowbsVCN;^ zKx}GWUf{%$9hfHPkKoj(TAqcf5OI{W{vWF@ zKdMTOz|m@$D}DW=tcK(nNn7q^14elkKQ*MxSY`4SE(Z8@lHx@P3-xl68L6@Atvw$G1HmPx?4-2>2kq2m|;Q# zRUH-j#~ovK`wn2y+o&CnDZH9;xfJ!Num_r_paNzDK}wAGb|-jkhUxKrgU6fW@*w<9 z9(8o=05BqOaup}+g~YkSI*w4-0Y`~t#1sVaQrHrwLo?K5yo1BSUKhsEL>kj))i=gu zX4x*1&_Yv>;cE$09HC>18yzeV+V`o%pa%yyW=S%R8Oh$!~r4_iM*cp`Vc7(VY$+qAo=t|aW(w@fb zsh4NO+~WguU_K#FV>>Ni?KmN7Y4(w|dP5FFm@Z28Jg3%U&tl(5&_Ee;J!PMfBs@Tp z#r4Jv4)|!`JWg_zx*h;0(aqrqHmYqytcJH!(?7zAM_#rLb{5`sQ5iAkwMhTqh2H&v(XwZT-&ndGT*=^1nr zD8M4`%u;fDX`3jztY%+5%U$NkVRClZZD6tKI}3lCS!m!&I1FPE`!fM?g_m;`TJ4DM zmo#0B(u|z>0_ESlEGH~aIs^mzB)nmhAduxa$wRC_4^OKCDNidoQnr!cbPvZ}=~i1N z>`OaYMHv9H3f={uG|!lb4y4Y~kmdNKPdzOyjVj0n%+U0zK)93b9ErAf)Bxn7S)73N9;s7!*dWXn zH2K&I?zltN8V`B@arI>at50^NAleSVW6#?^J}lF}4Z>ZJTH5&8Kf5fUkh1nHE}cu( zmKRo5Bs@9}G8ZS0z{iP@#q{dZ;H4lcQ>#e>UE4-yt5f;UH4_;1yW4GeUj7`C)?>rx&{SLU{e}U+h6}X1udv& zo9tKqpbeZN4H>o;A80FQHSCm)ZU>RVeh1tJZ7b5Y%5BFgaW&!-9-2=pah#KPRq7p8 z8B%V;N5jSgp=}n51623T0KA0*3f!n1A*%rGlzNBGpT~JsqE@8d&qqQ@CE;?rG80lxM01peBQv zedm1o8NhWEuSXtkXt)|3=T1XFY`%B+0JuPCny!v8qN;3G{1e99B#!i`1@cItrOv{+ zAd;j@4tPy`TQ;S1v{D)GYhb(V?)CDhiV>loO=>b?W*kp|4E8*?bD6vB5kWeg-j{Y( z2wOg~BV)s4<`a(nPBP&XyFd=_KCL-%^mt@c8jcB>p+pvI!N?Hy9Gvc+%@U)ZJyR@Je&(VVq zuGDHSFeh64rfuQ35jwuHb&Yv(MB&ihx~xO7EXL#zb(ZNM!e6q?9kx?%9b%u6M!)k> zJ$kI9S@1jS#sZS>YC?vZG*(S;0o@U2Aoe)H9B|i~#>BWRpvFe22%fKpXEw$v5 zI+K!V3Z81hd!UY*AVc&*DkB_<b#Z8%Y=1eJ8hNU^}5@L&~s zcWp4kJ<={3c;kp^Vq$=dU==k*rje^P-x0T}nfIXhr(7BnVcIP82J(jzB@NHughyyJ zBSCdAwnVNoM;ZT~A(CJPb#A*B;B}P9W(&2LYWU1QuN&DR>;%cTfq^>Z9N;GMSPxOz z1a25;(a(^S(bNsjQN^gKp4((bLP@f34p4+7BsHbp7(|pK&QQ;;7C3l8pt+6tsW8^A z7@E#0w#a}8BjeI8&Q?}6flyx&PxGnpB$V{IQ3rI{h6*Y+`KqA729nSOj5H%$hRh@C z&rV7JYEL`8QTuzvaj-pj%k=pSS8@<|+WG15v6JIR)fYaECpIr}W%5yGDX;h=vjuA+CIrbd#xw?z z7m+75-7_egX^RmyA_LM51Vjhe28o}+ayf;+W+_Libe_!$0>OYkMEij)gPy`YY9a<7 zKXXE|CmW9HfSSz?9+Io64yF?)VR))bMxvV&0;%wDXA0;2a}g$W0}bW*c(@j{=PtYjT_TLH<0z;1vA z+6YK`TfJfKF~)N^elj>o`2=i+3mnOm(MREJLOYes5#iLiQ3YpnK{hz+hPv+M^ijMR z3*ewx+Xq!yHDMU4p6fs=u16j^EZ;ZaZFRf~K{I0JASamA^+=^!E(4j=B^oDW6E2A8;!Db2hunpj5>-yMx=~n>he2UL!L~`iVfo`hTm?4 zD3esvbXDGo-TZqpdo?=V&yg~tPE;kKNPT8OxEeL5n2B{AwyU^yz}$PQ%j*=|^blhl zWXw=oGf!bJTHtk*M+gi$NXJ<6Sjs6Qk(28-+;lx+=8Qv&^cc)OU8Q1TKBjxg7)?m; zr*MATI1lEoRZEH3BDHHNrgmtL92qiKgUMEQr*D8RC77LLW#$p6mSAndS@w-8b6ocq ztH8qMB~*t|Hq-+skh34DbZH)`3soT;NTj)k%P|E^=#ZiVBdG>-@Zt{y*C(*V1SW?^ zE=5-p(>ub~G8V&~sF$KMo7I>zk1bs|fOM2WguX`82*Bk92a&?846J)>;>6M7)M=h! zj^nbc^+&Kb#J7@Zl4MoIn#o^%$6gx<7gXOfkJk=>`qrI0sm<-TI6 z@f~&oc;P%!X0LXzE2D{kC|%E+F}G*Nw2*fDeEb+pPnMeagwm4 z;NQ2XDILy0E4?yaT5YV=HbxdbV#98D5T9Nb;X=^L^UOQRL99BQS_$zC;=JV)*ggA+ z7?}hXQk723GB$1H9tRk$Mk*XN&azDOramJI$YRMrp+Z+(PBk#ovfDB4U}aLR;DnMv z|%=G+7$J>?-83oaBLSH2V16(C{rZgPePPEI?!SeTYAy7 zM>7&F8&JJuPy?Ro&1|o^OF-x#8mum^0Uqx^cJlDpG2~KNn<-8dYe{t0r|cZ?gV{*S zI50;DPRei7Z*8t|+YpnWONIGrWobq+(p)2PzLOf?unN~1-M^_3@?C3SE_RKqXj%;kw^h@5IT1rg_nk~NbM(eTRc=DQ@uF{s#wkkup z@hql%SK{P&AV;vUZ0&iG4vbfp^Vq9Cs{N$An(zV1jxNBUKU+M9uvjRQW~(a+usm{f z!QYq8cZ9t5Lnx;-g=M7HND#s}abn_B@ih~t9zeqF@lyzEsxHH#gwPm)drxUL%?-9= z9xya8D+j3@Xlc3v`;8sd(gD7Y{&_lDa~+mkSf(dprjXS&m+y-C%HvpK-R-IEvw2n} ztMCN5A*6~lD1KJ(1c6MvvR3mBA(}-FuK#lU6i1Wl)230ali&ywNOuS^tY%_Z%%XZk z(UBw=-ljKn%7+{RqGr`_{qJBYF#_Eb>IyJ}eNmE-luLRB_xf0)QKR81XksE~EYb~A z?zr>i((~O#?3*8VcbGT!Syr_Iw*V~Pk0Cb@rD5>PffFXP5wdfeWrN-JhJQpHPe4Zk zA`R7el~MB-G|StpUgq@js9qK|TjKGxMdbo1s_qM?@bR2?Ip%%3j(|=mRe)9y?TdT{ z%-h$r6SH`t58zK-Zdx0%i!!7U(gIvef{<7>KH%&r0z4uiFF za0bEWSvmqYa#sZ2^0+*f8k&TF4(fvi(WN`(J@Ct=sGXV}2C=TMckTcwu1PX&F#}~` zX%+B{Wou8`fN$DmzKgA6@aMor1Ky!6eX69PK{)WJRzguAOEz_4!cG!o zk0?Q@Aeb?AoI?jC=}^Wp8|-%O^o#Bcwx_66q)QpBtTlhEAEiOQf zC242%oN($_Qr*-eoh4qm&po8RdbuZqib7^xt#&2Z?LN~yjGUe#t8~+fdp*7 z5HR(0PEoM^i%#`N&K99O2lNTg#-(_@CU0h>vzLfUX6;)A=WR~Z4pXHLHJ3zS8dU_> zIbd}$6|NS`bsDU}x2wl;Um3IRY`8J?!E}-131@HMj2FbTo4kBUI5w8}6b?NHLn8&! zB^2jtD{HIZPi6Mefvo4L9n-7JX&NK)KG3NX$c)tIv8e#7UnUGoh8hBoU18FzIO)KGsszN5`_4+IxtEb;z-ORbS7P< zDE6a{y+G6nQ&)|taKviD$${Uv18Gm-n}xOB(2x(K(8a`C#0!4RysUL%I=rq&>L*Z~ z3MK{m%c}kf#Lh#8C+lJ=7T1{uTo?DSAcRKtf$Pad=0kC(|s&)X0g2b}pI6EA#?6rdF z)E6lgeCJc2!GOcP%Wq02#f~NSuddM?F4NOqzfNPeB<3Jm5#KuVa}2-+8&(_CIk8k= z(~@#a;0aV$z1ev{Mzs!07M*<|gqpGRwci^tCBPxhqlR1QQY444t6C}B_rXeAS*=$= zBH-)5L;*HWl%4gAQj?w2%kObjXQhQp-KUP_DH^`{&1CUSSU?l2GK!6keao6QfUp!s zybC`Mjuk(Oh|MRs*xP#CPD2@k7gQHha`MF~^Fr@F6x}SAE%p^1dw{^`*P{+Fb4v~6 z2Ar>p2aFEUE5;_sX}BHW+#CCGe0aOFJbSeG_+;CTR*j11I5jp8vD5YfC)X~ z=Dah%SZQ_^&M@_rxe4sZv?{}QNsl3cRe!Eg;o%MRAw^1hI+@}OgjyqYgc}Tal3SZY zcGG}F#^P?Hwy5BpBqk{Ii;zc7&m13d`kQpu1#WU!-mAL96nb>prTVN%z21WFOOSk` zhJ1tPa3bqGPi2*f^gM@nQq9f5kSfs+`<?K!l4b$GH2qUJ@VEI&u1Raeie*4tF6#unb^p7$IVRMNTO; zR)B3Bc2Qms0{G?<7r8)5VLG2hC6UErwmS3mS$wSz1eJs7`gin|v=s7a%Fkze3PXyi zj^s1L`$&vhhl7HFwA5Nc4q&-54_8pLhYDVuOAw1$FPE0*4E^r&q4*9rx}a{vMqoo3 z{@4!`K|iOVQR;}Iqh*KS)UbMi4Aqh*;H0!U$s_4}cvL1YX(oGF+oKf(vXD9geZnv(Ru zC+si`{OF*Add+k17QlI&%Kb~rGHg69~PUZ*OH2|1_~gkcbsO=TVr2soc!fdbnRsCBi~-A;wY?B z9WAB=Fr`(_1JaqpswNQIKUS^B1P06^$Qg^og@w{;1tEid?--_Ft+ZG~64rTygYhf` zoHLIZfFy&EZpBfTMgUS~e#$s?`bClVSEpZ9S!wQ47!!Dd`cV-VV^G;VVO00JF_}{$ zyXZWqpvlTQ=);}JF&z=B0y3snQ&IgZRM$sqGTA5>40v+`TSI7j#SEDep2g zLOZ_a2ro$=YuXRRw40fWKuQZKA4QxahYiX(IbK{^vtuTSp|Z;|B;HSv1%$H{bR0{X zDXwE5yQVTRkRZ{L!~p}(`^^*FYs6#+kCE!q+7gU;CJmcA7eT#Nnb&-+qSXjXJ1PeW zGG05O3a`jhV4GZkH;<);i3$l>PF|O^N{XGKgaBvLfq`NwO@EY6Y8!Pza70Le(o-v3 zR1;0Wap;jbNp-0-UlFBcIm+=PQOfY=V-l<>Jw@EoT3w1V-*nCZE|>VEzqmh+d?IRd z0;-&ra{lBTqcakx@=F$FlM*qq8e?Gu0jR1fgDZ?_ZYe=DV+=IZABa!knMoMYmJp!e znHUmp=fKtHX#|9*Z&oYmpGiNK8RQ~6U6?aFEr$7;mX>tW$6eYi48^=B8yVtt&imfb{;8CEfq8!D3KaOHY$SzDf6FdQ) z;OYC-oL`DF)5<{Cmiz_9M4jpCv4(0E5ietM48bJAP(@cjB90UxcHU<1R(_LFb$>F| z2AXu?JRX&A){#O&KwYLU)xoraWOz1kRt;R*>YWY}T}p=ZTc_T~8xfkkHc6B5M?e@(K&=1ElK#M*Y(IXppsLXZ+rT+Sze zl;$Ii!GVKim@(*u2tQ`daCU5_BLimkS>y?Z6Y$+ynRR*vim?Lz9dSyJLS@F3>a_z( zP&Q66#vwG<|ri~J+NypWCGb{qkz>Zpyo>($O-s>OmH+D7uBWUt4g!RRAHm_4F`6x z7|9-uToGk#qMdbn_n`Oxb^soAYx4js+VNCqPgZ6lj}iO~L|PWR{DK?;Db%ov-9$`r0J#-K(Np*#oOsA!Opj=ull@X*R9LDP6sp?{2t&J3P zL;0x=LK~?l&f{a#M};O_k{FWGpLWP~ie8d@!(FBB`BpK|!Ri#T1)xoI6Qt{lA@HvG znzU~{l;nQFy`?RNu+5VLkDyx0FCYceD=_HGVHY|l#|C*)kCszwyNI17Z`;cpxfh#h4y z9+yTxo#oO=V;C|HDWPM6jJJP)Ls8l3>{215!VQ{!%ew<%8@8VT2<)-$lSd{w>W|}%^De;FCsj%FW_9&bM$w60E7E6n(3&CH^ zp<^K9DuUXeSd~O5ohGL(qKgieQf&=Fqg7p{(HUNE;nF(`muQl*<#7f288xJgk;&_ zY)#i4K7}_bELMs|I|vXRn}j~+f4lRZP1MlvsVL_moFhikSr7rxp1+Bek=SOU#B$~! z9GEH+e|vWE*b_}5>oy5T9c2`#A?wLRa24dw#8TFt{qtiJD7t2=dMdh7x>1SSK)5k{*cYp13ajUqDob*hWVFv! zMK1{-6bVv-r(_TD8u{Llm#j|hLKY00n2Fw?zP&Kvx~9D!wX-tImE}flr7HT#={o#- zfCCM^6I+oNsgxg8?FcOQPzy{|LWXZSaKS&2bzpF*XYgiX{NV6n$F^J|QdN1(L)j(a zWpOl;&`CXPR_}t z?g&5kD}mlkVXp|GBQ*CHvqnlHFs_7o7v|#Kl|wVZMu5!0PRC#bXnS%)GUgnT7N14SAa-GS9Y4T zwtAEdl+(NDF_2R>FB+f7_PMl1?^fq@hGAu?s8Gw49A!JiU?ao(8)&rjs4|Jf?>X_G z)xccztPzwt#Cblu zOtlUxk3_bc2ZCu!tg2J+ny`MHT0Y2>lg=F`_D(Xw))Der;J1ju!P~q}*>8fNq;syL z>u>^Ip5G~d;w8>vG(S7NZKAip+>#4V)z?Bd3^HZ^u#G~1B+k3Nth2( zc0gf5;w55wsZ@V->f}UrpKX4~Of*tkSrM1)zUnFH3g-OZfX`d87}>#Wassni%>xz zq-AMkO_{Zh9rEDQotIDm-!{8NC?4`W#EBC8w0bf#e)7bri4&(!o}MlOYu(Q*vh`JQ zvGf+Nn4)y@pM#&-{TjacKuNPT^mDu_U<425HYkE8C7d*=(Q}KW_Zx#mk1HTbUGpST zqm}IoO*H5H_x3TpAmX`1r3CNIwHi;$X_TP9)IOziE!Ck7lUz#zY}su&G#sA_i;X8Q z@q0U*RAOXTOzn2Xc0fb0?5D)qqF6Q#J zsbphEY6mdgJge7BjB)Uw5}rL|AO-)j{0Klt;yD+QwH@XP<{NhL~D*#EX7;41} ziPJqisE~7f-LP6m6QjYZv$YsJq8sB6j7^*vh(pT5nUx02aEXQh>71K}OU&D@XYI8?=n+*ao~0BL*7XjAj!|^ZfD2WuM*Fbs z46m+2Y(d)QzGazm(#73(BShaRul|3Olc}GQP%ExC#w$&`G+;~MsxC5dG$)W?j_Jk% zgs9T;Y@Mg`5=y%S6EFMjlhad*2xKd-1K&i_b^%+}@|x}(Uzd8rNA?ao8r6kIQbzIY zvdqwkWtm$qu@UKgJiC3s+D&I#v|!vw&T*!%Q^pHPhmwtP7w*(rmHT0^t2feIo7+6z zTA04eQwj`$0cDVh%VN3{Cr_yAz=Vo&ZKci(e^@lY-o&z*SS@-7sCgI(jtCQ}j(T^- zD2d)iP-CHB7`Tmnx(?q3=bUyaVpIzYlnZ6vkiPY}bDV?fBs;I(>>E)l4p%ZeVG$&s zEEgoTw>sG8H6*9HEUOjm#!TwZ7SPq+aVAcef#`kM_SY@Zp@D;Fq08%VmZLxdM`>UL zk(iUk(oAJ>Vrf2+qlL*qm?(!~iR(bv<}mpRz@$m1pYYBK{HF9BqzP+6jIKcZ86xCauU}8+k(VZOf3zgULS>$raY^g}A0gBSQ>eI*AxOPYFNWbzr zq%i*AlFD3~D-j4*y?QC&&lm344Gm@JY_q8LE(8 z00R2PbK0E>#!Y_qMK=3w%>UjnNQjFerVn(qMfT`v_^*l!S^G)sWG{|%BD(oPGac}7 z)%!`gZRNuy%%9QA@;h6lw=wE7rd1q z)6Tn6p9l(+&0=itTL?gQ5rr;yw0D$|p1*417)Yq5@0Z+8jS4My3zh2pf@KaDPi*ix zZZpJuj$}u|pph=oM%}+Lm?M$ed;7bA0Me<56%BRb5zbNSq5cge!tot-CKP2EC9J^7 zg>#ecb?m_!Pdgp-?~L$({uU87IEPSH#)> zj|;Oe_$ExkX1AC)PD%bKM1!r-#L|M>1SjOrmT7bT#XU`q6k=I0?B#~jB!H;5aN51w zt$;|$bm0!kdHcJ2U{=ip31XO?ywxGn0c}G&#{fH@-5~B%(`p!t)19qB{Y4O!zp!$S zilg+>YocD^%=NH}i1fHQ^WJ6>Y2N~@BtPF;VOCDQEW@;!0jECfDUI>lXd)?IxviqC zlOJZskHET_5mzy+K+{7s;*r;vY(L=AM>Akl`ERGs4?pZY}%IN4e~LkiGX z0n?_}MPAR()tYjrHjUA*e|JbiY)Un9HcKmVg0CI>A|!}bECFG95odSzW?yZmJY{HQ zEFz>q+t8oM7%lxs4YDVeXDjC?$_0-Wu=*dJ5p*L!8W^~a2w-+kUle23yi3# zF#{9tFsYe+0RfR>Q=)Xpt!Ti4%&*s4qy%kp;wlhAIS&Bh*?y`%4ZOBXd=o^JjeOs2 zIzvPr>8rCy z*SEDOS*F7F@QgEz+*%{`8jm1^b`sjsQ*sDp;wD=s!im&wH>PlPUkRI6FJYrE%>aP| zYp2<+v7#I*kMh--npjj*`>F}2`b`Q(dShD+LEAD10z{fEmdE61ypBY&M*=czv5_wN zQtlSGgZp~)v~i}o%ZSrLXk*Cs)^YKB12;k>8C;7oYHh*K z2nCy7yA~(bHwEXMI5RvHZ9HMC)DN4kpE$Nq(7T+&V+SO)N|^YpqC!U~{$G2)h%kuw zT|-Jbu>vvH5-l=>$qHkRDy^sOEjfTn7S7mN}TBmVM;htqppYFY{b&gu)9HWXXid*(>Cvd6dXhVDeE1IoQ(EdW}u9>rV5y)nAU|l7{M&vL_K)CVPc<8Yiyxc z%}k1!U=R=@=>}}EOoit1g{{lM0>jWvPZuApTu}c}AwQdzE4t&U34j!h0f1CApPV~W zT3i#M!Py&Sp4?_T085g(|7il8={lJ_Jrshu-rbyrb>A#akNH+-7iZR9ycDh(8^5hL zt|gK@mu6~6oW&Qk#}M$u_V8a0yx{mc1jZ9b_$;Q!dpHyT1q^w3l{-DxjbX7=#-Vmh zm>qNj9rm2<=V4~SY8~`1&hZrf5Cf>KX8Gr#Aw(uH(+Xo=u=3?(ZMjqfXS=psZd6y6 zqrm!Skoa%Xjm%Lsc&^;8 zp$$Bsw4J-U>9e3>7~0=-T#h?Es3Tj|8yrX2F_q6!bRuLtH0d5u;0b6MG;>Yxb?6B3 zUabmu5ATxTd_9y2qI(ipB_n65KvrrCEE46JPUq%`;NPTi({xik+HpZ!5CmI{X2o49 zdH}9VEwmloWE~=QwLoN=j-pMoF~~U7yx-{}hW0#AT0%;O`D3R~ft{Q@%46B8$--=n zqNkkjBQt<;#tDktJazE*J$d@XseqYU^YEJ|&8fsySsosgnSD2I4VAmPY1B7?z z+GrCr`t=I1o|+?>ya+w3x0Cf#ZeZ=xUnwkkzBkyson+rwD$Xx8R_5YFBCrVi6UZ=5 zN=p!26vpZ)4l{P7@@!B?@hR&@sexz4{&c{-M%#w=1mhzo2x^{k(Pg?I@7G0`s_&^e zVreJvbUYrzsvU>pr9r>jg>1D_3Ut`_rhySA*-iL9nedKyKa4}5-{(!706fEtV^T3^ z4h4nOM)XWroIwsO^cv!%V9{X)2wCt}kTZ+0am+jrufjfs5%DWX)dYrSjZ z?-f#FO(KIea-%uIvNG2zA`LqhP)uKlVX{`l5gcCd_7okruH7o~fFr%VCTXd6sq*Qt zx{eX>heUf&u?!VGj!Bsr=M18LlyRbhV-qI|W1?0teAYJBdPK7XA+tnY@sp|p6{1903I`%$H~d$RWW3y&_Aki@}9+JMm0uLSej z9#41J;b~VxPzv!~CEq5IgW@%n&0p!X2!1CRT(z|EW!1OX_CSBYxdIB!JeqISofxmM zM2zV2s{-%fAnS6-E{R`=alkC$s5ES%HDQ>GdyL!RI4s^LkPT>pqyv#jp-C_@WYnE? zc4HqYa!lCTL;JEvJ&XOMclB~Vne~jt%O6Ny$B`?ml!yv3e6`YxdG~*~B&Zo6#-p2O zX`q-&xx8hPG|yJdz@+QiGgWB;sN?IesR3W;;V)B=Zf9Upew12tIF!^R$y%D@wj^I3 z(f1)wQI>dv0x$}cX~=p;(VpfB8XjSmg(eRY1`N$s$~bRu5&ne0%7$#Hq02h9X_-Sn z8Cvdla!35&Jv}7>IM=R?Or{3W4TO%gyytrm=gPCV`;-BF6plbJVZnw@VUWFW+_4@7 z?o=x&R>e2oad^s59`xY=SxxAuq;vvh&xBRE^apS<-sNCXnk@JI{Sjq5(3g{ z%qV9;HsAri!bcYf2f}q=(Wx7wuUZN~c+|Dtfjk=nt`3V;i}6rE?2*57 z2JbfPI#Nn3KnkS&YIK)N6BThl7`Ml?4->e?HKc-{fFcX}l99D2?D9tAF@ z4ov2tL~rVj#SR+c4kPUmUVBNqOx6AR@yZhLwT5zcP@Q2HtNl95mc>Yq{(~-0MB0$r zy`IEqhjPLcHv|t5jr4DlHgoK5Ph)E@zKa>tNI10;uk9k~9fn4ZCCML7v}LUR^~R zNvYslH=BvJD#}rNU$O#^!{jxfiYw<3wF1uLoPPHYAK3%C`Gs2#CH%Mk61^60)9bh0 zmG|O*J8wQDKfmzO^z|F=w_RWLGQDrtv+lQD-{gMV^-1^Jt_QzMpTFB(-{`K7yXz<1 z^^@*ee!144b=SY=u8+CvM>5yXyWe*G&+fNfx4c5zv+E1oZ@V6FzwJ8Ze%tle+;6*n z#{IVI7u|2W-hI0pue-j(UEk@hf0wzw@D8oN(_Qb$T))r#w(A?+@5kNsU772r-S21I z^)KD^uiSO;PJN$UU+jL{^{wu=UEk?`+x5flw_X2*`)$`fcWL`}J?wtl^`TvQ->wVp zw_V@qe%tj!?)Qh?^_k4|58Q9N{+au2*S~YW?fTl?`u^{6*SXB~y!&m}A9cU&`c3!S zuCLjn?VWYknas7}e%tk}?zdgP=6>5X8PfLby6S%0_08_LUH{Fn*0<|d+;6)kdtH0( zdUNJF;(pt8&HY|?*C#XAXWVbQ{ww#}u3vP&?Rv$CzTd95x!-oJxZiW``mW6NDfip1 zpK`zL`g!-;u7Br#+x3N``u?5nx|X^Ako#@dpL4(8<*xrQbN#UUZP(Ac-*){&_uH=D zcE9bqZJ+kXuD7}0cHQNE+jY|Yw(Iw~-*)|d_xtni`iGh8m)&o>4(`|Y+jYYIezm*) zth>J5U7vKQhy{lZcMN}OGg#Pzyh-$awRn(Ts@T-h~tc;YUQTK8*yd2QFsT6J;u zE*w{|i@z3_Zg1D@g=Ms-S0r$jJL{EN9h#-ok0S0Nfpm!vxNobAjbxYj4()0%Hf$Fp z$SUqZdDkc+?rE_tuMW2RnDcEK%d2?sHtYGr0^9uJq6dDf8oS>*}kc57w^$|n1@SY5`; z^&!lleRYp#r~T4?KOc|f@ENej2M*~sS8$7!yDRI)|6YP0m*Hd2-!gCrzmnt@SFlrl zg+E)uSNS%Czwz_;3>=d3d))K4$*=Gy`}`5y`sR1OvtsXmc;FC9lH_4mupqyZWUIRl zx~pAI;LDZx*z=zoID}tG@;NKmCO;EiICgvfMlDXx;F`zBs()_qklgv4t61RRqJP=> z`##+JPSpSH*Bp}C+pp1w9@mTSzrDwqpLEYpy64}?oA}51zY3r1^FM(y&WW4m{FMfW{O^2lRo}2Wc zk)3+AzxJH{eiy#P&(9t_B)4V{YK_bF;{Rs*{{-&vd7Hn--SdyT=RfM7)Gs?Tzkdb4 zm+X9J-~Y#`#xC0P*SP1eanEP#XMg`^Jj*WH^EbNZ zZ|w5T{$Y2+;M?AB9f2^JVfg5rE zf7m_$!|wSfGV^cG*>xN4$Irj~^uzM1m!H-*?$L|?YtLE1Rd|?XHvWg*^Jm@j4_ifd z-I@7)t$Tm=J@&jqBmOD&mH+H|vwL1k!{4fV|Km3C?v_1gHDA%@`9FWH*7*4C=_k^^ zl4P{a^S|^~t+_ZjWc)$8d@wP(pDw>VF?yaZzalX@oi4x9)8BOYRf*Bnbop}GB;(;_z>}{JO;GLc09=#PEH({D#Evc)I*~ zz{?NEMe;qL+?W{Njc?|Yn-asP>GGQs!;|T92kdbnzUPx$G9~&mpWND}`~_{wU)ZL6 zXPfdDHI;M!Y)Ss>cbaarDd&D|RUa#b-PJt*J5fH6JSTbhrbGA^{*B@*%ioqMf54T0 zK2uJ!r0MdBoNKVy6Dj zqr6rB+pX6xNjujj3y!~Y%_qMh<<0BJ`>opl1nMWrj;8(ic~_p@zh9E}oA=k>N_q1> z9RM-87W;0}&A;)RSD^ewn9rS#KfZ?Dz`yHJ{#?x4!p(=|_jBcMlDrV*FGjg(o1Hk2 zjJk5uYRxgbMq$F!(c|IH}pdq3#j`v+I(13x6??&0Y2v#uS}ep-LN z)TVw81Glk6%_OfxIs0Q;GGkBP)TaI~yZWZ3GkNTbQvW&08x9f)zvqxy4BwW z0g&%C>%c2qr_Q=^(^6WWpK|4?(A$j%_bXmC);(k zd7YhkyO}!sk(t@aM#NS@P$`H-O8=-8sgQuyfZ!h@ttKd_AcZPI3k9Ph{!t_dQj}u- zopaB5A9vn+^JeoJ+&?m#-`+X*+;h)4_uQ{@1=n2yt@lrY>+0Yhp+5n=COLe;vac!N zL|<3uwSS+I@{d{NFG+b_O~-%v=QY7~Rrh0pk6}?qX$r(21>oc#rY-+41DyELU782w zOOD{W>$5EQj|JD&RpsX&z@zHD9g81K|L#0fC<>hq3$D9A%Kus5cSOVwpO^Bw>!k9( zB)IMtc@e`vG(Q8ti67mqQ93igNj{&ln`7? zMGn6g+}ni^{9PbOeCjTm%HI)OSL0RwKN4JbMU;nkV39z77t;K(HwGUDPW9?8hsx)S z;I@BwR&d=N)4JY{frjYlZk*cJS;2MpL8hy@KMHR9`Tdw^?SuR^Zd{T^ECQ!~`Gw^V zKMOpnf4?ob?y3z7oh!fx<@eyn^T4$&LHu_y_)9`xcZK!4*9F(zt%eX=MgihecRe(6 z{Vs6w8`G8_xGd#ueRy4P-L+QzzYU=q(bruT)srRQ_)6E$c`0w(*Rz7_?y>5_tAgA1 zdk-8S*-_rIqand3EPNO^>&aN2c~bg|z@zwlSjyYu@-u?#E~d8kpMrn+OM34fvok9r)Yl!YcmxhLpGCkZXeL zF6enFe*hH`ecg>#eO?#b*7K{tqx9`%#s_kGN=D24Md;Y^!|Q_UF0k6;#0LyNdKy9L zJPDlq-i?VobM6ZNm!-U(hIvNt=LEO)?EoC0(v+h7F%6vLpu4;puYOB#Jv}i07W1vQ zVTpmt+vD|}z@z9Niox@Ycdswa2z@<8q2t2yg6ruBt!oI1P5kI79f+5I>VoTO1#Q=L z;QC!D${#mk@c+c%d$4p8Mdt``;zxJ&b$;=<;^TR)Py77^!RnRuI z;iBMr8e@!W$>m-aTu%!rKOfp>=-A`ny5M@sLg~B!ob>RANApbioX~$o%G+`HK~zL? z(9;C_rTk;Sm1lwY<8loCGp2)Oyu0$j;<;CZzMe)nA%8vk(P;XMz=nS_6J4bLmMOBe+{Z?>2 zouhJl131ZTkNCGWDSzkPh97&Lbxv@5p7njj$MQ_!6GG>G2MirOg{ORe6?l|<9+&cZ z3b813zQ^SUa*OXb^!2+x5Ztzlp9&pY4*L;k>34-Re;fi%^4HUUEAq#=nDP%xc|FCW z{^U|j`72UhPY-GNS7XZWg8*62hr;cBRPbfNwI6>XxSk$VIp6k4L&u&s9TeQwpL4*Y z&)sAAwE4dxxE;^@3i!Jbhv@!= z*82x3ucySc-r_++-(Hva3UDnWtnluF1X#UBbbm9ecOLt1+Hz8 zD$NI-?;65E@n*Z#-dK#o(}bk>lR z7|TlIT40T{q5$(oHbE*ja0z<5vkPxXsydovluB zbhsPEaW(%?yW`BvPo69~#Z%Mh64O8WJGIjj3GR0VWrX{rP26h{PUdE27K&x3JUKO6 z1eNK}oSHmYD&W1eok=hR{>mkDN*=!+!6EtMWqm}JvXYwASA`Mph5PKTMo``zlVLk1 zQ9B7a%exqHIZMzw&eW7xSAW-ldbf=->EfQoJl+C!n{*XL?vtfSJ>cjP;Cp#eq zC$)2`I~9|V6K@f;tLO6h!qO5>k2)hmhe@=!J~UD7v3Eo5O?)rXuX=K>H-wer3;7NI>R7UnfZ{R`gH0+f5EOD>4_bFDG z4XzoPcaSr*dQL5m7wOD953z=MYrGnI!=!-pGcoDiE56{w127bJ8>6!`;t3N8f*G#g^DGW zIDNH5etPy5Na9uPAk76L;;D-qI5jx|B{VLOZVY8>_~CIYNk6>qO6986l9EIbzB234 z_eMkTiNpwV+iiU?lbS_W^bz9)lV|xx6C5l(c_doAkrbr{;3TvZfKwc5kGv^~jcQP~ zn*^?gmFPT96dWzhZMhrX6;p7S#>hOzi;~J^4K2l06~Cd$Ucu{?RJ|VW6qaTh+qmNc z!HU1@OSe5P{HGVPG-Tx^Nm+Z@ZIDIvW?AwWa5k9mVHVVOOY4<2PUgghvRJRVn}y0& zd%NjEl}zr6?$ka$pK796a%n=>%!8Cry3-z^h}XbW8tbPq>p|8xq*QdFE=WX5!Jq_I zFtaWd;wcZ++vfyoG=2iLTwXkd7#;JdoytlbPf}vOQf(lk0_U;BjC*yn7@kyNGROX| zZ*L-64&^iXRQwEkCbU6%J!G+Ahl-_uYUj)rF3P!_6Ree6n#V16xzNt>-09xa*?zl# za=}U_+TPJ^x25>iVLXkBXOP0NNHKY(ROV!kV+aAJjNK&-q(0qLnj~gAUhPm;gWi+b zE-g!%clv!ugKB7kBmJ?fAvNN=YL;=e4gb7I_J*!!hbJlitoGo0}-Q1`&>g|h8 zXE@|&))0HTd{x$2#v0B-wbH0GIr6M_inyqYk?hO{rL{mptk(9riwRz#fEATt2^z-h z>y+$>46YURmO903iQQcoO<~0McTl}qMJ|xrG^wh5#I@nj0U5KCf+d(Qi>3-*A@irDWpqd zUH?{{ad^h$G=}2gXr&^lxU!obn^iW?LSr9#p=j8DbcP4cr3Wg_ElD@HF9quN_5I*DQlgemu3xp|Ba>;TlXn<0LN^c9A}de$slg)|=TZ z-o(Tv`&?I~F1k&j!#sx$C=r~Tk9w2y-L&aVk@_gYs^9~Nj=%OsJ3Qj9DV{*$yoL*( zsk7n)J@)z`RZJ9!aYAcqMw+~dfUq`t3n9H61LIvNarQVRXyyHYWJm9RKUJfWU-H0Q z;q<~Zuhx^#fOJjga$}n=?@5HlTQk)@dZAKpC`QlT^AM$Ua|1YZ*jnq>oi&*vRXfMsHpTo{v7v1-OrCb?Z3#P^(V@{HlbO8B zr{Fsv!`fsYhfmcC{2EQ#GPMV~p1 z5E3=pXCRe1j-z|vM2rlxTqGMgOwVe2uWou3>}JhygWf60e!OBENN#hV(u{1h2`4z{ zfwxNP_+EPIb0f=~G#kj!-9$XVOlGGs!(^jj)-qbAH}SWL)k>>9({$Y;t!y}3a+CsZ z8963o=`!T3+HXDbDZ{f_hoK$(u8Ol1R3HI2t$2AOJ_l$#f#Q(1QmWDvvTG7`Q%d0b z1NAWA0EcS46#AH<#Ced@WryGQhTh1m$XmcLxbdcY;rtdHYXPDZuM9HKYK9thUjrtN`^is@#KkL#=I}2%|`S!=P3L?oB z#aU3Q(8+ICsxkQg>Tm+b+e_xHkC9cG&5$|G% zVA)qY)Aa@>8{nM}HNe^CRc9XxN z8eH6C6iNA!{JXy4AfI&aLl?errSg~ltT;LN0x@42krO|^V%~B`WMY&VRyi_)ESPT1 z1iZW)pZT6wKl{Btr>R8bnNW*5-d@B{o;38Q1*tTAcP>&#l@`11D#wjg?CXZlq0*w_ zaqb&v!)|7mTk_O_H M$%E3wr(5y<2W$^$>;M1& literal 0 HcmV?d00001 diff --git a/mariusz/include/cvBlob/CMakeLists.txt b/mariusz/include/cvBlob/CMakeLists.txt new file mode 100644 index 0000000..939f96b --- /dev/null +++ b/mariusz/include/cvBlob/CMakeLists.txt @@ -0,0 +1,45 @@ +# Copyright (C) 2007 by Cristóbal Carnero Liñán +# grendel.ccl@gmail.com +# +# This file is part of cvBlob. +# +# cvBlob is free software: you can redistribute it and/or modify +# it under the terms of the Lesser GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cvBlob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Lesser GNU General Public License for more details. +# +# You should have received a copy of the Lesser GNU General Public License +# along with cvBlob. If not, see . +# + +find_package(OpenCV REQUIRED) + +set(cvBlob_CVBLOB cvblob.cpp + cvlabel.cpp + cvaux.cpp + cvcontour.cpp + cvtrack.cpp + cvcolor.cpp +) + +set_source_files_properties(${cvBlob_SRC} + PROPERTIES + COMPILE_FLAGS "-O3" +) + +add_library(cvblob SHARED ${cvBlob_CVBLOB}) + +target_link_libraries(cvblob ${OpenCV_LIBS}) + +install(FILES cvblob.h DESTINATION include) + +install(TARGETS cvblob + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib +) diff --git a/mariusz/include/cvBlob/cvaux.cpp b/mariusz/include/cvBlob/cvaux.cpp new file mode 100644 index 0000000..0404c88 --- /dev/null +++ b/mariusz/include/cvBlob/cvaux.cpp @@ -0,0 +1,79 @@ +// Copyright (C) 2007 by Cristóbal Carnero Liñán +// grendel.ccl@gmail.com +// +// This file is part of cvBlob. +// +// cvBlob is free software: you can redistribute it and/or modify +// it under the terms of the Lesser GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// cvBlob is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// Lesser GNU General Public License for more details. +// +// You should have received a copy of the Lesser GNU General Public License +// along with cvBlob. If not, see . +// + +#include + +#if (defined(_WIN32) || defined(__WIN32__) || defined(__TOS_WIN__) || defined(__WINDOWS__) || (defined(__APPLE__) & defined(__MACH__))) +#include +#else +#include +#endif + +#include "cvblob.h" + +namespace cvb +{ + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=geometry1 + + double cvDotProductPoints(CvPoint const &a, CvPoint const &b, CvPoint const &c) + { + double abx = b.x-a.x; + double aby = b.y-a.y; + double bcx = c.x-b.x; + double bcy = c.y-b.y; + + return abx*bcx + aby*bcy; + } + + double cvCrossProductPoints(CvPoint const &a, CvPoint const &b, CvPoint const &c) + { + double abx = b.x-a.x; + double aby = b.y-a.y; + double acx = c.x-a.x; + double acy = c.y-a.y; + + return abx*acy - aby*acx; + } + + double cvDistancePointPoint(CvPoint const &a, CvPoint const &b) + { + double abx = a.x-b.x; + double aby = a.y-b.y; + + return sqrt(abx*abx + aby*aby); + } + + double cvDistanceLinePoint(CvPoint const &a, CvPoint const &b, CvPoint const &c, bool isSegment) + { + if (isSegment) + { + double dot1 = cvDotProductPoints(a, b, c); + if (dot1>0) return cvDistancePointPoint(b, c); + + double dot2 = cvDotProductPoints(b, a, c); + if(dot2>0) return cvDistancePointPoint(a, c); + } + + return fabs(cvCrossProductPoints(a,b,c)/cvDistancePointPoint(a,b)); + } + ////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +} diff --git a/mariusz/include/cvBlob/cvblob.cpp b/mariusz/include/cvBlob/cvblob.cpp new file mode 100644 index 0000000..19b40e5 --- /dev/null +++ b/mariusz/include/cvBlob/cvblob.cpp @@ -0,0 +1,344 @@ +// Copyright (C) 2007 by Cristóbal Carnero Liñán +// grendel.ccl@gmail.com +// +// This file is part of cvBlob. +// +// cvBlob is free software: you can redistribute it and/or modify +// it under the terms of the Lesser GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// cvBlob is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// Lesser GNU General Public License for more details. +// +// You should have received a copy of the Lesser GNU General Public License +// along with cvBlob. If not, see . +// + +#include +#include +using namespace std; + +#if (defined(_WIN32) || defined(__WIN32__) || defined(__TOS_WIN__) || defined(__WINDOWS__) || (defined(__APPLE__) & defined(__MACH__))) +#include +#include +#else +#include +#include +#endif + +#include "cvblob.h" + +namespace cvb +{ + + CvLabel cvLargestBlob(const CvBlobs &blobs) + { + CvLabel label=0; + unsigned int maxArea=0; + + for (CvBlobs::const_iterator it=blobs.begin();it!=blobs.end();++it) + { + CvBlob *blob=(*it).second; + + if (blob->area > maxArea) + { + label=blob->label; + maxArea=blob->area; + } + } + + return label; + } + + void cvFilterByArea(CvBlobs &blobs, unsigned int minArea, unsigned int maxArea) + { + CvBlobs::iterator it=blobs.begin(); + while(it!=blobs.end()) + { + CvBlob *blob=(*it).second; + if ((blob->areaarea>maxArea)) + { + cvReleaseBlob(blob); + + CvBlobs::iterator tmp=it; + ++it; + blobs.erase(tmp); + } + else + ++it; + } + } + + void cvFilterByLabel(CvBlobs &blobs, CvLabel label) + { + CvBlobs::iterator it=blobs.begin(); + while(it!=blobs.end()) + { + CvBlob *blob=(*it).second; + if (blob->label!=label) + { + delete blob; + CvBlobs::iterator tmp=it; + ++it; + blobs.erase(tmp); + } + else + ++it; + } + } + + /*void cvCentralMoments(CvBlob *blob, const IplImage *img) + { + CV_FUNCNAME("cvCentralMoments"); + __CV_BEGIN__; + if (!blob->centralMoments) + { + CV_ASSERT(img&&(img->depth==IPL_DEPTH_LABEL)&&(img->nChannels==1)); + + //cvCentroid(blob); // Here? + + blob->u11=blob->u20=blob->u02=0.; + + // Only in the bounding box + int stepIn = img->widthStep / (img->depth / 8); + int img_width = img->width; + int img_height = img->height; + int img_offset = 0; + if(0 != img->roi) + { + img_width = img->roi->width; + img_height = img->roi->height; + img_offset = img->roi->xOffset + (img->roi->yOffset * stepIn); + } + + CvLabel *imgData=(CvLabel *)img->imageData + (blob->miny * stepIn) + img_offset; + for (unsigned int r=blob->miny; + rmaxy; + r++,imgData+=stepIn) + for (unsigned int c=blob->minx;cmaxx;c++) + if (imgData[c]==blob->label) + { + double tx=(c-blob->centroid.x); + double ty=(r-blob->centroid.y); + blob->u11+=tx*ty; + blob->u20+=tx*tx; + blob->u02+=ty*ty; + } + + blob->centralMoments = true; + } + __CV_END__; + }*/ + + void cvRenderBlob(const IplImage *imgLabel, CvBlob *blob, IplImage *imgSource, IplImage *imgDest, unsigned short mode, CvScalar const &color, double alpha) + { + CV_FUNCNAME("cvRenderBlob"); + __CV_BEGIN__; + + CV_ASSERT(imgLabel&&(imgLabel->depth==IPL_DEPTH_LABEL)&&(imgLabel->nChannels==1)); + CV_ASSERT(imgDest&&(imgDest->depth==IPL_DEPTH_8U)&&(imgDest->nChannels==3)); + + if (mode&CV_BLOB_RENDER_COLOR) + { + int stepLbl = imgLabel->widthStep/(imgLabel->depth/8); + int stepSrc = imgSource->widthStep/(imgSource->depth/8); + int stepDst = imgDest->widthStep/(imgDest->depth/8); + int imgLabel_width = imgLabel->width; + int imgLabel_height = imgLabel->height; + int imgLabel_offset = 0; + int imgSource_width = imgSource->width; + int imgSource_height = imgSource->height; + int imgSource_offset = 0; + int imgDest_width = imgDest->width; + int imgDest_height = imgDest->height; + int imgDest_offset = 0; + if(imgLabel->roi) + { + imgLabel_width = imgLabel->roi->width; + imgLabel_height = imgLabel->roi->height; + imgLabel_offset = (imgLabel->nChannels * imgLabel->roi->xOffset) + (imgLabel->roi->yOffset * stepLbl); + } + if(imgSource->roi) + { + imgSource_width = imgSource->roi->width; + imgSource_height = imgSource->roi->height; + imgSource_offset = (imgSource->nChannels * imgSource->roi->xOffset) + (imgSource->roi->yOffset * stepSrc); + } + if(imgDest->roi) + { + imgDest_width = imgDest->roi->width; + imgDest_height = imgDest->roi->height; + imgDest_offset = (imgDest->nChannels * imgDest->roi->xOffset) + (imgDest->roi->yOffset * stepDst); + } + + CvLabel *labels = (CvLabel *)imgLabel->imageData + imgLabel_offset + (blob->miny * stepLbl); + unsigned char *source = (unsigned char *)imgSource->imageData + imgSource_offset + (blob->miny * stepSrc); + unsigned char *imgData = (unsigned char *)imgDest->imageData + imgDest_offset + (blob->miny * stepDst); + + for (unsigned int r=blob->miny; rmaxy; r++, labels+=stepLbl, source+=stepSrc, imgData+=stepDst) + for (unsigned int c=blob->minx; cmaxx; c++) + { + if (labels[c]==blob->label) + { + imgData[imgDest->nChannels*c+0] = (unsigned char)((1.-alpha)*source[imgSource->nChannels*c+0]+alpha*color.val[0]); + imgData[imgDest->nChannels*c+1] = (unsigned char)((1.-alpha)*source[imgSource->nChannels*c+1]+alpha*color.val[1]); + imgData[imgDest->nChannels*c+2] = (unsigned char)((1.-alpha)*source[imgSource->nChannels*c+2]+alpha*color.val[2]); + } + } + } + + if (mode) + { + if (mode&CV_BLOB_RENDER_TO_LOG) + { + std::clog << "Blob " << blob->label << std::endl; + std::clog << " - Bounding box: (" << blob->minx << ", " << blob->miny << ") - (" << blob->maxx << ", " << blob->maxy << ")" << std::endl; + std::clog << " - Bounding box area: " << (1 + blob->maxx - blob->minx) * (1 + blob->maxy - blob->miny) << std::endl; + std::clog << " - Area: " << blob->area << std::endl; + std::clog << " - Centroid: (" << blob->centroid.x << ", " << blob->centroid.y << ")" << std::endl; + std::clog << std::endl; + } + + if (mode&CV_BLOB_RENDER_TO_STD) + { + std::cout << "Blob " << blob->label << std::endl; + std::cout << " - Bounding box: (" << blob->minx << ", " << blob->miny << ") - (" << blob->maxx << ", " << blob->maxy << ")" << std::endl; + std::cout << " - Bounding box area: " << (1 + blob->maxx - blob->minx) * (1 + blob->maxy - blob->miny) << std::endl; + std::cout << " - Area: " << blob->area << std::endl; + std::cout << " - Centroid: (" << blob->centroid.x << ", " << blob->centroid.y << ")" << std::endl; + std::cout << std::endl; + } + + if (mode&CV_BLOB_RENDER_BOUNDING_BOX) + cvRectangle(imgDest, cvPoint(blob->minx, blob->miny), cvPoint(blob->maxx-1, blob->maxy-1), CV_RGB(255., 0., 0.)); + + if (mode&CV_BLOB_RENDER_ANGLE) + { + double angle = cvAngle(blob); + + double x1,y1,x2,y2; + double lengthLine = MAX(blob->maxx-blob->minx, blob->maxy-blob->miny)/2.; + + x1=blob->centroid.x-lengthLine*cos(angle); + y1=blob->centroid.y-lengthLine*sin(angle); + x2=blob->centroid.x+lengthLine*cos(angle); + y2=blob->centroid.y+lengthLine*sin(angle); + cvLine(imgDest,cvPoint(int(x1),int(y1)),cvPoint(int(x2),int(y2)),CV_RGB(0.,255.,0.)); + } + + if (mode&CV_BLOB_RENDER_CENTROID) + { + cvLine(imgDest,cvPoint(int(blob->centroid.x)-3,int(blob->centroid.y)),cvPoint(int(blob->centroid.x)+3,int(blob->centroid.y)),CV_RGB(0.,0.,255.)); + cvLine(imgDest,cvPoint(int(blob->centroid.x),int(blob->centroid.y)-3),cvPoint(int(blob->centroid.x),int(blob->centroid.y)+3),CV_RGB(0.,0.,255.)); + } + } + + __CV_END__; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////// + // Based on http://en.wikipedia.org/wiki/HSL_and_HSV + + /// \def _HSV2RGB_(H, S, V, R, G, B) + /// \brief Color translation between HSV and RGB. +#define _HSV2RGB_(H, S, V, R, G, B) \ + { \ + double _h = H/60.; \ + int _hf = (int)floor(_h); \ + int _hi = ((int)_h)%6; \ + double _f = _h - _hf; \ + \ + double _p = V * (1. - S); \ + double _q = V * (1. - _f * S); \ + double _t = V * (1. - (1. - _f) * S); \ + \ + switch (_hi) \ + { \ + case 0: \ + R = 255.*V; G = 255.*_t; B = 255.*_p; \ + break; \ + case 1: \ + R = 255.*_q; G = 255.*V; B = 255.*_p; \ + break; \ + case 2: \ + R = 255.*_p; G = 255.*V; B = 255.*_t; \ + break; \ + case 3: \ + R = 255.*_p; G = 255.*_q; B = 255.*V; \ + break; \ + case 4: \ + R = 255.*_t; G = 255.*_p; B = 255.*V; \ + break; \ + case 5: \ + R = 255.*V; G = 255.*_p; B = 255.*_q; \ + break; \ + } \ + } + /////////////////////////////////////////////////////////////////////////////////////////////////// + + typedef std::map Palete; + + void cvRenderBlobs(const IplImage *imgLabel, CvBlobs &blobs, IplImage *imgSource, IplImage *imgDest, unsigned short mode, double alpha) + { + CV_FUNCNAME("cvRenderBlobs"); + __CV_BEGIN__; + { + + CV_ASSERT(imgLabel&&(imgLabel->depth==IPL_DEPTH_LABEL)&&(imgLabel->nChannels==1)); + CV_ASSERT(imgDest&&(imgDest->depth==IPL_DEPTH_8U)&&(imgDest->nChannels==3)); + + Palete pal; + if (mode&CV_BLOB_RENDER_COLOR) + { + + unsigned int colorCount = 0; + for (CvBlobs::const_iterator it=blobs.begin(); it!=blobs.end(); ++it) + { + CvLabel label = (*it).second->label; + + double r, g, b; + + _HSV2RGB_((double)((colorCount*77)%360), .5, 1., r, g, b); + colorCount++; + + pal[label] = CV_RGB(r, g, b); + } + } + + for (CvBlobs::iterator it=blobs.begin(); it!=blobs.end(); ++it) + cvRenderBlob(imgLabel, (*it).second, imgSource, imgDest, mode, pal[(*it).second->label], alpha); + + } + __CV_END__; + } + + // Returns radians + double cvAngle(CvBlob *blob) + { + CV_FUNCNAME("cvAngle"); + __CV_BEGIN__; + + return .5*atan2(2.*blob->u11,(blob->u20-blob->u02)); + + __CV_END__; + } + + void cvSaveImageBlob(const char *filename, IplImage *img, CvBlob const *blob) + { + CvRect roi = cvGetImageROI(img); + cvSetImageROItoBlob(img, blob); + cvSaveImage(filename, img); + cvSetImageROI(img, roi); + } + +} + +ostream& operator<< (ostream& output, const cvb::CvBlob& b) +{ + output << b.label << ": " << b.area << ", (" << b.centroid.x << ", " << b.centroid.y << "), [(" << b.minx << ", " << b.miny << ") - (" << b.maxx << ", " << b.maxy << ")]"; + + return output; +} diff --git a/mariusz/include/cvBlob/cvblob.h b/mariusz/include/cvBlob/cvblob.h new file mode 100644 index 0000000..c3d8e07 --- /dev/null +++ b/mariusz/include/cvBlob/cvblob.h @@ -0,0 +1,587 @@ +// Copyright (C) 2007 by Cristóbal Carnero Liñán +// grendel.ccl@gmail.com +// +// This file is part of cvBlob. +// +// cvBlob is free software: you can redistribute it and/or modify +// it under the terms of the Lesser GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// Lesser GNU General Public License for more details. +// +// You should have received a copy of the Lesser GNU General Public License +// along with cvBlob. If not, see . +// + +/// \file cvblob.h +/// \brief OpenCV Blob header file. + +#ifdef SWIG +%module cvblob +%{ +#include "cvblob.h" +%} +#endif + +#ifndef CVBLOB_H +#define CVBLOB_H + +#include +#include +#include +#include +#include + +#if (defined(_WIN32) || defined(__WIN32__) || defined(__TOS_WIN__) || defined(__WINDOWS__) || (defined(__APPLE__) & defined(__MACH__))) +#include +#else +#include +#endif + +#ifndef __CV_BEGIN__ +#define __CV_BEGIN__ __BEGIN__ +#endif +#ifndef __CV_END__ +#define __CV_END__ __END__ +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + namespace cvb + { + + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Contours + + // Chain code: + // 7 0 1 + // 6 2 + // 5 4 3 +#define CV_CHAINCODE_UP 0 ///< Up. +#define CV_CHAINCODE_UP_RIGHT 1 ///< Up and right. +#define CV_CHAINCODE_RIGHT 2 ///< Right. +#define CV_CHAINCODE_DOWN_RIGHT 3 ///< Down and right. +#define CV_CHAINCODE_DOWN 4 ///< Down. +#define CV_CHAINCODE_DOWN_LEFT 5 ///< Down and left. +#define CV_CHAINCODE_LEFT 6 ///< Left. +#define CV_CHAINCODE_UP_LEFT 7 ///< Up and left. + + /// \brief Move vectors of chain codes. + /// \see CV_CHAINCODE_UP + /// \see CV_CHAINCODE_UP_LEFT + /// \see CV_CHAINCODE_LEFT + /// \see CV_CHAINCODE_DOWN_LEFT + /// \see CV_CHAINCODE_DOWN + /// \see CV_CHAINCODE_DOWN_RIGHT + /// \see CV_CHAINCODE_RIGHT + /// \see CV_CHAINCODE_UP_RIGHT + const char cvChainCodeMoves[8][2] = { { 0, -1}, + { 1, -1}, + { 1, 0}, + { 1, 1}, + { 0, 1}, + {-1, 1}, + {-1, 0}, + {-1, -1} + }; + + /// \brief Direction. + /// \see CV_CHAINCODE_UP + /// \see CV_CHAINCODE_UP_LEFT + /// \see CV_CHAINCODE_LEFT + /// \see CV_CHAINCODE_DOWN_LEFT + /// \see CV_CHAINCODE_DOWN + /// \see CV_CHAINCODE_DOWN_RIGHT + /// \see CV_CHAINCODE_RIGHT + /// \see CV_CHAINCODE_UP_RIGHT + typedef unsigned char CvChainCode; + + /// \brief Chain code. + /// \see CvChainCode + typedef std::list CvChainCodes; + + /// \brief Chain code contour. + /// \see CvChainCodes + struct CvContourChainCode + { + CvPoint startingPoint; ///< Point where contour begin. + CvChainCodes chainCode; ///< Polygon description based on chain codes. + }; + + typedef std::list CvContoursChainCode; ///< List of contours (chain codes type). + + /// \brief Polygon based contour. + typedef std::vector CvContourPolygon; + + /// \fn void cvRenderContourChainCode(CvContourChainCode const *contour, IplImage const *img, CvScalar const &color=CV_RGB(255, 255, 255)) + /// \brief Draw a contour. + /// \param contour Chain code contour. + /// \param img Image to draw on. + /// \param color Color to draw (default, white). + /// \see CvContourChainCode + void cvRenderContourChainCode(CvContourChainCode const *contour, IplImage const *img, CvScalar const &color=CV_RGB(255, 255, 255)); + + /// \fn CvContourPolygon *cvConvertChainCodesToPolygon(CvContourChainCode const *cc) + /// \brief Convert a chain code contour to a polygon. + /// \param cc Chain code contour. + /// \return A polygon. + /// \see CvContourChainCode + /// \see CvContourPolygon + CvContourPolygon *cvConvertChainCodesToPolygon(CvContourChainCode const *cc); + + /// \fn void cvRenderContourPolygon(CvContourPolygon const *contour, IplImage *img, CvScalar const &color=CV_RGB(255, 255, 255)) + /// \brief Draw a polygon. + /// \param contour Polygon contour. + /// \param img Image to draw on. + /// \param color Color to draw (default, white). + /// \see CvContourPolygon + void cvRenderContourPolygon(CvContourPolygon const *contour, IplImage *img, CvScalar const &color=CV_RGB(255, 255, 255)); + + /// \fn double cvContourPolygonArea(CvContourPolygon const *p) + /// \brief Calculates area of a polygonal contour. + /// \param p Contour (polygon type). + /// \return Area of the contour. + double cvContourPolygonArea(CvContourPolygon const *p); + + /// \fn double cvContourChainCodePerimeter(CvContourChainCode const *c) + /// \brief Calculates perimeter of a chain code contour. + /// \param c Contour (chain code type). + /// \return Perimeter of the contour. + double cvContourChainCodePerimeter(CvContourChainCode const *c); + + /// \fn double cvContourPolygonPerimeter(CvContourPolygon const *p) + /// \brief Calculates perimeter of a polygonal contour. + /// \param p Contour (polygon type). + /// \return Perimeter of the contour. + double cvContourPolygonPerimeter(CvContourPolygon const *p); + + /// \fn double cvContourPolygonCircularity(const CvContourPolygon *p) + /// \brief Calculates the circularity of a polygon (compactness measure). + /// \param p Contour (polygon type). + /// \return Circularity: a non-negative value, where 0 correspond with a circumference. + double cvContourPolygonCircularity(const CvContourPolygon *p); + + /// \fn CvContourPolygon *cvSimplifyPolygon(CvContourPolygon const *p, double const delta=1.) + /// \brief Simplify a polygon reducing the number of vertex according the distance "delta". + /// Uses a version of the Ramer-Douglas-Peucker algorithm (http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm). + /// \param p Contour (polygon type). + /// \param delta Minimun distance. + /// \return A simplify version of the original polygon. + CvContourPolygon *cvSimplifyPolygon(CvContourPolygon const *p, double const delta=1.); + + /// \fn CvContourPolygon *cvPolygonContourConvexHull(CvContourPolygon const *p) + /// \brief Calculates convex hull of a contour. + /// Uses the Melkman Algorithm. Code based on the version in http://w3.impa.br/~rdcastan/Cgeometry/. + /// \param p Contour (polygon type). + /// \return Convex hull. + CvContourPolygon *cvPolygonContourConvexHull(CvContourPolygon const *p); + + /// \fn void cvWriteContourPolygonCSV(const CvContourPolygon& p, const std::string& filename) + /// \brief Write a contour to a CSV (Comma-separated values) file. + /// \param p Polygon contour. + /// \param filename File name. + void cvWriteContourPolygonCSV(const CvContourPolygon& p, const std::string& filename); + + /// \fn void cvWriteContourPolygonSVG(const CvContourPolygon& p, const std::string& filename, const CvScalar& stroke=cvScalar(0,0,0), const CvScalar& fill=cvScalar(255,255,255)) + /// \brief Write a contour to a SVG file (http://en.wikipedia.org/wiki/Scalable_Vector_Graphics). + /// \param p Polygon contour. + /// \param filename File name. + /// \param stroke Stroke color (black by default). + /// \param fill Fill color (white by default). + void cvWriteContourPolygonSVG(const CvContourPolygon& p, const std::string& filename, const CvScalar& stroke=cvScalar(0,0,0), const CvScalar& fill=cvScalar(255,255,255)); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Blobs + + /// \brief Type of label. + /// \see IPL_DEPTH_LABEL + typedef unsigned int CvLabel; + //typedef unsigned char CvLabel; + + /// \def IPL_DEPTH_LABEL + /// \brief Size of a label in bits. + /// \see CvLabel +#define IPL_DEPTH_LABEL (sizeof(cvb::CvLabel)*8) + + /// \def CV_BLOB_MAX_LABEL + /// \brief Max label number. + /// \see CvLabel. +#define CV_BLOB_MAX_LABEL std::numeric_limits::max() + + /// \brief Type of identification numbers. + typedef unsigned int CvID; + + /// \brief Struct that contain information about one blob. + struct CvBlob + { + CvLabel label; ///< Label assigned to the blob. + + union + { + unsigned int area; ///< Area (moment 00). + unsigned int m00; ///< Moment 00 (area). + }; + + unsigned int minx; ///< X min. + unsigned int maxx; ///< X max. + unsigned int miny; ///< Y min. + unsigned int maxy; ///< y max. + + CvPoint2D64f centroid; ///< Centroid. + + double m10; ///< Moment 10. + double m01; ///< Moment 01. + double m11; ///< Moment 11. + double m20; ///< Moment 20. + double m02; ///< Moment 02. + + double u11; ///< Central moment 11. + double u20; ///< Central moment 20. + double u02; ///< Central moment 02. + + double n11; ///< Normalized central moment 11. + double n20; ///< Normalized central moment 20. + double n02; ///< Normalized central moment 02. + + double p1; ///< Hu moment 1. + double p2; ///< Hu moment 2. + + CvContourChainCode contour; ///< Contour. + CvContoursChainCode internalContours; ///< Internal contours. + }; + + /// \var typedef std::map CvBlobs + /// \brief List of blobs. + /// A map is used to access each blob from its label number. + /// \see CvLabel + /// \see CvBlob + typedef std::map CvBlobs; + + /// \var typedef std::pair CvLabelBlob + /// \brief Pair (label, blob). + /// \see CvLabel + /// \see CvBlob + typedef std::pair CvLabelBlob; + + /// \fn unsigned int cvLabel (IplImage const *img, IplImage *imgOut, CvBlobs &blobs); + /// \brief Label the connected parts of a binary image. + /// Algorithm based on paper "A linear-time component-labeling algorithm using contour tracing technique" of Fu Chang, Chun-Jen Chen and Chi-Jen Lu. + /// \param img Input binary image (depth=IPL_DEPTH_8U and num. channels=1). + /// \param imgOut Output image (depth=IPL_DEPTH_LABEL and num. channels=1). + /// \param blobs List of blobs. + /// \return Number of pixels that has been labeled. + unsigned int cvLabel (IplImage const *img, IplImage *imgOut, CvBlobs &blobs); + + //IplImage *cvFilterLabel(IplImage *imgIn, CvLabel label); + + /// \fn void cvFilterLabels(IplImage *imgIn, IplImage *imgOut, const CvBlobs &blobs) + /// \brief Draw a binary image with the blobs that have been given. + /// \param imgIn Input image (depth=IPL_DEPTH_LABEL and num. channels=1). + /// \param imgOut Output binary image (depth=IPL_DEPTH_8U and num. channels=1). + /// \param blobs List of blobs to be drawn. + /// \see cvLabel + void cvFilterLabels(IplImage *imgIn, IplImage *imgOut, const CvBlobs &blobs); + + /// \fn CvLabel cvGetLabel(IplImage const *img, unsigned int x, unsigned int y) + /// \brief Get the label value from a labeled image. + /// \param img Label image. + /// \param x X coordenate. + /// \param y Y coordenate. + /// \return Label value. + /// \see CvLabel + CvLabel cvGetLabel(IplImage const *img, unsigned int x, unsigned int y); + + /// \fn inline void cvReleaseBlob(CvBlob *blob) + /// \brief Clear a blob structure. + /// \param blob Blob. + /// \see CvBlob + inline void cvReleaseBlob(CvBlob *blob) + { + if (blob) + { + for (CvContoursChainCode::iterator jt=blob->internalContours.begin(); jt!=blob->internalContours.end(); ++jt) + { + CvContourChainCode *contour = *jt; + if (contour) + delete contour; + } + blob->internalContours.clear(); + + delete blob; + } + } + + /// \fn inline void cvReleaseBlobs(CvBlobs &blobs) + /// \brief Clear blobs structure. + /// \param blobs List of blobs. + /// \see CvBlobs + inline void cvReleaseBlobs(CvBlobs &blobs) + { + for (CvBlobs::iterator it=blobs.begin(); it!=blobs.end(); ++it) + { + cvReleaseBlob((*it).second); + } + blobs.clear(); + } + + /// \fn CvLabel cvLargestBlob(const CvBlobs &blobs) + /// \brief Find largest blob (biggest area). + /// \param blobs List of blobs. + /// \return Label of the largest blob or 0 if there are no blobs. + /// \see cvLabel + CvLabel cvLargestBlob(const CvBlobs &blobs); + + inline CvLabel cvGreaterBlob(const CvBlobs &blobs) + { + return cvLargestBlob(blobs); + } + + /// \fn void cvFilterByArea(CvBlobs &blobs, unsigned int minArea, unsigned int maxArea) + /// \brief Filter blobs by area. + /// Those blobs whose areas are not in range will be erased from the input list of blobs. + /// \param blobs List of blobs. + /// \param minArea Minimun area. + /// \param maxArea Maximun area. + void cvFilterByArea(CvBlobs &blobs, unsigned int minArea, unsigned int maxArea); + + /// \fn void cvFilterByLabel(CvBlobs &blobs, CvLabel label) + /// \brief Filter blobs by label. + /// Delete all blobs except those with label l. + /// \param blobs List of blobs. + /// \param label Label to leave. + void cvFilterByLabel(CvBlobs &blobs, CvLabel label); + + /// \fn inline CvPoint2D64f cvCentroid(CvBlob *blob) + /// \brief Calculates centroid. + /// Centroid will be returned and stored in the blob structure. + /// \param blob Blob whose centroid will be calculated. + /// \return Centroid. + /// \see CvBlob + inline CvPoint2D64f cvCentroid(CvBlob *blob) + { + return blob->centroid=cvPoint2D64f(blob->m10/blob->area, blob->m01/blob->area); + } + + /// \fn double cvAngle(CvBlob *blob) + /// \brief Calculates angle orientation of a blob. + /// \param blob Blob. + /// \return Angle orientation in radians. + /// \see CvBlob + double cvAngle(CvBlob *blob); + + /// \fn cvSaveImageBlob(const char *filename, IplImage *img, CvBlob const *blob) + /// \brief Save the image of a blob to a file. + /// The function uses an image (that can be the original pre-processed image or a processed one, or even the result of cvRenderBlobs, for example) and a blob structure. + /// Then the function saves a copy of the part of the image where the blob is. + /// \param filename Name of the file. + /// \param img Image. + /// \param blob Blob. + /// \see CvBlob + /// \see cvRenderBlob + void cvSaveImageBlob(const char *filename, IplImage *img, CvBlob const *blob); + +#define CV_BLOB_RENDER_COLOR 0x0001 ///< Render each blog with a different color. \see cvRenderBlobs +#define CV_BLOB_RENDER_CENTROID 0x0002 ///< Render centroid. \see cvRenderBlobs +#define CV_BLOB_RENDER_BOUNDING_BOX 0x0004 ///< Render bounding box. \see cvRenderBlobs +#define CV_BLOB_RENDER_ANGLE 0x0008 ///< Render angle. \see cvRenderBlobs +#define CV_BLOB_RENDER_TO_LOG 0x0010 ///< Print blob data to log out. \see cvRenderBlobs +#define CV_BLOB_RENDER_TO_STD 0x0020 ///< Print blob data to std out. \see cvRenderBlobs + + /// \fn void cvRenderBlob(const IplImage *imgLabel, CvBlob *blob, IplImage *imgSource, IplImage *imgDest, unsigned short mode=0x000f, CvScalar const &color=CV_RGB(255, 255, 255), double alpha=1.) + /// \brief Draws or prints information about a blob. + /// \param imgLabel Label image (depth=IPL_DEPTH_LABEL and num. channels=1). + /// \param blob Blob. + /// \param imgSource Input image (depth=IPL_DEPTH_8U and num. channels=3). + /// \param imgDest Output image (depth=IPL_DEPTH_8U and num. channels=3). + /// \param mode Render mode. By default is CV_BLOB_RENDER_COLOR|CV_BLOB_RENDER_CENTROID|CV_BLOB_RENDER_BOUNDING_BOX|CV_BLOB_RENDER_ANGLE. + /// \param color Color to render (if CV_BLOB_RENDER_COLOR is used). + /// \param alpha If mode CV_BLOB_RENDER_COLOR is used. 1.0 indicates opaque and 0.0 translucent (1.0 by default). + /// \see CV_BLOB_RENDER_COLOR + /// \see CV_BLOB_RENDER_CENTROID + /// \see CV_BLOB_RENDER_BOUNDING_BOX + /// \see CV_BLOB_RENDER_ANGLE + /// \see CV_BLOB_RENDER_TO_LOG + /// \see CV_BLOB_RENDER_TO_STD + void cvRenderBlob(const IplImage *imgLabel, CvBlob *blob, IplImage *imgSource, IplImage *imgDest, unsigned short mode=0x000f, CvScalar const &color=CV_RGB(255, 255, 255), double alpha=1.); + + /// \fn void cvRenderBlobs(const IplImage *imgLabel, CvBlobs &blobs, IplImage *imgSource, IplImage *imgDest, unsigned short mode=0x000f, double alpha=1.) + /// \brief Draws or prints information about blobs. + /// \param imgLabel Label image (depth=IPL_DEPTH_LABEL and num. channels=1). + /// \param blobs List of blobs. + /// \param imgSource Input image (depth=IPL_DEPTH_8U and num. channels=3). + /// \param imgDest Output image (depth=IPL_DEPTH_8U and num. channels=3). + /// \param mode Render mode. By default is CV_BLOB_RENDER_COLOR|CV_BLOB_RENDER_CENTROID|CV_BLOB_RENDER_BOUNDING_BOX|CV_BLOB_RENDER_ANGLE. + /// \param alpha If mode CV_BLOB_RENDER_COLOR is used. 1.0 indicates opaque and 0.0 translucent (1.0 by default). + /// \see CV_BLOB_RENDER_COLOR + /// \see CV_BLOB_RENDER_CENTROID + /// \see CV_BLOB_RENDER_BOUNDING_BOX + /// \see CV_BLOB_RENDER_ANGLE + /// \see CV_BLOB_RENDER_TO_LOG + /// \see CV_BLOB_RENDER_TO_STD + void cvRenderBlobs(const IplImage *imgLabel, CvBlobs &blobs, IplImage *imgSource, IplImage *imgDest, unsigned short mode=0x000f, double alpha=1.); + + /// \fn void cvSetImageROItoBlob(IplImage *img, CvBlob const *blob) + /// \brief Set the ROI of an image to the bounding box of a blob. + /// \param img Image. + /// \param blob Blob. + /// \see CvBlob + inline void cvSetImageROItoBlob(IplImage *img, CvBlob const *blob) + { + cvSetImageROI(img, cvRect(blob->minx, blob->miny, blob->maxx-blob->minx, blob->maxy-blob->miny)); + }; + + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Color + + /// \fn CvScalar cvBlobMeanColor(CvBlob const *blob, IplImage const *imgLabel, IplImage const *img) + /// \brief Calculates mean color of a blob in an image. + /// \param blob Blob. + /// \param imgLabel Image of labels. + /// \param img Original image. + /// \return Average color. + CvScalar cvBlobMeanColor(CvBlob const *blob, IplImage const *imgLabel, IplImage const *img); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Aux + + /// \fn double cvDotProductPoints(CvPoint const &a, CvPoint const &b, CvPoint const &c) + /// \brief Dot product of the vectors ab and bc. + /// \param a First point. + /// \param b Middle point. + /// \param c Last point. + /// \return Dot product of ab and bc. + double cvDotProductPoints(CvPoint const &a, CvPoint const &b, CvPoint const &c); + + /// \fn double cvCrossProductPoints(CvPoint const &a, CvPoint const &b, CvPoint const &c) + /// \brief Cross product of the vectors ab and bc. + /// \param a Point. + /// \param b Point. + /// \param c Point. + /// \return Cross product of ab and bc. + double cvCrossProductPoints(CvPoint const &a, CvPoint const &b, CvPoint const &c); + + /// \fn double cvDistancePointPoint(CvPoint const &a, CvPoint const &b) + /// \brief Distance between two points. + /// \param a Point. + /// \param b Point. + /// \return Distance. + double cvDistancePointPoint(CvPoint const &a, CvPoint const &b); + + /// \fn double cvDistanceLinePoint(CvPoint const &a, CvPoint const &b, CvPoint const &c, bool isSegment=true) + /// \brief Distance between line ab and point c. + /// \param a First point of the segment. + /// \param b Second point of the segment. + /// \param c Point. + /// \param isSegment If false then the distance will be calculated from the line defined by the points a and b, to the point c. + /// \return Distance between ab and c. + double cvDistanceLinePoint(CvPoint const &a, CvPoint const &b, CvPoint const &c, bool isSegment=true); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Tracking + + /// \brief Struct that contain information about one track. + /// \see CvID + /// \see CvLabel + struct CvTrack + { + CvID id; ///< Track identification number. + + CvLabel label; ///< Label assigned to the blob related to this track. + + unsigned int minx; ///< X min. + unsigned int maxx; ///< X max. + unsigned int miny; ///< Y min. + unsigned int maxy; ///< y max. + + CvPoint2D64f centroid; ///< Centroid. + + unsigned int lifetime; ///< Indicates how much frames the object has been in scene. + unsigned int active; ///< Indicates number of frames that has been active from last inactive period. + unsigned int inactive; ///< Indicates number of frames that has been missing. + }; + + /// \var typedef std::map CvTracks + /// \brief List of tracks. + /// \see CvID + /// \see CvTrack + typedef std::map CvTracks; + + /// \var typedef std::pair CvIDTrack + /// \brief Pair (identification number, track). + /// \see CvID + /// \see CvTrack + typedef std::pair CvIDTrack; + + /// \fn inline void cvReleaseTracks(CvTracks &tracks) + /// \brief Clear tracks structure. + /// \param tracks List of tracks. + /// \see CvTracks + inline void cvReleaseTracks(CvTracks &tracks) + { + for (CvTracks::iterator it=tracks.begin(); it!=tracks.end(); it++) + { + CvTrack *track = (*it).second; + if (track) delete track; + } + + tracks.clear(); + } + + /// \fn cvUpdateTracks(CvBlobs const &b, CvTracks &t, const double thDistance, const unsigned int thInactive, const unsigned int thActive=0) + /// \brief Updates list of tracks based on current blobs. + /// Tracking based on: + /// A. Senior, A. Hampapur, Y-L Tian, L. Brown, S. Pankanti, R. Bolle. Appearance Models for + /// Occlusion Handling. Second International workshop on Performance Evaluation of Tracking and + /// Surveillance Systems & CVPR'01. December, 2001. + /// (http://www.research.ibm.com/peoplevision/PETS2001.pdf) + /// \param b List of blobs. + /// \param t List of tracks. + /// \param thDistance Max distance to determine when a track and a blob match. + /// \param thInactive Max number of frames a track can be inactive. + /// \param thActive If a track becomes inactive but it has been active less than thActive frames, the track will be deleted. + /// \see CvBlobs + /// \see Tracks + void cvUpdateTracks(CvBlobs const &b, CvTracks &t, const double thDistance, const unsigned int thInactive, const unsigned int thActive=0); + +#define CV_TRACK_RENDER_ID 0x0001 ///< Print the ID of each track in the image. \see cvRenderTracks +#define CV_TRACK_RENDER_BOUNDING_BOX 0x0002 ///< Draw bounding box of each track in the image. \see cvRenderTracks +#define CV_TRACK_RENDER_TO_LOG 0x0010 ///< Print track info to log out. \see cvRenderTracks +#define CV_TRACK_RENDER_TO_STD 0x0020 ///< Print track info to log out. \see cvRenderTracks + + /// \fn void cvRenderTracks(CvTracks const tracks, IplImage *imgSource, IplImage *imgDest, unsigned short mode=0x00ff, CvFont *font=NULL) + /// \brief Prints tracks information. + /// \param tracks List of tracks. + /// \param imgSource Input image (depth=IPL_DEPTH_8U and num. channels=3). + /// \param imgDest Output image (depth=IPL_DEPTH_8U and num. channels=3). + /// \param mode Render mode. By default is CV_TRACK_RENDER_ID|CV_TRACK_RENDER_BOUNDING_BOX. + /// \param font OpenCV font for print on the image. + /// \see CV_TRACK_RENDER_ID + /// \see CV_TRACK_RENDER_BOUNDING_BOX + /// \see CV_TRACK_RENDER_TO_LOG + /// \see CV_TRACK_RENDER_TO_STD + void cvRenderTracks(CvTracks const tracks, IplImage *imgSource, IplImage *imgDest, unsigned short mode=0x000f, CvFont *font=NULL); + } +#ifdef __cplusplus +} +#endif + +/// \fn std::ostream& operator<< (std::ostream& output, const cvb::CvBlob& b) +/// \brief Overload operator "<<" for printing blob structure. +/// \return Stream. +std::ostream& operator<< (std::ostream& output, const cvb::CvBlob& b); + +/// \fn std::ostream& operator<< (std::ostream& output, const cvb::CvContourPolygon& p) +/// \brief Overload operator "<<" for printing polygons in CSV format. +/// \return Stream. +std::ostream& operator<< (std::ostream& output, const cvb::CvContourPolygon& p); + +/// \fn std::ostream& operator<< (std::ostream& output, const cvb::CvTrack& t) +/// \brief Overload operator "<<" for printing track structure. +/// \return Stream. +std::ostream& operator<< (std::ostream& output, const cvb::CvTrack& t); +#endif diff --git a/mariusz/include/cvBlob/cvcolor.cpp b/mariusz/include/cvBlob/cvcolor.cpp new file mode 100644 index 0000000..fda20d4 --- /dev/null +++ b/mariusz/include/cvBlob/cvcolor.cpp @@ -0,0 +1,104 @@ +// Copyright (C) 2007 by Cristóbal Carnero Liñán +// grendel.ccl@gmail.com +// +// This file is part of cvBlob. +// +// cvBlob is free software: you can redistribute it and/or modify +// it under the terms of the Lesser GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// cvBlob is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// Lesser GNU General Public License for more details. +// +// You should have received a copy of the Lesser GNU General Public License +// along with cvBlob. If not, see . +// + +#include +#include +using namespace std; + +#if (defined(_WIN32) || defined(__WIN32__) || defined(__TOS_WIN__) || defined(__WINDOWS__) || (defined(__APPLE__) & defined(__MACH__))) +#include +#else +#include +#endif + +#include "cvblob.h" + +namespace cvb +{ + + CvScalar cvBlobMeanColor(CvBlob const *blob, IplImage const *imgLabel, IplImage const *img) + { + CV_FUNCNAME("cvBlobMeanColor"); + __CV_BEGIN__; + { + CV_ASSERT(imgLabel&&(imgLabel->depth==IPL_DEPTH_LABEL)&&(imgLabel->nChannels==1)); + CV_ASSERT(img&&(img->depth==IPL_DEPTH_8U)&&(img->nChannels==3)); + + int stepLbl = imgLabel->widthStep/(imgLabel->depth/8); + int stepImg = img->widthStep/(img->depth/8); + int imgLabel_width = imgLabel->width; + int imgLabel_height = imgLabel->height; + int imgLabel_offset = 0; + int img_width = img->width; + int img_height = img->height; + int img_offset = 0; + if(imgLabel->roi) + { + imgLabel_width = imgLabel->roi->width; + imgLabel_height = imgLabel->roi->height; + imgLabel_offset = (imgLabel->nChannels * imgLabel->roi->xOffset) + (imgLabel->roi->yOffset * stepLbl); + } + if(img->roi) + { + img_width = img->roi->width; + img_height = img->roi->height; + img_offset = (img->nChannels * img->roi->xOffset) + (img->roi->yOffset * stepImg); + } + + CvLabel *labels = (CvLabel *)imgLabel->imageData + imgLabel_offset; + unsigned char *imgData = (unsigned char *)img->imageData + img_offset; + + double mb = 0; + double mg = 0; + double mr = 0; + double pixels = (double)blob->area; + + for (unsigned int r=0; r<(unsigned int)imgLabel_height; r++, labels+=stepLbl, imgData+=stepImg) + for (unsigned int c=0; c<(unsigned int)imgLabel_width; c++) + { + if (labels[c]==blob->label) + { + mb += ((double)imgData[img->nChannels*c+0])/pixels; // B + mg += ((double)imgData[img->nChannels*c+1])/pixels; // G + mr += ((double)imgData[img->nChannels*c+2])/pixels; // R + } + } + + /*double mb = 0; + double mg = 0; + double mr = 0; + double pixels = (double)blob->area; + for (unsigned int y=0; yheight; y++) + for (unsigned int x=0; xwidth; x++) + { + if (cvGetLabel(imgLabel, x, y)==blob->label) + { + CvScalar color = cvGet2D(img, y, x); + mb += color.val[0]/pixels; + mg += color.val[1]/pixels; + mr += color.val[2]/pixels; + } + }*/ + + return cvScalar(mr, mg, mb); + } + __CV_END__; + } + +} diff --git a/mariusz/include/cvBlob/cvcontour.cpp b/mariusz/include/cvBlob/cvcontour.cpp new file mode 100644 index 0000000..71b514d --- /dev/null +++ b/mariusz/include/cvBlob/cvcontour.cpp @@ -0,0 +1,436 @@ +// Copyright (C) 2007 by Cristóbal Carnero Liñán +// grendel.ccl@gmail.com +// +// This file is part of cvBlob. +// +// cvBlob is free software: you can redistribute it and/or modify +// it under the terms of the Lesser GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// cvBlob is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// Lesser GNU General Public License for more details. +// +// You should have received a copy of the Lesser GNU General Public License +// along with cvBlob. If not, see . +// + +#include + +#define _USE_MATH_DEFINES +#include + +#include +#include +#include +#include +using namespace std; + +#if (defined(_WIN32) || defined(__WIN32__) || defined(__TOS_WIN__) || defined(__WINDOWS__) || (defined(__APPLE__) & defined(__MACH__))) +#include +#else +#include +#endif + +#include "cvblob.h" + +#ifdef M_PI +const double pi = M_PI; +#else +const double pi = std::atan(1.)*4.; +#endif // M_PI + +namespace cvb +{ + + void cvRenderContourChainCode(CvContourChainCode const *contour, IplImage const *img, CvScalar const &color) + { + CV_FUNCNAME("cvRenderContourChainCode"); + __CV_BEGIN__; + { + CV_ASSERT(img&&(img->depth==IPL_DEPTH_8U)&&(img->nChannels==3)); + + int stepDst = img->widthStep/(img->depth/8); + int img_width = img->width; + int img_height = img->height; + int img_offset = 0; + + if(img->roi) + { + img_width = img->roi->width; + img_height = img->roi->height; + img_offset = (img->nChannels * img->roi->xOffset) + (img->roi->yOffset * stepDst); + } + + unsigned char *imgData = (unsigned char *)img->imageData + img_offset; + + unsigned int x = contour->startingPoint.x; + unsigned int y = contour->startingPoint.y; + + for (CvChainCodes::const_iterator it=contour->chainCode.begin(); it!=contour->chainCode.end(); ++it) + { + imgData[img->nChannels*x+img->widthStep*y+0] = (unsigned char)(color.val[0]); // Blue + imgData[img->nChannels*x+img->widthStep*y+1] = (unsigned char)(color.val[1]); // Green + imgData[img->nChannels*x+img->widthStep*y+2] = (unsigned char)(color.val[2]); // Red + + x += cvChainCodeMoves[*it][0]; + y += cvChainCodeMoves[*it][1]; + } + } + __CV_END__; + } + + CvContourPolygon *cvConvertChainCodesToPolygon(CvContourChainCode const *cc) + { + CV_FUNCNAME("cvConvertChainCodesToPolygon"); + __CV_BEGIN__; + { + CV_ASSERT(cc!=NULL); + + CvContourPolygon *contour = new CvContourPolygon; + + unsigned int x = cc->startingPoint.x; + unsigned int y = cc->startingPoint.y; + contour->push_back(cvPoint(x, y)); + + if (cc->chainCode.size()) + { + CvChainCodes::const_iterator it=cc->chainCode.begin(); + CvChainCode lastCode = *it; + + x += cvChainCodeMoves[*it][0]; + y += cvChainCodeMoves[*it][1]; + + ++it; + + for (; it!=cc->chainCode.end(); ++it) + { + if (lastCode!=*it) + { + contour->push_back(cvPoint(x, y)); + lastCode=*it; + } + + x += cvChainCodeMoves[*it][0]; + y += cvChainCodeMoves[*it][1]; + } + } + + return contour; + } + __CV_END__; + } + + void cvRenderContourPolygon(CvContourPolygon const *contour, IplImage *img, CvScalar const &color) + { + CV_FUNCNAME("cvRenderContourPolygon"); + __CV_BEGIN__; + { + CV_ASSERT(img&&(img->depth==IPL_DEPTH_8U)&&(img->nChannels==3)); + + CvContourPolygon::const_iterator it=contour->begin(); + + if (it!=contour->end()) + { + unsigned int fx, x, fy, y; + fx = x = it->x; + fy = y = it->y; + + for (; it!=contour->end(); ++it) + { + cvLine(img, cvPoint(x, y), cvPoint(it->x, it->y), color, 1); + x = it->x; + y = it->y; + } + + cvLine(img, cvPoint(x, y), cvPoint(fx, fy), color, 1); + } + } + __CV_END__; + } + + double cvContourPolygonArea(CvContourPolygon const *p) + { + CV_FUNCNAME("cvContourPolygonArea"); + __CV_BEGIN__; + { + CV_ASSERT(p!=NULL); + + if (p->size()<=2) + return 1.; + + CvContourPolygon::const_iterator it=p->begin(); + CvPoint lastPoint = p->back(); + + double a = 0.; + + for (; it!=p->end(); ++it) + { + a += lastPoint.x*it->y - lastPoint.y*it->x; + lastPoint = *it; + } + + return a*0.5; + } + __CV_END__; + } + + double cvContourChainCodePerimeter(CvContourChainCode const *c) + { + CV_FUNCNAME("cvContourChainCodePerimeter"); + __CV_BEGIN__; + { + CV_ASSERT(c!=NULL); + + double perimeter = 0.; + + for(CvChainCodes::const_iterator it=c->chainCode.begin(); it!=c->chainCode.end(); ++it) + { + if ((*it)%2) + perimeter+=sqrt(1.+1.); + else + perimeter+=1.; + } + + return perimeter; + } + __CV_END__; + } + + double cvContourPolygonPerimeter(CvContourPolygon const *p) + { + CV_FUNCNAME("cvContourPolygonPerimeter"); + __CV_BEGIN__; + { + CV_ASSERT(p!=NULL); + + double perimeter = cvDistancePointPoint((*p)[p->size()-1], (*p)[0]); + + for (unsigned int i=0; isize()-1; i++) + perimeter+=cvDistancePointPoint((*p)[i], (*p)[i+1]); + + return perimeter; + } + __CV_END__; + } + + double cvContourPolygonCircularity(const CvContourPolygon *p) + { + CV_FUNCNAME("cvContourPolygonCircularity"); + __CV_BEGIN__; + { + CV_ASSERT(p!=NULL); + + double l = cvContourPolygonPerimeter(p); + double c = (l*l/cvContourPolygonArea(p)) - 4.*pi; + + if (c>=0.) + return c; + else // This could happen if the blob it's only a pixel: the perimeter will be 0. Another solution would be to force "cvContourPolygonPerimeter" to be 1 or greater. + return 0.; + } + __CV_END__; + } + + void simplifyPolygonRecursive(CvContourPolygon const *p, int const i1, int const i2, bool *pnUseFlag, double const delta) + { + CV_FUNCNAME("cvSimplifyPolygonRecursive"); + __CV_BEGIN__; + { + int endIndex = (i2<0)?p->size():i2; + + if (abs(i1-endIndex)<=1) + return; + + CvPoint firstPoint = (*p)[i1]; + CvPoint lastPoint = (i2<0)?p->front():(*p)[i2]; + + double furtherDistance=0.; + int furtherIndex=0; + + for (int i=i1+1; i=delta)&&(d>furtherDistance)) + { + furtherDistance=d; + furtherIndex=i; + } + } + + if (furtherIndex) + { + pnUseFlag[furtherIndex]=true; + + simplifyPolygonRecursive(p, i1, furtherIndex, pnUseFlag, delta); + simplifyPolygonRecursive(p, furtherIndex, i2, pnUseFlag, delta); + } + } + __CV_END__; + } + + CvContourPolygon *cvSimplifyPolygon(CvContourPolygon const *p, double const delta) + { + CV_FUNCNAME("cvSimplifyPolygon"); + __CV_BEGIN__; + { + CV_ASSERT(p!=NULL); + + double furtherDistance=0.; + unsigned int furtherIndex=0; + + CvContourPolygon::const_iterator it=p->begin(); + ++it; + for (unsigned int i=1; it!=p->end(); ++it, i++) + { + double d = cvDistancePointPoint(*it, p->front()); + + if (d>furtherDistance) + { + furtherDistance = d; + furtherIndex = i; + } + } + + if (furtherDistancepush_back(p->front()); + return result; + } + + bool *pnUseFlag = new bool[p->size()]; + for (unsigned int i=1; isize(); i++) pnUseFlag[i] = false; + + pnUseFlag[0] = pnUseFlag[furtherIndex] = true; + + simplifyPolygonRecursive(p, 0, furtherIndex, pnUseFlag, delta); + simplifyPolygonRecursive(p, furtherIndex, -1, pnUseFlag, delta); + + CvContourPolygon *result = new CvContourPolygon; + + for (unsigned int i=0; isize(); i++) + if (pnUseFlag[i]) + result->push_back((*p)[i]); + + delete[] pnUseFlag; + + return result; + } + __CV_END__; + } + + CvContourPolygon *cvPolygonContourConvexHull(CvContourPolygon const *p) + { + CV_FUNCNAME("cvPolygonContourConvexHull"); + __CV_BEGIN__; + { + CV_ASSERT(p!=NULL); + + if (p->size()<=3) + { + return new CvContourPolygon(p->begin(), p->end()); + } + + deque dq; + + if (cvCrossProductPoints((*p)[0], (*p)[1], (*p)[2])>0) + { + dq.push_back((*p)[0]); + dq.push_back((*p)[1]); + } + else + { + dq.push_back((*p)[1]); + dq.push_back((*p)[0]); + } + + dq.push_back((*p)[2]); + dq.push_front((*p)[2]); + + for (unsigned int i=3; isize(); i++) + { + int s = dq.size(); + + if ((cvCrossProductPoints((*p)[i], dq.at(0), dq.at(1))>=0) && (cvCrossProductPoints(dq.at(s-2), dq.at(s-1), (*p)[i])>=0)) + continue; // TODO Optimize. + + while (cvCrossProductPoints(dq.at(s-2), dq.at(s-1), (*p)[i])<0) + { + dq.pop_back(); + s = dq.size(); + } + + dq.push_back((*p)[i]); + + while (cvCrossProductPoints((*p)[i], dq.at(0), dq.at(1))<0) + dq.pop_front(); + + dq.push_front((*p)[i]); + } + + return new CvContourPolygon(dq.begin(), dq.end()); + } + __CV_END__; + } + + void cvWriteContourPolygonCSV(const CvContourPolygon& p, const string& filename) + { + ofstream f; + f.open(filename.c_str()); + + f << p << endl; + + f.close(); + } + + void cvWriteContourPolygonSVG(const CvContourPolygon& p, const string& filename, const CvScalar& stroke, const CvScalar& fill) + { + int minx=INT_MAX; + int miny=INT_MAX; + int maxx=INT_MIN; + int maxy=INT_MIN; + + stringstream buffer(""); + + for (CvContourPolygon::const_iterator it=p.begin(); it!=p.end(); ++it) + { + if (it->x>maxx) + maxx = it->x; + if (it->xx; + + if (it->y>maxy) + maxy = it->y; + if (it->yy; + + buffer << it->x << "," << it->y << " "; + } + + ofstream f; + f.open(filename.c_str()); + + f << "" << endl; + f << "" << endl; + f << "" << endl; + + f << "" << endl; + + f << "" << endl; + + f.close(); + } + +} + +ostream& operator<< (ostream& output, const cvb::CvContourPolygon& p) +{ + for (cvb::CvContourPolygon::const_iterator it=p.begin(); it!=p.end(); ++it) + output << it->x << ", " << it->y << endl; + + return output; +} diff --git a/mariusz/include/cvBlob/cvlabel.cpp b/mariusz/include/cvBlob/cvlabel.cpp new file mode 100644 index 0000000..61ff01d --- /dev/null +++ b/mariusz/include/cvBlob/cvlabel.cpp @@ -0,0 +1,444 @@ +// Copyright (C) 2007 by Cristóbal Carnero Liñán +// grendel.ccl@gmail.com +// +// This file is part of cvBlob. +// +// cvBlob is free software: you can redistribute it and/or modify +// it under the terms of the Lesser GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// cvBlob is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// Lesser GNU General Public License for more details. +// +// You should have received a copy of the Lesser GNU General Public License +// along with cvBlob. If not, see . +// + +#include +#include +using namespace std; + +#if (defined(_WIN32) || defined(__WIN32__) || defined(__TOS_WIN__) || defined(__WINDOWS__) || (defined(__APPLE__) & defined(__MACH__))) +#include +#else +#include +#endif + +#include "cvblob.h" + +namespace cvb +{ + const char movesE[4][3][4] = { { {-1, -1, 3, CV_CHAINCODE_UP_LEFT }, { 0, -1, 0, CV_CHAINCODE_UP }, { 1, -1, 0, CV_CHAINCODE_UP_RIGHT } }, + { { 1, -1, 0, CV_CHAINCODE_UP_RIGHT }, { 1, 0, 1, CV_CHAINCODE_RIGHT}, { 1, 1, 1, CV_CHAINCODE_DOWN_RIGHT } }, + { { 1, 1, 1, CV_CHAINCODE_DOWN_RIGHT}, { 0, 1, 2, CV_CHAINCODE_DOWN }, {-1, 1, 2, CV_CHAINCODE_DOWN_LEFT } }, + { {-1, 1, 2, CV_CHAINCODE_DOWN_LEFT }, {-1, 0, 3, CV_CHAINCODE_LEFT }, {-1, -1, 3, CV_CHAINCODE_UP_LEFT } } + }; + + const char movesI[4][3][4] = { { { 1, -1, 3, CV_CHAINCODE_UP_RIGHT }, { 0, -1, 0, CV_CHAINCODE_UP }, {-1, -1, 0, CV_CHAINCODE_UP_LEFT } }, + { {-1, -1, 0, CV_CHAINCODE_UP_LEFT }, {-1, 0, 1, CV_CHAINCODE_LEFT }, {-1, 1, 1, CV_CHAINCODE_DOWN_LEFT } }, + { {-1, 1, 1, CV_CHAINCODE_DOWN_LEFT }, { 0, 1, 2, CV_CHAINCODE_DOWN }, { 1, 1, 2, CV_CHAINCODE_DOWN_RIGHT } }, + { { 1, 1, 2, CV_CHAINCODE_DOWN_RIGHT }, { 1, 0, 3, CV_CHAINCODE_RIGHT}, { 1, -1, 3, CV_CHAINCODE_UP_RIGHT } } + }; + + + unsigned int cvLabel (IplImage const *img, IplImage *imgOut, CvBlobs &blobs) + { + CV_FUNCNAME("cvLabel"); + __CV_BEGIN__; + { + CV_ASSERT(img&&(img->depth==IPL_DEPTH_8U)&&(img->nChannels==1)); + CV_ASSERT(imgOut&&(imgOut->depth==IPL_DEPTH_LABEL)&&(imgOut->nChannels==1)); + + unsigned int numPixels=0; + + cvSetZero(imgOut); + + CvLabel label=0; + cvReleaseBlobs(blobs); + + unsigned int stepIn = img->widthStep / (img->depth / 8); + unsigned int stepOut = imgOut->widthStep / (imgOut->depth / 8); + unsigned int imgIn_width = img->width; + unsigned int imgIn_height = img->height; + unsigned int imgIn_offset = 0; + unsigned int imgOut_width = imgOut->width; + unsigned int imgOut_height = imgOut->height; + unsigned int imgOut_offset = 0; + if(img->roi) + { + imgIn_width = img->roi->width; + imgIn_height = img->roi->height; + imgIn_offset = img->roi->xOffset + (img->roi->yOffset * stepIn); + } + if(imgOut->roi) + { + imgOut_width = imgOut->roi->width; + imgOut_height = imgOut->roi->height; + imgOut_offset = imgOut->roi->xOffset + (imgOut->roi->yOffset * stepOut); + } + + unsigned char *imgDataIn = (unsigned char *)img->imageData + imgIn_offset; + CvLabel *imgDataOut = (CvLabel *)imgOut->imageData + imgOut_offset; + +#define imageIn(X, Y) imgDataIn[(X) + (Y)*stepIn] +#define imageOut(X, Y) imgDataOut[(X) + (Y)*stepOut] + + CvLabel lastLabel = 0; + CvBlob *lastBlob = NULL; + + for (unsigned int y=0; y0) + imageOut(x, y-1) = CV_BLOB_MAX_LABEL; + + CvBlob *blob = new CvBlob; + blob->label = label; + blob->area = 1; + blob->minx = x; blob->maxx = x; + blob->miny = y; blob->maxy = y; + blob->m10=x; blob->m01=y; + blob->m11=x*y; + blob->m20=x*x; blob->m02=y*y; + blob->internalContours.clear(); + blobs.insert(CvLabelBlob(label,blob)); + + lastLabel = label; + lastBlob = blob; + + blob->contour.startingPoint = cvPoint(x, y); + + unsigned char direction=1; + unsigned int xx = x; + unsigned int yy = y; + + + bool contourEnd = false; + + do + { + for (unsigned int numAttempts=0; numAttempts<3; numAttempts++) + { + bool found = false; + + for (unsigned char i=0; i<3; i++) + { + int nx = xx+movesE[direction][i][0]; + int ny = yy+movesE[direction][i][1]; + if ((nx=0)&&(ny=0)) + { + if (imageIn(nx, ny)) + { + found = true; + + blob->contour.chainCode.push_back(movesE[direction][i][3]); + + xx=nx; + yy=ny; + + direction=movesE[direction][i][2]; + break; + } + else + { + imageOut(nx, ny) = CV_BLOB_MAX_LABEL; + } + } + } + + if (!found) + direction=(direction+1)%4; + else + { + if (imageOut(xx, yy) != label) + { + imageOut(xx, yy) = label; + numPixels++; + + if (xxminx) blob->minx = xx; + else if (xx>blob->maxx) blob->maxx = xx; + if (yyminy) blob->miny = yy; + else if (yy>blob->maxy) blob->maxy = yy; + + blob->area++; + blob->m10+=xx; blob->m01+=yy; + blob->m11+=xx*yy; + blob->m20+=xx*xx; blob->m02+=yy*yy; + } + + break; + } + + if (contourEnd = ((xx==x) && (yy==y) && (direction==1))) + break; + } + } + while (!contourEnd); + + } + + if ((y+1second; + lastLabel = l; + lastBlob = blob; + } + blob->area++; + blob->m10+=x; blob->m01+=y; + blob->m11+=x*y; + blob->m20+=x*x; blob->m02+=y*y; + } + else + { + l = imageOut(x, y); + + if (l==lastLabel) + blob = lastBlob; + else + { + blob = blobs.find(l)->second; + lastLabel = l; + lastBlob = blob; + } + } + + // XXX This is not necessary (I believe). I only do this for consistency. + imageOut(x, y+1) = CV_BLOB_MAX_LABEL; + + CvContourChainCode *contour = new CvContourChainCode; + contour->startingPoint = cvPoint(x, y); + + unsigned char direction = 3; + unsigned int xx = x; + unsigned int yy = y; + + do + { + for (unsigned int numAttempts=0; numAttempts<3; numAttempts++) + { + bool found = false; + + for (unsigned char i=0; i<3; i++) + { + int nx = xx+movesI[direction][i][0]; + int ny = yy+movesI[direction][i][1]; + if (imageIn(nx, ny)) + { + found = true; + + contour->chainCode.push_back(movesI[direction][i][3]); + + xx=nx; + yy=ny; + + direction=movesI[direction][i][2]; + break; + } + else + { + imageOut(nx, ny) = CV_BLOB_MAX_LABEL; + } + } + + if (!found) + direction=(direction+1)%4; + else + { + if (!imageOut(xx, yy)) + { + imageOut(xx, yy) = l; + numPixels++; + + blob->area++; + blob->m10+=xx; blob->m01+=yy; + blob->m11+=xx*yy; + blob->m20+=xx*xx; blob->m02+=yy*yy; + } + + break; + } + } + } + while (!(xx==x && yy==y)); + + blob->internalContours.push_back(contour); + } + + //else if (!imageOut(x, y)) + if (!labeled) + { + // Internal pixel + CvLabel l = imageOut(x-1, y); + + imageOut(x, y) = l; + numPixels++; + + CvBlob *blob = NULL; + if (l==lastLabel) + blob = lastBlob; + else + { + blob = blobs.find(l)->second; + lastLabel = l; + lastBlob = blob; + } + blob->area++; + blob->m10+=x; blob->m01+=y; + blob->m11+=x*y; + blob->m20+=x*x; blob->m02+=y*y; + } + } + } + } + + for (CvBlobs::iterator it=blobs.begin(); it!=blobs.end(); ++it) + { + cvCentroid((*it).second); + + (*it).second->u11 = (*it).second->m11 - ((*it).second->m10*(*it).second->m01)/(*it).second->m00; + (*it).second->u20 = (*it).second->m20 - ((*it).second->m10*(*it).second->m10)/(*it).second->m00; + (*it).second->u02 = (*it).second->m02 - ((*it).second->m01*(*it).second->m01)/(*it).second->m00; + + double m00_2 = (*it).second->m00 * (*it).second->m00; + + (*it).second->n11 = (*it).second->u11 / m00_2; + (*it).second->n20 = (*it).second->u20 / m00_2; + (*it).second->n02 = (*it).second->u02 / m00_2; + + (*it).second->p1 = (*it).second->n20 + (*it).second->n02; + + double nn = (*it).second->n20 - (*it).second->n02; + (*it).second->p2 = nn*nn + 4.*((*it).second->n11*(*it).second->n11); + } + + return numPixels; + + } + __CV_END__; + } + + void cvFilterLabels(IplImage *imgIn, IplImage *imgOut, const CvBlobs &blobs) + { + CV_FUNCNAME("cvFilterLabels"); + __CV_BEGIN__; + { + CV_ASSERT(imgIn&&(imgIn->depth==IPL_DEPTH_LABEL)&&(imgIn->nChannels==1)); + CV_ASSERT(imgOut&&(imgOut->depth==IPL_DEPTH_8U)&&(imgOut->nChannels==1)); + + int stepIn = imgIn->widthStep / (imgIn->depth / 8); + int stepOut = imgOut->widthStep / (imgOut->depth / 8); + int imgIn_width = imgIn->width; + int imgIn_height = imgIn->height; + int imgIn_offset = 0; + int imgOut_width = imgOut->width; + int imgOut_height = imgOut->height; + int imgOut_offset = 0; + if(imgIn->roi) + { + imgIn_width = imgIn->roi->width; + imgIn_height = imgIn->roi->height; + imgIn_offset = imgIn->roi->xOffset + (imgIn->roi->yOffset * stepIn); + } + if(imgOut->roi) + { + imgOut_width = imgOut->roi->width; + imgOut_height = imgOut->roi->height; + imgOut_offset = imgOut->roi->xOffset + (imgOut->roi->yOffset * stepOut); + } + + char *imgDataOut=imgOut->imageData + imgOut_offset; + CvLabel *imgDataIn=(CvLabel *)imgIn->imageData + imgIn_offset; + + for (unsigned int r=0;r<(unsigned int)imgIn_height;r++, + imgDataIn+=stepIn,imgDataOut+=stepOut) + { + for (unsigned int c=0;c<(unsigned int)imgIn_width;c++) + { + if (imgDataIn[c]) + { + if (blobs.find(imgDataIn[c])==blobs.end()) imgDataOut[c]=0x00; + else imgDataOut[c]=(char)0xff; + } + else + imgDataOut[c]=0x00; + } + } + } + __CV_END__; + } + + + CvLabel cvGetLabel(IplImage const *img, unsigned int x, unsigned int y) + { + CV_FUNCNAME("cvGetLabel"); + __CV_BEGIN__; + { + CV_ASSERT(img&&(img->depth==IPL_DEPTH_LABEL)&&(img->nChannels==1)); + + int step = img->widthStep / (img->depth / 8); + int img_width = 0; + int img_height= 0; + int img_offset = 0; + if(img->roi) + { + img_width = img->roi->width; + img_height = img->roi->height; + img_offset = img->roi->xOffset + (img->roi->yOffset * step); + } + else + { + img_width = img->width; + img_height= img->height; + } + + CV_ASSERT((x>=0)&&(x=0)&&(yimageData + img_offset))[x + y*step]; + } + __CV_END__; + } + +} diff --git a/mariusz/include/cvBlob/cvtrack.cpp b/mariusz/include/cvBlob/cvtrack.cpp new file mode 100644 index 0000000..6bc8ca1 --- /dev/null +++ b/mariusz/include/cvBlob/cvtrack.cpp @@ -0,0 +1,419 @@ +// Copyright (C) 2007 by Cristóbal Carnero Liñán +// grendel.ccl@gmail.com +// +// This file is part of cvBlob. +// +// cvBlob is free software: you can redistribute it and/or modify +// it under the terms of the Lesser GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// cvBlob is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// Lesser GNU General Public License for more details. +// +// You should have received a copy of the Lesser GNU General Public License +// along with cvBlob. If not, see . +// + +#include +#include +#include +using namespace std; + +#if (defined(_WIN32) || defined(__WIN32__) || defined(__TOS_WIN__) || defined(__WINDOWS__) || (defined(__APPLE__) & defined(__MACH__))) +#include +#else +#include +#endif + +#include "cvblob.h" + +namespace cvb +{ + + double distantBlobTrack(CvBlob const *b, CvTrack const *t) + { + double d1; + if (b->centroid.xminx) + { + if (b->centroid.yminy) + d1 = MAX(t->minx - b->centroid.x, t->miny - b->centroid.y); + else if (b->centroid.y>t->maxy) + d1 = MAX(t->minx - b->centroid.x, b->centroid.y - t->maxy); + else // if (t->miny < b->centroid.y)&&(b->centroid.y < t->maxy) + d1 = t->minx - b->centroid.x; + } + else if (b->centroid.x>t->maxx) + { + if (b->centroid.yminy) + d1 = MAX(b->centroid.x - t->maxx, t->miny - b->centroid.y); + else if (b->centroid.y>t->maxy) + d1 = MAX(b->centroid.x - t->maxx, b->centroid.y - t->maxy); + else + d1 = b->centroid.x - t->maxx; + } + else // if (t->minx =< b->centroid.x) && (b->centroid.x =< t->maxx) + { + if (b->centroid.yminy) + d1 = t->miny - b->centroid.y; + else if (b->centroid.y>t->maxy) + d1 = b->centroid.y - t->maxy; + else + return 0.; + } + + double d2; + if (t->centroid.xminx) + { + if (t->centroid.yminy) + d2 = MAX(b->minx - t->centroid.x, b->miny - t->centroid.y); + else if (t->centroid.y>b->maxy) + d2 = MAX(b->minx - t->centroid.x, t->centroid.y - b->maxy); + else // if (b->miny < t->centroid.y)&&(t->centroid.y < b->maxy) + d2 = b->minx - t->centroid.x; + } + else if (t->centroid.x>b->maxx) + { + if (t->centroid.yminy) + d2 = MAX(t->centroid.x - b->maxx, b->miny - t->centroid.y); + else if (t->centroid.y>b->maxy) + d2 = MAX(t->centroid.x - b->maxx, t->centroid.y - b->maxy); + else + d2 = t->centroid.x - b->maxx; + } + else // if (b->minx =< t->centroid.x) && (t->centroid.x =< b->maxx) + { + if (t->centroid.yminy) + d2 = b->miny - t->centroid.y; + else if (t->centroid.y>b->maxy) + d2 = t->centroid.y - b->maxy; + else + return 0.; + } + + return MIN(d1, d2); + } + + // Access to matrix +#define C(blob, track) close[((blob) + (track)*(nBlobs+2))] + // Access to accumulators +#define AB(label) C((label), (nTracks)) +#define AT(id) C((nBlobs), (id)) + // Access to identifications +#define IB(label) C((label), (nTracks)+1) +#define IT(id) C((nBlobs)+1, (id)) + // Access to registers +#define B(label) blobs.find(IB(label))->second +#define T(id) tracks.find(IT(id))->second + + void getClusterForTrack(unsigned int trackPos, CvID *close, unsigned int nBlobs, unsigned int nTracks, CvBlobs const &blobs, CvTracks const &tracks, list &bb, list &tt); + + void getClusterForBlob(unsigned int blobPos, CvID *close, unsigned int nBlobs, unsigned int nTracks, CvBlobs const &blobs, CvTracks const &tracks, list &bb, list &tt) + { + for (unsigned int j=0; j1) + { + getClusterForTrack(j, close, nBlobs, nTracks, blobs, tracks, bb, tt); + } + } + } + } + + void getClusterForTrack(unsigned int trackPos, CvID *close, unsigned int nBlobs, unsigned int nTracks, CvBlobs const &blobs, CvTracks const &tracks, list &bb, list &tt) + { + for (unsigned int i=0; i1) + { + getClusterForBlob(i, close, nBlobs, nTracks, blobs, tracks, bb, tt); + } + } + } + } + + void cvUpdateTracks(CvBlobs const &blobs, CvTracks &tracks, const double thDistance, const unsigned int thInactive, const unsigned int thActive) + { + CV_FUNCNAME("cvUpdateTracks"); + __CV_BEGIN__; + + unsigned int nBlobs = blobs.size(); + unsigned int nTracks = tracks.size(); + + // Proximity matrix: + // Last row/column is for ID/label. + // Last-1 "/" is for accumulation. + CvID *close = new unsigned int[(nBlobs+2)*(nTracks+2)]; // XXX Must be same type than CvLabel. + + try + { + // Inicialization: + unsigned int i=0; + for (CvBlobs::const_iterator it = blobs.begin(); it!=blobs.end(); ++it, i++) + { + AB(i) = 0; + IB(i) = it->second->label; + } + + CvID maxTrackID = 0; + + unsigned int j=0; + for (CvTracks::const_iterator jt = tracks.begin(); jt!=tracks.end(); ++jt, j++) + { + AT(j) = 0; + IT(j) = jt->second->id; + if (jt->second->id > maxTrackID) + maxTrackID = jt->second->id; + } + + // Proximity matrix calculation and "used blob" list inicialization: + for (i=0; iinactive++; + track->label = 0; + } + } + + // Detect new tracks + for (i=0; iid = maxTrackID; + track->label = blob->label; + track->minx = blob->minx; + track->miny = blob->miny; + track->maxx = blob->maxx; + track->maxy = blob->maxy; + track->centroid = blob->centroid; + track->lifetime = 0; + track->active = 0; + track->inactive = 0; + tracks.insert(CvIDTrack(maxTrackID, track)); + } + } + + // Clustering + for (j=0; j tt; tt.push_back(T(j)); + list bb; + + getClusterForTrack(j, close, nBlobs, nTracks, blobs, tracks, bb, tt); + + // Select track + CvTrack *track; + unsigned int area = 0; + for (list::const_iterator it=tt.begin(); it!=tt.end(); ++it) + { + CvTrack *t = *it; + + unsigned int a = (t->maxx-t->minx)*(t->maxy-t->miny); + if (a>area) + { + area = a; + track = t; + } + } + + // Select blob + CvBlob *blob; + area = 0; + //cout << "Matching blobs: "; + for (list::const_iterator it=bb.begin(); it!=bb.end(); ++it) + { + CvBlob *b = *it; + + //cout << b->label << " "; + + if (b->area>area) + { + area = b->area; + blob = b; + } + } + //cout << endl; + + // Update track + //cout << "Matching: track=" << track->id << ", blob=" << blob->label << endl; + track->label = blob->label; + track->centroid = blob->centroid; + track->minx = blob->minx; + track->miny = blob->miny; + track->maxx = blob->maxx; + track->maxy = blob->maxy; + if (track->inactive) + track->active = 0; + track->inactive = 0; + + // Others to inactive + for (list::const_iterator it=tt.begin(); it!=tt.end(); ++it) + { + CvTrack *t = *it; + + if (t!=track) + { + //cout << "Inactive: track=" << t->id << endl; + t->inactive++; + t->label = 0; + } + } + } + } + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + for (CvTracks::iterator jt=tracks.begin(); jt!=tracks.end();) + if ((jt->second->inactive>=thInactive)||((jt->second->inactive)&&(thActive)&&(jt->second->activesecond; + tracks.erase(jt++); + } + else + { + jt->second->lifetime++; + if (!jt->second->inactive) + jt->second->active++; + ++jt; + } + } + catch (...) + { + delete[] close; + throw; // TODO: OpenCV style. + } + + delete[] close; + + __CV_END__; + } + + CvFont *defaultFont = NULL; + + void cvRenderTracks(CvTracks const tracks, IplImage *imgSource, IplImage *imgDest, unsigned short mode, CvFont *font) + { + CV_FUNCNAME("cvRenderTracks"); + __CV_BEGIN__; + + CV_ASSERT(imgDest&&(imgDest->depth==IPL_DEPTH_8U)&&(imgDest->nChannels==3)); + + if ((mode&CV_TRACK_RENDER_ID)&&(!font)) + { + if (!defaultFont) + { + font = defaultFont = new CvFont; + cvInitFont(font, CV_FONT_HERSHEY_DUPLEX, 0.5, 0.5, 0, 1); + // Other fonts: + // CV_FONT_HERSHEY_SIMPLEX, CV_FONT_HERSHEY_PLAIN, + // CV_FONT_HERSHEY_DUPLEX, CV_FONT_HERSHEY_COMPLEX, + // CV_FONT_HERSHEY_TRIPLEX, CV_FONT_HERSHEY_COMPLEX_SMALL, + // CV_FONT_HERSHEY_SCRIPT_SIMPLEX, CV_FONT_HERSHEY_SCRIPT_COMPLEX + } + else + font = defaultFont; + } + + if (mode) + { + for (CvTracks::const_iterator it=tracks.begin(); it!=tracks.end(); ++it) + { + if (mode&CV_TRACK_RENDER_ID) + if (!it->second->inactive) + { + stringstream buffer; + buffer << it->first; + cvPutText(imgDest, buffer.str().c_str(), cvPoint((int)it->second->centroid.x, (int)it->second->centroid.y), font, CV_RGB(0.,255.,0.)); + } + + if (mode&CV_TRACK_RENDER_BOUNDING_BOX) + if (it->second->inactive) + cvRectangle(imgDest, cvPoint(it->second->minx, it->second->miny), cvPoint(it->second->maxx-1, it->second->maxy-1), CV_RGB(0., 0., 50.)); + else + cvRectangle(imgDest, cvPoint(it->second->minx, it->second->miny), cvPoint(it->second->maxx-1, it->second->maxy-1), CV_RGB(0., 0., 255.)); + + if (mode&CV_TRACK_RENDER_TO_LOG) + { + clog << "Track " << it->second->id << endl; + if (it->second->inactive) + clog << " - Inactive for " << it->second->inactive << " frames" << endl; + else + clog << " - Associated with blob " << it->second->label << endl; + clog << " - Lifetime " << it->second->lifetime << endl; + clog << " - Active " << it->second->active << endl; + clog << " - Bounding box: (" << it->second->minx << ", " << it->second->miny << ") - (" << it->second->maxx << ", " << it->second->maxy << ")" << endl; + clog << " - Centroid: (" << it->second->centroid.x << ", " << it->second->centroid.y << ")" << endl; + clog << endl; + } + + if (mode&CV_TRACK_RENDER_TO_STD) + { + cout << "Track " << it->second->id << endl; + if (it->second->inactive) + cout << " - Inactive for " << it->second->inactive << " frames" << endl; + else + cout << " - Associated with blobs " << it->second->label << endl; + cout << " - Lifetime " << it->second->lifetime << endl; + cout << " - Active " << it->second->active << endl; + cout << " - Bounding box: (" << it->second->minx << ", " << it->second->miny << ") - (" << it->second->maxx << ", " << it->second->maxy << ")" << endl; + cout << " - Centroid: (" << it->second->centroid.x << ", " << it->second->centroid.y << ")" << endl; + cout << endl; + } + } + } + + __CV_END__; + } + +} diff --git a/mariusz/nbproject/Makefile-Debug.mk b/mariusz/nbproject/Makefile-Debug.mk new file mode 100644 index 0000000..74f3e76 --- /dev/null +++ b/mariusz/nbproject/Makefile-Debug.mk @@ -0,0 +1,90 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a -pre and a -post target defined where you can add customized code. +# +# This makefile implements configuration specific macros and targets. + + +# Environment +MKDIR=mkdir +CP=cp +GREP=grep +NM=nm +CCADMIN=CCadmin +RANLIB=ranlib +CC=gcc +CCC=g++ +CXX=g++ +FC=gfortran +AS=as + +# Macros +CND_PLATFORM=GNU-Linux-x86 +CND_DLIB_EXT=so +CND_CONF=Debug +CND_DISTDIR=dist +CND_BUILDDIR=build + +# Include project Makefile +include Makefile + +# Object Directory +OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} + +# Object Files +OBJECTFILES= \ + ${OBJECTDIR}/src/HandPointer/HandPointer.o \ + ${OBJECTDIR}/src/HandPointer/Mouse.o + + +# C Compiler Flags +CFLAGS= + +# CC Compiler Flags +CCFLAGS=`pkg-config opencv --cflags --libs` -lX11 -I/usr/local/include -L/usr/local/lib -lcvblob +CXXFLAGS=`pkg-config opencv --cflags --libs` -lX11 -I/usr/local/include -L/usr/local/lib -lcvblob + +# Fortran Compiler Flags +FFLAGS= + +# Assembler Flags +ASFLAGS= + +# Link Libraries and Options +LDLIBSOPTIONS= + +# Build Targets +.build-conf: ${BUILD_SUBPROJECTS} + "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/mariusz + +${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/mariusz: ${OBJECTFILES} + ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM} + ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/mariusz ${OBJECTFILES} ${LDLIBSOPTIONS} + +${OBJECTDIR}/src/HandPointer/HandPointer.o: nbproject/Makefile-${CND_CONF}.mk src/HandPointer/HandPointer.cpp + ${MKDIR} -p ${OBJECTDIR}/src/HandPointer + ${RM} $@.d + $(COMPILE.cc) -g -Iinclude/cvBlob `pkg-config opencv --cflags --libs` -lX11 -I/usr/local/include -L/usr/local/lib -lcvblob -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/HandPointer/HandPointer.o src/HandPointer/HandPointer.cpp + +${OBJECTDIR}/src/HandPointer/Mouse.o: nbproject/Makefile-${CND_CONF}.mk src/HandPointer/Mouse.cpp + ${MKDIR} -p ${OBJECTDIR}/src/HandPointer + ${RM} $@.d + $(COMPILE.cc) -g -Iinclude/cvBlob `pkg-config opencv --cflags --libs` -lX11 -I/usr/local/include -L/usr/local/lib -lcvblob -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/HandPointer/Mouse.o src/HandPointer/Mouse.cpp + +# Subprojects +.build-subprojects: + +# Clean Targets +.clean-conf: ${CLEAN_SUBPROJECTS} + ${RM} -r ${CND_BUILDDIR}/${CND_CONF} + ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/mariusz + +# Subprojects +.clean-subprojects: + +# Enable dependency checking +.dep.inc: .depcheck-impl + +include .dep.inc diff --git a/mariusz/nbproject/Makefile-Release.mk b/mariusz/nbproject/Makefile-Release.mk new file mode 100644 index 0000000..9fefdcb --- /dev/null +++ b/mariusz/nbproject/Makefile-Release.mk @@ -0,0 +1,90 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a -pre and a -post target defined where you can add customized code. +# +# This makefile implements configuration specific macros and targets. + + +# Environment +MKDIR=mkdir +CP=cp +GREP=grep +NM=nm +CCADMIN=CCadmin +RANLIB=ranlib +CC=gcc +CCC=g++ +CXX=g++ +FC=gfortran +AS=as + +# Macros +CND_PLATFORM=GNU-Linux-x86 +CND_DLIB_EXT=so +CND_CONF=Release +CND_DISTDIR=dist +CND_BUILDDIR=build + +# Include project Makefile +include Makefile + +# Object Directory +OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} + +# Object Files +OBJECTFILES= \ + ${OBJECTDIR}/src/HandPointer/HandPointer.o \ + ${OBJECTDIR}/src/HandPointer/Mouse.o + + +# C Compiler Flags +CFLAGS= + +# CC Compiler Flags +CCFLAGS= +CXXFLAGS= + +# Fortran Compiler Flags +FFLAGS= + +# Assembler Flags +ASFLAGS= + +# Link Libraries and Options +LDLIBSOPTIONS= + +# Build Targets +.build-conf: ${BUILD_SUBPROJECTS} + "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/mariusz + +${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/mariusz: ${OBJECTFILES} + ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM} + ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/mariusz ${OBJECTFILES} ${LDLIBSOPTIONS} + +${OBJECTDIR}/src/HandPointer/HandPointer.o: src/HandPointer/HandPointer.cpp + ${MKDIR} -p ${OBJECTDIR}/src/HandPointer + ${RM} $@.d + $(COMPILE.cc) -O2 -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/HandPointer/HandPointer.o src/HandPointer/HandPointer.cpp + +${OBJECTDIR}/src/HandPointer/Mouse.o: src/HandPointer/Mouse.cpp + ${MKDIR} -p ${OBJECTDIR}/src/HandPointer + ${RM} $@.d + $(COMPILE.cc) -O2 -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/HandPointer/Mouse.o src/HandPointer/Mouse.cpp + +# Subprojects +.build-subprojects: + +# Clean Targets +.clean-conf: ${CLEAN_SUBPROJECTS} + ${RM} -r ${CND_BUILDDIR}/${CND_CONF} + ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/mariusz + +# Subprojects +.clean-subprojects: + +# Enable dependency checking +.dep.inc: .depcheck-impl + +include .dep.inc diff --git a/mariusz/nbproject/Makefile-impl.mk b/mariusz/nbproject/Makefile-impl.mk new file mode 100644 index 0000000..c921dc5 --- /dev/null +++ b/mariusz/nbproject/Makefile-impl.mk @@ -0,0 +1,133 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a pre- and a post- target defined where you can add customization code. +# +# This makefile implements macros and targets common to all configurations. +# +# NOCDDL + + +# Building and Cleaning subprojects are done by default, but can be controlled with the SUB +# macro. If SUB=no, subprojects will not be built or cleaned. The following macro +# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf +# and .clean-reqprojects-conf unless SUB has the value 'no' +SUB_no=NO +SUBPROJECTS=${SUB_${SUB}} +BUILD_SUBPROJECTS_=.build-subprojects +BUILD_SUBPROJECTS_NO= +BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}} +CLEAN_SUBPROJECTS_=.clean-subprojects +CLEAN_SUBPROJECTS_NO= +CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} + + +# Project Name +PROJECTNAME=mariusz + +# Active Configuration +DEFAULTCONF=Debug +CONF=${DEFAULTCONF} + +# All Configurations +ALLCONFS=Debug Release + + +# build +.build-impl: .build-pre .validate-impl .depcheck-impl + @#echo "=> Running $@... Configuration=$(CONF)" + "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf + + +# clean +.clean-impl: .clean-pre .validate-impl .depcheck-impl + @#echo "=> Running $@... Configuration=$(CONF)" + "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf + + +# clobber +.clobber-impl: .clobber-pre .depcheck-impl + @#echo "=> Running $@..." + for CONF in ${ALLCONFS}; \ + do \ + "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf; \ + done + +# all +.all-impl: .all-pre .depcheck-impl + @#echo "=> Running $@..." + for CONF in ${ALLCONFS}; \ + do \ + "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf; \ + done + +# build tests +.build-tests-impl: .build-impl .build-tests-pre + @#echo "=> Running $@... Configuration=$(CONF)" + "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-tests-conf + +# run tests +.test-impl: .build-tests-impl .test-pre + @#echo "=> Running $@... Configuration=$(CONF)" + "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .test-conf + +# dependency checking support +.depcheck-impl: + @echo "# This code depends on make tool being used" >.dep.inc + @if [ -n "${MAKE_VERSION}" ]; then \ + echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \ + echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ + echo "include \$${DEPFILES}" >>.dep.inc; \ + echo "endif" >>.dep.inc; \ + else \ + echo ".KEEP_STATE:" >>.dep.inc; \ + echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ + fi + +# configuration validation +.validate-impl: + @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \ + then \ + echo ""; \ + echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \ + echo "See 'make help' for details."; \ + echo "Current directory: " `pwd`; \ + echo ""; \ + fi + @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \ + then \ + exit 1; \ + fi + + +# help +.help-impl: .help-pre + @echo "This makefile supports the following configurations:" + @echo " ${ALLCONFS}" + @echo "" + @echo "and the following targets:" + @echo " build (default target)" + @echo " clean" + @echo " clobber" + @echo " all" + @echo " help" + @echo "" + @echo "Makefile Usage:" + @echo " make [CONF=] [SUB=no] build" + @echo " make [CONF=] [SUB=no] clean" + @echo " make [SUB=no] clobber" + @echo " make [SUB=no] all" + @echo " make help" + @echo "" + @echo "Target 'build' will build a specific configuration and, unless 'SUB=no'," + @echo " also build subprojects." + @echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no'," + @echo " also clean subprojects." + @echo "Target 'clobber' will remove all built files from all configurations and," + @echo " unless 'SUB=no', also from subprojects." + @echo "Target 'all' will will build all configurations and, unless 'SUB=no'," + @echo " also build subprojects." + @echo "Target 'help' prints this message." + @echo "" + diff --git a/mariusz/nbproject/Makefile-variables.mk b/mariusz/nbproject/Makefile-variables.mk new file mode 100644 index 0000000..9958240 --- /dev/null +++ b/mariusz/nbproject/Makefile-variables.mk @@ -0,0 +1,35 @@ +# +# Generated - do not edit! +# +# NOCDDL +# +CND_BASEDIR=`pwd` +CND_BUILDDIR=build +CND_DISTDIR=dist +# Debug configuration +CND_PLATFORM_Debug=GNU-Linux-x86 +CND_ARTIFACT_DIR_Debug=dist/Debug/GNU-Linux-x86 +CND_ARTIFACT_NAME_Debug=mariusz +CND_ARTIFACT_PATH_Debug=dist/Debug/GNU-Linux-x86/mariusz +CND_PACKAGE_DIR_Debug=dist/Debug/GNU-Linux-x86/package +CND_PACKAGE_NAME_Debug=mariusz.tar +CND_PACKAGE_PATH_Debug=dist/Debug/GNU-Linux-x86/package/mariusz.tar +# Release configuration +CND_PLATFORM_Release=GNU-Linux-x86 +CND_ARTIFACT_DIR_Release=dist/Release/GNU-Linux-x86 +CND_ARTIFACT_NAME_Release=mariusz +CND_ARTIFACT_PATH_Release=dist/Release/GNU-Linux-x86/mariusz +CND_PACKAGE_DIR_Release=dist/Release/GNU-Linux-x86/package +CND_PACKAGE_NAME_Release=mariusz.tar +CND_PACKAGE_PATH_Release=dist/Release/GNU-Linux-x86/package/mariusz.tar +# +# include compiler specific variables +# +# dmake command +ROOT:sh = test -f nbproject/private/Makefile-variables.mk || \ + (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk) +# +# gmake command +.PHONY: $(shell test -f nbproject/private/Makefile-variables.mk || (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk)) +# +include nbproject/private/Makefile-variables.mk diff --git a/mariusz/nbproject/Package-Debug.bash b/mariusz/nbproject/Package-Debug.bash new file mode 100644 index 0000000..ad6aa4b --- /dev/null +++ b/mariusz/nbproject/Package-Debug.bash @@ -0,0 +1,75 @@ +#!/bin/bash -x + +# +# Generated - do not edit! +# + +# Macros +TOP=`pwd` +CND_PLATFORM=GNU-Linux-x86 +CND_CONF=Debug +CND_DISTDIR=dist +CND_BUILDDIR=build +NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging +TMPDIRNAME=tmp-packaging +OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/mariusz +OUTPUT_BASENAME=mariusz +PACKAGE_TOP_DIR=mariusz/ + +# Functions +function checkReturnCode +{ + rc=$? + if [ $rc != 0 ] + then + exit $rc + fi +} +function makeDirectory +# $1 directory path +# $2 permission (optional) +{ + mkdir -p "$1" + checkReturnCode + if [ "$2" != "" ] + then + chmod $2 "$1" + checkReturnCode + fi +} +function copyFileToTmpDir +# $1 from-file path +# $2 to-file path +# $3 permission +{ + cp "$1" "$2" + checkReturnCode + if [ "$3" != "" ] + then + chmod $3 "$2" + checkReturnCode + fi +} + +# Setup +cd "${TOP}" +mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package +rm -rf ${NBTMPDIR} +mkdir -p ${NBTMPDIR} + +# Copy files and create directories and links +cd "${TOP}" +makeDirectory "${NBTMPDIR}/mariusz/bin" +copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 + + +# Generate tar file +cd "${TOP}" +rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/mariusz.tar +cd ${NBTMPDIR} +tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/mariusz.tar * +checkReturnCode + +# Cleanup +cd "${TOP}" +rm -rf ${NBTMPDIR} diff --git a/mariusz/nbproject/Package-Release.bash b/mariusz/nbproject/Package-Release.bash new file mode 100644 index 0000000..fe17807 --- /dev/null +++ b/mariusz/nbproject/Package-Release.bash @@ -0,0 +1,75 @@ +#!/bin/bash -x + +# +# Generated - do not edit! +# + +# Macros +TOP=`pwd` +CND_PLATFORM=GNU-Linux-x86 +CND_CONF=Release +CND_DISTDIR=dist +CND_BUILDDIR=build +NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging +TMPDIRNAME=tmp-packaging +OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/mariusz +OUTPUT_BASENAME=mariusz +PACKAGE_TOP_DIR=mariusz/ + +# Functions +function checkReturnCode +{ + rc=$? + if [ $rc != 0 ] + then + exit $rc + fi +} +function makeDirectory +# $1 directory path +# $2 permission (optional) +{ + mkdir -p "$1" + checkReturnCode + if [ "$2" != "" ] + then + chmod $2 "$1" + checkReturnCode + fi +} +function copyFileToTmpDir +# $1 from-file path +# $2 to-file path +# $3 permission +{ + cp "$1" "$2" + checkReturnCode + if [ "$3" != "" ] + then + chmod $3 "$2" + checkReturnCode + fi +} + +# Setup +cd "${TOP}" +mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package +rm -rf ${NBTMPDIR} +mkdir -p ${NBTMPDIR} + +# Copy files and create directories and links +cd "${TOP}" +makeDirectory "${NBTMPDIR}/mariusz/bin" +copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 + + +# Generate tar file +cd "${TOP}" +rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/mariusz.tar +cd ${NBTMPDIR} +tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/mariusz.tar * +checkReturnCode + +# Cleanup +cd "${TOP}" +rm -rf ${NBTMPDIR} diff --git a/mariusz/nbproject/configurations.xml b/mariusz/nbproject/configurations.xml new file mode 100644 index 0000000..571c1fb --- /dev/null +++ b/mariusz/nbproject/configurations.xml @@ -0,0 +1,88 @@ + + + + + src/HandPointer/Mouse.hpp + + + + + src/HandPointer/HandPointer.cpp + src/HandPointer/Mouse.cpp + + + + + Makefile + + + + src/HandPointer + + Makefile + + + + LOCAL_SOURCES + default + true + true + + + + g++ + + include/cvBlob + + `pkg-config opencv --cflags --libs` -lX11 -I/usr/local/include -L/usr/local/lib -lcvblob + + + + + + + + + + + + LOCAL_SOURCES + default + true + false + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + diff --git a/mariusz/nbproject/private/Makefile-variables.mk b/mariusz/nbproject/private/Makefile-variables.mk new file mode 100644 index 0000000..a64183e --- /dev/null +++ b/mariusz/nbproject/private/Makefile-variables.mk @@ -0,0 +1,7 @@ +# +# Generated - do not edit! +# +# NOCDDL +# +# Debug configuration +# Release configuration diff --git a/mariusz/nbproject/private/configurations.xml b/mariusz/nbproject/private/configurations.xml new file mode 100644 index 0000000..3dc0394 --- /dev/null +++ b/mariusz/nbproject/private/configurations.xml @@ -0,0 +1,73 @@ + + + Makefile + + + + localhost + 2 + + + + + + + + + + + + + + + gdb + + + + "${OUTPUT_PATH}" + + "${OUTPUT_PATH}" + + true + 0 + 0 + + + + + + + + localhost + 2 + + + + + + + + + + + + + + + gdb + + + + "${OUTPUT_PATH}" + + "${OUTPUT_PATH}" + + true + 0 + 0 + + + + + + diff --git a/mariusz/nbproject/private/private.xml b/mariusz/nbproject/private/private.xml new file mode 100644 index 0000000..9bba057 --- /dev/null +++ b/mariusz/nbproject/private/private.xml @@ -0,0 +1,8 @@ + + + + 1 + 0 + + + diff --git a/mariusz/nbproject/project.xml b/mariusz/nbproject/project.xml new file mode 100644 index 0000000..b734b54 --- /dev/null +++ b/mariusz/nbproject/project.xml @@ -0,0 +1,27 @@ + + + org.netbeans.modules.cnd.makeproject + + + HandPointer + + cpp + hpp + UTF-8 + + + src/HandPointer + + + + Debug + 1 + + + Release + 1 + + + + + diff --git a/mariusz/src/HandPointer/HandPointer.cpp b/mariusz/src/HandPointer/HandPointer.cpp new file mode 100644 index 0000000..6a883c4 --- /dev/null +++ b/mariusz/src/HandPointer/HandPointer.cpp @@ -0,0 +1,127 @@ +/* + * File: main.cpp + * Author: mar + * + * Created on 7 kwiecień 2013, 19:36 + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "opencv2/opencv.hpp" +#include +#include "Mouse.hpp" +using namespace cv; +using namespace std; +using namespace cvb; + +int r = 51, g = 99, b = 57; +int rT = 90, gT = 255, bT = 129; +int maxArea=1000, minArea=170; + +void setR(int v) {r = v;} +void setG(int v) {g = v;} +void setB(int v) {b = v;} +void setRT(int v) {rT = v;} +void setGT(int v) {gT = v;} +void setBT(int v) {bT = v;} + + +void setMax(int v){maxArea = v;} +void setMin(int v){minArea = v;} + +int main(int, char**) { + VideoCapture cap(0); // open the default camera + if (!cap.isOpened()) // check if we succeeded + return -1; + + Mouse mouse; + bool mouseon = true; + int x, y; + + namedWindow("output", 1); + namedWindow("bin", 1); + + CvBlobs blobs; + CvTracks tracks; + + IplImage *red = 0, *tmp = 0,* framee=0,*labelImg=0; + + Mat edges, frame; + + cap >> frame; + + red = cvCreateImage(cvSize(frame.cols, frame.rows), IPL_DEPTH_8U, 1); + tmp = cvCreateImage(cvSize(frame.cols, frame.rows), IPL_DEPTH_8U, 3); + labelImg = cvCreateImage(cvGetSize(red), IPL_DEPTH_LABEL, 1); + framee= cvCreateImage(cvGetSize(red), 8, 3); + + cvCreateTrackbar("R","bin",&r,255,setR); + cvCreateTrackbar("G","bin",&g,255,setG); + cvCreateTrackbar("B","bin",&b,255,setB); + + cvCreateTrackbar("RT","bin",&rT,255,setRT); + cvCreateTrackbar("BT","bin",&bT,255,setBT); + cvCreateTrackbar("GT","bin",&gT,255,setGT); + + cvCreateTrackbar("min","bin",&minArea,1000,setMin); + cvCreateTrackbar("max","bin",&maxArea,100000,setMax); + + + + for (;;) { + cap >> frame; // gt a new frame from camera + flip(frame, frame, 1); + cvtColor(frame, edges, CV_BGR2HSV); + + tmp->imageData = (char*) edges.data; + framee->imageData = (char*) frame.data; + + cvInRangeS(tmp, Scalar(r, g, b), Scalar(rT, gT, bT), red); + + cvDilate(red, red, NULL, 3); + cvErode(red, red, NULL, 4); + cvDilate(red, red, NULL, 2); + + cvLabel(red, labelImg, blobs); + cvFilterByArea(blobs, minArea, maxArea); + cvRenderBlobs(labelImg, blobs, framee, framee, CV_BLOB_RENDER_BOUNDING_BOX); + cvUpdateTracks(blobs, tracks, 200, 5); + cvRenderTracks(tracks, framee, framee, CV_TRACK_RENDER_ID | CV_TRACK_RENDER_BOUNDING_BOX); + + for (CvBlobs::const_iterator it = blobs.begin(); it != blobs.end(); ++it) { + x = (int) it->second->centroid.x; + y = (int) it->second->centroid.y; + if (mouseon) { + mouse.setMouse(x/(double)frame.cols*1600,y/(double)frame.rows*900); + } + break; + } + + + imshow("output", Mat(framee)); + imshow("bin", Mat(red)); + + char key = (char) waitKey(1); + switch (key) { + + case 'a': + mouseon = mouseon ? false : true; + break; + } + if (key == 'b') break; //exit program + + } + + destroyAllWindows(); + // the camera will be deinitialized automatically in VideoCapture destructor + return 0; +} + diff --git a/mariusz/src/HandPointer/Mouse.cpp b/mariusz/src/HandPointer/Mouse.cpp new file mode 100644 index 0000000..44d3f83 --- /dev/null +++ b/mariusz/src/HandPointer/Mouse.cpp @@ -0,0 +1,26 @@ +/* + * File: mouse.cpp + * Author: mar + * + * Created on 13 kwiecień 2013, 15:38 + */ + +#include "Mouse.hpp" + +Mouse::Mouse() { + dpy = XOpenDisplay(0); + root_window = XRootWindow(dpy, 0); + XSelectInput(dpy, root_window, KeyReleaseMask); + +} +void Mouse::setMouse(const int x,const int y){ + XWarpPointer(dpy, None, root_window, 0, 0, 0, 0, x, y); + XFlush(dpy); +} +Mouse::Mouse(const Mouse& orig) { +} + +Mouse::~Mouse() { + //free(&dpy); +} + diff --git a/mariusz/src/HandPointer/Mouse.hpp b/mariusz/src/HandPointer/Mouse.hpp new file mode 100644 index 0000000..9bd6401 --- /dev/null +++ b/mariusz/src/HandPointer/Mouse.hpp @@ -0,0 +1,24 @@ +/* + * File: mouse.hpp + * Author: mar + * + * Created on 13 kwiecień 2013, 15:38 + */ + +#ifndef MOUSE_HPP +#define MOUSE_HPP +#include +class Mouse { +public: + Mouse(); + Mouse(const Mouse& orig); + void setMouse(const int,const int); + virtual ~Mouse(); +private: + Display *dpy; + Window root_window; + +}; + +#endif /* MOUSE_HPP */ +