From df6b9d244875ffd4ab5919f1848f3e9229620aa7 Mon Sep 17 00:00:00 2001 From: Scott Petersen Date: Fri, 6 Dec 2013 13:20:13 -0800 Subject: [PATCH] Updated API docs. --- docs/_build/doctrees/alarmdecoder.doctree | Bin 0 -> 245301 bytes .../doctrees/alarmdecoder.event.doctree | Bin 0 -> 18411 bytes docs/_build/doctrees/environment.pickle | Bin 104431 -> 89852 bytes docs/_build/doctrees/index.doctree | Bin 5454 -> 6122 bytes docs/_build/doctrees/modules.doctree | Bin 2779 -> 2812 bytes docs/_build/doctrees/pyad2.doctree | Bin 297906 -> 0 bytes docs/_build/doctrees/pyad2.event.doctree | Bin 15777 -> 0 bytes docs/_build/html/.buildinfo | 2 +- .../{pyad2 => alarmdecoder}/devices.html | 310 +++- .../{pyad2 => alarmdecoder}/event/event.html | 35 +- .../{pyad2 => alarmdecoder}/messages.html | 169 +- .../{pyad2 => alarmdecoder}/util.html | 33 +- .../{pyad2 => alarmdecoder}/zonetracking.html | 28 +- docs/_build/html/_modules/index.html | 21 +- docs/_build/html/_modules/pyad2/ad2.html | 671 -------- .../html/_sources/alarmdecoder.event.txt} | 0 .../html/_sources/alarmdecoder.txt} | 0 docs/_build/html/_sources/index.txt | 6 +- docs/_build/html/_sources/modules.txt | 6 +- ...ad2.event.html => alarmdecoder.event.html} | 60 +- docs/_build/html/alarmdecoder.html | 1225 +++++++++++++ docs/_build/html/genindex.html | 499 ++---- docs/_build/html/index.html | 48 +- docs/_build/html/modules.html | 36 +- docs/_build/html/objects.inv | Bin 1585 -> 1366 bytes docs/_build/html/py-modindex.html | 37 +- docs/_build/html/pyad2.html | 1521 ----------------- docs/_build/html/search.html | 10 +- docs/_build/html/searchindex.js | 2 +- ...pyad2.event.txt => alarmdecoder.event.rst} | 4 +- .../_sources/pyad2.txt => alarmdecoder.rst} | 18 +- 31 files changed, 1896 insertions(+), 2845 deletions(-) create mode 100644 docs/_build/doctrees/alarmdecoder.doctree create mode 100644 docs/_build/doctrees/alarmdecoder.event.doctree delete mode 100644 docs/_build/doctrees/pyad2.doctree delete mode 100644 docs/_build/doctrees/pyad2.event.doctree rename docs/_build/html/_modules/{pyad2 => alarmdecoder}/devices.html (73%) rename docs/_build/html/_modules/{pyad2 => alarmdecoder}/event/event.html (78%) rename docs/_build/html/_modules/{pyad2 => alarmdecoder}/messages.html (74%) rename docs/_build/html/_modules/{pyad2 => alarmdecoder}/util.html (87%) rename docs/_build/html/_modules/{pyad2 => alarmdecoder}/zonetracking.html (94%) delete mode 100644 docs/_build/html/_modules/pyad2/ad2.html rename docs/{pyad2.event.rst => _build/html/_sources/alarmdecoder.event.txt} (100%) rename docs/{pyad2.rst => _build/html/_sources/alarmdecoder.txt} (100%) rename docs/_build/html/{pyad2.event.html => alarmdecoder.event.html} (54%) create mode 100644 docs/_build/html/alarmdecoder.html delete mode 100644 docs/_build/html/pyad2.html rename docs/{_build/html/_sources/pyad2.event.txt => alarmdecoder.event.rst} (75%) rename docs/{_build/html/_sources/pyad2.txt => alarmdecoder.rst} (68%) diff --git a/docs/_build/doctrees/alarmdecoder.doctree b/docs/_build/doctrees/alarmdecoder.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ee19f083cb0c41c8cd2af4ab45344b219241d73e GIT binary patch literal 245301 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

WQ+e@B8{URA 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�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 UJ{&jTd~h%he02!+Z8a7D2Q;{v?EnA( literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/alarmdecoder.event.doctree b/docs/_build/doctrees/alarmdecoder.event.doctree new file mode 100644 index 0000000000000000000000000000000000000000..20bb85fc20d00f6ed3997650a260d02129a9decf GIT binary patch literal 18411 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 literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle index c0f43618663a3a684d30a354619df40ab873a3d9..2b5e17a5e8e1023eee6b41fccada837bcf047c3e 100644 GIT binary patch literal 89852 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 IY%c%*0VHFf&j0`b literal 104431 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 Mdbug%GjcQeKTxz-vH$=8 diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree index b5ec21c129140a991d5045fb8a9f022df04f9e34..639d50c07cd32d17e1ca873bb57f9eaa2033235e 100644 GIT binary patch literal 6122 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 delta 221 zcmew(dRugY87C_P14BV&Vv5m3w;DE9Fl*!aC`N?%WJ{(11aI?9CQ~HI&G(qY+0qNw zhKi+S=A_1F<`t(Fm1O4U#i!;aCgr526t3$C7pY~hYjwxZNDkh-0^=PtyPZ diff --git a/docs/_build/doctrees/pyad2.doctree b/docs/_build/doctrees/pyad2.doctree deleted file mode 100644 index 8114e427585b13287af1524bb0990d6f817d419e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 297906 zcmcd!1$-Pu`z}@q?hc2i(56&ytwO0#+6E3O;gVc?ca7cLr2;H2DfZ#+?#_pMio4q% z!iT%N{h#NZncdmj+iU38kL)iyxAW@A`^?PhAqzJ&wl=gEvrUDXme$5}p^Asi>6T(u zexbgH<`?$zi&WS4X-PGwi?iF(h5VvkezEH0$~}7YXq%mC98|;qp(6&>w6@gM&u&W< z3i+NL$<@n|_it@U*G)~eHx=`}I+7duEY0acAvG;ss2Qh!)HJlKLaVB4YHdgrv#l-p z-W|y`eeTBejBEp#YbOmGAwO$os%$Zx@6(Z7#b-by|zo%wZx-Qj}QqB1#JCf`AjB)Dfrl)7;m+DCN^*LEZMU`rp zo^6>{vzI+cE7q<`7mBSaonP9m4O`G*LnlujIdRXr$)m@O+_iRcewmKs;?P=XuWy4k z)^2{;@lLZud@rVF74yrLZI+3nY{L}NDw}GmYiVz;Ppka$9m(Z=&)I`&MrBp=%oKcF z!L4lTBg)X2EwFZ0bSv9;C9pFi)zqHOuT<8Xk+a%TEsbeqeQL<0T3XUg`IS48>-paJ zH7*XD2ArC0X+-lhoh@=Qgy~ce(jFrCO%KpEPHZYdIqqduC)O{snU)4gj*-RNYHdmt*veO zbvlw&&=ka#f$hwoM^5BVE_f+A=jeEx&P@PF17Q^{uVN z{3hjquAwQNQgwune7}z5iV@}LuB~n9mVEz?QG6tzwf7NrX#q#M$R=EnT?G5wL=<##C8(V>K+#E#`kJ!(jPXxaRM z`C(=A2jz#C%^#c}(UDw|wVJ~4QLwNua(r@WWZHt;>`~*LDM)0Lt{J}b$l+u1JGuQo z!X)E5KzwJn-fZUx%`|kZjdnYc^{2+^lNy;hE6eYqhho>J^?b~DXJX?tlZ+^J96hI@ zk;Yc+g>0(X`Ef3;`HnlIPky}1;kz6R4zu#Rx-skPaHm<)Ehe~SFUuATbi27zE#K%k zeC~J`H>GC#H8**lB@#%eby3f4 zCz-jRaS}XiteR* z$GD=W!TY%F7-<_;gIP473r=wdMV~k5@A-Y*b%oDh8@f4Fn4Yh5yRlO-YU(V1(z9Pj za)S!JAUwxSxqTqoY#7!i*G|gUyB#aSWdfgbc)j{*(35lGu#M8j@y?XgFIx~fcFaq= z1+-mwgkA?hzXZ?JauWoxtbu!4xuy-mVA#;w5fg__9+}U$6=f>Z%xr5$q>Jf>q8Z0j zdrLkW(+_kn$r-41SB&}TWzk|-s*pBqns0K)qH@F59z#b@=AhN=2BBYlwrezGvdwAE z1Y2CTa{ADo6DQ|eT{c_Ep=q{+ber2@OX^34_Pkqx5w9dd>I$vxEsa?1R^16kD%Gm;#mX)0Pomo^I@pG2$ErWAP<2hS^E2EzgkPFc2lwI>Z)Rn% z8#T0c?Bx6`xA{w|PxqSHu0`7prn67PkmPi~{bR6utLmKnwsac%Z zN#~Drn?-u@Wc0Vz_M+~@N4d~jE?9@{y6fcp(e4CNxQ4ejH){#OF;7Q=1(b8?3z)~;GelVHD(~ubC%P}tzQf2md5<)ZngVWPy$c+Gb;Ppm^OZ% zS#F#S#z+aXv&vd@#;+QcnwdYl9EgR2(I0Tnaa-JvTX*6{yE<;qb&X5EAKik%A=@}k zPkeO*oY$>3Y;Qv+O6Sja+oqiP`~@!ll(aH2Lks0EbYs#g8X=RE{6%hc_|0UTuECi_ z3_1+}pT>0l;X+5SI8v%)h{55XRFR4mXto*fZStC`W2Zhwk)a?9q9qqNt;v{qdCr{8x zfdq}|sfGOYUjByKrEpHAkhatELjJ}n`I~B&lGBVh;fQ&W!imwF$JbUhrW;z7z7lZD z_}b-C?ZwuqI1$#;T1?kzsJwN|Lbbhki6Yxr$lvDW|6QHwiLDp5-q`wJtHQQ8wk5DF ziESxtOJiFG+p@KbyC=$T&n$;+d2B0STM^qz*jC223bs|Tt%hxNY-?a!6WdzY*2b2= zwhp#+YpYOm{mr@0J2LBGTOZp7*fy+P%2cDJ-XN?TBqCwqe+YV;g~OWbKmr z?1y#buFR;~rEP=S%)2u?VcQwoXl%P+8&kWyJ0Mubdop9Ojl(t`+pgFqVA~DbL~N6= zO~zJ>ZFg*YU`t}#6Wd5#a4%HKWr&%_1GG)HP$Xptg{C1&7`qS#WoEa z|FYO}*rsD^!q$wf1zRh&Hf(up3R?kN5nDU98Q5lGn}uyQw*9dkfbBqR9=3z99gOV| zY=>ey4BO$@j=**#wxh5ejjaRQ9Bjv6I~Ln<*pA0`0=9o)I}x?b1yFxG0N*vb}6>Yuw9Pr3T#(m zy9(RY*sj5LEw<}2*R|L7#(Jm;!QPU;e@gy=(#wAZtm_b{Rrv>T_3t4s|1hrpVH`8@ z*jd}7wkHA?^P>FR%)+%jP5vXLYE-%n%fc*yyej{woN6CXD7H_XI$&D1H~_WKUZ@`+ z)iD4U91HqqjVcuLj~#hv{&6q=M15_qVrm+rI{##CFXLAJDTG$BsIv9#MO@Q*+RHyv zUE8~{y^VZ@{IgSPdo?uSA|!r4H>I{WuLCF|&ht}h7a=&jFeU$D=Dt+zVw(S@DfyQ( zC#KqK7nRebuZ&q3%FOl8{HvLTGpM20s!PiTFl$1oUPlGJ;pN|~&UES%iEP}&1bw|N z|5j#h=Aq0Zna49v)-EOz`Txtn-?ytX&rZoaHzo7@l*|iLGA~VO&%kWP7<;GG)?{3l ztIBtkG4L+x=|5inJ($nX*c$&-lGk2unS^ksEx+%K1n04>d>I_T$nV0{ZrCt`}*w&EVdOwtWzr;9wt>+6^eP5S6 zBSro)WYrYe*ZEa-L!m8`ZJC8j$&LCFG_FT*O2Ch-ICZFUiG(A4>AS*7k0jy|r}3{BPrH z``|#=a{l-6tkFf;v;HV;>?T~uR;i|{{GTZDU!Ll*P>&vL-tSNtwU8W0-%$(mckQCA zAGHX6XMRrh6x&2bwJ37ZPXC&l`3C0HVr1;H?Qcy*}MuA8BMsIMoHV$fg6xB+Qkr-IW!~jY{gm7+{034<;7i`N^sg=Qv!mNVCQ>$XnK3k1C zo1j`}WHGx;6f^0>)b^&P1n!wgNdHLSa&`h&fqBKaMy&=R9Y4u!AQy+38adI^YS6Rb zPXPsPnU-jsn((6-mDR_0O|4G7sIWD}sVD;3;;A*s*!B0EUJEklN^2wWR6;Ct=5$GN ztPANqIn&bX2-mur%eM6R%#%6Wrt1kQwoTV3IVWw&Yv!m&b5b%!Ip%<62# z4Isl-93M1dDduqMU!^t#BN}icB%Z3KB?F`AjqtH{QCT7M1%Z{hF&QxPY}K7|6CBQ| z?Ww^-^}~@t5RD&B2W_p-5tLMa@(?w|b5(;w3_$Qir~`1AW1i!=+7!o8#H37JA&cR% z*sju5Y9P2!jzLH~HJBpkh(kivRc#mL`V#+k<8d~=U&5|{oy@+Oxj9xyI39;E=Sfax zUCU}SW}|907n?6kQCl!$^;B(79cgMy9zUAw17G~Es^@K0oOJACz zwxtYo^k(F6TGvZJCU!;QLT1H z4r*jH5>M?S;xeA+=#0cu1W>hcjG?HYDm4at@O`W(7^f9Tjrp}+6Y+luSA`l6Av(XS z2**1=fqY#hy47yTMFA!v@zf+yp$kBdDilC_KN(E$zE-4n*U~vQaKz_6;?aZjsLg{9Q$+#E~7>BBUp zU2z&z24qxU7Kx{F*c;@`(E(JSj}^X)YPwKz#?dB`Y}S%urVJL*(H3EeceE9B<7gQT zstsf~nn&U(CAxGw(*bcbryVOdY2lTSDpdd{s*iJ6u(-DGvlY8_oRc zOk`^pDHI#kK_FM2$p-UbnI`eX7H-}$i!(0TY8S(dGutSU*p5(S4X|$Fk5ySFm%ea-Y~#0 zeZ*3e{qrngJKM1F)|nDN)j6OU8M7$l+Dx5G5x*A)lc3Cxb22~4NT>_ybYnA{Qs+@) zr6pPBm&~u3-}HF#d&yMedXBWSM_rB_)bABYJar}Zwky#GjX!<#FX@=J zUtA^pS8M*{Zm4KG?VZ}H5_0Vcr){_bz?gHU z@R*PbNrjqq)iu!W_p9V6*!VBjAG|Bvxaf4rYo!1cy5x2Aq3eHC!0VwLb$tzrx zCpd}{)xi`mXoCdo=+kC>GpBG(^lvB#uZeOSA`8KAI}%UbK?8dAV+x)#9`*%=A$%t} za+_d3C)W@A@~fR(f08)g_dQT|AuBh4JN|M9zPoW;og0Wf9JvRHr|xAICf>aBG$@Z- zb!Zy;>`%mVoAC%9-Y241h1}1KQ&PDtnU=0T9zZ5~#e+yZ^$_;q)yKn>f$VljD>#wc z0d&Ef+>ZDaT5oicG#NV-YAzB_J%T+8#k=&KwnIr+=%6Hf@CYS&RQMxtfp(i`^LV7!fzud7nfM-t$*V7JHxK{0W_Ka}E`|>R47Pg)fozH8X z$pI+saNL5QZcNO~q+4+6BaBvw3{VR9ytZ&1icv1zSfgHmEUJahp;}BAv?JV$qB!D8 zFv7h=v99?t{4zvQcdsDv)T?5sGiSVEv268Wo@gQCHQ{|-^ZxH3!%l0}8?fX+#+za| z7Bb!_{)Wi z|A#d}?H4 zAj3LQ2{Jx|3JV#ZiwAYQT&or`eh`j$Uw#DLLdH*`^JlFyS<`LEQ0eAY+;Co_et{@z zg}wzn&?3gKqBr76fEd3~tZRPk{tijh+#g6h^{3eB%o%4`C|h|BVEiS#J#e7`E$aY= zdp>j_p~gn_!X)dcW?k8v`>OlK1hqbQg)^%>WTKt=huUKA8hEhZk6`e$Rh zr#R5PX#j^iaX{Nwy&$Wjn!ntr?k!qPRQJJwr>dBRsOIA>&O{(6F&do?2ccktdU26N zP%lC9`Y}PhB#3CgrI2`PY3##6y^N8SpyrcrWqeS}f~itiF9&*cZWx*!1Mc!T@YD*- zLhCQ#R7^sxh+LG1B@fCo5^|gktRy0lPV9&F%9QF#E)lNngjxmpDB-F|JhhrA(XC2P zq(qD zyRokq&9#ZBv6muq9yFCbPm?>yw-I--vD>F;*b#Y(hQ;JUv>(#kA<&P0*B`$<`ufa z>_Rc!T%)#uH0qH4WgbcH3LOh(LF_-rsJ5l*;Ec_7;%=mb!RWL-`Mc(`I6FWXt+XQ& zPYo4QojFrRR+j`^>3KYPiVim&^5pg~Frohp7X>4<0vWY*4e`WhRlu)Cf`f21N;o5> z^5JSH(#zVdQaghNlcSN~LWn3LLO|;nIVjaSH%IT-Psfs8R%@NU$S@8JP(2MW@(pBQnEM%f|vypgee-Za>&@c+9%V?TXPF-T2 z>r8bI5ZME@Y|K>G6KZ&nbL_L*sQ6|9XO`&~7%@eEgNdP?=pHSCnCNzp zd~M7`cMgbX&0~;w>R9Z<6W!yCtW0$IxOmhBbv$?~&2vux-Jj?F3kRM$ky$vqz9Lc- zfF%tIU}v@`2~(tN`a{LZlqxf`Jq7tF(y2&1b($#Atw`I_JMGN&bYVF|v&e-FQ>_u7 z?8Np=;f?p{EYJ-a7**$ZL0KUAtrEwdV=T`3_6CV(h&30^x{tBAC}+ zC<-r%D0Jtw7n9n(dF>@&m3i%@qW3aiFW~8NQS;BvYuWKQuVpa_#aAG;^V%!%+f!Fz zufZ2CUM&YwZR#4bM(4FG7&TqXv}9g;9rDnQ*CX-N4cJ>$rzwqi73Q@!ir7t#SU76! zy!K|{h;3VS3+Wc;ZxyAtX{E{S5uX0MHqjtY*(B_+jktBM1jS5p{|!~BP&$iA?szC% zK$Bb>SHbl5cJVq=&|rFd2c76z5T&{kn$U80A@S7RVz)DAipna~K{yP*Fv+?{xbD?l zGB)YjV9bm}F2~~ggc|YPN2dEhw=SgRvmU)YzThl3B zR)6l9tCu{?H**b|YNspqJpL=l#yNlNZI$WM+3XL?agC0ec}=LXbCuUg4o><;GI1w_kUtOGF4G;BfsPn&FzWdVf4TFO zE>UgfEAQgKQ~zNW8icRVawZF=(7Gw*21DLUNcV$*-_Bg#6BU@byifA6F*BDBKtwnA z5Q(Qg!ah86`Pj(H%!PNSN1RcgfThyJTDA!QKWn4QgzduGgi(ENW3< zUd&O|2x4bZ zD+xz@S6i8MJ65eCN>|lNljG21?CmuA$^=dWriuw=&KUBXAYLTUj#u#EBw=V;)h~hD zZ{)6i-fC>ll;A#oXh!|gcTB3Ne*sOZG^VQ6sW_Netsw=8ls%YOtx5i_|3N|5f?~Ao z+DLHkzqo;W|7mS*j+LxY!_2eR5w3MLm&~(t1-bLA^@JKJia*aqgfc9a~51DJXws?|^&Lv$DtPYuW3iqe|7_i%&|NBTtgIEn}UU4^xa;GR3R6Y`u# zz2sKIBHqN8Ry$jYeq9pU1$ll_^KH3L;ZDEQW zL|e#$$iAdo5UCUS{apD}j66-Th3lDyS8EN(LWMLU!O3pyZ5va4IRu$1oYQ?TJMqE>c}!{KSpCgI7%z+l`*~S zWrHFaY-6|Mz*93sru4GG%(9y1=I9CQZx++=WrNwsLe1=t1h@HPZ(E&q%C-7|!s%&F zc`P{e?k9B+C@j^%!ckhPz?VZnw_V{-{KmccBGH)>4Rdoegk_GYELJzw9xhC!YFSw* z-w_ni&nkzVIuZnw@+c&pI$Bitc4!<0)nzpyYS-h=<%159oug%?HT9x5ITpQfLCvlB zMqhOdY&h%uW5s0bI{!G5^*W!gm6KO)#4hvgT{pA2z&{?6vYh7|P~GLcwADG_sI;0t7xZd-=Knk# zc6l+werREN3<87R)hNIZ3kNbBaKW$EKN zvwXf(ST1u|!Yq4+zy+RaT8Byr2SFa+qd+XJ!!7A(3Yeet0zFt7Ub)x2< zU9Ym8Ir(BSi8R+Ewd>Uz@EdpYW3RCjF5V;uQf=yHvPRddEEqN2!n9<)dMonKj<+H4 z)W5N}piEO5s4A>iZx^vU9IMqbNLfDfB7rAFNg9#j;aK#w+nVbS|OQ4ld1EEDgiSXV^@4}b-g^B@x3EiVc?bH*y& z)L0(6^!u>zc52@L5q8U)fYe;raIpIkF&T^9kCGfBzCH7J9{ z?l*)p($jtHev?ufyR|oOAp^zvKO~-dTcmaK(Q*j8-w~EBhb8QS#qM{7Bi4lgyZ<8! z--{@8vHN{eyNBH$fK{;jL(%(@uNT1hv8efHv77Bo>}D~ExSt@k*!?Mfd+IaneeC{R z4y4-D7i5iMHw#8hUotJh?yr!CcKjL%&ZlE%T!B)%rUUPyHd*I&;P)7O)KJ|0%qGXeQ`d3Cp_TPWp#%o?19Dm zHH0J9g8=W>6oqR=6uNl7HmTji`vh18@7EE%>-u_u_v?w8e-`iA%EWsXlPJADQj7N+ z;J2qX#9l`VT--BdnrX_g4G4jxkn;`L2KkRJ?($qZhzQ2goIAY=W zuy{W}IAYsYZ3?=@`+=f!kk%>RT$%)oDG&EGYB2avS#$)Q+5m=y^&z4pVm5&F%_!D2 zPa~Uy4VAP75>IU@N;`ALGTkkM-dhRp)|%HrZ+2393&b`;jh$X^OR`25FKA zHZ>8sDBUC^xQAX;=;oylAxy3nmfaneupbta_YjVFKRB+~+Yj~>oqK7Wr8g1q+~?k9 zmCeo38N$;(Ory6SOhGnEwJ#D+)nRWDiUu`8MQ%UXPnc5cxtw6dRBZ{K5T`T<`T$P^z&8T1c zj@u9TwvYvMiadx`V67ddW=c6CMGuClS@h$7areP&C`Qxnj|7)b#Es6JDLm^~gNC{L z;6UN>G?xr%x_%f`_AbwZgc>P|4_pU>ZZ9w$BKi*X^`WO8R#qGrQ;^T@c{u6zQqmDP z@YInaLY#yAQF2gf9(VgApYlgDjof_Dfn3zW93-AP27BAVX+d}J@XZIu3g>Y?CoCT? z2l19q0NwW9e~I{suJ}nY;(1t&?Xg~&NOtF z!5PRw>CZ%hiwM};($kDC{f@Fig_ya!;A|~&j)p^dX~&z?kxE( z(Pw7KcjLfQ_b?0d$3%Sbs;BCg;Bt;kuY*~oog?2XN-#&hkK{{Z=E(Phh~D@B65NB2 zeRz)ikdc)+GQVRSQ`_ocFjkr+cY^NUDLfYkc&iVyP)e>P^m`Ui7FIw|mXYQ{`lG^H z8pFZ;!jDnP+?>ldnkUrb$U(WDK!SJqh`4T0+SUV|xl{NlVR>4!$Xfv1ZWM9JPTHRl zfq0jm1syK&tpct-^&Ily*z-s{^@1qTj?oY8*c6l+!2hDKyyUQiE5}aTUlxvdPhJ7t zPTOAGK`dZ6Im$DTSz?hf7n~Bq#=!!k?H!| z!u*cItjpz2*SkpV-gNz4u*!7(Kce?NUoT4ZzNqL z*z0~#HW;fU{I-;i!6Jl~4a@3d0Eu#%TD>XY|8Pp>~pwjXMXo*?c|VZaA-zEWD=aGjBt zGyYClf1*?Raz@^XQL4$A?Z_mnZMOP@I%UX>~G_rSPe$SncdXhl|-QrJX@x6?H z;RoJ>k3k2WASceEgDoV-x`Qpu-}=3bG#Gv_<02r2-^<9lVaHn(6m-0DMNx}^hT86l z#8bVnw;hn)=nmM2&YD+;+D_72`1@%7rL#vH=mnv?Fvlo2uTs^*c zkZv4cUR-4EmMhe#D(LV#P;wG9Euht#3)@bgTwHvv&?lFmLtXz>nU;hKRO(VlaP2@0 zcIHe$S#wgG_W7%2glk#NB~vOLOv&W`rY_`D%xXEcxuovVl+-J85Q=Qvk|n4Z1y zmpgk~O%$5h+v+&LR|A-Zc}>alU2d_Y3adGHqvOGR$Iji>6cw1etwr)7F>|-IK}0V} zAi?{9un*7O)-|#+cjM>nW9DwUJ=X)bp1{deZb!sy=&g+FgYKW^+yDo-GQlhq6oGCp zH?anS;@G*;M#2~g8UH*%HKm-(O?`2Uf^Cch?*kHH-Keyy`@WeY^%Iu<4olbrJ4dP! zj#v+Z%S{7B;ieIV?&M@3sok5L3<9f6P6mtKA--M!^Jb#vpPihrl{qog=hPx$GNUZqlQ4jT#9ms)**%l?{N{vv;FJG-526 zk?cgVt{BxjgNOBDgzmV9LXCqt2i(Vt z^;mGo5Cq5h`VN09^13T_6bl@9@}>V#Zwc-hY+?KFD*}yFB_$m#~A)ex>v6PAp_5_Z7idR91M9SCqeCkm%W6uP+HL~8eNy&0^6 z>n)*XCd*_Z0s$r)6_h1eSZ-JV_Ey66gewE+@~@rR0*_oz+4`H zj|Ih3$B8Y8SL=pF-s8ni_mCH?`fQ&%0Y5eH@|O#|{}O!$cu&NEr%qxP5Q&egV;)Zw={#Y01&3zQ!Ms{t#=9Y-43%Zl{?`f~=ARw! z*i|^*v6!s12a($G?jij4)Wg{8dV-6cav*J|=8`o!-mzfR^a#_E@$OONp#dI4;;F~6 zw+%p3x&bPzW1bMPCmpdcWZCiVDdC9kU{8~72fSxQ>9bmC?+gD2nqNK_ymNM1rhgN@P1BT^ ziLYzoYl(@J;`>Jv0K?#1>4y+Oed`{P+yOQDU!E%k^w?R`N8(O}4)rmOcl{lAKY;|Q z=Tjtj?m_f-=1dt_2O7th(gWP*!u5sbl7+G<=BWR^nDYG;)vUgRc4zwal^Bbietk`{ zo_;0RY4Q0Q)m(DY)BV!Sj+};l1EKQMux~-})OTW2k7XvZjaPOy_Pv*%cPFXoylM-Si!E{b4J=LJlpUEny&6*z7u9t#U= zq+k1!vPD3*Q7xL(qR2rZ7DM8xo+7T>i?*fD;uMd4op&$c>g{la>(7o3eS{<4jVjRX z;IO#pTte$i^24w0cVzhf3Hg$JB8%61t7d)$VoC6#2IvfGz;q}Z*-MF{i0NRcSejy8 z-7>TcSW!32BJtF6qPR0>tkZ2MtEmv)D>A%Sfn53UUKJF4XF$w`!rM4z!+UkHJU`*R1|)TO^Oqam zYl==2-fQ8&Q)@E|5wc_u-nxY7CUi9j6dU0QkwAp6L-L9-5xy>n=m6^>@zna*ha-Fg zBP$Uev0W+1H-w}O@{L4$HTEn5LC$YyxX%Ix?%O!;E8LM@?#KDYl+v$y_LZqkkcrat zL*l9aqCvMEJ+OV*hI)-~4RE-^6=_3#Q{jmBWFY7^)CY;q!CI%>Rv#Pcy7?IGL%@!D zpg*Vw)4y!AZzj4T)`Mu@oMK(wwY3GfQA1lI!Sw{u-I+5E(0N-)PQY(1yxVAAH{d5M zn1F9dRHvE<8j3gx37*doMY>(-kL~pq8ft}WcZVxnyA~Su5RQ0< zIH9r7u&3zUOY2MyM!8*R&@%vO(?nrrw%Cxt{TB7<;!J)}Zs>4%Q^JVhHEM6jqp|5A z>c@0OixvBb@`yVDR!pH-*L)k_7viYHIwYRjPmFcuj7KbuWd0p_>dBK23 zs)>_@2IzM{qfyMof<~HT4H|s#30+0BQ~-;82o_TzRvs*-fr1xUiPaET7{4r7WX16O zfJF|H8Z7wB1&isT(||=24m{P&EW{RXcC z=aJy+4%ml5qF`hNBuY(J0*4|5EjYA`@)_8(0Q}sNZ5=qz(gn_2P?#yqkxuV}!YoSZ zGe}mKnvFaZWq%}i^gG7vejLd<*4NR!iApMj z`T-2};~`Z()K35fueTDTp-?w&*-$@G?9NZ9p9D!A>ip$~`pKfxg!(Bsz;h_fLZq1M zFq{{#eCQ-}Gzb8A-lBK>rd4~U8MGeAVspNRxdrC=Y9^s|kuM0$zkN`Zb3Swng*`3Xo2fC&d(R#NdNZZ`~php^P{E~)P=}GIW9ti4`PeFZZlf9{nv*1 zCBk*7!xgSV8|Ie@N4y`GgKoq83ekC`))`rlr|?oq^hLzDzOj-aeie981#|{gU^ni*HA3F@-JuTTCk#Su0w(=GNQOMXROn0TRl#A-ypmhigrwQ@9aDeYWFbgr_tiE*#(M{-T5Ggju?-2(uVoNqP-J)7Qw9iefL?wzz7%l$xqgi`*>Un^6O zA`_)~3<<6Yi3Z(v^uYFI8|qI8*OLxcxFT(+KP4RTo;(e@4fSV4=d)U8nNZ)qwM9Z* z`^!*&4!meXI)h3uoy&&$^P(tXItcX_C{`}iqlR7tE9&MYB>4V>DDKP|>vY>zj}z*z z2=A+!*A4XrG?Lf1wieZEQ11l#>tZc7(BB|AG?G(Eg)rZXVg4qh%7^(|px`=^7!8HF zam$AJ+hTWq!u%ab>M-XoH_W?4rwQ|Sae&WIFe^NgvwY|vbTo((8|3c^KZ5*ylJ|-U z@((~n(|?Er54vC<4)TwUZ0Sf&%aua>6Uf;R|5S8;hP^YA8`oL1z;zqop9^oKZ~FoM z1*QCvoT}89$U-^3LgJ~fMP9cVt=s-?}Q`XkMBXZ;r)Z?{88&n z_AN7E*SEm%J<-{MEZ*Ta9;(6JO+P^j?MSy!8K!&LK>t}(Mw|!&{TGUL{Y{ge+ciNn%52ai3?`(-q6}IH9M_Nr5n;&eCk^L1xrr!_rM&m z!ke!aB3Va2pEAV^uS8!3AlRNjurL&q2ZBXF@zkPXKLiBELkk3pi3{@s1U(_Cfq=hU zAm}AJ4G{Fkfv5T~3qY_EifLBwB}GMFqR&BKSxl%BQDDO2ByS&s2}^*8zOf_{Pc4Og z7!#H@vVsZmPE>-2WuU^s!?I##IqX>|zKJ*5b|?_b9u&wT#quH+2@W4AR-jZ@j8?TG zs3_=4NboR3gFR;;L#Vd<-ucPQ1DO;b(`1cnY#dta~3@Mk)xZh&*L;XRm6Fp`u1X4^@pSe z5B_q&qegTZ@ECvtPi@L9#F=@69?u5^r9>~HyFr*)+!!cQz>Ps9_lm)d!62eD3_*gY zWv~z9#^y#=aHFjKN|3Pyq%CA@DHgWEo<-rhr?eO>Y)}k~7F&x%Bp7_O*oIR274IR1 zYFiLcvh9%I!5Gn^fr6gcK5l_x2jSY$;R;u(1&X1<5%0|~&@E657o8)t&Lju87@*K6 z3UHr5LZE_fX|creO=*8N3A$fIF7CaH)oF*tFiE~E6ExjIJ>hQ#3-u( z5OW9+6Chn4Aa(-lI--}T zBhwo#Xf%t3h))4%v{0<;zw@9KI#8Q!NIaDni=8>+77J=C)BzAByamnc0>}dR^eX|R zsdZ*uJ;vU&nyrek;^0TS7>&h`86<1`sMej)(NzIH1`|GJLbyD9%mM`u^@!~dd>HR6 zeC#jg=LbFxfTV^G{&L~tK+$R7!^4564q_JK&3sX#q{`5p=x-2m7CjCYF`&mGBoB^3 zk3&I3e>e;YKGuSL7(I?KvVtDv9jF8zM?&0!$5CS9XzW>-r6TQxg0Q?nK`eH3h)5(Z zeC(J*sje~_)iI!;aK|FS!#kozw5db@xpb2!xgSq3myLwj(B%Y1l>Z%Nuu*) zty4Z=G|xE(dT_!-LybBGlBgHDhI%pG&*H_YqBi14fETAxOn-jq@0mRvf~dDMka+4$ zG1HkdzOYEP>Ku?bOL))Lye>#ApnDE*uST{(odf+2Je(`$V&UODk~KV-dk#cP1z<=L z7|w@Sd0@Bz6g*=jRztvG{IbAskrz~ z;aao+@NeOWcjR`^EdbmhI`7mvlN-%@?vUbr$=QY)br)pNkaP-lVLF%%{kuhB#DyUA z@1a=N-!gbFL{L}vA@S7xVxTi;ykIeGbvZ%*fbc%3dEKC2KzAvsbW>`!f0yDzu;T>( z!(uiz_&Z6~!Ef$T3~8$X0+R^>b0J0{rEI zz!Rd=fWVVD@YGYxLJT>#2!;xZK17d$c(P#dvZ8MB6`JhNIdmC_F*u1 z!N>|2#JNxj6kdb^3kolZk(aS&fy`ZsrG;UsgTh#FctwOF0pWwgtCaHZQVi)-uYral zzK+CGZ-^q@uJp(DdJ7V73fEf>SGaa9Nc^90#5?ph=oTd25uIIHXL7p|kVs+ufH2@f zf*;9DH}V6*^8GOUYQas4iS#UBMkAhgs&7pxtTNt(CNw);MNOG*X`$mkVkY8P03Gj9 ztZMBHOBU0Ocd${aEw5fU*lJWdWSXY{rxCDcsog2`o5J z@~Ie%g_6%m)=;v(p0*l26+onlAo4i`%Y(=lpm^#_u^R#r(YY7qQVjH%3`2fu;?i|dug4Ka{;M@ z?V9+mFz#i>jm-AqUt+3iZI&I)z>syCFNed#5t$Migl6Me)&#HRo!swfsc8}YY1 zSR6V~n@b?U7v#laXU@3Ag4zmoAYv)uU0Us*9GF;EjK;#mawLb( zMg+PlK*idGisd0(9x7G<#ZxPa?GRKL?<`cTBL#81^GDYz^V^z_1M{p4wJyhk(I&XMtfmF+V@R zustL-Fz}ZP3_FNU0}MOj0MBhPD+~-yG0}VIZxBxw7>0=$fMGbv`^5mm2oTX9Mk2w3 zS=fhxVJ9P73Ji_|m4IPqh+AM7Ehcus-T?+j4+_Ha1_iOeFh)coVc-M9SW5Z8;Am9i zKtbWgBf*DrM2&7w`eJ*!1%?U2wVT5gu2%~T6NMw*ok^fuV3;gAYqidDz%X%CvOF;C z4jI%4okES6j%R^k4^bF#Api!R_$dzzu?F{q22FN80gFyFIWs)T@EnpBfL{I zuL}%2Eto|GS7mBnsCN*dPOQZu!hR%cL@-ZCP)P+S=uap}L8?3y)Pv%w1~D3f0^^p2 zf=01BKTwc{q=o|ia-m?V=rm9;4F`BCi&=mI=Q#zI4;_V$2BBjyAS?X9fE>yFV=!Pk zh-msIBzWEm`!EKy7+Jx963dl>zZG&e_}fHx9(%fv89f&g#&s4gaNS0|65dE3_oKc* zDgVAo=_*BJp&ac0CD44-$nD7lLpJlC=z@uM+|i4 zj2A41tu80r4;S7eG_M=(J1>}U*Pm`b68fEZKT6ES#{1DE>v%U;B1B7tfX^}DJ0Mm* z;OBsXPxpw`P{13%Y``BYhUX{XkAtKRc>Zz&{&>-80{#RX;Mpu@A!3}%0a8Hp6?z(k zjg9ydMF0_h63Mxkh(8%bwEihb@Yogh;fO!Y$V$YQnywV`r$f+&{28MBOzc?zBn)}$ zJWCfiZ)5%}VUBckKjzP-lz$~c_m^{!hoYQ|#8c;q0^M%3Z+o!~`tybB0*5PHi#F&l z6pnaDE&|;K{l%j560NgaK`)LY=r4r~8j?<-E=&irL4TPjjJOa4{pA$vUeH^ES3m@H zbtMu{T_pxObH)o6!&a9Q^j8b-HJaBA`UNz`^V`bmTBvto{yMQ18}rwb92(=Pq(aE= zz>vQIQsqPbMo>I;lNb$!ym8Bh{LNx_enS2hNa~R1FE`|G6`dyJZ^Hqe)nZn7jA!}K zQRrw8G&bUI7k)(i9VG7%6Y+O~h^D^_37*2jJ{o|Y>G{JoH~0e_$9z8`yM zj5n^cXo2fC-X9R&NFVp({Xt6kV?0% z2LoObbFmokGRdKFU$j&Jfzt>AuRyFk2)qi4r(P4QArLTrSrB+#49^b;ya7oK0{rEI zz?-7efWTWgz>{3e3Xl6zK=c}V8ibNXfwx5fDDV!+r^TQ^7l>&6cah*BE$qW6@Sc$^ z9rwj_B^Y=gf))lo5al0Y?~MD_d6q74-r~SV!W`-HJ`Q|LDSzA-UFs9$p(vjs!Tb9} zfo?b2x4qZ`!RNyDg~JuDMGFL93P-#nUx99c;A_$OjnZe@iROqe0SG4%g{K>5)B6BJMVCH6w0 zZ#=T0-vf^_%->TF3qewcK7YBPzp&^up}zx#SuJT4vD9h7g60-v?;wc zH%z~)a|K~pQM1U^l*D$4_Ko(Lwdp|nzfr^~`ZhwV$gC*BTC&Ze&|e7L(Q#j(C^W0^MTL+M+X|b;{?_CZ^kPmvp)X zk7D6o2E4*`YI{oqpT$Z{PtQ)QH&CquW>g2gK^vJaZ!u_H(G;;AV9*}7R^}&nU z*#HT??<1N!bH+R!FM~N732(LLUEr8ANcDwg2Xi(SL$R2%3CRxT461-R!-+ZlAW$B2 z`h()B8nG9`9OIG2oB?8Tex@6nLQ-Q6f4P`5P;?s18H58*4Q7^$IfKw8=wlGJ7HEbD zD}ZJ*l846t&E_DYt+zme&;DQ^2AZvmY#3+;RRWr=A>sqgHllZ1W?7)2$1F_Xu?3p# zge}sEeW2N%QU+)SsU2_x&v!(EOD`g-8;CYTKr>8OhHI7(Bn$%3$UlK5?34wX5h51v z)JV`vfF{tYMu7?^cS7Q+okf*)l0KCJ&1m7;#o-FKtOc4e!V&M%SkNudj1!&Xwa)H@ z{~)z1m{A?{25n^exdoaDqA6lK0Giz>)-9kJq$YwFwKE9`-i{}lJ9EZ79WMhkwZgl* z=3U@GGg$2b%?{A;WT?!G#mC7XljNkp-G##pL_|&2f;_K*L`y&>Sy14bYr`16(*^ zmJ2jP&?fXT2wMv@CkiWo<|LAb#sJO9Afl~LL4r#r*oT4UG$R`Znjw{d=5&boKy!xZ zJ(F1$Xy`Eu6L@Ta<}6{0bYdT9&Zd+Bnjz{O9KrK*k>Co6i0THS%@EL>FDw^mmJrYk z0no@lfhO#f1)2**EZ(V$KraEBK&!eKR5*DF5>H(!sNraTg>t1o4*(L3fKz z13~xTz*F}!3&Cuk4KFDtdJY{9qTAxpeIf@ux}W4_V({nz5YZ(bMB=H3un*(W!$wx{ zD8_?I;M56uADrfjkw=(?^6>HWXjxe1pez=t9u=8L6!=K>7^U>%=_M-F;~=4cPayHs zlcGl>0=)^r)>Fdrv}Q@-LmNCdGk8-}aM&q}RL=-!yi?DD4ySxY>N#YIIS3 zuF!HRIK3!bFF9P{X13t;vT($E@e1e`oL&{3uW6l0K6W)Z+njD~FXB%0sdznvoK-dt zwb;H^a~ASV!^`H8=^DfMF3N8QmpIm+I$OAsImV;;;FaA zMrY1A!orjRtapUBOY^#bH5SGFZy!+^HG1MmAFbYn4F|3MBPL_f>OGP*T5SkVTul|A z>QqA2`w%S;RUd$YXLrQ1?n>rOJH|H)RUe7*`I#+!3`q@D{N+N`C!*6p)u%YX^%G_x zwE1WlA5(D)iLOI$gV?q>^|=TEr@kQh)EJ!l5=8WbuaMwnci4w<>Kh{~I91MkC6M|S z!ahiSCl7U|z7C7F?|wmZV^X{K1C4i|5$KE{>Ed2WKD4|B&@*`^}&~rO$eLIW3 z(Y`*2?^0HLZjPqePsWg*8>i*R;=ohmM1%ne`SEg4YJP5xrYOHFQ+?;z#B{M;wG`9@ zWT6UnLxNYJVQ;$`)$49n3wyZ0ySp|!NjN9_oG@D}2k~Zi2i^9eJw!a|itiaCPD}K9 zFQ)qKy6kV+MqKyJPR%yR%QvwuPQ zT?ZVz^{;xVjWim)L4M)Ggt+|e+)=Wxn5@$#V+Pj!gc>`rrbyNU>zZ(xx6@bmEuEG( zr;C}^#=e;vj;!^NC_l0`fa0k}F&HC>3YqQnLC~dn4YYn%-_a-W%F4(b9?+5U22dg1Tac zKeii{YAU4p-EtNs7|rY;JY95R5N;y5CT0+B1`++C1qrT8U>_cY+l;IX!niBN_fF+O zsWc2L(EVY!fCEnznT1j=YT6F2v-pAQb|7vS#?ruf#fOU-l)f&E1Hfx;2*fk(RiM)yIY^kA)2UiukoIwH^^W%bR?(I3Y0 zp-lDrJwvkUFc46*!;yIE2<$Bm(Ws8R=@Nt1nInbsD9tHvVlLlt=+)7}Ra(lxs}9iN z72l*>UWu9m4!Cy=5>Fi~>U7Q14c9#aftd~+C(Oq?%(@NS>Cg$Jc5gcLFR;pV=tR+b zlCKv9JXzHIv(q641}8BrCY$yYq;@)VDt>$FH0*UV!o}0&K-xf^LDuMWhy|mjGntl5 zht5JC8sKaso;nA6+dpVZH$a8y(77UZo+B2<5<49_UpPuTN)V72kZy;v3q|QgTB*Fw zcUJ&4z6Rw#5mlou1{HNg`g7m0 zb%m(v%o(3qJdG)40(7NtU8T8XVAI8NCqP#VHR6tsXxD&lCqUPVzUzE_=p@&d6`z}< zY4(g8NVgN98*zXq97M!SfNqw9QuA|jG)4JanCh2wOh~B|hOo3Ms9TYXTDT1f9#p{I z_AOe_eJeZ%x?MQ$@Hyf6opKOw`7Y2KaEoJmG22wAX=!at7pm&po0`(ax~6QQSf%a; z17?}`Ai+s?(Pj#DpBzM0(+d{re$q>IQ)wOUKyR*64}cEM4{YJ2-!{Pxr%B4HeRR1Tuzv_$d8NY8D#h?svI2cCLDMD&AGb^stkKPmZ9RkTV~ zPchYyV8zta$V0O|gTzzMVsD#`rgXFI2;1%T5X4liN1|Fir$wF@krx~h+5zL&sHYc& z_>xbAcQ5mx)`!=fptZJ-N>44O)UnZBAuda>4Yec5!gyy-Q8m zhHP<;KbazY+7iAB;oL5|u3p1$PrXj7na&*5vX0)6<7gexVb;-`OuKw<-ohcO=l_u4 zWHt7-dZ=Aj&qS#nEG0AFOD$o5?a>!9?}$v7BV+1E&qWgb`zO@9pn~;3!uno0)^(tb z6L#BRiS`2CMpZgde_!kQK=gd5^(4C`YAO$tZ-a+YsM0E=2{H@TV9??2g ze#cb5nXFV?eGeL%LK7QQBpp900K#z>R%o zIk6SH^j@B1z4TrSE{KZwwfEIrd#?bI@@wxELGjc|Vo`TAb3M%XWY27`EJh>i?|Ch~ zSAm#bdh?gN^j=jInx*$@IPlc!%)+7+i7akS$O5 zbosTBcq)N?cv-!Uk(FgNF53i_)w&>6T34?Jy1%Yo9|xY=fLSO4FJX)OaGr$=oVN?> z4TZB57=n5HMwHUm!gVL9Mh42!7m24f7HQpJw2Z!tQN*mQHxZV84olbtyRz;t9I-A0 z%fuQ{I3S|XT_$cyYWJ3j1Hmfum_ed($fHqER^mcB7jnYZ|3wEDBTl8w9{Tl@Twy0!%(`9 zkrgPlXDDf0O#!76lI{z-kEC@tz=z?PWzJAi2V7_A0@p2&ri3xl_x$yIJ*D&%NPKC) zF$&R$1Yh3}VclZ18^Y14!ZOWa34361G$S1G9%Mnc=LB=2bGp_k(>^u~NByR(g`(v-`2`(NW2hwipK(a=GoCTvMk7)^z zAA~$Kz`;mxRvCNS05mmEAU{;Z4s*o9k!gYaaN&sWTt|>@k^D$edX!e0MD}xgA@pBDjkxCH#)+WY^MEIbzLR}@=sc&C6~~t?kk1}- zD(Ut-;AuF(`DGCy*g*aaIVd$hH%C*HKa*+XJm6W#MJ=3-1m~Esw|$Nlbe{{K2Rv6e z&+|E9`FuHuw|oKUwnJSg;upE%7srUx5*@#UbbChOQXJs34kDtjHd(m4T=Jq`&?41b z!PJ4fD{+jHUxftUaKPS{oF;V1OHZX;qeZS2k?R~0+AwDht{37BJ`weEBM;)w9Pm^c zuIQ?pz~)X!gJC>oLP}(^rMnrz_Qb(0`0c4%X%#09sFwZXHaU*g4;^Ox{F|vhl}2xF z$04fc4kS3!i@mKLYS+~hcPi~Jk-6KEG4sJ~ZO?<>d3Z}st1nuQtyL5;d! z%RL}+4{A9%(H~(ol~Z!6EH}^P`9q@mVXfMk2qt%dL;vma9H&mr7h+W>EI4z^xneMO zZutnwdTzNM{0Q{K&oB??4D(UQm7ifg1`57OE@s^sX3jWfXPHlk<;W~^UK7kGA*Lso z{N+wCpAv;;g84KKJoOB-FgLTejk?7{JJQu)o@S?*&x#PHn9q@Xc+3>@c@WXjUO?ih z7qJgdF<&yWGR3s>+rYef8T3jM%~wG8Cz`L~0I!~577By&Yfd|%7%Xd03_IO?UD!+G zGFZ32K`D*fj$dyg7sYxD3EnXyDs&^#2R(F|#rxaB@{Yq2_QOs(yM!awk6_OCt|z9dymxa&H3I3tIYX65WOGzdVyIViJE_Q&c_xfva*=O#gCENIo~Jv?Ws?(*JubA zKa&HgHuX7KqjNqMjGDe+S~BPR5_xFHuaMxTYV0k{(v*hT3XAt|MC@BfEF3C!&i9>g z#I~*a9&|fG{~$Vl)H>z!o49XEW$_GxUcZOF1DuGwG5;qBqW0(+`ntgqyR83Nv_||0 zW^cbxOn>zAZ(02na;V1Nkl;+cSiy(IscdeJ1(JveFZllu-aj?3i}Pa^0L~XuGtw65 z|AGkz=zHLX_6kpoFGR8i`t{+6qbMHfHzv|A48ih9zX&LJ8;#fvA-(a;BK=}w`fnqB zPl#!x=PwuOdx=7W^u2L_&xkV%;Ap?Z8!8_fi@pXJX`#MKqyY7cle}>Z)Gq-dI>C}i z@C9+~!%)Apkrk-tqffjW%dxMP0YfFMUlw#9>zBg;?%rk=ii0M0n+gSCaf5IaB;hGVJ zF50g}YWL87ZLkX3Cq(Z$zFt7-x}xTvMSHe6(VoR5Mz4p|qW${#jWh7r`)I$R97wgP zjmR2BdlrnEs+pFceP86E9XCdTuXAH>(VnK}iT3?OtiK}`juwmdHNp|wwrT+A7VS3` zoddN_xmk2ly7Xi33EX^&0RSIY!h6r08+`^r3ROq9(9;c=Sg0Q?DkDw=P(OrX`WDyj zo7@aSsKCvU;3T@3=*$^ESd=n2zoqbQrFmVPAGH8*UZru(7hfQNb_e3O5o57)`E5zo z5WhBj&^qGLeG{Vlc91EL?%RXnsU5^*2;GfS7TtFgtA88aheAxFJAb+8K1>uEbRUib zPmN#};1G$Rt1TLO3Ed3v&;t8N5dg4{B6*V-VBZNuwEE6Sa5^9RFtG1pWChqc>n5<9 zmKg(DB}^X+x{vAOaDY3?nT0~|VHm9i?z4P>`xef371l^6_u+g3rMetVYB%JdC=-!* zYLbZSMx*Tzl1~F zy+HCQqUN7Pa<(*)oW&&m?u*nSc^!V^3IO)H=x{M52U2aSo~%(MXThkcfoTbnHzE)1 zm_~xP)nISyl&0p1@`R61qhbbqlLfm3w=^5=DKzmTe!4m{5 zOn_V#cn=Y+0Nz7Mo)!bVhk=L&Jsb({P{%$Dyhj?@(8-g)KXnx7mB9CC(0%ajz=5ac zFbkz6j0c*~V_6wNF)RQdBkYkL>jUtyl+q_p0&VIzuu~Bi@gbNw=5mP7$T2YNc|?jt$9kw5OF-GdD*!h(xC|)n`#DqRzlE3UVeA zPo0ImMIoBdC^Q|Hw=o7Z=&Rgk3+FkSGr2k{xkB%uN9PJ_X~6=I&I27D%|nwqA8c^+ z0wnl4wCL0|PKR7aoo5Ly66T8?W?lF0cy$S>-5aki1*?o#mx>f&Sl<8x*f1?6Q%#wN|S@o7e}Sqo3QvuCD^$W z*{O+{xH}N<#7GOk@sT$}vY&IUQMW@Jl}HD1!Er&Hq7QHaXm3ZxJH*RK!Ge+TPCC#v zzoobf(rBH#k$CDJvDKL~MPoH-OfuIZ?-j25G?xsSy7Y_-doA*Qp+@}maq$7r?X}1U zMc+fdK6JK+%Zks<(KLHlC+YTDTbbBfEEgaz7zli8dp>`N~ zTk@i6Xpw5(Vd@McT{uR?zl#JflgHjxJWc3|FTE7{o)&puL_TmtXv16z{ZNP>`9w6& z$2_QfDU?qYd;&K2QfM%#s&FaPmhMvs+e@LJ;kTzgr&U}ErCN5+FXT8{KXjP&^Ci>Z zse-R?i0b(o32tV`-c}E_>*|TS6#A{meCNoR`f)CWeh(_t{~)YCmSg4JhP=Khu!y@Z z1fpuxPg?M25&T69%H4KRUO=QaT<&IO+n;|GMZal9I*@;tgJ@0J{`?2%wm<(V;(xi~ zJ(gr;Ma5}}6}=GYwm&b715Yg?BAv+<y2drzt1l$nnfZSUqex!UldTVUreZr*Fx=v_TMS@vB2nL zu7f~;vz>4!EMe@H6uYI2UDKp+!2MxL*1A7fHYZm2&FqQ3K+qs9mNqR)rnJilS~{g& zmf&nb9|thJHg9woEZRRKij z>WKvVli-@2wf6F~nOSS9f?FN%db8Fw08eJEYa&y1Yq7}BT2oFigZ8Fogjws_LeJlf zX_&kYsVqE7xw&;w3bWQjQg!Q#g|#GgK;OhHZ?MhsHV{hh2qmjWn6+*wjB-6T0zAwd zHx|!LjAv%jx@k==9TjRp*RmPYDB9?QJnZO;1iOde8e9uS*ga;G*62Oc&4s*0glrbY zbHRRuc5N=WB~UdN>@U7sC4Av2w-%eJI~Qb^<6MwtvdXqW8s>uA;y2y|$JOcyDsHcg z+RY6hYH=<|!^mkM)7)He5X#U1J0QWk-MEGZpeSpAI&;CDM8>TU0$KK64RgVrg;CzQ zb|E~(4!er!ZpKuzsLkl}CT%V_804r#DmaDag6Z8C%>{RtmIcGox!@2gU~|FAuwoBT zqjj2*RNbDE)n4(Yv6}2o_jAFa!Ww2+8f(n@crMr?XhGj(E;tCN=0N!wv0?qP`+3{RG9U1BGYs-b`r9vo|BPa zZ*W{g^^m(&PuXPb6w#a-(fIm_0@Kp~1^d&5dPXhO{A5f%qS2jcglCEHY$Gg8#taue z$^>VF&CU8I`M6s5Au(pc6 zS8KEbjN9A=0Jq-Vg6-Mdh5We!1IYe!w7$~%7gqm8;`bT^UyNT^yj9-jXX}CCdV6?A zdo*mV@8R5~G_?isCM#&@f}ITbT!vFf@iIb$1J+bXs!{!8WbozC)RQ*w76%fzK(sm-bXnaP9>M z_0MU2|3uKc5OhEb+y@YL5s?P%O&f#%W}`=q#hw)ST4luW;Vlktu{4YwKZftI4EKBX zwc+dXk)ucL#iixwYnI{7`-~VlzR^7ZW=T(O+6*k~zyIx-NI3NuOfrBW)?wvvaoi5?ldgby)SQQc&^ulTIiZd(D(+a?9CSAN`T|G!%VQnz=z53rcO{m3mhs! zL$NXCsEa8#$dvm?C?6Y2g*9AICrsl%5mLE2pOV<>$T!$$D1jQEBf+Y)$W0AOH8uQ) zm0t+u%Lv8VDW33tMQGP1yk7%V6W(vc_uGUon)*AjnbH$pI{4fd^26i;+QL`ztXocc zX)4FM?~#T{?+^Hm{akRh(G6<;q>O6Y{Y=#2q?g8#(=SYOlipuZhN}M!3EmLLH4K{+ zg{p^Rt262SU1WbmWZ7FjOnUzmMtPT*27NP`^iGQmHt=Q z`I*{%ZZ^3EP=Y#M5D8Y#aSfe~I#_2*Vl=+-;6s>&g};d5H?0J_HgCaO9@rUY3?73c ze6c%-p-S_}kquZnZNTe3!^REe;Sh_0Ea@p-coOdK#`?iZqdBgq&n+hH>h!tAsfQgi zF$vl)0V>qkl1QpDTb_D~=^r63?)Pj||rESp>I*#D^oHy3h%! zYZ_C8cxV-oaP^+xwd=$~s{#SNp(hfo;NzN&hkAMXWCh^*QPJuk4dkDgx2rFBYVVLPHjB-6T1UxvEjl^?fS(SI{6GdNw0j=cLH%0}9ksUnF=gApY$YuLO+05W)uokh5V7#*Z{qD)2qp|a_n6nw!T z(ZCn%K=7h~+`*p08X93`D>Jx*VZta^ zqy_Nc4u*^8UdFRax2GC%m}>{3 zP}lT63clbVk-!%mOz`kJzMu*O^oc`|;Kg`cv%cUkPhTT0paS(=!QmhcuHXoVf`(_%GP9X z1SbfiT#pk0502m@@jTghHuZ$Vi{pakhLI!i4sL5Rmq-yOQ0Io+$KLMmAV#ZFJJgBq zZ^0#;BF+U}QkQTl$vP)b@@b$&?VXMUXShmId&R3m!$Ji{&f!eqo@KbPbC~k6!u}4s zP`k4sD)J8JNOGxnIG5l|tROBEj}>~+J)8&X+V0_eK=2yBglF7?S1-7S3nhPY+`~nn zH21(?v3s~!JiU9k1evP4ltqPDL8hW7QQ7qF3jX0T(ZD}kPH?X}{^1HBpj%vtr0TB1 zHR~U)_VhJk1!+*vL0kjc;2^FQ|Lbs#VufG>?M!V59^xNDF5C@?hq#_pNvt4V?go^> znj4W+-A!U(ElByHhX)sNv#@T7u(FjIT*N>{)=PvRh` z@>otNMn~TWyE{OOcBOKt6W`^6hqzOW3#z0Z;x3YPPL|-iL5jM&2T9f4D?#lQuMN!# z)fYL4`-FSH;YJQ3e&+FjprtqQg9O`6yeu4QdOF-NTl(}13-PS~VBWqDfv)!L`!FEb z!CqqH+c$ph@u;Lu&aK-HO1pLWE53C*#M9rp6Oh46{Vc+*%S8hp=Ig*Us+e~8aML~} zY}~Yu6MS%;oA%#8KvO+|r0Sl;HG9)O<>__PW@Njk0jhV;J_C62rrxv2RNZqdf)U&t zU)s~QRQqtdJ}7qnflB6Y!oi*(^RgGzKt|2>%W8FRo96t+5op0)O=SN z)wFw$sKsS{8b?m=GtDjQe}FPn{f9_!3M;P0xT8W*sCo>*b(Zx%7TG5eS++9=r}?Qc z%Dcm7ga@zrxtRXPm^Lkhjuy7Ei992YkZW{b00%WiE%3tH*1(*CYZjTah9zfeR|1Gn5$1FWCe)r@nR2l+03N#1j3S>YCZD;4oRX;ZEKDc$ zdA3b*6M%*y!|SDrzx!9%^{IFo2i>^| zwn2AQdiAz&mRj@35&K0Sf#=5HaF*P%9DwHmkJ?Eb?d7>Fd_hOmp3 zklGc7>19Qezn9V%>6asw9ZH|;7H)ZfVCV`+@Ki;7Y|N%M=E?@!qI@@@bdON7%7nM+ zR}x04GFY|t&-Paq!yW~OaS*Typ6LmR z4MD)__>Fz}akV=NYObk_s?M!N)M5}ofM)d>RD z7ug08S@tFhK|pU|l(w(iknrHSHxkp0jcL;w=+pg14deNpc>S!#87N#{Nl!i*f%o3& zyBgglV1R0*iii+)0h=iqA!PjrM&>Xx+f;fNOijau&8Sf45mp~@EYVNUg2qWKu_fRkmgp~jTP6I^0k^J6jt??W&R(|- z;USjT78!hzArc=;Y_CjSd`E?%NI!sSHkKHOB2>X3BsfkM*U)Ln-a2hIme^64J0+M< zo6fS<_mx5H&VYv=xr@kmjmdW_A*Up2J(#II%Flm_hq$1u&+ZN?7&Zh6_T0ghUY##9 zbe#u!0oAoyn1pDeSu*!DnNc*+wBwY$bK1s^9^<17Hx$yMWxin&UK*^l5NyH9%Frod zlTO0aA6X5^p1!e?P!07#8|QNQ17e7DT~H1!NYi@K+qH>@9{q zSQ&{79@nr4td)DKSB?hH<7D&5?%NJDUP9DZXLB3#WKL(RV_qpEW!5VaVb z&^U5Bk!dbCISFNG%af7dgB4tjaYu!s%)`|QPEHZosS#QB#tFg6X~HONUw1m-VI(+1 zJkKX>aJlC93a*^ zf=l%_qMK0B)CUHieyvF0)2}1=+B!b{A3#7~xE@K>-GFP>r{C!5<GT z{4Sx~9ie1Z2p;?%VU((ndhmP2@V)}W*n{6sXxBXW13;Are^7iMO8CMxJ}fp<--ENQ z>A`6#{q7@3g9m>UzpJht*TjQ&D5I)#6Np;$;53e${>3!s!5>2z+VXKE_yh&l;K3dBg#jI_P!$c?&n2Yke2%H z7f4omz}ky|qDo#uf+rs0)n4%esay@O{fcm3HQdN+vs;Ewie3}6)VaP+usK)GCwxdZ z0CVR-c4TPj*F}fW!@dFX+8*{zK=8yw(qj)x-GX<0Tf)2MU6Z%n-8-N%=gMEPbL|vA z?_A$S23s$&2>xi1TE=y=X#qbsqPnS%3V!x|QNz!EK=2`T{OpH7KN(rb08c(X`WzX2?!qD%$2mpv@e%D#E$NE|H$D^kLa2q#nRweT zNtOBd=qr@KqOXx)izbmw8y^v>!kj<)iAexcT zt_?&p0aXLh%;Gys!WRb3DmGJpAmV+%frzHE;$}k{2BO*VyXxkkX5nGyoXV*E++0L0 z4n#DLoaSbl8;IsX85&_;BzPo&YiIaM$O)W?EEC3UbpSX)z(#Dq8rOX>pXHN|r!U zbxR5%|1}d;^j|YACA0>QMmHP2W-6%ZmIfAdC3WirblFyYV!jM%OFwG@aGE@)8Xq_< zOP(6#>V9orVei5h=X3DkVk;I6&@GlDDZge~9zU?56Rzk46)B7RU`6GvgLUI?`6N{xQs@84s@1^))w%`}JPVP)_KG)^b!TJ6oK~4@32SY`QXFNsQ`4URtJ-KB z(07wQLk9KRy6?6-407v0aul+yD@95}w)F_MkZm2dd&H^stBs9mE5xr!UBduweK4yX zz-<5s4nLMIHpY4%uu7)TTS{Jk7Qs?Z$K%F@U95`Kt`JIXC4$2Jl*D#hld7}8&uxQp zSh+0{JbMunYiR0WH^`=TgKRI90fwTveM9et)p`~*3eo03VU}w&2yke`m|l$B4k&;s zJ0hvNokVS_P_k5^?>oV?X%g1X5mvUn!>GH9Fv_*q74YCscN5RS##5ba(1?9nMvoiY zFnqMrOGYmCuZ?bZpu&FYf)?@jMDTD!#HS!R9e4L2S!Y+|Gy@YgvnP_O8!Eo-6)&7h zt8%i7dBcR;Vz{w8o5Bw}Q@7H{M-gr~Bt~v*FDX#!###wBH?}JJ0XdYd>ctK$ykoKs zz1IlvsO`NffK=VyQX%8Lypq9tjg%H$^Ip-Tn|(lLu8Y57*ELEEz3Uo{3=V!~5pL+{ zJ(FD3X~zqyjIOi>I(g)@_7yRlmLqtbI!>z%2KMMT(eGVKTj{G6}@MYQ^oBM zym}t%0KgNEH69s!pu!>;$emZ&j<_#qd1_4XR0j#Ma9<>z>R?jY)=}zFRpepPAxQ9X ziioW-Dc3yIVDkxw3FYtzC96T0?j0eFQVr6X){$a(RDoeU(>j{auFbTL0jg$N$BOT9 z3138*$BWI>pJ}nBIn$!43{(GxG|aS4z;B%4j4K)zJ_Kr>q>QT0olMl?OpC^m)8Coq zW?HA93~hNTlBzomS7Y2!p(wN^`h1<4*6AWUBO=S*F2U!YDU8zgb!Pz{eE!+ud5-ba z3emvyq0P8aqqK#QR>2zGxxhkIQ4Mr!??i&TKTj+QLQ{8tKFK;KBH{udp@J?%f&-w% zvc2NvQq>xs{$k-?Vz{xV-x+t}|0IlWbmK<3OCd0F^p{C~siVJ~U~}}1Pzwwu#m^r| zKYs;S)b{gN0)p>Sq(R2ddmV$HzgkL6vY)>OWaj7jEB5o(ilO)O*CB(g%2)(9$oG?r zA*$>~7ox_gXAH6F^`eEFzk%Qb>$v$Ffq-su6A~Odfos;y-{R@z=DAyUO-=g%Bbqx<3ug`cp67e|7M!=@lT)(ZTTdUs(T98 z;NvN3qCWmH_`;Xw_UlNCc%+$rdOfq{gUn=1h;GlY5MS`8f#Ie2N#ZuA8!(+OW{D&92 zUl-jQMkjB7j`lEOcMXqw-W0Ud7r#ZY`Ql}88}Bf1Q*#gHo5;;Z|NAz`YWv@J0Kw-c zl4`eYs#Ea2?@DObd~f=g=RHuF>*cT5^}a8D-t~Tf4E7&m5quLT{t!~RI)9S5Q(xnyZ8i-a*FlqMkzi*r zT!T-eVAI6UL8cSR^btz7R>Jr+gD}d~n33@C%xNYuo!OW+VfC6D2*WjyU=m z<@D9FGW9R*XQ|z60KvT3k>JS+uE9JChI#NUd!scmX!`Tc<`m{!hN+MKdUmG{bE_n8 zRjR{0fI|mplcUT&2wRh+ zd=R!4e&8%K^O&QAB3%klI(*p))715`b<0Z4s$JY+y;Q7 z=6fTlx(#s+9g-SZhnz*u$S-&fkDK7R1vVRJv6Z8y4&+jET=+uE?* z_`eS7({Dv?nCty0z6k+o(ubzlSEI=o0v{UU$W5hWoesGfRq31@Bl>_6mDd*uJ^+y% zd;mgr_y7b6>JPqjPOGxbg|&rYDVDSwsA)IU-jrB5NQ`e}br0FG?>2q59WbO{AJ>l> zr2*@fQlT_p?N6`;ti7OFmRJ69S0Xch%(Wr|*sZ{(b^yCIAlUdzTG$BWJ&D&d1hLyn zk*)=?*~eVlfzkq5{)z+H?ZwjvvICI8#$PN##K*Pb#GG6eqCKfKyj|`A*B}uigx!JQ z73+ksI|2cHWhW%~L8}mL4-;;=RxN--D{g?O2VA|@cEeEwb@oDnZ%RaO>QK7Wi5_u{5LP9^%C>kI zTlW@5xgH|{4@2ud;yKEAHt|!L9a}~X!_%#PeHzBmJ&qlX8S&83dyN`#U<-FbMgI$% zx;MJfphI;~F*K6DIf7RkBc=s4(qVRAl66k9PzN&9SsN0ZJt86P6|V`+QMF|sevK3E zeuf)6w!tv?f8f}*8?bGk9X1<8&$d5=MxN~e=}_v~#uIFwZS` zQSHb#Qg6#JL?WQGa6* z?Bg6wt|(&_>mao%c()ToQ@C*w?{*@oY~q$<=}rO&W}b`$AHj%^H8QoyxVKY;a;l*y zRD)0IwZ@uj)4yf)3jXahA(!iQI^fWYdpZVQ?hKScp)-+G-C1H_3Q>OE!JRFvb0Vy4 zvj+!vt}x0KIS=sQ;LaD%3yfz|59qd?ZROlG4|gF5Q6ba}4dw5V;NdP3*Mc6Yhr5_$ zos%y0640U6E=7U^T_mNw;#HwRHC)`~!o9+9V;482KFLh)&P_Mjq0fL#2K9AULR#e8 zu9EOl-*z>@=G)i|flHU1S}UE}HDFNNsa*>Q&heJ~j8pR(2B-E9sW3TC?Rrp}Q{%7L zsofx+-l^S)4E7LX5pH^Z4_T}>bSLVY-uJex92?X?yTai@VZMbH= z+3lWQ-mJC~_1xGUAWz)bosw}Ei(nD&?a*+rgXX4o1pjrnkPEj(;=k@8mHCOl%iW7I zSacr}94;dU){vB+aa<1wv~)~|7|?A?9r!1M-n$+(l*Rt zj|07jln=_D00C-(8li3c9S~gBlj2s8pSrB4NY>ePX-@+mwe$>^^BRcFq3~DiP+k{X?@-=Art02g5pF*& z`6L!KrdFf5sW6&5_oC2SB7{qMo8WPET*^B@Ks$CK!DeB&W?jmAp1y`l32M0afm6?~ zd;oazEaO9Du#*^zuy8q(ZyonB3SbS*POS;I@h8GAbl$|Vd`c>tU zk8?v?2D|A|hPIpmN!87Wt1<4VP!!q{zM{@j`Aj04IU>v6!(qsnMHr>+>t-c9j2W|u z>Fma|sW<$E-&0K|nQ*!gX73IAG>;wH%Ga4-O~ZaR>u(-4EF5)$_!y_1%mGfQPwI+| zai)AMncNq1QbM{UI+rXc7@dw&a}&RF3RpM~7@-m8MS_ogB(}Zc&1P-dJ?Xc|nO|57 z7?y@Es~O%xVY|Hr1udwac&UX54}0V+EQX6D3~}!)T9Y1M^PrqPaWTTf9yyC6gAK$) z;yd+{%H-wa3mcS^ekrErCBuGu4Jbk#ER6&kgy9-GGTB>4&hC-3tT2~LFroJH%9M*; z0r1dER}^`-n7n%lIVDl+m6+P3cjSn+vC-LrZe@U=eGeq~S_W5WuL*Y!5&f8g%^n6s z_A9@4UTB&|@mtmSsjbxl6Dq!|4#iVT`rn?y$Q%B0|LMcgo~scdG*~ZjUER3q8NO>C zfsb*>X^onkIx5tJb+9H=-*O^qaBHCmwy%u@4`Xl*Ek`-ET5erou4kBvcsCop&pv&f z8|~csD5V}72%5Jj)uT7yp(!`S@2cBK6zvsp=%`Q#hVR@xy|Iw;Y*|sTZ4;7M2%ajm zDGFiTW=N{8kH`}l6bu71ZCK;|n7*R@tI?JOo0|(-8fWA5nb6=RlY;dTO2 zy&#j5?qu@1Gcr}T3yWYF>n1jbW~b(apl(-T7kX*pzIP*)b<~8J8;n9&wmXul8zK(Y zn$$qOG`z2{hfta$6jLJ(!uBMzYeCphpehI(CcZ5RU);vS#b)XUVQeA>VKkMu_FhOs z5Y~#{IO`l&b5u~XqKqos?M>99;hLK>$Mn)TavI4r_rAhDC_~kcLQ-|3aSa}jqRczg z3BtyRY~P41+sQ)^=7dq+E7}MTK5?v=jx(lBYgrKHMzrkLVw?XY{U&+DGIaE)Q8*+_Wtxq+jzbZu;CLk1`3l$2YsubvZ8qXML6|2dm{9v9 zWy-~#40!00e;4^FG5M(_#dlJ; zpx0AntBLYh%^vgd8R?uhX+BF*&o-$g!~HpemJavl5^Tf$YS6k32SYZG95QO$K6~Oz z>f9+p$zn|WazQhP{PV!2_K<%*AUG*RN|X)x7fOf88S*azr49M~6%Y9ri>Dv*FF^*U zgs=#$!;cdZQyMcCqamnpI!=aR|1!~H*uR|M<~qav6+l3TxDpAz%D^={>|gEaHSE{X z#9af#dPD!UfG0!$b;#iB3l_mZo?V(Zi&c=C6^8%oMUlU$(ihWiAXR6Pp}P?PSa}l? ze1ah^*1FWhJeq%H@fM-{GeR*{;t=3gLc10M+y+#I0Jn?p9SL8!h&#n*>W2VqDuw_w zmA>RIq#*>j8^7^U2d?Jxpys{GsM6hiL@kB@G>)9^XPOHE9zYqY{y`*F_YkhexT8W* z=0fU(01u1ok%%nY;X?@Us4&WVMmyob-*$-U1Y@dQS;OH376MpjZ17$MXV=p?4%6u+ zjqYC{L*-F14EwvH?@rlaKYJ&ni!P5z-GYVb(Em6!vW;pd!JL1C3eEEb5*$1t8SNEs zBkRd-4nN#KC9J0nOAg$sAs+6Z5wxIZGTc84co^=V6TjyZe&}s4)FkhyP&B*Pi-d>a z{v~9v^_EEdaQ})jdGQ?;iX#21OtZuNYbZh$ypE*m-oQ2VP_nlknjP-n6y{qACe(gg znR2o303Nzur^w%p$=@p>rzC3qKGV*o2J|+5t5UavegIsU^C1$f;p0jl+Z9UmYN}=y zPr|VNu_S$Bl1hg4PX#R<);}ZIhIM{gKCGo}s2ee6?1<5$x-_U?$wB>d@Tfhg{|69k zs3jH32K6tc!Q>3;UxCsFb^eM6^{>U#59;3_gCj#&g!bTfe(9hd*^5S?y6M;#hV<`5 zi6Q-ag0HMIr2hZ}bbud`;DZiavqSpNo?b(GsUGeZpw%1De+4`l(0@Y)CyTHM#&Kid ztVuLJH7N||zY9Nq)1<@sAEdI4fg^VAPZYzxX|M``14wWU_bat9f8_`BzX)Zz2*nhM z2lMF(?b={I15h=X&nUh#C4AukW)_>NKbW(bIGEE^dWu<)hQWMR{I0s$s9AWZGP^RW zayJK2i-S3hBd0l;<_7b*P=>0X8wpO0$2C+vMVaHMGnmgSviTyiY*!D1`TW8t?-vUY z9=z#-V!DtqZQ^0$+0ifRIb4^Hhw_C%gsP)j7|M4B>69JHBhk?uei5l!ur3|Q7o|R( zlV-|dph3edjs#B}B%!_H?PCquZQ+OUC55$=VaZ`z6~x1MgP;X1lVN;mz{4=UjQA~^ z@Wbt}Tut(h3PrPXEl+qD##cZF+jfb>598gG$&2r(P!#FAGtCa;E1?Kgurd;y%#Lg5 zn`Cc&Gdqm0BFx4F6Kb!jOu5*efQOE^n#g;_T7%;mb~n!toH zYazjR9k{|6+kB=j9eOj>GHWMc2wz8X)-^dLL-=}vmJZ?T6Kq5Hinx<_etNw(KEkUW zYjWt`0JOD-?%sgl!xD)u8@e}=i$yfM80mEbk&4DXu*0bOGYBvscB*X;1VrKi{M&e!&{n!5gg*BjTj0z4Vlw?+ov zTCfOqbGH~;3nN$|sS#m7-&TnE+b12+w+pLzQvBhDA!;o!o!D=e40{qI~!9yl*~0FpSSH&lVeAP8u6aqm8m`Z%u&1D z0D^ggkyPF8xCW0z!FG@C4fC)-=D*Y&BFsGuvx!^&)b2*qt65liOH;k}1RQ#mGjT(K z0riF`r3HE@(HS`gR zvPP&AQSB$P{UfrhcL@>I0m8_4mh{FPPk0#E4iwXajA;{|cuun|ZdO|w39BFn1ByDL ze1uK|fHP%7C%K0zxu+{2he)G>5ozFbDDgW>G(HSKRP^CU@K8al+AH1+T5RsdM@UBs z>nOw0cxaZ!5z^6u7Su^1q+`t`rw_hD*1gwHrQ= zxvNly2DlmtPLjYiGyp|e18fZ0_*U6Iy>IB|t~HYDMDmY_gmU~x&DRTfLjr_$H!_oa zp%t)%^6wvZ$UrkYI%z*HAs=Zq+kD)q@xKTEABtuT-+~u4qI9x+f~jqloDWvqlYpVNpF&b~PvaUIlcH<)^=FLa zS&=*!kx-uR>(2}LLIQ-AFEUf!*BQC)IePR+_Y&|Xxw8jTUj}jL?62T=)xAow==zFW?#~i0te4_P0gzPDJBtDC+HUQdIi4@)JG}jXdm^`^>ifq21F`?m*f;%OIO47`BWm3> zESnQci&iar;srmuyZEXf?x`)1z+rzRWj;1#G;(V^olxgE13hZh4s zB|;c}KNHu_jce}3!2i_b)KQ@(Z1XReW?u~a5=Cg2uaH#T*SLmeryR2{I|zRx%x?`- z&o{RjZ98e$%Yokk!v6QYF!ENVy8Hlma34S7H`a$m(OwaUjtT`~Ugs-|D+px!vyk#^ zSy`~}7n0aR*Q`>%0st$2LxQzou}I`lI1J6SWsMgEe;4f^MjNe5Gz~<*ow5<99dz|4 zM4_LB&AFz*XwWUUhOom-Ef}Xpw6qO&(-LfJ9$a`VIp`{xfH#Cik5#$o@fQ%+Ui6p_ z5S)=M*)}7y_YNywyYP+63=&^h_{iy7So4?>WVYtPU-6p9Ok(KQJZ44)8x^q#bAL_) z5JiS&k_?>P}2RAnm z>Mdu?19-BWF)uQBkDNs?DL(Ov#-?V3^^Ez2S?Kpkh`#`-;uEhHL;2nkNB7PU1X zC9A(z{DQ_JLRmCI$*K?*G!_#^sS0p>{#nQ3Vz@+sVLUTmlF+Wr%$EYHX66mzyL7@A z?qC_Qnffzxwl#xKno7^JEYdJDUk<FnRiDS z+Hxf%Rkt#(!AVn;Ij%Z0^By8wB_hk-DPd;bD2&qfb*lm%Ja$j2!ON~EX!*)A!Ks(s-;Ees<3#(!F(h7g7A-A9@Vco_kpO~B71UPxt1GXM$Jjzw*)NXZ#jJ4h%yL?~Gmf~(z8 z809ML1bA4f<-`w5$Hr3&<7_3yO1sqLf^}Jx)79+C)M9j!xZRM49fOfzkr>zDW+=kk zj4cu)SPH&=h>-V)kjX+1cppX)3F2IMU$j z_rh=N$b+lZ71SJ|jM~msh+6dZG>)A1W}5T$BT~8El~=lJ=%W;p}&!<7;bRugSlQJ`QN8EGmNK*eM?z+by>r z*{AEV`%AZiIq6_>0P#B~ru%qcq3#bvf)~!kv%TUCVkOwU>=$Ma7FN};G@O{t?D^pv zze5Bq=#{vVLkSP_#lyt#@Pr}y(h)W3@y0pI*@2EEJj@J_LI!V~i-i6M^v5WZmyb8j zQBL|}nHCmik3%V{;dmr?=^WS41u4P0V0KP;f-p}^Fd_LQWy&R=40z~Ye;4^FG5M(_ zw%&x^r<2mQ#dTo?j6? z&q&S}$psM!W%yO13kAF=0iu2`W~O|V2YfR%2U3X>{i%l>hN^2Pe0!mOVwnc9jdwYdseRL|8&uwaa9s2*~+>M2_hy;d~WMKr#C zqBWv_01Eck3-yLtsC+-Wk9Rue2yQf*n?!T7(P&j7g9e9W;BSN@8Zx`1)jB9S?=FXa&@M1K|*${Uz&92@wH_Y58oe!Xt9pXVj^A@FgJOp^SZ6C&OEE9{Oy&?`B6$-&{ zlk?Ay3MtQ)6$RVcNs|Ahvjc^&ZUPc)GcWQ)1_i@Fv(dL{!@Tp5n7_l!u@9?xe)G8EYg1#WESc3R~+d-Cx$-K ze;ygU;LIX~#9VJr<}8h7B<>ihnMMvF$bV5p2=ZSd_}n@{{>wl>6TX53%hR}KgZ$S# zy@LGg+aXlJy$*Q282=5xlNkR^WUy?_A{fLqcJhD`v@|s$g!pd@vCtorarqrmnP-wN zoyfzKcah*&U=drxQLegTSWJ0eC?7;9Sq(yj|DiBSHAn;OkHqlf0>e1K{)Eu31=ybg zRRQ*A;`@2R7dQWZ#AfOT*lcMA*ff<6;R~c8!2S}yv6nrr=H8&@*UG5s+&4rm2G}%? zoW5n63$VXK8QSuDBvtnVuEB3ol=+l8izz>f?5Bt*71Q60 zX;XLf-T~;nZ4J#0ZP<8YWJ|-)Ry;Nzil^qqBRKyHD%2hI`k%c1p#J|mxu@awAJVj7 zTpDiwN&L=9v}78rIG|ysMS{)paYe&aym_o4yU%>|J)N+oH!L}KtARNBo|8wuWO#x-B2$hDYUL+Zv)>(`ZY=wzUK;4cpcx*upk`P|S`wWaNlZ zU0SMLpRwCIU{E`DTNjY3TTk*W1SoFAvA)C?VmG$|$|n}U^#+awaQqbqa2txN58yUJ zrs_6k5pJh7U}QFcGjqq1(y?MdUK5aewl#t8B@ zC3yWhLEdISK!f)|QgwZC%?5dY_4Eqz@IbScnr?F-)r<7D06dBG`XN(wTe1k2bFYr1 zdEqWtFR3{p-0LswLO)Ihf~`npT{&UqwniZ=+XhM1Z7UAe;M73xrvJ_D|uIt0BosnRL7}wx` zDA4?mE%F9Mb`|DshN(wA#hyfc1`8u^U8>LSfI}ZXD=IQ@LjZ+ZdmzCJ#bRZ(P4Tf> z(Hp>f3VCRRZ1o<8#={8hT4>w?RE5UF#doiSFN|vyo2eff^VVQ!OjFsYBanvBxPsp} zrWRLgLZ~@X8MT4ihp5HSn8uOQD5km4cr?n;2xE{`-M+YnzClse2z5eZC$hGPEbClC zXgpRJ`Hqsl0X&ZIFk0;=ru!SyCZ3Qoz=y_k=*4j30AQlNs0+g3oq#`O-_1zclm2f^ z3#-s4pcK_`A`&bo;~F|6C0J+7hQcQc^X~~JB%h*8x#Uv;53dKGCi2r`@-s@vDT#`o zNqBgL@+@Sk?rf2G!_QHsD4wE7e=gF{(a*zgyj?5`PkwHqqQ3(fB%wmc#D=6zuO5 z>Rq)^xmz&ZVMA!NyN%=?k=$z}O?fQ1M-!G^49~t0e4kj{Z!GLKen6RG{e<59AmE`l zKP2*pWAaBz$SH}{`zYa|H@72GbsZvUmj!Xmz}A`|SWz2FCcA$z?JSVG$54)1eH;ni zD8@B38b#Lb*H0M9lOlO4BB3nbub&q1nFI(8pJk@JUnegDKL@-??$*J~=Rq90^$Ylo z_m3$S-I{D!Q71ygE~36=3ELaY}SkbV_Lz9L@kKTCM-_ZtyH1O68oY;`RfJB~Ho%Jq+$oH{Dh zgmv;K)9eD$H297ZbucXwER*6IT9R^Vwd8cdoZc{1TglF;JsJkt5`n$DJp*v)GG-KR z-o8|;nE($BJu`k|sZ-1{DYBS``)UiX{LLz)JX=;9ES-%c*7{}Y%?=b;J_i!K zpetsHM5+Pf&Hm!z5@wCj?r(F6!`#L}?R-w*FywgzEnQ-omtb3BS|0vtpmu+=_u$LV zL*9mKOY?!U_S(|?fK=TA65O6sE4&7{pyU?TmTE35rRO0p1S(rq;;(pBX<_m6t4fO? zgN>zGg!^jooL$k8$UG65?*UTdbh#z09xWyYSUp;t;BD%x9xVX`wCIvZs%|MH3T$A+y535-lh-Yu(sk%xwtnAHRP4~B9 zO@18}>O)tx5mT$^EV0`d5ZJZ}lB(Mj*WjBe)_jvKu0?N9ZYJbD5wcksuVVEjv}>za ze+8;mu{IaqEfT&kte@CS{Z%aXBd%i6R94`YNW&^tfBdext#Gxvf|^?^qxN*$5Vg39 zMdQe6Tc){HtnE;SM%W%n)eXQkGy+9gBh*>N8Yr?s5n0yBg;lH_gi+q7EklS6beaWm-r-JGYg0W_Kn>B#Rf#wc9na9eWOgxmNJehbHe&8))s)Xs06h>zouDo@&z4+TsCZ<50?lNZl zDnmy?W!H+5?8(HeBX+_OOzWIXTmc+4zc&&r(c&69BsH=QISV|Vd>^Bfh0Oi!Bm7Z@ z-?R}b%OBx{IS+mf>^q>}CR_QiB3iN(>_ zyGIM6W2AVUPP#9(>6{{lIj}+vw;{oc$`XvTKFPnM!fI62hVMYe32Q&YQkdl{WJ+zj z6<0{(rr{L4{i#m+rO5%3Um9PIC)nakZbKNjs2rE!xZ;DR2lVE#l;_IO051JblD@7&18BlSOchn80L0yrlBbj8qw( zFn4P45u!w>c_hK-*9kR`0s^|o(Ma%KG_KiD^H@)>P_tAIdrHaStg*d0|!f+#}#V9d+ymqCa zr7qE8Jx;>(xc#1 z+&@rWa~{i?pQ+)uO1mDI=3MwIb}l!Fw|6c#B7A84gn#bbRx>1V% zIjf}+=mohm@@^I%xSCrCUbv2{`6m$2ytg93v75MNUCr&DzP76g&EoC=T0MVrC*a8p z_bz0r?rs(#w(+Oq(f-tqa9iIaq(W~_{LH#K!a(x~F+`E~iZXQJ$6lzC;rvzeP3Q@i(WQ_^GBM> z>U$Mwm_NRT-&OZIu2xr2^9^OxmhMfW7Uz#Nj-1|NnwvkqjWRUCJ4mXo6W7oP6lIN2 zXa4xE$li;{vhE}dYVQl9yu*D!co@|_6w{B4Y17j1WY}4DoWo9N*cK)1!98ZQ8{39w zA}wv$6{6973~baH^}(AE|C87@xgS5Fkn~-MPo-$VwsgS!jQE{hG~{z2qdoqE1Y2i| zHC!AybW~U|cE9`gA-)vWSB9lq$0~q#L-;E1Ye5U@B_8k_!o&Lz--_XP2}AU+?`zU` zR4ALB>IcHZ>i>_(;8}%8crSzgXJzv8J1P`K`d^q9-iP=VrKpDAkYEoJTtl~{1nZXB zCpf=O8^S?OA2+VTBxg| zg}1Z8j1OzuTAJO^R-HVJN4TT#0FOJ>?8k#d+w`!cLH?@IH5lim#d#Uy+%%cYd<7$N z_TI=0_s@e+#wU1KVevaOEi0MJnM}Jkmsh4(>*3yBf$(r|uPFL%F@5(EdWvGJt;Ezn z&@&hARz?x3wg(cNONnb}IkK;HV>b$O)dUlrrKd7QwS(Bz01r2IFOjbvldn-iPD#{y zO{TR^)m#f8XumcRoGghev@bbTlY-5ji9d>6SNzs9e)8jLfe95q)PzT|>kA`q_{;rg z3XftpAVO%c-r~BUam~HUzfnz2IHVHgtb>i2`j+#jYHore*uE)}s@n|L&~lVhtL6F# zv#(+1-sS%*N_pRJE@tjbr)o+ZdVrJ=0Oc*C#s3faBtK%ozsOUuDgj8bJM{DFIi`9x;qfis6&uc-5$7R z=cdh`UUSoOMckgit2a3v3V5;@HVhdoyt4@Av4&!cXnbl>m=z8ecA>i_G1^|FvL2f- zbFCyUL=(Ug8{(wOKH&7zKw<^^NZS=5nK=>K%W=275)Ry!IA7R4p6z2ePf_1Qh+ zr&h-b>o~)bGq)Ovr&h-cTF^PUZT|*%h`vq`zY`OF=!7TLB*#Y5C}+<*neZ@}{~Z~; z;w=(CvpQ9oy!eg^MUnnArrGH0bQGZq&Om}=C~*xPm+YMwsg!K7Yl-{y)Uk5Bt|6Q*}462o19?=rilnvKKMd zFozdmd+S+Ey~8|cR634^$lykCM`Uml!DH$~1~&r%z2z1p*g6~6Y-Dh&r&naaEjSCh zy4!$KFDSSj@FXa>0~u_q%_11jm!WAddK+scwIjp>cL_0ni=`h8-AyW+uWG~odyt1U z_adpf`$TLlO}XaQ{0i~?LU|xU$!ZW*h#wS2xdsmr9+rq77Sl(Jsa`Y6HY5Z6M{6?d zs8Au^_U%mVHKQ!C>i`7CO+bRpQE&}Di(>6gwPoU<&SS!S+%Oej<~PW;FG8u-zlD{z zGga#ez@Zj{!`e*TlfZy_Pa(lJCt_!HPc>ro=q~)8q0b2U*$CNMAr8o%BeZJ)+4DeE zK=y+8zL@ZZfiH>8)DOsbdoUoQscheuk%oZm75v5~DY#lwLe1BdQ9HQTiCPTEXdF4c z!88|;y@@h3!dpmiCM2$*k5H5~LY;u@9g%fLWLftT0BrvHn;}73@f3txt$wcA&?n0HUrxLsE60i&cBY zTSBAF-}o@r+oGI{wO6^bJLPfQCd)IXyX)$j|Fs{0k!(B&w>x?DDt`c0VsO)#PP z@5+=*{sZvv#onJHpJw482;|c$QzWM(D*hM3!xwwgA%o4WWBM6N=qZZyGXfsE^GqV2 zIVPW_gq)H{J}cp2fqXV(uw#fwiU)ekq4J_7luA}}GPQd?j1F!tl%WCUMuJsrTtfp; zlr=zpiF{ronNKA1MpFx|pHiPKr))5tE9WB8$J2Y0706 z!L#4@brVg+FqI9xcgK5cuA8P`J)>sP(UNgrvG&V)oz8BUpl66J0UPMB9{$5yLzzq^0>a903 z<@ZAJo!^GQo8+4zn7R>&!_BZUeplTl6pNdIY}tI9DqpNDYRt;ojHz{3edpH)c~nqe zBvtoUTtfwsef_&(bJ1)O(fAsQ?uLGVg8i04?OzLZ9o!9*ec;Dd#(rzD-^SSgUl05+ zBWm3>ESva&AKOZq?MxYs>>6(;RD7@zo>^=!jC@N)2Yw77LKvP0it8ZbntNukLrqQ{ z6>7pZ-;rtdnZ-^hLc25}!LHG`hGwT6Yxe9Qy^An+HOv|Ze(VMa``=(;P;#ww6D; z7%tkqj5b=pXxj0A5tQ1QAFYsvt`;7RjF9ls^^pp}wmz~lbSgRXBc7)>gawjaxj?cv z=xZ;Kj0B|W_L2B_fu!OU3{OTzNrS>7$;8%2MuW`ONBApV9~mQtetl$LWU9`w2ulR~ zS|GM1I{Aa@rb`B4>7z}ASo#=C@UC^1KE?q7y=6ZnRkuH`*`<#IJiV4axPMJi4L2S* z_0~QP1Uy;$I0zZMe$65n79ajWlT%B=;zw1Og?k{G4je+N`0$TIQ2>JuLxQ)fMQzPU z$?E%I@1i4wa%6;(RUxc?93_lW71D|P(PDT^fnhw6KbFw0P2`UQswVQsi|^kOzVJ9F zh|ScW$g{0Ek*BHjvL_-96Zw=Zfcf#ERz20g5WQ7zq}(#jCyI1yVWl?wR+eFBR@(h8uZvcFW*y zFBi1b-CjX(>Tb3FbQjm7chY(^=xe*%s{p}zw8Y2mmdXWJdyS+QT&=qn3FBgjwjKiO;>8 zRPiYw_n-g<-HQY(&Z4%qq~wgxy8(;xewm-%y148(UmP1Qk|q9~1K95wcknJNgF8-xe1|E8F}WlSe_ zlE&LWLuFABEaU!9B4+ae?@&Uzj@v2q3KpdU%e%y%=s_Uw0SndtK9Z{YKs?(k-X_+A z-OheN_d{WQWLO$n%xrf4@XGPWf)?~jyvZkohXvhF#qhI)A-dD&HRwS=6KsQ7P$hgGHjB7-Glkz@}7`9ozzEhv#}{$v_C!D$we z<zzS7dY~$Pz>dcj}Vjx|DIvt?e|_ zPMuKH*T(hD7rk=j`nGFahe5zOLpJbAzl+MC)D0{_j0 zSm>C^P`w4I%vnj7e#pa`Es<1Re-T^rQLg%ASZmozC|gG;Sq(zmzl|_THAutmZN+fA z0>e1$-k#8|h1~;ys<3;Y_zp_=!VBymHd8`kJdr-%+7# zcCa?W!$?0C8N6gI5+9TAr%YacM}?wDzdzIL%c=*U2z4+X3Er~CHS|xixBi(8$PW_c z!3ieRt}0V5_7K2B=Q~v7hsETFmylBuwLXGr*N+D|66mn#C?wcu8dv)0E}kudu1y8a z?($btLlYh&8ONFo^$E4qgo^LJA%r_l82Ji{jt4oO2%%yBCaxzK*IWp9VogpR6>7q| zI*DmEggY5UsE@xR!Mn}4h8CurS}lC4Fi$hgTnKkMN*ThPA!y#BRF5+O4^4g+eq$SJ zQM6aYp`$_}7%6l2`8h($v-QV=oJ*2?2zMR|Vcq#is_p`jCo(8l_i+8=K`s>SMMhf^ z!d)zAX$W@-!4|@CZyma@lH)<*_@^N}J3E4L+@;`AJC3^y5S+9q70TkcE2Kdoj&oO{ zd}6`eRlu=ej=$ny?rL%M!Q3^-U?&b1;f`9nRxsD)Lqcd$8YqQ;?>g~D!1oV=kEj#y zT@M5_`wd92?KZC2fbS+xuYiy5mB!Vs^XR0hyBT=(qP|-IPolnmB77>)RJ5UJY?nF{`cZq{FJ2g;;4)NdJLb)eG$*K|Jzk7vI zuEu?YhlSt!#qWF10|!Og zh1p@4CC7Zw8BGvI-nvwue*q4CO3n#+3{a@`I1;?7ELK+A6d$V z`6)uX7A8LpRE5dUi0`urUl{kC*i8K}nYRYRWSYuGeI98DlV8AZYzvO7H6he|Ng1_) zdzq-kFqy`Y(<@AKVe+deLnFL~1Y2+58u|uBStHa5liv{8n-N*ozl1RPEn(z4O8Rc` z+k}T<>m4!eG^SlRWaC|6qQ0oh|LU8r)J42UDQSHCzO*bDmd3{)5Wg!&g?tD^G{i?p zs_tX4ZLfIKSR>|sd`$d_us$^`jhtqE920*gXhF5a1Ab0;2&n!ehF>HM(Xqa)N#9YS zZ1$$F2oIst*T_`eHzM&d@wdw4<>SR=l#~8DriFFt?@@|s_yGwPoN*2PkrJ#wX2as2 zg!yxV3C({|rd;x`fQJ{4e-rtCWAfii$SH}6|3P?o@%T?6F58A&qVsqgz&V%Nd1>*w`gPK}VnPN?ae%%f5(676Te5IIt&djnp&_fG9QE4^363?yH8dYZ*6!hJ7|EIS1;5Xi3rdV`vvSqVvsC==as4**QBc|2?^)m6s$fJTb zL4r4taSatj_VxSsW}@j6(fAsQ`gdPI!Tzs8-MkhmCpeRN#)sR&xc3wHEseWoOq0nF z_llWN>t5;FtHk}K%T}g~-AP+3Q*4qjv~ELq7+SX#{dO_^_9gTb#U>rVG`rk15Jjl= zK}fIyjB99BvbR>vj;lKgbEgCoJ&A7$bZafD9mMVocyIu_h%RDnmkQ;w2qjxF zVTtW>VU%lf1>s?3>q;@b%9!fI_hj>o-f=f)H@LbcseL_Pn~A#?7%=ua zBvtnhT!Ztb8s@yR3vbs8^9I9ISGBv1>fET(yq&2!Hv#T@r4hNCQ3CO|Ai;aNBDcDx zm{@$Yz;>&UZ;Ozv*5d`X+X?O30^1!x)dJg{;(J%Z7Y5xeHdB9rjs2PnY&4bacn{LB zz;-WwMOh=%Szvoq zWbF}I*6D@?whm$BJ4d>}Hi7Uki2qAWA2X(ta)b%BfxFBdVe+^b6=bJtVE-0^#Wmpw zlP6GyYIzb#)jcJI{1GNp)6cG+7TPl&ZQ@6mJPS;;FgZj=m^?@NWJ30TIKt$4@~!vA zo7@h59<*l>5!ryj;2?b`4FnJXv*&|F?N9=^J zF|Bii$?Jfl=HEb4b#LMtIwUo+4mk@vFn(DSwUD{vw}k(;;Wv#!wBX|(o$J>&Zj9|& zJaqIv`-~gK10P3>9%WxcH;>{OC-^8D=l_jpOO7|$Z$vY<5AD^4;h_QNpfryfJr<`! z&T3DL_$FY#?b5A{a2_N?qfM<3PPr3LqQNOz*X@*@b^7$X)TZG`9 z>DgZKmBU6-!-ZWNKNQwShNalo>W}U`d@J*@prx_zCj?vUTYuNas3zm{OSWei{3)2! z4ud}f1TRHP2OFJI4MQ0GAF0r_FgUww;}@W`P?*2sQ20yn^r7%q$W-0eEJBE==a!K* z(Uxu<73!OYj3Ma#Mx+ROza@D4IzjJuKtS_-j|4k);F=A3fAsX}1Js&|xSxP$4^Zi3 zibt6IjMC%*>MzJ(8xI!2y!@_>G(NQ`1bDv*yKo02LGXV`mEX1TcND_7KagODYH_eO zr3Th9{U$-vEJl=RaSiUr)QIDZzYyBBIAc1XD$bZ*d}m1b!l%wCHd8;&U=uOUps94s zGa(Ie#?1JQqc*9Tjs<|4vnpe*e>S2P;|v-{PO~%3#Tj#;3{^iTlB$~v*HEt%Wp2Gr zoH4h^=84F%{XE1O^9rN9SIkFvh%@FF(*=y_|7F+41;GLpNhPP`6TX^vRx}7KB+U!P zrh(1EROtV-YvUr|fL2=+3HC&hy!MJWm(^$YjDPC4xUiNmEID(lk@%_Kl7bd=PHx+! z01prS8pLnugdaNLGBwFNDiqD0w=CgdscSi8s&09a@HPki3d-cgcT^~f^eZyWu1t1A z5vrg&lB!z?*U)jv-a2k}WpZU<_DC=xb`@pH#Wn&SdgZDj?-`S?Rzglm)Vdeb$=J1V zbn8Mbrzvn z=FY8uHNsl>9BP^lj$ydpR74o=HzRoVI>UV*AfOBMMS>UCam^0*n|pc<_q9}TTL7cp zK;IAWWT4*?8N9j9BABEPj${Q*O|1w+{8qxt-!xDO<>YlHhBplWd6L40>i_~OprNo=P6;Lc{@;7(KNBASqf z!F^}^uDV@tHCF~TcU4AJ?RFz-ad4+`@!*Jo z1Gj2)dx08tNc}Lb4+4)VvO{3xlXMrSuj{l*-GYVbh(3aOh%CO{~ts3INe6*kib(6t-4B%lf-&g!x!VjIUttL5+(L_0W+E~KF zU_K6+s@qQ_elXu(nY{Rp3Pq9r0H)c&d_0O!1qULjx`S{H9hK~@qh<&5gN0d5FroG# z%9M*e6!6ds4-@&}G5HZCvT{IL;LAsfT8^if{(5NWcq<@@gHdy#KickelAi+7CxQ1>`_SUVl!NOC* zd^*8|+RrFcF7{c#L!W(4Qs>w=bs0dEj&VL&6aqi^54WqenM|2aAQzX=w#hyS+# z!N%m$pltYmM+!{N@ZSka8~*t#9{%4IPe1&>hfLMI&m!Lh@!Kq%2hd_P0kusB#xU%E zAVLiL9}+xgonikYAfU-VMpAX3;F=xwKlSt)_O;PrJ_>;v?lWN38}2^`JQ?o)gA9(# zWD!i`@r$W7G&{8>4D(+KH-A^8!~9pIvYXMfa$lneW_^PMn~sa#+LF@E8TsM;JE43Z zp_mf!@csj#T^rti1geJjpTzg)gfH&yU&LnW5ASRq4(~LTZs1p>VR-)yzj10OuI8?w z=I_d=y4@c{Ee`KAj-38vnj7AyL3D_!pB4#rsKM13cT_0KyhWYieL9g%ACYByco^Pi z5Jq{Qn33?{DrXYYnT=`FCg^fq8s6zs#We6o7vE8#DAF&= zG&`s-h9XqK;z+7)30y;GCVT75*+G3tVJ?+mLhS}+%Ec}Xc<8CihGN}|@w zGqrcqI83wCGA?y1pd6~Nhy;7(;7WJP7Y}1Bv?N8EC6h3ScNf={jBCjtzOtaDgLn^u zZ4h6@4+2A*yE=wn%`toxaHu_oHv&?1t4e{gF}$bbPtF*=8YpcH=dXAS?(yw+TvM z)22vpfT_r>9Vy%Vjvv4K2&Hd?Vmid*_g@L^+W5UWP&IyUA-??*zPORM6q~6(ezS2n ze$!Om@%@p8@p~)$uDY#pHO~Y!w^2s5?Y1Rqar~xn6<~H0Y1avhySogYAcHTmuxPMAaF_)`m?Q&}OOgqdgb<){ z*To$^+?~Z`VP{x$ab0AP#ocY;Kj*wv-PPTQfC3H+^%NFQx1)W@;|$h?@DXBC%>};As5ZN8EUeu$KpuIKJhRj&@r;D(YA>6DZ5mL%l=Uk zj?4bhEZ(8PW&aoupf4PY1S`(tn7`~F@A-Av*S3gp@S&~7P5?=xi~flyPcQl>;RFl+ zFblr(b5F`ZXJe&geuPW@$s#O{kL;3v3c2h!*nmWhSl?in1>gM@?xWGu%98Vxg;E52dIh>PO@>*)~Ni zA=Ujpol+{xe`QJbqx^p-FC+F z_4u!gK2_moX(5{FbDpH13e`5jt8`kT0h=o9*)~RR)^StBFF+PA-H=624b~Lpq^exkDQ^fCZit70u38v0*4An#FRy|cKll&;2 zpCTS#Kheq!Kcf`l|0~j8>XCA;gmHCfFuy6H`_(vm;lnMw^N%A8)AUXqVt}KmuD9Ys z=-E?9(jQC`Fa~usrB2Fq6?*nmC=We*YOzlfvrk*WPED-p=~y0m_VhSO+zeu=-turp zm6t7|c8Z*dX~mX@GouW3Jqwb=&5C1aN~*5k(`Pf5*~KzP#6o?(r_ZUvxza+^+uS^< z?&;|&CG&u8qPu!RziXu zM{x{|PCeG>`3vwWqFmJ|Td>bUuK^wQ*Dm}>H4w2Q{!zq52Q#x)M|r@J zHSix3$l~a%NkUhRI&pVb2*B17QBkbl`|wX>>27S_+Mt2&>mb2QvZSRdX$Rc58W=nU zPjKsz{=&zA>xy?hh(p7-h8swE<#fn~EVk*8M%y4pYMR1) z$Yz`m*$Djg=R^9T1TWxAz1^(YXNEOzVEEK<6IoE26PeI-$fjVk=@9;lr$aWAKtCO_ zIZp6?KC^HIEWI7zw|&HLrn%V^L73{;LX4Q|*pkJYHJIuc00Q)ut&redeH`;s9ou+* zO?7A+#HdPbH%7NDXd2CRY=`o6u48+gU|k_*!LfK7M7o@L5+*x#6lG~Rq&EONkt^N? zk?TOhp}!!(tM%fxW~65I{jfCaE+W}ABFUQ&W;+IoqSAzHY5v_La8OBLeCxhDOM7l9q4X z=^Q21m=VW^NnA^Xf{$3@-ACIp;IAU|!oGUVwA>aUl{+C*v6KhAIqiY&sbcRM-ab zA`xF45t~Ob=wHIpo`L?QAQk9eCb^fVaseGzNX+jK`s{23eY(nOyAo*t{j2alaaZGL zbpciMtWU&p5_+2nZNb<2y>`MQaNKBwt;oh;F2gv}9L`CJ(SYOyNE#f&WMaqC0ig<;VNx$Y&qwVtKfad@M1E}|ZA^Wm zlX9JfG5Iaa!i}iUsFmn zb+3iVRyI4R?TzvIP3o!F znsbVBE~6}Lc{De2Ig;m5Y0;z1j(JfYns+|@$Kc@!cE&^Dy_U}Tb#w&D?^-7 z?%_S#*1Tt10_^qg*_K2JR&bH_s(ZGjrMz^{Hlf?KK47!kHU5il*ZNAJzg=4fC)jh8 zS-7Jqy?JY{qCshCc7GG@)Rq$;?$nlN@zxFQ)S5wnhFk#&wjaeYf2X#R=db@F5Up@4 zgQU@o+A1hdZ`4-B3D$pM7Tk()m_pClDlCl z7bvii#QgquNo;9G9(0w+&<|<2OWGL!6SoPDhI24;Q=O>l+-4*#-zCvGO4^)h;V!8^ z^3axBAi+DzI0gWvDg&1WQ)2_fwpGNIA1UE3X=_nbwy)cU=tS;Xxjnd0 zceLxbdfP=qU7=M1n~Wl#{ChCXhiiKx3w6+r1aB4N82Ts0TmQ`8Kh;FJS4s)9hwG$T?Ff{I&Nou* z9Wnc;3U+Fu)q6AT`L2}?_cT`Osz`90wfZme|dV>;9))KU-CeD@6@ z+&EDbD=6Bva$gdJh8-`d`AJP-nH_0@t$D36(QV-Dy8wg0h;|hB#Ap8$9%wdf#+AiS6clwwbWe* zx<*mo|DimM`Yysr;x1+u{4efW$=b<03ZdU6qAqpl^onpPxr)11UWQCKcR3PFCQE`f zJ1tO$4)NcWBDpFe$(s@4zpF)2ZN@b$5A*cbO6YYawBD|j*VmPX_k@v85W0bBdDqGt zkqx(QLV}ltaST92g$6`6Yaa}`MU=N1WyPkG1f#!+qUc>_&uu7&Jr%oF-i}h3bq5kG zVJ}fu+f*N$6}|j@mx%9&q_AE@k7o-Z4?~~m7Q@L>N?-KL-hshio43p_9 z8}$LCAxwS{|FQ8Xj@E=Qvr{K(1J^~;a+pl#DCr@lg)sS_$U`GMj3jZ7;28P_Raql6 z2$LTb+hY-19$!M3{J1EJ9VL7D`w5nZ%htan^hp!if~g~Xao0L@bW^KsWVDCt7!fUm z*X*7GCF+Z|AT-|jw|JhA0oT*ilEuf*$jXvqS$zB~>3gzk<#QlJLp+ZJ)6^1+#q7!5 zRb!19{P>voMNz$ERJwAS_i;@8vPw&)r3m;6%R@~3ZwY)g6^M@YT3!CG8g;Wbz0UFw zI=z9D#C40s$HZ^yq^KXeiz1)=Z!s-BR(Kn^sD^itU?v*J&>yM6`eQyUepi(5rIfJz zeVtTm{s86S&F~M!{!z^SaRoay(eO`L9^Rk*6eo%MOf25<&vjB(PgUgq0%_>$U*dn_ zz7mIL|5_(yc4{K~H!KfNHNM43;=U7$Eoc($TKT=Q%aW*+l73)nF>Bbh@<(K$`hP-# zl{s(>)lWrM{l#Y+|239h#PVyzLN)%`Mz2LEuQ!eSr6-u9bfPVf=I>3#=Nv z86I4m63pT0##H!^HO#3OPd6x**RW}HUalmX%u1S;X}oLYbjUyzO^*a`F5?)gi1Mw9 zs-ADmD4v-j9$!b%^NpEN3h}dubk=&L^>?kD&G=>)-yFtQxof4V%|G49?^-#hO5UqjN@H0l52u9fCOy|L1>_rcea zEq^jwY$UC%lX8=UOY1r;50}Xv;neE?HeM&3^0zNRVm(D zHGf_0C(4aeO7x^nbW%1usNEFh0RT1=`{prw{|a_$qSae4?QX$ULr(|OT`QYP5#N@e zgfjz>ByKAl;Y<(s5J}N2^LE0MOj}F*HYQ#{mfGi`nvVg)B-6H{C{|0ftL1hi2+g^@ zr0!r+3zJMc)|J#%qb01NotWk)nOcyAs`v{MOr_!&+Le0hwd*dT+|?)>?rJ#@Gz5^{ zL|gPPvuY5^L$mLW|Cmk{M`ukEFpG*)+@Tjj=fNT>iuJo%4k1h9T`h-#1fI7c!AcGi zmTIIKaNhhcKSNC4=Wl-ikMH-Cgm#m_c5Z*L{h{_p+8=9wobC@(L1d?^F-OQxYeCvt zyHm>UO= zAe^J;9E>D!hu|2-4E0-|N%!sY!!0z(p~iZcSPwT=ts@u+jzFHT(cC-6M~dSp;}Dow zqt<5QYtPwx#z%{ya=!Bz7TbI$AL?cuuc;5}0DZA<{eH=L&SSx=-q_psMm&9-$G-YM z4n>JOUb;J5xFpuru4A8JL-A4uYfP)z3~wFHPlveLEZ^qiMr8Iz-{@v{0yxut+OiJ# z8^6*=q0OVluQjw|$mlVStJvcukj$Cr2Kz+WRPO4*2X_)xcTa-Ne+46Y!O2K4$163R zHSY-PL--Ls_&HTnrx{h$d@cR|S6`cR-%+{Kp(5%IXGmjZcQ}*9)*WVoA$d_}QPdc= z{MqF2mF#0g$0W)_CNOz*1Ex@>AUOjchcB1~3a%;GWWWcBpWoAn`g2};qvmm*2r zWjN+%sxSA(rmi+&1kjDl;(q>cr_( z%r)e)sgO*XyB4`{;5sB&ib5i6ev~#?@9b~G_Xd&NXe63A&g!ALWYqv~)lH(Ww(4e- z!zwQE6Nz)TARA`giUc#jl3`}i3Ny=Zf_s}tZa0$9ruiBQ)Ae_VsM?l0Q4U+mo%}8o zz?!>}V7F08F>9#YtnrJr-7Av&A`&wto;tptr9GQE{yRuDb^L(jKA6hI73&`oGr6aZ z3HXBya#JemQSUKY7*bL>lIeyYN4857Df!N!mYkq8fJ(le9c< zOwTCk5vGNC<42K)dVdTFUjM~0;0INq-hp8a=8c~a+rJ{V{7?_`#!rf(x?4QO@^BG* zT0);Oq4hRnO~=;g=6(U6c1MlT8VuS~IWDrP-Df4Jq&u71eNF@xj)%=ypGO|5I87FQt*TWI2+183;i-=aIb-zQRs~9Gp|z=W4br+2Q$Ms64>PdM#!5wx8C;_|65E) z1M<7GzKxuGRL4rAhIg3Sg5veubN@j(n&Mp~iF*&n&_ijF_0TlR;}a$y3cWA-4~$;H z)PRl<=pgtRJ922V`w*pBzwwvK@cr6HVr|fGJ|?#<5K|WY2?}BLr${iZEK!{`uaBk) z((L{v#3rAM_6wtpW0OtL^8ZsD)|`FR{UyXlamiQGRvDLk&0>p77!71%zM+_-8IydA zfAwRM?@*Gs?)G-R;l(ZvhB3<^zy*k&_QVSWE1N z>oIK*fUJ*l)cpoXu#Pm2p-a*t>yq^Xkc~v&&*-&(9@chpZB64^@e0JqrZz6O(iCkD zkI9p9!>|`n{E6kp;6}svj^wYKAwbzgq8oIiP04Lr_f5R&&A<$=H%Ef?Ii#wy=Ix zI+9_`w)j^+jM)w)iQ68>(C&W5&zlj#m>ozlNny;6;IuG?|Kc!aC&~0-Obbr1f;F=+ z0AzYsjn-vBK?q}Z77@ajU08f%RT#4?O3}sxk>K$Fj`=WVkY`pHLw%KD%m!V+|MBeOV!F+)UN>da{vGn8DVFs2Q;a9|H4Sdc>^>?+-g|8|x3VNAP7h8amQ z?!XYsTNT2Xn&_*o+6(2dYKC6c#hFK$!U~y<1L(icVW|j|QIz%$cNJ5+DZ3$t_ z-Xf~D#i1Owl=}E+w;AIjnSDeuE+R2Y;z(v+mi8=?84prLGW$vH z{;6ER_5l*}J4Z6?!i;3-CxJgf8X}nk@gHw@<7jOK8xPirD%>4{|8*i6dPYfyGA%?h zhanI3emIiE9f4!$1XP83Zyd=SDYl~`w){vBk<8JesO}ZVuslRE$4cmNCUjyV8Cp}0 zWR91hlI|>$IY9*ZNajT3p;}Htf~7h{P>f_~rjKM!7TGDDY{HSush~s)Q$ifcoJIkY zBa%6tf_o6ju&d$mScqg6WG6X;d5mPv#2>r|jw8B6O(vteovm~0Zs+j7MKaWwk7Uk8 zPCk-hEm6aHOdCWp=c62Te*u!jU5I1olC;RWWW7k{|3rV0(YLJEOV9N~B-7+yIcpl% zK5Tef(-=3NkAcQ?M4=60o?>8gF@&L=e82Kn(h%5OB25kY)urU_o;;RZ23e?+%aPz+ zacSVfo1$Z%v4LZX(4bMLjoz)1n^!i=&=f zB-2Mdx8elPCzyr7BGbESv@VMwLez7ch!FMM&f@c{qMkcYiWa{UN#gFpF(38Z?U@zz zP+w)#a}NsBsOMgsB;aih3SEE*y9e37%2l7@CMS z*cIJJJ)I)yGLmALg7KHPDnvaGiN4yZf1(^#&Cn|!^*oGhnDq#f#65~*FpE~0Sw8A{ zOeBvRNodo&Eg|Z8LPXWJ{0rrs^I4Z$$c@E3#5NZVt(h~hdr6W5B=n|;$@^E_<05Yu>=Z^Rz0xs zRh_8b-D@N*Pvg)tN_w4XA^3R%d8qepBzQ=GW2kqkLcKQ*e%=z>+YwuSz=z=H9Z^(w zj{mSc1V8Ue=zAt~VuBx9Qx1OKm!OjFEcp3A1o`0SL*$`aK0=bXk3~=nerTo-em)V| zr=D!W!Ov%)L<>_w9Q=Gv0h1&6`GSIb5d5&KMZwP!>?B_@kHODZ_=9!5aYUD>$z*i5 zZ**?m?OXo0;D;LX!OwTd$p=5IC2IJdX@lVB2b81ke?*eFpKuIak``H)tQY+JEc*W% zeamva?4?G$J%dG!`L+wEYeuz>Y#ZJ*!YgRfH{!O|``vaY=;bV$gT4{D|q?Nmk^1vSLKunx!6DyqjqmPKHZRv}0f9VUo-7SMW7_ux9yu>d7W(f6~AwJ|-UL?&CiCGbc94oN2XCcRm zAXUh*lH{(O$_2izA~C;n$ib>*$U#4e(5oU1A;)U?kEO+NG#G}BtLsFS?baY^Ipm;c zl(Z((LddZe@=))8LW0KxIGW(D8dag*8;2b0i0#i2TYhwhkYim@RQHJWSRO)-^(Axz z6RQ1_{QD*0^^lIiwYDK+c1Imie>uq5P^=|wS&*@j2=YNjKjfhzHb#PX{Y6j=GH93& zGBy?2W}a*oAV$GBw>ipSA$j7kqCZ(G!wN!=c~|HClr1Q#2Z4mfW;Tnm9GiYi@-mPZ zfIs+ZfL7q*CL_^_w${0IqHXx!0tsr&2NK&NCm%?#Ca7UMrUrTDf!iKAsL>seByL9> zL)W4W*0rYVt$+5e@H{wyg*%}%aVW>?+PB&)IcP7q96^OHSY|o!|-qB-m0HLqT1c4 z6mr-oh(nH6l~#rvgIR1L$FiuT?Y3WklYWD6+;;o0WuRVB4(>O#j=^ingU60(>)YPJ z_+tq8>&G8MQIfbesW<%2jO*JQHG|H!2TLbn@*~ym_5`QJAp94{AnlU5Qg7AJFq|Z= z#w_%pIpJaOq&adG9fj5cKBk%u$z!z;itHsugd)RP+))*Zj6f+GZ6p$W$$(=%6dC22 z8H!ZepzuT&)7pBVJ0^B%ZwN>ifp9oU+-PROC0@nzp3vpYlW-v(Bl=QjO~aJ2MSq~NSq}~4?H2K2yxq#;qpHT+-%yHfa2pbAjEQ4@ zyxrlMHQp*rXf)XF1b;f%?vj$bnFWWY&$Sr*pud?PVWiz7^2#pd?j@H!2C$LFT5Mahlheh>BM3rybFw7nmMWqqBVfL70J|4*|53?s!S~<-A#p2>H+hVKrH=5v;?RXBe zC&6BSm_3COJbIA!s$uqwluybqdlsBF%=j-JX3t5cA7;AmzvZK+c>kT34sG9;Oc%Hy4xW>66yBx(H(f!P$F!ZJrPh~fAQ=uGvy^csX zHHzTnG)S{tD=_kHihvwg9xi_ni1vM_*>P@gmV}&GZH)( z5VILVy~Xi2tEgs+sPau6#^3Css5Bxs{^pR(IU||n@i&)BE63m5EG}N=Hri@HzX@LE zR^rf`2kiBS-n=Nmg9mA^8hZ0f`J@cJ1;A-TkN@JKx1ePDp|=oD@JxbP^)GYu6#aq5 zW_>h_x<$l?QP;%cm8wSFq9{c-SPTh1eZVn4>Xz`#RhK!M&}hId3I24zEhQyOGb?wQ z^M26Z%#SeE`iQ);OS!(}iZ64N=9WP&+*%e19$QF+wIglF4YTD%(rhGQn5~9t&6^X3 z*$N`8HfKeYXTxkYw-U}_$jV6Y+(OJ|2=x|+*{Y&iEuzY|Z5U>M6h);GxnZ`tWUdj( zEDy6aRa!aB)?%>@Gd{Z=J8F1GyeC0^PIB}ZZjaj(w(ac8f%Yc|s6WuwMhQN9kp8NH z_GhUt4K%kd^6Nevoe@Tw8D@oB50p0G_%9xC>r1vDa2wzR-$XDA{qv9Uwa)vDr6rcb zT=(#{k*y=zmTMa2I`+g2_~=304tQ|ukiFI!&@mE|v0XL#g}%IMZzS0a=0*~YG1-sB zeXGXg#wbOf*#rp|oX0UgCO7lU8k4-nq&JynrP~|?jRs|Zl&8;Fx4;ROqGuK!JiIp> z4C|_~CNlFw-ya~N%5LYjB9}eA@x8!pjV!pb4U)udD}HNcs7E80t1-2AVNDi)5FGBwr)Dvt2Q9 zx~nLvZ5YV%uzu}s5<19)YWW&;Cra79u9U7Ct>7b^R;IR<5jfmnoWhMENU-2Lj%YYN zZ=eFWfeyD9?86M~5c8%@lzSMZo*RWOOznFrzvx4zy&dJy&Q}Hkn;V8am{3EKxVd{t7 zqeVO>BDN-vA777UY0n;C?*mdjz8)vJ`=)Z?;CPAoogZHl6!`d>ezH^ThcrCC-XH(* z6$6gem0)9{6E%W6kfcYTnp)eR9!SLHx=vj+dPYeHF)cj4J{WmufkTia?ob>FR~-3HkA)@9wGf zCx9BQa3Ye#og~?vHSZFuL-k(UUZAmPwFMWxjhek#ku>btB#FBK$Iuz6!8+p(Q}ADHMJwdRXa9#-$YMC_Nw z?3Y!rQxgrpoaJHl-YamDxGTlt9luH^W%X1={;QFOj(!dPC+=Etc=qdbQf8+nvR}{g zu*&HTIKj*EVzF1n0`9X3Z&H3)6tz;+%}fiIi(8O~2DlXoUVg_hGyqju0~FWqz0Fu| z7t0+H3-$PyJ?>QDU1=e#yPGHJYaF#r{@@oe9nwpt!?^GltTQ&B7LMD>0H1yd{Y~}#o)5x22NYR}!$? zW11PCU&Hqa$@-VcGFW(0C*}GIz56MYhu;0P*q@2npRHi0CRX=zEDyc=d7NPKSS+1d zNu?A-unAujLD?j#r_7g_+Hxr+e)lp8QRA;5!Q3&9p+Tvk$hT`u_fg z3cJ%nnE578s{6Zwwy`6JXw9>?Ks(W$KKT1Km_w(32mi4QI#r|7Q!H!jU7eR}j8?P8 z-ec;4A(-?&@=#G9Ai=JjIEIR%ipD+vBk_D3@%WmGdj2OUh4@cJ`dK|vK7`!R-@G;L z;mv9qJGyNsKl*ZQqdM@ZX=vbP_qhrDLIS@ufh`j!17pMttv5z`ws!AVQvbE7*Ogk= z&xdM0niw*Lwa7Q3D7MH8{ihAs|=;D6$#6h~)G61r+M05`q95*I)yO4p~VE0&cAzo$ka{O-B2 z(|`fBGA)wCO()T*ej0^}vAP*N1yAgy_QFxi!%i;=GnfSSf&B8YGpZnJdN&huv}36) z*5;Ro-47EMV;rU~@SUTZ88q$pXqnhq__seNZTc@1y34E*%4K3_!#^x(qw`MftZnPJ z#?sQ|V&|Z!t{N@&Z(M4**g3@=ndp~`P1VgM0xlOjH~wLtP@UUz^*ZX@yeNkr+7`dr zIUm_lh|Dh=%bB9s<_I2J&;VFr(9KVAni`wn^0B$^V;3MF-|Sovf3RpgtpHleNOY@( zbuRDSBK&V}c2Zlsd~6fW^Y3-CF4*-JWojSD#~!%FkdGd=I1(&hgJT$Xw8Q$=bav;3 ztBMWTuuANb#=4YPmp0biGO~S;=W94O$JkdK%NU0M$r`)3jO?R_5xPU6Z zb?C~?v2)pSvh$(5vLAEGae2s6?+r_`BD$Z)?k<~Al(-dSOJ~cvkhFDJR+h?|!f;5h z2l$3{%=kJ>%r@=OI%3%H@y%{U$Vz*75AG6UpDGrdjY-@}l%L%tt}N5bBPY1(Rv~@& zWN~d(h(dQ-4GCUwm*UQv_m>qZzzS==tuCrHj4J8}@hh-vsPy-VFsHqD_50#{XGLOEb)MCzrD?Z`K8u%_{R>JgdB( zLE84VZ;lndEhrUV6DEPMMA!z0Qi7J_dC*{~8|YY$zF+ zKHiAMC#TcLvqPq>co^4=>jx?{-Ns1p<~)x1Y2;145KSZV)lSy6+YGsyJFd6p?B*y; zCyx8$Byn3X3x4H3&Y{bh`C1{=_ossCxt8#^K&Dp$V1AO~$FTQHac0f5S_RXb3N5dos0#HzwDP95^!!30@e-Fp38M03kHlrf`#qHZ?#E9^$c*L z9Bq`EEDz(E7K~ATwFP5Q4hwj@7TDZA$b$*vkl<}^2{03=DmEdS#2zo={UTy(+ISLs zf0p)a68iv_G=34U^f2 z;6LV^akNeYTMyHTs^1+>((+_BJ*1=~m=-3pk3=3?;wU7EI~vE(8>z}#qQPYLF=9J5 zVp|*kGk6S>*~f{Z*hjL-?BiJ;Vwe+ff|t9+VlQ`Bev3u@&~_@ZE{h>f5^G6YHq-o9 z5!k2*>jGT$ z_mS6lPXyKuJ$4GwR-Ri&Z=CEpZmxC59V11-zTeMN*=Ns{0>_Oz(yfb5p zE2t#vdRNN623_we(s%dB{;NTXin;~~ro1J%v*w**ZJ@4DJu_R7aGj{GH!6jK-tU&* z#P8+}x9GS2w(bV#gZH!hSmQ>iuZ(|hVzI@)ePNYEgtwV;mCu@uKLFd2Verl1t{(>9 zf|A7DD&=+=@wnj43!(7eq`zmOaQ?HD+rVkzF#pBj@a>Z6!{Iw{f{j&~~5PAKxd2UO@4_aea}HaO-Z-}}7~MZSEgJ+r`Go7fBl*I_YYB)I(-`ac9P3B^s{c$g$(%c5E8tGE^cc# zYPN2@fpzPLMe>M|gg2P@u~*)b5QaZ0!fHz%Lpdx-KlXYY=P=|6B#HZ%n9UICl_5l+ zQ)I$Fbo|w1i;1>y4taR1sAX2 z7-?-&o*}5lM=}TZkoxO}Caj!^8 zXU$tecT{cunYRb0e~b22qx~JgY2)>G*kXJ48uUfr^t#kng3}u;&cI0`dIV1U5}dlh zT_2p@L`mY_lJXoldGi7|y)FHd0#5IM)4+-UVsQG8WO{IV7bjSjpII?D$x(D7+L;aQ za9jSq$N^3tuz24IfzyYeLf`lZ30BR)F%M3kcp-Ukk_C;x=~J+!;Pjbff6goqPQe2@ zn0XMu=?hVohCvEWUy{qfNrK#0$bb)DBf%T$;CvRQ=r`e=`Qow0;a2h!AUkpxjNTvs;IdOu;b(j@{lN?3U(avmW2XLBO zNEGByscOm@10a9T*R7iN|Rr{Dn{%sdF- zw1_B6!ypBxCUW`6N!?~qWWa~Tkl>Yeaa+4la}J!A5Xq8862OUH66P%l;Ixzot1Vd? zV8@zyf!6M3T6j zB;VYj^+lNCQj>UjKBCI^i~v(Ri=xub=+%ZWJF|-Ngk)nmSrWdr<--gxm$5 z*X||D%%oLjrhj^Pphylfk{au}WK#gOgGE$r(;;NG6^5doa*>W@bn zo;00+|9A+4Bl<9c3fOv*PE_yiuOvMJoh1L+1U;mrlbIHtG@XJx)c>hS5_cMoCK!)M z@E`S$yP*b8nobwn84+6^5CS%zDT?aOaTd!%40*PMo?}8AtorB91qmvOMqu<79ygsQ z{*uZpI6Pkj`NvHcAP=>1AriceFM{IZCR*noH(eyMi#=Jr$4!@@3>K0ne%y2^Stjjq z(`6K;%TdFZ!)&bnTno>Yn%VxBlb6qxuD~C>?oTW5TuDZvCtam;>q%Ghzdcu?#{6@o zYmk$FuEd(4hHIJTo-1949MtIbND_Agj-h|i2J2tbp~GsVN6(dR6#Y#`uT_ILZ5=su zIQHER4`%sfX+KWABA@fH!<>Jgr49RV-wejIXSDnUSFg$ckSSb&ZlSL1S<|huxk11C z8|k|z-lyBZhnl<{N#gF1md=`Yl+|TmIkR0~?iAHsMy0zC8zn7+f6KaP?ie{plRoZl zXpSaQ?vWvtQPjOGwkT>9*cYT!-s*%9D_xK^<>@8KeA#4b81r?0yuLrKy=|nP2;r02VME%mS?(AtPRkh% z;gkkOvwH=Ms1RC)3h~`9%xL^uQcHGZ7p+&xX5cYVT3-VnYVCC-iF-p@un94Rb=Bxl zs5nBfhmda3zG<{Egbe+yAp{?|kLhr2?k(t!K;&(iQVAmOu-HIkHS2s{&cwjTEQFE& zKvI1ec^4&kS|dYpFyc)OF!H`^nG_iL0GtLR{1?N>hmz@G*!W>`0Y<#< zXkOZ!4ZQ#)pNJJe@+pgFnGleC1}gNQ&yghV3mo%6@}(CdAgQ*d5tMud5dliRmYQ#H zq<4H?j^UqqMCUV)0+@U&^3vEz!Q?w~*_WD`H1|Dn;n)vIu;`FPSi{nWFe(C^{3NQM zBdUDm1~~bzD5_2Q1?2%wewEB#OPa51z}E>3Y(02x#hc)GqQePPUoUvJ(;Gt2;ItCe zYqT-U?2fAV z&7!vEel1&XwrxK*9rQ*JGri2HgqRsvY!I^&tTP!C123l#US@=p`tULnN)k7-jL5-@ zH#5M?EV5%#;AK{D8ocmd3@@`uriYi=agw+>n1unzx4mO{F~8B%XfJwN;nkTr#Rh1Z zi^Zo*2wLU_75dCPND?)VHJ&tjrJgbf$Iz=~$3iaEmjwsVnq2b0uKP zLLw~K($_jxc=y9(c;$=ed9 zqm~e5wJl4c9JWjauO!GVg$$UoG?K*i!4XbtfKjtdiC&}WE2?E8s(j-HXj@hk)mAKr z@&IkiOJ=jl)JksbMNMt{jvD6d?LfcxU9(#OMDUzepcQ;~574!uB$RY!(6tiTx*Ka) z88oPkRgho@Xi4m>d9^gO4m7PM+CLg?1Wob$@aih9M2t09Y>2TU8fNUMp{--u`t+S3 zW`xCzE+Am62_f|XV=a^WK4 zs)vj9aFV$7nT2u1H>zW}@J{>fefqi$K!>)b?P%-5)bWNA0`S;~#TQHnJo~fodrV)Z{j`9>i`r`zjpfJlLh)IDztc1*;fFN6nwA6P~1Q|ds zLlAGzR>*-%TO+|IC}Ov!rEWuzfp&MZtw^?uNb)v>&nmVTMYRn(pgeq4v7=<}WHR-E zf^Rp@HS)95dLO*f5KjO6g{jS`c`mmzvf#}wNU(Sjjsb+I2;Si0yH}Y12@B&46!C5m zvH2Cx^bTTa&t`ge2dQRyTP1gJDi%tiGX0!%S}*{^R)zj#go? zbx)nB8C^R`%QL<7kdlTmEzI=RkcXDo3kjaG;22ths;ng%%=C^B+sKG5KYqjYp+gka zeQgxW!v$h*33Vp4Wo6*T4gyHKVYcs5Fy%M6m0!o>Wpci5Ib^JJ*Z`!-cd%wR8tkY< z8i)mRc88GPE^72cbPRQ6Q+{LRK*{Iq`m_(}yC>Dbao|S7?TZ8}IZ0P%&3nxnG)&k4 zUk_tycRx|>Z&bQwS;cVd^aBZp@c}9=*_&cgg7UDW&ViD5P%01X2iIlqs!=sN-ytjy z-}oPj6MPOM7Qz_#57$XieOHaD$bSUW(vmtyA{VuA6cT(AgJbBv)L`8=|8@T{qC7UG zgy!RPQmy%Tl!v}~g4j=t*-xrqrzRTySC)rWKTgI8mM;>EJwu3q^i*Y+4WUv>I*n-_ zNKZ!={67Op;?Be|_)kUV|9XGmKk%WQdo}fOXBo@cVmT*bp&I`T<6IS$RrqxRZ5IB)pCf(RJ=z7WJ=&5!@X|HNH{ zBRs89EIZG|Ixp88{b0>q!n9ip1T--6Qc$5XFGG^J%W({qNu^eq+p04CVquVoi&U?^ z;JHFPS4KR(HltNQu0knDuNLVw^+@^JX0Q*-eqi|zuKr>0lD$?4Yfa*Hl6bvI z)VrS(Bjg6~`O3!I5FWtHTfg`N^0<@-@}k!zaF>9e)_}NC`foD*M3?*;5I3tJY8-b9 zbMzoO_wBqkd>rj=MQQt8TK(Z~{M(OFZvQ32>JPU`99Mt19slsqL+3VYZp$&4oOIoX zJ1L~AMl0iWAMO%gWR_p|Ayss@2)ORUJ@}Wndv$KFJ>(R*`%nT6v?qR`cRv}@A=84c z!?gmkugA>JXjp``9{x^2x_fB&IBx*90}YSzv>oUJD0MA zc3u2$kMgKZx4rm84EDK)aGrmVNB=pD{>jwBQr}h&BL{u@5hQq&fMXakw7@!1`XCRS z{IoT!^6;3kJ}%ZLj5SB_FXZ`JRbLBJ&`*lvDdW(^%$l~i%EQy5sJsb#hQ)Rh#)YKp zgKBdtTi<~%OVsJ3y#IO@{OXxuxdTj+&*L93peS+AOMhoeGi2nye;dumlv{IqQ#=P4 z86H%QX&W(WIBo>-r1Ax@rd_sWeF$hAy_ne*AHrE-6q&pz!^%BBIO1NS`tC_F{AF;W zKfHnjD^5vIXU%)_98Lp<2sd68)oVso#*Noi5Si)TV2+mk%C*S|yY7s3-6(IrTgdSy z|8A`ISw0}gTM|g*cpLw)?SRg0qTB{_kd$J_e<-G_MoVMtcvqZ}X&yULRqu&_*zrF8 zCGG>A+v@HGRqjKSK?iM$(c>esRG*;K#=l)g%09;mR{{*LR-Yo>Nb65Mg$AP-&WTO^75 z4#xl~w4pJid~d8ji1kNf%|Xgf$n#a5gOs1e@n7Q*q*#j=A>|iQR6@$HEH+4)C#~1u zSOzMDo4OsCu+nR(N?7TQB7Eb4BdVljQ%Kp;M_gDS3={si0n!8-Xa9$^4cn(}Xwx39 zV}v3HfdKxwj853djk?Zc56{?un+7?d5TkBG1&M z@1DHAO#_+eP}3s8T350F-KrIo#4CKg*SK!51P zkJdvw6<3f6_0+e0INN?^aMqvFn*}BK_(O_q-p4vXd>dxj(1;gxf@Y%s- zlX?6XPv*@bd44i)PMqMQ4`!k7@y*Z3uRdHWh9+h+UEzu1+~UB@-8?KFp3dCO3<-ui zp$^=j^&()hIgt4r=0sa(|Uni4a)r~i0GC@d)wx_($rgf+|?U;4_+<620=)Zd@*A3HGPXxBs7 zxsFa$=kCuWEl>T?J4#xYX<_PbJ>;S8*GGacE^su#T{Wsg-2=B9O#N*rwv8gTJOG5L zzkZ^q?id@hJOs|0Na&^}w82ZBs3YpfU@g4gxtUl?+OkQv%|(!Zzq3E`P!U@o!43o> zD8AoG!~ERH0FiCw$?Cn|xi!jQA$j6}ZX2>>0bL5g*$rXk*3R2f)Pw^%8=^nA)B)G+ zAc0|>mJ->X;uzNLfIrxK8Ar5zO?IPS?WA+-S1tT+VI7Ugzw-GPu4;Pj+v$~hML{( zAWAz%%QhHplO={}j`6CMIBU@5FIk0XJJtOWzA9Gv`~ou;!tRB$@HO+!wL3U zW)>m{0zl*tYYd%`#sZxR??8+Z4}zhwEIy}EFtiUS&?&|t!Kzz0=7XW}UVwt3Iwsho zOI}aPuV?Ou-1O1q{y4$hKeONrr>M*UI+-~TuJVcKO8q^Jg$^W_Ehx^Oa}ZA9#KA}s zcZhhc<*3!VwSVp5P>~#FBzDWTP7^n=L0#re31QjcqOCUN2$aJV%{ZATcOuEd=tVf3?IIT~U>UPO|(mv9WNKvmWX4es||7TYTkTOQQH_3+=KsP1d8 zvOHW6Uz5<+O{g|7U???ut){R-V`1(h3bb}dz0oEBQ{f))4T&pRkX<3WMUcM-d=q)7 zoVSo9?rjki?*VD7zXyCrWdHGGi(`=Vz+m?-=wUVG#P@~oQB381As?()*Fv4i|Mw}r z2ltACt)FY#ft)vn3$WXKKwjP$euzKV4jD&ul9~)h2mDy))&W1^f4ecH#{7-pr^w0Q z7_!Ew;WMW8B)-}!_c^H08ebqu+?P0pu1dSCtJb?&{7Up+8@;+y`rM5l+>G$yMmj0p zI=t15uyrV#-8W!M`&17WPxsPBPhbkXIl%h2l%L%?ekUs%^wRH1-#xKj`~WW0+>b~S z_mgyV*1T)19>Z9FGx@Wq{%ceMWE)W}+o97JdI#>;r=&qI5Iq6~s4^TQX?u4d(hm;}j^te#;c@FGC(jymjG5a!RT1S>Twzk(>&g z7CiD_96U}fnLc=&1}9kgidhJ`IH#VgEp$ej3V6G%%p3?o(d?ou_5Cz- zoP%8U(z^AVIgtT3=0cLVxy5Y(1T|Zi_BWFAh-6+P5h&rc_l;YJkLI0Z-kK1|&L`q( zYvxC}zm^7BZUN-Mpaqd&PYnq$gQ#ByMYoa*i)xXGD&MZ*(%B@6YC{%9dAM>eCYg(y zOzjc7nXN*JHzV=MA>N5}O_&`U*)b-1{D<#?hK&Re+DPJ?lx=Pah(OiQMl_Tk0^w$J zNy#r+lwC@fB3t+WqJL>fKuz{RlDNLo*IDyM(MeTieu>IuM7ylf#;`Tv^>at~R|R?q z+ReB=v<)59I<9rRTMqgn>{?#xE3vDY#dfE=JjO#NrzZe*9RX|wNT?5BE21QEE6D)s zbsoUHi2=Y?mJO2vV5@-B0F3`)09#cuJ%Fu-6Rdp2to+??RBz~8v^N8R@MLgxu>r-_ zVDWX0P;5<5ppUGD1m88_m`Aa-y#S$DbPpa`(Fn@c0ecE%f0mAQnFW{lkzv+!aD^Uc zt^_<=PvoUxlH%F=P}@ROTSip*W)7e>Kor%6Y=!awYFkU@HYT%$pT_hI z)KsZW8l~HU8SO;t&`y3p1UTDHl1sK^aJD_!x+hKZ4&X)Y?T7@AP^77|=FOpFb%2b^ zV_^|1qy0UAti5AIo7)-sA|TsE>MMb4R~8q6jB|xEUxk26;Skc||1X@I0a)aX(IOdRBt;<0n-qX-tca^k+6U!DARC7~7_=`Ed>bJF zW)Srkfowlf?H^I)n>hg40ivijBtdxqvI8aaAd@-KaH2{*7|iH$v<~g$2Sfm}LnOIm zO9o_zl5OIFOqve^FKX{_B#AphnmTLV96DA9$c_~4QAQgB+0MZ5$$KL?7<&W`AGT-v zm_Z#Q-OR21JPK1Yy@1pLBdPsWVm)C*}5lL`AuL)9o~#2akofWXU$tg_v%2~ zt)l&#(ZwyD@W#d|O6v*4T~3I* z6LRW9++8Ta-sUnR2XWre0CD%ol1YKMd%og|ZVjW~|1-N@uOr;T&!rf!!>aHu(J&rQ?`2-Ry*(E{N%Csj3c~6SuDI+OD zUf!?(c~6VD+OTI(UWB}7kq3jGLxRs~B)|-!{vzbPAgUK5s(ix-$a_f?)rP!`@&I|S zNanvyroPmzguHQWOFJxGKGJsSwo%-qQT!^{(O$F=o3u+;XU!W#=js67TcUm2Xk);e{0{{Nx3!HL?cRZ^2<84G&6OzkE{hH2 z_)tJ1dID{0658GabA4!gA0_xqN4j&+=B*3R_My~I3bcI$PJ=f7i=pjf$@I|n2~HCC zDYG#4<2iY`ijG86vw@#ry&pv1InvL-63s9g_e2FA+U*VX?v#-4X;aSOmMj-YL zI8zY&R^q>7798P2f#3jL%p3^F^}Q%dBOyhuAIN171+3rvhzz*#6B6vXB5rFrYRMm@)+tJXyjKE^Fvea}lVf6xCD_ zRlY?7P)#k0YAdEec>tXK8z^54`vSdVtPcxFOdm>fN1SZti%t#V9i&S*hyd89<4lKLyd`8B|6-eic>RTBhT54e+7c(J-`<9~S}6)|Aka85x|dMK;^ZYGRcB32dmdwUOYv z94YCnc}wU{9YFiDXxBB`7|?c{?10ufWYDONac$162W=6StuN)3ShfL+4a>MPMUc`H z7+Z)iwjucI!`MbBNnAgv&%u~CFu>TxvS3nRY!h%AjPYL#W1C8*hq29YlDN&8h0)GC ztpH=eTXZE_n+^DYVEx4e1lxke3pGNpEkS|aF#t*8w!$%wU|V|uLa=%^Gy<<}z?_2D zw$iX2v*6COQKP{P`kJ{BaBF)JmqtX2TRV`;5F%8G+Yx#2XD1|B{!0R^6{$Z5S$`49 z&PI}hnUX;PvUU-1wL!b0ya-tXkq3izLxSf?5?}^Ve-W~F7gcLSm2cnxS%XDUZO9Om z2gn*KnQbPsh0B0eq6e3&vahig6ihKqKD(f+pZHKcvmh&E35kA$`ezB;75623;UID@Ys zr6=$;lJK=R`0K-$LkYeBlKLEcc>@D{jgbYD0$*dnY4F8=F?{VKnI68z;RK%tF{=Py z!CQ1FTAPjg0AJ(91o+yI#UmTR*Z!bD?>GPnc80+*4_^m*0VVhfHZ+2-gTS1^*TK?o z2(vtV1rczAzGiL&_&QX?rE!tM*J0!`_zJSz;mCtOM<7YukrH67Nc}nZI!Yu*8%Ytq z@&*O?I!46R1|5s?B77Z(JQ#F55#w4yHsoZK2lzTg zGEX&`Eqr0AA$+MOIiKG)vUM;Pxp$|56HP?Z&_sR|1n4?lVoQc(&~*mcx+g*HnP5b{ zorNTEXG=|I&D%nk>cG}HqCMAWW7rxDrzh`iq~0zb)V2?n~5I1YzgP zkV*)=kqr=hi3=;yhT_FL0wkuiO)Ck(H0tI@|)kqR| z4UTzeyVeU3v`xsKMlg3B1f?){y|mrHEV#)BqxBjV?y){H_X6bID8|xwN+Itia@hxf z_2jynQ4XJPL6W#zCCpl#cIDvjZz8$PNQ&^6H!i^6?INx=?hcd};qOl5!Jxa4;OUYC zm_gKEgui=4b#FwK?*sw88{;a+l(70}DZ^c8+ zFt#6r0JIt{M63D16HxFUl3ubWL%~k6bx*qXF7TrkA3~D2e@a_t&6`9A>ww|IqJ6|@ zV=&wmRq$JY;pmRBcuRTYp6*fTj9~CFnNSIXkF(fdkfF8p>L9Bp0O$ySPe4k20Q?t9 z@EMql$N``?GXUUIvSU&J@M&-w0PlDOxX1!Uls8F>H<_sGG z^gSyo4liFXNbpzE`{eL0`2cjX>|;5Rro3tJ3otv)~$6sK_@X zT%z}xO9Ad)7fWg2q;U5Jxw`8}bloU{hi@WD+*=Z3txH>SK=-yt-Z7FQ(B;hvK=&UJ zSDW=N%8Nkv9`az&`$+JtNdn9u>MsJ_hobr@qRKaU0J@JwQEkX4C=WpQsbqd;G8+e6 zDbOLz3*F9r4o)-_O+!QZ(Gd{t3yCcmk|EreWSc;oS6A& zK-;&X{my7(Xq)i1ZzCr18-c;taIDRZA2hsUockUMBV7AI`YUnmM;05dagoSKP)|T@ zTY}n85K$l0env^+{woV|pyq81p!SQ5m=sX^6`TfY{1<~-FFb+jQ}dwK8z)${j#(J_ zb3~vPIgDOKgR|iu5bY1*1ENidKkeH#LbRzsfo?K2lEh7eV;<3_^#X)w6=pPov+2N} z!rAmvG6S>V6qh5*J42^4X9AYZDEiV6NwI7ua@i_bkvKOqvfwMA=0tfB$mT*G44NAWo<>Q48ASa>Ae&cI^F>tomJUERzbL8= zSpek$$QG2$g-m7(-{!20*!U@w-%}nV6z`*Hw7P}Ci%v)5&`y3#1SnfXf=i}kP}W4Y z?nzR-C|FT-a$(d+gzs zg3<`kmX-~bfYyh_254NjzaXq9pmr=ltuMsX2eoBTf<^0OMGn-wodMLAlOdA=YRiMu zK#l)mP-~V<4{9smBylS;3*(<_yM;)t;57Oejn1$j0NYC91+cBm;$s^D+bW<3Q7jd;+8=$-havLHK25p1{&#ENA z45I!b$ZagDO(Lp%s|S$VR20>QY=-gxa+^zLf0H@kcV1PY*k2MuH=di@0{rNNG!X6O z$4LOXEhW5UP6l)X$ku}wZYz{;1$NZo)=02zjg)oPyhU`c4%lrg+U<-s2D{1sb>|+# zT-zYshPdsaFT%MUq`ng8c4V>P94AXNIX!{6nFw(^K|+0qYe5M<3X=gji1Q`}h}&5< zObW#90#1WC{)-`QSIP7cHxMU@+l^U3f%v=1%wKdY+M5AEK(|3+1G??b;+YzuTPrBg zM+PIo);l=n(QT*~Aatv5MI&Hq1A7W=dq~Hg%z{h&x-;hrJqvyPCT+;U*$9!0G?F5m?IA|{+d|op_O>B= z4dRMYp28+4v7oc7oUdWhb(Dokmc05-89|{)!}V zC*zohvQxZ(5|m|DG=j2I!Jb0dY0_~zvpke#Lf{HL&Rhvlc817HBP4~gGs$I8mPvDG zAs1eqjU;jBNQAW}ZOB2{xgt5wNQzLFHz`2b`68}1=>n7&q3lBB!Jz*`g6CEeUc*ntz)nN$KGQF zaJUy8Ic8YL$YysXgrVJNE!xcwkbrDgNmI$T4B4(GTleI#Ef(bXg5HftcyAe7gu)9enRD#{jEH<#?gM_@So&erH z1iV`yr9R-@iju_rO-AGZ&zl(l?>5;nDS&r7I1TXlF9y6jB+~=loj6I{UCaVH#MAeA zpV8xJbA}WF^zIfbK<^$F@6!nM?ga(<%Y8@^cR!AK(EGa=AkeF}q!I8v01+whJt#f@ zU>01{QrEdI0hj1~=28H^PO+2*Q3`%t z0Kn%Y^Ldjw!D+Cjv_5%bs?|E&3*bdl(Ks}fA0GklUXR8*+dHyiQlRZW;52CCzZlxyl}rz9 z@8KkI?=uVIKmM#d_85&xi!&4m!1jR{0c;<#_~J&u_7N!1Q$9wLxKD7*1KX!wfPk&a zjz+Nd83d%T_PMlt!7RAN&)W;`(C^Hh0BT=~p)^ubQ2UBp_IZ0O&wY)2`1TEw#C9BMBD z+ApH|HKNKlbpW(pSb)B~G4Ts&-SkFz0JJIaAD?cCqqAi>c*&)?eU&wFG&U8#pyG?X z{#l`$5{&3_vj9~qiWP44cA*E$XOP;1j7!Olj~(pmGS(4jg|Hoa(P zFxnW(wuQ@+_fdk@GM^EeA_$vFiYp;(W)>TS;lsIJl+Y9Cnw`)!3wY~8*Q_W>+-y>v zgD!7efUeo4eNv!n4saTD@m~yGb4sR%uDNi6^$VHh$9Q;XKu^(sXlXXa17yu320+%l zES|j)WX%T(^oaS9ByIs5^N_Wm7a+(Y#>Dy?LDfQFOrdIFNneCnaAQi}P%xkVW#$Kn zY7$|o`=`TjQF7Tnsp>L|;T%3Jjs)8$iP>6>dUMdUq)3)Bk{C})wghNeTC~-+^g($6 zn))IO<}8B*PoBhY=1_YPnwAsQ@)1?ONdq)Bi=x_&6;K|aX+_Cg$z-;yf$AnSwT~Uq zI&yig?1iIAA0)DvF&SvEjHZ9tqdWk8(N8W^4&kc)GE?Y zvMGb9Rms- zJ+~H=M(Fh?*-(jIYqQwUi%&lb!g>N^(-O$mftdP0_GgqNZe3ZC12S)C0J8OD$fN+- z`rtGm=i@sep6?#8VnUDbj64E_?b} z5b3r?5uDrxN#eGZ9BW}(lLNi&M6$h+B1v4E#CO)b4RoOnlVQxl!{R}WkZLR_ z&?ELilDKg==8ts1CG!N6*@FAKUh5AXip_RMH?g`fosStU ze;3HftzjcEqd$~8?{+wMBDm16XcijA_xAuuCrM<hkM^8j_Z7a)MDXG0^9x&q88 zNL?unS1}9jOdB;C+@P11&R<|Gv=G=+|Pl3d5=1_YPtZoz4?GaVJc>`G8A&P1{ z?nHS2tGgugZj&jn;;mw+t~xVV8F;ySz=g`7S!f*J{{vXvE0HB5GO)UjYz9_6S9w2} zP+xyXlDG$?qO<1hpeuF2>Os-|!)Rl$n*48v>9%cxZ>Mk znVg;g)0*)S=9^%yt}u=pEH@I&Rhww^^(X-BO`^am&s+XRAd$7UO_Ir`Ztoqy($sbnzSJY zT(61bbt5SNSKgukTyKcB+M;fh7l7+cWWk)bkl-1Q_{|(@F9O#)qWVunm2cz#TfJD+h$^g!BM|R{A#7+2U>|}T%|!FiOny8B0Q*RyOU7gX_A%M) z-LQ#Q{Rx;+f1e^r+-FkNS@ZVLwFtD32+rTnxxcj9_E79gF z78}|yI_Ci5^25$cYUP!1|@hjB<0o_GSdRed?(#KLm5smXxnD@ zJ-7^E_%BA7A0*Es%#S$19#+i4aGbyFTYisC+KYBC?6LW?*nu?vW$~GfkmeUqpb>vX zlDJ+7H1kN)8#xppq~WYkp{CswAQ0B<(5t*((jQQm?zK53P7*g2v*6j(p<_=qy54kT(zXd?2@8UVis+)E7+A~! z6NsP!f&zmpx~{Xk!_E}5J8R7>3u>ED&|l0s=bX-*)9Rh4-kEb)v!{1wKI7^CzF$>M zch5`@3;*7K`#js#UG;rmyPA5r;=cLfCM%R*)vXIgnRDvi$O(UOlkLSCCNW*=7dIzE z3VksJiKq9$)(uqRG6S{3(FNBpLkt^E75QmKzGf#3rsywj+IKbLt8`kPQ9?7tTe1j# zuuj#tA&B@8 zXqu%c_kv5&xY)Ey(Rv)<*(7FR!Nypx0;i&C?_3<<;Us3kEe3M11K|e!_1$pm zt7Z`_nkV^HXbZK>tppiL863lxRwSN2RFq9GvR*UT?N>Xsh-8h30Ku)uEsB7+<#0{} zqk*)c+ybE;JrBnK(vAdg%M)b-g!Kv#QrgLe(iVu+VF9Udr@E8w;UWS&9zg4-L3M9)M9~{Wwo!ztX3_+C}d)4|V zSVSukGP=vo3ip%uXsNCUpnpz2hH9PN2MH+<{EmB_*LZ9t!rCMiq;<*hL(bBgg@$?_0 z{tjh9vJpzq-5nx(r;!cP-G6RXms^0RFYZE(0k*qa07SCgJuLQDb+oW7WOpUW?q1j^ zO?LO81kWZ3gb>+TkdEvg5ERQpb`L_+kRA7eWcQHRv}E@%4)DYhvm#b?^c*9Oh<%E1 zT=%Fbg6ke*@s;Jc?r}(9q&$Jd(;e7`x$a48AaYel9ObC)DHzC8-5;fvKQYU$>Z}{| z*LTA)-P0miG;#7w_h)L^@LUe1XK)N(o<-v6=S11`BI^wi-CsoHuSTTc)Nd^3D0=Ef~bmBVzQKof?kp-j>>m@cCr-4%Irl z56!!*7u|&MO0@ z9PNDv8+qFMUMl(*v)~*l!uBMbq2s0A)oac)K39a9gGsYc3?d zl|^cmfK<4D9r5)LiD(o(QSOLuRk7L2*p&DBjkA$)_~=x^{*2WXD2LMofF7_T-tky( zQ7)>^=dnIi>x?ws7sY6Uen>oBDaJaKt b&{BVq9bjbte`u*88EIa;`ld%& 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 JY}@Lq{}-wH{DJ@g diff --git a/docs/_build/doctrees/pyad2.event.doctree b/docs/_build/doctrees/pyad2.event.doctree deleted file mode 100644 index 9d0e2626a010915d604423974ddf12806903db64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15777 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 C+8KKQ diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo index db9ab62..a32ac9b 100644 --- a/docs/_build/html/.buildinfo +++ b/docs/_build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: bfabfef1f3b1f181eaa7d666d13e81ec +config: 7e4354096f7282bd97dc9d3ef3f60c52 tags: a205e9ed8462ae86fdd2f73488852ba9 diff --git a/docs/_build/html/_modules/pyad2/devices.html b/docs/_build/html/_modules/alarmdecoder/devices.html similarity index 73% rename from docs/_build/html/_modules/pyad2/devices.html rename to docs/_build/html/_modules/alarmdecoder/devices.html index f41fbf7..36eccc1 100644 --- a/docs/_build/html/_modules/pyad2/devices.html +++ b/docs/_build/html/_modules/alarmdecoder/devices.html @@ -6,7 +6,7 @@ - pyad2.devices — pyad2 documentation + alarmdecoder.devices — alarmdecoder documentation @@ -23,7 +23,7 @@ - + @@ -36,7 +36,7 @@

  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • Module code »
  • @@ -46,9 +46,9 @@
    -

    Source code for pyad2.devices

    +  

    Source code for alarmdecoder.devices

     """
    -Contains different types of devices belonging to the AD2 family.
    +Contains different types of devices belonging to the Alarm Decoder (AD2) family.
     
     .. moduleauthor:: Scott Petersen <scott@nutech.com>
     """
    @@ -65,9 +65,9 @@
     from .util import CommError, TimeoutError, NoDeviceError
     from .event import event
     
    -
    [docs]class Device(object): +
    [docs]class Device(object): """ - Generic parent device to all AD2 products. + Generic parent device to all Alarm Decoder (AD2) products. """ # Generic device events @@ -86,6 +86,20 @@ self._running = False self._read_thread = Device.ReadThread(self) + def __enter__(self): + """ + Support for context manager __enter__. + """ + return self + + def __exit__(self, type, value, traceback): + """ + Support for context manager __exit__. + """ + self.close() + + return False + @property def id(self): """ @@ -96,7 +110,7 @@ return self._id @id.setter -
    [docs] def id(self, value): +
    [docs] def id(self, value): """ Sets the device ID. @@ -105,7 +119,7 @@ """ self._id = value
    -
    [docs] def is_reader_alive(self): +
    [docs] def is_reader_alive(self): """ Indicates whether or not the reader thread is alive. @@ -113,13 +127,13 @@ """ return self._read_thread.is_alive()
    -
    [docs] def stop_reader(self): +
    [docs] def stop_reader(self): """ Stops the reader thread. """ self._read_thread.stop()
    -
    [docs] def close(self): +
    [docs] def close(self): """ Closes the device. """ @@ -133,7 +147,7 @@ self.on_close()
    -
    [docs] class ReadThread(threading.Thread): +
    [docs] class ReadThread(threading.Thread): """ Reader thread which processes messages from the device. """ @@ -152,13 +166,13 @@ self._device = device self._running = False -
    [docs] def stop(self): +
    [docs] def stop(self): """ Stops the running thread. """ self._running = False
    -
    [docs] def run(self): +
    [docs] def run(self): """ The actual read process. """ @@ -178,7 +192,7 @@ time.sleep(0.01)
    -
    [docs]class USBDevice(Device): +
    [docs]class USBDevice(Device): """ AD2USB device exposed with PyFTDI's interface. """ @@ -191,23 +205,84 @@ BAUDRATE = 115200 """Default baudrate for AD2USB devices.""" - @staticmethod -
    [docs] def find_all(): + __devices = [] + + @classmethod +
    [docs] def find_all(cls, vid=FTDI_VENDOR_ID, pid=FTDI_PRODUCT_ID): """ Returns all FTDI devices matching our vendor and product IDs. :returns: list of devices :raises: CommError """ - devices = [] + cls.__devices = [] try: - devices = Ftdi.find_all([(USBDevice.FTDI_VENDOR_ID, USBDevice.FTDI_PRODUCT_ID)], nocache=True) + cls.__devices = Ftdi.find_all([(vid, pid)], nocache=True) except (usb.core.USBError, FtdiError), err: raise CommError('Error enumerating AD2USB devices: {0}'.format(str(err)), err) - return devices + return cls.__devices +
    + @classmethod +
    [docs] def devices(cls): + """ + Returns a cached list of AD2USB devices located on the system. + + :returns: cached list of devices found. + """ + return cls.__devices +
    + @classmethod +
    [docs] def find(cls, device=None): + """ + Factory method that returns the requested USBDevice device, or the first device. + + :param device: Tuple describing the USB device to open, as returned by find_all(). + :type device: tuple + + :returns: USBDevice object utilizing the specified device. + :raises: NoDeviceError + """ + cls.find_all() + + if len(cls.__devices) == 0: + raise NoDeviceError('No AD2USB devices present.') + + if device is None: + device = cls.__devices[0] + + vendor, product, sernum, ifcount, description = device + + return USBDevice(interface=sernum) +
    + @classmethod +
    [docs] def start_detection(cls, on_attached=None, on_detached=None): + """ + Starts the device detection thread. + + :param on_attached: function to be called when a device is attached. + :type on_attached: function + :param on_detached: function to be called when a device is detached. + :type on_detached: function + """ + cls.__detect_thread = USBDevice.DetectThread(on_attached, on_detached) + + cls.find_all() + + cls.__detect_thread.start() +
    + @classmethod +
    [docs] def stop_detection(cls): + """ + Stops the device detection thread. + """ + try: + cls.__detect_thread.stop() + + except: + pass
    @property def interface(self): @@ -216,18 +291,21 @@ :returns: the interface used to connect to the device. """ - return (self._serial_number, self._endpoint) + return self._interface @interface.setter -
    [docs] def interface(self, value): +
    [docs] def interface(self, value): """ Sets the interface used to connect to the device. - :param value: Tuple containing the serial number and endpoint number to use. - :type value: tuple + :param value: May specify either the serial number or the device index. + :type value: str or int """ - self._serial_number = value[0] - self._endpoint = value[1] + self._interface = value + if isinstance(value, int): + self._device_number = value + else: + self._serial_number = value
    @property def serial_number(self): @@ -240,7 +318,7 @@ return self._serial_number @serial_number.setter -
    [docs] def serial_number(self, value): +
    [docs] def serial_number(self, value): """ Sets the serial number of the device. @@ -259,7 +337,7 @@ return self._description @description.setter -
    [docs] def description(self, value): +
    [docs] def description(self, value): """ Sets the description of the device. @@ -268,24 +346,26 @@ """ self._description = value
    - def __init__(self, interface=(None, 0)): + def __init__(self, interface=0): """ Constructor - :param interface: Tuple containing the device number and endpoint number to use. - :type interface: tuple + :param interface: May specify either the serial number or the device index. + :type interface: str or int """ Device.__init__(self) self._device = Ftdi() - self._serial_number = interface[0] - self._endpoint = interface[1] + + self._device_number = 0 + self._serial_number = None + self.interface = interface self._vendor_id = USBDevice.FTDI_VENDOR_ID self._product_id = USBDevice.FTDI_PRODUCT_ID - self._device_number = None + self._endpoint = 0 self._description = None -
    [docs] def open(self, baudrate=BAUDRATE, no_reader_thread=False): +
    [docs] def open(self, baudrate=BAUDRATE, no_reader_thread=False): """ Opens the device. @@ -311,32 +391,37 @@ self._device.set_baudrate(baudrate) - self._id = 'USB {0}:{1}'.format(self._device.usb_dev.bus, self._device.usb_dev.address) + if not self._serial_number: + self._serial_number = self._get_serial_number() + + self._id = self._serial_number except (usb.core.USBError, FtdiError), err: raise NoDeviceError('Error opening device: {0}'.format(str(err)), err) else: self._running = True + self.on_open() + if not no_reader_thread: self._read_thread.start() - self.on_open() + return self
    -
    [docs] def close(self): +
    [docs] def close(self): """ Closes the device. """ try: + Device.close(self) + # HACK: Probably should fork pyftdi and make this call in .close(). self._device.usb_dev.attach_kernel_driver(self._device_number) - Device.close(self) - except: pass
    -
    [docs] def write(self, data): +
    [docs] def write(self, data): """ Writes data to the device. @@ -348,12 +433,12 @@ try: self._device.write_data(data) - self.on_write(data) + self.on_write(data=data) except FtdiError, err: raise CommError('Error writing to device: {0}'.format(str(err)), err)
    -
    [docs] def read(self): +
    [docs] def read(self): """ Reads a single character from the device. @@ -370,7 +455,7 @@ return ret
    -
    [docs] def read_line(self, timeout=0.0, purge_buffer=False): +
    [docs] def read_line(self, timeout=0.0, purge_buffer=False): """ Reads a line from the device. @@ -429,7 +514,7 @@ ret = self._buffer self._buffer = '' - self.on_read(ret) + self.on_read(data=ret) if timer: if timer.is_alive(): @@ -438,9 +523,76 @@ raise TimeoutError('Timeout while waiting for line terminator.') return ret +
    + def _get_serial_number(self): + """ + Retrieves the FTDI device serial number. -
    -
    [docs]class SerialDevice(Device): + :returns: string containing the device serial number. + """ + return usb.util.get_string(self._device.usb_dev, 64, self._device.usb_dev.iSerialNumber) + +
    [docs] class DetectThread(threading.Thread): + """ + Thread that handles detection of added/removed devices. + """ + on_attached = event.Event('Called when an AD2USB device has been detected.') + on_detached = event.Event('Called when an AD2USB device has been removed.') + + def __init__(self, on_attached=None, on_detached=None): + """ + Constructor + + :param on_attached: Function to call when a device is attached. + :type on_attached: function + :param on_detached: Function to call when a device is detached. + :type on_detached: function + """ + threading.Thread.__init__(self) + + if on_attached: + self.on_attached += on_attached + + if on_detached: + self.on_detached += on_detached + + self._running = False + +
    [docs] def stop(self): + """ + Stops the thread. + """ + self._running = False +
    +
    [docs] def run(self): + """ + The actual detection process. + """ + self._running = True + + last_devices = set() + + while self._running: + try: + current_devices = set(USBDevice.find_all()) + + new_devices = [d for d in current_devices if d not in last_devices] + removed_devices = [d for d in last_devices if d not in current_devices] + last_devices = current_devices + + for d in new_devices: + self.on_attached(device=d) + + for d in removed_devices: + self.on_detached(device=d) + + except CommError, err: + pass + + time.sleep(0.25) + +
    +
    [docs]class SerialDevice(Device): """ AD2USB or AD2SERIAL device exposed with the pyserial interface. """ @@ -450,7 +602,7 @@ """Default baudrate for Serial devices.""" @staticmethod -
    [docs] def find_all(pattern=None): +
    [docs] def find_all(pattern=None): """ Returns all serial ports present. @@ -483,7 +635,7 @@ return self._port @interface.setter -
    [docs] def interface(self, value): +
    [docs] def interface(self, value): """ Sets the interface used to connect to the device. @@ -505,7 +657,7 @@ self._id = interface self._device = serial.Serial(timeout=0, writeTimeout=0) # Timeout = non-blocking to match pyftdi. -
    [docs] def open(self, baudrate=BAUDRATE, no_reader_thread=False): +
    [docs] def open(self, baudrate=BAUDRATE, no_reader_thread=False): """ Opens the device. @@ -544,8 +696,10 @@ if not no_reader_thread: self._read_thread.start() + + return self
    -
    [docs] def close(self): +
    [docs] def close(self): """ Closes the device. """ @@ -555,7 +709,7 @@ except: pass
    -
    [docs] def write(self, data): +
    [docs] def write(self, data): """ Writes data to the device. @@ -574,9 +728,9 @@ raise CommError('Error writing to device.', err) else: - self.on_write(data) + self.on_write(data=data)
    -
    [docs] def read(self): +
    [docs] def read(self): """ Reads a single character from the device. @@ -593,7 +747,7 @@ return ret
    -
    [docs] def read_line(self, timeout=0.0, purge_buffer=False): +
    [docs] def read_line(self, timeout=0.0, purge_buffer=False): """ Reads a line from the device. @@ -648,7 +802,7 @@ ret = self._buffer self._buffer = '' - self.on_read(ret) + self.on_read(data=ret) if timer: if timer.is_alive(): @@ -658,10 +812,10 @@ return ret
    -
    [docs]class SocketDevice(Device): +
    [docs]class SocketDevice(Device): """ - Device that supports communication with an AD2 that is exposed via ser2sock or another - Serial to IP interface. + Device that supports communication with an Alarm Decoder (AD2) that is + exposed via ser2sock or another Serial to IP interface. """ @property @@ -674,11 +828,11 @@ return (self._host, self._port) @interface.setter -
    [docs] def interface(self, value): +
    [docs] def interface(self, value): """ Sets the interface used to connect to the device. - :param value: Tuple containing the device number and endpoint number to use. + :param value: Tuple containing the host and port to use. :type value: tuple """ self._host = value[0] @@ -694,7 +848,7 @@ return self._use_ssl @ssl.setter -
    [docs] def ssl(self, value): +
    [docs] def ssl(self, value): """ Sets whether or not SSL communication is in use. @@ -713,7 +867,7 @@ return self._ssl_certificate @ssl_certificate.setter -
    [docs] def ssl_certificate(self, value): +
    [docs] def ssl_certificate(self, value): """ Sets the SSL client certificate to use for authentication. @@ -732,7 +886,7 @@ return self._ssl_key @ssl_key.setter -
    [docs] def ssl_key(self, value): +
    [docs] def ssl_key(self, value): """ Sets the SSL client certificate key to use for authentication. @@ -751,7 +905,7 @@ return self._ssl_ca @ssl_ca.setter -
    [docs] def ssl_ca(self, value): +
    [docs] def ssl_ca(self, value): """ Sets the SSL Certificate Authority certificate used for authentication. @@ -775,7 +929,7 @@ self._ssl_key = None self._ssl_ca = None -
    [docs] def open(self, baudrate=None, no_reader_thread=False): +
    [docs] def open(self, baudrate=None, no_reader_thread=False): """ Opens the device. @@ -795,6 +949,9 @@ self._device.connect((self._host, self._port)) + if self._use_ssl: + self._device.do_handshake() + self._id = '{0}:{1}'.format(self._host, self._port) except socket.error, err: @@ -802,19 +959,22 @@ else: self._running = True - self.on_open() if not no_reader_thread: self._read_thread.start() + + return self
    -
    [docs] def close(self): +
    [docs] def close(self): """ Closes the device. """ try: + # TODO: Find a way to speed up this shutdown. if self.ssl: self._device.shutdown() + else: self._device.shutdown(socket.SHUT_RDWR) # Make sure that it closes immediately. @@ -823,7 +983,7 @@ except Exception, ex: pass
    -
    [docs] def write(self, data): +
    [docs] def write(self, data): """ Writes data to the device. @@ -841,14 +1001,14 @@ if data_sent == 0: raise CommError('Error writing to device.') - self.on_write(data) + self.on_write(data=data) except (SSL.Error, socket.error), err: raise CommError('Error writing to device.', err) return data_sent
    -
    [docs] def read(self): +
    [docs] def read(self): """ Reads a single character from the device. @@ -865,7 +1025,7 @@ return data
    -
    [docs] def read_line(self, timeout=0.0, purge_buffer=False): +
    [docs] def read_line(self, timeout=0.0, purge_buffer=False): """ Reads a line from the device. @@ -924,7 +1084,7 @@ ret = self._buffer self._buffer = '' - self.on_read(ret) + self.on_read(data=ret) if timer: if timer.is_alive(): @@ -996,12 +1156,12 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • Module code »
  • diff --git a/docs/_build/html/_modules/pyad2/event/event.html b/docs/_build/html/_modules/alarmdecoder/event/event.html similarity index 78% rename from docs/_build/html/_modules/pyad2/event/event.html rename to docs/_build/html/_modules/alarmdecoder/event/event.html index 3427864..4cb5a8b 100644 --- a/docs/_build/html/_modules/pyad2/event/event.html +++ b/docs/_build/html/_modules/alarmdecoder/event/event.html @@ -6,7 +6,7 @@ - pyad2.event.event — pyad2 documentation + alarmdecoder.event.event — alarmdecoder documentation @@ -23,7 +23,7 @@ - + @@ -36,7 +36,7 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • Module code »
  • @@ -46,18 +46,19 @@
    -

    Source code for pyad2.event.event

    +  

    Source code for alarmdecoder.event.event

     # event.py (improved)
     #
     
     # Based on pyevent originally found at http://www.emptypage.jp/notes/pyevent.en.html
    -# 
    +#
     # License: https://creativecommons.org/licenses/by/2.1/jp/deed.en
     #
     # Changes:
    -#    Added type check in fire()
    +#   * Added type check in fire()
    +#   * Removed earg from fire() and added support for args/kwargs.
     
    -
    [docs]class Event(object): +
    [docs]class Event(object): def __init__(self, doc=None): self.__doc__ = doc @@ -71,7 +72,7 @@ pass
    -
    [docs]class EventHandler(object): +
    [docs]class EventHandler(object): def __init__(self, event, obj): @@ -88,7 +89,7 @@ eventhandler = self.obj.__eventhandler__ = {} return eventhandler.setdefault(self.event, []) -
    [docs] def add(self, func): +
    [docs] def add(self, func): """Add new event handler function. @@ -99,7 +100,7 @@ self._getfunctionlist().append(func) return self
    -
    [docs] def remove(self, func): +
    [docs] def remove(self, func): """Remove existing event handler function. @@ -109,19 +110,19 @@ self._getfunctionlist().remove(func) return self
    -
    [docs] def fire(self, earg=None): +
    [docs] def fire(self, *args, **kwargs): """Fire event and call all handler functions - You can call EventHandler object itself like e(earg) instead of - e.fire(earg). + You can call EventHandler object itself like e(*args, **kwargs) instead of + e.fire(*args, **kwargs). """ for func in self._getfunctionlist(): if type(func) == EventHandler: - func.fire(earg) + func.fire(*args, **kwargs) else: - func(self.obj, earg) + func(self.obj, *args, **kwargs)
    __iadd__ = add __isub__ = remove @@ -159,12 +160,12 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • Module code »
  • diff --git a/docs/_build/html/_modules/pyad2/messages.html b/docs/_build/html/_modules/alarmdecoder/messages.html similarity index 74% rename from docs/_build/html/_modules/pyad2/messages.html rename to docs/_build/html/_modules/alarmdecoder/messages.html index 58da4c4..6d2d509 100644 --- a/docs/_build/html/_modules/pyad2/messages.html +++ b/docs/_build/html/_modules/alarmdecoder/messages.html @@ -6,7 +6,7 @@ - pyad2.messages — pyad2 documentation + alarmdecoder.messages — alarmdecoder documentation @@ -23,7 +23,7 @@ - + @@ -36,7 +36,7 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • Module code »
  • @@ -46,9 +46,10 @@
    -

    Source code for pyad2.messages

    +  

    Source code for alarmdecoder.messages

     """
    -Message representations received from the panel through the AD2 devices.
    +Message representations received from the panel through the Alarm Decoder (AD2)
    +devices.
     
     .. moduleauthor:: Scott Petersen <scott@nutech.com>
     """
    @@ -57,15 +58,19 @@
     
     from .util import InvalidMessageError
     
    -
    [docs]class BaseMessage(object): +
    [docs]class BaseMessage(object): """ Base class for messages. """ + + raw = None + """The raw message text""" + def __init__(self): """ Constructor """ - self.raw = None + pass def __str__(self): """ @@ -73,11 +78,56 @@ """ return self.raw
    -
    [docs]class Message(BaseMessage): +
    [docs]class Message(BaseMessage): """ Represents a message from the alarm panel. """ + ready = False + """Indicates whether or not the panel is in a ready state""" + armed_away = False + """Indicates whether or not the panel is armed away""" + armed_home = False + """Indicates whether or not the panel is armed home""" + backlight_on = False + """Indicates whether or not the keypad backlight is on""" + programming_mode = False + """Indicates whether or not we're in programming mode""" + beeps = -1 + """Number of beeps associated with a message""" + zone_bypassed = False + """Indicates whether or not a zone is bypassed""" + ac_power = False + """Indicates whether or not the panel is on AC power""" + chime_on = False + """Indicates whether or not the chime is enabled""" + alarm_event_occurred = False + """Indicates whether or not an alarm event has occurred""" + alarm_sounding = False + """Indicates whether or not an alarm is sounding""" + battery_low = False + """Indicates whether or not there is a low battery""" + entry_delay_off = False + """Indicates whether or not the entry delay is enabled""" + fire_alarm = False + """Indicates whether or not a fire alarm is sounding""" + check_zone = False + """Indicates whether or not there are zones that require attention.""" + perimeter_only = False + """Indicates whether or not the perimeter is armed""" + numeric_code = None + """The numeric code associated with the message""" + text = None + """The human-readable text to be displayed on the panel LCD""" + cursor_location = -1 + """Current cursor location on the keypad""" + mask = None + """Address mask this message is intended for""" + bitfield = None + """The bitfield associated with this message""" + panel_data = None + """The panel data field associated with this message""" + def __init__(self, data=None): """ Constructor @@ -85,35 +135,19 @@ :param data: Message data to parse. :type data: str """ - self.ready = False - self.armed_away = False - self.armed_home = False - self.backlight_on = False - self.programming_mode = False - self.beeps = -1 - self.zone_bypassed = False - self.ac_power = False - self.chime_on = False - self.alarm_event_occurred = False - self.alarm_sounding = False - self.battery_low = False - self.entry_delay_off = False - self.fire_alarm = False - self.check_zone = False - self.perimeter_only = False - self.numeric_code = "" - self.text = "" - self.cursor_location = -1 - self.data = "" - self.mask = "" - self.bitfield = "" - self.panel_data = "" + BaseMessage.__init__(self) self._regex = re.compile('("(?:[^"]|"")*"|[^,]*),("(?:[^"]|"")*"|[^,]*),("(?:[^"]|"")*"|[^,]*),("(?:[^"]|"")*"|[^,]*)') if data is not None: self._parse_message(data) + def __str__(self): + """ + String conversion operator. + """ + return self.raw + def _parse_message(self, data): """ Parse the message from the device. @@ -155,14 +189,8 @@ if int(self.panel_data[19:21], 16) & 0x01 > 0: self.cursor_location = int(self.bitfield[21:23], 16) # Alpha character index that the cursor is on. - - def __str__(self): - """ - String conversion operator. - """ - return self.raw
    -
    [docs]class ExpanderMessage(BaseMessage): +
    [docs]class ExpanderMessage(BaseMessage): """ Represents a message from a zone or relay expansion module. """ @@ -172,6 +200,16 @@ RELAY = 1 """Flag indicating that the expander message relates to a Relay Expander.""" + + type = None + """Expander message type: ExpanderMessage.ZONE or ExpanderMessage.RELAY""" + address = -1 + """Address of expander""" + channel = -1 + """Channel on the expander""" + value = -1 + """Value associated with the message""" + def __init__(self, data=None): """ Constructor @@ -179,11 +217,7 @@ :param data: The message data to parse. :type data: str """ - self.type = None - self.address = None - self.channel = None - self.value = None - self.raw = None + BaseMessage.__init__(self) if data is not None: self._parse_message(data) @@ -220,11 +254,22 @@ else: raise InvalidMessageError('Unknown expander message header: {0}'.format(data))
    -
    [docs]class RFMessage(BaseMessage): +
    [docs]class RFMessage(BaseMessage): """ Represents a message from an RF receiver. """ + serial_number = None + """Serial number of the RF device""" + value = -1 + """Value associated with this message""" + battery = False + """Battery low indication""" + supervision = False + """Supervision required indication""" + loop = [False for x in range(4)] + """Loop indicators""" + def __init__(self, data=None): """ Constructor @@ -232,12 +277,7 @@ :param data: The message data to parse :type data: str """ - self.raw = None - self.serial_number = None - self.value = None - self.battery = None - self.supervision = None - self.loop = {} + BaseMessage.__init__(self) if data is not None: self._parse_message(data) @@ -262,26 +302,32 @@ self.serial_number, self.value = values.split(',') self.value = int(self.value, 16) - is_bit_set = lambda b: self.value & (1 << b) > 0 + is_bit_set = lambda b: self.value & (1 << (b - 1)) > 0 # Bit 1 = unknown self.battery = is_bit_set(2) self.supervision = is_bit_set(3) - # Bit 8 = unknown - self.loop[0] = is_bit_set(5) + # Bit 4 = unknown + self.loop[2] = is_bit_set(5) self.loop[1] = is_bit_set(6) - self.loop[2] = is_bit_set(7) - self.loop[3] = is_bit_set(8) + self.loop[3] = is_bit_set(7) + self.loop[0] = is_bit_set(8) except ValueError: raise InvalidMessageError('Received invalid message: {0}'.format(data)) -
    -
    [docs]class LRRMessage(BaseMessage): +
    [docs]class LRRMessage(BaseMessage): """ Represent a message from a Long Range Radio. """ + event_data = None + """Data associated with the LRR message. Usually user ID or zone.""" + partition = -1 + """The partition that this message applies to""" + event_type = None + """The type of the event that occurred""" + def __init__(self, data=None): """ Constructor @@ -289,10 +335,7 @@ :param data: The message data to parse. :type data: str """ - self.raw = None - self.event_data = None - self.partition = None - self.event_type = None + BaseMessage.__init__(self) if data is not None: self._parse_message(data) @@ -351,12 +394,12 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • Module code »
  • diff --git a/docs/_build/html/_modules/pyad2/util.html b/docs/_build/html/_modules/alarmdecoder/util.html similarity index 87% rename from docs/_build/html/_modules/pyad2/util.html rename to docs/_build/html/_modules/alarmdecoder/util.html index 0e16016..57eabec 100644 --- a/docs/_build/html/_modules/pyad2/util.html +++ b/docs/_build/html/_modules/alarmdecoder/util.html @@ -6,7 +6,7 @@ - pyad2.util — pyad2 documentation + alarmdecoder.util — alarmdecoder documentation @@ -23,7 +23,7 @@ - + @@ -36,7 +36,7 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • Module code »
  • @@ -46,44 +46,43 @@
    -

    Source code for pyad2.util

    +  

    Source code for alarmdecoder.util

     """
    -Provides utility classes for the AD2 devices.
    +Provides utility classes for the Alarm Decoder (AD2) devices.
     
     .. moduleauthor:: Scott Petersen <scott@nutech.com>
     """
     
    -import ad2
     import time
     import threading
     
    -
    [docs]class NoDeviceError(Exception): +
    [docs]class NoDeviceError(Exception): """ No devices found. """ pass
    -
    [docs]class CommError(Exception): +
    [docs]class CommError(Exception): """ There was an error communicating with the device. """ pass
    -
    [docs]class TimeoutError(Exception): +
    [docs]class TimeoutError(Exception): """ There was a timeout while trying to communicate with the device. """ pass
    -
    [docs]class InvalidMessageError(Exception): +
    [docs]class InvalidMessageError(Exception): """ The format of the panel message was invalid. """ pass
    -
    [docs]class Firmware(object): +
    [docs]class Firmware(object): """ - Represents firmware for the AD2 devices. + Represents firmware for the Alarm Decoder devices. """ # Constants @@ -95,16 +94,16 @@ STAGE_DONE = 5 @staticmethod -
    [docs] def upload(dev, filename, progress_callback=None): +
    [docs] def upload(dev, filename, progress_callback=None): """ - Uploads firmware to an AD2 device. + Uploads firmware to an Alarm Decoder device. :param filename: The firmware filename :type filename: str :param progress_callback: Callback function used to report progress. :type progress_callback: function - :raises: util.NoDeviceError, util.TimeoutError + :raises: NoDeviceError, TimeoutError """ def do_upload(): @@ -228,12 +227,12 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • Module code »
  • diff --git a/docs/_build/html/_modules/pyad2/zonetracking.html b/docs/_build/html/_modules/alarmdecoder/zonetracking.html similarity index 94% rename from docs/_build/html/_modules/pyad2/zonetracking.html rename to docs/_build/html/_modules/alarmdecoder/zonetracking.html index d3db801..3cd34b7 100644 --- a/docs/_build/html/_modules/pyad2/zonetracking.html +++ b/docs/_build/html/_modules/alarmdecoder/zonetracking.html @@ -6,7 +6,7 @@ - pyad2.zonetracking — pyad2 documentation + alarmdecoder.zonetracking — alarmdecoder documentation @@ -23,7 +23,7 @@ - + @@ -36,7 +36,7 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • Module code »
  • @@ -46,9 +46,9 @@
    -

    Source code for pyad2.zonetracking

    +  

    Source code for alarmdecoder.zonetracking

     """
    -Provides zone tracking functionality for the AD2 device family.
    +Provides zone tracking functionality for the Alarm Decoder (AD2) device family.
     
     .. moduleauthor:: Scott Petersen <scott@nutech.com>
     """
    @@ -59,7 +59,7 @@
     from .event import event
     from .messages import ExpanderMessage
     
    -
    [docs]class Zone(object): +
    [docs]class Zone(object): """ Representation of a panel zone. """ @@ -101,7 +101,7 @@ """ return 'Zone({0}, {1}, ts {2})'.format(self.zone, Zone.STATUS[self.status], self.timestamp)
    -
    [docs]class Zonetracker(object): +
    [docs]class Zonetracker(object): """ Handles tracking of zone and their statuses. """ @@ -120,7 +120,7 @@ self._zones_faulted = [] self._last_zone_fault = 0 -
    [docs] def update(self, message): +
    [docs] def update(self, message): """ Update zone statuses based on the current message. @@ -148,6 +148,10 @@ else: # Panel is ready, restore all zones. + # + # NOTE: This will need to be updated to support panels with multiple partitions. + # In it's current state a ready on partition #1 will end up clearing all zones, even + # if they exist elsewhere and it shouldn't. if message.ready: for z in self._zones_faulted: self._update_zone(z, Zone.CLEAR) @@ -283,7 +287,7 @@ self._zones[zone] = Zone(zone=zone, name=name, status=status) if status != Zone.CLEAR: - self.on_fault(zone) + self.on_fault(zone=zone) def _update_zone(self, zone, status=None): """ @@ -308,7 +312,7 @@ if zone in self._zones_faulted: self._zones_faulted.remove(zone) - self.on_restore(zone) + self.on_restore(zone=zone) def _zone_expired(self, zone): """ @@ -372,12 +376,12 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • Module code »
  • diff --git a/docs/_build/html/_modules/index.html b/docs/_build/html/_modules/index.html index 397b6c5..040c13c 100644 --- a/docs/_build/html/_modules/index.html +++ b/docs/_build/html/_modules/index.html @@ -6,7 +6,7 @@ - Overview: module code — pyad2 documentation + Overview: module code — alarmdecoder documentation @@ -23,7 +23,7 @@ - + @@ -45,12 +45,11 @@ @@ -84,11 +83,11 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • diff --git a/docs/_build/html/_modules/pyad2/ad2.html b/docs/_build/html/_modules/pyad2/ad2.html deleted file mode 100644 index 95e5e44..0000000 --- a/docs/_build/html/_modules/pyad2/ad2.html +++ /dev/null @@ -1,671 +0,0 @@ - - - - - - - - pyad2.ad2 — pyad2 documentation - - - - - - - - - - - - - - -
    -
    -
    -
    - -

    Source code for pyad2.ad2

    -"""
    -Provides the full AD2 class and factory.
    -
    -.. moduleauthor:: Scott Petersen <scott@nutech.com>
    -"""
    -
    -import time
    -import threading
    -
    -from .event import event
    -from .devices import USBDevice
    -from .util import CommError, NoDeviceError
    -from .messages import Message, ExpanderMessage, RFMessage, LRRMessage
    -from .zonetracking import Zonetracker
    -
    -
    [docs]class AD2Factory(object): - """ - Factory for creation of AD2USB devices as well as provides attach/detach events." - """ - - # Factory events - on_attached = event.Event('Called when an AD2USB device has been detected.') - on_detached = event.Event('Called when an AD2USB device has been removed.') - - __devices = [] - - @classmethod -
    [docs] def find_all(cls): - """ - Returns all AD2USB devices located on the system. - - :returns: list of devices found - :raises: CommError - """ - cls.__devices = USBDevice.find_all() - - return cls.__devices -
    - @classmethod -
    [docs] def devices(cls): - """ - Returns a cached list of AD2USB devices located on the system. - - :returns: cached list of devices found. - """ - return cls.__devices -
    - @classmethod -
    [docs] def create(cls, device=None): - """ - Factory method that returns the requested AD2USB device, or the first device. - - :param device: Tuple describing the USB device to open, as returned by find_all(). - :type device: tuple - - :returns: AD2USB object utilizing the specified device. - :raises: NoDeviceError - """ - cls.find_all() - - if len(cls.__devices) == 0: - raise NoDeviceError('No AD2USB devices present.') - - if device is None: - device = cls.__devices[0] - - vendor, product, sernum, ifcount, description = device - device = USBDevice((sernum, ifcount - 1)) - - return AD2(device) -
    - def __init__(self, attached_event=None, detached_event=None): - """ - Constructor - - :param attached_event: Event to trigger when a device is attached. - :type attached_event: function - :param detached_event: Event to trigger when a device is detached. - :type detached_event: function - """ - self._detect_thread = AD2Factory.DetectThread(self) - - if attached_event: - self.on_attached += attached_event - - if detached_event: - self.on_detached += detached_event - - AD2Factory.find_all() - - self.start() - -
    [docs] def close(self): - """ - Clean up and shut down. - """ - self.stop() -
    -
    [docs] def start(self): - """ - Starts the detection thread, if not already running. - """ - if not self._detect_thread.is_alive(): - self._detect_thread.start() -
    -
    [docs] def stop(self): - """ - Stops the detection thread. - """ - self._detect_thread.stop() -
    -
    [docs] def get_device(self, device=None): - """ - Factory method that returns the requested AD2USB device, or the first device. - - :param device: Tuple describing the USB device to open, as returned by find_all(). - :type device: tuple - """ - return AD2Factory.create(device) -
    -
    [docs] class DetectThread(threading.Thread): - """ - Thread that handles detection of added/removed devices. - """ - def __init__(self, factory): - """ - Constructor - - :param factory: AD2Factory object to use with the thread. - :type factory: AD2Factory - """ - threading.Thread.__init__(self) - - self._factory = factory - self._running = False - -
    [docs] def stop(self): - """ - Stops the thread. - """ - self._running = False -
    -
    [docs] def run(self): - """ - The actual detection process. - """ - self._running = True - - last_devices = set() - - while self._running: - try: - AD2Factory.find_all() - - current_devices = set(AD2Factory.devices()) - new_devices = [d for d in current_devices if d not in last_devices] - removed_devices = [d for d in last_devices if d not in current_devices] - last_devices = current_devices - - for d in new_devices: - self._factory.on_attached(d) - - for d in removed_devices: - self._factory.on_detached(d) - - except CommError, err: - pass - - time.sleep(0.25) - -
    -
    [docs]class AD2(object): - """ - High-level wrapper around AD2 devices. - """ - - # High-level Events - on_arm = event.Event('Called when the panel is armed.') - on_disarm = event.Event('Called when the panel is disarmed.') - on_power_changed = event.Event('Called when panel power switches between AC and DC.') - on_alarm = event.Event('Called when the alarm is triggered.') - on_fire = event.Event('Called when a fire is detected.') - on_bypass = event.Event('Called when a zone is bypassed.') - on_boot = event.Event('Called when the device finishes bootings.') - on_config_received = event.Event('Called when the device receives its configuration.') - on_zone_fault = event.Event('Called when the device detects a zone fault.') - on_zone_restore = event.Event('Called when the device detects that a fault is restored.') - on_low_battery = event.Event('Called when the device detects a low battery.') - on_panic = event.Event('Called when the device detects a panic.') - on_relay_changed = event.Event('Called when a relay is opened or closed on an expander board.') - - # Mid-level Events - on_message = event.Event('Called when a message has been received from the device.') - on_lrr_message = event.Event('Called when an LRR message is received.') - on_rfx_message = event.Event('Called when an RFX message is received.') - - # Low-level Events - on_open = event.Event('Called when the device has been opened.') - on_close = event.Event('Called when the device has been closed.') - on_read = event.Event('Called when a line has been read from the device.') - on_write = event.Event('Called when data has been written to the device.') - - # Constants - F1 = unichr(1) + unichr(1) + unichr(1) - """Represents panel function key #1""" - F2 = unichr(2) + unichr(2) + unichr(2) - """Represents panel function key #2""" - F3 = unichr(3) + unichr(3) + unichr(3) - """Represents panel function key #3""" - F4 = unichr(4) + unichr(4) + unichr(4) - """Represents panel function key #4""" - - BATTERY_TIMEOUT = 30 - """Timeout before the battery status reverts.""" - FIRE_TIMEOUT = 30 - """Timeout before the fire status reverts.""" - - def __init__(self, device): - """ - Constructor - - :param device: The low-level device used for this AD2 interface. - :type device: Device - """ - self._device = device - self._zonetracker = Zonetracker() - - self._power_status = None - self._alarm_status = None - self._bypass_status = None - self._armed_status = None - self._fire_status = (False, 0) - self._battery_status = (False, 0) - self._panic_status = None - self._relay_status = {} - - self.address = 18 - self.configbits = 0xFF00 - self.address_mask = 0x00000000 - self.emulate_zone = [False for x in range(5)] - self.emulate_relay = [False for x in range(4)] - self.emulate_lrr = False - self.deduplicate = False - - @property -
    [docs] def id(self): - """ - The ID of the AD2 device. - - :returns: The identification string for the device. - """ - return self._device.id -
    -
    [docs] def open(self, baudrate=None, no_reader_thread=False): - """ - Opens the device. - - :param baudrate: The baudrate used for the device. - :type baudrate: int - :param interface: The interface used for the device. - :type interface: varies depends on device type.. FIXME - :param index: Interface index.. can probably remove. FIXME - :type index: int - :param no_reader_thread: Specifies whether or not the automatic reader thread should be started or not - :type no_reader_thread: bool - """ - self._wire_events() - self._device.open(baudrate=baudrate, no_reader_thread=no_reader_thread) -
    -
    [docs] def close(self): - """ - Closes the device. - """ - if self._device: - self._device.close() - - del self._device - self._device = None -
    -
    [docs] def send(self, data): - if self._device: - self._device.write(data) -
    -
    [docs] def get_config(self): - """ - Retrieves the configuration from the device. - """ - self.send("C\r") -
    -
    [docs] def save_config(self): - """ - Sets configuration entries on the device. - """ - config_string = '' - - # HACK: Both of these methods are ugly.. but I can't think of an elegant way of doing it. - - #config_string += 'ADDRESS={0}&'.format(self.address) - #config_string += 'CONFIGBITS={0:x}&'.format(self.configbits) - #config_string += 'MASK={0:x}&'.format(self.address_mask) - #config_string += 'EXP={0}&'.format(''.join(['Y' if z else 'N' for z in self.emulate_zone])) - #config_string += 'REL={0}&'.format(''.join(['Y' if r else 'N' for r in self.emulate_relay])) - #config_string += 'LRR={0}&'.format('Y' if self.emulate_lrr else 'N') - #config_string += 'DEDUPLICATE={0}'.format('Y' if self.deduplicate else 'N') - - config_entries = [] - config_entries.append(('ADDRESS', '{0}'.format(self.address))) - config_entries.append(('CONFIGBITS', '{0:x}'.format(self.configbits))) - config_entries.append(('MASK', '{0:x}'.format(self.address_mask))) - config_entries.append(('EXP', ''.join(['Y' if z else 'N' for z in self.emulate_zone]))) - config_entries.append(('REL', ''.join(['Y' if r else 'N' for r in self.emulate_relay]))) - config_entries.append(('LRR', 'Y' if self.emulate_lrr else 'N')) - config_entries.append(('DEDUPLICATE', 'Y' if self.deduplicate else 'N')) - - config_string = '&'.join(['='.join(t) for t in config_entries]) - - self.send("C{0}\r".format(config_string)) -
    -
    [docs] def reboot(self): - """ - Reboots the device. - """ - self.send('=') -
    -
    [docs] def fault_zone(self, zone, simulate_wire_problem=False): - """ - Faults a zone if we are emulating a zone expander. - - :param zone: The zone to fault. - :type zone: int - :param simulate_wire_problem: Whether or not to simulate a wire fault. - :type simulate_wire_problem: bool - """ - - # Allow ourselves to also be passed an address/channel combination - # for zone expanders. - # - # Format (expander index, channel) - if isinstance(zone, tuple): - zone = self._zonetracker._expander_to_zone(*zone) - - status = 2 if simulate_wire_problem else 1 - - self.send("L{0:02}{1}\r".format(zone, status)) -
    -
    [docs] def clear_zone(self, zone): - """ - Clears a zone if we are emulating a zone expander. - - :param zone: The zone to clear. - :type zone: int - """ - self.send("L{0:02}0\r".format(zone)) -
    - def _wire_events(self): - """ - Wires up the internal device events. - """ - self._device.on_open += self._on_open - self._device.on_close += self._on_close - self._device.on_read += self._on_read - self._device.on_write += self._on_write - self._zonetracker.on_fault += self._on_zone_fault - self._zonetracker.on_restore += self._on_zone_restore - - def _handle_message(self, data): - """ - Parses messages from the panel. - - :param data: Panel data to parse. - :type data: str - - :returns: An object representing the message. - """ - if data is None: - raise InvalidMessageError() - - msg = None - - header = data[0:4] - if header[0] != '!' or header == '!KPE': - msg = Message(data) - - if self.address_mask & msg.mask > 0: - self._update_internal_states(msg) - - elif header == '!EXP' or header == '!REL': - msg = ExpanderMessage(data) - - self._update_internal_states(msg) - - elif header == '!RFX': - msg = self._handle_rfx(data) - - elif header == '!LRR': - msg = self._handle_lrr(data) - - elif data.startswith('!Ready'): - self.on_boot() - - elif data.startswith('!CONFIG'): - self._handle_config(data) - - return msg - - def _handle_rfx(self, data): - msg = RFMessage(data) - - self.on_rfx_message(msg) - - return msg - - def _handle_lrr(self, data): - """ - Handle Long Range Radio messages. - - :param data: LRR message to parse. - :type data: str - - :returns: An object representing the LRR message. - """ - msg = LRRMessage(data) - - if msg.event_type == 'ALARM_PANIC': - self._panic_status = True - self.on_panic(True) - - elif msg.event_type == 'CANCEL': - if self._panic_status == True: - self._panic_status = False - self.on_panic(False) - - self.on_lrr_message(msg) - - return msg - - def _handle_config(self, data): - """ - Handles received configuration data. - - :param data: Configuration string to parse. - :type data: str - """ - _, config_string = data.split('>') - for setting in config_string.split('&'): - k, v = setting.split('=') - - if k == 'ADDRESS': - self.address = int(v) - elif k == 'CONFIGBITS': - self.configbits = int(v, 16) - elif k == 'MASK': - self.address_mask = int(v, 16) - elif k == 'EXP': - for z in range(5): - self.emulate_zone[z] = (v[z] == 'Y') - elif k == 'REL': - for r in range(4): - self.emulate_relay[r] = (v[r] == 'Y') - elif k == 'LRR': - self.emulate_lrr = (v == 'Y') - elif k == 'DEDUPLICATE': - self.deduplicate = (v == 'Y') - - self.on_config_received() - - def _update_internal_states(self, message): - """ - Updates internal device states. - - :param message: Message to update internal states with. - :type message: Message, ExpanderMessage, LRRMessage, or RFMessage - """ - if isinstance(message, Message): - if message.ac_power != self._power_status: - self._power_status, old_status = message.ac_power, self._power_status - - if old_status is not None: - self.on_power_changed(self._power_status) - - if message.alarm_sounding != self._alarm_status: - self._alarm_status, old_status = message.alarm_sounding, self._alarm_status - - if old_status is not None: - self.on_alarm(self._alarm_status) - - if message.zone_bypassed != self._bypass_status: - self._bypass_status, old_status = message.zone_bypassed, self._bypass_status - - if old_status is not None: - self.on_bypass(self._bypass_status) - - if (message.armed_away | message.armed_home) != self._armed_status: - self._armed_status, old_status = message.armed_away | message.armed_home, self._armed_status - - if old_status is not None: - if self._armed_status: - self.on_arm() - else: - self.on_disarm() - - if message.battery_low == self._battery_status[0]: - self._battery_status = (self._battery_status[0], time.time()) - else: - if message.battery_low == True or time.time() > self._battery_status[1] + AD2.BATTERY_TIMEOUT: - self._battery_status = (message.battery_low, time.time()) - self.on_low_battery(self._battery_status) - - if message.fire_alarm == self._fire_status[0]: - self._fire_status = (self._fire_status[0], time.time()) - else: - if message.fire_alarm == True or time.time() > self._fire_status[1] + AD2.FIRE_TIMEOUT: - self._fire_status = (message.fire_alarm, time.time()) - self.on_fire(self._fire_status) - - elif isinstance(message, ExpanderMessage): - if message.type == ExpanderMessage.RELAY: - self._relay_status[(message.address, message.channel)] = message.value - - self.on_relay_changed(message) - - self._update_zone_tracker(message) - - def _update_zone_tracker(self, message): - """ - Trigger an update of the zonetracker. - - :param message: The message to update the zonetracker with. - :type message: Message, ExpanderMessage, LRRMessage, or RFMessage - """ - - # Retrieve a list of faults. - # NOTE: This only happens on first boot or after exiting programming mode. - if isinstance(message, Message): - if not message.ready and "Hit * for faults" in message.text: - self.send('*') - return - - self._zonetracker.update(message) - - def _on_open(self, sender, args): - """ - Internal handler for opening the device. - """ - self.on_open(args) - - def _on_close(self, sender, args): - """ - Internal handler for closing the device. - """ - self.on_close(args) - - def _on_read(self, sender, args): - """ - Internal handler for reading from the device. - """ - self.on_read(args) - - msg = self._handle_message(args) - if msg: - self.on_message(msg) - - def _on_write(self, sender, args): - """ - Internal handler for writing to the device. - """ - self.on_write(args) - - def _on_zone_fault(self, sender, args): - """ - Internal handler for zone faults. - """ - self.on_zone_fault(args) - - def _on_zone_restore(self, sender, args): - """ - Internal handler for zone restoration. - """ - self.on_zone_restore(args)
    -
    - -
    -
    -
    -
    -
    - - -
    -
    -
    -
    - - - - \ No newline at end of file diff --git a/docs/pyad2.event.rst b/docs/_build/html/_sources/alarmdecoder.event.txt similarity index 100% rename from docs/pyad2.event.rst rename to docs/_build/html/_sources/alarmdecoder.event.txt diff --git a/docs/pyad2.rst b/docs/_build/html/_sources/alarmdecoder.txt similarity index 100% rename from docs/pyad2.rst rename to docs/_build/html/_sources/alarmdecoder.txt diff --git a/docs/_build/html/_sources/index.txt b/docs/_build/html/_sources/index.txt index 1acdb0d..41929e0 100644 --- a/docs/_build/html/_sources/index.txt +++ b/docs/_build/html/_sources/index.txt @@ -1,9 +1,9 @@ -.. pyad2 documentation master file, created by +.. alarmdecoder documentation master file, created by sphinx-quickstart on Sat Jun 8 14:38:46 2013. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to pyad2's documentation! +Welcome to alarmdecoder's documentation! ==================================== Contents: @@ -11,7 +11,7 @@ Contents: .. toctree:: :maxdepth: 4 - pyad2 + alarmdecoder Indices and tables diff --git a/docs/_build/html/_sources/modules.txt b/docs/_build/html/_sources/modules.txt index 38606cd..9d3ec02 100644 --- a/docs/_build/html/_sources/modules.txt +++ b/docs/_build/html/_sources/modules.txt @@ -1,7 +1,7 @@ -pyad2 -======== +alarmdecoder +============ .. toctree:: :maxdepth: 4 - pyad2 + alarmdecoder diff --git a/docs/_build/html/pyad2.event.html b/docs/_build/html/alarmdecoder.event.html similarity index 54% rename from docs/_build/html/pyad2.event.html rename to docs/_build/html/alarmdecoder.event.html index 20eca0c..d42171e 100644 --- a/docs/_build/html/pyad2.event.html +++ b/docs/_build/html/alarmdecoder.event.html @@ -6,7 +6,7 @@ - event Package — pyad2 documentation + event Package — alarmdecoder documentation @@ -23,9 +23,9 @@ - - - + + + @@ -54,40 +54,40 @@

    event Package

    event Package

    -
    -
    -

    event Module

    +
    +
    +

    event Module

    -
    -class pyad2.event.event.Event(doc=None)[source]
    +
    +class alarmdecoder.event.event.Event(doc=None)[source]

    Bases: object

    -
    -class pyad2.event.event.EventHandler(event, obj)[source]
    +
    +class alarmdecoder.event.event.EventHandler(event, obj)[source]

    Bases: object

    -
    -add(func)[source]
    +
    +add(func)[source]

    Add new event handler function.

    Event handler function must be defined like func(sender, earg). You can add handler also by using ‘+=’ operator.

    -
    -remove(func)[source]
    +
    +remove(func)[source]

    Remove existing event handler function.

    You can remove handler also by using ‘-=’ operator.

    -
    -fire(earg=None)[source]
    +
    +fire(*args, **kwargs)[source]

    Fire event and call all handler functions

    -

    You can call EventHandler object itself like e(earg) instead of -e.fire(earg).

    +

    You can call EventHandler object itself like e(*args, **kwargs) instead of +e.fire(*args, **kwargs).

    @@ -105,17 +105,17 @@ e.fire(earg).

    Previous topic

    -

    pyad2 Package

    +

    alarmdecoder Package

    This Page

    diff --git a/docs/_build/html/alarmdecoder.html b/docs/_build/html/alarmdecoder.html new file mode 100644 index 0000000..6b8a672 --- /dev/null +++ b/docs/_build/html/alarmdecoder.html @@ -0,0 +1,1225 @@ + + + + + + + + alarmdecoder Package — alarmdecoder documentation + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +

    alarmdecoder Package

    +
    +

    alarmdecoder Module

    +
    +
    +

    devices Module

    +

    Contains different types of devices belonging to the Alarm Decoder (AD2) family.

    +
    +
    +class alarmdecoder.devices.Device[source]
    +

    Bases: object

    +

    Generic parent device to all Alarm Decoder (AD2) products.

    +
    +
    +on_open
    +

    Called when the device has been opened

    +
    + +
    +
    +on_close
    +

    Called when the device has been closed

    +
    + +
    +
    +on_read
    +

    Called when a line has been read from the device

    +
    + +
    +
    +on_write
    +

    Called when data has been written to the device

    +
    + +
    +
    +id[source]
    +

    Retrieve the device ID.

    + +++ + + + +
    Returns:The identification string for the device.
    +
    + +
    +
    +is_reader_alive()[source]
    +

    Indicates whether or not the reader thread is alive.

    + +++ + + + +
    Returns:Whether or not the reader thread is alive.
    +
    + +
    +
    +stop_reader()[source]
    +

    Stops the reader thread.

    +
    + +
    +
    +close()[source]
    +

    Closes the device.

    +
    + +
    +
    +class ReadThread(device)[source]
    +

    Bases: threading.Thread

    +

    Reader thread which processes messages from the device.

    +
    +
    +READ_TIMEOUT = 10
    +

    Timeout for the reader thread.

    +
    + +
    +
    +stop()[source]
    +

    Stops the running thread.

    +
    + +
    +
    +run()[source]
    +

    The actual read process.

    +
    + +
    + +
    + +
    +
    +class alarmdecoder.devices.USBDevice(interface=0)[source]
    +

    Bases: alarmdecoder.devices.Device

    +

    AD2USB device exposed with PyFTDI’s interface.

    +
    +
    +FTDI_VENDOR_ID = 1027
    +

    Vendor ID used to recognize AD2USB devices.

    +
    + +
    +
    +FTDI_PRODUCT_ID = 24577
    +

    Product ID used to recognize AD2USB devices.

    +
    + +
    +
    +BAUDRATE = 115200
    +

    Default baudrate for AD2USB devices.

    +
    + +
    +
    +classmethod find_all(vid=1027, pid=24577)[source]
    +

    Returns all FTDI devices matching our vendor and product IDs.

    + +++ + + + + + +
    Returns:list of devices
    Raises :CommError
    +
    + +
    +
    +classmethod devices()[source]
    +

    Returns a cached list of AD2USB devices located on the system.

    + +++ + + + +
    Returns:cached list of devices found.
    +
    + +
    +
    +classmethod find(device=None)[source]
    +

    Factory method that returns the requested USBDevice device, or the first device.

    + +++ + + + + + + + +
    Parameters:device (tuple) – Tuple describing the USB device to open, as returned by find_all().
    Returns:USBDevice object utilizing the specified device.
    Raises :NoDeviceError
    +
    + +
    +
    +classmethod start_detection(on_attached=None, on_detached=None)[source]
    +

    Starts the device detection thread.

    + +++ + + + +
    Parameters:
      +
    • on_attached (function) – function to be called when a device is attached.
    • +
    • on_detached (function) – function to be called when a device is detached.
    • +
    +
    +
    + +
    +
    +classmethod stop_detection()[source]
    +

    Stops the device detection thread.

    +
    + +
    +
    +serial_number[source]
    +

    Retrieves the serial number of the device.

    + +++ + + + +
    Returns:The serial number of the device.
    +
    + +
    +
    +description[source]
    +

    Retrieves the description of the device.

    + +++ + + + +
    Returns:The description of the device.
    +
    + +
    +
    +interface[source]
    +

    Retrieves the interface used to connect to the device.

    + +++ + + + +
    Returns:the interface used to connect to the device.
    +
    + +
    +
    +open(baudrate=115200, no_reader_thread=False)[source]
    +

    Opens the device.

    + +++ + + + + + +
    Parameters:
      +
    • baudrate (int) – The baudrate to use.
    • +
    • no_reader_thread (bool) – Whether or not to automatically start the reader thread.
    • +
    +
    Raises :

    NoDeviceError

    +
    +
    + +
    +
    +close()[source]
    +

    Closes the device.

    +
    + +
    +
    +write(data)[source]
    +

    Writes data to the device.

    + +++ + + + + + +
    Parameters:data (str) – Data to write
    Raises :CommError
    +
    + +
    +
    +read()[source]
    +

    Reads a single character from the device.

    + +++ + + + + + +
    Returns:The character read from the device.
    Raises :CommError
    +
    + +
    +
    +read_line(timeout=0.0, purge_buffer=False)[source]
    +

    Reads a line from the device.

    + +++ + + + + + + + +
    Parameters:
      +
    • timeout (float) – Read timeout
    • +
    • purge_buffer (bool) – Indicates whether to purge the buffer prior to reading.
    • +
    +
    Returns:

    The line that was read.

    +
    Raises :

    CommError, TimeoutError

    +
    +
    + +
    +
    +class DetectThread(on_attached=None, on_detached=None)[source]
    +

    Bases: threading.Thread

    +

    Thread that handles detection of added/removed devices.

    +
    +
    +on_attached
    +

    Called when an AD2USB device has been detected.

    +
    + +
    +
    +on_detached
    +

    Called when an AD2USB device has been removed.

    +
    + +
    +
    +stop()[source]
    +

    Stops the thread.

    +
    + +
    +
    +run()[source]
    +

    The actual detection process.

    +
    + +
    + +
    + +
    +
    +class alarmdecoder.devices.SerialDevice(interface=None)[source]
    +

    Bases: alarmdecoder.devices.Device

    +

    AD2USB or AD2SERIAL device exposed with the pyserial interface.

    +
    +
    +BAUDRATE = 19200
    +

    Default baudrate for Serial devices.

    +
    + +
    +
    +static find_all(pattern=None)[source]
    +

    Returns all serial ports present.

    + +++ + + + + + + + +
    Parameters:pattern (str) – Pattern to search for when retrieving serial ports.
    Returns:list of devices
    Raises :CommError
    +
    + +
    +
    +interface[source]
    +

    Retrieves the interface used to connect to the device.

    + +++ + + + +
    Returns:the interface used to connect to the device.
    +
    + +
    +
    +open(baudrate=19200, no_reader_thread=False)[source]
    +

    Opens the device.

    + +++ + + + + + +
    Parameters:
      +
    • baudrate (int) – The baudrate to use with the device.
    • +
    • no_reader_thread (bool) – Whether or not to automatically start the reader thread.
    • +
    +
    Raises :

    NoDeviceError

    +
    +
    + +
    +
    +close()[source]
    +

    Closes the device.

    +
    + +
    +
    +write(data)[source]
    +

    Writes data to the device.

    + +++ + + + + + +
    Parameters:data (str) – The data to write.
    Raises :CommError
    +
    + +
    +
    +read()[source]
    +

    Reads a single character from the device.

    + +++ + + + + + +
    Returns:The character read from the device.
    Raises :CommError
    +
    + +
    +
    +read_line(timeout=0.0, purge_buffer=False)[source]
    +

    Reads a line from the device.

    + +++ + + + + + + + +
    Parameters:
      +
    • timeout (float) – The read timeout.
    • +
    • purge_buffer (bool) – Indicates whether to purge the buffer prior to reading.
    • +
    +
    Returns:

    The line read.

    +
    Raises :

    CommError, TimeoutError

    +
    +
    + +
    + +
    +
    +class alarmdecoder.devices.SocketDevice(interface=('localhost', 10000))[source]
    +

    Bases: alarmdecoder.devices.Device

    +

    Device that supports communication with an Alarm Decoder (AD2) that is +exposed via ser2sock or another Serial to IP interface.

    +
    +
    +interface[source]
    +

    Retrieves the interface used to connect to the device.

    + +++ + + + +
    Returns:the interface used to connect to the device.
    +
    + +
    +
    +ssl[source]
    +

    Retrieves whether or not the device is using SSL.

    + +++ + + + +
    Returns:Whether or not the device is using SSL.
    +
    + +
    +
    +ssl_certificate[source]
    +

    Retrieves the SSL client certificate path used for authentication.

    + +++ + + + +
    Returns:The certificate path
    +
    + +
    +
    +ssl_key[source]
    +

    Retrieves the SSL client certificate key used for authentication.

    + +++ + + + +
    Returns:The key path
    +
    + +
    +
    +ssl_ca[source]
    +

    Retrieves the SSL Certificate Authority certificate used for authentication.

    + +++ + + + +
    Returns:The CA path
    +
    + +
    +
    +open(baudrate=None, no_reader_thread=False)[source]
    +

    Opens the device.

    + +++ + + + + + +
    Parameters:
      +
    • baudrate (int) – The baudrate to use
    • +
    • no_reader_thread (bool) – Whether or not to automatically open the reader thread.
    • +
    +
    Raises :

    NoDeviceError, CommError

    +
    +
    + +
    +
    +close()[source]
    +

    Closes the device.

    +
    + +
    +
    +write(data)[source]
    +

    Writes data to the device.

    + +++ + + + + + + + +
    Parameters:data (str) – The data to write.
    Returns:The number of bytes sent.
    Raises :CommError
    +
    + +
    +
    +read()[source]
    +

    Reads a single character from the device.

    + +++ + + + + + +
    Returns:The character read from the device.
    Raises :CommError
    +
    + +
    +
    +read_line(timeout=0.0, purge_buffer=False)[source]
    +

    Reads a line from the device.

    + +++ + + + + + + + +
    Parameters:
      +
    • timeout (float) – The read timeout.
    • +
    • purge_buffer (bool) – Indicates whether to purge the buffer prior to reading.
    • +
    +
    Returns:

    The line read from the device.

    +
    Raises :

    CommError, TimeoutError

    +
    +
    + +
    + +
    +
    +

    util Module

    +

    Provides utility classes for the Alarm Decoder (AD2) devices.

    +
    +
    +exception alarmdecoder.util.NoDeviceError[source]
    +

    Bases: exceptions.Exception

    +

    No devices found.

    +
    + +
    +
    +exception alarmdecoder.util.CommError[source]
    +

    Bases: exceptions.Exception

    +

    There was an error communicating with the device.

    +
    + +
    +
    +exception alarmdecoder.util.TimeoutError[source]
    +

    Bases: exceptions.Exception

    +

    There was a timeout while trying to communicate with the device.

    +
    + +
    +
    +exception alarmdecoder.util.InvalidMessageError[source]
    +

    Bases: exceptions.Exception

    +

    The format of the panel message was invalid.

    +
    + +
    +
    +class alarmdecoder.util.Firmware[source]
    +

    Bases: object

    +

    Represents firmware for the Alarm Decoder devices.

    +
    +
    +STAGE_START = 0
    +
    + +
    +
    +STAGE_WAITING = 1
    +
    + +
    +
    +STAGE_BOOT = 2
    +
    + +
    +
    +STAGE_LOAD = 3
    +
    + +
    +
    +STAGE_UPLOADING = 4
    +
    + +
    +
    +STAGE_DONE = 5
    +
    + +
    +
    +static upload(dev, filename, progress_callback=None)[source]
    +

    Uploads firmware to an Alarm Decoder device.

    + +++ + + + + + +
    Parameters:
      +
    • filename (str) – The firmware filename
    • +
    • progress_callback (function) – Callback function used to report progress.
    • +
    +
    Raises :

    NoDeviceError, TimeoutError

    +
    +
    + +
    + +
    +
    +

    zonetracking Module

    +

    Provides zone tracking functionality for the Alarm Decoder (AD2) device family.

    +
    +
    +class alarmdecoder.zonetracking.Zone(zone=0, name='', status=0)[source]
    +

    Bases: object

    +

    Representation of a panel zone.

    +
    +
    +CLEAR = 0
    +

    Status indicating that the zone is cleared.

    +
    + +
    +
    +FAULT = 1
    +

    Status indicating that the zone is faulted.

    +
    + +
    +
    +CHECK = 2
    +

    Status indicating that there is a wiring issue with the zone.

    +
    + +
    +
    +STATUS = {0: 'CLEAR', 1: 'FAULT', 2: 'CHECK'}
    +
    + +
    + +
    +
    +class alarmdecoder.zonetracking.Zonetracker[source]
    +

    Bases: object

    +

    Handles tracking of zone and their statuses.

    +
    +
    +on_fault
    +

    Called when the device detects a zone fault.

    +
    + +
    +
    +on_restore
    +

    Called when the device detects that a fault is restored.

    +
    + +
    +
    +EXPIRE = 30
    +

    Zone expiration timeout.

    +
    + +
    +
    +update(message)[source]
    +

    Update zone statuses based on the current message.

    + +++ + + + +
    Parameters:message (Message or ExpanderMessage) – Message to use to update the zone tracking.
    +
    + +
    + +
    +
    +

    panels Module

    +

    Representations of Panels and their templates.

    +
    +
    +

    messages Module

    +

    Message representations received from the panel through the Alarm Decoder (AD2) +devices.

    +
    +
    +class alarmdecoder.messages.BaseMessage[source]
    +

    Bases: object

    +

    Base class for messages.

    +
    +
    +raw = None
    +

    The raw message text

    +
    + +
    + +
    +
    +class alarmdecoder.messages.Message(data=None)[source]
    +

    Bases: alarmdecoder.messages.BaseMessage

    +

    Represents a message from the alarm panel.

    +
    +
    +ready = False
    +

    Indicates whether or not the panel is in a ready state

    +
    + +
    +
    +armed_away = False
    +

    Indicates whether or not the panel is armed away

    +
    + +
    +
    +armed_home = False
    +

    Indicates whether or not the panel is armed home

    +
    + +
    +
    +backlight_on = False
    +

    Indicates whether or not the keypad backlight is on

    +
    + +
    +
    +programming_mode = False
    +

    Indicates whether or not we’re in programming mode

    +
    + +
    +
    +beeps = -1
    +

    Number of beeps associated with a message

    +
    + +
    +
    +zone_bypassed = False
    +

    Indicates whether or not a zone is bypassed

    +
    + +
    +
    +ac_power = False
    +

    Indicates whether or not the panel is on AC power

    +
    + +
    +
    +chime_on = False
    +

    Indicates whether or not the chime is enabled

    +
    + +
    +
    +alarm_event_occurred = False
    +

    Indicates whether or not an alarm event has occurred

    +
    + +
    +
    +alarm_sounding = False
    +

    Indicates whether or not an alarm is sounding

    +
    + +
    +
    +battery_low = False
    +

    Indicates whether or not there is a low battery

    +
    + +
    +
    +entry_delay_off = False
    +

    Indicates whether or not the entry delay is enabled

    +
    + +
    +
    +fire_alarm = False
    +

    Indicates whether or not a fire alarm is sounding

    +
    + +
    +
    +check_zone = False
    +

    Indicates whether or not there are zones that require attention.

    +
    + +
    +
    +perimeter_only = False
    +

    Indicates whether or not the perimeter is armed

    +
    + +
    +
    +numeric_code = None
    +

    The numeric code associated with the message

    +
    + +
    +
    +text = None
    +

    The human-readable text to be displayed on the panel LCD

    +
    + +
    +
    +cursor_location = -1
    +

    Current cursor location on the keypad

    +
    + +
    +
    +mask = None
    +

    Address mask this message is intended for

    +
    + +
    +
    +bitfield = None
    +

    The bitfield associated with this message

    +
    + +
    +
    +panel_data = None
    +

    The panel data field associated with this message

    +
    + +
    + +
    +
    +class alarmdecoder.messages.ExpanderMessage(data=None)[source]
    +

    Bases: alarmdecoder.messages.BaseMessage

    +

    Represents a message from a zone or relay expansion module.

    +
    +
    +ZONE = 0
    +

    Flag indicating that the expander message relates to a Zone Expander.

    +
    + +
    +
    +RELAY = 1
    +

    Flag indicating that the expander message relates to a Relay Expander.

    +
    + +
    +
    +type = None
    +

    Expander message type: ExpanderMessage.ZONE or ExpanderMessage.RELAY

    +
    + +
    +
    +address = -1
    +

    Address of expander

    +
    + +
    +
    +channel = -1
    +

    Channel on the expander

    +
    + +
    +
    +value = -1
    +

    Value associated with the message

    +
    + +
    + +
    +
    +class alarmdecoder.messages.RFMessage(data=None)[source]
    +

    Bases: alarmdecoder.messages.BaseMessage

    +

    Represents a message from an RF receiver.

    +
    +
    +x = 3
    +
    + +
    +
    +serial_number = None
    +

    Serial number of the RF device

    +
    + +
    +
    +value = -1
    +

    Value associated with this message

    +
    + +
    +
    +battery = False
    +

    Battery low indication

    +
    + +
    +
    +supervision = False
    +

    Supervision required indication

    +
    + +
    +
    +loop = [False, False, False, False]
    +

    Loop indicators

    +
    + +
    + +
    +
    +class alarmdecoder.messages.LRRMessage(data=None)[source]
    +

    Bases: alarmdecoder.messages.BaseMessage

    +

    Represent a message from a Long Range Radio.

    +
    +
    +event_data = None
    +

    Data associated with the LRR message. Usually user ID or zone.

    +
    + +
    +
    +partition = -1
    +

    The partition that this message applies to

    +
    + +
    +
    +event_type = None
    +

    The type of the event that occurred

    +
    + +
    + +
    +
    +

    Subpackages

    + +
    +
    + + +
    +
    +
    +
    +
    +

    Table Of Contents

    + + +

    Previous topic

    +

    Welcome to alarmdecoder’s documentation!

    +

    Next topic

    +

    event Package

    +

    This Page

    + + + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html index 8a40aff..111128e 100644 --- a/docs/_build/html/genindex.html +++ b/docs/_build/html/genindex.html @@ -7,7 +7,7 @@ - Index — pyad2 documentation + Index — alarmdecoder documentation @@ -24,7 +24,7 @@ - + @@ -55,7 +55,6 @@ | D | E | F - | G | I | L | M @@ -76,45 +75,61 @@ @@ -124,43 +139,39 @@
    -
    ac_power (pyad2.messages.Message attribute) +
    ac_power (alarmdecoder.messages.Message attribute)
    -
    AD2 (class in pyad2.ad2) +
    add() (alarmdecoder.event.event.EventHandler method)
    -
    AD2Factory (class in pyad2.ad2) +
    address (alarmdecoder.messages.ExpanderMessage attribute)
    -
    AD2Factory.DetectThread (class in pyad2.ad2) +
    alarm_event_occurred (alarmdecoder.messages.Message attribute)
    -
    add() (pyad2.event.event.EventHandler method) +
    alarm_sounding (alarmdecoder.messages.Message attribute) +
    + + +
    alarmdecoder.devices (module) +
    + + +
    alarmdecoder.event (module)
    -
    address (pyad2.messages.ExpanderMessage attribute) +
    alarmdecoder.event.event (module) +
    + + +
    alarmdecoder.messages (module) +
    + + +
    alarmdecoder.panels (module)
    -
    alarm_event_occurred (pyad2.messages.Message attribute) +
    alarmdecoder.util (module)
    -
    alarm_sounding (pyad2.messages.Message attribute) +
    alarmdecoder.zonetracking (module)
    -
    armed_away (pyad2.messages.Message attribute) +
    armed_away (alarmdecoder.messages.Message attribute)
    -
    armed_home (pyad2.messages.Message attribute) +
    armed_home (alarmdecoder.messages.Message attribute)
    @@ -170,67 +181,51 @@
    -
    backlight_on (pyad2.messages.Message attribute) +
    backlight_on (alarmdecoder.messages.Message attribute)
    -
    BaseMessage (class in pyad2.messages) +
    BaseMessage (class in alarmdecoder.messages)
    -
    battery (pyad2.messages.RFMessage attribute) +
    battery (alarmdecoder.messages.RFMessage attribute)
    -
    battery_low (pyad2.messages.Message attribute) +
    battery_low (alarmdecoder.messages.Message attribute)
    -
    BATTERY_TIMEOUT (pyad2.ad2.AD2 attribute) -
    - - -
    BAUDRATE (pyad2.devices.SerialDevice attribute) +
    BAUDRATE (alarmdecoder.devices.SerialDevice attribute)
    -
    (pyad2.devices.USBDevice attribute) +
    (alarmdecoder.devices.USBDevice attribute)
    -
    beeps (pyad2.messages.Message attribute) +
    beeps (alarmdecoder.messages.Message attribute)
    -
    bitfield (pyad2.messages.Message attribute) +
    bitfield (alarmdecoder.messages.Message attribute)
    @@ -240,21 +235,21 @@
    -
    channel (pyad2.messages.ExpanderMessage attribute) -
    - - -
    CHECK (pyad2.zonetracking.Zone attribute) +
    channel (alarmdecoder.messages.ExpanderMessage attribute)
    -
    check_zone (pyad2.messages.Message attribute) +
    CHECK (alarmdecoder.zonetracking.Zone attribute)
    -
    chime_on (pyad2.messages.Message attribute) +
    check_zone (alarmdecoder.messages.Message attribute)
    -
    CLEAR (pyad2.zonetracking.Zone attribute) +
    chime_on (alarmdecoder.messages.Message attribute)
    -
    clear_zone() (pyad2.ad2.AD2 method) +
    CLEAR (alarmdecoder.zonetracking.Zone attribute)
    -
    close() (pyad2.ad2.AD2 method) +
    close() (alarmdecoder.devices.Device method)
    -
    (pyad2.ad2.AD2Factory method) -
    - - -
    (pyad2.devices.Device method) -
    - - -
    (pyad2.devices.SerialDevice method) +
    (alarmdecoder.devices.SerialDevice method)
    -
    (pyad2.devices.SocketDevice method) +
    (alarmdecoder.devices.SocketDevice method)
    -
    (pyad2.devices.USBDevice method) +
    (alarmdecoder.devices.USBDevice method)
    -
    CommError -
    - - -
    create() (pyad2.ad2.AD2Factory class method) +
    CommError
    -
    cursor_location (pyad2.messages.Message attribute) +
    cursor_location (alarmdecoder.messages.Message attribute)
    @@ -264,33 +259,33 @@
    -
    description (pyad2.devices.USBDevice attribute) +
    description (alarmdecoder.devices.USBDevice attribute)
    -
    Device (class in pyad2.devices) +
    Device (class in alarmdecoder.devices)
    -
    Device.ReadThread (class in pyad2.devices) +
    Device.ReadThread (class in alarmdecoder.devices)
    -
    devices() (pyad2.ad2.AD2Factory class method) +
    devices() (alarmdecoder.devices.USBDevice class method)
    @@ -300,83 +295,43 @@
    -
    entry_delay_off (pyad2.messages.Message attribute) +
    entry_delay_off (alarmdecoder.messages.Message attribute)
    -
    Event (class in pyad2.event.event) +
    Event (class in alarmdecoder.event.event)
    -
    event_data (pyad2.messages.LRRMessage attribute) +
    event_data (alarmdecoder.messages.LRRMessage attribute)
    -
    event_type (pyad2.messages.LRRMessage attribute) +
    event_type (alarmdecoder.messages.LRRMessage attribute)
    -
    EventHandler (class in pyad2.event.event) +
    EventHandler (class in alarmdecoder.event.event)
    -
    ExpanderMessage (class in pyad2.messages) +
    ExpanderMessage (class in alarmdecoder.messages)
    -
    EXPIRE (pyad2.zonetracking.Zonetracker attribute) +
    EXPIRE (alarmdecoder.zonetracking.Zonetracker attribute)
    - + -
    -
    F1 (pyad2.ad2.AD2 attribute) -
    - - -
    F2 (pyad2.ad2.AD2 attribute) -
    - - -
    F3 (pyad2.ad2.AD2 attribute) +
    FAULT (alarmdecoder.zonetracking.Zone attribute)
    -
    F4 (pyad2.ad2.AD2 attribute) +
    find() (alarmdecoder.devices.USBDevice class method)
    -
    FAULT (pyad2.zonetracking.Zone attribute) -
    - - -
    fault_zone() (pyad2.ad2.AD2 method) -
    - - -
    find_all() (pyad2.ad2.AD2Factory class method) +
    find_all() (alarmdecoder.devices.SerialDevice static method)
    -
    (pyad2.devices.SerialDevice static method) -
    - - -
    (pyad2.devices.USBDevice static method) +
    (alarmdecoder.devices.USBDevice class method)
    -
    -
    fire() (pyad2.event.event.EventHandler method) -
    - - -
    fire_alarm (pyad2.messages.Message attribute) +
    fire() (alarmdecoder.event.event.EventHandler method)
    +
    -
    FIRE_TIMEOUT (pyad2.ad2.AD2 attribute) +
    fire_alarm (alarmdecoder.messages.Message attribute)
    -
    Firmware (class in pyad2.util) +
    Firmware (class in alarmdecoder.util)
    -
    FTDI_PRODUCT_ID (pyad2.devices.USBDevice attribute) +
    FTDI_PRODUCT_ID (alarmdecoder.devices.USBDevice attribute)
    -
    FTDI_VENDOR_ID (pyad2.devices.USBDevice attribute) -
    - -
    - -

    G

    - - - @@ -386,37 +341,31 @@
    - -
    get_config() (pyad2.ad2.AD2 method) -
    - -
    - -
    get_device() (pyad2.ad2.AD2Factory method) +
    FTDI_VENDOR_ID (alarmdecoder.devices.USBDevice attribute)
    @@ -426,13 +375,13 @@
    -
    id (pyad2.ad2.AD2 attribute) +
    id (alarmdecoder.devices.Device attribute)
    -
    - -
    (pyad2.devices.Device attribute) -
    - -
    -
    interface (pyad2.devices.SerialDevice attribute) +
    interface (alarmdecoder.devices.SerialDevice attribute)
    -
    (pyad2.devices.SocketDevice attribute) +
    (alarmdecoder.devices.SocketDevice attribute)
    -
    (pyad2.devices.USBDevice attribute) +
    (alarmdecoder.devices.USBDevice attribute)
    -
    InvalidMessageError +
    InvalidMessageError
    -
    is_reader_alive() (pyad2.devices.Device method) +
    is_reader_alive() (alarmdecoder.devices.Device method)
    @@ -442,13 +391,13 @@
    -
    loop (pyad2.messages.RFMessage attribute) +
    loop (alarmdecoder.messages.RFMessage attribute)
    -
    LRRMessage (class in pyad2.messages) +
    LRRMessage (class in alarmdecoder.messages)
    @@ -458,13 +407,13 @@
    -
    mask (pyad2.messages.Message attribute) +
    mask (alarmdecoder.messages.Message attribute)
    -
    Message (class in pyad2.messages) +
    Message (class in alarmdecoder.messages)
    @@ -474,142 +423,50 @@
    -
    NoDeviceError +
    NoDeviceError
    -
    numeric_code (pyad2.messages.Message attribute) +
    numeric_code (alarmdecoder.messages.Message attribute)
    -
    on_alarm (pyad2.ad2.AD2 attribute) -
    - - -
    on_arm (pyad2.ad2.AD2 attribute) -
    - - -
    on_attached (pyad2.ad2.AD2Factory attribute) -
    - - -
    on_boot (pyad2.ad2.AD2 attribute) -
    - - -
    on_bypass (pyad2.ad2.AD2 attribute) -
    - - -
    on_close (pyad2.ad2.AD2 attribute) -
    - -
    - -
    (pyad2.devices.Device attribute) -
    - -
    - -
    on_config_received (pyad2.ad2.AD2 attribute) -
    - - -
    on_detached (pyad2.ad2.AD2Factory attribute) -
    - - -
    on_disarm (pyad2.ad2.AD2 attribute) +
    on_attached (alarmdecoder.devices.USBDevice.DetectThread attribute)
    -
    on_fault (pyad2.zonetracking.Zonetracker attribute) +
    on_close (alarmdecoder.devices.Device attribute)
    -
    on_fire (pyad2.ad2.AD2 attribute) +
    on_detached (alarmdecoder.devices.USBDevice.DetectThread attribute)
    -
    on_low_battery (pyad2.ad2.AD2 attribute) +
    on_fault (alarmdecoder.zonetracking.Zonetracker attribute)
    -
    on_lrr_message (pyad2.ad2.AD2 attribute) +
    on_open (alarmdecoder.devices.Device attribute)
    -
    on_message (pyad2.ad2.AD2 attribute) +
    on_read (alarmdecoder.devices.Device attribute)
    -
    on_open (pyad2.ad2.AD2 attribute) -
    - -
    - -
    (pyad2.devices.Device attribute) +
    on_restore (alarmdecoder.zonetracking.Zonetracker attribute)
    -
    -
    on_panic (pyad2.ad2.AD2 attribute) +
    on_write (alarmdecoder.devices.Device attribute)
    -
    on_power_changed (pyad2.ad2.AD2 attribute) -
    - - -
    on_read (pyad2.ad2.AD2 attribute) +
    open() (alarmdecoder.devices.SerialDevice method)
    -
    (pyad2.devices.Device attribute) -
    - -
    - -
    on_relay_changed (pyad2.ad2.AD2 attribute) -
    - - -
    on_restore (pyad2.zonetracking.Zonetracker attribute) -
    - - -
    on_rfx_message (pyad2.ad2.AD2 attribute) +
    (alarmdecoder.devices.SocketDevice method)
    - -
    on_write (pyad2.ad2.AD2 attribute) -
    - -
    -
    (pyad2.devices.Device attribute) -
    - -
    - -
    on_zone_fault (pyad2.ad2.AD2 attribute) -
    - - -
    on_zone_restore (pyad2.ad2.AD2 attribute) -
    - - -
    open() (pyad2.ad2.AD2 method) -
    - -
    - -
    (pyad2.devices.SerialDevice method) -
    - - -
    (pyad2.devices.SocketDevice method) -
    - - -
    (pyad2.devices.USBDevice method) +
    (alarmdecoder.devices.USBDevice method)
    @@ -620,53 +477,21 @@ @@ -676,70 +501,66 @@
    -
    panel_data (pyad2.messages.Message attribute) -
    - - -
    partition (pyad2.messages.LRRMessage attribute) -
    - - -
    perimeter_only (pyad2.messages.Message attribute) -
    - - -
    programming_mode (pyad2.messages.Message attribute) +
    panel_data (alarmdecoder.messages.Message attribute)
    -
    pyad2.ad2 (module) -
    - - -
    pyad2.devices (module) +
    partition (alarmdecoder.messages.LRRMessage attribute)
    -
    pyad2.event (module) -
    - - -
    pyad2.event.event (module) +
    perimeter_only (alarmdecoder.messages.Message attribute)
    -
    pyad2.messages (module) -
    - - -
    pyad2.panels (module) -
    - - -
    pyad2.util (module) -
    - - -
    pyad2.zonetracking (module) +
    programming_mode (alarmdecoder.messages.Message attribute)
    -
    raw (pyad2.messages.BaseMessage attribute) +
    raw (alarmdecoder.messages.BaseMessage attribute)
    -
    read() (pyad2.devices.SerialDevice method) +
    read() (alarmdecoder.devices.SerialDevice method)
    -
    (pyad2.devices.SocketDevice method) +
    (alarmdecoder.devices.SocketDevice method)
    -
    (pyad2.devices.USBDevice method) +
    (alarmdecoder.devices.USBDevice method)
    -
    read_line() (pyad2.devices.SerialDevice method) +
    read_line() (alarmdecoder.devices.SerialDevice method)
    -
    (pyad2.devices.SocketDevice method) +
    (alarmdecoder.devices.SocketDevice method)
    -
    (pyad2.devices.USBDevice method) +
    (alarmdecoder.devices.USBDevice method)
    -
    READ_TIMEOUT (pyad2.devices.Device.ReadThread attribute) +
    READ_TIMEOUT (alarmdecoder.devices.Device.ReadThread attribute)
    -
    ready (pyad2.messages.Message attribute) +
    ready (alarmdecoder.messages.Message attribute)
    -
    reboot() (pyad2.ad2.AD2 method) -
    - - -
    RELAY (pyad2.messages.ExpanderMessage attribute) +
    RELAY (alarmdecoder.messages.ExpanderMessage attribute)
    -
    remove() (pyad2.event.event.EventHandler method) +
    remove() (alarmdecoder.event.event.EventHandler method)
    -
    RFMessage (class in pyad2.messages) +
    RFMessage (class in alarmdecoder.messages)
    -
    run() (pyad2.ad2.AD2Factory.DetectThread method) +
    run() (alarmdecoder.devices.Device.ReadThread method)
    -
    (pyad2.devices.Device.ReadThread method) +
    (alarmdecoder.devices.USBDevice.DetectThread method)
    @@ -750,101 +571,93 @@ - + @@ -854,17 +667,17 @@
    -
    save_config() (pyad2.ad2.AD2 method) -
    - - -
    send() (pyad2.ad2.AD2 method) -
    - - -
    serial_number (pyad2.devices.USBDevice attribute) +
    serial_number (alarmdecoder.devices.USBDevice attribute)
    -
    (pyad2.messages.RFMessage attribute) +
    (alarmdecoder.messages.RFMessage attribute)
    -
    SerialDevice (class in pyad2.devices) +
    SerialDevice (class in alarmdecoder.devices)
    -
    SocketDevice (class in pyad2.devices) +
    SocketDevice (class in alarmdecoder.devices)
    -
    ssl (pyad2.devices.SocketDevice attribute) +
    ssl (alarmdecoder.devices.SocketDevice attribute)
    -
    ssl_ca (pyad2.devices.SocketDevice attribute) +
    ssl_ca (alarmdecoder.devices.SocketDevice attribute)
    -
    ssl_certificate (pyad2.devices.SocketDevice attribute) +
    ssl_certificate (alarmdecoder.devices.SocketDevice attribute)
    -
    ssl_key (pyad2.devices.SocketDevice attribute) +
    ssl_key (alarmdecoder.devices.SocketDevice attribute)
    -
    STAGE_BOOT (pyad2.util.Firmware attribute) +
    STAGE_BOOT (alarmdecoder.util.Firmware attribute)
    -
    -
    STAGE_DONE (pyad2.util.Firmware attribute) +
    STAGE_DONE (alarmdecoder.util.Firmware attribute)
    -
    STAGE_LOAD (pyad2.util.Firmware attribute) +
    STAGE_LOAD (alarmdecoder.util.Firmware attribute)
    +
    -
    STAGE_START (pyad2.util.Firmware attribute) +
    STAGE_START (alarmdecoder.util.Firmware attribute)
    -
    STAGE_UPLOADING (pyad2.util.Firmware attribute) +
    STAGE_UPLOADING (alarmdecoder.util.Firmware attribute)
    -
    STAGE_WAITING (pyad2.util.Firmware attribute) +
    STAGE_WAITING (alarmdecoder.util.Firmware attribute)
    -
    start() (pyad2.ad2.AD2Factory method) +
    start_detection() (alarmdecoder.devices.USBDevice class method)
    -
    STATUS (pyad2.zonetracking.Zone attribute) +
    STATUS (alarmdecoder.zonetracking.Zone attribute)
    -
    stop() (pyad2.ad2.AD2Factory method) +
    stop() (alarmdecoder.devices.Device.ReadThread method)
    -
    (pyad2.ad2.AD2Factory.DetectThread method) +
    (alarmdecoder.devices.USBDevice.DetectThread method)
    - -
    (pyad2.devices.Device.ReadThread method) +
    + +
    stop_detection() (alarmdecoder.devices.USBDevice class method)
    -
    -
    stop_reader() (pyad2.devices.Device method) +
    stop_reader() (alarmdecoder.devices.Device method)
    -
    supervision (pyad2.messages.RFMessage attribute) +
    supervision (alarmdecoder.messages.RFMessage attribute)
    @@ -874,17 +687,21 @@
    -
    text (pyad2.messages.Message attribute) +
    text (alarmdecoder.messages.Message attribute)
    -
    TimeoutError +
    TimeoutError
    -
    type (pyad2.messages.ExpanderMessage attribute) +
    type (alarmdecoder.messages.ExpanderMessage attribute)
    @@ -894,12 +711,12 @@
    -
    update() (pyad2.zonetracking.Zonetracker method) +
    update() (alarmdecoder.zonetracking.Zonetracker method)
    -
    upload() (pyad2.util.Firmware static method) +
    upload() (alarmdecoder.util.Firmware static method)
    -
    USBDevice (class in pyad2.devices) +
    USBDevice (class in alarmdecoder.devices) +
    + + +
    USBDevice.DetectThread (class in alarmdecoder.devices)
    -
    value (pyad2.messages.ExpanderMessage attribute) +
    value (alarmdecoder.messages.ExpanderMessage attribute)
    -
    (pyad2.messages.RFMessage attribute) +
    (alarmdecoder.messages.RFMessage attribute)
    @@ -910,16 +727,16 @@
    -
    write() (pyad2.devices.SerialDevice method) +
    write() (alarmdecoder.devices.SerialDevice method)
    -
    (pyad2.devices.SocketDevice method) +
    (alarmdecoder.devices.SocketDevice method)
    -
    (pyad2.devices.USBDevice method) +
    (alarmdecoder.devices.USBDevice method)
    @@ -930,7 +747,7 @@ @@ -940,21 +757,21 @@
    -
    x (pyad2.messages.RFMessage attribute) +
    x (alarmdecoder.messages.RFMessage attribute)
    @@ -996,11 +813,11 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html index 36fe407..2caf0e4 100644 --- a/docs/_build/html/index.html +++ b/docs/_build/html/index.html @@ -6,7 +6,7 @@ - Welcome to pyad2’s documentation! — pyad2 documentation + Welcome to alarmdecoder’s documentation! — alarmdecoder documentation @@ -23,8 +23,8 @@ - - + + @@ -48,22 +48,22 @@
    -
    -

    Welcome to pyad2’s documentation!

    +
    +

    Welcome to alarmdecoder’s documentation!

    Contents:

    @@ -44,21 +44,21 @@
    -
    -

    pyad2

    +
    +

    alarmdecoder

    diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv index 9dcc5a5b43aab99f78475b5c709c89bacbc1e811..1293b301521d5e825e7a10277297e0d6ddd71467 100644 GIT binary patch delta 1276 zcmV^Tm488BK@JxG+rhDC+6Dzx( zX5)+^x81#PXbO%wp+pTy+427RLLZjxSWYVv7bTJ?3;+TT51@0M$s&WdiFMf*#aEyv zH=ifv{wD8UL>rf@-zML6Rwqnnnpcwe*@U;7)U21_Fu{mGZKI@h}w+o*53w+{= zn}0k5p))WMY@u-N74`X&w+j3*8CcXvY8Tx6KDjxUlY_M=++G**;pe|}0nTvoDvK9S z5#ctJya45ELFJ_K{4|5D6yB~ocs{!27QVMPwJ4#uwUf^SlCCKb&6>Ya0z6AM2CtE+ zibgGP8=Z|4_N>J#xK5-{+QL{#y=9$Mk$>389GGrY;?5blsvL~dYWaNIsU!;rX3Yh7 zNV^iQqpb4%uJ=a0LHht#oNbV`iV5x^tye3#KPYCa63kXw>9tcs@f;bxBiZydVkhHD z^$Fq=*++4@1e*K^3C0VxMrMDFT+zKW`HmZip3~{qn9UZCF^R)(r^{I~O+$ov8GqG# z8I0trQ>M-sZxHI^+f$RHPiEjixDH{h(`7I)t`LfpeA&1#a6EHXNNgW%y-#Oz_LMAU z%e$1#XCBI(h381$_l|lm4AM*I^Vv&+0;z?8y@Td%|FtYSS(2Ks!Gl=e|%ZD_WsDBXkI`|GU zw$V9IgmnwZR#!#VwJf0$OQT;5&vO*V(Ct7)J8DwIlq`URS2t}97$?^f3pAOMr)`9F zSouX*{GTyGM0?bci;Y*!JQ?Uj@nIw~Sl3P_BL6Mr8`e1WL6Q7O*p=AkJH96Ye}uMl z`AkE-5KJ&yJb`E^R%p8gkAHd0h4&r2Ig%RS(@wp^N{sa$E`ta~RVv+TGd>?Lv8^sB z!7ajZAo3PoRM1feIuRyFT2}8H7{o8RB|%v#<}5b6K*v*nUI$k-8NY7fN0@c#{zJ3} zr;Qgs7%W3{l6FQq8c75LpL2xqA_EOLq%sFxIkK*{t~_kDFEP@+N`Ld!{;n!B?))j^ z`#ehGhv^Rz)+ku1cWu=VN5L&u6%cifbstLHVXt|mT!^Lbx53xm%juqUYYB=pDVLFk&! zSUUe6FP14umx`N+UVlQiqYJgC%vi>ty-rG&owJIZTUIXcm|~Nu6v( zF{O7jB|z!+Y%Vzbn^UmA;>Xz{AvgrGhiO2M@16_WKF%PUUKW`AKyIA4+7dHrF-d^6Rb#4sgE3cYhM@Eh#JUIitVo mH3PZc0?AaOISp;6IX(^Y*b|dMUk6PN4n_BW0>!^a@a!=Q_G$kB delta 1497 zcmV;~1t$8|3b723C4etu)Ah(UWBsi9gkn4JFJ#1s(AnOSd50ykOuB2h#|R8E_L$C^!0!3KUuhtIdJ@l!Xnlv!Je)0} zAO7QP8AOX2nyrq^;uTq}n81cw3xS;NA>u0C$SwX5)UZ~{;M?=q3dc$`kmL9m#K_}0 zgA_l;yZ4d9T%!LfRh)0pb2$C#N3-Rl?*dU9tw*s!3UT!st*w6n=!08`ucg^Yh=rTt zLGHui9cKW2;q^2dy%N#5v3o7nQ|4?nPf~z%||3zzlOKbj_*8ER5 zjqcrl^Y8y2rSE^;(i$r3o=`(AILsk)%)`99>1q~CL!XL}md$YaY7gFf^U_XumEb)% z>%ptr(IdXz+%v>B(r~BlndwO7+?;FW8Rv+DN_Ra4%h~Ea#0sx7l8M=Yl%4jv0e43B zMDBw>4cyZPdhx@`ZOPr&NguFPnlAZ7Uad7si)1|}xuSn+(3DVd=^(l)t<_aI*K$X~ z@)t6WH*ez#TMo|d!r3a5aP>U8(lnwnxwf6ea=Ww1Z0ZU-irDUIe6nn*R_m5sQO>iA zgm(r8xM{?)E>co_;7c<{_ujD_#$;XpOc&t@u`3h6BBF0}`x%7p3`9(!+G*QZw7qaE zq=ic%%r$=ps!Kw-DpJu@NZkuM_%deY_D5BF%-32~Bm{39vMPl{6B)H?*;#*Poo-D) zTg1eNaqItuEf#dibUs}@gf82TJnx2cXDS`EH#lg@yPJlgAN-8M#dm+X3Y`jm&Q;31 zup7LWIkqk_=qJo&!1aW=3%~M;H4@CQ(Y%f$fT4ezx$gQtypua)JYq_5X^O0iw0PQr zK^H;0bf*&#(M}~W?v9OvHgY35GX%m5Ez_vN;Q6labh=wEL;R5UDoOC;UEUf~ZUH;4 zw&=0Ro~Uvzwb?k4n}vq~WSPFtS!LDC?J#B9j45`YBf863SDB{&t%DE4wsYWI9b{0l z`~QDFEdt-gsb#KZ4C6aud2nvWBb^?DZy#t#)E@o*!C*H`2y7oG5k`uy{r(<1bRHiKS>}k0;{6=qob847k)mF14vHKh)*vxNO zm9TLl*9-jVj6}7KJJGMoP;U_~_t{df6(zaLR-fEzA=Jcxa%8XUT9Wubtr$-E50Ln8 diff --git a/docs/_build/html/py-modindex.html b/docs/_build/html/py-modindex.html index a6b84f3..6064500 100644 --- a/docs/_build/html/py-modindex.html +++ b/docs/_build/html/py-modindex.html @@ -6,7 +6,7 @@ - Python Module Index — pyad2 documentation + Python Module Index — alarmdecoder documentation @@ -23,7 +23,7 @@ - + @@ -38,7 +38,7 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • @@ -51,58 +51,53 @@

    Python Module Index

    - p + a
    -
    Zone (class in pyad2.zonetracking) +
    ZONE (alarmdecoder.messages.ExpanderMessage attribute)
    -
    ZONE (pyad2.messages.ExpanderMessage attribute) +
    Zone (class in alarmdecoder.zonetracking)
    -
    zone_bypassed (pyad2.messages.Message attribute) +
    zone_bypassed (alarmdecoder.messages.Message attribute)
    -
    Zonetracker (class in pyad2.zonetracking) +
    Zonetracker (class in alarmdecoder.zonetracking)
    - + - - -
     
    - p
    + a
    - pyad2 + alarmdecoder
        - pyad2.ad2 + alarmdecoder.devices
        - pyad2.devices + alarmdecoder.event
        - pyad2.event + alarmdecoder.event.event
        - pyad2.event.event + alarmdecoder.messages
        - pyad2.messages + alarmdecoder.panels
        - pyad2.panels + alarmdecoder.util
        - pyad2.util -
        - pyad2.zonetracking + alarmdecoder.zonetracking
    @@ -138,11 +133,11 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • diff --git a/docs/_build/html/pyad2.html b/docs/_build/html/pyad2.html deleted file mode 100644 index d10174d..0000000 --- a/docs/_build/html/pyad2.html +++ /dev/null @@ -1,1521 +0,0 @@ - - - - - - - - pyad2 Package — pyad2 documentation - - - - - - - - - - - - - - - -
    -
    -
    -
    - -
    -

    pyad2 Package

    -
    -

    ad2 Module

    -

    Provides the full AD2 class and factory.

    -
    -
    -class pyad2.ad2.AD2Factory(attached_event=None, detached_event=None)[source]
    -

    Bases: object

    -

    Factory for creation of AD2USB devices as well as provides attach/detach events.”

    -
    -
    -on_attached
    -

    Called when an AD2USB device has been detected.

    -
    - -
    -
    -on_detached
    -

    Called when an AD2USB device has been removed.

    -
    - -
    -
    -classmethod find_all()[source]
    -

    Returns all AD2USB devices located on the system.

    - --- - - - - - -
    Returns:list of devices found
    Raises :CommError
    -
    - -
    -
    -classmethod devices()[source]
    -

    Returns a cached list of AD2USB devices located on the system.

    - --- - - - -
    Returns:cached list of devices found.
    -
    - -
    -
    -classmethod create(device=None)[source]
    -

    Factory method that returns the requested AD2USB device, or the first device.

    - --- - - - - - - - -
    Parameters:device (tuple) – Tuple describing the USB device to open, as returned by find_all().
    Returns:AD2USB object utilizing the specified device.
    Raises :NoDeviceError
    -
    - -
    -
    -close()[source]
    -

    Clean up and shut down.

    -
    - -
    -
    -start()[source]
    -

    Starts the detection thread, if not already running.

    -
    - -
    -
    -stop()[source]
    -

    Stops the detection thread.

    -
    - -
    -
    -get_device(device=None)[source]
    -

    Factory method that returns the requested AD2USB device, or the first device.

    - --- - - - -
    Parameters:device (tuple) – Tuple describing the USB device to open, as returned by find_all().
    -
    - -
    -
    -class DetectThread(factory)[source]
    -

    Bases: threading.Thread

    -

    Thread that handles detection of added/removed devices.

    -
    -
    -stop()[source]
    -

    Stops the thread.

    -
    - -
    -
    -run()[source]
    -

    The actual detection process.

    -
    - -
    - -
    - -
    -
    -class pyad2.ad2.AD2(device)[source]
    -

    Bases: object

    -

    High-level wrapper around AD2 devices.

    -
    -
    -on_arm
    -

    Called when the panel is armed.

    -
    - -
    -
    -on_disarm
    -

    Called when the panel is disarmed.

    -
    - -
    -
    -on_power_changed
    -

    Called when panel power switches between AC and DC.

    -
    - -
    -
    -on_alarm
    -

    Called when the alarm is triggered.

    -
    - -
    -
    -on_fire
    -

    Called when a fire is detected.

    -
    - -
    -
    -on_bypass
    -

    Called when a zone is bypassed.

    -
    - -
    -
    -on_boot
    -

    Called when the device finishes bootings.

    -
    - -
    -
    -on_config_received
    -

    Called when the device receives its configuration.

    -
    - -
    -
    -on_zone_fault
    -

    Called when the device detects a zone fault.

    -
    - -
    -
    -on_zone_restore
    -

    Called when the device detects that a fault is restored.

    -
    - -
    -
    -on_low_battery
    -

    Called when the device detects a low battery.

    -
    - -
    -
    -on_panic
    -

    Called when the device detects a panic.

    -
    - -
    -
    -on_relay_changed
    -

    Called when a relay is opened or closed on an expander board.

    -
    - -
    -
    -on_message
    -

    Called when a message has been received from the device.

    -
    - -
    -
    -on_lrr_message
    -

    Called when an LRR message is received.

    -
    - -
    -
    -on_rfx_message
    -

    Called when an RFX message is received.

    -
    - -
    -
    -on_open
    -

    Called when the device has been opened.

    -
    - -
    -
    -on_close
    -

    Called when the device has been closed.

    -
    - -
    -
    -on_read
    -

    Called when a line has been read from the device.

    -
    - -
    -
    -on_write
    -

    Called when data has been written to the device.

    -
    - -
    -
    -F1 = u'\x01\x01\x01'
    -

    Represents panel function key #1

    -
    - -
    -
    -F2 = u'\x02\x02\x02'
    -

    Represents panel function key #2

    -
    - -
    -
    -F3 = u'\x03\x03\x03'
    -

    Represents panel function key #3

    -
    - -
    -
    -F4 = u'\x04\x04\x04'
    -

    Represents panel function key #4

    -
    - -
    -
    -BATTERY_TIMEOUT = 30
    -

    Timeout before the battery status reverts.

    -
    - -
    -
    -FIRE_TIMEOUT = 30
    -

    Timeout before the fire status reverts.

    -
    - -
    -
    -id[source]
    -

    The ID of the AD2 device.

    - --- - - - -
    Returns:The identification string for the device.
    -
    - -
    -
    -open(baudrate=None, no_reader_thread=False)[source]
    -

    Opens the device.

    - --- - - - -
    Parameters:
      -
    • baudrate (int) – The baudrate used for the device.
    • -
    • no_reader_thread (bool) – Specifies whether or not the automatic reader thread should be started or not
    • -
    -
    -
    - -
    -
    -close()[source]
    -

    Closes the device.

    -
    - -
    -
    -send(data)[source]
    -

    Sends data to the AD2 device.

    - --- - - - -
    Parameters:data (str) – The data to send.
    -
    - -
    -
    -get_config()[source]
    -

    Retrieves the configuration from the device.

    -
    - -
    -
    -save_config()[source]
    -

    Sets configuration entries on the device.

    -
    - -
    -
    -reboot()[source]
    -

    Reboots the device.

    -
    - -
    -
    -fault_zone(zone, simulate_wire_problem=False)[source]
    -

    Faults a zone if we are emulating a zone expander.

    - --- - - - -
    Parameters:
      -
    • zone (int) – The zone to fault.
    • -
    • simulate_wire_problem (bool) – Whether or not to simulate a wire fault.
    • -
    -
    -
    - -
    -
    -clear_zone(zone)[source]
    -

    Clears a zone if we are emulating a zone expander.

    - --- - - - -
    Parameters:zone (int) – The zone to clear.
    -
    - -
    - -
    -
    -

    devices Module

    -

    Contains different types of devices belonging to the AD2 family.

    -
    -
    -class pyad2.devices.Device[source]
    -

    Bases: object

    -

    Generic parent device to all AD2 products.

    -
    -
    -on_open
    -

    Called when the device has been opened

    -
    - -
    -
    -on_close
    -

    Called when the device has been closed

    -
    - -
    -
    -on_read
    -

    Called when a line has been read from the device

    -
    - -
    -
    -on_write
    -

    Called when data has been written to the device

    -
    - -
    -
    -id[source]
    -

    Retrieve the device ID.

    - --- - - - -
    Returns:The identification string for the device.
    -
    - -
    -
    -is_reader_alive()[source]
    -

    Indicates whether or not the reader thread is alive.

    - --- - - - -
    Returns:Whether or not the reader thread is alive.
    -
    - -
    -
    -stop_reader()[source]
    -

    Stops the reader thread.

    -
    - -
    -
    -close()[source]
    -

    Closes the device.

    -
    - -
    -
    -class ReadThread(device)[source]
    -

    Bases: threading.Thread

    -

    Reader thread which processes messages from the device.

    -
    -
    -READ_TIMEOUT = 10
    -

    Timeout for the reader thread.

    -
    - -
    -
    -stop()[source]
    -

    Stops the running thread.

    -
    - -
    -
    -run()[source]
    -

    The actual read process.

    -
    - -
    - -
    - -
    -
    -class pyad2.devices.USBDevice(interface=(None, 0))[source]
    -

    Bases: pyad2.devices.Device

    -

    AD2USB device exposed with PyFTDI’s interface.

    -
    -
    -FTDI_VENDOR_ID = 1027
    -

    Vendor ID used to recognize AD2USB devices.

    -
    - -
    -
    -FTDI_PRODUCT_ID = 24577
    -

    Product ID used to recognize AD2USB devices.

    -
    - -
    -
    -BAUDRATE = 115200
    -

    Default baudrate for AD2USB devices.

    -
    - -
    -
    -static find_all()[source]
    -

    Returns all FTDI devices matching our vendor and product IDs.

    - --- - - - - - -
    Returns:list of devices
    Raises :CommError
    -
    - -
    -
    -interface[source]
    -

    Retrieves the interface used to connect to the device.

    - --- - - - -
    Returns:the interface used to connect to the device.
    -
    - -
    -
    -serial_number[source]
    -

    Retrieves the serial number of the device.

    - --- - - - -
    Returns:The serial number of the device.
    -
    - -
    -
    -description[source]
    -

    Retrieves the description of the device.

    - --- - - - -
    Returns:The description of the device.
    -
    - -
    -
    -open(baudrate=115200, no_reader_thread=False)[source]
    -

    Opens the device.

    - --- - - - - - -
    Parameters:
      -
    • baudrate (int) – The baudrate to use.
    • -
    • no_reader_thread (bool) – Whether or not to automatically start the reader thread.
    • -
    -
    Raises :

    NoDeviceError

    -
    -
    - -
    -
    -close()[source]
    -

    Closes the device.

    -
    - -
    -
    -write(data)[source]
    -

    Writes data to the device.

    - --- - - - - - -
    Parameters:data (str) – Data to write
    Raises :CommError
    -
    - -
    -
    -read()[source]
    -

    Reads a single character from the device.

    - --- - - - - - -
    Returns:The character read from the device.
    Raises :CommError
    -
    - -
    -
    -read_line(timeout=0.0, purge_buffer=False)[source]
    -

    Reads a line from the device.

    - --- - - - - - - - -
    Parameters:
      -
    • timeout (float) – Read timeout
    • -
    • purge_buffer (bool) – Indicates whether to purge the buffer prior to reading.
    • -
    -
    Returns:

    The line that was read.

    -
    Raises :

    CommError, TimeoutError

    -
    -
    - -
    - -
    -
    -class pyad2.devices.SerialDevice(interface=None)[source]
    -

    Bases: pyad2.devices.Device

    -

    AD2USB or AD2SERIAL device exposed with the pyserial interface.

    -
    -
    -BAUDRATE = 19200
    -

    Default baudrate for Serial devices.

    -
    - -
    -
    -static find_all(pattern=None)[source]
    -

    Returns all serial ports present.

    - --- - - - - - - - -
    Parameters:pattern (str) – Pattern to search for when retrieving serial ports.
    Returns:list of devices
    Raises :CommError
    -
    - -
    -
    -interface[source]
    -

    Retrieves the interface used to connect to the device.

    - --- - - - -
    Returns:the interface used to connect to the device.
    -
    - -
    -
    -open(baudrate=19200, no_reader_thread=False)[source]
    -

    Opens the device.

    - --- - - - - - -
    Parameters:
      -
    • baudrate (int) – The baudrate to use with the device.
    • -
    • no_reader_thread (bool) – Whether or not to automatically start the reader thread.
    • -
    -
    Raises :

    NoDeviceError

    -
    -
    - -
    -
    -close()[source]
    -

    Closes the device.

    -
    - -
    -
    -write(data)[source]
    -

    Writes data to the device.

    - --- - - - - - -
    Parameters:data (str) – The data to write.
    Raises :CommError
    -
    - -
    -
    -read()[source]
    -

    Reads a single character from the device.

    - --- - - - - - -
    Returns:The character read from the device.
    Raises :CommError
    -
    - -
    -
    -read_line(timeout=0.0, purge_buffer=False)[source]
    -

    Reads a line from the device.

    - --- - - - - - - - -
    Parameters:
      -
    • timeout (float) – The read timeout.
    • -
    • purge_buffer (bool) – Indicates whether to purge the buffer prior to reading.
    • -
    -
    Returns:

    The line read.

    -
    Raises :

    CommError, TimeoutError

    -
    -
    - -
    - -
    -
    -class pyad2.devices.SocketDevice(interface=('localhost', 10000))[source]
    -

    Bases: pyad2.devices.Device

    -

    Device that supports communication with an AD2 that is exposed via ser2sock or another -Serial to IP interface.

    -
    -
    -interface[source]
    -

    Retrieves the interface used to connect to the device.

    - --- - - - -
    Returns:the interface used to connect to the device.
    -
    - -
    -
    -ssl[source]
    -

    Retrieves whether or not the device is using SSL.

    - --- - - - -
    Returns:Whether or not the device is using SSL.
    -
    - -
    -
    -ssl_certificate[source]
    -

    Retrieves the SSL client certificate path used for authentication.

    - --- - - - -
    Returns:The certificate path
    -
    - -
    -
    -ssl_key[source]
    -

    Retrieves the SSL client certificate key used for authentication.

    - --- - - - -
    Returns:The key path
    -
    - -
    -
    -ssl_ca[source]
    -

    Retrieves the SSL Certificate Authority certificate used for authentication.

    - --- - - - -
    Returns:The CA path
    -
    - -
    -
    -open(baudrate=None, no_reader_thread=False)[source]
    -

    Opens the device.

    - --- - - - - - -
    Parameters:
      -
    • baudrate (int) – The baudrate to use
    • -
    • no_reader_thread (bool) – Whether or not to automatically open the reader thread.
    • -
    -
    Raises :

    NoDeviceError, CommError

    -
    -
    - -
    -
    -close()[source]
    -

    Closes the device.

    -
    - -
    -
    -write(data)[source]
    -

    Writes data to the device.

    - --- - - - - - - - -
    Parameters:data (str) – The data to write.
    Returns:The number of bytes sent.
    Raises :CommError
    -
    - -
    -
    -read()[source]
    -

    Reads a single character from the device.

    - --- - - - - - -
    Returns:The character read from the device.
    Raises :CommError
    -
    - -
    -
    -read_line(timeout=0.0, purge_buffer=False)[source]
    -

    Reads a line from the device.

    - --- - - - - - - - -
    Parameters:
      -
    • timeout (float) – The read timeout.
    • -
    • purge_buffer (bool) – Indicates whether to purge the buffer prior to reading.
    • -
    -
    Returns:

    The line read from the device.

    -
    Raises :

    CommError, TimeoutError

    -
    -
    - -
    - -
    -
    -

    util Module

    -

    Provides utility classes for the AD2 devices.

    -
    -
    -exception pyad2.util.NoDeviceError[source]
    -

    Bases: exceptions.Exception

    -

    No devices found.

    -
    - -
    -
    -exception pyad2.util.CommError[source]
    -

    Bases: exceptions.Exception

    -

    There was an error communicating with the device.

    -
    - -
    -
    -exception pyad2.util.TimeoutError[source]
    -

    Bases: exceptions.Exception

    -

    There was a timeout while trying to communicate with the device.

    -
    - -
    -
    -exception pyad2.util.InvalidMessageError[source]
    -

    Bases: exceptions.Exception

    -

    The format of the panel message was invalid.

    -
    - -
    -
    -class pyad2.util.Firmware[source]
    -

    Bases: object

    -

    Represents firmware for the AD2 devices.

    -
    -
    -STAGE_START = 0
    -
    - -
    -
    -STAGE_WAITING = 1
    -
    - -
    -
    -STAGE_BOOT = 2
    -
    - -
    -
    -STAGE_LOAD = 3
    -
    - -
    -
    -STAGE_UPLOADING = 4
    -
    - -
    -
    -STAGE_DONE = 5
    -
    - -
    -
    -static upload(dev, filename, progress_callback=None)[source]
    -

    Uploads firmware to an AD2 device.

    - --- - - - - - -
    Parameters:
      -
    • filename (str) – The firmware filename
    • -
    • progress_callback (function) – Callback function used to report progress.
    • -
    -
    Raises :

    util.NoDeviceError, util.TimeoutError

    -
    -
    - -
    - -
    -
    -

    zonetracking Module

    -

    Provides zone tracking functionality for the AD2 device family.

    -
    -
    -class pyad2.zonetracking.Zone(zone=0, name='', status=0)[source]
    -

    Bases: object

    -

    Representation of a panel zone.

    -
    -
    -CLEAR = 0
    -

    Status indicating that the zone is cleared.

    -
    - -
    -
    -FAULT = 1
    -

    Status indicating that the zone is faulted.

    -
    - -
    -
    -CHECK = 2
    -

    Status indicating that there is a wiring issue with the zone.

    -
    - -
    -
    -STATUS = {0: 'CLEAR', 1: 'FAULT', 2: 'CHECK'}
    -
    - -
    - -
    -
    -class pyad2.zonetracking.Zonetracker[source]
    -

    Bases: object

    -

    Handles tracking of zone and their statuses.

    -
    -
    -on_fault
    -

    Called when the device detects a zone fault.

    -
    - -
    -
    -on_restore
    -

    Called when the device detects that a fault is restored.

    -
    - -
    -
    -EXPIRE = 30
    -

    Zone expiration timeout.

    -
    - -
    -
    -update(message)[source]
    -

    Update zone statuses based on the current message.

    - --- - - - -
    Parameters:message (Message or ExpanderMessage) – Message to use to update the zone tracking.
    -
    - -
    - -
    -
    -

    panels Module

    -

    Representations of Panels and their templates.

    -
    -
    -

    messages Module

    -

    Message representations received from the panel through the AD2 devices.

    -
    -
    -class pyad2.messages.BaseMessage[source]
    -

    Bases: object

    -

    Base class for messages.

    -
    -
    -raw = None
    -

    The raw message text

    -
    - -
    - -
    -
    -class pyad2.messages.Message(data=None)[source]
    -

    Bases: pyad2.messages.BaseMessage

    -

    Represents a message from the alarm panel.

    -
    -
    -ready = False
    -

    Indicates whether or not the panel is in a ready state

    -
    - -
    -
    -armed_away = False
    -

    Indicates whether or not the panel is armed away

    -
    - -
    -
    -armed_home = False
    -

    Indicates whether or not the panel is armed home

    -
    - -
    -
    -backlight_on = False
    -

    Indicates whether or not the keypad backlight is on

    -
    - -
    -
    -programming_mode = False
    -

    Indicates whether or not we’re in programming mode

    -
    - -
    -
    -beeps = -1
    -

    Number of beeps associated with a message

    -
    - -
    -
    -zone_bypassed = False
    -

    Indicates whether or not a zone is bypassed

    -
    - -
    -
    -ac_power = False
    -

    Indicates whether or not the panel is on AC power

    -
    - -
    -
    -chime_on = False
    -

    Indicates whether or not the chime is enabled

    -
    - -
    -
    -alarm_event_occurred = False
    -

    Indicates whether or not an alarm event has occurred

    -
    - -
    -
    -alarm_sounding = False
    -

    Indicates whether or not an alarm is sounding

    -
    - -
    -
    -battery_low = False
    -

    Indicates whether or not there is a low battery

    -
    - -
    -
    -entry_delay_off = False
    -

    Indicates whether or not the entry delay is enabled

    -
    - -
    -
    -fire_alarm = False
    -

    Indicates whether or not a fire alarm is sounding

    -
    - -
    -
    -check_zone = False
    -

    Indicates whether or not there are zones that require attention.

    -
    - -
    -
    -perimeter_only = False
    -

    Indicates whether or not the perimeter is armed

    -
    - -
    -
    -numeric_code = None
    -

    The numeric code associated with the message

    -
    - -
    -
    -text = None
    -

    The human-readable text to be displayed on the panel LCD

    -
    - -
    -
    -cursor_location = -1
    -

    Current cursor location on the keypad

    -
    - -
    -
    -mask = None
    -

    Address mask this message is intended for

    -
    - -
    -
    -bitfield = None
    -

    The bitfield associated with this message

    -
    - -
    -
    -panel_data = None
    -

    The panel data field associated with this message

    -
    - -
    - -
    -
    -class pyad2.messages.ExpanderMessage(data=None)[source]
    -

    Bases: pyad2.messages.BaseMessage

    -

    Represents a message from a zone or relay expansion module.

    -
    -
    -ZONE = 0
    -

    Flag indicating that the expander message relates to a Zone Expander.

    -
    - -
    -
    -RELAY = 1
    -

    Flag indicating that the expander message relates to a Relay Expander.

    -
    - -
    -
    -type = None
    -

    Expander message type: ExpanderMessage.ZONE or ExpanderMessage.RELAY

    -
    - -
    -
    -address = -1
    -

    Address of expander

    -
    - -
    -
    -channel = -1
    -

    Channel on the expander

    -
    - -
    -
    -value = -1
    -

    Value associated with the message

    -
    - -
    - -
    -
    -class pyad2.messages.RFMessage(data=None)[source]
    -

    Bases: pyad2.messages.BaseMessage

    -

    Represents a message from an RF receiver.

    -
    -
    -x = 3
    -
    - -
    -
    -serial_number = None
    -

    Serial number of the RF device

    -
    - -
    -
    -value = -1
    -

    Value associated with this message

    -
    - -
    -
    -battery = False
    -

    Battery low indication

    -
    - -
    -
    -supervision = False
    -

    Supervision required indication

    -
    - -
    -
    -loop = [False, False, False, False]
    -

    Loop indicators

    -
    - -
    - -
    -
    -class pyad2.messages.LRRMessage(data=None)[source]
    -

    Bases: pyad2.messages.BaseMessage

    -

    Represent a message from a Long Range Radio.

    -
    -
    -event_data = None
    -

    Data associated with the LRR message. Usually user ID or zone.

    -
    - -
    -
    -partition = -1
    -

    The partition that this message applies to

    -
    - -
    -
    -event_type = None
    -

    The type of the event that occurred

    -
    - -
    - -
    -
    -

    Subpackages

    - -
    -
    - - -
    -
    -
    -
    -
    -

    Table Of Contents

    - - -

    Previous topic

    -

    Welcome to pyad2’s documentation!

    -

    Next topic

    -

    event Package

    -

    This Page

    - - - -
    -
    -
    -
    - - - - \ No newline at end of file diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html index 44fd20c..7fcf164 100644 --- a/docs/_build/html/search.html +++ b/docs/_build/html/search.html @@ -6,7 +6,7 @@ - Search — pyad2 documentation + Search — alarmdecoder documentation @@ -24,7 +24,7 @@ - + @@ -43,7 +43,7 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • @@ -94,11 +94,11 @@
  • modules |
  • -
  • pyad2 documentation »
  • +
  • alarmdecoder documentation »
  • diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index 525e3c1..93bf40b 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({envversion:42,terms:{represent:3,all:[3,2],code:3,on_boot:3,stage_don:3,backlight:3,depend:[],zone:3,readabl:3,send:3,program:3,x03:3,x02:3,x01:3,sent:3,x04:3,sourc:[3,2],string:3,clear_zon:3,fals:3,on_messag:3,perimeter_onli:3,util:[],lrr:3,level:3,list:3,upload:3,"try":3,emul:3,expandermessag:3,port:3,index:0,ad2seri:3,current:3,"new":2,method:3,ser2sock:3,full:3,timeouterror:3,detached_ev:3,gener:3,usbdevic:3,entry_delay_off:3,on_config_receiv:3,address:3,path:3,valu:3,fire_alarm:3,search:[0,3],sender:2,on_clos:3,prior:3,invalidmessageerror:3,via:3,appli:3,modul:[],zonetrack:[],filenam:3,famili:3,from:3,describ:3,commun:3,is_reader_al:3,handler:2,call:[3,2],type:3,relat:3,stage_boot:3,flag:3,relai:3,actual:3,cach:3,serialdevic:3,must:2,none:[3,2],retriev:3,on_restor:3,restor:3,dev:3,can:2,aliv:3,backlight_on:3,process:3,templat:3,high:3,cursor_loc:3,serial:3,occur:3,delai:3,progress_callback:3,anoth:3,simulate_wire_problem:3,write:3,purg:3,instead:2,panic:3,updat:3,product:3,recogn:3,ftdi:3,befor:3,attent:3,data:3,classmethod:3,ssl_ca:3,issu:3,callback:3,"switch":3,socketdevic:3,disarm:3,through:3,vari:[],paramet:3,raw:3,usb:3,bypass:3,on_read:3,"return":3,handl:3,on_bypass:3,detach:3,name:3,revert:3,on_pan:3,authent:3,stage_wait:3,mode:3,timeout:3,found:3,rfx:3,nodeviceerror:3,"static":3,connect:3,our:3,read_lin:3,event:[],reboot:3,content:0,reader:3,factori:3,shut:3,written:3,fixm:[],base:[3,2],"byte":3,armed_hom:3,on_detach:3,thread:3,readthread:3,get_config:3,on_rfx_messag:3,find_al:3,ad2usb:3,first:3,oper:2,rang:3,attached_ev:3,number:3,alreadi:3,messag:[],on_writ:3,open:3,on_power_chang:3,differ:3,associ:3,system:3,wrapper:3,attach:3,on_open:3,battery_low:3,specifi:3,rfmessag:3,on_fir:3,provid:3,remov:[3,2],charact:3,str:3,save_config:3,bitfield:3,packag:[],on_fault:3,expir:3,programming_mod:3,also:2,which:3,event_data:3,channel:3,thi:3,supervis:3,buffer:3,object:[3,2],detect:3,basemessag:3,"class":[3,2],armed_awai:3,doc:2,clear:3,request:3,on_low_batteri:3,clean:3,text:3,ssl_kei:3,radio:3,locat:3,configur:3,fault_zon:3,should:3,serial_numb:3,stop:3,ssl:3,report:3,requir:3,enabl:3,earg:2,whether:3,partit:3,contain:3,alarm_event_occur:3,certif:3,set:3,keypad:3,ac_pow:3,on_alarm:3,perimet:3,close:3,arm:3,stop_read:3,pyseri:3,statu:3,wire:3,parent:3,pattern:3,state:3,between:3,progress:3,awai:3,kei:3,numer:3,fault:3,batteri:3,on_attach:3,detectthread:3,devic:[],been:3,beep:3,get_devic:3,trigger:3,no_reader_thread:3,fire:[3,2],commerror:3,chime_on:3,func:2,present:3,sound:3,check_zon:3,cursor:3,defin:2,"while":3,stage_upload:3,error:3,loop:3,readi:3,itself:2,ftdi_vendor_id:3,on_zone_fault:3,alarm_sound:3,panel_data:3,author:3,receiv:3,belong:3,status:3,finish:3,ad2factori:3,expans:3,rais:3,user:3,expand:3,subpackag:[],entri:3,well:3,client:3,zone_bypass:3,usual:3,when:3,human:3,baudrat:3,expos:3,on_disarm:3,except:3,identif:3,add:2,board:3,match:3,vendor:3,around:3,format:3,read:3,numeric_cod:3,lcd:3,ad2:[],like:2,singl:3,page:0,creation:3,fire_timeout:3,home:3,pyftdi:3,localhost:3,run:3,power:3,event_typ:3,stage_load:3,ssl_certif:3,panel:[],obj:2,simul:3,stage_start:3,"float":3,automat:3,down:3,chime:3,support:3,on_relay_chang:3,"long":3,start:3,interfac:3,low:3,"function":[3,2],tupl:3,eventhandl:2,line:3,"default":3,displai:3,purge_buff:3,alarm:3,creat:3,"int":3,mask:3,repres:3,on_zone_restor:3,exist:2,read_timeout:3,ftdi_product_id:3,check:3,probabl:[],battery_timeout:3,boot:3,invalid:3,field:3,bool:3,you:2,intend:3,firmwar:3,track:3,on_arm:3,descript:3,lrrmessag:3,on_lrr_messag:3},objtypes:{"0":"py:module","1":"py:attribute","2":"py:method","3":"py:class","4":"py:staticmethod","5":"py:classmethod","6":"py:exception"},objnames:{"0":["py","module","Python module"],"1":["py","attribute","Python attribute"],"2":["py","method","Python method"],"3":["py","class","Python class"],"4":["py","staticmethod","Python static method"],"5":["py","classmethod","Python class method"],"6":["py","exception","Python exception"]},filenames:["index","modules","pyad2.event","pyad2"],titles:["Welcome to pyad2’s documentation!","pyad2","event Package","pyad2 Package"],objects:{"pyad2.messages":{Message:[3,3,1,""],BaseMessage:[3,3,1,""],RFMessage:[3,3,1,""],ExpanderMessage:[3,3,1,""],LRRMessage:[3,3,1,""]},"pyad2.messages.LRRMessage":{partition:[3,1,1,""],event_type:[3,1,1,""],event_data:[3,1,1,""]},"pyad2.util":{CommError:[3,6,1,""],Firmware:[3,3,1,""],TimeoutError:[3,6,1,""],NoDeviceError:[3,6,1,""],InvalidMessageError:[3,6,1,""]},pyad2:{ad2:[3,0,1,""],zonetracking:[3,0,1,""],messages:[3,0,1,""],devices:[3,0,1,""],util:[3,0,1,""],panels:[3,0,1,""],event:[2,0,1,""]},"pyad2.devices":{Device:[3,3,1,""],SocketDevice:[3,3,1,""],USBDevice:[3,3,1,""],SerialDevice:[3,3,1,""]},"pyad2.event.event.EventHandler":{fire:[2,2,1,""],add:[2,2,1,""],remove:[2,2,1,""]},"pyad2.devices.USBDevice":{read_line:[3,2,1,""],BAUDRATE:[3,1,1,""],description:[3,1,1,""],read:[3,2,1,""],write:[3,2,1,""],find_all:[3,4,1,""],FTDI_VENDOR_ID:[3,1,1,""],serial_number:[3,1,1,""],"interface":[3,1,1,""],close:[3,2,1,""],FTDI_PRODUCT_ID:[3,1,1,""],open:[3,2,1,""]},"pyad2.event.event":{EventHandler:[2,3,1,""],Event:[2,3,1,""]},"pyad2.devices.Device":{on_read:[3,1,1,""],on_open:[3,1,1,""],ReadThread:[3,3,1,""],on_close:[3,1,1,""],on_write:[3,1,1,""],close:[3,2,1,""],stop_reader:[3,2,1,""],is_reader_alive:[3,2,1,""],id:[3,1,1,""]},"pyad2.zonetracking":{Zonetracker:[3,3,1,""],Zone:[3,3,1,""]},"pyad2.zonetracking.Zonetracker":{on_restore:[3,1,1,""],EXPIRE:[3,1,1,""],on_fault:[3,1,1,""],update:[3,2,1,""]},"pyad2.zonetracking.Zone":{STATUS:[3,1,1,""],FAULT:[3,1,1,""],CLEAR:[3,1,1,""],CHECK:[3,1,1,""]},"pyad2.util.Firmware":{STAGE_LOAD:[3,1,1,""],upload:[3,4,1,""],STAGE_WAITING:[3,1,1,""],STAGE_START:[3,1,1,""],STAGE_UPLOADING:[3,1,1,""],STAGE_BOOT:[3,1,1,""],STAGE_DONE:[3,1,1,""]},"pyad2.messages.BaseMessage":{raw:[3,1,1,""]},"pyad2.event":{event:[2,0,1,""]},"pyad2.ad2.AD2Factory":{on_attached:[3,1,1,""],get_device:[3,2,1,""],DetectThread:[3,3,1,""],create:[3,5,1,""],stop:[3,2,1,""],devices:[3,5,1,""],on_detached:[3,1,1,""],start:[3,2,1,""],find_all:[3,5,1,""],close:[3,2,1,""]},"pyad2.devices.SerialDevice":{read_line:[3,2,1,""],BAUDRATE:[3,1,1,""],read:[3,2,1,""],write:[3,2,1,""],find_all:[3,4,1,""],"interface":[3,1,1,""],close:[3,2,1,""],open:[3,2,1,""]},"pyad2.messages.ExpanderMessage":{RELAY:[3,1,1,""],ZONE:[3,1,1,""],value:[3,1,1,""],address:[3,1,1,""],type:[3,1,1,""],channel:[3,1,1,""]},"pyad2.devices.SocketDevice":{ssl_key:[3,1,1,""],ssl_certificate:[3,1,1,""],read:[3,2,1,""],read_line:[3,2,1,""],ssl_ca:[3,1,1,""],write:[3,2,1,""],ssl:[3,1,1,""],"interface":[3,1,1,""],close:[3,2,1,""],open:[3,2,1,""]},"pyad2.ad2.AD2Factory.DetectThread":{stop:[3,2,1,""],run:[3,2,1,""]},"pyad2.devices.Device.ReadThread":{READ_TIMEOUT:[3,1,1,""],run:[3,2,1,""],stop:[3,2,1,""]},"pyad2.messages.Message":{backlight_on:[3,1,1,""],alarm_event_occurred:[3,1,1,""],programming_mode:[3,1,1,""],text:[3,1,1,""],bitfield:[3,1,1,""],armed_home:[3,1,1,""],alarm_sounding:[3,1,1,""],ready:[3,1,1,""],zone_bypassed:[3,1,1,""],panel_data:[3,1,1,""],check_zone:[3,1,1,""],numeric_code:[3,1,1,""],battery_low:[3,1,1,""],chime_on:[3,1,1,""],entry_delay_off:[3,1,1,""],perimeter_only:[3,1,1,""],fire_alarm:[3,1,1,""],ac_power:[3,1,1,""],beeps:[3,1,1,""],mask:[3,1,1,""],armed_away:[3,1,1,""],cursor_location:[3,1,1,""]},"pyad2.ad2":{AD2:[3,3,1,""],AD2Factory:[3,3,1,""]},"pyad2.ad2.AD2":{on_rfx_message:[3,1,1,""],fault_zone:[3,2,1,""],on_open:[3,1,1,""],save_config:[3,2,1,""],on_relay_changed:[3,1,1,""],on_boot:[3,1,1,""],close:[3,2,1,""],open:[3,2,1,""],id:[3,1,1,""],on_power_changed:[3,1,1,""],BATTERY_TIMEOUT:[3,1,1,""],on_message:[3,1,1,""],send:[3,2,1,""],reboot:[3,2,1,""],get_config:[3,2,1,""],on_zone_restore:[3,1,1,""],on_disarm:[3,1,1,""],on_fire:[3,1,1,""],on_write:[3,1,1,""],on_read:[3,1,1,""],on_lrr_message:[3,1,1,""],clear_zone:[3,2,1,""],on_zone_fault:[3,1,1,""],on_config_received:[3,1,1,""],on_close:[3,1,1,""],on_bypass:[3,1,1,""],on_low_battery:[3,1,1,""],on_arm:[3,1,1,""],F1:[3,1,1,""],F2:[3,1,1,""],F3:[3,1,1,""],F4:[3,1,1,""],on_alarm:[3,1,1,""],on_panic:[3,1,1,""],FIRE_TIMEOUT:[3,1,1,""]},"pyad2.messages.RFMessage":{battery:[3,1,1,""],supervision:[3,1,1,""],value:[3,1,1,""],serial_number:[3,1,1,""],x:[3,1,1,""],loop:[3,1,1,""]}},titleterms:{subpackag:3,ad2:3,welcom:0,pyad2:[0,1,3],modul:[3,2],devic:3,messag:3,util:3,packag:[3,2],zonetrack:3,indic:0,tabl:0,document:0,event:2,panel:3}}) \ No newline at end of file +Search.setIndex({envversion:42,terms:{represent:1,all:[1,0],code:1,entri:1,zone_bypass:1,text:1,sent:1,recogn:1,arm:1,ssl_kei:1,socketdevic:1,through:1,human:1,stage_don:1,data:1,find:1,backlight:1,paramet:1,raw:1,current:1,baudrat:1,locat:1,expos:1,also:0,readabl:1,except:1,identif:1,whether:1,add:0,program:1,serialdevic:1,bypass:1,on_read:1,match:1,sourc:[1,0],"return":1,string:1,serial_numb:1,format:1,read:1,numeric_cod:1,stop:1,ssl:1,lcd:1,lrr:1,progress:1,report:1,detach:1,requir:1,enabl:1,ad2:1,name:1,earg:0,list:1,upload:1,authent:1,factori:1,"try":1,provid:1,expand:1,stage_wait:1,mode:1,timeout:1,contain:1,found:1,alarm_event_occur:1,expandermessag:1,page:3,certif:1,nodeviceerror:1,on_open:1,request:1,"static":1,connect:1,usbdevic:1,on_writ:1,our:1,charact:1,read_lin:1,event:1,stop_read:1,pyseri:1,index:3,statu:1,detect:1,parent:1,purge_buff:1,pattern:1,ad2seri:1,callback:1,content:3,pyftdi:1,written:1,reader:1,"new":0,awai:1,method:1,localhost:1,ser2sock:1,process:1,perimet:1,run:1,timeouterror:1,kei:1,state:1,numer:1,gener:1,stage_load:1,cursor_loc:1,entry_delay_off:1,like:0,on_clos:1,base:[1,0],ssl_certif:1,address:1,path:1,"byte":1,armed_hom:1,valu:1,describ:1,fire_alarm:1,search:[1,3],actual:1,zone:1,thread:1,fault:1,readthread:1,stage_start:1,prior:1,rais:1,loop:1,fals:1,find_al:1,ad2usb:1,first:1,oper:0,rang:1,via:1,vid:1,appli:1,keypad:1,"float":1,number:1,automat:1,filenam:1,read_timeout:1,"long":1,famili:1,batteri:1,chime:1,open:1,on_attach:1,differ:1,from:1,usb:1,commun:1,detectthread:1,support:1,system:1,been:1,beep:1,attach:1,singl:1,handler:0,call:[1,0],on_detach:1,start_detect:1,ac_pow:1,interfac:1,stage_upload:1,type:1,start:1,low:1,"function":[1,0],no_reader_thread:1,fire:[1,0],tupl:1,commerror:1,chime_on:1,specifi:1,stage_boot:1,rfmessag:1,flag:1,indic:1,relai:1,obj:0,line:1,repres:1,cach:1,present:1,must:0,sound:1,none:[1,0],sender:0,retriev:1,on_restor:1,restor:1,"default":1,remov:[1,0],purg:1,displai:1,dev:1,stop_detect:1,cursor:1,defin:0,"while":1,kwarg:0,can:0,str:1,error:1,battery_low:1,alarm:1,radio:1,expir:1,backlight_on:1,"int":1,descript:1,arg:0,pid:1,templat:1,bitfield:1,check_zon:1,on_fault:1,itself:0,exist:0,aliv:1,ftdi_vendor_id:1,home:1,close:1,vendor:1,ftdi_product_id:1,alarm_sound:1,serial:1,delai:1,readi:1,panel_data:1,progress_callback:1,author:1,receiv:1,anoth:1,belong:1,when:1,invalid:1,port:1,write:1,field:1,client:1,bool:1,which:1,occur:1,instead:0,you:0,event_data:1,channel:1,updat:1,status:1,product:1,relat:1,intend:1,firmwar:1,supervis:1,buffer:1,expans:1,decod:1,event_typ:1,ftdi:1,partit:1,perimeter_onli:1,wire:1,power:1,user:1,attent:1,basemessag:1,eventhandl:0,associ:1,"class":[1,0],check:1,armed_awai:1,handl:1,classmethod:1,doc:0,clear:1,mask:1,object:[1,0],ssl_ca:1,issu:1,lrrmessag:1,is_reader_al:1,thi:1,programming_mod:1,track:1,func:0,invalidmessageerror:1,usual:1},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:attribute","4":"py:classmethod","5":"py:exception","6":"py:staticmethod"},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","attribute","Python attribute"],"4":["py","classmethod","Python class method"],"5":["py","exception","Python exception"],"6":["py","staticmethod","Python static method"]},filenames:["alarmdecoder.event","alarmdecoder","modules","index"],titles:["event Package","alarmdecoder Package","alarmdecoder","Welcome to alarmdecoder’s documentation!"],objects:{"alarmdecoder.messages.LRRMessage":{partition:[1,3,1,""],event_data:[1,3,1,""],event_type:[1,3,1,""]},"alarmdecoder.messages.BaseMessage":{raw:[1,3,1,""]},"alarmdecoder.messages.ExpanderMessage":{RELAY:[1,3,1,""],ZONE:[1,3,1,""],value:[1,3,1,""],address:[1,3,1,""],type:[1,3,1,""],channel:[1,3,1,""]},"alarmdecoder.event.event":{EventHandler:[0,1,1,""],Event:[0,1,1,""]},"alarmdecoder.zonetracking.Zone":{STATUS:[1,3,1,""],FAULT:[1,3,1,""],CLEAR:[1,3,1,""],CHECK:[1,3,1,""]},"alarmdecoder.devices.SerialDevice":{write:[1,2,1,""],BAUDRATE:[1,3,1,""],read:[1,2,1,""],read_line:[1,2,1,""],find_all:[1,6,1,""],"interface":[1,3,1,""],close:[1,2,1,""],open:[1,2,1,""]},"alarmdecoder.zonetracking":{Zonetracker:[1,1,1,""],Zone:[1,1,1,""]},"alarmdecoder.zonetracking.Zonetracker":{on_restore:[1,3,1,""],EXPIRE:[1,3,1,""],update:[1,2,1,""],on_fault:[1,3,1,""]},"alarmdecoder.devices.Device.ReadThread":{READ_TIMEOUT:[1,3,1,""],stop:[1,2,1,""],run:[1,2,1,""]},"alarmdecoder.event":{event:[0,0,1,""]},"alarmdecoder.messages":{Message:[1,1,1,""],LRRMessage:[1,1,1,""],RFMessage:[1,1,1,""],ExpanderMessage:[1,1,1,""],BaseMessage:[1,1,1,""]},"alarmdecoder.devices":{Device:[1,1,1,""],SocketDevice:[1,1,1,""],USBDevice:[1,1,1,""],SerialDevice:[1,1,1,""]},"alarmdecoder.devices.USBDevice.DetectThread":{run:[1,2,1,""],stop:[1,2,1,""],on_attached:[1,3,1,""],on_detached:[1,3,1,""]},alarmdecoder:{zonetracking:[1,0,1,""],messages:[1,0,1,""],devices:[1,0,1,""],util:[1,0,1,""],panels:[1,0,1,""],event:[0,0,1,""]},"alarmdecoder.devices.SocketDevice":{ssl_certificate:[1,3,1,""],ssl_key:[1,3,1,""],read:[1,2,1,""],ssl_ca:[1,3,1,""],read_line:[1,2,1,""],ssl:[1,3,1,""],write:[1,2,1,""],"interface":[1,3,1,""],close:[1,2,1,""],open:[1,2,1,""]},"alarmdecoder.devices.USBDevice":{write:[1,2,1,""],BAUDRATE:[1,3,1,""],description:[1,3,1,""],read:[1,2,1,""],DetectThread:[1,1,1,""],stop_detection:[1,4,1,""],devices:[1,4,1,""],start_detection:[1,4,1,""],read_line:[1,2,1,""],find_all:[1,4,1,""],FTDI_VENDOR_ID:[1,3,1,""],serial_number:[1,3,1,""],"interface":[1,3,1,""],close:[1,2,1,""],FTDI_PRODUCT_ID:[1,3,1,""],open:[1,2,1,""],find:[1,4,1,""]},"alarmdecoder.messages.Message":{backlight_on:[1,3,1,""],alarm_event_occurred:[1,3,1,""],programming_mode:[1,3,1,""],text:[1,3,1,""],bitfield:[1,3,1,""],armed_home:[1,3,1,""],alarm_sounding:[1,3,1,""],ready:[1,3,1,""],zone_bypassed:[1,3,1,""],panel_data:[1,3,1,""],check_zone:[1,3,1,""],numeric_code:[1,3,1,""],battery_low:[1,3,1,""],chime_on:[1,3,1,""],entry_delay_off:[1,3,1,""],perimeter_only:[1,3,1,""],fire_alarm:[1,3,1,""],ac_power:[1,3,1,""],beeps:[1,3,1,""],mask:[1,3,1,""],armed_away:[1,3,1,""],cursor_location:[1,3,1,""]},"alarmdecoder.devices.Device":{stop_reader:[1,2,1,""],on_open:[1,3,1,""],on_write:[1,3,1,""],ReadThread:[1,1,1,""],on_close:[1,3,1,""],on_read:[1,3,1,""],close:[1,2,1,""],is_reader_alive:[1,2,1,""],id:[1,3,1,""]},"alarmdecoder.messages.RFMessage":{battery:[1,3,1,""],value:[1,3,1,""],supervision:[1,3,1,""],serial_number:[1,3,1,""],x:[1,3,1,""],loop:[1,3,1,""]},"alarmdecoder.event.event.EventHandler":{fire:[0,2,1,""],add:[0,2,1,""],remove:[0,2,1,""]},"alarmdecoder.util.Firmware":{STAGE_LOAD:[1,3,1,""],upload:[1,6,1,""],STAGE_BOOT:[1,3,1,""],STAGE_START:[1,3,1,""],STAGE_UPLOADING:[1,3,1,""],STAGE_WAITING:[1,3,1,""],STAGE_DONE:[1,3,1,""]},"alarmdecoder.util":{CommError:[1,5,1,""],Firmware:[1,1,1,""],TimeoutError:[1,5,1,""],NoDeviceError:[1,5,1,""],InvalidMessageError:[1,5,1,""]}},titleterms:{subpackag:1,alarmdecod:[1,2,3],welcom:3,modul:[1,0],devic:1,zonetrack:1,util:1,packag:[1,0],messag:1,indic:3,tabl:3,document:3,event:0,panel:1}}) \ No newline at end of file diff --git a/docs/_build/html/_sources/pyad2.event.txt b/docs/alarmdecoder.event.rst similarity index 75% rename from docs/_build/html/_sources/pyad2.event.txt rename to docs/alarmdecoder.event.rst index 9f2c38b..5d72fd9 100644 --- a/docs/_build/html/_sources/pyad2.event.txt +++ b/docs/alarmdecoder.event.rst @@ -4,7 +4,7 @@ event Package :mod:`event` Package -------------------- -.. automodule:: pyad2.event +.. automodule:: alarmdecoder.event :members: :undoc-members: :show-inheritance: @@ -12,7 +12,7 @@ event Package :mod:`event` Module ------------------- -.. automodule:: pyad2.event.event +.. automodule:: alarmdecoder.event.event :members: :undoc-members: :show-inheritance: diff --git a/docs/_build/html/_sources/pyad2.txt b/docs/alarmdecoder.rst similarity index 68% rename from docs/_build/html/_sources/pyad2.txt rename to docs/alarmdecoder.rst index 8bb0c11..36fe308 100644 --- a/docs/_build/html/_sources/pyad2.txt +++ b/docs/alarmdecoder.rst @@ -1,10 +1,10 @@ -pyad2 Package +alarmdecoder Package ================ -:mod:`ad2` Module +:mod:`alarmdecoder` Module -------------------- -.. automodule:: pyad2.ad2 +.. automodule:: alarmdecoder.alarmdecoder :members: :undoc-members: :show-inheritance: @@ -12,7 +12,7 @@ pyad2 Package :mod:`devices` Module --------------------- -.. automodule:: pyad2.devices +.. automodule:: alarmdecoder.devices :members: :undoc-members: :show-inheritance: @@ -20,7 +20,7 @@ pyad2 Package :mod:`util` Module ------------------ -.. automodule:: pyad2.util +.. automodule:: alarmdecoder.util :members: :undoc-members: :show-inheritance: @@ -28,7 +28,7 @@ pyad2 Package :mod:`zonetracking` Module -------------------------- -.. automodule:: pyad2.zonetracking +.. automodule:: alarmdecoder.zonetracking :members: :undoc-members: :show-inheritance: @@ -36,7 +36,7 @@ pyad2 Package :mod:`panels` Module -------------------- -.. automodule:: pyad2.panels +.. automodule:: alarmdecoder.panels :members: :undoc-members: :show-inheritance: @@ -44,7 +44,7 @@ pyad2 Package :mod:`messages` Module ---------------------- -.. automodule:: pyad2.messages +.. automodule:: alarmdecoder.messages :members: :undoc-members: :show-inheritance: @@ -54,5 +54,5 @@ Subpackages .. toctree:: - pyad2.event + alarmdecoder.event