From 5b3e7cbe5c9ced70fe1dddc0214f0441bed709c1 Mon Sep 17 00:00:00 2001 From: Apress Date: Wed, 19 Oct 2016 22:01:19 +0100 Subject: [PATCH] First commit --- 9781484217290.jpg | Bin 0 -> 6980 bytes Example Code Files/chapter1/p1helloworld.php | 5 + .../chapter2/e21Ajax_Example_JavaScript.js | 46 + .../chapter2/e22helloworldajax.html | 22 + Example Code Files/chapter2/e23ajaxdemo.css | 27 + .../chapter2/e23mobilehelloworldajax.html | 22 + .../chapter2/e24ajaxdemomobile.css | 29 + .../chapter2/e25dynamichtml.php | 8 + Example Code Files/chapter2/e26callmyself.php | 14 + Example Code Files/chapter3/e310dog.php | 57 + Example Code Files/chapter3/e311lab.php | 24 + Example Code Files/chapter3/e312dog.php | 77 + Example Code Files/chapter3/e313lab.php | 32 + Example Code Files/chapter3/e31php.ini | 1994 +++++++++++++++++ Example Code Files/chapter3/e32dog.php | 6 + Example Code Files/chapter3/e33dog.php | 11 + Example Code Files/chapter3/e34dog.php | 16 + Example Code Files/chapter3/e35lab.php | 5 + Example Code Files/chapter3/e36dog.php | 17 + Example Code Files/chapter3/e37lab.php | 9 + Example Code Files/chapter3/e38lab.php | 20 + Example Code Files/chapter3/e39dog.php | 41 + Example Code Files/chapter4/e40dog.php | 71 + Example Code Files/chapter4/e40get_breeds.js | 46 + .../chapter4/e410dog_container.php | 79 + .../chapter4/e411get_breeds.php | 45 + .../chapter4/e412dog_interface.php | 133 ++ Example Code Files/chapter4/e414lab.html | 64 + Example Code Files/chapter4/e415get_breeds.js | 46 + Example Code Files/chapter4/e416dog.php | 100 + Example Code Files/chapter4/e41lab.html | 49 + Example Code Files/chapter4/e42validator.js | 101 + Example Code Files/chapter4/e43and44lab.php | 58 + Example Code Files/chapter4/e45breeds.xml | 183 ++ Example Code Files/chapter4/e45get_breeds.php | 15 + Example Code Files/chapter4/e46lab.html | 63 + Example Code Files/chapter4/e46validator.js | 102 + Example Code Files/chapter4/e47and48dog.php | 87 + Example Code Files/chapter4/e47lab.php | 80 + .../chapter4/e49dog_applications.xml | 19 + Example Code Files/chapter5/Errors.log | 2 + Example Code Files/chapter5/e51testerror.php | 15 + .../chapter5/e52handleerror.php | 25 + Example Code Files/chapter5/e53dog.php | 107 + Example Code Files/chapter5/e54get_breeds.php | 45 + .../chapter5/e55dog_container.php | 82 + .../chapter5/e56dog_interface.php | 120 + .../chapter5/e57dog_interface.php | 136 ++ Example Code Files/chapter5/e57lab.html | 64 + .../chapter5/e58readerrorlog.php | 74 + Example Code Files/chapter5/e5breeds.xml | 183 ++ .../chapter5/e5dog_applications.xml | 18 + Example Code Files/chapter5/e5get_breeds.js | 46 + Example Code Files/chapter5/e5lab.html | 64 + Example Code Files/chapter5/e5validator.js | 102 + .../chapter6/07162015070620change.log | 1 + .../chapter6/07162015100850change.log | 3 + Example Code Files/chapter6/e54get_breeds.php | 45 + Example Code Files/chapter6/e5breeds.xml | 183 ++ Example Code Files/chapter6/e5get_breeds.js | 46 + Example Code Files/chapter6/e5validator.js | 102 + .../chapter6/e61dog_applications.xml | 28 + Example Code Files/chapter6/e61dog_data.php | 116 + Example Code Files/chapter6/e61dog_data.xml | 15 + Example Code Files/chapter6/e62testdata.php | 27 + Example Code Files/chapter6/e63dog_data.php | 175 ++ .../chapter6/e64displaychangelog.php | 184 ++ Example Code Files/chapter6/e65dog.php | 120 + .../chapter6/e65dog_applications.xml | 28 + .../chapter6/e65dog_container.php | 82 + Example Code Files/chapter6/e65dog_data.php | 175 ++ .../chapter6/e65dog_interface.php | 136 ++ Example Code Files/chapter6/e65lab.html | 64 + Example Code Files/chapter7/dog_data.xml | 15 + Example Code Files/chapter7/e54get_breeds.php | 45 + Example Code Files/chapter7/e5breeds.xml | 183 ++ Example Code Files/chapter7/e5get_breeds.js | 46 + Example Code Files/chapter7/e5validator.js | 102 + Example Code Files/chapter7/e65dog.php | 120 + .../chapter7/e65dog_container.php | 82 + Example Code Files/chapter7/e65dog_data.php | 175 ++ .../chapter7/e65dog_interface.php | 136 ++ Example Code Files/chapter7/e71lab.php | 80 + Example Code Files/chapter7/e72login.php | 82 + .../chapter7/e73registration.php | 87 + Example Code Files/chapter7/e74lab.php | 80 + Example Code Files/chapter7/e74login.php | 168 ++ .../chapter7/e74registration.php | 87 + .../chapter7/e75changepassword.php | 169 ++ .../chapter7/e7dog_applications.xml | 33 + .../chapter7/readmechapter7.txt | 7 + Example Code Files/chapter7/uidpass.xml | 19 + Example Code Files/chapter8/Errors.log | 2 + Example Code Files/chapter8/brody.jpg | Bin 0 -> 234326 bytes Example Code Files/chapter8/dog_data.xml | 15 + Example Code Files/chapter8/e23ajaxdemo.css | 30 + Example Code Files/chapter8/e54get_breeds.php | 45 + Example Code Files/chapter8/e5breeds.xml | 183 ++ Example Code Files/chapter8/e5validator.js | 102 + .../chapter8/e65dog_container.php | 82 + Example Code Files/chapter8/e65dog_data.php | 177 ++ .../chapter8/e73registration.php | 104 + Example Code Files/chapter8/e74login.php | 185 ++ .../chapter8/e75changepassword.php | 38 + .../chapter8/e7dog_applications.xml | 33 + Example Code Files/chapter8/e81getlists.js | 51 + Example Code Files/chapter8/e82lab.php | 154 ++ .../chapter8/e83dog_interface.php | 189 ++ Example Code Files/chapter8/e84dog.php | 175 ++ Example Code Files/chapter8/e85lab.php | 171 ++ .../chapter8/e86readerrorlog.php | 95 + Example Code Files/chapter8/e8ajaxcall.js | 46 + Example Code Files/chapter8/uidpass.xml | 19 + Example Code Files/chapter8/user.log | 315 +++ LICENSE.txt | 27 + README.md | 15 + contributing.md | 14 + 117 files changed, 10419 insertions(+) create mode 100644 9781484217290.jpg create mode 100644 Example Code Files/chapter1/p1helloworld.php create mode 100644 Example Code Files/chapter2/e21Ajax_Example_JavaScript.js create mode 100644 Example Code Files/chapter2/e22helloworldajax.html create mode 100644 Example Code Files/chapter2/e23ajaxdemo.css create mode 100644 Example Code Files/chapter2/e23mobilehelloworldajax.html create mode 100644 Example Code Files/chapter2/e24ajaxdemomobile.css create mode 100644 Example Code Files/chapter2/e25dynamichtml.php create mode 100644 Example Code Files/chapter2/e26callmyself.php create mode 100644 Example Code Files/chapter3/e310dog.php create mode 100644 Example Code Files/chapter3/e311lab.php create mode 100644 Example Code Files/chapter3/e312dog.php create mode 100644 Example Code Files/chapter3/e313lab.php create mode 100644 Example Code Files/chapter3/e31php.ini create mode 100644 Example Code Files/chapter3/e32dog.php create mode 100644 Example Code Files/chapter3/e33dog.php create mode 100644 Example Code Files/chapter3/e34dog.php create mode 100644 Example Code Files/chapter3/e35lab.php create mode 100644 Example Code Files/chapter3/e36dog.php create mode 100644 Example Code Files/chapter3/e37lab.php create mode 100644 Example Code Files/chapter3/e38lab.php create mode 100644 Example Code Files/chapter3/e39dog.php create mode 100644 Example Code Files/chapter4/e40dog.php create mode 100644 Example Code Files/chapter4/e40get_breeds.js create mode 100644 Example Code Files/chapter4/e410dog_container.php create mode 100644 Example Code Files/chapter4/e411get_breeds.php create mode 100644 Example Code Files/chapter4/e412dog_interface.php create mode 100644 Example Code Files/chapter4/e414lab.html create mode 100644 Example Code Files/chapter4/e415get_breeds.js create mode 100644 Example Code Files/chapter4/e416dog.php create mode 100644 Example Code Files/chapter4/e41lab.html create mode 100644 Example Code Files/chapter4/e42validator.js create mode 100644 Example Code Files/chapter4/e43and44lab.php create mode 100644 Example Code Files/chapter4/e45breeds.xml create mode 100644 Example Code Files/chapter4/e45get_breeds.php create mode 100644 Example Code Files/chapter4/e46lab.html create mode 100644 Example Code Files/chapter4/e46validator.js create mode 100644 Example Code Files/chapter4/e47and48dog.php create mode 100644 Example Code Files/chapter4/e47lab.php create mode 100644 Example Code Files/chapter4/e49dog_applications.xml create mode 100644 Example Code Files/chapter5/Errors.log create mode 100644 Example Code Files/chapter5/e51testerror.php create mode 100644 Example Code Files/chapter5/e52handleerror.php create mode 100644 Example Code Files/chapter5/e53dog.php create mode 100644 Example Code Files/chapter5/e54get_breeds.php create mode 100644 Example Code Files/chapter5/e55dog_container.php create mode 100644 Example Code Files/chapter5/e56dog_interface.php create mode 100644 Example Code Files/chapter5/e57dog_interface.php create mode 100644 Example Code Files/chapter5/e57lab.html create mode 100644 Example Code Files/chapter5/e58readerrorlog.php create mode 100644 Example Code Files/chapter5/e5breeds.xml create mode 100644 Example Code Files/chapter5/e5dog_applications.xml create mode 100644 Example Code Files/chapter5/e5get_breeds.js create mode 100644 Example Code Files/chapter5/e5lab.html create mode 100644 Example Code Files/chapter5/e5validator.js create mode 100644 Example Code Files/chapter6/07162015070620change.log create mode 100644 Example Code Files/chapter6/07162015100850change.log create mode 100644 Example Code Files/chapter6/e54get_breeds.php create mode 100644 Example Code Files/chapter6/e5breeds.xml create mode 100644 Example Code Files/chapter6/e5get_breeds.js create mode 100644 Example Code Files/chapter6/e5validator.js create mode 100644 Example Code Files/chapter6/e61dog_applications.xml create mode 100644 Example Code Files/chapter6/e61dog_data.php create mode 100644 Example Code Files/chapter6/e61dog_data.xml create mode 100644 Example Code Files/chapter6/e62testdata.php create mode 100644 Example Code Files/chapter6/e63dog_data.php create mode 100644 Example Code Files/chapter6/e64displaychangelog.php create mode 100644 Example Code Files/chapter6/e65dog.php create mode 100644 Example Code Files/chapter6/e65dog_applications.xml create mode 100644 Example Code Files/chapter6/e65dog_container.php create mode 100644 Example Code Files/chapter6/e65dog_data.php create mode 100644 Example Code Files/chapter6/e65dog_interface.php create mode 100644 Example Code Files/chapter6/e65lab.html create mode 100644 Example Code Files/chapter7/dog_data.xml create mode 100644 Example Code Files/chapter7/e54get_breeds.php create mode 100644 Example Code Files/chapter7/e5breeds.xml create mode 100644 Example Code Files/chapter7/e5get_breeds.js create mode 100644 Example Code Files/chapter7/e5validator.js create mode 100644 Example Code Files/chapter7/e65dog.php create mode 100644 Example Code Files/chapter7/e65dog_container.php create mode 100644 Example Code Files/chapter7/e65dog_data.php create mode 100644 Example Code Files/chapter7/e65dog_interface.php create mode 100644 Example Code Files/chapter7/e71lab.php create mode 100644 Example Code Files/chapter7/e72login.php create mode 100644 Example Code Files/chapter7/e73registration.php create mode 100644 Example Code Files/chapter7/e74lab.php create mode 100644 Example Code Files/chapter7/e74login.php create mode 100644 Example Code Files/chapter7/e74registration.php create mode 100644 Example Code Files/chapter7/e75changepassword.php create mode 100644 Example Code Files/chapter7/e7dog_applications.xml create mode 100644 Example Code Files/chapter7/readmechapter7.txt create mode 100644 Example Code Files/chapter7/uidpass.xml create mode 100644 Example Code Files/chapter8/Errors.log create mode 100644 Example Code Files/chapter8/brody.jpg create mode 100644 Example Code Files/chapter8/dog_data.xml create mode 100644 Example Code Files/chapter8/e23ajaxdemo.css create mode 100644 Example Code Files/chapter8/e54get_breeds.php create mode 100644 Example Code Files/chapter8/e5breeds.xml create mode 100644 Example Code Files/chapter8/e5validator.js create mode 100644 Example Code Files/chapter8/e65dog_container.php create mode 100644 Example Code Files/chapter8/e65dog_data.php create mode 100644 Example Code Files/chapter8/e73registration.php create mode 100644 Example Code Files/chapter8/e74login.php create mode 100644 Example Code Files/chapter8/e75changepassword.php create mode 100644 Example Code Files/chapter8/e7dog_applications.xml create mode 100644 Example Code Files/chapter8/e81getlists.js create mode 100644 Example Code Files/chapter8/e82lab.php create mode 100644 Example Code Files/chapter8/e83dog_interface.php create mode 100644 Example Code Files/chapter8/e84dog.php create mode 100644 Example Code Files/chapter8/e85lab.php create mode 100644 Example Code Files/chapter8/e86readerrorlog.php create mode 100644 Example Code Files/chapter8/e8ajaxcall.js create mode 100644 Example Code Files/chapter8/uidpass.xml create mode 100644 Example Code Files/chapter8/user.log create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 contributing.md diff --git a/9781484217290.jpg b/9781484217290.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e634613f3409162af25af431a936f09b9104a635 GIT binary patch literal 6980 zcmb_=2UJsSv+fQ70!S64Nz))jX+i*L22co~bg6<=5m0&)5dtD0F?4A`dI#wsT?DDp zs}QPG0YSRdX*zWn<&w7UJc)Dgb3;o)&xL@<$;l}%P%=|dF^gVdyCV88U--`e9T|uN=mdkV0z`Bm zFdYcr3UC4dh=ic+xx#;6AR;g^2`Pk(oZNBeRnvW-r*B|rWNc;q*yf3?oxPj8ho{$b?-zlugMvfegrcHj-o?hnCnRDrGPAOC za`W;F$}1|XK33P%*0p?TZENr7?D{%1JTf}=ZF~azeSTqaX?f+x>e}|s?%w{v@57_x zb6g+*{1>c$ko`}%=m@xoh>5|(kaJuhA}_)NrXwb~a+CC;f;Pm$h5o8&02zZ~RC-x6 zIaEw%>yoAGAO#~g?EAItb7+5%{l5Ww^=~2j2iSk%!UB|F5W#t1IsgvrNlZkALKH^% zC5~mE?BU)OF~QgA(>9SUNlOt&KT=B$4Hg?3=Re_rL*Aj&wh3PI+#d>QS(zW6;EuA! z8yC$w@jwut9{aV9LG{}z2d7%5ctFLD+XL`pNQ$UlysmYK2jX`8%+6lOHcyYASuyzV z{XT8#5jvrBygeJ4>2h!ybZ=Q{S`1IHTi6z|pA^0&t8<`@dwll7L@L!%uw!zE;e2I2 zSRuvYrH?8e7|Wh^!UM8Xz8ba7^|Fk^S z8a}vDN9}Z#{g0GmKgFEZWQ_1Um zyDj^O~t&4Bb%89rMkN^?+azP-Pncihvo zpsxFA5c#cBc=_$5rWXn=>`lLAhO4rXsLmEPRU5|P0l~X7&_RRZT!%x6r%E9OI9B!3 zL?M@lo#SV-zq^jPGTr^qNZBa(PP3I!j|u{0aSVwi1AZmo&9!!#0etGSdoOA#-rEWwa8B4zHq zX_t2g=UY+}ADD>;;G8okGb}a=4~#(*B8^ z;v6lA;^wb`GdI<z#W7>nEk-N1WeQyIuD7ax<_OHfiz(s<+_`x{}onW1Dk$ zU{W6su-erm*Y)!scRtlOwH!lOmPtpGU9|8Lx)TtQGk5!~p5y)%m;;+i;pH|~i6s^i zgw-TZVPa9{A-TD&WRYeYgIDd^CUQQ-rP$@jR@h$XJ50|{y^-&vD+ImwvP4FKx6;Q_Ei>c4PmXyW zrKfmQ`_LV#wZ!yQ!gtoWjy3VX_z2|}HddRb_O7mBSlLrkX6^hg^=Za06O1gubH3Mf z@j&^Yp2AVc7^)({?)+bn#S;Sqehy+BZF>P3m`xH!OrE-zC1)8u0IpEBtIhnkm;sC0 zDl}J7fCcOy`G%##?YWUAL~z#OZSfC`x1o(6KcW$ojznC%;3d)u51oSieY>W*+2z{? z-93+&(Zg=a-^U~RDrpJ2*_lhf*J9=f`Ae7Y>&oBP|0uc1k-7V?DM$l}Qi5?PF#yA7 z{QTruy?{E+>B~EKz?A6-HNG8j8itKObLTuJ`(Q|Od>_6)h)gJoV4;;Y%XcH>KnU*D zjcBu9&Uk>b=@v%#dz0Sr+wbG%dLte(2|Cup8>g+|3bA(NEh{4wO<8Ldhp30i!a6%V zMh=V5jV$$Sv$P{01Pq7A(gbbh1gdOhUCmiV#5 z0t7N8=%Sac(`a14Z)(IdQ+Ri8aNl=-d`J{+b-C&AnmSy+b{Je$9my&$I;2>vEGG#@ zVe4w8zrB9aREOgHh&AQ5v|S)GWp=+cH^Qg^i?|?^??kETHD2l(&ZySDBR~I+E(O0>1M5Q_{EIcqU;9*zQdv{fG%UC>X zTjdh8`oYc{9R(dygxaF_uZJ__@NGRT9;g+@`9DqV=Uq2Vc&?nn84gFC(V3t?BVKJg>TL2=EG>Eo(hCjQK1PbtA!1Dd|iaG;jyT+GB8l!BN zH7HLnj~ueV1I2Go+dOdBwB&R1lQcVBG(#$rJzE`~^RCN|lHKoQI*mH6p)%t!L zP4V_lc%K=ueYdaMwFb^-A)*MT1ceST%cV=)xfJ0p!&roJ$!W4UKM$tj2OiLA4=5x! zeSSf8bcxBi+W`tyd0WS;9jO4mS~K99xoXPB8XlJZaQb$<_~_E=_LI}oGHgcGVhv(Ee-lEKCMEqEkt3n zYqqKu8JQ$s{nEhP@Sx(2a%J<^fDo15+A9wJK_%Ag>G@?T^})NTuJt8eGB|yV(vwH@ zDBZ*4BFCgpjWJ|9u+5JmZpwC*1}>3=^z6WJUO@i0bk3VW7on{Lzy{S}HvT+;xZ8h+ zgu~$^4k4$Bs}m+9)fD1aWOL!c$pS-~H}1hAxWj%Yk4O7ujS0ng#6J9qIl&^+O=f=a z%f+9*7DTSsA%7@Vy?l%Zpm9Zn%#8=qKG3!qig44ql5J?j8S%ts$04GXrJi_l$84%o z|05#J&8Hz3k%R0EDnWj0Yue4|z^QJQB3BP6R`k8~nSvg>&_|kr**_rehwqUu85&=T zZPmB~vj`tTC?bli1a3GQ|GFkzAFuhj#I8EK=_VhcM1HeKv~M3$SH#VH72c2OEQ@H} zFM=~ZLU_!xEcoMrOk<&;lZEd^O5nOYIYvxlhj+@LGv0YkwgRImq?6RDS-~=0y1;1++#kd^zp^yA zDILs3`k2e@^K#7Bgjgbe@@E?@^!2NMK2~wfdPN4!gGQ-h0B6}jbqIzJRH=Jz?~y-r z)TZzGce^nyoXJ4t-5he0NQLJ0PBy*!qiHXxHKdG~8_pxn(L_Rmjc=uI2z zdVUr{6}W>)wOb2nF02Q>-;vSt8r(2Y_xU9~ch_*U{Lf zXUO}y5wPq(_>+rm2cms;UGEzd#mp5hWz47dj+D!(#|H#mQ~lM3IJl>>SK%&Exo*z8 zlSqEKVWU2@Puc}F>?_f31aQb9*D6e?QyI-bMMtCJ*wjiYuhpUq|5J#TZb{=vv=f#7S_G2Lcj=3cvr zdR`)2FEjT(OftiLy_TClsR+&}g^tXXa=FUPT|`m<)f}af_R4GGv7f8M0c)rWmiD4w zy5@@h!&b%)5Lb$LSOse#O(N-5-psg5YOY!dg;8UJ0Tq#ey=*=xDB(lvMP`3L_qi=8 zHfNu24a2RBt}2M*y9R=kZ!ZUH`)jzM^A^ziz+M|*hjhZS7p%G)^cuY((HLTtplCRo zjYOY>^E;d>Jta=@n#kT&L0@EcD@}(;Eo^d3cgX5Jl)EDQY{UA>!ZgE&9sae?Wshhc z(e8DqAy1*r+)FJU>89#EH42*iPGHmhwLSFMdyDXJC!%S>;i!W22Fw@mpu}jy$gC5jYp*ZP$Q)b4D%y;#4ST4tRvap=KI4IKm z`B2Jl)WK1D0y}`wx9i@uPqVhp(?2EVx7idh}XDvzd=~Y(o$+)cKKLZ zijj`%k59%wsf1?qE;&;xOR=ooVlFV=Pj1jb2*#F$vt&iR6VhNJ`w9ozlX52~<O4l#TADU+MJ+XfE@~2^d7Q1auU@rqD zp(&I^@tr3~Lc=nV&n0%0`E$l8DKO%OOxbL%IF;#830G;;y~OW!MCN%W)*|L^{p=vl za33vV>zVR)SkFj%eS5m-UZY}iDZX4Xmwq_}^Q}d+Zg?YG zD9jacE8H+nM7#OscXrp>U%N=@XU2=<1vAsC4$v=Ne8P;|F`P2*Qgx&HtBCk}bIqDx z#EB~7UZMiDH54d8U^)1kCj-OtrS-`ZmNlU}GlmxMi!wAdG_EeEjRpJdAFHKJf)(|b zrs>q+eTB`D5%Qjhi1eJCipSS_>rJxTuO#z|@tN+3FkkD?@O$)rd(BOrfvWcmogpS0 z;BP?D+d%bMgp1AJ8zN^KkASw*z@+So#t2*|QBGY{p%G}i2m%ap`3xYa3 ztkAo9d_*o@t`t#jxA>E@RQyc#JF;cXrUf|Edb&BtuE?`=Hg~b5kh2|Q3YEY-Okx26 zvS|(z{wtfuzH<4*yL{$6??^$05ZQnMPJ0vzNSHPe6T2MxRs`GH>551{$SvAv!FD|> zuR$qO&e88$$@<>5YSYgMpl=*)eaqUgBN8Da+OgDc;&*2!hum5Vi2BS9SalqAovumq zu~^DX<|#vK6Cr7C;R&mI^O$)0c0hGWtKb2Ns|byjTmdT|k=boCL91Qs@sR8F;Y>ed zbdo~vb1202C4F+MHP z#W$e>d`GNe7Q0+ig|3$o_#mGse1_cuZ)b{o{>v5 zLAOuwyBUw|7+1w6S9Ue^AZ(iTuzCq+o3*#VKkOfTEPdlbgSoGAlKe*J0wS8)=W)Qn zsjbJ5r>ztvp_GkdzIGAEQ@$n|CJE_jXBBCUNI#poos*?5(em_jXi%uNwafD2!r~X2 zoP~`xPQ&m6PN>MPvi;JO#Nb5c-J4uDgJpK>-F+h1OP?386j@!n=6*+?6C-xNm!$x7 zlnLu0G#7rhy<&uR?yt9L5W-Xgy0WoWJrqQw7X{R;z#UWUYF)OklkaF{n~rlvbT zJ*HcwXb8%>;i=r8fNXrIQ^FdS7sFSxsf6KA%=pM8p^JlJc_MjX%m!Swe^qJ`hub?1IE@%tmg_Cmz8fy2I0QDt{M zu}Y7@{V*u4*JH72h^&WrDn?9~FaL&!diqhOoLn7YM|=MmFYd+NZz+{YfA5l!h~YOB ILgFX>1F=&(KmY&$ literal 0 HcmV?d00001 diff --git a/Example Code Files/chapter1/p1helloworld.php b/Example Code Files/chapter1/p1helloworld.php new file mode 100644 index 0000000..6bee76b --- /dev/null +++ b/Example Code Files/chapter1/p1helloworld.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/Example Code Files/chapter2/e21Ajax_Example_JavaScript.js b/Example Code Files/chapter2/e21Ajax_Example_JavaScript.js new file mode 100644 index 0000000..5a0bbae --- /dev/null +++ b/Example Code Files/chapter2/e21Ajax_Example_JavaScript.js @@ -0,0 +1,46 @@ +function getXMLHttp() +{ +var xmlHttp; +try +{ +xmlHttp = new XMLHttpRequest(); +} +catch(e) +{ +//Internet Explorer is different than the others +try +{ +xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); +} +catch(e) +{ +try +{ +xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); +} +catch(e) +{ +alert("Old browser? Upgrade today so you can use AJAX!") +return false; +} +} +} +return xmlHttp; +} +function AjaxRequest() +{ +var xmlHttp = getXMLHttp(); +xmlHttp.onreadystatechange = function() +{ +if(xmlHttp.readyState == 4) +{ +HandleResponse(xmlHttp.responseText); +} +} +xmlHttp.open("GET", "myfirstprogram.php", true); +xmlHttp.send(null); +} +function HandleResponse(response) +{ +document.getElementById('AjaxResponse').innerHTML = response; +} \ No newline at end of file diff --git a/Example Code Files/chapter2/e22helloworldajax.html b/Example Code Files/chapter2/e22helloworldajax.html new file mode 100644 index 0000000..f7e8e9a --- /dev/null +++ b/Example Code Files/chapter2/e22helloworldajax.html @@ -0,0 +1,22 @@ + + + PHP Ajax Demo + + + + + +
+ +

"Watch it!!"

+

The words below will be replaced by "Hello World" which is pulled from the 'myfirstprogram.php' file via AJAX.

+

AJAX DEMO

+

+
+Pay attention... Notice when you click the button that only this section changes. +
+ +
+ + \ No newline at end of file diff --git a/Example Code Files/chapter2/e23ajaxdemo.css b/Example Code Files/chapter2/e23ajaxdemo.css new file mode 100644 index 0000000..ea7086d --- /dev/null +++ b/Example Code Files/chapter2/e23ajaxdemo.css @@ -0,0 +1,27 @@ +body { background-color: #000000; +font-family: Arial, Verdana, sans-serif; } +#wrapper { margin: 0 auto; +width: 85%; +min-width: 800px; +background-color: #cc0000; +color: #000066; } +#header { background-color: #ff0000; +color: #00005D; +font-size: 125%; +padding: 20px 20px 20px 160px; +background-repeat: no-repeat; } +h1 { margin-bottom: 10px; } +#content { background-color: #ffffff; +color: #000000; +padding: 10px 20px; +overflow: auto; } +#footer { font-size: 80%; +text-align: center; +padding: 5px; +background-color: #0000FF; +color: #ffffff; +clear: both;} +h2 { color: #000000; +font-family: Arial, sans-serif; } +#floatright { float: right; +margin: 10px; } \ No newline at end of file diff --git a/Example Code Files/chapter2/e23mobilehelloworldajax.html b/Example Code Files/chapter2/e23mobilehelloworldajax.html new file mode 100644 index 0000000..2c339df --- /dev/null +++ b/Example Code Files/chapter2/e23mobilehelloworldajax.html @@ -0,0 +1,22 @@ + + PHP Ajax Demo + + + + + + + +
+ +

"Watch it!!"

+

The words below will be replaced by "Hello World" which is pulled from the 'myfirstprogram.php' file via AJAX.

+

AJAX DEMO

+

+
+Pay attention... Notice when you click the button that only this section changes. +
+ +
+ \ No newline at end of file diff --git a/Example Code Files/chapter2/e24ajaxdemomobile.css b/Example Code Files/chapter2/e24ajaxdemomobile.css new file mode 100644 index 0000000..9120da3 --- /dev/null +++ b/Example Code Files/chapter2/e24ajaxdemomobile.css @@ -0,0 +1,29 @@ +body { background-color: #000000; +font-family: Arial, Verdana, sans-serif; +margin: 0; } +#wrapper { margin: 0 auto; +width: 100%; +margin: 0; +min-width: 0px; +background-color: #cc0000; +color: #000066; } +#header { background-color: #ff0000; +color: #00005D; +font-size: 100%; +padding: 0.5px 0.5px 0.5px 0.5px; } +h1 { margin: 0px; } +#content { background-color: #ffffff; +color: #000000; +padding: 0.5px 0.5px; +overflow: auto; } +#footer { font-size: 80%; +text-align: left; +padding: 0px; +background-color: #0000FF; +color: #ffffff; +clear: both;} +h2 { color: #000000; +font-family: Arial, sans-serif; +margin: 0px; } +#floatright { float: none; +margin: 0px; } \ No newline at end of file diff --git a/Example Code Files/chapter2/e25dynamichtml.php b/Example Code Files/chapter2/e25dynamichtml.php new file mode 100644 index 0000000..376db8a --- /dev/null +++ b/Example Code Files/chapter2/e25dynamichtml.php @@ -0,0 +1,8 @@ +'; +print 'My Program'; +print ''; +print '

Hello World

'; +print ''; +print ''; +?> \ No newline at end of file diff --git a/Example Code Files/chapter2/e26callmyself.php b/Example Code Files/chapter2/e26callmyself.php new file mode 100644 index 0000000..1121d6d --- /dev/null +++ b/Example Code Files/chapter2/e26callmyself.php @@ -0,0 +1,14 @@ + Hello World "; +} +else +{ +print "PHP Example"; +print "
"; +print ""; +print "
"; +print ""; +} +?> \ No newline at end of file diff --git a/Example Code Files/chapter3/e310dog.php b/Example Code Files/chapter3/e310dog.php new file mode 100644 index 0000000..abb0a28 --- /dev/null +++ b/Example Code Files/chapter3/e310dog.php @@ -0,0 +1,57 @@ +dog_name = $value : $error_message = FALSE; +return $error_message; +} +function set_dog_weight($value) +{ +$error_message = TRUE; +(ctype_digit($value) && ($value > 0 && $value <= 120)) ? $this->dog_weight = $value : $error_message = FALSE; +return $error_message; +} +function set_dog_breed($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 35) ? $this->dog_breed = $value : $error_message = FALSE; +return $error_message; +} +function set_dog_color($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 15) ? $this->dog_color = $value : $error_message = FALSE; +return $error_message; +} +// ----------------------------------------- Get Methods ------------------------------------------------------------ +function get_dog_name() +{ +return $this->dog_name; +} +function get_dog_weight() +{ +return $this->dog_weight; +} +function get_dog_breed() +{ +return $this->dog_breed; +} +function get_dog_color() +{ +return $this->dog_color; +} +function get_properties() +{ +return "$this->dog_weight,$this->dog_breed,$this->dog_color."; +} +} +?> \ No newline at end of file diff --git a/Example Code Files/chapter3/e311lab.php b/Example Code Files/chapter3/e311lab.php new file mode 100644 index 0000000..d6a19f8 --- /dev/null +++ b/Example Code Files/chapter3/e311lab.php @@ -0,0 +1,24 @@ +set_dog_name('Fred'); +print $dog_error_message == TRUE ? 'Name update successful
' : 'Name update not successful
'; + +$dog_error_message = $lab->set_dog_weight(50); +print $dog_error_message == TRUE ? 'Weight update successful
' : 'Weight update not successful
'; + +$dog_error_message = $lab->set_dog_breed('Lab'); +print $dog_error_message == TRUE ? 'Breed update successful
' : 'Breed update not successful
'; + +$dog_error_message = $lab->set_dog_color('Yellow'); +print $dog_error_message == TRUE ? 'Color update successful
' : 'Color update not successful
'; +// ------------------------------Get Properties-------------------------- +print $lab->get_dog_name() . "
"; +print $lab->get_dog_weight() . "
"; +print $lab->get_dog_breed() . "
"; +print $lab->get_dog_color() . "
"; +$dog_properties = $lab->get_properties(); +list($dog_weight, $dog_breed, $dog_color) = explode(',', $dog_properties); +print "Dog weight is $dog_weight. Dog breed is $dog_breed. Dog color is $dog_color."; +?> diff --git a/Example Code Files/chapter3/e312dog.php b/Example Code Files/chapter3/e312dog.php new file mode 100644 index 0000000..fa8ff89 --- /dev/null +++ b/Example Code Files/chapter3/e312dog.php @@ -0,0 +1,77 @@ +set_dog_name($value1) == TRUE ? 'TRUE,' : 'FALSE,'; +$breed_error = $this->set_dog_breed($value2) == TRUE ? 'TRUE,' : 'FALSE,'; +$color_error = $this->set_dog_color($value3) == TRUE ? 'TRUE,' : 'FALSE,'; +$weight_error= $this->set_dog_weight($value4) == TRUE ? 'TRUE' : 'FALSE'; + +$this->error_message = $name_error . $breed_error . $color_error . $weight_error; + +} +//------------------------------------toString-------------------------------------------------- +public function __toString() +{ + return $this->error_message; +} + +// ---------------------------------- Set Methods ---------------------------------------------- +function set_dog_name($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 20) ? $this->dog_name = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_weight($value) +{ +$error_message = TRUE; +(ctype_digit($value) && ($value > 0 && $value <= 120)) ? $this->dog_weight = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_breed($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 35) ? $this->dog_breed = $value : $error_message = FALSE; +return $this->error_message; +} +function set_dog_color($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 15) ? $this->dog_color = $value : $this->error_message = FALSE; +return $this->error_message; +} +// ----------------------------------------- Get Methods ------------------------------------------------------------ +function get_dog_name() +{ +return $this->dog_name; +} +function get_dog_weight() +{ +return $this->dog_weight; +} +function get_dog_breed() +{ +return $this->dog_breed; +} +function get_dog_color() +{ +return $this->dog_color; +} +function get_properties() +{ +return "$this->dog_weight,$this->dog_breed,$this->dog_color."; +} + + +} +?> \ No newline at end of file diff --git a/Example Code Files/chapter3/e313lab.php b/Example Code Files/chapter3/e313lab.php new file mode 100644 index 0000000..77a7f20 --- /dev/null +++ b/Example Code Files/chapter3/e313lab.php @@ -0,0 +1,32 @@ +' : 'Name update not successful
'; +print $breed_error == 'TRUE' ? 'Breed update successful
' : 'Breed update not successful
'; +print $color_error == 'TRUE' ? 'Color update successful
' : 'Color update not successful
'; +print $weight_error == 'TRUE' ? 'Weight update successful
' : 'Weight update not successful
'; + +// ------------------------------Set Properties-------------------------- +$dog_error_message = $lab->set_dog_name('Sally'); +print $dog_error_message == TRUE ? 'Name update successful
' : 'Name update not successful
'; + +$dog_error_message = $lab->set_dog_weight('5'); +print $dog_error_message == TRUE ? 'Weight update successful
' : 'Weight update not successful
'; + +$dog_error_message = $lab->set_dog_breed('Labrador'); +print $dog_error_message == TRUE ? 'Breed update successful
' : 'Breed update not successful
'; + +$dog_error_message = $lab->set_dog_color('Brown'); +print $dog_error_message == TRUE ? 'Color update successful
' : 'Color update not successful
'; +// ------------------------------Get Properties-------------------------- +print $lab->get_dog_name() . "
"; +print $lab->get_dog_weight() . "
"; +print $lab->get_dog_breed() . "
"; +print $lab->get_dog_color() . "
"; +$dog_properties = $lab->get_properties(); +list($dog_weight, $dog_breed, $dog_color) = explode(',', $dog_properties); +print "Dog weight is $dog_weight. Dog breed is $dog_breed. Dog color is $dog_color."; +?> diff --git a/Example Code Files/chapter3/e31php.ini b/Example Code Files/chapter3/e31php.ini new file mode 100644 index 0000000..a2edb5a --- /dev/null +++ b/Example Code Files/chapter3/e31php.ini @@ -0,0 +1,1994 @@ +; IMPORTANT +; ${path} is used to specify EasyPHP installation path +[PHP] + +;;;;;;;;;;;;;;;;;;; +; About php.ini ; +;;;;;;;;;;;;;;;;;;; +; PHP's initialization file, generally called php.ini, is responsible for +; configuring many of the aspects of PHP's behavior. + +; PHP attempts to find and load this configuration from a number of locations. +; The following is a summary of its search order: +; 1. SAPI module specific location. +; 2. The PHPRC environment variable. (As of PHP 5.2.0) +; 3. A number of predefined registry keys on Windows (As of PHP 5.2.0) +; 4. Current working directory (except CLI) +; 5. The web server's directory (for SAPI modules), or directory of PHP +; (otherwise in Windows) +; 6. The directory from the --with-config-file-path compile time option, or the +; Windows directory (C:\windows or C:\winnt) +; See the PHP docs for more specific information. +; http://php.net/configuration.file + +; The syntax of the file is extremely simple. Whitespace and lines +; beginning with a semicolon are silently ignored (as you probably guessed). +; Section headers (e.g. [Foo]) are also silently ignored, even though +; they might mean something in the future. + +; Directives following the section heading [PATH=/www/mysite] only +; apply to PHP files in the /www/mysite directory. Directives +; following the section heading [HOST=www.example.com] only apply to +; PHP files served from www.example.com. Directives set in these +; special sections cannot be overridden by user-defined INI files or +; at runtime. Currently, [PATH=] and [HOST=] sections only work under +; CGI/FastCGI. +; http://php.net/ini.sections + +; Directives are specified using the following syntax: +; directive = value +; Directive names are *case sensitive* - foo=bar is different from FOO=bar. +; Directives are variables used to configure PHP or PHP extensions. +; There is no name validation. If PHP can't find an expected +; directive because it is not set or is mistyped, a default value will be used. + +; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one +; of the INI constants (On, Off, True, False, Yes, No and None) or an expression +; (e.g. E_ALL & ~E_NOTICE), a quoted string ("bar"), or a reference to a +; previously set variable or directive (e.g. ${foo}) + +; Expressions in the INI file are limited to bitwise operators and parentheses: +; | bitwise OR +; ^ bitwise XOR +; & bitwise AND +; ~ bitwise NOT +; ! boolean NOT + +; Boolean flags can be turned on using the values 1, On, True or Yes. +; They can be turned off using the values 0, Off, False or No. + +; An empty string can be denoted by simply not writing anything after the equal +; sign, or by using the None keyword: + +; foo = ; sets foo to an empty string +; foo = None ; sets foo to an empty string +; foo = "None" ; sets foo to the string 'None' + +; If you use constants in your value, and these constants belong to a +; dynamically loaded extension (either a PHP extension or a Zend extension), +; you may only use these constants *after* the line that loads the extension. + +;;;;;;;;;;;;;;;;;;; +; About this file ; +;;;;;;;;;;;;;;;;;;; +; PHP comes packaged with two INI files. One that is recommended to be used +; in production environments and one that is recommended to be used in +; development environments. + +; php.ini-production contains settings which hold security, performance and +; best practices at its core. But please be aware, these settings may break +; compatibility with older or less security conscience applications. We +; recommending using the production ini in production and testing environments. + +; php.ini-development is very similar to its production variant, except it's +; much more verbose when it comes to errors. We recommending using the +; development version only in development environments as errors shown to +; application users can inadvertently leak otherwise secure information. + +; This is php.ini-development INI file. +;;;;;;;;;;;;;;;;;;; +; Quick Reference ; +;;;;;;;;;;;;;;;;;;; +; The following are all the settings which are different in either the production +; or development versions of the INIs with respect to PHP's default behavior. +; Please see the actual settings later in the document for more details as to why +; we recommend these changes in PHP's behavior. + +; display_errors +; Default Value: On +; Development Value: On +; Production Value: Off + +; display_startup_errors +; Default Value: Off +; Development Value: On +; Production Value: Off + +; error_reporting +; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED +; Development Value: E_ALL +; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT + +; html_errors +; Default Value: On +; Development Value: On +; Production value: On + +; log_errors +; Default Value: Off +; Development Value: On +; Production Value: On + +; max_input_time +; Default Value: -1 (Unlimited) +; Development Value: 60 (60 seconds) +; Production Value: 60 (60 seconds) + +; output_buffering +; Default Value: Off +; Development Value: 4096 +; Production Value: 4096 + +; register_argc_argv +; Default Value: On +; Development Value: Off +; Production Value: Off + +; request_order +; Default Value: None +; Development Value: "GP" +; Production Value: "GP" + +; session.bug_compat_42 +; Default Value: On +; Development Value: On +; Production Value: Off + +; session.bug_compat_warn +; Default Value: On +; Development Value: On +; Production Value: Off + +; session.gc_divisor +; Default Value: 100 +; Development Value: 1000 +; Production Value: 1000 + +; session.hash_bits_per_character +; Default Value: 4 +; Development Value: 5 +; Production Value: 5 + +; short_open_tag +; Default Value: On +; Development Value: Off +; Production Value: Off + +; track_errors +; Default Value: Off +; Development Value: On +; Production Value: Off + +; url_rewriter.tags +; Default Value: "a=href,area=href,frame=src,form=,fieldset=" +; Development Value: "a=href,area=href,frame=src,input=src,form=fakeentry" +; Production Value: "a=href,area=href,frame=src,input=src,form=fakeentry" + +; variables_order +; Default Value: "EGPCS" +; Development Value: "GPCS" +; Production Value: "GPCS" + +;;;;;;;;;;;;;;;;;;;; +; php.ini Options ; +;;;;;;;;;;;;;;;;;;;; +; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini" +;user_ini.filename = ".user.ini" + +; To disable this feature set this option to empty value +;user_ini.filename = + +; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes) +;user_ini.cache_ttl = 300 + +;;;;;;;;;;;;;;;;;;;; +; Language Options ; +;;;;;;;;;;;;;;;;;;;; + +; Enable the PHP scripting language engine under Apache. +; http://php.net/engine +engine = On + +; This directive determines whether or not PHP will recognize code between +; tags as PHP source which should be processed as such. It is +; generally recommended that should be used and that this feature +; should be disabled, as enabling it may result in issues when generating XML +; documents, however this remains supported for backward compatibility reasons. +; Note that this directive does not control the tags. +; http://php.net/asp-tags +asp_tags = Off + +; The number of significant digits displayed in floating point numbers. +; http://php.net/precision +precision = 14 + +; Output buffering is a mechanism for controlling how much output data +; (excluding headers and cookies) PHP should keep internally before pushing that +; data to the client. If your application's output exceeds this setting, PHP +; will send that data in chunks of roughly the size you specify. +; Turning on this setting and managing its maximum buffer size can yield some +; interesting side-effects depending on your application and web server. +; You may be able to send headers and cookies after you've already sent output +; through print or echo. You also may see performance benefits if your server is +; emitting less packets due to buffered output versus PHP streaming the output +; as it gets it. On production servers, 4096 bytes is a good setting for performance +; reasons. +; Note: Output buffering can also be controlled via Output Buffering Control +; functions. +; Possible Values: +; On = Enabled and buffer is unlimited. (Use with caution) +; Off = Disabled +; Integer = Enables the buffer and sets its maximum size in bytes. +; Note: This directive is hardcoded to Off for the CLI SAPI +; Default Value: Off +; Development Value: 4096 +; Production Value: 4096 +; http://php.net/output-buffering +output_buffering = 4096 + +; You can redirect all of the output of your scripts to a function. For +; example, if you set output_handler to "mb_output_handler", character +; encoding will be transparently converted to the specified encoding. +; Setting any output handler automatically turns on output buffering. +; Note: People who wrote portable scripts should not depend on this ini +; directive. Instead, explicitly set the output handler using ob_start(). +; Using this ini directive may cause problems unless you know what script +; is doing. +; Note: You cannot use both "mb_output_handler" with "ob_iconv_handler" +; and you cannot use both "ob_gzhandler" and "zlib.output_compression". +; Note: output_handler must be empty if this is set 'On' !!!! +; Instead you must use zlib.output_handler. +; http://php.net/output-handler +;output_handler = + +; Transparent output compression using the zlib library +; Valid values for this option are 'off', 'on', or a specific buffer size +; to be used for compression (default is 4KB) +; Note: Resulting chunk size may vary due to nature of compression. PHP +; outputs chunks that are few hundreds bytes each as a result of +; compression. If you prefer a larger chunk size for better +; performance, enable output_buffering in addition. +; Note: You need to use zlib.output_handler instead of the standard +; output_handler, or otherwise the output will be corrupted. +; http://php.net/zlib.output-compression +zlib.output_compression = Off + +; http://php.net/zlib.output-compression-level +;zlib.output_compression_level = -1 + +; You cannot specify additional output handlers if zlib.output_compression +; is activated here. This setting does the same as output_handler but in +; a different order. +; http://php.net/zlib.output-handler +;zlib.output_handler = + +; Implicit flush tells PHP to tell the output layer to flush itself +; automatically after every output block. This is equivalent to calling the +; PHP function flush() after each and every call to print() or echo() and each +; and every HTML block. Turning this option on has serious performance +; implications and is generally recommended for debugging purposes only. +; http://php.net/implicit-flush +; Note: This directive is hardcoded to On for the CLI SAPI +implicit_flush = Off + +; The unserialize callback function will be called (with the undefined class' +; name as parameter), if the unserializer finds an undefined class +; which should be instantiated. A warning appears if the specified function is +; not defined, or if the function doesn't include/implement the missing class. +; So only set this entry, if you really want to implement such a +; callback-function. +unserialize_callback_func = + +; When floats & doubles are serialized store serialize_precision significant +; digits after the floating point. The default value ensures that when floats +; are decoded with unserialize, the data will remain the same. +serialize_precision = 17 + +; open_basedir, if set, limits all file operations to the defined directory +; and below. This directive makes most sense if used in a per-directory +; or per-virtualhost web server configuration file. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +; http://php.net/open-basedir +;open_basedir = + +; This directive allows you to disable certain functions for security reasons. +; It receives a comma-delimited list of function names. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +; http://php.net/disable-functions +disable_functions = + +; This directive allows you to disable certain classes for security reasons. +; It receives a comma-delimited list of class names. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +; http://php.net/disable-classes +disable_classes = + +; Colors for Syntax Highlighting mode. Anything that's acceptable in +; would work. +; http://php.net/syntax-highlighting +;highlight.string = #DD0000 +;highlight.comment = #FF9900 +;highlight.keyword = #007700 +;highlight.default = #0000BB +;highlight.html = #000000 + +; If enabled, the request will be allowed to complete even if the user aborts +; the request. Consider enabling it if executing long requests, which may end up +; being interrupted by the user or a browser timing out. PHP's default behavior +; is to disable this feature. +; http://php.net/ignore-user-abort +;ignore_user_abort = On + +; Determines the size of the realpath cache to be used by PHP. This value should +; be increased on systems where PHP opens many files to reflect the quantity of +; the file operations performed. +; http://php.net/realpath-cache-size +;realpath_cache_size = 16k + +; Duration of time, in seconds for which to cache realpath information for a given +; file or directory. For systems with rarely changing files, consider increasing this +; value. +; http://php.net/realpath-cache-ttl +;realpath_cache_ttl = 120 + +; Enables or disables the circular reference collector. +; http://php.net/zend.enable-gc +zend.enable_gc = On + +; If enabled, scripts may be written in encodings that are incompatible with +; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such +; encodings. To use this feature, mbstring extension must be enabled. +; Default: Off +;zend.multibyte = Off + +; Allows to set the default encoding for the scripts. This value will be used +; unless "declare(encoding=...)" directive appears at the top of the script. +; Only affects if zend.multibyte is set. +; Default: "" +;zend.script_encoding = +;;;;;;;;;;;;;;;;; +; Miscellaneous ; +;;;;;;;;;;;;;;;;; + +; Decides whether PHP may expose the fact that it is installed on the server +; (e.g. by adding its signature to the Web server header). It is no security +; threat in any way, but it makes it possible to determine whether you use PHP +; on your server or not. +; http://php.net/expose-php +expose_php = On + +;;;;;;;;;;;;;;;;;;; +; Resource Limits ; +;;;;;;;;;;;;;;;;;;; + +; Maximum execution time of each script, in seconds +; http://php.net/max-execution-time +; Note: This directive is hardcoded to 0 for the CLI SAPI +max_execution_time = 30 + +; Maximum amount of time each script may spend parsing request data. It's a good +; idea to limit this time on productions servers in order to eliminate unexpectedly +; long running scripts. +; Note: This directive is hardcoded to -1 for the CLI SAPI +; Default Value: -1 (Unlimited) +; Development Value: 60 (60 seconds) +; Production Value: 60 (60 seconds) +; http://php.net/max-input-time +max_input_time = 60 + +; Maximum input variable nesting level +; http://php.net/max-input-nesting-level +;max_input_nesting_level = 64 + +; How many GET/POST/COOKIE input variables may be accepted +; max_input_vars = 1000 + +; Maximum amount of memory a script may consume (128MB) +; http://php.net/memory-limit +memory_limit = 128M + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Error handling and logging ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; This directive informs PHP of which errors, warnings and notices you would like +; it to take action for. The recommended way of setting values for this +; directive is through the use of the error level constants and bitwise +; operators. The error level constants are below here for convenience as well as +; some common settings and their meanings. +; By default, PHP is set to take action on all errors, notices and warnings EXCEPT +; those related to E_NOTICE and E_STRICT, which together cover best practices and +; recommended coding standards in PHP. For performance reasons, this is the +; recommend error reporting setting. Your production server shouldn't be wasting +; resources complaining about best practices and coding standards. That's what +; development servers and development settings are for. +; Note: The php.ini-development file has this setting as E_ALL. This +; means it pretty much reports everything which is exactly what you want during +; development and early testing. +; +; Error Level Constants: +; E_ALL - All errors and warnings (includes E_STRICT as of PHP 5.4.0) +; E_ERROR - fatal run-time errors +; E_RECOVERABLE_ERROR - almost fatal run-time errors +; E_WARNING - run-time warnings (non-fatal errors) +; E_PARSE - compile-time parse errors +; E_NOTICE - run-time notices (these are warnings which often result +; from a bug in your code, but it's possible that it was +; intentional (e.g., using an uninitialized variable and +; relying on the fact it's automatically initialized to an +; empty string) +; E_STRICT - run-time notices, enable to have PHP suggest changes +; to your code which will ensure the best interoperability +; and forward compatibility of your code +; E_CORE_ERROR - fatal errors that occur during PHP's initial startup +; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's +; initial startup +; E_COMPILE_ERROR - fatal compile-time errors +; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) +; E_USER_ERROR - user-generated error message +; E_USER_WARNING - user-generated warning message +; E_USER_NOTICE - user-generated notice message +; E_DEPRECATED - warn about code that will not work in future versions +; of PHP +; E_USER_DEPRECATED - user-generated deprecation warnings +; +; Common Values: +; E_ALL (Show all errors, warnings and notices including coding standards.) +; E_ALL & ~E_NOTICE (Show all errors, except for notices) +; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.) +; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) +; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED +; Development Value: E_ALL +; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT +; http://php.net/error-reporting +error_reporting = E_ALL + +; This directive controls whether or not and where PHP will output errors, +; notices and warnings too. Error output is very useful during development, but +; it could be very dangerous in production environments. Depending on the code +; which is triggering the error, sensitive information could potentially leak +; out of your application such as database usernames and passwords or worse. +; It's recommended that errors be logged on production servers rather than +; having the errors sent to STDOUT. +; Possible Values: +; Off = Do not display any errors +; stderr = Display errors to STDERR (affects only CGI/CLI binaries!) +; On or stdout = Display errors to STDOUT +; Default Value: On +; Development Value: On +; Production Value: Off +; http://php.net/display-errors +display_errors = On + +; The display of errors which occur during PHP's startup sequence are handled +; separately from display_errors. PHP's default behavior is to suppress those +; errors from clients. Turning the display of startup errors on can be useful in +; debugging configuration problems. But, it's strongly recommended that you +; leave this setting off on production servers. +; Default Value: Off +; Development Value: On +; Production Value: Off +; http://php.net/display-startup-errors +display_startup_errors = On + +; Besides displaying errors, PHP can also log errors to locations such as a +; server-specific log, STDERR, or a location specified by the error_log +; directive found below. While errors should not be displayed on productions +; servers they should still be monitored and logging is a great way to do that. +; Default Value: Off +; Development Value: On +; Production Value: On +; http://php.net/log-errors +log_errors = On + +; Set maximum length of log_errors. In error_log information about the source is +; added. The default is 1024 and 0 allows to not apply any maximum length at all. +; http://php.net/log-errors-max-len +log_errors_max_len = 1024 + +; Do not log repeated messages. Repeated errors must occur in same file on same +; line unless ignore_repeated_source is set true. +; http://php.net/ignore-repeated-errors +ignore_repeated_errors = Off + +; Ignore source of message when ignoring repeated messages. When this setting +; is On you will not log errors with repeated messages from different files or +; source lines. +; http://php.net/ignore-repeated-source +ignore_repeated_source = Off + +; If this parameter is set to Off, then memory leaks will not be shown (on +; stdout or in the log). This has only effect in a debug compile, and if +; error reporting includes E_WARNING in the allowed list +; http://php.net/report-memleaks +report_memleaks = On + +; This setting is on by default. +;report_zend_debug = 0 + +; Store the last error/warning message in $php_errormsg (boolean). Setting this value +; to On can assist in debugging and is appropriate for development servers. It should +; however be disabled on production servers. +; Default Value: Off +; Development Value: On +; Production Value: Off +; http://php.net/track-errors +track_errors = On + +; Turn off normal error reporting and emit XML-RPC error XML +; http://php.net/xmlrpc-errors +;xmlrpc_errors = 0 + +; An XML-RPC faultCode +;xmlrpc_error_number = 0 + +; When PHP displays or logs an error, it has the capability of formatting the +; error message as HTML for easier reading. This directive controls whether +; the error message is formatted as HTML or not. +; Note: This directive is hardcoded to Off for the CLI SAPI +; Default Value: On +; Development Value: On +; Production value: On +; http://php.net/html-errors +html_errors = On + +; If html_errors is set to On *and* docref_root is not empty, then PHP +; produces clickable error messages that direct to a page describing the error +; or function causing the error in detail. +; You can download a copy of the PHP manual from http://php.net/docs +; and change docref_root to the base URL of your local copy including the +; leading '/'. You must also specify the file extension being used including +; the dot. PHP's default behavior is to leave these settings empty, in which +; case no links to documentation are generated. +; Note: Never use this feature for production boxes. +; http://php.net/docref-root +; Examples +;docref_root = "/phpmanual/" + +; http://php.net/docref-ext +;docref_ext = .html + +; String to output before an error message. PHP's default behavior is to leave +; this setting blank. +; http://php.net/error-prepend-string +; Example: +;error_prepend_string = "" + +; String to output after an error message. PHP's default behavior is to leave +; this setting blank. +; http://php.net/error-append-string +; Example: +;error_append_string = "" + +; Log errors to specified file. PHP's default behavior is to leave this value +; empty. +; http://php.net/error-log +; Example: +;error_log = php_errors.log +; Log errors to syslog (Event Log on NT, not valid in Windows 95). +;error_log = syslog + +;windows.show_crt_warning +; Default value: 0 +; Development value: 0 +; Production value: 0 + +;;;;;;;;;;;;;;;;; +; Data Handling ; +;;;;;;;;;;;;;;;;; + +; The separator used in PHP generated URLs to separate arguments. +; PHP's default setting is "&". +; http://php.net/arg-separator.output +; Example: +;arg_separator.output = "&" + +; List of separator(s) used by PHP to parse input URLs into variables. +; PHP's default setting is "&". +; NOTE: Every character in this directive is considered as separator! +; http://php.net/arg-separator.input +; Example: +;arg_separator.input = ";&" + +; This directive determines which super global arrays are registered when PHP +; starts up. G,P,C,E & S are abbreviations for the following respective super +; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty +; paid for the registration of these arrays and because ENV is not as commonly +; used as the others, ENV is not recommended on productions servers. You +; can still get access to the environment variables through getenv() should you +; need to. +; Default Value: "EGPCS" +; Development Value: "GPCS" +; Production Value: "GPCS"; +; http://php.net/variables-order +variables_order = "GPCS" + +; This directive determines which super global data (G,P,C,E & S) should +; be registered into the super global array REQUEST. If so, it also determines +; the order in which that data is registered. The values for this directive are +; specified in the same manner as the variables_order directive, EXCEPT one. +; Leaving this value empty will cause PHP to use the value set in the +; variables_order directive. It does not mean it will leave the super globals +; array REQUEST empty. +; Default Value: None +; Development Value: "GP" +; Production Value: "GP" +; http://php.net/request-order +request_order = "GP" + +; This directive determines whether PHP registers $argv & $argc each time it +; runs. $argv contains an array of all the arguments passed to PHP when a script +; is invoked. $argc contains an integer representing the number of arguments +; that were passed when the script was invoked. These arrays are extremely +; useful when running scripts from the command line. When this directive is +; enabled, registering these variables consumes CPU cycles and memory each time +; a script is executed. For performance reasons, this feature should be disabled +; on production servers. +; Note: This directive is hardcoded to On for the CLI SAPI +; Default Value: On +; Development Value: Off +; Production Value: Off +; http://php.net/register-argc-argv +register_argc_argv = Off + +; When enabled, the ENV, REQUEST and SERVER variables are created when they're +; first used (Just In Time) instead of when the script starts. If these +; variables are not used within a script, having this directive on will result + +; in a performance gain. The PHP directive register_argc_argv must be disabled +; for this directive to have any affect. +; http://php.net/auto-globals-jit +auto_globals_jit = On + +; Whether PHP will read the POST data. +; This option is enabled by default. +; Most likely, you won't want to disable this option globally. It causes $_POST +; and $_FILES to always be empty; the only way you will be able to read the +; POST data will be through the php://input stream wrapper. This can be useful +; to proxy requests or to process the POST data in a memory efficient fashion. +; http://php.net/enable-post-data-reading +;enable_post_data_reading = Off + +; Maximum size of POST data that PHP will accept. +; Its value may be 0 to disable the limit. It is ignored if POST data reading +; is disabled through enable_post_data_reading. +; http://php.net/post-max-size +post_max_size = 8M + +; Automatically add files before PHP document. +; http://php.net/auto-prepend-file +auto_prepend_file = + +; Automatically add files after PHP document. +; http://php.net/auto-append-file +auto_append_file = + +; By default, PHP will output a character encoding using +; the Content-type: header. To disable sending of the charset, simply +; set it to be empty. +; +; PHP's built-in default is text/html +; http://php.net/default-mimetype +default_mimetype = "text/html" + +; PHP's default character set is set to empty. +; http://php.net/default-charset +;default_charset = "UTF-8" + +; Always populate the $HTTP_RAW_POST_DATA variable. PHP's default behavior is +; to disable this feature. If post reading is disabled through +; enable_post_data_reading, $HTTP_RAW_POST_DATA is *NOT* populated. +; http://php.net/always-populate-raw-post-data +;always_populate_raw_post_data = On + +;;;;;;;;;;;;;;;;;;;;;;;;; +; Paths and Directories ; +;;;;;;;;;;;;;;;;;;;;;;;;; + +; UNIX: "/path1:/path2" +;include_path = '.:/php/php_runningversion/includes' +; +; Windows: "\path1;\path2" +;include_path = '.;${path}\binaries\php\php_runningversion\includes' +; +; PHP's default setting for include_path is '.;/path/to/php/pear' +; http://php.net/include-path + +; The root of the PHP pages, used only if nonempty. +; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root +; if you are running php as a CGI under any web server (other than IIS) +; see documentation for security issues. The alternate is to use the +; cgi.force_redirect configuration below +; http://php.net/doc-root +doc_root = + +; The directory under which PHP opens the script using /~username used only +; if nonempty. +; http://php.net/user-dir +user_dir = + +; Directory in which the loadable extensions (modules) reside. +; http://php.net/extension-dir +; extension_dir = "./" +; On windows: +; extension_dir = "ext" +extension_dir = '${path}\binaries\php\php_runningversion\ext\' + +; Directory where the temporary files should be placed. +; Defaults to the system default (see sys_get_temp_dir) +sys_temp_dir = '${path}\binaries\tmp\' + +; Whether or not to enable the dl() function. The dl() function does NOT work +; properly in multithreaded servers, such as IIS or Zeus, and is automatically +; disabled on them. +; http://php.net/enable-dl +enable_dl = Off + +; cgi.force_redirect is necessary to provide security running PHP as a CGI under +; most web servers. Left undefined, PHP turns this on by default. You can +; turn it off here AT YOUR OWN RISK +; **You CAN safely turn this off for IIS, in fact, you MUST.** +; http://php.net/cgi.force-redirect +;cgi.force_redirect = 1 + +; if cgi.nph is enabled it will force cgi to always sent Status: 200 with +; every request. PHP's default behavior is to disable this feature. +;cgi.nph = 1 + +; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape +; (iPlanet) web servers, you MAY need to set an environment variable name that PHP +; will look for to know it is OK to continue execution. Setting this variable MAY +; cause security issues, KNOW WHAT YOU ARE DOING FIRST. +; http://php.net/cgi.redirect-status-env +;cgi.redirect_status_env = + +; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's +; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok +; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting +; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting +; of zero causes PHP to behave as before. Default is 1. You should fix your scripts +; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. +; http://php.net/cgi.fix-pathinfo +;cgi.fix_pathinfo=1 + +; FastCGI under IIS (on WINNT based OS) supports the ability to impersonate +; security tokens of the calling client. This allows IIS to define the +; security context that the request runs under. mod_fastcgi under Apache +; does not currently support this feature (03/17/2002) +; Set to 1 if running under IIS. Default is zero. +; http://php.net/fastcgi.impersonate +;fastcgi.impersonate = 1 + +; Disable logging through FastCGI connection. PHP's default behavior is to enable +; this feature. +;fastcgi.logging = 0 + +; cgi.rfc2616_headers configuration option tells PHP what type of headers to +; use when sending HTTP response code. If it's set 0 PHP sends Status: header that +; is supported by Apache. When this option is set to 1 PHP will send +; RFC2616 compliant header. +; Default is zero. +; http://php.net/cgi.rfc2616-headers +;cgi.rfc2616_headers = 0 + +;;;;;;;;;;;;;;;; +; File Uploads ; +;;;;;;;;;;;;;;;; + +; Whether to allow HTTP file uploads. +; http://php.net/file-uploads +file_uploads = On + +; Temporary directory for HTTP uploaded files (will use system default if not +; specified). +; http://php.net/upload-tmp-dir +upload_tmp_dir = '${path}\binaries\tmp\' + +; Maximum allowed size for uploaded files. +; http://php.net/upload-max-filesize +upload_max_filesize = 2M + +; Maximum number of files that can be uploaded via a single request +max_file_uploads = 20 + +;;;;;;;;;;;;;;;;;; +; Fopen wrappers ; +;;;;;;;;;;;;;;;;;; + +; Whether to allow the treatment of URLs (like http:// or ftp://) as files. +; http://php.net/allow-url-fopen +allow_url_fopen = On + +; Whether to allow include/require to open URLs (like http:// or ftp://) as files. +; http://php.net/allow-url-include +allow_url_include = Off + +; Define the anonymous ftp password (your email address). PHP's default setting +; for this is empty. +; http://php.net/from +;from="john@doe.com" + +; Define the User-Agent string. PHP's default setting for this is empty. +; http://php.net/user-agent +;user_agent="PHP" + +; Default timeout for socket based streams (seconds) +; http://php.net/default-socket-timeout +default_socket_timeout = 60 + +; If your scripts have to deal with files from Macintosh systems, +; or you are running on a Mac and need to deal with files from +; unix or win32 systems, setting this flag will cause PHP to +; automatically detect the EOL character in those files so that +; fgets() and file() will work regardless of the source of the file. +; http://php.net/auto-detect-line-endings +;auto_detect_line_endings = Off + +;;;;;;;;;;;;;;;;;;;;;; +; Dynamic Extensions ; +;;;;;;;;;;;;;;;;;;;;;; + +; If you wish to have an extension loaded automatically, use the following +; syntax: +; +; extension=modulename.extension +; +; For example, on Windows: +; +; extension=msql.dll +; +; ... or under UNIX: +; +; extension=msql.so +; +; ... or with a path: +; +; extension=/path/to/extension/msql.so +; +; If you only provide the name of the extension, PHP will look for it in its +; default extension directory. +; +; Windows Extensions +; Note that ODBC support is built in, so no dll is needed for it. +; Note that many DLL files are located in the extensions/ (PHP 4) ext/ (PHP 5) +; extension folders as well as the separate PECL DLL download (PHP 5). +; Be sure to appropriately set the extension_dir directive. + +;Xdebug +zend_extension = '${path}\binaries\php\php_runningversion\php_xdebug-2.2.3-5.5-vc11.dll' +xdebug.default_enable=0 +xdebug.remote_enable=1 +xdebug.remote_host=127.0.0.1 +xdebug.remote_port=9000 +xdebug.remote_handler=dbgp +xdebug.remote_mode=req +xdebug.remote_autostart = false +xdebug.dump_globals=1 +xdebug.dump=COOKIE,FILES,GET,POST,REQUEST,SERVER,SESSION +xdebug.dump.SERVER=REMOTE_ADDR,REQUEST_METHOD,REQUEST_URI +xdebug.show_local_vars=1 +xdebug.show_mem_delta=1 +xdebug.collect_includes=1 +xdebug.collect_vars=1 +xdebug.collect_params=4 +xdebug.collect_return=1 +xdebug.auto_trace=0 +xdebug.trace_options=0 +xdebug.trace_format=0 +xdebug.trace_output_dir='${path}\binaries\xdebug\trace' +xdebug.trace_output_name="trace.%t" +xdebug.profiler_enable=0 +xdebug.profiler_append=1 +xdebug.profiler_enable_trigger=1 +xdebug.profiler_output_dir='${path}\binaries\xdebug\profiler' +xdebug.profiler_output_name="cachegrind.out.%s.%t" +;/Xdebug + +extension=php_bz2.dll +extension=php_curl.dll +;extension=php_fileinfo.dll +extension=php_gd2.dll +;extension=php_gettext.dll +;extension=php_gmp.dll +;extension=php_intl.dll +;extension=php_imap.dll +;extension=php_interbase.dll +;extension=php_ldap.dll +extension=php_mbstring.dll +;extension=php_exif.dll +extension=php_mysql.dll +extension=php_mysqli.dll +;extension=php_oci8.dll +;extension=php_oci8_11g.dll +;extension=php_openssl.dll +;extension=php_pdo_firebird.dll +extension=php_pdo_mysql.dll +;extension=php_pdo_oci.dll +;extension=php_pdo_odbc.dll +;extension=php_pdo_pgsql.dll +extension=php_pdo_sqlite.dll +;extension=php_pgsql.dll +;extension=php_pspell.dll +;extension=php_shmop.dll +;extension=php_snmp.dll +;extension=php_soap.dll +extension=php_sockets.dll +;extension=php_sqlite.dll +extension=php_sqlite3.dll +;extension=php_sybase_ct.dll +;extension=php_tidy.dll +;extension=php_xmlrpc.dll +extension=php_xsl.dll + +;;;;;;;;;;;;;;;;;;; +; Module Settings ; +;;;;;;;;;;;;;;;;;;; + +[CLI Server] +; Whether the CLI web server uses ANSI color coding in its terminal output. +cli_server.color = On +[Date] +; Defines the default timezone used by the date functions +; http://php.net/date.timezone +date.timezone = Europe/Paris + +; http://php.net/date.default-latitude +;date.default_latitude = 31.7667 + +; http://php.net/date.default-longitude +;date.default_longitude = 35.2333 + +; http://php.net/date.sunrise-zenith +;date.sunrise_zenith = 90.583333 + +; http://php.net/date.sunset-zenith +;date.sunset_zenith = 90.583333 + +[filter] +; http://php.net/filter.default +;filter.default = unsafe_raw + +; http://php.net/filter.default-flags +;filter.default_flags = + +[iconv] +;iconv.input_encoding = ISO-8859-1 +;iconv.internal_encoding = ISO-8859-1 +;iconv.output_encoding = ISO-8859-1 + +[intl] +;intl.default_locale = +; This directive allows you to produce PHP errors when some error +; happens within intl functions. The value is the level of the error produced. +; Default is 0, which does not produce any errors. +;intl.error_level = E_WARNING + +[sqlite] +; http://php.net/sqlite.assoc-case +;sqlite.assoc_case = 0 + +[sqlite3] +;sqlite3.extension_dir = + +[Pcre] +;PCRE library backtracking limit. +; http://php.net/pcre.backtrack-limit +;pcre.backtrack_limit=100000 + +;PCRE library recursion limit. +;Please note that if you set this value to a high number you may consume all +;the available process stack and eventually crash PHP (due to reaching the +;stack size limit imposed by the Operating System). +; http://php.net/pcre.recursion-limit +;pcre.recursion_limit=100000 + +[Pdo] +; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" +; http://php.net/pdo-odbc.connection-pooling +;pdo_odbc.connection_pooling=strict + +;pdo_odbc.db2_instance_name + +[Pdo_mysql] +; If mysqlnd is used: Number of cache slots for the internal result set cache +; http://php.net/pdo_mysql.cache_size +pdo_mysql.cache_size = 2000 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +; http://php.net/pdo_mysql.default-socket +pdo_mysql.default_socket= + +[Phar] +; http://php.net/phar.readonly +;phar.readonly = On + +; http://php.net/phar.require-hash +;phar.require_hash = On + +;phar.cache_list = + +[mail function] +; For Win32 only. +; http://php.net/smtp +SMTP = 127.0.0.1 +; http://php.net/smtp-port +smtp_port = 25 + +; For Win32 only. +; http://php.net/sendmail-from +;sendmail_from = me@example.com + +; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). +; http://php.net/sendmail-path +;sendmail_path = + +; Force the addition of the specified parameters to be passed as extra parameters +; to the sendmail binary. These parameters will always replace the value of +; the 5th parameter to mail(), even in safe mode. +;mail.force_extra_parameters = + +; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename +mail.add_x_header = On + +; The path to a log file that will log all mail() calls. Log entries include +; the full path of the script, line number, To address and headers. +;mail.log = +; Log mail to syslog (Event Log on NT, not valid in Windows 95). +;mail.log = syslog + +[SQL] +; http://php.net/sql.safe-mode +sql.safe_mode = Off + +[ODBC] +; http://php.net/odbc.default-db +;odbc.default_db = Not yet implemented + +; http://php.net/odbc.default-user +;odbc.default_user = Not yet implemented + +; http://php.net/odbc.default-pw +;odbc.default_pw = Not yet implemented + +; Controls the ODBC cursor model. +; Default: SQL_CURSOR_STATIC (default). +;odbc.default_cursortype + +; Allow or prevent persistent links. +; http://php.net/odbc.allow-persistent +odbc.allow_persistent = On + +; Check that a connection is still valid before reuse. +; http://php.net/odbc.check-persistent +odbc.check_persistent = On + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/odbc.max-persistent +odbc.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +; http://php.net/odbc.max-links +odbc.max_links = -1 + +; Handling of LONG fields. Returns number of bytes to variables. 0 means +; passthru. +; http://php.net/odbc.defaultlrl +odbc.defaultlrl = 4096 + +; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. +; See the documentation on odbc_binmode and odbc_longreadlen for an explanation +; of odbc.defaultlrl and odbc.defaultbinmode +; http://php.net/odbc.defaultbinmode +odbc.defaultbinmode = 1 + +;birdstep.max_links = -1 + +[Interbase] +; Allow or prevent persistent links. +ibase.allow_persistent = 1 + +; Maximum number of persistent links. -1 means no limit. +ibase.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +ibase.max_links = -1 + +; Default database name for ibase_connect(). +;ibase.default_db = + +; Default username for ibase_connect(). +;ibase.default_user = + +; Default password for ibase_connect(). +;ibase.default_password = + +; Default charset for ibase_connect(). +;ibase.default_charset = + +; Default timestamp format. +ibase.timestampformat = "%Y-%m-%d %H:%M:%S" + +; Default date format. +ibase.dateformat = "%Y-%m-%d" + +; Default time format. +ibase.timeformat = "%H:%M:%S" + +[MySQL] +; Allow accessing, from PHP's perspective, local files with LOAD DATA statements +; http://php.net/mysql.allow_local_infile +mysql.allow_local_infile = On + +; Allow or prevent persistent links. +; http://php.net/mysql.allow-persistent +mysql.allow_persistent = On + +; If mysqlnd is used: Number of cache slots for the internal result set cache +; http://php.net/mysql.cache_size +mysql.cache_size = 2000 + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/mysql.max-persistent +mysql.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +; http://php.net/mysql.max-links +mysql.max_links = -1 + +; Default port number for mysql_connect(). If unset, mysql_connect() will use +; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the +; compile-time value defined MYSQL_PORT (in that order). Win32 will only look +; at MYSQL_PORT. +; http://php.net/mysql.default-port +mysql.default_port = + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +; http://php.net/mysql.default-socket +mysql.default_socket = + +; Default host for mysql_connect() (doesn't apply in safe mode). +; http://php.net/mysql.default-host +mysql.default_host = + +; Default user for mysql_connect() (doesn't apply in safe mode). +; http://php.net/mysql.default-user +mysql.default_user = + +; Default password for mysql_connect() (doesn't apply in safe mode). +; Note that this is generally a *bad* idea to store passwords in this file. +; *Any* user with PHP access can run 'echo get_cfg_var("mysql.default_password") +; and reveal this password! And of course, any users with read access to this +; file will be able to reveal the password as well. +; http://php.net/mysql.default-password +mysql.default_password = + +; Maximum time (in seconds) for connect timeout. -1 means no limit +; http://php.net/mysql.connect-timeout +mysql.connect_timeout = 60 + +; Trace mode. When trace_mode is active (=On), warnings for table/index scans and +; SQL-Errors will be displayed. +; http://php.net/mysql.trace-mode +mysql.trace_mode = Off + +[MySQLi] + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/mysqli.max-persistent +mysqli.max_persistent = -1 + +; Allow accessing, from PHP's perspective, local files with LOAD DATA statements +; http://php.net/mysqli.allow_local_infile +;mysqli.allow_local_infile = On + +; Allow or prevent persistent links. +; http://php.net/mysqli.allow-persistent +mysqli.allow_persistent = On + +; Maximum number of links. -1 means no limit. +; http://php.net/mysqli.max-links +mysqli.max_links = -1 + +; If mysqlnd is used: Number of cache slots for the internal result set cache +; http://php.net/mysqli.cache_size +mysqli.cache_size = 2000 + +; Default port number for mysqli_connect(). If unset, mysqli_connect() will use +; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the +; compile-time value defined MYSQL_PORT (in that order). Win32 will only look +; at MYSQL_PORT. +; http://php.net/mysqli.default-port +mysqli.default_port = 3306 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +; http://php.net/mysqli.default-socket +mysqli.default_socket = + +; Default host for mysql_connect() (doesn't apply in safe mode). +; http://php.net/mysqli.default-host +mysqli.default_host = + +; Default user for mysql_connect() (doesn't apply in safe mode). +; http://php.net/mysqli.default-user +mysqli.default_user = + +; Default password for mysqli_connect() (doesn't apply in safe mode). +; Note that this is generally a *bad* idea to store passwords in this file. +; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") +; and reveal this password! And of course, any users with read access to this +; file will be able to reveal the password as well. +; http://php.net/mysqli.default-pw +mysqli.default_pw = + +; Allow or prevent reconnect +mysqli.reconnect = Off + +[mysqlnd] +; Enable / Disable collection of general statistics by mysqlnd which can be +; used to tune and monitor MySQL operations. +; http://php.net/mysqlnd.collect_statistics +mysqlnd.collect_statistics = On + +; Enable / Disable collection of memory usage statistics by mysqlnd which can be +; used to tune and monitor MySQL operations. +; http://php.net/mysqlnd.collect_memory_statistics +mysqlnd.collect_memory_statistics = On + +; Size of a pre-allocated buffer used when sending commands to MySQL in bytes. +; http://php.net/mysqlnd.net_cmd_buffer_size +;mysqlnd.net_cmd_buffer_size = 2048 + +; Size of a pre-allocated buffer used for reading data sent by the server in +; bytes. +; http://php.net/mysqlnd.net_read_buffer_size +;mysqlnd.net_read_buffer_size = 32768 + +[OCI8] + +; Connection: Enables privileged connections using external +; credentials (OCI_SYSOPER, OCI_SYSDBA) +; http://php.net/oci8.privileged-connect +;oci8.privileged_connect = Off + +; Connection: The maximum number of persistent OCI8 connections per +; process. Using -1 means no limit. +; http://php.net/oci8.max-persistent +;oci8.max_persistent = -1 + +; Connection: The maximum number of seconds a process is allowed to +; maintain an idle persistent connection. Using -1 means idle +; persistent connections will be maintained forever. +; http://php.net/oci8.persistent-timeout +;oci8.persistent_timeout = -1 + +; Connection: The number of seconds that must pass before issuing a +; ping during oci_pconnect() to check the connection validity. When +; set to 0, each oci_pconnect() will cause a ping. Using -1 disables +; pings completely. +; http://php.net/oci8.ping-interval +;oci8.ping_interval = 60 + +; Connection: Set this to a user chosen connection class to be used +; for all pooled server requests with Oracle 11g Database Resident +; Connection Pooling (DRCP). To use DRCP, this value should be set to +; the same string for all web servers running the same application, +; the database pool must be configured, and the connection string must +; specify to use a pooled server. +;oci8.connection_class = + +; High Availability: Using On lets PHP receive Fast Application +; Notification (FAN) events generated when a database node fails. The +; database must also be configured to post FAN events. +;oci8.events = Off + +; Tuning: This option enables statement caching, and specifies how +; many statements to cache. Using 0 disables statement caching. +; http://php.net/oci8.statement-cache-size +;oci8.statement_cache_size = 20 + +; Tuning: Enables statement prefetching and sets the default number of +; rows that will be fetched automatically after statement execution. +; http://php.net/oci8.default-prefetch +;oci8.default_prefetch = 100 + +; Compatibility. Using On means oci_close() will not close +; oci_connect() and oci_new_connect() connections. +; http://php.net/oci8.old-oci-close-semantics +;oci8.old_oci_close_semantics = Off + +[PostgreSQL] +; Allow or prevent persistent links. +; http://php.net/pgsql.allow-persistent +pgsql.allow_persistent = On + +; Detect broken persistent links always with pg_pconnect(). +; Auto reset feature requires a little overheads. +; http://php.net/pgsql.auto-reset-persistent +pgsql.auto_reset_persistent = Off + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/pgsql.max-persistent +pgsql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +; http://php.net/pgsql.max-links +pgsql.max_links = -1 + +; Ignore PostgreSQL backends Notice message or not. +; Notice message logging require a little overheads. +; http://php.net/pgsql.ignore-notice +pgsql.ignore_notice = 0 + +; Log PostgreSQL backends Notice message or not. +; Unless pgsql.ignore_notice=0, module cannot log notice message. +; http://php.net/pgsql.log-notice +pgsql.log_notice = 0 + +[Sybase-CT] +; Allow or prevent persistent links. +; http://php.net/sybct.allow-persistent +sybct.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/sybct.max-persistent +sybct.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +; http://php.net/sybct.max-links +sybct.max_links = -1 + +; Minimum server message severity to display. +; http://php.net/sybct.min-server-severity +sybct.min_server_severity = 10 + +; Minimum client message severity to display. +; http://php.net/sybct.min-client-severity +sybct.min_client_severity = 10 + +; Set per-context timeout +; http://php.net/sybct.timeout +;sybct.timeout= + +;sybct.packet_size + +; The maximum time in seconds to wait for a connection attempt to succeed before returning failure. +; Default: one minute +;sybct.login_timeout= + +; The name of the host you claim to be connecting from, for display by sp_who. +; Default: none +;sybct.hostname= + +; Allows you to define how often deadlocks are to be retried. -1 means "forever". +; Default: 0 +;sybct.deadlock_retry_count= + +[bcmath] +; Number of decimal digits for all bcmath functions. +; http://php.net/bcmath.scale +bcmath.scale = 0 + +[browscap] +; http://php.net/browscap +;browscap = extra/browscap.ini + +[Session] +; Handler used to store/retrieve data. +; http://php.net/session.save-handler +session.save_handler = files + +; Argument passed to save_handler. In the case of files, this is the path +; where data files are stored. Note: Windows users have to change this +; variable in order to use PHP's session functions. +; +; The path can be defined as: +; +; session.save_path = "N;/path" +; +; where N is an integer. Instead of storing all the session files in +; /path, what this will do is use subdirectories N-levels deep, and +; store the session data in those directories. This is useful if you +; or your OS have problems with lots of files in one directory, and is +; a more efficient layout for servers that handle lots of sessions. +; +; NOTE 1: PHP will not create this directory structure automatically. +; You can use the script in the ext/session dir for that purpose. +; NOTE 2: See the section on garbage collection below if you choose to +; use subdirectories for session storage +; +; The file storage module creates files using mode 600 by default. +; You can change that by using +; +; session.save_path = "N;MODE;/path" +; +; where MODE is the octal representation of the mode. Note that this +; does not overwrite the process's umask. +; http://php.net/session.save-path +session.save_path = '${path}\binaries\tmp' + +; Whether to use cookies. +; http://php.net/session.use-cookies +session.use_cookies = 1 + +; http://php.net/session.cookie-secure +;session.cookie_secure = + +; This option forces PHP to fetch and use a cookie for storing and maintaining +; the session id. We encourage this operation as it's very helpful in combating +; session hijacking when not specifying and managing your own session id. It is +; not the end all be all of session hijacking defense, but it's a good start. +; http://php.net/session.use-only-cookies +session.use_only_cookies = 1 + +; Name of the session (used as cookie name). +; http://php.net/session.name +session.name = PHPSESSID + +; Initialize session on request startup. +; http://php.net/session.auto-start +session.auto_start = 0 + +; Lifetime in seconds of cookie or, if 0, until browser is restarted. +; http://php.net/session.cookie-lifetime +session.cookie_lifetime = 0 + +; The path for which the cookie is valid. +; http://php.net/session.cookie-path +session.cookie_path = / + +; The domain for which the cookie is valid. +; http://php.net/session.cookie-domain +session.cookie_domain = + +; Whether or not to add the httpOnly flag to the cookie, which makes it inaccessible to browser scripting languages such as JavaScript. +; http://php.net/session.cookie-httponly +session.cookie_httponly = + +; Handler used to serialize data. php is the standard serializer of PHP. +; http://php.net/session.serialize-handler +session.serialize_handler = php + +; Defines the probability that the 'garbage collection' process is started +; on every session initialization. The probability is calculated by using +; gc_probability/gc_divisor. Where session.gc_probability is the numerator +; and gc_divisor is the denominator in the equation. Setting this value to 1 +; when the session.gc_divisor value is 100 will give you approximately a 1% chance +; the gc will run on any give request. +; Default Value: 1 +; Development Value: 1 +; Production Value: 1 +; http://php.net/session.gc-probability +session.gc_probability = 1 + +; Defines the probability that the 'garbage collection' process is started on every +; session initialization. The probability is calculated by using the following equation: +; gc_probability/gc_divisor. Where session.gc_probability is the numerator and +; session.gc_divisor is the denominator in the equation. Setting this value to 1 +; when the session.gc_divisor value is 100 will give you approximately a 1% chance +; the gc will run on any give request. Increasing this value to 1000 will give you +; a 0.1% chance the gc will run on any give request. For high volume production servers, +; this is a more efficient approach. +; Default Value: 100 +; Development Value: 1000 +; Production Value: 1000 +; http://php.net/session.gc-divisor +session.gc_divisor = 1000 + +; After this number of seconds, stored data will be seen as 'garbage' and +; cleaned up by the garbage collection process. +; http://php.net/session.gc-maxlifetime +session.gc_maxlifetime = 1440 + +; NOTE: If you are using the subdirectory option for storing session files +; (see session.save_path above), then garbage collection does *not* +; happen automatically. You will need to do your own garbage +; collection through a shell script, cron entry, or some other method. +; For example, the following script would is the equivalent of +; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): +; find /path/to/sessions -cmin +24 -type f | xargs rm + +; PHP 4.2 and less have an undocumented feature/bug that allows you to +; to initialize a session variable in the global scope. +; PHP 4.3 and later will warn you, if this feature is used. +; You can disable the feature and the warning separately. At this time, +; the warning is only displayed, if bug_compat_42 is enabled. This feature +; introduces some serious security problems if not handled correctly. It's +; recommended that you do not use this feature on production servers. But you +; should enable this on development servers and enable the warning as well. If you +; do not enable the feature on development servers, you won't be warned when it's +; used and debugging errors caused by this can be difficult to track down. +; Default Value: On +; Development Value: On +; Production Value: Off +; http://php.net/session.bug-compat-42 +session.bug_compat_42 = On + +; This setting controls whether or not you are warned by PHP when initializing a +; session value into the global space. session.bug_compat_42 must be enabled before +; these warnings can be issued by PHP. See the directive above for more information. +; Default Value: On +; Development Value: On +; Production Value: Off +; http://php.net/session.bug-compat-warn +session.bug_compat_warn = On + +; Check HTTP Referer to invalidate externally stored URLs containing ids. +; HTTP_REFERER has to contain this substring for the session to be +; considered as valid. +; http://php.net/session.referer-check +session.referer_check = + +; How many bytes to read from the file. +; http://php.net/session.entropy-length +;session.entropy_length = 32 + +; Specified here to create the session id. +; http://php.net/session.entropy-file +; Defaults to /dev/urandom +; On systems that don't have /dev/urandom but do have /dev/arandom, this will default to /dev/arandom +; If neither are found at compile time, the default is no entropy file. +; On windows, setting the entropy_length setting will activate the +; Windows random source (using the CryptoAPI) +;session.entropy_file = /dev/urandom + +; Set to {nocache,private,public,} to determine HTTP caching aspects +; or leave this empty to avoid sending anti-caching headers. +; http://php.net/session.cache-limiter +session.cache_limiter = nocache + +; Document expires after n minutes. +; http://php.net/session.cache-expire +session.cache_expire = 180 + +; trans sid support is disabled by default. +; Use of trans sid may risk your users security. +; Use this option with caution. +; - User may send URL contains active session ID +; to other person via. email/irc/etc. +; - URL that contains active session ID may be stored +; in publicly accessible computer. +; - User may access your site with the same session ID +; always using URL stored in browser's history or bookmarks. +; http://php.net/session.use-trans-sid +session.use_trans_sid = 0 + +; Select a hash function for use in generating session ids. +; Possible Values +; 0 (MD5 128 bits) +; 1 (SHA-1 160 bits) +; This option may also be set to the name of any hash function supported by +; the hash extension. A list of available hashes is returned by the hash_algos() +; function. +; http://php.net/session.hash-function +session.hash_function = 0 + +; Define how many bits are stored in each character when converting +; the binary hash data to something readable. +; Possible values: +; 4 (4 bits: 0-9, a-f) +; 5 (5 bits: 0-9, a-v) +; 6 (6 bits: 0-9, a-z, A-Z, "-", ",") +; Default Value: 4 +; Development Value: 5 +; Production Value: 5 +; http://php.net/session.hash-bits-per-character +session.hash_bits_per_character = 5 + +; The URL rewriter will look for URLs in a defined set of HTML tags. +; form/fieldset are special; if you include them here, the rewriter will +; add a hidden field with the info which is otherwise appended +; to URLs. If you want XHTML conformity, remove the form entry. +; Note that all valid entries require a "=", even if no value follows. +; Default Value: "a=href,area=href,frame=src,form=,fieldset=" +; Development Value: "a=href,area=href,frame=src,input=src,form=fakeentry" +; Production Value: "a=href,area=href,frame=src,input=src,form=fakeentry" +; http://php.net/url-rewriter.tags +url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" + +; Enable upload progress tracking in $_SESSION +; Default Value: On +; Development Value: On +; Production Value: On +; http://php.net/session.upload-progress.enabled +;session.upload_progress.enabled = On + +; Cleanup the progress information as soon as all POST data has been read +; (i.e. upload completed). +; Default Value: On +; Development Value: On +; Production Value: On +; http://php.net/session.upload-progress.cleanup +;session.upload_progress.cleanup = On + +; A prefix used for the upload progress key in $_SESSION +; Default Value: "upload_progress_" +; Development Value: "upload_progress_" +; Production Value: "upload_progress_" +; http://php.net/session.upload-progress.prefix +;session.upload_progress.prefix = "upload_progress_" + +; The index name (concatenated with the prefix) in $_SESSION +; containing the upload progress information +; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" +; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" +; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" +; http://php.net/session.upload-progress.name +;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" + +; How frequently the upload progress should be updated. +; Given either in percentages (per-file), or in bytes +; Default Value: "1%" +; Development Value: "1%" +; Production Value: "1%" +; http://php.net/session.upload-progress.freq +;session.upload_progress.freq = "1%" + +; The minimum delay between updates, in seconds +; Default Value: 1 +; Development Value: 1 +; Production Value: 1 +; http://php.net/session.upload-progress.min-freq +;session.upload_progress.min_freq = "1" + +[MSSQL] +; Allow or prevent persistent links. +mssql.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +mssql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +mssql.max_links = -1 + +; Minimum error severity to display. +mssql.min_error_severity = 10 + +; Minimum message severity to display. +mssql.min_message_severity = 10 + +; Compatibility mode with old versions of PHP 3.0. +mssql.compatibility_mode = Off + +; Connect timeout +;mssql.connect_timeout = 5 + +; Query timeout +;mssql.timeout = 60 + +; Valid range 0 - 2147483647. Default = 4096. +;mssql.textlimit = 4096 + +; Valid range 0 - 2147483647. Default = 4096. +;mssql.textsize = 4096 + +; Limits the number of records in each batch. 0 = all records in one batch. +;mssql.batchsize = 0 + +; Specify how datetime and datetim4 columns are returned +; On => Returns data converted to SQL server settings +; Off => Returns values as YYYY-MM-DD hh:mm:ss +;mssql.datetimeconvert = On + +; Use NT authentication when connecting to the server +mssql.secure_connection = Off + +; Specify max number of processes. -1 = library default +; msdlib defaults to 25 +; FreeTDS defaults to 4096 +;mssql.max_procs = -1 + +; Specify client character set. +; If empty or not set the client charset from freetds.conf is used +; This is only used when compiled with FreeTDS +;mssql.charset = "ISO-8859-1" + +[Assertion] +; Assert(expr); active by default. +; http://php.net/assert.active +;assert.active = On + +; Issue a PHP warning for each failed assertion. +; http://php.net/assert.warning +;assert.warning = On + +; Don't bail out by default. +; http://php.net/assert.bail +;assert.bail = Off + +; User-function to be called if an assertion fails. +; http://php.net/assert.callback +;assert.callback = 0 + +; Eval the expression with current error_reporting(). Set to true if you want +; error_reporting(0) around the eval(). +; http://php.net/assert.quiet-eval +;assert.quiet_eval = 0 + +[COM] +; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs +; http://php.net/com.typelib-file +;com.typelib_file = + +; allow Distributed-COM calls +; http://php.net/com.allow-dcom +;com.allow_dcom = true + +; autoregister constants of a components typlib on com_load() +; http://php.net/com.autoregister-typelib +;com.autoregister_typelib = true + +; register constants casesensitive +; http://php.net/com.autoregister-casesensitive +;com.autoregister_casesensitive = false + +; show warnings on duplicate constant registrations +; http://php.net/com.autoregister-verbose +;com.autoregister_verbose = true + +; The default character set code-page to use when passing strings to and from COM objects. +; Default: system ANSI code page +;com.code_page= + +[mbstring] +; language for internal character representation. +; http://php.net/mbstring.language +;mbstring.language = Japanese + +; internal/script encoding. +; Some encoding cannot work as internal encoding. +; (e.g. SJIS, BIG5, ISO-2022-*) +; http://php.net/mbstring.internal-encoding +;mbstring.internal_encoding = UTF-8 + +; http input encoding. +; http://php.net/mbstring.http-input +;mbstring.http_input = UTF-8 + +; http output encoding. mb_output_handler must be +; registered as output buffer to function +; http://php.net/mbstring.http-output +;mbstring.http_output = pass + +; enable automatic encoding translation according to +; mbstring.internal_encoding setting. Input chars are +; converted to internal encoding by setting this to On. +; Note: Do _not_ use automatic encoding translation for +; portable libs/applications. +; http://php.net/mbstring.encoding-translation +;mbstring.encoding_translation = Off + +; automatic encoding detection order. +; auto means +; http://php.net/mbstring.detect-order +;mbstring.detect_order = auto + +; substitute_character used when character cannot be converted +; one from another +; http://php.net/mbstring.substitute-character +;mbstring.substitute_character = none + +; overload(replace) single byte functions by mbstring functions. +; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), +; etc. Possible values are 0,1,2,4 or combination of them. +; For example, 7 for overload everything. +; 0: No overload +; 1: Overload mail() function +; 2: Overload str*() functions +; 4: Overload ereg*() functions +; http://php.net/mbstring.func-overload +;mbstring.func_overload = 0 + +; enable strict encoding detection. +;mbstring.strict_detection = On + +; This directive specifies the regex pattern of content types for which mb_output_handler() +; is activated. +; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml) +;mbstring.http_output_conv_mimetype= + +[gd] +; Tell the jpeg decode to ignore warnings and try to create +; a gd image. The warning will then be displayed as notices +; disabled by default +; http://php.net/gd.jpeg-ignore-warning +;gd.jpeg_ignore_warning = 0 + +[exif] +; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. +; With mbstring support this will automatically be converted into the encoding +; given by corresponding encode setting. When empty mbstring.internal_encoding +; is used. For the decode settings you can distinguish between motorola and +; intel byte order. A decode setting cannot be empty. +; http://php.net/exif.encode-unicode +;exif.encode_unicode = ISO-8859-15 + +; http://php.net/exif.decode-unicode-motorola +;exif.decode_unicode_motorola = UCS-2BE + +; http://php.net/exif.decode-unicode-intel +;exif.decode_unicode_intel = UCS-2LE + +; http://php.net/exif.encode-jis +;exif.encode_jis = + +; http://php.net/exif.decode-jis-motorola +;exif.decode_jis_motorola = JIS + +; http://php.net/exif.decode-jis-intel +;exif.decode_jis_intel = JIS + +[Tidy] +; The path to a default tidy configuration file to use when using tidy +; http://php.net/tidy.default-config +;tidy.default_config = /usr/local/lib/php/default.tcfg + +; Should tidy clean and repair output automatically? +; WARNING: Do not use this option if you are generating non-html content +; such as dynamic images +; http://php.net/tidy.clean-output +tidy.clean_output = Off + +[soap] +; Enables or disables WSDL caching feature. +; http://php.net/soap.wsdl-cache-enabled +soap.wsdl_cache_enabled=1 + +; Sets the directory name where SOAP extension will put cache files. +; http://php.net/soap.wsdl-cache-dir +soap.wsdl_cache_dir="/tmp" + +; (time to live) Sets the number of second while cached file will be used +; instead of original one. +; http://php.net/soap.wsdl-cache-ttl +soap.wsdl_cache_ttl=86400 + +; Sets the size of the cache limit. (Max. number of WSDL files to cache) +soap.wsdl_cache_limit = 5 + +[sysvshm] +; A default size of the shared memory segment +;sysvshm.init_mem = 10000 + +[ldap] +; Sets the maximum number of open links or -1 for unlimited. +ldap.max_links = -1 + +[mcrypt] +; For more information about mcrypt settings see http://php.net/mcrypt-module-open + +; Directory where to load mcrypt algorithms +; Default: Compiled in into libmcrypt (usually /usr/local/lib/libmcrypt) +;mcrypt.algorithms_dir= + +; Directory where to load mcrypt modes +; Default: Compiled in into libmcrypt (usually /usr/local/lib/libmcrypt) +;mcrypt.modes_dir= + +[dba] +;dba.default_handler= + +[opcache] +; Determines if Zend OPCache is enabled +;opcache.enable=0 + +; Determines if Zend OPCache is enabled for the CLI version of PHP +;opcache.enable_cli=0 + +; The OPcache shared memory storage size. +;opcache.memory_consumption=64 + +; The amount of memory for interned strings in Mbytes. +;opcache.interned_strings_buffer=4 + +; The maximum number of keys (scripts) in the OPcache hash table. +; Only numbers between 200 and 100000 are allowed. +;opcache.max_accelerated_files=2000 + +; The maximum percentage of "wasted" memory until a restart is scheduled. +;opcache.max_wasted_percentage=5 + +; When this directive is enabled, the OPcache appends the current working +; directory to the script key, thus eliminating possible collisions between +; files with the same name (basename). Disabling the directive improves +; performance, but may break existing applications. +;opcache.use_cwd=1 + +; When disabled, you must reset the OPcache manually or restart the +; webserver for changes to the filesystem to take effect. +;opcache.validate_timestamps=1 + +; How often (in seconds) to check file timestamps for changes to the shared +; memory storage allocation. ("1" means validate once per second, but only +; once per request. "0" means always validate) +;opcache.revalidate_freq=2 + +; Enables or disables file search in include_path optimization +;opcache.revalidate_path=0 + +; If disabled, all PHPDoc comments are dropped from the code to reduce the +; size of the optimized code. +;opcache.save_comments=1 + +; If disabled, PHPDoc comments are not loaded from SHM, so "Doc Comments" +; may be always stored (save_comments=1), but not loaded by applications +; that don't need them anyway. +;opcache.load_comments=1 + +; If enabled, a fast shutdown sequence is used for the accelerated code +;opcache.fast_shutdown=0 + +; Allow file existence override (file_exists, etc.) performance feature. +;opcache.enable_file_override=0 + +; A bitmask, where each bit enables or disables the appropriate OPcache +; passes +;opcache.optimization_level=0xffffffff + +;opcache.inherited_hack=1 +;opcache.dups_fix=0 + +; The location of the OPcache blacklist file (wildcards allowed). +; Each OPcache blacklist file is a text file that holds the names of files +; that should not be accelerated. The file format is to add each filename +; to a new line. The filename may be a full path or just a file prefix +; (i.e., /var/www/x blacklists all the files and directories in /var/www +; that start with 'x'). Line starting with a ; are ignored (comments). +;opcache.blacklist_filename= + +; Allows exclusion of large files from being cached. By default all files +; are cached. +;opcache.max_file_size=0 + +; Check the cache checksum each N requests. +; The default value of "0" means that the checks are disabled. +;opcache.consistency_checks=0 + +; How long to wait (in seconds) for a scheduled restart to begin if the cache +; is not being accessed. +;opcache.force_restart_timeout=180 + +; OPcache error_log file name. Empty string assumes "stderr". +;opcache.error_log= + +; All OPcache errors go to the Web server log. +; By default, only fatal errors (level 0) or errors (level 1) are logged. +; You can also enable warnings (level 2), info messages (level 3) or +; debug messages (level 4). +;opcache.log_verbosity_level=1 + +; Preferred Shared Memory back-end. Leave empty and let the system decide. +;opcache.preferred_memory_model= + +; Protect the shared memory from unexpected writing during script execution. +; Useful for internal debugging only. +;opcache.protect_memory=0 + +[curl] +; A default value for the CURLOPT_CAINFO option. This is required to be an +; absolute path. +;curl.cainfo = + +; Local Variables: +; tab-width: 4 +; End: \ No newline at end of file diff --git a/Example Code Files/chapter3/e32dog.php b/Example Code Files/chapter3/e32dog.php new file mode 100644 index 0000000..25e96d9 --- /dev/null +++ b/Example Code Files/chapter3/e32dog.php @@ -0,0 +1,6 @@ + diff --git a/Example Code Files/chapter3/e33dog.php b/Example Code Files/chapter3/e33dog.php new file mode 100644 index 0000000..c65b9db --- /dev/null +++ b/Example Code Files/chapter3/e33dog.php @@ -0,0 +1,11 @@ + diff --git a/Example Code Files/chapter3/e34dog.php b/Example Code Files/chapter3/e34dog.php new file mode 100644 index 0000000..e9324c4 --- /dev/null +++ b/Example Code Files/chapter3/e34dog.php @@ -0,0 +1,16 @@ +dog_weight. Dog breed is $this->dog_breed. Dog color is $this->dog_color."; + +} +} +?> diff --git a/Example Code Files/chapter3/e35lab.php b/Example Code Files/chapter3/e35lab.php new file mode 100644 index 0000000..d801a8b --- /dev/null +++ b/Example Code Files/chapter3/e35lab.php @@ -0,0 +1,5 @@ +display_properties(); +?> diff --git a/Example Code Files/chapter3/e36dog.php b/Example Code Files/chapter3/e36dog.php new file mode 100644 index 0000000..48f7220 --- /dev/null +++ b/Example Code Files/chapter3/e36dog.php @@ -0,0 +1,17 @@ +dog_weight,$this->dog_breed,$this->dog_color."; + +} +} +?> + diff --git a/Example Code Files/chapter3/e37lab.php b/Example Code Files/chapter3/e37lab.php new file mode 100644 index 0000000..0cb6747 --- /dev/null +++ b/Example Code Files/chapter3/e37lab.php @@ -0,0 +1,9 @@ +get_properties(); +list($dog_weight, $dog_breed, $dog_color) = explode(',', $dog_properties); + +print "Dog weight is $dog_weight. Dog breed is $dog_breed. Dog color is $dog_color."; +?> + diff --git a/Example Code Files/chapter3/e38lab.php b/Example Code Files/chapter3/e38lab.php new file mode 100644 index 0000000..c5b76a2 --- /dev/null +++ b/Example Code Files/chapter3/e38lab.php @@ -0,0 +1,20 @@ +set_dog_name('Fred'); +print $dog_error_message == TRUE ? 'Name update successful
' : 'Name update not successful
'; + +$dog_error_message = $lab->set_dog_weight(50); +print $dog_error_message == TRUE ? 'Weight update successful
' : 'Weight update not successful
'; + +$dog_error_message = $lab->set_dog_breed('Lab'); +print $dog_error_message == TRUE ? 'Breed update successful
' : 'Breed update not successful
'; + +$dog_error_message = $lab->set_dog_color('Yellow'); +print $dog_error_message == TRUE ? 'Color update successful
' : 'Color update not successful
'; + +$dog_properties = $lab->get_properties(); +list($dog_weight, $dog_breed, $dog_color) = explode(',', $dog_properties); +print "Dog weight is $dog_weight. Dog breed is $dog_breed. Dog color is $dog_color."; +?> diff --git a/Example Code Files/chapter3/e39dog.php b/Example Code Files/chapter3/e39dog.php new file mode 100644 index 0000000..12fdc27 --- /dev/null +++ b/Example Code Files/chapter3/e39dog.php @@ -0,0 +1,41 @@ +dog_name = $value : $error_message = FALSE; +return $error_message; +} +function set_dog_weight($value) +{ +$error_message = TRUE; +(ctype_digit($value) && ($value > 0 && $value <= 120)) ? $this->dog_weight = $value : $error_message = FALSE; +return $error_message; +} +function set_dog_breed($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 35) ? $this->dog_breed = $value : $error_message = FALSE; +return $error_message; +} +function set_dog_color($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 15) ? $this->dog_color = $value : $error_message = FALSE; +return $error_message; +} + +function get_properties() +{ +return "$this->dog_weight,$this->dog_breed,$this->dog_color."; +} +} +?> \ No newline at end of file diff --git a/Example Code Files/chapter4/e40dog.php b/Example Code Files/chapter4/e40dog.php new file mode 100644 index 0000000..0f5d41f --- /dev/null +++ b/Example Code Files/chapter4/e40dog.php @@ -0,0 +1,71 @@ +set_dog_name($value1) == TRUE ? 'TRUE,' : 'FALSE,'; +$breed_error = $this->set_dog_breed($value2) == TRUE ? 'TRUE,' : 'FALSE,'; +$color_error = $this->set_dog_color($value3) == TRUE ? 'TRUE,' : 'FALSE,'; +$weight_error= $this->set_dog_weight($value4) == TRUE ? 'TRUE' : 'FALSE'; +$this->error_message = $name_error . $breed_error . $color_error . $weight_error; +} +//------------------------------------toString-------------------------------------------------- +public function __toString() +{ +return $this->error_message; +} + +// ---------------------------------- Set Methods ---------------------------------------------- +function set_dog_name($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 20) ? $this->dog_name = $value : $error_message = FALSE; +return $error_message; +} +function set_dog_weight($value) +{ +$error_message = TRUE; +(ctype_digit($value) && ($value > 0 && $value <= 120)) ? $this->dog_weight = $value : $error_message = FALSE; +return $error_message; +} +function set_dog_breed($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 35) ? $this->dog_breed = $value : $error_message = FALSE; +return $error_message; +} +function set_dog_color($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 15) ? $this->dog_color = $value : $error_message = FALSE; +return $error_message; +} +// ----------------------------------------- Get Methods ------------------------------------------------------------ +function get_dog_name() +{ +return $this->dog_name; +} +function get_dog_weight() +{ +return $this->dog_weight; +} +function get_dog_breed() +{ +return $this->dog_breed; +} +function get_dog_color() +{ +return $this->dog_color; +} +function get_properties() +{ +return "$this->dog_weight,$this->dog_breed,$this->dog_color."; +} +} +?> \ No newline at end of file diff --git a/Example Code Files/chapter4/e40get_breeds.js b/Example Code Files/chapter4/e40get_breeds.js new file mode 100644 index 0000000..8302998 --- /dev/null +++ b/Example Code Files/chapter4/e40get_breeds.js @@ -0,0 +1,46 @@ +function getXMLHttp() +{ + var xmlHttp; + try + { + xmlHttp = new XMLHttpRequest(); + } + catch(e) + { + //Internet Explorer is different than the others + try + { + xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); + } + catch(e) + { + try + { + xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + catch(e) + { + alert("Old browser? Upgrade today so you can use AJAX!") + return false; + } + } + } + return xmlHttp; +} +function AjaxRequest() +{ + var xmlHttp = getXMLHttp(); + xmlHttp.onreadystatechange = function() + { + if(xmlHttp.readyState == 4) + { + HandleResponse(xmlHttp.responseText); + } + } + xmlHttp.open("GET", "e45get_breeds.php", true); + xmlHttp.send(null); +} +function HandleResponse(response) +{ + document.getElementById('AjaxResponse').innerHTML = response; +} diff --git a/Example Code Files/chapter4/e410dog_container.php b/Example Code Files/chapter4/e410dog_container.php new file mode 100644 index 0000000..1e67e22 --- /dev/null +++ b/Example Code Files/chapter4/e410dog_container.php @@ -0,0 +1,79 @@ +app = $value; +} +else +{ +exit; +} +} + +public function set_app($value) +{ +$this->app = $value; +} + +public function get_dog_application($search_value) +{ + +$xmlDoc = new DOMDocument(); + +if ( file_exists("e410dog_applications.xml") ) + +{ +$xmlDoc->load( 'e410dog_applications.xml' ); + +$searchNode = $xmlDoc->getElementsByTagName( "type" ); + +foreach( $searchNode as $searchNode ) +{ + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == $search_value) + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + return $xmlLocation->item(0)->nodeValue; + break; + + } + +} +} + return FALSE; +} +function create_object($properties_array) +{ + + $dog_loc = $this->get_dog_application($this->app); + if(($dog_loc == FALSE) || (!file_exists($dog_loc))) + { + return FALSE; + } + else + { + + require_once($dog_loc); + $class_array = get_declared_classes(); + $last_position = count($class_array) - 1; + $class_name = $class_array[$last_position]; + $dog_object = new $class_name($properties_array); + + return $dog_object; + } + +} + +} + +?> \ No newline at end of file diff --git a/Example Code Files/chapter4/e411get_breeds.php b/Example Code Files/chapter4/e411get_breeds.php new file mode 100644 index 0000000..f1078c4 --- /dev/null +++ b/Example Code Files/chapter4/e411get_breeds.php @@ -0,0 +1,45 @@ +asXML(); + + $this->result = ""; + + return $this->result; + } + else + { + return FALSE; + } + + +} +} +?> diff --git a/Example Code Files/chapter4/e412dog_interface.php b/Example Code Files/chapter4/e412dog_interface.php new file mode 100644 index 0000000..f8faa19 --- /dev/null +++ b/Example Code Files/chapter4/e412dog_interface.php @@ -0,0 +1,133 @@ +", "/", "$" ); + $value = str_ireplace($bad_chars,"",$value); + return $value; + +} + +function error_check_dog_app($lab) +{ + +list($name_error, $breed_error, $color_error, $weight_error) = explode(',', $lab); + +print $name_error == 'TRUE' ? 'Name update successful
' : 'Name update not successful
'; +print $breed_error == 'TRUE' ? 'Breed update successful
' : 'Breed update not successful
'; +print $color_error == 'TRUE' ? 'Color update successful
' : 'Color update not successful
'; +print $weight_error == 'TRUE' ? 'Weight update successful
' : 'Weight update not successful
'; + +} + +function get_dog_app_properties($lab) +{ + +print "Your dog's name is " . $lab->get_dog_name() . "
"; +print "Your dog weights " . $lab->get_dog_weight() . " lbs.
"; +print "Your dog's breed is " . $lab->get_dog_breed() . "
"; +print "Your dog's color is " . $lab->get_dog_color() . "
"; + +} +//----------------Main Section------------------------------------- + +if ( file_exists("e411dog_container.php")) +{ + Require_once("e411dog_container.php"); + } + else + { + print "System Error #1"; + exit; + } + +if (isset($_POST['dog_app'])) + { + +if ((isset($_POST['dog_name'])) && (isset($_POST['dog_breed'])) && (isset($_POST['dog_color'])) && (isset($_POST['dog_weight']))) +{ + + $container = new dog_container(clean_input($_POST['dog_app'])); + + $dog_name = clean_input(filter_input(INPUT_POST, "dog_name")); + $dog_breed = clean_input($_POST['dog_breed']); + $dog_color = clean_input($_POST['dog_color']); + $dog_weight = clean_input($_POST['dog_weight']); + $breedxml = $container->get_dog_application("breeds"); + + $properties_array = array($dog_name,$dog_breed,$dog_color,$dog_weight,$breedxml); + $lab = $container->create_object($properties_array); + + if ($lab != FALSE) + { + error_check_dog_app($lab); + get_dog_app_properties($lab); + } + else + { + print "System Error #2"; + } +} + +else +{ + +print "

Missing or invalid parameters. Please go back to the dog.html page to enter valid information.
"; + +print "Dog Creation Page"; + +} +} + else // select box + { + + $container = new dog_container("selectbox"); + + $properties_array = array("selectbox"); + + $lab = $container->create_object($properties_array); + + + if ($lab != FALSE) + { + + $container->set_app("breeds"); + $dog_app = $container->get_dog_application("breeds"); + $method_array = get_class_methods($lab); + $last_position = count($method_array) - 1; + $method_name = $method_array[$last_position]; + $result = $lab->$method_name($dog_app); + + if ( $result == FALSE) + { + print "System Error #3"; + } + else + { + print $result; + } + } + else + { + print "System Error #4"; + } + + } +?> diff --git a/Example Code Files/chapter4/e414lab.html b/Example Code Files/chapter4/e414lab.html new file mode 100644 index 0000000..1569fcc --- /dev/null +++ b/Example Code Files/chapter4/e414lab.html @@ -0,0 +1,64 @@ + + + +Dog Object + + + + + + + + + +

Dog Object Creater

+
+
+

Please complete ALL fields. Please note the required format of information.

+Enter Your Dog's Name (max 20 characters, alphabetic)

+Select Your Dog's Color:
+Brown
+Black
+Yellow
+White
+Mixed

+ +Enter Your Dog's Weight (numeric only)

+ + +Select Your Dog's Breed

+ +
+
+ + + diff --git a/Example Code Files/chapter4/e415get_breeds.js b/Example Code Files/chapter4/e415get_breeds.js new file mode 100644 index 0000000..7e7d2d5 --- /dev/null +++ b/Example Code Files/chapter4/e415get_breeds.js @@ -0,0 +1,46 @@ +function getXMLHttp() +{ + var xmlHttp; + try + { + xmlHttp = new XMLHttpRequest(); + } + catch(e) + { + //Internet Explorer is different than the others + try + { + xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); + } + catch(e) + { + try + { + xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + catch(e) + { + alert("Old browser? Upgrade today so you can use AJAX!") + return false; + } + } + } + return xmlHttp; +} +function AjaxRequest(value) +{ + var xmlHttp = getXMLHttp(); + xmlHttp.onreadystatechange = function() + { + if(xmlHttp.readyState == 4) + { + HandleResponse(xmlHttp.responseText); + } + } + xmlHttp.open("GET", value, true); + xmlHttp.send(null); +} +function HandleResponse(response) +{ + document.getElementById('AjaxResponse').innerHTML = response; +} diff --git a/Example Code Files/chapter4/e416dog.php b/Example Code Files/chapter4/e416dog.php new file mode 100644 index 0000000..859f599 --- /dev/null +++ b/Example Code Files/chapter4/e416dog.php @@ -0,0 +1,100 @@ +breedxml = $properties_array[4]; +$name_error = $this->set_dog_name($properties_array[0]) == TRUE ? 'TRUE,' : 'FALSE,'; +$breed_error = $this->set_dog_breed($properties_array[1]) == TRUE ? 'TRUE,' : 'FALSE,'; +$color_error = $this->set_dog_color($properties_array[2]) == TRUE ? 'TRUE,' : 'FALSE,'; +$weight_error= $this->set_dog_weight($properties_array[3]) == TRUE ? 'TRUE' : 'FALSE'; + +$this->error_message = $name_error . $breed_error . $color_error . $weight_error; +} +else +{ +exit; +} +} +//------------------------------------toString-------------------------------------------------- +public function __toString() +{ + return $this->error_message; +} + + +// ---------------------------------- Set Methods ---------------------------------------------- +function set_dog_name($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 20) ? $this->dog_name = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_weight($value) +{ +$error_message = TRUE; +(ctype_digit($value) && ($value > 0 && $value <= 120)) ? $this->dog_weight = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_breed($value) +{ +$error_message = TRUE; +($this->validator_breed($value) === TRUE) ? $this->dog_breed = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_color($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 15) ? $this->dog_color = $value : $this->error_message = FALSE; +return $this->error_message; +} +// ----------------------------------------- Get Methods ------------------------------------------------------------ +function get_dog_name() +{ +return $this->dog_name; +} +function get_dog_weight() +{ +return $this->dog_weight; +} +function get_dog_breed() +{ +return $this->dog_breed; +} +function get_dog_color() +{ +return $this->dog_color; +} +function get_properties() +{ +return "$this->dog_name,$this->dog_weight,$this->dog_breed,$this->dog_color."; +} +// ----------------------------------General Method--------------------------------------------- + +private function validator_breed($value) +{ + +$breed_file = simplexml_load_file($this->breedxml); +$xmlText = $breed_file->asXML(); + +if(stristr($xmlText, $value) === FALSE) +{ +return FALSE; +} +else +{ +return TRUE; +} +} + +} +?> \ No newline at end of file diff --git a/Example Code Files/chapter4/e41lab.html b/Example Code Files/chapter4/e41lab.html new file mode 100644 index 0000000..150eeb2 --- /dev/null +++ b/Example Code Files/chapter4/e41lab.html @@ -0,0 +1,49 @@ + + + + +Dog Object + + + + + + + + + +

Dog Object Creater

+
+
+

Please complete ALL fields. Please note the required format of information.

+Your Dog's Name (max 20 characters, alphabetic)
+Your Dog's Breed (max 35 characters, alphabetic)
+Your Dog's Color (max 15 characters, alphabetic)
+Your Dog's Weight (numeric only)
+ +
+
+ + + diff --git a/Example Code Files/chapter4/e42validator.js b/Example Code Files/chapter4/e42validator.js new file mode 100644 index 0000000..245c7d3 --- /dev/null +++ b/Example Code Files/chapter4/e42validator.js @@ -0,0 +1,101 @@ +function allalphabetic(the_string) +{ + + var letters = /^[a-zA-Z ]+$/; + + if (the_string.match(letters)) + { + + return true; + + } + else + { + + return false; + } +} + +function validate_dog_name(the_string) +{ + + if ((the_string.length > 0) && (allalphabetic(the_string)) && (the_string.length <= 20)) + { + + + return true; + } + else + { + return false; + } +} + +function validate_dog_breed_color(the_string) +{ + + if ((the_string.length > 0) && (allalphabetic(the_string)) && (the_string.length <= 35)) + { + + return true; + } + else + { + + return false; + } +} + +function validate_dog_weight(the_string) +{ + if ((the_string > 0 && the_string <=120) && (!isNaN(the_string))) + { + + return true; + } + else + { + + return false; + } +} + +function validate_input(form) +{ + var error_message = ""; + + if (!validate_dog_name(form.dog_name.value)) + { + + error_message += "Invalid dog name. "; + } + + if (!validate_dog_breed_color(form.dog_breed.value)) + { + + error_message += "Invalid dog breed. "; + } + + if (!validate_dog_breed_color(form.dog_color.value)) + { + error_message += "Invalid dog color. "; + } + + if (!validate_dog_weight(form.dog_weight.value)) + { + + error_message += "Invalid dog weight. "; + } + if (error_message.length > 0) + { + + alert(error_message); + return false; + + } + else + { + return true; + } + +} diff --git a/Example Code Files/chapter4/e43and44lab.php b/Example Code Files/chapter4/e43and44lab.php new file mode 100644 index 0000000..39a1bb3 --- /dev/null +++ b/Example Code Files/chapter4/e43and44lab.php @@ -0,0 +1,58 @@ +", "/", "$"); + $value = str_ireplace($bad_chars,"",$value); + if (get_magic_quotes_gpc()) + { + $value = stripslashes($value); + + // Gets rid of unwanted slashes + } + $value = htmlentities($value); + + // Removes any html from the string and turns it into < format + $value = strip_tags($value); + + return $value; + +} + +if ((isset($_POST['dog_name'])) && (isset($_POST['dog_breed'])) && (isset($_POST['dog_color'])) && (isset($_POST['dog_weight']))) +{ + +$dog_name = clean_input($_POST['dog_name']); +$dog_breed = clean_input($_POST['dog_breed']); +$dog_color = clean_input($_POST['dog_color']); +$dog_weight = clean_input($_POST['dog_weight']); + +$lab = new Dog($dog_name,$dog_breed,$dog_color,$dog_weight); + +list($name_error, $breed_error, $color_error, $weight_error) = explode(',', $lab); + +print $name_error == 'TRUE' ? 'Name update successful
' : 'Name update not successful
'; +print $breed_error == 'TRUE' ? 'Breed update successful
' : 'Breed update not successful
'; +print $color_error == 'TRUE' ? 'Color update successful
' : 'Color update not successful
'; +print $weight_error == 'TRUE' ? 'Weight update successful
' : 'Weight update not successful
'; + +$dog_properties = $lab->get_properties(); +list($dog_weight, $dog_breed, $dog_color) = explode(',', $dog_properties); +print "Dog weight is $dog_weight. Dog breed is $dog_breed. Dog color is $dog_color."; +} + +else +{ + +print "

Missing or invalid parameters. Please go back to the lab.html page to enter valid information.
"; + +print "Dog Creation Page"; + +} +?> diff --git a/Example Code Files/chapter4/e45breeds.xml b/Example Code Files/chapter4/e45breeds.xml new file mode 100644 index 0000000..f7ff17b --- /dev/null +++ b/Example Code Files/chapter4/e45breeds.xml @@ -0,0 +1,183 @@ + + +Affenpinscher +Afghan Hound +Airedale Terrier +Akita +Alaskan Malamute +American English Coonhound +American Eskimo Dog +American Foxhound +American Staffordshire Terrier +American Water Spaniel +Anatolian Shepherd Dog +Australian Cattle Dog +Australian Shepherd +Australian Terrier +Basenji +Basset Hound +Beagle +Bearded Collie +Beauceron +Bedlington Terrier +Belgian Malinois +Belgian Sheepdog +Belgian Tervuren +Bernese Mountain Dog +Bichon Frise +Black Russian Terrier +Black and Tan Coonhound +Bloodhound +Bluetick Coonhound +Border Collie +Border Terrier +Borzoi +Boston Terrier +Bouvier des Flandres +Boxer +Boykin Spaniel +Briard +Brittany +Brussels Griffon +Bull Terrier +Bulldog +Bullmastiff +Cairn Terrier +Canaan Dog +Cane Corso +Cardigan Welsh Corgi +Cavalier King Charles Spaniel +Cesky Terrier +Chesapeake Bay Retriever +Chihuahua +Chinese Crested +Chinese Shar-Pei +Chinook +Chow Chow +Clumber Spaniel +Cocker Spaniel +Collie +Coton de Tulear +Curly-Coated Retriever +Dachshund +Dalmatian +Dandie Dinmont Terrier +Doberman Pinscher +Dogue de Bordeaux +English Cocker Spaniel +English Foxhound +English Setter +English Springer Spaniel +English Toy Spaniel +Entlebucher Mountain Dog +Field Spaniel +Finnish Lapphund +Finnish Spitz +Flat-Coated Retriever +French Bulldog +German Pinscher +German Shepherd Dog +German Shorthaired Pointer +German Wirehaired Pointer +Giant Schnauzer +Glen of Imaal Terrier +Golden Retriever +Gordon Setter +Great Dane +Great Pyrenees +Greater Swiss Mountain Dog +Greyhound +Harrier +Havanese +Ibizan Hound +Icelandic Sheepdog +Irish Red and White Setter +Irish Setter +Irish Terrier +Irish Water Spaniel +Irish Wolfhound +Italian Greyhound +Japanese Chin +Keeshond +Kerry Blue Terrier +Komondor +Kuvasz +Labrador Retriever +Lakeland Terrier +Leonberger +Lhasa Apso +Lowchen +Maltese +Manchester Terrier +Mastiff +Miniature Bull Terrier +Miniature Pinscher +Miniature Schnauzer +Neapolitan Mastiff +Newfoundland +Norfolk Terrier +Norwegian Buhund +Norwegian Elkhound +Norwegian Lundehund +Norwich Terrier +Nova Scotia Duck Tolling Retriever +Old English Sheepdog +Otterhound +Papillon +Parson Russell Terrier +Pekingese +Pembroke Welsh Corgi +Petit Basset Griffon Vendeen +Pharaoh Hound +Plott +Pointer +Polish Lowland Sheepdog +Pomeranian +Poodle +Portuguese Podengo Pequeno +Portuguese Water Dog +Pug +Puli +Pyrenean Shepherd +Rat Terrier +Redbone Coonhound +Rhodesian Ridgeback +Rottweiler +Russell Terrier +Saluki +Samoyed +Schipperke +Scottish Deerhound +Scottish Terrier +Sealyham Terrier +Shetland Sheepdog +Shiba Inu +Shih Tzu +Siberian Husky +Silky Terrier +Skye Terrier +Smooth Fox Terrier +Soft Coated Wheaten Terrier +Spinone Italiano +St. Bernard +Staffordshire Bull Terrier +Standard Schnauzer +Sussex Spaniel +Swedish Vallhund +Tibetan Mastiff +Tibetan Spaniel +Tibetan Terrier +Toy Fox Terrier +Treeing Walker Coonhound +Vizsla +Weimaraner +Welsh Springer Spaniel +Welsh Terrier +West Highland White Terrier +Whippet +Wire Fox Terrier +Wirehaired Pointing Griffon +Wirehaired Vizsla +Xoloitzcuintli +Yorkshire Terrier + \ No newline at end of file diff --git a/Example Code Files/chapter4/e45get_breeds.php b/Example Code Files/chapter4/e45get_breeds.php new file mode 100644 index 0000000..d04f6c9 --- /dev/null +++ b/Example Code Files/chapter4/e45get_breeds.php @@ -0,0 +1,15 @@ +asXML(); +print ""; + +?> diff --git a/Example Code Files/chapter4/e46lab.html b/Example Code Files/chapter4/e46lab.html new file mode 100644 index 0000000..5eb9a39 --- /dev/null +++ b/Example Code Files/chapter4/e46lab.html @@ -0,0 +1,63 @@ + + + +Dog Object + + + + + + + + + +

Dog Object Creater

+
+
+

Please complete ALL fields. Please note the required format of information.

+Enter Your Dog's Name (max 20 characters, alphabetic)

+Select Your Dog's Color:
+Brown
+Black
+Yellow
+White
+Mixed

+ +Enter Your Dog's Weight (numeric only)

+ +

+ +
+
+ + + diff --git a/Example Code Files/chapter4/e46validator.js b/Example Code Files/chapter4/e46validator.js new file mode 100644 index 0000000..597b9a9 --- /dev/null +++ b/Example Code Files/chapter4/e46validator.js @@ -0,0 +1,102 @@ +function allalphabetic(the_string) +{ + + var letters = /^[a-zA-Z ]+$/; + + if (the_string.match(letters)) + { + + return true; + + } + else + { + + return false; + } +} + +function validate_dog_name(the_string) +{ + + if ((the_string.length > 0) && (allalphabetic(the_string)) && (the_string.length <= 20)) + { + + + return true; + } + else + { + + return false; + } +} + +function validate_dog_breed(the_string) +{ + + if (the_string == "Select a dog breed") + { + + return false; + } + else + { + + return true; + } +} + +function validate_dog_weight(the_string) +{ + if ((the_string > 0 && the_string <=120) && (!isNaN(the_string))) + { + + return true; + } + else + { + + return false; + } +} + +function validate_input(form) +{ + var error_message = ""; + + + if (!validate_dog_name(form.dog_name.value)) + { + + error_message += "Invalid dog name. "; + + } + + + if (!validate_dog_breed(form.dog_breed.value)) + { + + error_message += "Invalid dog breed. "; + } + + + if (!validate_dog_weight(form.dog_weight.value)) + { + + error_message += "Invalid dog weight. "; + } + + if (error_message.length > 0) + { + + alert(error_message); + return false; + + } + else + { + return true; + } + +} diff --git a/Example Code Files/chapter4/e47and48dog.php b/Example Code Files/chapter4/e47and48dog.php new file mode 100644 index 0000000..cdd8a03 --- /dev/null +++ b/Example Code Files/chapter4/e47and48dog.php @@ -0,0 +1,87 @@ +set_dog_name($value1) == TRUE ? 'TRUE,' : 'FALSE,'; +$breed_error = $this->set_dog_breed($value2) == TRUE ? 'TRUE,' : 'FALSE,'; +$color_error = $this->set_dog_color($value3) == TRUE ? 'TRUE,' : 'FALSE,'; +$weight_error= $this->set_dog_weight($value4) == TRUE ? 'TRUE' : 'FALSE'; +$this->error_message = $name_error . $breed_error . $color_error . $weight_error; +} +//------------------------------------toString-------------------------------------------------- +public function __toString() +{ +return $this->error_message; +} +// ----------------------------------General Methods-------------------------------------------- +private function validator_breed($value) +{ +$breed_file = simplexml_load_file("e45breeds.xml"); +$xmlText = $breed_file->asXML(); + +if(stristr($xmlText, $value) === FALSE) +{ +return FALSE; +} +else +{ +return TRUE; +} +} + +// ---------------------------------- Set Methods ---------------------------------------------- +function set_dog_name($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 20) ? $this->dog_name = $value : $error_message = FALSE; +return $error_message; +} +function set_dog_weight($value) +{ +$error_message = TRUE; +(ctype_digit($value) && ($value > 0 && $value <= 120)) ? $this->dog_weight = $value : $error_message = FALSE; +return $error_message; +} +function set_dog_breed($value) +{ +$error_message = TRUE; +($this->validator_breed($value) === TRUE) ? $this->dog_breed = $value : $error_message = FALSE; +return $error_message; +} +function set_dog_color($value) +{ +$valid_array = array("Brown", "Black", "Yellow", "White", "Mixed"); +$error_message = TRUE; +(in_array($value, $valid_array) === TRUE) ? $this->dog_color = $value : $error_message = FALSE; +return $error_message; +} +// ----------------------------------------- Get Methods ------------------------------------------------------------ +function get_dog_name() +{ +return $this->dog_name; +} +function get_dog_weight() +{ +return $this->dog_weight; +} +function get_dog_breed() +{ +return $this->dog_breed; +} +function get_dog_color() +{ +return $this->dog_color; +} +function get_properties() +{ +return "$this->dog_weight,$this->dog_breed,$this->dog_color."; +} +} +?> \ No newline at end of file diff --git a/Example Code Files/chapter4/e47lab.php b/Example Code Files/chapter4/e47lab.php new file mode 100644 index 0000000..f18a465 --- /dev/null +++ b/Example Code Files/chapter4/e47lab.php @@ -0,0 +1,80 @@ +", "/", "$"); + $value = str_ireplace($bad_chars,"",$value); + if (get_magic_quotes_gpc()) + { + $value = stripslashes($value); + + // Gets rid of unwanted slashes + } + $value = htmlentities($value); + + // Removes any html from the string and turns it into < format + $value = strip_tags($value); + + + return $value; + +} + +if ((isset($_POST['dog_name'])) && (isset($_POST['dog_breed'])) && (isset($_POST['dog_color'])) && (isset($_POST['dog_weight']))) +{ + +$dog_name = clean_input($_POST['dog_name']); +$dog_breed = clean_input($_POST['dog_breed']); +$dog_color = clean_input($_POST['dog_color']); +$dog_weight = clean_input($_POST['dog_weight']); + + + +$lab = new Dog($dog_name,$dog_breed,$dog_color,$dog_weight); + +list($name_error, $breed_error, $color_error, $weight_error) = explode(',', $lab); + +print $name_error == 'TRUE' ? 'Name update successful
' : 'Name update not successful
'; +print $breed_error == 'TRUE' ? 'Breed update successful
' : 'Breed update not successful
'; +print $color_error == 'TRUE' ? 'Color update successful
' : 'Color update not successful
'; +print $weight_error == 'TRUE' ? 'Weight update successful
' : 'Weight update not successful
'; + + +// ------------------------------Set Properties-------------------------- +//$dog_error_message = $lab->set_dog_name('Sally'); +//print $dog_error_message == TRUE ? 'Name update successful
' : 'Name update not successful
'; + +//$dog_error_message = $lab->set_dog_weight('5'); +//print $dog_error_message == TRUE ? 'Weight update successful
' : 'Weight update not successful
'; + +//$dog_error_message = $lab->set_dog_breed('Labrador'); +//print $dog_error_message == TRUE ? 'Breed update successful
' : 'Breed update not successful
'; + +//$dog_error_message = $lab->set_dog_color('Brown'); +//print $dog_error_message == TRUE ? 'Color update successful
' : 'Color update not successful
'; +// ------------------------------Get Properties-------------------------- +//print $lab->get_dog_name() . "
"; +//print $lab->get_dog_weight() . "
"; +//print $lab->get_dog_breed() . "
"; +//print $lab->get_dog_color() . "
"; +$dog_properties = $lab->get_properties(); +list($dog_weight, $dog_breed, $dog_color) = explode(',', $dog_properties); +print "Dog weight is $dog_weight. Dog breed is $dog_breed. Dog color is $dog_color."; +} + +else +{ + +print "

Missing or invalid parameters. Please go back to the lab.html page to enter valid information.
"; + +print "Dog Creation Page"; + +} +?> diff --git a/Example Code Files/chapter4/e49dog_applications.xml b/Example Code Files/chapter4/e49dog_applications.xml new file mode 100644 index 0000000..aa4fd2f --- /dev/null +++ b/Example Code Files/chapter4/e49dog_applications.xml @@ -0,0 +1,19 @@ + + + + +e416dog.php + + + + +e412get_breeds.php + + + + +e45breeds.xml + + + + diff --git a/Example Code Files/chapter5/Errors.log b/Example Code Files/chapter5/Errors.log new file mode 100644 index 0000000..db1da85 --- /dev/null +++ b/Example Code Files/chapter5/Errors.log @@ -0,0 +1,2 @@ +06.06.2015 03:02:44 | User Error | Breed update not successful +06.06.2015 03:00:55 | User Error | Name update not successful \ No newline at end of file diff --git a/Example Code Files/chapter5/e51testerror.php b/Example Code Files/chapter5/e51testerror.php new file mode 100644 index 0000000..3e7c6f2 --- /dev/null +++ b/Example Code Files/chapter5/e51testerror.php @@ -0,0 +1,15 @@ + diff --git a/Example Code Files/chapter5/e52handleerror.php b/Example Code Files/chapter5/e52handleerror.php new file mode 100644 index 0000000..70207c9 --- /dev/null +++ b/Example Code Files/chapter5/e52handleerror.php @@ -0,0 +1,25 @@ +throwexception(); +echo "This line does not display"; +$tester->produceerror(); // will not execute if line 13 is executed +echo "This line does not display"; + } +catch (errorException $e ){ + echo $e->getMessage(); } +catch (userException $e) { + echo $e->getMessage(); } +catch (Exception $e) { + echo $e->getMessage(); } +echo "This line will display"; +?> diff --git a/Example Code Files/chapter5/e53dog.php b/Example Code Files/chapter5/e53dog.php new file mode 100644 index 0000000..ac2fe59 --- /dev/null +++ b/Example Code Files/chapter5/e53dog.php @@ -0,0 +1,107 @@ +breedxml = $properties_array[4]; + +$name_error = $this->set_dog_name($properties_array[0]) == TRUE ? 'TRUE,' : 'FALSE,'; +$color_error = $this->set_dog_color($properties_array[2]) == TRUE ? 'TRUE,' : 'FALSE,'; +$weight_error= $this->set_dog_weight($properties_array[3]) == TRUE ? 'TRUE' : 'FALSE'; +$breed_error = $this->set_dog_breed($properties_array[1]) == TRUE ? 'TRUE,' : 'FALSE,'; + +$this->error_message = $name_error . $breed_error . $color_error . $weight_error; + +if(stristr($this->error_message, 'FALSE')) +{ + throw new setException($this->error_message); +} + +} +else +{ +exit; +} +} +//------------------------------------toString-------------------------------------------------- +//public function __toString() +//{ + // return $this->error_message; +//} + + +// ---------------------------------- Set Methods ---------------------------------------------- +function set_dog_name($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 20) ? $this->dog_name = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_weight($value) +{ +$error_message = TRUE; +(ctype_digit($value) && ($value > 0 && $value <= 120)) ? $this->dog_weight = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_breed($value) +{ +$error_message = TRUE; +($this->validator_breed($value) === TRUE) ? $this->dog_breed = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_color($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 15) ? $this->dog_color = $value : $this->error_message = FALSE; +return $this->error_message; +} +// ----------------------------------------- Get Methods ------------------------------------------------------------ +function get_dog_name() +{ +return $this->dog_name; +} +function get_dog_weight() +{ +return $this->dog_weight; +} +function get_dog_breed() +{ +return $this->dog_breed; +} +function get_dog_color() +{ +return $this->dog_color; +} +function get_properties() +{ +return "$this->dog_name,$this->dog_weight,$this->dog_breed,$this->dog_color."; +} +// ----------------------------------General Method--------------------------------------------- + +private function validator_breed($value) +{ + +$breed_file = simplexml_load_file($this->breedxml); +$xmlText = $breed_file->asXML(); + +if(stristr($xmlText, $value) === FALSE) +{ +return FALSE; +} +else +{ +return TRUE; +} +} + +} +?> \ No newline at end of file diff --git a/Example Code Files/chapter5/e54get_breeds.php b/Example Code Files/chapter5/e54get_breeds.php new file mode 100644 index 0000000..0d5e6c2 --- /dev/null +++ b/Example Code Files/chapter5/e54get_breeds.php @@ -0,0 +1,45 @@ +asXML(); + + $this->result = ""; + + return $this->result; + } + else + { + throw new Exception("Breed xml file missing or corrupt"); + // return FALSE; + } + + +} +} +?> diff --git a/Example Code Files/chapter5/e55dog_container.php b/Example Code Files/chapter5/e55dog_container.php new file mode 100644 index 0000000..21bcc27 --- /dev/null +++ b/Example Code Files/chapter5/e55dog_container.php @@ -0,0 +1,82 @@ +app = $value; +} +else +{ +exit; +} +} + +public function set_app($value) +{ +$this->app = $value; +} + +public function get_dog_application($search_value) +{ + +$xmlDoc = new DOMDocument(); + +if ( file_exists("e5dog_applications.xml") ) + +{ +$xmlDoc->load( 'e5dog_applications.xml' ); + +$searchNode = $xmlDoc->getElementsByTagName( "type" ); + +foreach( $searchNode as $searchNode ) +{ + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == $search_value) + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + return $xmlLocation->item(0)->nodeValue; + break; + + } + +} +} + throw new Exception("Dog applications xml file missing or corrupt"); + // return FALSE; +} +function create_object($properties_array) +{ + + $dog_loc = $this->get_dog_application($this->app); + if(($dog_loc == FALSE) || (!file_exists($dog_loc))) + { + + throw new Exception("File $dog_loc missing or corrupt."); + // return FALSE; + } + else + { + + require_once($dog_loc); + $class_array = get_declared_classes(); + $last_position = count($class_array) - 1; + $class_name = $class_array[$last_position]; + $dog_object = new $class_name($properties_array); + + return $dog_object; + } + +} + +} + +?> \ No newline at end of file diff --git a/Example Code Files/chapter5/e56dog_interface.php b/Example Code Files/chapter5/e56dog_interface.php new file mode 100644 index 0000000..d2d66aa --- /dev/null +++ b/Example Code Files/chapter5/e56dog_interface.php @@ -0,0 +1,120 @@ +", "/", "$" ); + $value = str_ireplace($bad_chars,"",$value); + return $value; + +} + +class setException extends Exception { + public function errorMessage() { + + list($name_error, $breed_error, $color_error, $weight_error) = explode(',', $this->getMessage()); + + $name_error == 'TRUE' ? $eMessage = '' : $eMessage = 'Name update not successful
'; + $breed_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Breed update not successful
'; + $color_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Color update not successful
'; + $weight_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Weight update not successful
'; + + return $eMessage; + } + } + +function get_dog_app_properties($lab) +{ + +print "Your dog's name is " . $lab->get_dog_name() . "
"; +print "Your dog weights " . $lab->get_dog_weight() . " lbs.
"; +print "Your dog's breed is " . $lab->get_dog_breed() . "
"; +print "Your dog's color is " . $lab->get_dog_color() . "
"; + +} +//----------------Main Section------------------------------------- +try { + if ( file_exists("e55dog_container.php")) + { + Require_once("e55dog_container.php"); + } + else + { + throw new Exception("Dog container file missing or corrupt"); + } + + if (isset($_POST['dog_app'])) + { + + if ((isset($_POST['dog_name'])) && (isset($_POST['dog_breed'])) && (isset($_POST['dog_color'])) && (isset($_POST['dog_weight']))) + { + + $container = new dog_container(clean_input($_POST['dog_app'])); + + $dog_name = clean_input(filter_input(INPUT_POST, "dog_name")); + $dog_breed = clean_input($_POST['dog_breed']); + $dog_color = clean_input($_POST['dog_color']); + $dog_weight = clean_input($_POST['dog_weight']); + $breedxml = $container->get_dog_application("breeds"); + + $properties_array = array($dog_name,$dog_breed,$dog_color,$dog_weight,$breedxml); + $lab = $container->create_object($properties_array); + $container = NULL; + print "Updates successful
"; + get_dog_app_properties($lab); + } + + else + { + + print "

Missing or invalid parameters. Please go back to the dog.html page to enter valid information.
"; + + print "Dog Creation Page"; + + } + } + else // select box + { + + $container = new dog_container("selectbox"); + + $properties_array = array("selectbox"); + + $lab = $container->create_object($properties_array); + $container->set_app("breeds"); + $dog_app = $container->get_dog_application("breeds"); + $method_array = get_class_methods($lab); + $last_position = count($method_array) - 1; + $method_name = $method_array[$last_position]; + $result = $lab->$method_name($dog_app); + + + print $result; + } + } + catch(setException $e) + { + echo $e->errorMessage(); + } + catch(Exception $e) + { + + echo $e->getMessage(); + } +?> diff --git a/Example Code Files/chapter5/e57dog_interface.php b/Example Code Files/chapter5/e57dog_interface.php new file mode 100644 index 0000000..e16aced --- /dev/null +++ b/Example Code Files/chapter5/e57dog_interface.php @@ -0,0 +1,136 @@ +", "/", "$" ); + $value = str_ireplace($bad_chars,"",$value); + return $value; + +} + +class setException extends Exception { + public function errorMessage() { + + list($name_error, $breed_error, $color_error, $weight_error) = explode(',', $this->getMessage()); + + $name_error == 'TRUE' ? $eMessage = '' : $eMessage = 'Name update not successful
'; + $breed_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Breed update not successful
'; + $color_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Color update not successful
'; + $weight_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Weight update not successful
'; + + return $eMessage; + } + } + +function get_dog_app_properties($lab) +{ + +print "Your dog's name is " . $lab->get_dog_name() . "
"; +print "Your dog weights " . $lab->get_dog_weight() . " lbs.
"; +print "Your dog's breed is " . $lab->get_dog_breed() . "
"; +print "Your dog's color is " . $lab->get_dog_color() . "
"; + +} +//----------------Main Section------------------------------------- +try { + if ( file_exists("e55dog_container.php")) + { + Require_once("e55dog_container.php"); + } + else + { + throw new Exception("Dog container file missing or corrupt"); + } + + if (isset($_POST['dog_app'])) + { + + if ((isset($_POST['dog_name'])) && (isset($_POST['dog_breed'])) && (isset($_POST['dog_color'])) && (isset($_POST['dog_weight']))) + { + + $container = new dog_container(clean_input($_POST['dog_app'])); + + $dog_name = clean_input(filter_input(INPUT_POST, "dog_name")); + $dog_breed = clean_input($_POST['dog_breed']); + $dog_color = clean_input($_POST['dog_color']); + $dog_weight = clean_input($_POST['dog_weight']); + $breedxml = $container->get_dog_application("breeds"); + + $properties_array = array($dog_name,$dog_breed,$dog_color,$dog_weight,$breedxml); + $lab = $container->create_object($properties_array); + + print "Updates successful
"; + get_dog_app_properties($lab); + } + + else + { + + print "

Missing or invalid parameters. Please go back to the dog.html page to enter valid information.
"; + + print "Dog Creation Page"; + + } + } + else // select box + { + + $container = new dog_container("selectbox"); + + $properties_array = array("selectbox"); + + $lab = $container->create_object($properties_array); + $container->set_app("breeds"); + $dog_app = $container->get_dog_application("breeds"); + $method_array = get_class_methods($lab); + $last_position = count($method_array) - 1; + $method_name = $method_array[$last_position]; + $result = $lab->$method_name($dog_app); + + print $result; + } + } + catch(setException $e) + { + echo $e->errorMessage(); // displays to the user + + $date = date('m.d.Y h:i:s'); + $errormessage = $e->errorMessage(); + $eMessage = $date . " | User Error | " . $errormessage . "\n"; + error_log($eMessage,3,USER_ERROR_LOG); // writes message to user error log file + + } + catch(Exception $e) + { + + echo "The system is currently unavailable. Please try again later."; // displays message to the user + + $date = date('m.d.Y h:i:s'); + $eMessage = $date . " | System Error | " . $e->getMessage() . " | " . $e->getFile() . " | ". $e->getLine() . "\n"; + error_log($eMessage,3,ERROR_LOG); // writes message to error log file + + error_log("Date/Time: $date - Serious System Problems with Dog Application. Check error log for details", 1, "noone@helpme.com", "Subject: Dog Application Error \nFrom: System Log " . "\r\n"); + // e-mails personnel to alert them of a system problem + + } +?> diff --git a/Example Code Files/chapter5/e57lab.html b/Example Code Files/chapter5/e57lab.html new file mode 100644 index 0000000..f2562f7 --- /dev/null +++ b/Example Code Files/chapter5/e57lab.html @@ -0,0 +1,64 @@ + + + +Dog Object + + + + + + + + + +

Dog Object Creater

+
+
+

Please complete ALL fields. Please note the required format of information.

+Enter Your Dog's Name (max 20 characters, alphabetic)

+Select Your Dog's Color:
+Brown
+Black
+Yellow
+White
+Mixed

+ +Enter Your Dog's Weight (numeric only)

+ + +Select Your Dog's Breed

+ +
+
+ + + diff --git a/Example Code Files/chapter5/e58readerrorlog.php b/Example Code Files/chapter5/e58readerrorlog.php new file mode 100644 index 0000000..6adad33 --- /dev/null +++ b/Example Code Files/chapter5/e58readerrorlog.php @@ -0,0 +1,74 @@ +"; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; + +for ($J=$row_Count; $J >= 0; $J--) +{ + echo ""; + + for($I=0; $I < 3; $I++) + { + echo " "; + } + echo ""; +} +echo "
Log File: " . ERROR_LOG . "
Date/TimeError TypeError Message
Delete " . $error_Array[$J][$I] . "
"; +echo ""; +} + +const ERROR_LOG = "Errors.log"; + +$logFile = fopen(ERROR_LOG, "r"); +$row_Count = 0; +while(!feof($logFile)) +{ +$error_Array[$row_Count] = explode(' | ', fgets($logFile)); + $row_Count++; +} +$row_Count--; +fclose($logFile); + +if(isset($_GET['rn'])) +{ + +deleteRecord($_GET['rn'], $row_Count, $error_Array); +saveChanges($row_Count,$error_Array,ERROR_LOG); +} + +displayRecords($row_Count,$error_Array); + +?> \ No newline at end of file diff --git a/Example Code Files/chapter5/e5breeds.xml b/Example Code Files/chapter5/e5breeds.xml new file mode 100644 index 0000000..f7ff17b --- /dev/null +++ b/Example Code Files/chapter5/e5breeds.xml @@ -0,0 +1,183 @@ + + +Affenpinscher +Afghan Hound +Airedale Terrier +Akita +Alaskan Malamute +American English Coonhound +American Eskimo Dog +American Foxhound +American Staffordshire Terrier +American Water Spaniel +Anatolian Shepherd Dog +Australian Cattle Dog +Australian Shepherd +Australian Terrier +Basenji +Basset Hound +Beagle +Bearded Collie +Beauceron +Bedlington Terrier +Belgian Malinois +Belgian Sheepdog +Belgian Tervuren +Bernese Mountain Dog +Bichon Frise +Black Russian Terrier +Black and Tan Coonhound +Bloodhound +Bluetick Coonhound +Border Collie +Border Terrier +Borzoi +Boston Terrier +Bouvier des Flandres +Boxer +Boykin Spaniel +Briard +Brittany +Brussels Griffon +Bull Terrier +Bulldog +Bullmastiff +Cairn Terrier +Canaan Dog +Cane Corso +Cardigan Welsh Corgi +Cavalier King Charles Spaniel +Cesky Terrier +Chesapeake Bay Retriever +Chihuahua +Chinese Crested +Chinese Shar-Pei +Chinook +Chow Chow +Clumber Spaniel +Cocker Spaniel +Collie +Coton de Tulear +Curly-Coated Retriever +Dachshund +Dalmatian +Dandie Dinmont Terrier +Doberman Pinscher +Dogue de Bordeaux +English Cocker Spaniel +English Foxhound +English Setter +English Springer Spaniel +English Toy Spaniel +Entlebucher Mountain Dog +Field Spaniel +Finnish Lapphund +Finnish Spitz +Flat-Coated Retriever +French Bulldog +German Pinscher +German Shepherd Dog +German Shorthaired Pointer +German Wirehaired Pointer +Giant Schnauzer +Glen of Imaal Terrier +Golden Retriever +Gordon Setter +Great Dane +Great Pyrenees +Greater Swiss Mountain Dog +Greyhound +Harrier +Havanese +Ibizan Hound +Icelandic Sheepdog +Irish Red and White Setter +Irish Setter +Irish Terrier +Irish Water Spaniel +Irish Wolfhound +Italian Greyhound +Japanese Chin +Keeshond +Kerry Blue Terrier +Komondor +Kuvasz +Labrador Retriever +Lakeland Terrier +Leonberger +Lhasa Apso +Lowchen +Maltese +Manchester Terrier +Mastiff +Miniature Bull Terrier +Miniature Pinscher +Miniature Schnauzer +Neapolitan Mastiff +Newfoundland +Norfolk Terrier +Norwegian Buhund +Norwegian Elkhound +Norwegian Lundehund +Norwich Terrier +Nova Scotia Duck Tolling Retriever +Old English Sheepdog +Otterhound +Papillon +Parson Russell Terrier +Pekingese +Pembroke Welsh Corgi +Petit Basset Griffon Vendeen +Pharaoh Hound +Plott +Pointer +Polish Lowland Sheepdog +Pomeranian +Poodle +Portuguese Podengo Pequeno +Portuguese Water Dog +Pug +Puli +Pyrenean Shepherd +Rat Terrier +Redbone Coonhound +Rhodesian Ridgeback +Rottweiler +Russell Terrier +Saluki +Samoyed +Schipperke +Scottish Deerhound +Scottish Terrier +Sealyham Terrier +Shetland Sheepdog +Shiba Inu +Shih Tzu +Siberian Husky +Silky Terrier +Skye Terrier +Smooth Fox Terrier +Soft Coated Wheaten Terrier +Spinone Italiano +St. Bernard +Staffordshire Bull Terrier +Standard Schnauzer +Sussex Spaniel +Swedish Vallhund +Tibetan Mastiff +Tibetan Spaniel +Tibetan Terrier +Toy Fox Terrier +Treeing Walker Coonhound +Vizsla +Weimaraner +Welsh Springer Spaniel +Welsh Terrier +West Highland White Terrier +Whippet +Wire Fox Terrier +Wirehaired Pointing Griffon +Wirehaired Vizsla +Xoloitzcuintli +Yorkshire Terrier + \ No newline at end of file diff --git a/Example Code Files/chapter5/e5dog_applications.xml b/Example Code Files/chapter5/e5dog_applications.xml new file mode 100644 index 0000000..6ca4942 --- /dev/null +++ b/Example Code Files/chapter5/e5dog_applications.xml @@ -0,0 +1,18 @@ + + + + +e53dog.php + + + + +e54get_breeds.php + + + + +e5breeds.xml + + + \ No newline at end of file diff --git a/Example Code Files/chapter5/e5get_breeds.js b/Example Code Files/chapter5/e5get_breeds.js new file mode 100644 index 0000000..7e7d2d5 --- /dev/null +++ b/Example Code Files/chapter5/e5get_breeds.js @@ -0,0 +1,46 @@ +function getXMLHttp() +{ + var xmlHttp; + try + { + xmlHttp = new XMLHttpRequest(); + } + catch(e) + { + //Internet Explorer is different than the others + try + { + xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); + } + catch(e) + { + try + { + xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + catch(e) + { + alert("Old browser? Upgrade today so you can use AJAX!") + return false; + } + } + } + return xmlHttp; +} +function AjaxRequest(value) +{ + var xmlHttp = getXMLHttp(); + xmlHttp.onreadystatechange = function() + { + if(xmlHttp.readyState == 4) + { + HandleResponse(xmlHttp.responseText); + } + } + xmlHttp.open("GET", value, true); + xmlHttp.send(null); +} +function HandleResponse(response) +{ + document.getElementById('AjaxResponse').innerHTML = response; +} diff --git a/Example Code Files/chapter5/e5lab.html b/Example Code Files/chapter5/e5lab.html new file mode 100644 index 0000000..0f98ae5 --- /dev/null +++ b/Example Code Files/chapter5/e5lab.html @@ -0,0 +1,64 @@ + + + +Dog Object + + + + + + + + + +

Dog Object Creater

+
+
+

Please complete ALL fields. Please note the required format of information.

+Enter Your Dog's Name (max 20 characters, alphabetic)

+Select Your Dog's Color:
+Brown
+Black
+Yellow
+White
+Mixed

+ +Enter Your Dog's Weight (numeric only)

+ + +Select Your Dog's Breed

+ +
+
+ + + diff --git a/Example Code Files/chapter5/e5validator.js b/Example Code Files/chapter5/e5validator.js new file mode 100644 index 0000000..597b9a9 --- /dev/null +++ b/Example Code Files/chapter5/e5validator.js @@ -0,0 +1,102 @@ +function allalphabetic(the_string) +{ + + var letters = /^[a-zA-Z ]+$/; + + if (the_string.match(letters)) + { + + return true; + + } + else + { + + return false; + } +} + +function validate_dog_name(the_string) +{ + + if ((the_string.length > 0) && (allalphabetic(the_string)) && (the_string.length <= 20)) + { + + + return true; + } + else + { + + return false; + } +} + +function validate_dog_breed(the_string) +{ + + if (the_string == "Select a dog breed") + { + + return false; + } + else + { + + return true; + } +} + +function validate_dog_weight(the_string) +{ + if ((the_string > 0 && the_string <=120) && (!isNaN(the_string))) + { + + return true; + } + else + { + + return false; + } +} + +function validate_input(form) +{ + var error_message = ""; + + + if (!validate_dog_name(form.dog_name.value)) + { + + error_message += "Invalid dog name. "; + + } + + + if (!validate_dog_breed(form.dog_breed.value)) + { + + error_message += "Invalid dog breed. "; + } + + + if (!validate_dog_weight(form.dog_weight.value)) + { + + error_message += "Invalid dog weight. "; + } + + if (error_message.length > 0) + { + + alert(error_message); + return false; + + } + else + { + return true; + } + +} diff --git a/Example Code Files/chapter6/07162015070620change.log b/Example Code Files/chapter6/07162015070620change.log new file mode 100644 index 0000000..728af09 --- /dev/null +++ b/Example Code Files/chapter6/07162015070620change.log @@ -0,0 +1 @@ +07162015070620 | Insert | a:1:{i:0;a:4:{s:8:"dog_name";s:6:"stevie";s:10:"dog_weight";s:2:"45";s:9:"dog_color";s:6:"Yellow";s:9:"dog_breed";s:22:"American Water Spaniel";}} diff --git a/Example Code Files/chapter6/07162015100850change.log b/Example Code Files/chapter6/07162015100850change.log new file mode 100644 index 0000000..e372fd8 --- /dev/null +++ b/Example Code Files/chapter6/07162015100850change.log @@ -0,0 +1,3 @@ +07162015100850 | Insert | a:1:{i:0;a:4:{s:8:"dog_name";s:7:"tester1";s:10:"dog_weight";s:2:"19";s:9:"dog_color";s:5:"Green";s:9:"dog_breed";s:3:"Lab";}} +07162015100850 | Update | a:2:{i:0;a:4:{s:8:"dog_name";s:7:"tester1";s:10:"dog_weight";s:2:"19";s:9:"dog_color";s:5:"Green";s:9:"dog_breed";s:3:"Lab";}i:1;a:4:{s:8:"dog_name";s:7:"tester2";s:10:"dog_weight";s:2:"19";s:9:"dog_color";s:5:"Green";s:9:"dog_breed";s:3:"Lab";}} +07162015100850 | Delete | 1 diff --git a/Example Code Files/chapter6/e54get_breeds.php b/Example Code Files/chapter6/e54get_breeds.php new file mode 100644 index 0000000..0d5e6c2 --- /dev/null +++ b/Example Code Files/chapter6/e54get_breeds.php @@ -0,0 +1,45 @@ +asXML(); + + $this->result = ""; + + return $this->result; + } + else + { + throw new Exception("Breed xml file missing or corrupt"); + // return FALSE; + } + + +} +} +?> diff --git a/Example Code Files/chapter6/e5breeds.xml b/Example Code Files/chapter6/e5breeds.xml new file mode 100644 index 0000000..f7ff17b --- /dev/null +++ b/Example Code Files/chapter6/e5breeds.xml @@ -0,0 +1,183 @@ + + +Affenpinscher +Afghan Hound +Airedale Terrier +Akita +Alaskan Malamute +American English Coonhound +American Eskimo Dog +American Foxhound +American Staffordshire Terrier +American Water Spaniel +Anatolian Shepherd Dog +Australian Cattle Dog +Australian Shepherd +Australian Terrier +Basenji +Basset Hound +Beagle +Bearded Collie +Beauceron +Bedlington Terrier +Belgian Malinois +Belgian Sheepdog +Belgian Tervuren +Bernese Mountain Dog +Bichon Frise +Black Russian Terrier +Black and Tan Coonhound +Bloodhound +Bluetick Coonhound +Border Collie +Border Terrier +Borzoi +Boston Terrier +Bouvier des Flandres +Boxer +Boykin Spaniel +Briard +Brittany +Brussels Griffon +Bull Terrier +Bulldog +Bullmastiff +Cairn Terrier +Canaan Dog +Cane Corso +Cardigan Welsh Corgi +Cavalier King Charles Spaniel +Cesky Terrier +Chesapeake Bay Retriever +Chihuahua +Chinese Crested +Chinese Shar-Pei +Chinook +Chow Chow +Clumber Spaniel +Cocker Spaniel +Collie +Coton de Tulear +Curly-Coated Retriever +Dachshund +Dalmatian +Dandie Dinmont Terrier +Doberman Pinscher +Dogue de Bordeaux +English Cocker Spaniel +English Foxhound +English Setter +English Springer Spaniel +English Toy Spaniel +Entlebucher Mountain Dog +Field Spaniel +Finnish Lapphund +Finnish Spitz +Flat-Coated Retriever +French Bulldog +German Pinscher +German Shepherd Dog +German Shorthaired Pointer +German Wirehaired Pointer +Giant Schnauzer +Glen of Imaal Terrier +Golden Retriever +Gordon Setter +Great Dane +Great Pyrenees +Greater Swiss Mountain Dog +Greyhound +Harrier +Havanese +Ibizan Hound +Icelandic Sheepdog +Irish Red and White Setter +Irish Setter +Irish Terrier +Irish Water Spaniel +Irish Wolfhound +Italian Greyhound +Japanese Chin +Keeshond +Kerry Blue Terrier +Komondor +Kuvasz +Labrador Retriever +Lakeland Terrier +Leonberger +Lhasa Apso +Lowchen +Maltese +Manchester Terrier +Mastiff +Miniature Bull Terrier +Miniature Pinscher +Miniature Schnauzer +Neapolitan Mastiff +Newfoundland +Norfolk Terrier +Norwegian Buhund +Norwegian Elkhound +Norwegian Lundehund +Norwich Terrier +Nova Scotia Duck Tolling Retriever +Old English Sheepdog +Otterhound +Papillon +Parson Russell Terrier +Pekingese +Pembroke Welsh Corgi +Petit Basset Griffon Vendeen +Pharaoh Hound +Plott +Pointer +Polish Lowland Sheepdog +Pomeranian +Poodle +Portuguese Podengo Pequeno +Portuguese Water Dog +Pug +Puli +Pyrenean Shepherd +Rat Terrier +Redbone Coonhound +Rhodesian Ridgeback +Rottweiler +Russell Terrier +Saluki +Samoyed +Schipperke +Scottish Deerhound +Scottish Terrier +Sealyham Terrier +Shetland Sheepdog +Shiba Inu +Shih Tzu +Siberian Husky +Silky Terrier +Skye Terrier +Smooth Fox Terrier +Soft Coated Wheaten Terrier +Spinone Italiano +St. Bernard +Staffordshire Bull Terrier +Standard Schnauzer +Sussex Spaniel +Swedish Vallhund +Tibetan Mastiff +Tibetan Spaniel +Tibetan Terrier +Toy Fox Terrier +Treeing Walker Coonhound +Vizsla +Weimaraner +Welsh Springer Spaniel +Welsh Terrier +West Highland White Terrier +Whippet +Wire Fox Terrier +Wirehaired Pointing Griffon +Wirehaired Vizsla +Xoloitzcuintli +Yorkshire Terrier + \ No newline at end of file diff --git a/Example Code Files/chapter6/e5get_breeds.js b/Example Code Files/chapter6/e5get_breeds.js new file mode 100644 index 0000000..7e7d2d5 --- /dev/null +++ b/Example Code Files/chapter6/e5get_breeds.js @@ -0,0 +1,46 @@ +function getXMLHttp() +{ + var xmlHttp; + try + { + xmlHttp = new XMLHttpRequest(); + } + catch(e) + { + //Internet Explorer is different than the others + try + { + xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); + } + catch(e) + { + try + { + xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + catch(e) + { + alert("Old browser? Upgrade today so you can use AJAX!") + return false; + } + } + } + return xmlHttp; +} +function AjaxRequest(value) +{ + var xmlHttp = getXMLHttp(); + xmlHttp.onreadystatechange = function() + { + if(xmlHttp.readyState == 4) + { + HandleResponse(xmlHttp.responseText); + } + } + xmlHttp.open("GET", value, true); + xmlHttp.send(null); +} +function HandleResponse(response) +{ + document.getElementById('AjaxResponse').innerHTML = response; +} diff --git a/Example Code Files/chapter6/e5validator.js b/Example Code Files/chapter6/e5validator.js new file mode 100644 index 0000000..597b9a9 --- /dev/null +++ b/Example Code Files/chapter6/e5validator.js @@ -0,0 +1,102 @@ +function allalphabetic(the_string) +{ + + var letters = /^[a-zA-Z ]+$/; + + if (the_string.match(letters)) + { + + return true; + + } + else + { + + return false; + } +} + +function validate_dog_name(the_string) +{ + + if ((the_string.length > 0) && (allalphabetic(the_string)) && (the_string.length <= 20)) + { + + + return true; + } + else + { + + return false; + } +} + +function validate_dog_breed(the_string) +{ + + if (the_string == "Select a dog breed") + { + + return false; + } + else + { + + return true; + } +} + +function validate_dog_weight(the_string) +{ + if ((the_string > 0 && the_string <=120) && (!isNaN(the_string))) + { + + return true; + } + else + { + + return false; + } +} + +function validate_input(form) +{ + var error_message = ""; + + + if (!validate_dog_name(form.dog_name.value)) + { + + error_message += "Invalid dog name. "; + + } + + + if (!validate_dog_breed(form.dog_breed.value)) + { + + error_message += "Invalid dog breed. "; + } + + + if (!validate_dog_weight(form.dog_weight.value)) + { + + error_message += "Invalid dog weight. "; + } + + if (error_message.length > 0) + { + + alert(error_message); + return false; + + } + else + { + return true; + } + +} diff --git a/Example Code Files/chapter6/e61dog_applications.xml b/Example Code Files/chapter6/e61dog_applications.xml new file mode 100644 index 0000000..6f2e3bf --- /dev/null +++ b/Example Code Files/chapter6/e61dog_applications.xml @@ -0,0 +1,28 @@ + + + + +e6dog.php + + + + +e6get_breeds.php + + + + +e6breeds.xml + + + + +e61dog_data.xml + + + + +e61dog_data.php + + + \ No newline at end of file diff --git a/Example Code Files/chapter6/e61dog_data.php b/Example Code Files/chapter6/e61dog_data.php new file mode 100644 index 0000000..e3a92f0 --- /dev/null +++ b/Example Code Files/chapter6/e61dog_data.php @@ -0,0 +1,116 @@ +load( 'e61dog_applications.xml' ); + $searchNode = $xmlDoc->getElementsByTagName( "type" ); + + foreach( $searchNode as $searchNode ) + { + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == "datastorage") + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + $this->dog_data_xml = $xmlLocation->item(0)->nodeValue; + + break; + } + + } + } + else + { + throw new Exception("Dog applications xml file missing or corrupt"); + } + $xmlfile = file_get_contents($this->dog_data_xml); + $xmlstring = simplexml_load_string($xmlfile); + + if ($xmlstring === false) { + $errorString = "Failed loading XML: "; + foreach(libxml_get_errors() as $error) { + $errorString .= $error->message . " " ; } + throw new Exception($errorString); } + $json = json_encode($xmlstring); + print_r($json); + + $this->dogs_array = json_decode($json,TRUE); + +} + +function __destruct() +{ + $xmlstring = ''; + $xmlstring .= "\n\n"; + foreach ($this->dogs_array as $dogs=>$dogs_value) { + foreach ($dogs_value as $dog => $dog_value) + { + $xmlstring .="<$dogs>\n"; + foreach ($dog_value as $column => $column_value) + { + $xmlstring .= "<$column>" . $dog_value[$column] . "\n"; + } + $xmlstring .= "\n"; + } + } + $xmlstring .= "\n"; + file_put_contents($this->dog_data_xml,$xmlstring); +} + + +function deleteRecord($recordNumber) +{ + foreach ($this->dogs_array as $dogs=>&$dogs_value) { + for($J=$recordNumber; $J < count($dogs_value) -1; $J++) { + + foreach ($dogs_value[$J] as $column => $column_value) + { + $dogs_value[$J][$column] = $dogs_value[$J + 1][$column]; + } + +} + unset ($dogs_value[count($dogs_value) -1]); + } + } + +function readRecords($recordNumber) + { + if($recordNumber === "ALL") { + return $this->dogs_array["dog"]; + } + else + { + return $this->dogs_array["dog"][$recordNumber]; + } +} + +function insertRecords($records_array) +{ + $dogs_array_size = count($this->dogs_array["dog"]); + for($I=0;$I< count($records_array);$I++) + { + $this->dogs_array["dog"][$dogs_array_size + $I] = $records_array[$I]; + } +} + +function updateRecords($records_array) +{ + foreach ($records_array as $records=>$records_value) + { + foreach ($records_value as $record => $record_value) + { + $this->dogs_array["dog"][$records] = $records_array[$records]; + } + } +} + +} + +?> \ No newline at end of file diff --git a/Example Code Files/chapter6/e61dog_data.xml b/Example Code Files/chapter6/e61dog_data.xml new file mode 100644 index 0000000..b3d67fc --- /dev/null +++ b/Example Code Files/chapter6/e61dog_data.xml @@ -0,0 +1,15 @@ + + + +tester1 +19 +Green +Lab + + +tester2 +19 +Green +Lab + + diff --git a/Example Code Files/chapter6/e62testdata.php b/Example Code Files/chapter6/e62testdata.php new file mode 100644 index 0000000..28ea84b --- /dev/null +++ b/Example Code Files/chapter6/e62testdata.php @@ -0,0 +1,27 @@ + Array ( "dog_name" => "Sally", "dog_weight" => "19", "dog_color" => "Green", "dog_breed" => "Lab" )); + +$tester->insertRecords($records_array); + +print_r ($tester->readRecords("ALL")); +print("



"); +$records_array = Array ( +1 => Array ( "dog_name" => "Spot", "dog_weight" => "19", "dog_color" => "Green", "dog_breed" => "Lab" )); + +$tester->updateRecords($records_array); + +print_r ($tester->readRecords("ALL")); +print("



"); + +$tester->deleteRecord(1); +print_r ($tester->readRecords("ALL")); + +$tester = NULL; +?> \ No newline at end of file diff --git a/Example Code Files/chapter6/e63dog_data.php b/Example Code Files/chapter6/e63dog_data.php new file mode 100644 index 0000000..afb0d02 --- /dev/null +++ b/Example Code Files/chapter6/e63dog_data.php @@ -0,0 +1,175 @@ +load( 'e61dog_applications.xml' ); + $searchNode = $xmlDoc->getElementsByTagName( "type" ); + + foreach( $searchNode as $searchNode ) + { + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == "datastorage") + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + $this->dog_data_xml = $xmlLocation->item(0)->nodeValue; + + break; + } + + } + } + else + { + throw new Exception("Dog applications xml file missing or corrupt"); + } + $xmlfile = file_get_contents($this->dog_data_xml); + $xmlstring = simplexml_load_string($xmlfile); + + if ($xmlstring === false) { + $errorString = "Failed loading XML: "; + foreach(libxml_get_errors() as $error) { + $errorString .= $error->message . " " ; } + throw new Exception($errorString); } + $json = json_encode($xmlstring); + $this->dogs_array = json_decode($json,TRUE); + +} + +function __destruct() +{ + + $xmlstring = ''; + $xmlstring .= "\n\n"; + foreach ($this->dogs_array as $dogs=>$dogs_value) { + foreach ($dogs_value as $dog => $dog_value) + { + $xmlstring .="<$dogs>\n"; + foreach ($dog_value as $column => $column_value) + { + $xmlstring .= "<$column>" . $dog_value[$column] . "\n"; + } + $xmlstring .= "\n"; + } + } + $xmlstring .= "\n"; + +$new_valid_data_file = preg_replace('/[0-9]+/', '', $this->dog_data_xml); +// remove the previous date and time if it exists +$oldxmldata = date('mdYhis') . $new_valid_data_file; +if (!rename($this->dog_data_xml, $oldxmldata)) + { + throw new Exception("Backup file $oldxmldata could not be created."); + } +file_put_contents($new_valid_data_file,$xmlstring); + +} + + +private function deleteRecord($recordNumber) +{ + foreach ($this->dogs_array as $dogs=>&$dogs_value) { + for($J=$recordNumber; $J < count($dogs_value) -1; $J++) { + + foreach ($dogs_value[$J] as $column => $column_value) + { + + $dogs_value[$J][$column] = $dogs_value[$J + 1][$column]; + } + +} + unset ($dogs_value[count($dogs_value) -1]); + } + + $change_string = date('mdYhis') . " | Delete | " . $recordNumber . "\n"; + $chge_log_file = date('mdYhis') . $this->change_log_file; + error_log($change_string,3,$chge_log_file); // might exceed 120 chars + } + +private function readRecords($recordNumber) + { + if($recordNumber === "ALL") { + return $this->dogs_array["dog"]; + } + else + { + return $this->dogs_array["dog"][$recordNumber]; + } +} + +private function insertRecords($records_array) +{ + $dogs_array_size = count($this->dogs_array["dog"]); + + for($I=0;$I< count($records_array);$I++) + { + $this->dogs_array["dog"][$dogs_array_size + $I] = $records_array[$I]; + + } + + $change_string = date('mdYhis') . " | Insert | " . serialize($records_array) . "\n"; + $chge_log_file = date('mdYhis') . $this->change_log_file; + error_log($change_string,3,$chge_log_file); // might exceed 120 chars + +} + +private function updateRecords($records_array) +{ + +$chge_string = ""; + foreach ($records_array as $records=>$records_value) + { + + + $this->dogs_array["dog"][$records] = $records_array[$records]; + + } + + $change_string = date('mdYhis') . " | Update | " . serialize($records_array) . "\n"; + $chge_log_file = date('mdYhis') . $this->change_log_file; + error_log($change_string,3,$chge_log_file); // might exceed 120 chars + + +} +function setChangeLogFile($value) +{ + + $this->dog_data_xml = $value; + +} +function processRecords($change_Type, $records_array) +{ + +switch($change_Type) +{ + + case "Delete": + + $this->deleteRecord($records_array); + break; + case "Insert": + $this->insertRecords($records_array); + break; + case "Update": + $this->updateRecords($records_array); + break; + case "Display": + $this->readRecords($records_array); + break; + default: + throw new Exception("Invalid XML file change type: $change_Type"); +} + +} +} + +?> \ No newline at end of file diff --git a/Example Code Files/chapter6/e64displaychangelog.php b/Example Code Files/chapter6/e64displaychangelog.php new file mode 100644 index 0000000..c25782f --- /dev/null +++ b/Example Code Files/chapter6/e64displaychangelog.php @@ -0,0 +1,184 @@ +"; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; + +for ($J=$row_Count -1; $J >= 0; $J--) +{ + echo ""; + + for($I=0; $I < 3; $I++) + { + echo " "; + } + echo ""; +} +echo "
Log File: " . $change_File . "
Date/TimeChange TypeChange Data
Delete " . $change_Array[$J][$I] . "
"; +echo ""; + +$directory = ""; + +$files = glob($directory . "*dog_data.xml"); + +echo "
"; +echo "

Delete entries above or select a file to update with change log $change_File

"; +echo ""; +echo ""; +echo ""; +echo "
"; + + +} +function deleteRecord($recordNumber, &$row_Count, &$change_Array) +{ + + for ($J=$recordNumber; $J < $row_Count - 1; $J++) +{ + for($I=0; $I < 3; $I++) + { + $change_Array[$J][$I] = $change_Array[$J + 1][$I]; + } +} + +unset($change_Array[$row_Count]); +$row_Count--; + +} + +function saveChanges($row_Count,$change_Array,$change_File) +{ + + $changeFile = fopen($change_File, "w"); + for($I=0; $I < $row_Count; $I++) + { + $writeString = $change_Array[$I][0] . " | " . $change_Array[$I][1] . " | " . $change_Array[$I][2]; + fwrite($changeFile, $writeString); + } + fclose($changeFile); +} + +function delete_Process() +{ +$change_Array = load_Array(); +deleteRecord($_GET['rn'], $row_Count, $change_Array); + +saveChanges($row_Count,$change_Array,$change_File); +displayRecords($row_Count,$change_Array,$change_File); +} + +function load_Array() +{ + +$change_File = $_POST['change_file']; + +$logFile = fopen($change_File, "r"); +$row_Count = 0; +while(!feof($logFile)) +{ +$change_Array[$row_Count] = explode(' | ', fgets($logFile)); + + $row_Count++; +} +$row_Count--; +fclose($logFile); +return $change_Array; +} +function display_Process() +{ +$change_Array = load_Array(); + +$row_Count = count($change_Array) -1; + +displayRecords($row_Count, $change_Array, $_POST['change_file']); + +} + +function select_File_Process() +{ +$directory = ""; + +$files = glob($directory . "*change.log"); + +echo "
"; +echo "

Select a file to display

"; +echo ""; +echo ""; +echo "
"; + +} + +function update_XML_File_Process() +{ +$change_Array = load_Array(); + +require_once("e63dog_data.php"); + +$data_Changer = new dog_data(); + +$row_Count = count($change_Array) -1; + +for($I=0;$I < $row_Count; $I++) +{ + + if($change_Array[$I][1] != "Delete") + { + $temp = unserialize($change_Array[$I][2]); + + } + else + { + + $temp = (integer)$change_Array[$I][2]; + + } + + $data_Changer->processRecords($change_Array[$I][1], $temp); + +} + +$data_Changer->setChangeLogFile($_POST['data_File']); + +$data_Changer = NULL; + +echo "Changes completed"; +} + +if(isset($_POST['data_File'])) +{ + +update_XML_File_Process(); + +} +else if(isset($_GET['rn'])) +{ +delete_Process(); +} +else if(isset($_POST['change_file'])) +{ +display_Process(); +} +else +{ +select_File_Process(); +} + +?> \ No newline at end of file diff --git a/Example Code Files/chapter6/e65dog.php b/Example Code Files/chapter6/e65dog.php new file mode 100644 index 0000000..4fbf3a9 --- /dev/null +++ b/Example Code Files/chapter6/e65dog.php @@ -0,0 +1,120 @@ +breedxml = $properties_array[4]; + +$name_error = $this->set_dog_name($properties_array[0]) == TRUE ? 'TRUE,' : 'FALSE,'; +$color_error = $this->set_dog_color($properties_array[2]) == TRUE ? 'TRUE,' : 'FALSE,'; +$weight_error= $this->set_dog_weight($properties_array[3]) == TRUE ? 'TRUE' : 'FALSE'; +$breed_error = $this->set_dog_breed($properties_array[1]) == TRUE ? 'TRUE,' : 'FALSE,'; + +$this->error_message = $name_error . $breed_error . $color_error . $weight_error; +$this->save_dog_data(); +if(stristr($this->error_message, 'FALSE')) +{ + throw new setException($this->error_message); +} + +} +else +{ +exit; +} +} +function clean_input() { } +private function save_dog_data() +{ +if ( file_exists("e65dog_container.php")) { + require_once("e65dog_container.php"); // use chapter 5 container w exception handling + } else { + throw new Exception("Dog container file missing or corrupt"); + } + + $container = new dog_container("dogdata"); // sets the tag name to look for in XML file + $properties_array = array("dogdata"); // not used but must be passed into create_object + $dog_data = $container->create_object($properties_array); // creates dog_data object + $method_array = get_class_methods($dog_data); + $last_position = count($method_array) - 1; + $method_name = $method_array[$last_position]; + $record_Array = array(array('dog_name'=>"$this->dog_name", 'dog_weight'=>"$this->dog_weight", 'dog_color'=>"$this->dog_color", 'dog_breed'=>"$this->dog_breed")); + $dog_data->$method_name("Insert",$record_Array); + $dog_data = NULL; + +} + +function set_dog_name($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 20) ? $this->dog_name = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_weight($value) +{ +$error_message = TRUE; +(ctype_digit($value) && ($value > 0 && $value <= 120)) ? $this->dog_weight = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_breed($value) +{ +$error_message = TRUE; +($this->validator_breed($value) === TRUE) ? $this->dog_breed = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_color($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 15) ? $this->dog_color = $value : $this->error_message = FALSE; +return $this->error_message; +} +// ----------------------------------------- Get Methods ------------------------------------------------------------ +function get_dog_name() +{ +return $this->dog_name; +} +function get_dog_weight() +{ +return $this->dog_weight; +} +function get_dog_breed() +{ +return $this->dog_breed; +} +function get_dog_color() +{ +return $this->dog_color; +} +function get_properties() +{ +return "$this->dog_name,$this->dog_weight,$this->dog_breed,$this->dog_color."; +} +// ----------------------------------General Method--------------------------------------------- + +private function validator_breed($value) +{ + +$breed_file = simplexml_load_file($this->breedxml); +$xmlText = $breed_file->asXML(); + +if(stristr($xmlText, $value) === FALSE) +{ +return FALSE; +} +else +{ +return TRUE; +} +} + +} +?> \ No newline at end of file diff --git a/Example Code Files/chapter6/e65dog_applications.xml b/Example Code Files/chapter6/e65dog_applications.xml new file mode 100644 index 0000000..56876bd --- /dev/null +++ b/Example Code Files/chapter6/e65dog_applications.xml @@ -0,0 +1,28 @@ + + + + +e65dog.php + + + + +e54get_breeds.php + + + + +e5breeds.xml + + + + +e61dog_data.xml + + + + +e65dog_data.php + + + \ No newline at end of file diff --git a/Example Code Files/chapter6/e65dog_container.php b/Example Code Files/chapter6/e65dog_container.php new file mode 100644 index 0000000..a6463e5 --- /dev/null +++ b/Example Code Files/chapter6/e65dog_container.php @@ -0,0 +1,82 @@ +app = $value; +} +else +{ +exit; +} +} + +public function set_app($value) +{ +$this->app = $value; +} + +public function get_dog_application($search_value) +{ + +$xmlDoc = new DOMDocument(); + +if ( file_exists("e65dog_applications.xml") ) + +{ +$xmlDoc->load( 'e65dog_applications.xml' ); + +$searchNode = $xmlDoc->getElementsByTagName( "type" ); + +foreach( $searchNode as $searchNode ) +{ + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == $search_value) + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + return $xmlLocation->item(0)->nodeValue; + break; + + } + +} +} + throw new Exception("Dog applications xml file missing or corrupt"); + // return FALSE; +} +function create_object($properties_array) +{ + + $dog_loc = $this->get_dog_application($this->app); + if(($dog_loc == FALSE) || (!file_exists($dog_loc))) + { + + throw new Exception("File $dog_loc missing or corrupt."); + // return FALSE; + } + else + { + + require_once($dog_loc); + $class_array = get_declared_classes(); + $last_position = count($class_array) - 1; + $class_name = $class_array[$last_position]; + $dog_object = new $class_name($properties_array); + + return $dog_object; + } + +} + +} + +?> \ No newline at end of file diff --git a/Example Code Files/chapter6/e65dog_data.php b/Example Code Files/chapter6/e65dog_data.php new file mode 100644 index 0000000..7c46531 --- /dev/null +++ b/Example Code Files/chapter6/e65dog_data.php @@ -0,0 +1,175 @@ +load( 'e65dog_applications.xml' ); + $searchNode = $xmlDoc->getElementsByTagName( "type" ); + + foreach( $searchNode as $searchNode ) + { + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == "datastorage") + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + $this->dog_data_xml = $xmlLocation->item(0)->nodeValue; + + break; + } + + } + } + else + { + throw new Exception("Dog applications xml file missing or corrupt"); + } + $xmlfile = file_get_contents($this->dog_data_xml); + $xmlstring = simplexml_load_string($xmlfile); + + if ($xmlstring === false) { + $errorString = "Failed loading XML: "; + foreach(libxml_get_errors() as $error) { + $errorString .= $error->message . " " ; } + throw new Exception($errorString); } + $json = json_encode($xmlstring); + $this->dogs_array = json_decode($json,TRUE); + +} + +function __destruct() +{ + + $xmlstring = ''; + $xmlstring .= "\n\n"; + foreach ($this->dogs_array as $dogs=>$dogs_value) { + foreach ($dogs_value as $dog => $dog_value) + { + $xmlstring .="<$dogs>\n"; + foreach ($dog_value as $column => $column_value) + { + $xmlstring .= "<$column>" . $dog_value[$column] . "\n"; + } + $xmlstring .= "\n"; + } + } + $xmlstring .= "\n"; + +$new_valid_data_file = preg_replace('/[0-9]+/', '', $this->dog_data_xml); +// remove the previous date and time if it exists +$oldxmldata = date('mdYhis') . $new_valid_data_file; +if (!rename($this->dog_data_xml, $oldxmldata)) + { + throw new Exception("Backup file $oldxmldata could not be created."); + } +file_put_contents($new_valid_data_file,$xmlstring); + +} + + +private function deleteRecord($recordNumber) +{ + foreach ($this->dogs_array as $dogs=>&$dogs_value) { + for($J=$recordNumber; $J < count($dogs_value) -1; $J++) { + + foreach ($dogs_value[$J] as $column => $column_value) + { + + $dogs_value[$J][$column] = $dogs_value[$J + 1][$column]; + } + +} + unset ($dogs_value[count($dogs_value) -1]); + } + + $change_string = date('mdYhis') . " | Delete | " . $recordNumber . "\n"; + $chge_log_file = date('mdYhis') . $this->change_log_file; + error_log($change_string,3,$chge_log_file); // might exceed 120 chars + } + +private function readRecords($recordNumber) + { + if($recordNumber === "ALL") { + return $this->dogs_array["dog"]; + } + else + { + return $this->dogs_array["dog"][$recordNumber]; + } +} + +private function insertRecords($records_array) +{ + $dogs_array_size = count($this->dogs_array["dog"]); + + for($I=0;$I< count($records_array);$I++) + { + $this->dogs_array["dog"][$dogs_array_size + $I] = $records_array[$I]; + + } + + $change_string = date('mdYhis') . " | Insert | " . serialize($records_array) . "\n"; + $chge_log_file = date('mdYhis') . $this->change_log_file; + error_log($change_string,3,$chge_log_file); // might exceed 120 chars + +} + +private function updateRecords($records_array) +{ + +$chge_string = ""; + foreach ($records_array as $records=>$records_value) + { + + + $this->dogs_array["dog"][$records] = $records_array[$records]; + + } + + $change_string = date('mdYhis') . " | Update | " . serialize($records_array) . "\n"; + $chge_log_file = date('mdYhis') . $this->change_log_file; + error_log($change_string,3,$chge_log_file); // might exceed 120 chars + + +} +function setChangeLogFile($value) +{ + + $this->dog_data_xml = $value; + +} +function processRecords($change_Type, $records_array) +{ + +switch($change_Type) +{ + + case "Delete": + + $this->deleteRecord($records_array); + break; + case "Insert": + $this->insertRecords($records_array); + break; + case "Update": + $this->updateRecords($records_array); + break; + case "Display": + return $this->readRecords($records_array); + break; + default: + throw new Exception("Invalid XML file change type: $change_Type"); +} + +} +} + +?> \ No newline at end of file diff --git a/Example Code Files/chapter6/e65dog_interface.php b/Example Code Files/chapter6/e65dog_interface.php new file mode 100644 index 0000000..1b305bf --- /dev/null +++ b/Example Code Files/chapter6/e65dog_interface.php @@ -0,0 +1,136 @@ +", "/", "$" ); + $value = str_ireplace($bad_chars,"",$value); + return $value; + +} + +class setException extends Exception { + public function errorMessage() { + + list($name_error, $breed_error, $color_error, $weight_error) = explode(',', $this->getMessage()); + + $name_error == 'TRUE' ? $eMessage = '' : $eMessage = 'Name update not successful
'; + $breed_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Breed update not successful
'; + $color_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Color update not successful
'; + $weight_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Weight update not successful
'; + + return $eMessage; + } + } + +function get_dog_app_properties($lab) +{ + +print "Your dog's name is " . $lab->get_dog_name() . "
"; +print "Your dog weights " . $lab->get_dog_weight() . " lbs.
"; +print "Your dog's breed is " . $lab->get_dog_breed() . "
"; +print "Your dog's color is " . $lab->get_dog_color() . "
"; + +} +//----------------Main Section------------------------------------- +try { + if ( file_exists("e65dog_container.php")) + { + Require_once("e65dog_container.php"); + } + else + { + throw new Exception("Dog container file missing or corrupt"); + } + + if (isset($_POST['dog_app'])) + { + + if ((isset($_POST['dog_name'])) && (isset($_POST['dog_breed'])) && (isset($_POST['dog_color'])) && (isset($_POST['dog_weight']))) + { + + $container = new dog_container(clean_input($_POST['dog_app'])); + + $dog_name = clean_input(filter_input(INPUT_POST, "dog_name")); + $dog_breed = clean_input($_POST['dog_breed']); + $dog_color = clean_input($_POST['dog_color']); + $dog_weight = clean_input($_POST['dog_weight']); + $breedxml = $container->get_dog_application("breeds"); + + $properties_array = array($dog_name,$dog_breed,$dog_color,$dog_weight,$breedxml); + $lab = $container->create_object($properties_array); + + print "Updates successful
"; + get_dog_app_properties($lab); + } + + else + { + + print "

Missing or invalid parameters. Please go back to the dog.html page to enter valid information.
"; + + print "Dog Creation Page"; + + } + } + else // select box + { + + $container = new dog_container("selectbox"); + + $properties_array = array("selectbox"); + + $lab = $container->create_object($properties_array); + $container->set_app("breeds"); + $dog_app = $container->get_dog_application("breeds"); + $method_array = get_class_methods($lab); + $last_position = count($method_array) - 1; + $method_name = $method_array[$last_position]; + $result = $lab->$method_name($dog_app); + + print $result; + } + } + catch(setException $e) + { + echo $e->errorMessage(); // displays to the user + + $date = date('m.d.Y h:i:s'); + $errormessage = $e->errorMessage(); + $eMessage = $date . " | User Error | " . $errormessage . "\n"; + error_log($eMessage,3,USER_ERROR_LOG); // writes message to user error log file + + } + catch(Exception $e) + { + + echo "The system is currently unavailable. Please try again later."; // displays message to the user + + $date = date('m.d.Y h:i:s'); + $eMessage = $date . " | System Error | " . $e->getMessage() . " | " . $e->getFile() . " | ". $e->getLine() . "\n"; + error_log($eMessage,3,ERROR_LOG); // writes message to error log file + + error_log("Date/Time: $date - Serious System Problems with Dog Application. Check error log for details", 1, "noone@helpme.com", "Subject: Dog Application Error \nFrom: System Log " . "\r\n"); + // e-mails personnel to alert them of a system problem + + } +?> diff --git a/Example Code Files/chapter6/e65lab.html b/Example Code Files/chapter6/e65lab.html new file mode 100644 index 0000000..3c50c8f --- /dev/null +++ b/Example Code Files/chapter6/e65lab.html @@ -0,0 +1,64 @@ + + + +Dog Object + + + + + + + + + +

Dog Object Creater

+
+
+

Please complete ALL fields. Please note the required format of information.

+Enter Your Dog's Name (max 20 characters, alphabetic)

+Select Your Dog's Color:
+Brown
+Black
+Yellow
+White
+Mixed

+ +Enter Your Dog's Weight (numeric only)

+ + +Select Your Dog's Breed

+ +
+
+ + + diff --git a/Example Code Files/chapter7/dog_data.xml b/Example Code Files/chapter7/dog_data.xml new file mode 100644 index 0000000..b3d67fc --- /dev/null +++ b/Example Code Files/chapter7/dog_data.xml @@ -0,0 +1,15 @@ + + + +tester1 +19 +Green +Lab + + +tester2 +19 +Green +Lab + + diff --git a/Example Code Files/chapter7/e54get_breeds.php b/Example Code Files/chapter7/e54get_breeds.php new file mode 100644 index 0000000..0d5e6c2 --- /dev/null +++ b/Example Code Files/chapter7/e54get_breeds.php @@ -0,0 +1,45 @@ +asXML(); + + $this->result = ""; + + return $this->result; + } + else + { + throw new Exception("Breed xml file missing or corrupt"); + // return FALSE; + } + + +} +} +?> diff --git a/Example Code Files/chapter7/e5breeds.xml b/Example Code Files/chapter7/e5breeds.xml new file mode 100644 index 0000000..f7ff17b --- /dev/null +++ b/Example Code Files/chapter7/e5breeds.xml @@ -0,0 +1,183 @@ + + +Affenpinscher +Afghan Hound +Airedale Terrier +Akita +Alaskan Malamute +American English Coonhound +American Eskimo Dog +American Foxhound +American Staffordshire Terrier +American Water Spaniel +Anatolian Shepherd Dog +Australian Cattle Dog +Australian Shepherd +Australian Terrier +Basenji +Basset Hound +Beagle +Bearded Collie +Beauceron +Bedlington Terrier +Belgian Malinois +Belgian Sheepdog +Belgian Tervuren +Bernese Mountain Dog +Bichon Frise +Black Russian Terrier +Black and Tan Coonhound +Bloodhound +Bluetick Coonhound +Border Collie +Border Terrier +Borzoi +Boston Terrier +Bouvier des Flandres +Boxer +Boykin Spaniel +Briard +Brittany +Brussels Griffon +Bull Terrier +Bulldog +Bullmastiff +Cairn Terrier +Canaan Dog +Cane Corso +Cardigan Welsh Corgi +Cavalier King Charles Spaniel +Cesky Terrier +Chesapeake Bay Retriever +Chihuahua +Chinese Crested +Chinese Shar-Pei +Chinook +Chow Chow +Clumber Spaniel +Cocker Spaniel +Collie +Coton de Tulear +Curly-Coated Retriever +Dachshund +Dalmatian +Dandie Dinmont Terrier +Doberman Pinscher +Dogue de Bordeaux +English Cocker Spaniel +English Foxhound +English Setter +English Springer Spaniel +English Toy Spaniel +Entlebucher Mountain Dog +Field Spaniel +Finnish Lapphund +Finnish Spitz +Flat-Coated Retriever +French Bulldog +German Pinscher +German Shepherd Dog +German Shorthaired Pointer +German Wirehaired Pointer +Giant Schnauzer +Glen of Imaal Terrier +Golden Retriever +Gordon Setter +Great Dane +Great Pyrenees +Greater Swiss Mountain Dog +Greyhound +Harrier +Havanese +Ibizan Hound +Icelandic Sheepdog +Irish Red and White Setter +Irish Setter +Irish Terrier +Irish Water Spaniel +Irish Wolfhound +Italian Greyhound +Japanese Chin +Keeshond +Kerry Blue Terrier +Komondor +Kuvasz +Labrador Retriever +Lakeland Terrier +Leonberger +Lhasa Apso +Lowchen +Maltese +Manchester Terrier +Mastiff +Miniature Bull Terrier +Miniature Pinscher +Miniature Schnauzer +Neapolitan Mastiff +Newfoundland +Norfolk Terrier +Norwegian Buhund +Norwegian Elkhound +Norwegian Lundehund +Norwich Terrier +Nova Scotia Duck Tolling Retriever +Old English Sheepdog +Otterhound +Papillon +Parson Russell Terrier +Pekingese +Pembroke Welsh Corgi +Petit Basset Griffon Vendeen +Pharaoh Hound +Plott +Pointer +Polish Lowland Sheepdog +Pomeranian +Poodle +Portuguese Podengo Pequeno +Portuguese Water Dog +Pug +Puli +Pyrenean Shepherd +Rat Terrier +Redbone Coonhound +Rhodesian Ridgeback +Rottweiler +Russell Terrier +Saluki +Samoyed +Schipperke +Scottish Deerhound +Scottish Terrier +Sealyham Terrier +Shetland Sheepdog +Shiba Inu +Shih Tzu +Siberian Husky +Silky Terrier +Skye Terrier +Smooth Fox Terrier +Soft Coated Wheaten Terrier +Spinone Italiano +St. Bernard +Staffordshire Bull Terrier +Standard Schnauzer +Sussex Spaniel +Swedish Vallhund +Tibetan Mastiff +Tibetan Spaniel +Tibetan Terrier +Toy Fox Terrier +Treeing Walker Coonhound +Vizsla +Weimaraner +Welsh Springer Spaniel +Welsh Terrier +West Highland White Terrier +Whippet +Wire Fox Terrier +Wirehaired Pointing Griffon +Wirehaired Vizsla +Xoloitzcuintli +Yorkshire Terrier + \ No newline at end of file diff --git a/Example Code Files/chapter7/e5get_breeds.js b/Example Code Files/chapter7/e5get_breeds.js new file mode 100644 index 0000000..7e7d2d5 --- /dev/null +++ b/Example Code Files/chapter7/e5get_breeds.js @@ -0,0 +1,46 @@ +function getXMLHttp() +{ + var xmlHttp; + try + { + xmlHttp = new XMLHttpRequest(); + } + catch(e) + { + //Internet Explorer is different than the others + try + { + xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); + } + catch(e) + { + try + { + xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + catch(e) + { + alert("Old browser? Upgrade today so you can use AJAX!") + return false; + } + } + } + return xmlHttp; +} +function AjaxRequest(value) +{ + var xmlHttp = getXMLHttp(); + xmlHttp.onreadystatechange = function() + { + if(xmlHttp.readyState == 4) + { + HandleResponse(xmlHttp.responseText); + } + } + xmlHttp.open("GET", value, true); + xmlHttp.send(null); +} +function HandleResponse(response) +{ + document.getElementById('AjaxResponse').innerHTML = response; +} diff --git a/Example Code Files/chapter7/e5validator.js b/Example Code Files/chapter7/e5validator.js new file mode 100644 index 0000000..597b9a9 --- /dev/null +++ b/Example Code Files/chapter7/e5validator.js @@ -0,0 +1,102 @@ +function allalphabetic(the_string) +{ + + var letters = /^[a-zA-Z ]+$/; + + if (the_string.match(letters)) + { + + return true; + + } + else + { + + return false; + } +} + +function validate_dog_name(the_string) +{ + + if ((the_string.length > 0) && (allalphabetic(the_string)) && (the_string.length <= 20)) + { + + + return true; + } + else + { + + return false; + } +} + +function validate_dog_breed(the_string) +{ + + if (the_string == "Select a dog breed") + { + + return false; + } + else + { + + return true; + } +} + +function validate_dog_weight(the_string) +{ + if ((the_string > 0 && the_string <=120) && (!isNaN(the_string))) + { + + return true; + } + else + { + + return false; + } +} + +function validate_input(form) +{ + var error_message = ""; + + + if (!validate_dog_name(form.dog_name.value)) + { + + error_message += "Invalid dog name. "; + + } + + + if (!validate_dog_breed(form.dog_breed.value)) + { + + error_message += "Invalid dog breed. "; + } + + + if (!validate_dog_weight(form.dog_weight.value)) + { + + error_message += "Invalid dog weight. "; + } + + if (error_message.length > 0) + { + + alert(error_message); + return false; + + } + else + { + return true; + } + +} diff --git a/Example Code Files/chapter7/e65dog.php b/Example Code Files/chapter7/e65dog.php new file mode 100644 index 0000000..4fbf3a9 --- /dev/null +++ b/Example Code Files/chapter7/e65dog.php @@ -0,0 +1,120 @@ +breedxml = $properties_array[4]; + +$name_error = $this->set_dog_name($properties_array[0]) == TRUE ? 'TRUE,' : 'FALSE,'; +$color_error = $this->set_dog_color($properties_array[2]) == TRUE ? 'TRUE,' : 'FALSE,'; +$weight_error= $this->set_dog_weight($properties_array[3]) == TRUE ? 'TRUE' : 'FALSE'; +$breed_error = $this->set_dog_breed($properties_array[1]) == TRUE ? 'TRUE,' : 'FALSE,'; + +$this->error_message = $name_error . $breed_error . $color_error . $weight_error; +$this->save_dog_data(); +if(stristr($this->error_message, 'FALSE')) +{ + throw new setException($this->error_message); +} + +} +else +{ +exit; +} +} +function clean_input() { } +private function save_dog_data() +{ +if ( file_exists("e65dog_container.php")) { + require_once("e65dog_container.php"); // use chapter 5 container w exception handling + } else { + throw new Exception("Dog container file missing or corrupt"); + } + + $container = new dog_container("dogdata"); // sets the tag name to look for in XML file + $properties_array = array("dogdata"); // not used but must be passed into create_object + $dog_data = $container->create_object($properties_array); // creates dog_data object + $method_array = get_class_methods($dog_data); + $last_position = count($method_array) - 1; + $method_name = $method_array[$last_position]; + $record_Array = array(array('dog_name'=>"$this->dog_name", 'dog_weight'=>"$this->dog_weight", 'dog_color'=>"$this->dog_color", 'dog_breed'=>"$this->dog_breed")); + $dog_data->$method_name("Insert",$record_Array); + $dog_data = NULL; + +} + +function set_dog_name($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 20) ? $this->dog_name = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_weight($value) +{ +$error_message = TRUE; +(ctype_digit($value) && ($value > 0 && $value <= 120)) ? $this->dog_weight = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_breed($value) +{ +$error_message = TRUE; +($this->validator_breed($value) === TRUE) ? $this->dog_breed = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_color($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 15) ? $this->dog_color = $value : $this->error_message = FALSE; +return $this->error_message; +} +// ----------------------------------------- Get Methods ------------------------------------------------------------ +function get_dog_name() +{ +return $this->dog_name; +} +function get_dog_weight() +{ +return $this->dog_weight; +} +function get_dog_breed() +{ +return $this->dog_breed; +} +function get_dog_color() +{ +return $this->dog_color; +} +function get_properties() +{ +return "$this->dog_name,$this->dog_weight,$this->dog_breed,$this->dog_color."; +} +// ----------------------------------General Method--------------------------------------------- + +private function validator_breed($value) +{ + +$breed_file = simplexml_load_file($this->breedxml); +$xmlText = $breed_file->asXML(); + +if(stristr($xmlText, $value) === FALSE) +{ +return FALSE; +} +else +{ +return TRUE; +} +} + +} +?> \ No newline at end of file diff --git a/Example Code Files/chapter7/e65dog_container.php b/Example Code Files/chapter7/e65dog_container.php new file mode 100644 index 0000000..53cf47f --- /dev/null +++ b/Example Code Files/chapter7/e65dog_container.php @@ -0,0 +1,82 @@ +app = $value; +} +else +{ +exit; +} +} + +public function set_app($value) +{ +$this->app = $value; +} + +public function get_dog_application($search_value) +{ + +$xmlDoc = new DOMDocument(); + +if ( file_exists("e7dog_applications.xml") ) + +{ +$xmlDoc->load( 'e7dog_applications.xml' ); + +$searchNode = $xmlDoc->getElementsByTagName( "type" ); + +foreach( $searchNode as $searchNode ) +{ + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == $search_value) + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + return $xmlLocation->item(0)->nodeValue; + break; + + } + +} +} + throw new Exception("Dog applications xml file missing or corrupt"); + // return FALSE; +} +function create_object($properties_array) +{ + + $dog_loc = $this->get_dog_application($this->app); + if(($dog_loc == FALSE) || (!file_exists($dog_loc))) + { + + throw new Exception("File $dog_loc missing or corrupt."); + // return FALSE; + } + else + { + + require_once($dog_loc); + $class_array = get_declared_classes(); + $last_position = count($class_array) - 1; + $class_name = $class_array[$last_position]; + $dog_object = new $class_name($properties_array); + + return $dog_object; + } + +} + +} + +?> \ No newline at end of file diff --git a/Example Code Files/chapter7/e65dog_data.php b/Example Code Files/chapter7/e65dog_data.php new file mode 100644 index 0000000..7c46531 --- /dev/null +++ b/Example Code Files/chapter7/e65dog_data.php @@ -0,0 +1,175 @@ +load( 'e65dog_applications.xml' ); + $searchNode = $xmlDoc->getElementsByTagName( "type" ); + + foreach( $searchNode as $searchNode ) + { + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == "datastorage") + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + $this->dog_data_xml = $xmlLocation->item(0)->nodeValue; + + break; + } + + } + } + else + { + throw new Exception("Dog applications xml file missing or corrupt"); + } + $xmlfile = file_get_contents($this->dog_data_xml); + $xmlstring = simplexml_load_string($xmlfile); + + if ($xmlstring === false) { + $errorString = "Failed loading XML: "; + foreach(libxml_get_errors() as $error) { + $errorString .= $error->message . " " ; } + throw new Exception($errorString); } + $json = json_encode($xmlstring); + $this->dogs_array = json_decode($json,TRUE); + +} + +function __destruct() +{ + + $xmlstring = ''; + $xmlstring .= "\n\n"; + foreach ($this->dogs_array as $dogs=>$dogs_value) { + foreach ($dogs_value as $dog => $dog_value) + { + $xmlstring .="<$dogs>\n"; + foreach ($dog_value as $column => $column_value) + { + $xmlstring .= "<$column>" . $dog_value[$column] . "\n"; + } + $xmlstring .= "\n"; + } + } + $xmlstring .= "\n"; + +$new_valid_data_file = preg_replace('/[0-9]+/', '', $this->dog_data_xml); +// remove the previous date and time if it exists +$oldxmldata = date('mdYhis') . $new_valid_data_file; +if (!rename($this->dog_data_xml, $oldxmldata)) + { + throw new Exception("Backup file $oldxmldata could not be created."); + } +file_put_contents($new_valid_data_file,$xmlstring); + +} + + +private function deleteRecord($recordNumber) +{ + foreach ($this->dogs_array as $dogs=>&$dogs_value) { + for($J=$recordNumber; $J < count($dogs_value) -1; $J++) { + + foreach ($dogs_value[$J] as $column => $column_value) + { + + $dogs_value[$J][$column] = $dogs_value[$J + 1][$column]; + } + +} + unset ($dogs_value[count($dogs_value) -1]); + } + + $change_string = date('mdYhis') . " | Delete | " . $recordNumber . "\n"; + $chge_log_file = date('mdYhis') . $this->change_log_file; + error_log($change_string,3,$chge_log_file); // might exceed 120 chars + } + +private function readRecords($recordNumber) + { + if($recordNumber === "ALL") { + return $this->dogs_array["dog"]; + } + else + { + return $this->dogs_array["dog"][$recordNumber]; + } +} + +private function insertRecords($records_array) +{ + $dogs_array_size = count($this->dogs_array["dog"]); + + for($I=0;$I< count($records_array);$I++) + { + $this->dogs_array["dog"][$dogs_array_size + $I] = $records_array[$I]; + + } + + $change_string = date('mdYhis') . " | Insert | " . serialize($records_array) . "\n"; + $chge_log_file = date('mdYhis') . $this->change_log_file; + error_log($change_string,3,$chge_log_file); // might exceed 120 chars + +} + +private function updateRecords($records_array) +{ + +$chge_string = ""; + foreach ($records_array as $records=>$records_value) + { + + + $this->dogs_array["dog"][$records] = $records_array[$records]; + + } + + $change_string = date('mdYhis') . " | Update | " . serialize($records_array) . "\n"; + $chge_log_file = date('mdYhis') . $this->change_log_file; + error_log($change_string,3,$chge_log_file); // might exceed 120 chars + + +} +function setChangeLogFile($value) +{ + + $this->dog_data_xml = $value; + +} +function processRecords($change_Type, $records_array) +{ + +switch($change_Type) +{ + + case "Delete": + + $this->deleteRecord($records_array); + break; + case "Insert": + $this->insertRecords($records_array); + break; + case "Update": + $this->updateRecords($records_array); + break; + case "Display": + return $this->readRecords($records_array); + break; + default: + throw new Exception("Invalid XML file change type: $change_Type"); +} + +} +} + +?> \ No newline at end of file diff --git a/Example Code Files/chapter7/e65dog_interface.php b/Example Code Files/chapter7/e65dog_interface.php new file mode 100644 index 0000000..7818790 --- /dev/null +++ b/Example Code Files/chapter7/e65dog_interface.php @@ -0,0 +1,136 @@ +", "/", "$" ); + $value = str_ireplace($bad_chars,"",$value); + return $value; + +} + +class setException extends Exception { + public function errorMessage() { + + list($name_error, $breed_error, $color_error, $weight_error) = explode(',', $this->getMessage()); + + $name_error == 'TRUE' ? $eMessage = '' : $eMessage = 'Name update not successful
'; + $breed_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Breed update not successful
'; + $color_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Color update not successful
'; + $weight_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Weight update not successful
'; + + return $eMessage; + } + } + +function get_dog_app_properties($lab) +{ + +print "Your dog's name is " . $lab->get_dog_name() . "
"; +print "Your dog weights " . $lab->get_dog_weight() . " lbs.
"; +print "Your dog's breed is " . $lab->get_dog_breed() . "
"; +print "Your dog's color is " . $lab->get_dog_color() . "
"; + +} +//----------------Main Section------------------------------------- +try { + if ( file_exists("e65dog_container.php")) + { + Require_once("e65dog_container.php"); + } + else + { + throw new Exception("Dog container file missing or corrupt"); + } + + if (isset($_POST['dog_app'])) + { + + if ((isset($_POST['dog_name'])) && (isset($_POST['dog_breed'])) && (isset($_POST['dog_color'])) && (isset($_POST['dog_weight']))) + { + + $container = new dog_container(clean_input($_POST['dog_app'])); + + $dog_name = clean_input(filter_input(INPUT_POST, "dog_name")); + $dog_breed = clean_input($_POST['dog_breed']); + $dog_color = clean_input($_POST['dog_color']); + $dog_weight = clean_input($_POST['dog_weight']); + $breedxml = $container->get_dog_application("breeds"); + + $properties_array = array($dog_name,$dog_breed,$dog_color,$dog_weight,$breedxml); + $lab = $container->create_object($properties_array); + + print "Updates successful
"; + get_dog_app_properties($lab); + } + + else + { + + print "

Missing or invalid parameters. Please go back to the dog.html page to enter valid information.
"; + + print "Dog Creation Page"; + + } + } + else // select box + { + + $container = new dog_container("selectbox"); + + $properties_array = array("selectbox"); + + $lab = $container->create_object($properties_array); + $container->set_app("breeds"); + $dog_app = $container->get_dog_application("breeds"); + $method_array = get_class_methods($lab); + $last_position = count($method_array) - 1; + $method_name = $method_array[$last_position]; + $result = $lab->$method_name($dog_app); + + print $result; + } + } + catch(setException $e) + { + echo $e->errorMessage(); // displays to the user + + $date = date('m.d.Y h:i:s'); + $errormessage = $e->errorMessage(); + $eMessage = $date . " | User Error | " . $errormessage . "\n"; + error_log($eMessage,3,USER_ERROR_LOG); // writes message to user error log file + + } + catch(Exception $e) + { + + echo "The system is currently unavailable. Please try again later."; // displays message to the user + + $date = date('m.d.Y h:i:s'); + $eMessage = $date . " | System Error | " . $e->getMessage() . " | " . $e->getFile() . " | ". $e->getLine() . "\n"; + error_log($eMessage,3,ERROR_LOG); // writes message to error log file + + error_log("Date/Time: $date - Serious System Problems with Dog Application. Check error log for details", 1, "noone@helpme.com", "Subject: Dog Application Error \nFrom: System Log " . "\r\n"); + // e-mails personnel to alert them of a system problem + + } +?> diff --git a/Example Code Files/chapter7/e71lab.php b/Example Code Files/chapter7/e71lab.php new file mode 100644 index 0000000..a066ea2 --- /dev/null +++ b/Example Code Files/chapter7/e71lab.php @@ -0,0 +1,80 @@ +"; +echo "Login | Create an account"; +echo "

"; +} +else +{ +echo "

Welcome back, " . $_SESSION['username'] . "

"; +?> + + + +Dog Object + + + + + + + + + +

Dog Object Creater

+
+
+

Please complete ALL fields. Please note the required format of information.

+Enter Your Dog's Name (max 20 characters, alphabetic)

+Select Your Dog's Color:
+Brown
+Black
+Yellow
+White
+Mixed

+ +Enter Your Dog's Weight (numeric only)

+ + +Select Your Dog's Breed

+ +
+
+ + + + \ No newline at end of file diff --git a/Example Code Files/chapter7/e72login.php b/Example Code Files/chapter7/e72login.php new file mode 100644 index 0000000..3c237d3 --- /dev/null +++ b/Example Code Files/chapter7/e72login.php @@ -0,0 +1,82 @@ +load( 'e7dog_applications.xml' ); + $searchNode = $xmlDoc->getElementsByTagName( "type" ); + + foreach( $searchNode as $searchNode ) + { + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == "UIDPASS") + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + $dog_data_xml = $xmlLocation->item(0)->nodeValue; + + break; + } + + } + } + else + { + throw new Exception("Dog applications xml file missing or corrupt"); + } + $xmlfile = file_get_contents($dog_data_xml); + $xmlstring = simplexml_load_string($xmlfile); + + if ($xmlstring === false) { + $errorString = "Failed loading XML: "; + foreach(libxml_get_errors() as $error) { + $errorString .= $error->message . " " ; } + throw new Exception($errorString); } + $json = json_encode($xmlstring); + + $valid_useridpasswords = json_decode($json,TRUE); +// …… code to verify userid and password …. + $userid = $_POST['username']; + $password = $_POST['password']; + + foreach($valid_useridpasswords as $users) + { + foreach($users as $user) + { + $hash = $user['password']; + if((in_array($userid, $user)) && (password_verify($password,$hash))) + { + + $_SESSION['username'] = $userid; + $_SESSION['password'] = $password; + $login_string = date('mdYhis') . " | Login | " . $userid . "\n"; + error_log($login_string,3,$user_log_file); + header("Location: e71lab.php"); + } + } + } + } +} + catch(Exception $e) + { + + echo $e->getMessage(); + } + // code below executes if the user has not logged in or if it is an invalid login. +?> +
+Userid must contain eight or more characters.
+Password must contain at least one number, one uppercase and lowercase letter, and at least 8 total characters.
+Username:
+Password:
+ +
diff --git a/Example Code Files/chapter7/e73registration.php b/Example Code Files/chapter7/e73registration.php new file mode 100644 index 0000000..f6e1fb4 --- /dev/null +++ b/Example Code Files/chapter7/e73registration.php @@ -0,0 +1,87 @@ += 8))) +{ + throw new Exception("Invalid Userid and/or Password Format"); +} +else +{ + + $hashed_password = password_hash($password, PASSWORD_DEFAULT); + + + + + libxml_use_internal_errors(true); + $xmlDoc = new DOMDocument(); + if ( file_exists("e7dog_applications.xml") ) + { + $xmlDoc->load( 'e7dog_applications.xml' ); + $searchNode = $xmlDoc->getElementsByTagName( "type" ); + + foreach( $searchNode as $searchNode ) + { + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == "UIDPASS") + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + $dog_data_xml = $xmlLocation->item(0)->nodeValue; + + break; + } + + } + } + else + { + throw new Exception("Dog applications xml file missing or corrupt"); + } +$newupstring = "\n" . $userid . "\n" . $hashed_password . "\n"; +$newupstring .= "" . date('Y-m-d', strtotime('+30 days')) . "\n"; +$newupstring .= "0\n" . date('mdYhis') . "\n"; +$newupstring .= "" . date('mdYhis') . "\n\n"; + + $input = file_get_contents($dog_data_xml); + + $find = ""; + $find_q = preg_quote($find,'/'); + $output = preg_replace("/^$find_q(\n|\$)/m","",$input); + + $output = $output . $newupstring; + + file_put_contents($dog_data_xml,$output); + + $login_string = date('mdYhis') . " | New Userid | " . $userid . "\n"; + error_log($login_string,3,$user_log_file); + header("Location: e72login.php"); + + } + } + } + + catch(Exception $e) + { + + echo $e->getMessage(); + } + +?> +
+Userid must contain eight or more characters.
+Password must contain at least one number, one uppercase and lowercase letter, and at least 8 total characters.
+Username:
+Password:
+ +
diff --git a/Example Code Files/chapter7/e74lab.php b/Example Code Files/chapter7/e74lab.php new file mode 100644 index 0000000..bc49e51 --- /dev/null +++ b/Example Code Files/chapter7/e74lab.php @@ -0,0 +1,80 @@ +"; +echo "Login | Create an account"; +echo "

"; +} +else +{ +echo "

Welcome back, " . $_SESSION['username'] . "

"; +?> + + + +Dog Object + + + + + + + + + +

Dog Object Creater

+
+
+

Please complete ALL fields. Please note the required format of information.

+Enter Your Dog's Name (max 20 characters, alphabetic)

+Select Your Dog's Color:
+Brown
+Black
+Yellow
+White
+Mixed

+ +Enter Your Dog's Weight (numeric only)

+ + +Select Your Dog's Breed

+ +
+
+ + + + \ No newline at end of file diff --git a/Example Code Files/chapter7/e74login.php b/Example Code Files/chapter7/e74login.php new file mode 100644 index 0000000..674c932 --- /dev/null +++ b/Example Code Files/chapter7/e74login.php @@ -0,0 +1,168 @@ +'; + $xmlstring .= "\n\n"; + + + foreach($valid_useridpasswords as $users) + { + foreach($users as $user) + { + + $xmlstring .="\n" . $user['userid'] . "\n"; + $xmlstring .="" . $user['password'] . "\n"; + $xmlstring .="" . $user['datestamp'] . "\n"; + $xmlstring .= "" . $user['attempts'] . "\n"; + $xmlstring .= "" . $user['lastattempt'] . "\n"; + $xmlstring .= "" . $user['validattempt'] . "\n\n"; + + } + } + $xmlstring .= "\n"; + +$new_valid_data_file = preg_replace('/[0-9]+/', '', $dog_data_xml); +// remove the previous date and time if it exists +$oldxmldata = date('mdYhis') . $new_valid_data_file; +if (!rename($dog_data_xml, $oldxmldata)) + { + throw new Exception("Backup file $oldxmldata could not be created."); + } +file_put_contents($new_valid_data_file,$xmlstring); + +} + +function retrieve_useridpasswordfile() +{ + +$xmlDoc = new DOMDocument(); + if ( file_exists("e7dog_applications.xml") ) + { + $xmlDoc->load( 'e7dog_applications.xml' ); + $searchNode = $xmlDoc->getElementsByTagName( "type" ); + + foreach( $searchNode as $searchNode ) + { + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == "UIDPASS") + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + $dog_data_xml = $xmlLocation->item(0)->nodeValue; + + break; + } + + } + } + else + { + throw new Exception("Dog applications xml file missing or corrupt"); + } + + return $dog_data_xml; + +} + +try { +if ((isset($_POST['username'])) && (isset($_POST['password']))) +{ + + libxml_use_internal_errors(true); + + $dog_data_xml = retrieve_useridpasswordfile(); + $xmlfile = file_get_contents($dog_data_xml); + $xmlstring = simplexml_load_string($xmlfile); + + if ($xmlstring === false) { + $errorString = "Failed loading XML: "; + foreach(libxml_get_errors() as $error) { + $errorString .= $error->message . " " ; } + throw new Exception($errorString); } + $json = json_encode($xmlstring); + + $valid_useridpasswords = json_decode($json,TRUE); + + $userid = $_POST['username']; + $password = $_POST['password']; + + $I = 0; + $passed = FALSE; + foreach($valid_useridpasswords as $users) + { + + foreach($users as $user) + { + + if (in_array($userid, $user)) + { + $hash = $user['password']; + $currenttime = strtotime(date('Y-m-d')); + $stamptime = strtotime($user['datestamp']); + + if ($currenttime > $stamptime) + { + + // password expired force password change + $_SESSION['message'] = "Your password has expired. Please create a new one."; + header("Location: e75changepassword.php"); + } + + if (($user['attempts'] < 3) || ( date('mdYhis', strtotime('-5 minutes')) >= $user['lastattempt'])) + { + + if(password_verify($password,$hash)) + { + $passed = TRUE; + $valid_useridpasswords['user'][$I]['validattempt'] = date('mdYhis'); // shows last time successful login + $valid_useridpasswords['user'][$I]['attempts'] = 0; // successful login resets to zero + $_SESSION['username'] = $userid; + $_SESSION['password'] = $password; + saveupfile($dog_data_xml,$valid_useridpasswords); // save changes before header call + $login_string = date('mdYhis') . " | Login | " . $userid . "\n"; + error_log($login_string,3,$user_log_file); + header("Location: e71lab.php"); + } + else + { + $valid_useridpasswords['user'][$I]['lastattempt'] = date('mdYhis'); // last attempted login + } + } + } + + $I++; + + } +} + // drops to here if not valid password/userid or too many attempts + if (!$passed) + { + $I--; + echo "Invalid Userid/Password"; + $valid_useridpasswords['user'][$I]['attempts'] = $user['attempts'] + 1; // add 1 to attempts + // if not successful must save the values + saveupfile($dog_data_xml,$valid_useridpasswords); + } + } + } + + catch(Exception $e) + { + + echo $e->getMessage(); + } + +?> +
+Userid must contain eight or more characters.
+Password must contain at least one number, one uppercase and lowercase letter, and at least 8 total characters.
+Username:
+Password:
+ +
diff --git a/Example Code Files/chapter7/e74registration.php b/Example Code Files/chapter7/e74registration.php new file mode 100644 index 0000000..85414ce --- /dev/null +++ b/Example Code Files/chapter7/e74registration.php @@ -0,0 +1,87 @@ += 8))) +{ + throw new Exception("Invalid Userid and/or Password Format"); +} +else +{ + + $hashed_password = password_hash($password, PASSWORD_DEFAULT); + + + + + libxml_use_internal_errors(true); + $xmlDoc = new DOMDocument(); + if ( file_exists("e7dog_applications.xml") ) + { + $xmlDoc->load( 'e7dog_applications.xml' ); + $searchNode = $xmlDoc->getElementsByTagName( "type" ); + + foreach( $searchNode as $searchNode ) + { + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == "UIDPASS") + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + $dog_data_xml = $xmlLocation->item(0)->nodeValue; + + break; + } + + } + } + else + { + throw new Exception("Dog applications xml file missing or corrupt"); + } +$newupstring = "\n" . $userid . "\n" . $hashed_password . "\n"; +$newupstring .= "" . date('Y-m-d', strtotime('+30 days')) . "\n"; +$newupstring .= "0\n" . date('mdYhis') . "\n"; +$newupstring .= "" . date('mdYhis') . "\n\n"; + + $input = file_get_contents($dog_data_xml); + + $find = ""; + $find_q = preg_quote($find,'/'); + $output = preg_replace("/^$find_q(\n|\$)/m","",$input); + + $output = $output . $newupstring; + + file_put_contents($dog_data_xml,$output); + + $login_string = date('mdYhis') . " | New Userid | " . $userid . "\n"; + error_log($login_string,3,$user_log_file); + header("Location: e74login.php"); + + } + } + } + + catch(Exception $e) + { + + echo $e->getMessage(); + } + +?> +
+Userid must contain eight or more characters.
+Password must contain at least one number, one uppercase and lowercase letter, and at least 8 total characters.
+Username:
+Password:
+ +
diff --git a/Example Code Files/chapter7/e75changepassword.php b/Example Code Files/chapter7/e75changepassword.php new file mode 100644 index 0000000..cbdc4cc --- /dev/null +++ b/Example Code Files/chapter7/e75changepassword.php @@ -0,0 +1,169 @@ +'; + $xmlstring .= "\n\n"; + + + foreach($valid_useridpasswords as $users) + { + foreach($users as $user) + { + + $xmlstring .="\n" . $user['userid'] . "\n"; + $xmlstring .="" . $user['password'] . "\n"; + $xmlstring .="" . $user['datestamp'] . "\n"; + $xmlstring .= "" . $user['attempts'] . "\n"; + $xmlstring .= "" . $user['lastattempt'] . "\n"; + $xmlstring .= "" . $user['validattempt'] . "\n\n"; + + } + } + $xmlstring .= "\n"; + +$new_valid_data_file = preg_replace('/[0-9]+/', '', $dog_data_xml); +// remove the previous date and time if it exists +$oldxmldata = date('mdYhis') . $new_valid_data_file; +if (!rename($dog_data_xml, $oldxmldata)) + { + throw new Exception("Backup file $oldxmldata could not be created."); + } +file_put_contents($new_valid_data_file,$xmlstring); + +} +function retrieve_useridpasswordfile() +{ + +$xmlDoc = new DOMDocument(); + if ( file_exists("e7dog_applications.xml") ) + { + $xmlDoc->load( 'e7dog_applications.xml' ); + $searchNode = $xmlDoc->getElementsByTagName( "type" ); + + foreach( $searchNode as $searchNode ) + { + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == "UIDPASS") + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + $dog_data_xml = $xmlLocation->item(0)->nodeValue; + + break; + } + + } + } + else + { + throw new Exception("Dog applications xml file missing or corrupt"); + } + + return $dog_data_xml; + +} + + +if (!(isset($_SESSION['message']))) +{ + // valid userid and password but password expired + echo $_SESSION['message']; + +} +try { +if((isset($_POST['username'])) && (isset($_POST['oldpassword'])) && (isset($_POST['password'])) && (isset($_POST['password_confirm']))) +{ + + libxml_use_internal_errors(true); + + $dog_data_xml = retrieve_useridpasswordfile(); + $xmlfile = file_get_contents($dog_data_xml); + $xmlstring = simplexml_load_string($xmlfile); + + if ($xmlstring === false) { + $errorString = "Failed loading XML: "; + foreach(libxml_get_errors() as $error) { + $errorString .= $error->message . " " ; } + throw new Exception($errorString); } + $json = json_encode($xmlstring); + + $valid_useridpasswords = json_decode($json,TRUE); + + $userid = $_POST['username']; + $npassword = $_POST['password']; + $newpassword = password_hash($npassword, PASSWORD_DEFAULT); + $password = $_POST['oldpassword']; + $datestamp = date('Y-m-d', strtotime('+30 days')); + $I = 0; + $passed = FALSE; + foreach($valid_useridpasswords as $users) + { + + foreach($users as $user) + { + + if (in_array($userid, $user)) + { + $hash = $user['password']; + + if(password_verify($password,$hash)) + { + $passed = TRUE; + $valid_useridpasswords['user'][$I]['password'] = $newpassword; + $valid_useridpasswords['user'][$I]['datestamp'] = $datestamp; + $valid_useridpasswords['user'][$I]['attempts'] = 0; + saveupfile($dog_data_xml,$valid_useridpasswords); // save changes before header call + $login_string = date('mdYhis') . " | Password Changed | " . $userid . "\n"; + error_log($login_string,3,$user_log_file); + header("Location: e74login.php"); + } + + } + $I++; + + } + + } + + // drops to here if not valid password/userid or too many attempts + if (!$passed) + { + + echo "Invalid Userid/Password"; + + } + } + +} + catch(Exception $e) + { + + echo $e->getMessage(); + } + +?> +
+Userid must contain eight or more characters.
+Password must contain at least one number, one uppercase and lowercase letter, and at least 8 total characters.
+Username:
+Old Password:
+New Password:
+Confirm Password: + + +
diff --git a/Example Code Files/chapter7/e7dog_applications.xml b/Example Code Files/chapter7/e7dog_applications.xml new file mode 100644 index 0000000..1eb3b8d --- /dev/null +++ b/Example Code Files/chapter7/e7dog_applications.xml @@ -0,0 +1,33 @@ + + + + +e65dog.php + + + + +e54get_breeds.php + + + + +e5breeds.xml + + + + +e61dog_data.xml + + + + +e65dog_data.php + + + + +uidpass.xml + + + \ No newline at end of file diff --git a/Example Code Files/chapter7/readmechapter7.txt b/Example Code Files/chapter7/readmechapter7.txt new file mode 100644 index 0000000..be107c8 --- /dev/null +++ b/Example Code Files/chapter7/readmechapter7.txt @@ -0,0 +1,7 @@ +The dog_data program is set to have the change log and error files in the same folder as the application. +You will need to change the location of the error log (in dog_container) to a valid location on your system. +If you do not change this information you will receive errors. + +The current version of PHP on this support server is older and does not support password_verify. + +Download the files and run on a newer PHP server. diff --git a/Example Code Files/chapter7/uidpass.xml b/Example Code Files/chapter7/uidpass.xml new file mode 100644 index 0000000..d139ef5 --- /dev/null +++ b/Example Code Files/chapter7/uidpass.xml @@ -0,0 +1,19 @@ + + + +Fredfred +$2y$10$VosI32FejL.bOMaCjGbBp.Jre6Ipa.tLYQrVqj9kiVpef5zZ25qQK +2015-09-03 +0 +08052015044229 +08052015045431 + + +Poppoppop +$2y$10$8xzP2XCGyEVKSuTOB7enjua5lZybhkkqXj6kOSFaEKyE3A22Am90q +2015-09-05 +0 +08062015042256 +08062015042443 + + diff --git a/Example Code Files/chapter8/Errors.log b/Example Code Files/chapter8/Errors.log new file mode 100644 index 0000000..db1da85 --- /dev/null +++ b/Example Code Files/chapter8/Errors.log @@ -0,0 +1,2 @@ +06.06.2015 03:02:44 | User Error | Breed update not successful +06.06.2015 03:00:55 | User Error | Name update not successful \ No newline at end of file diff --git a/Example Code Files/chapter8/brody.jpg b/Example Code Files/chapter8/brody.jpg new file mode 100644 index 0000000000000000000000000000000000000000..71f14ef5e25dca746d21cc8d293fbeed55a0bf41 GIT binary patch literal 234326 zcmeFXcT`hf+cp?PL7E7PbWlKA=)I#Ny-5kZC_My1?@dKOsZxS;L~4Lg6GBI&_udkE zDAIc`4!`GppXZ%#*8DNw{5NaOea_Cg*2%rgweP)?v#+!NPW@c~JXBLsRRZAQ;Q>@` z55V6=$_YhZupI!PsR`f)008#^M0n(YJGY4ZHu>W{{1+y@#gTZF0Q}o4-t7UvqXXRg z7X|>5@#z19v+y|o+vm1~JCFXyKLQN6```WrpP&C5<1O8mw4tH=RME-S+SA_JjsLXv_Db0~{}+SDx0yeGz55@W5s&v@K6rQV0SR{j#Q#+bUPS`o|1d}(`fq&uWdiYk>Z<+z z@A3r&1is__56ka&{>_XS@E!l(nDG7gd;i9GKlAYar_9@8|FM7A{nNuVw~1ItKu|7%x|wYx6JVV#qO@Iq{MCK|921Ew(wtm|K|@v zynnZW;5PTaqxuj2PgL)`{-3Dc(fD7YiuZ3Wcl7W4hwnqb|E}PFiPqn#zgU0*;64EX zA;G=-goK1dME8kFACr-ikdV?+J|ch2NXN{?NXNkNl#P$$DGLuP0|Tcx7td`Eh=?$A zNXkkG$?yq_2>nwC9uW}{DG4bJ85xbxGlpkE|J(NWCxGHU!2UKac+UWLDDdzp@cy;| zm~TnnyPXaHOo;!s+W~R+9s%KfB4UzT2h{BZz{AJCa~J>Ky}P$V7%%9b0dtq)9_2H^ zmjsV=-Vw66Jr?>9pL3t}Rpl=#-QhhpVJr8KM8r?1X=v%5vvY8Aaf^tGiAzXIDZExx zQdUt_)6)kT7#bOySligz**kz8Jv_aF~{e|TX4r1-akoC2Q$AP-pP^HL@3 z1v~NGmv3i@>+&kVYI?cJt?O8Sj=t;mk<5enZ9WIkRN-Ys#(Uo*kp)u+j*N?w5>XX{ z7@HW_H}{G)s))aU`$s}%jS(Dxl?eR5fXSCsoE`aPj_Vi@BF{=7C*z>6l|56a-yUv) zs9H4N+aMs2PE$NMcr`4Z=K^xBU5@kCS8@^gAF-d4`wXP6$e8|x+oC@ex{KnIQ5R(4A zo!a=jvj~bZf;}0_rDsJG`~_4m%?A0^)D)(h8n-)r*11#nE^$&c$LGPBI5*`&Xs3?Z z=Tpk6iqGvmdk+ZN^X_jc;dOdMRt<|(*zxn4($`sWixF4A-`ojj&~wUDC9tXGy&jH? zdlNShFV^*^%e^$>F7u`?nfa5g!VDg;=dW(FFMy8V+=D#3hjR?%Nym3S7%g9!!+THS zwl-h+R9xfu^~_$;w#BmAbuCu7wL>1QdJtE^?4fCtwS#(zni?*&>l%w9#_!BBY^)z2 zspOr%33Ku11I0soFdVSl+Ay2Lhs6~xwf>>k+>F3Ci3*d>W!4LwPsw(g{%p9YnZ>AA zZU{N@x`nKEvah{6jnFXoBqZI!wkEo+6S*?>r(cjFaoPNV;Nx^u^h0lkjEjk)D?tmc zqx)rjPYpWp;?Akuh&aCkg7!7OCoZ!k{KQ)a4S(yl?dp7*X3cB*y0Wu2JGI%08@VMn z^dVgMDeZBAbg~UVm738OfIcOy-=3OTJkQmZ_M=7Hf zk`EO>qHngsZ}g|$fm!)7Ygs-_)#aO3e_=~nuwfx^eP1U#wI^4Q)9fN-Ann@Y8bVA) z>0P=07eKo6EL*8wQ>jg;qqV!vRmmfxNOu3j`J^##^p@$CzcbEyLMIQ+D(Z)Rg+m4-&){+w&aB`ODkv{Av^{Ego+$BRy) zD?b6Q_-V14(3Sn0ctOd{#x-n{d7R`@i9GUVU#X->e!vCl+8Eu{Q8E}H+Rd`+^EIol zZM0IT4U~Y)o3_{Ru1WXbdu$-OXx9MyGGLVWYNp3!Rwde#0Li-+^VH$F8KpZj?e@^6 z-aE~_V=0xqh^-zMQJUT91d-2WCl12|cLIO9MUy@tTr?(d81cKSqC;Et_@rn90yJhb zt$^`ONVA89_(_Ga;qGSGTpE^>@UkI&M@rG$pB@YW#TndHy5){z^k-nHTeeB8AW6CK zB&qjRLHo|+*Gu2CC-M_Jgxa#3>xs!}e^N!|&}Sv>JuEuUi(?Bn7Flns`(Tv4Q?YJh z=WgicR3;p6@-?-8{w(@;|8hKA-NG?3Ftx6!w%&DAZATg3?T;+b;q_kSRHv?4{507| z=a@l%lxN{C=fbI|@*N*eN(YPDLH{3`L~$^>;@BqH5@|omwV|O8$+1NncS;?}U-^$q zstP5{s;)-i``~q|nYX8NWR0~&oqQ8~p`UUXTf50O6TF9U{iz$7h(G znLy_#>qNt)Y>@qH@912&cpZ_s!n&mKH;JJeF4%7CA|-LH&w>NEH;yLIl!Nkxv-+v5kjdghURbHh{wMC-xD+Z`GEQzH-6nEE(dVzfk}?T)4XXX& z;dx!tFovHP&8v}$r0U7?__<>u?iz777C6#O_uB>GlILgj@i`}}v6cdp$K+m7Mqcht zrU;c*z{t#zI^zRE>1E%fM?a$gDC&9ZQ6XN$WQZT}j!WMpX(d&$I_!_XNWK9wi5on# zPiFELu;m{h;zv5eML1C>@uO?@8MC+~2fSCoS%sxpU3lG&F?@guA=qN?3=W zSQX4t4>?{JOLD@+pMxG*ZSgZy3J4w$ie|NvzF13Bac3G(#mA&0vov*B#}>BbJ&y~z znG+VjUPem2-+SUkuQhSAo_{G__2IqtBtlQ&b-W^X*LOJK(1j18Usx}k=(QjqFN=hW zRsKWia%`lKVYN76#Lc*jv()RNzW{-!3EHAFCNI*w5=uEs?sq(V027$G&}blr_Z-ZA zi|LDekL_v&*5d1#SR%G)z$#zy>&PWbU=mHne+H5>x*dHBzu3JR;&Fzt)c{EXx&Ym{ zLeUIwIR%DY;~0lbC0B5rWU)kw&4*1bQn!yG#8%AV(YYVq2Ne?q8yk7&+znq_eSDQ+ z-K4{cdn*Bj2^WVwJs@NGOloGUt)>JUuWVpt?M@jOnjoS!vs=M0}ERK(~D zGoMz!C*RB1H##~0f_|s~?+_dsLwkFg!W6Sgay8Hx{RgTB_!%d%oA2`e0+hT4q2nY< zK~N@eQCDQo#guYoVT_tMeL6u-MZJn$@`Cy!ChxKZh=ujA0c<27OSX8+T%oyUb`wH>S4q*=u?*P=qlgI1QL4)GNR_b`MUhQYJy+85 zw)-J|=rRDu-uew~P7JVtF~2!7852nTaQ3Ba`|tPRVv;c`cR$|8?c&YnEFYH{sI)AB zMP4?8l43eH6=PP|MwE>gHFe(AI!n1rTJ@;@2?7?!&+dTqqaSDiIqHs#h$B4><01VW ziM%<;Tv3I2Y`3+x|yk^3mK0D_3g3<8TL&WP5}2y62(|z1`F=z=|1yoY$sWD+chzm zdou)mCa&k_4og-!Dbn1m|MM}LJUvRcI;|96wnnd^7Rhvy5$Z1{6aQlDnFIUEnRDCeA?2(qrI@;rC zqWh&Lv8UbChcK=3ak%x$dvXtz(+eiQaxl5)6Qi8A(BZ>)v#~Vutw0p=lYdwj{1dYB z@NA21R#}3#Crm&E7^y+7HZ0uj_Ac2%KmKg|Qo5{ z!JP4HT2ZP`F9)wY=DhYW0WR=9U8XIQ^5T*Iotv7qER@C-FzFO>_3YxUb2l6I{ZFfx z9dbXS=80Yn2^;T-OAFSetlTse)w%HH+gpEX9C2}CV_BVEI%0D>AK!kmr6|?T>TJMD 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¬%Yx-Sb>W`^2pR z@K2_L*Vx1_LTGniSx`#|o*LZ@i0y~WD{LNFqaqI<7*q#t2+P?d^e9-<7?#}MSKW9Y zw01%pTTTl`yo-+}CR{V&*WZpkj;E2OO#;^7pL+TGpuNO;Yl*XPeLRPMJSQ zY0hu2_96pkMOOD>%|C4 zSYT9V1~(sg1KracxNR`K0%EK6H-25XFhoz&MlpI^g+TjUQ#)oZ(U{O$=W#7(N=^vM zL+LZE@l!pxfdX%jev9CslL+6m8Pw{93IXDCS-D@n1y8&5){9f_cAxh;37A|BGw(m| z2zg-8b#U)%w+LBD#&MizPKkN(rND;_8=n~VSVm(WBROShp|sB~EKbtd2fuy!lD2g) zO`=>r`k25~xK^qTwmEb$X8-n)SaV`Yq4PMnHBXBR&ROZ2U_O0k4u$MRm^<}~)CO&! z?#rcJCw_Y>{NLk$EvVrXtxAn`D<`{X5`eyA20sH4(F> zu1-jO4>oUw+XB3B#Bmt!ew@R4f<%@qE_W3kZ~WgST>F)wJPMg@;J%V(>DFndXHHA# z&b4Yp$*B@t$%RJB_AIN1|4z`5``Wnm0ps6%kVa*vX0ZAfag=!CBZbBC4-Rbo?Nhg4 z(5Li~(7D=Pm)RqzdAs}jwY^f@lcma(&A{2D!F@js#E+4fR+0o|Uhk@T)u3&JQ-?sM zzlj{}t3{YHkvOkypS6gTk?rV*71w;V>soXi?zrmF%xw%WSf41R{2AAgO0;mW?RKcx z^f9GOdm@jGM-mIq<^|r*{f$`KIonqK^BJ5R{H#zoh8%MaY7Hi5 zaBQZmu>XctD88>kpaC%_J!}k`36kT7QdkCljVmA*z#|riO6bu{;UQh954pP^)Xph& zOi8`JeoBpOy|L@M((CeiUc10e!sOT@&hW^wS@7q)ooMaXmr7T?eXXTF3Hb~T73#JX zDf&o7xFJQHf$v>Pu{`Bb;N)~>Ekr#DSM=U^L(q9?BFNxkd!S*z3wO;(W)Y2WeH+mf z1EOOwbfy~Z9sA%I8C&30gFnRt{%V;#tE*!WqU8p9EzSz_5RoSAS3DqGOgV6)xtKllBE z{gvoEl}yhX#OhS}&Q@2ukWhgaMlZi6%DR@zCrfF~*|RU;*I>r+=4l+W7FYWefEh2L(ryJI!bDPnAF+lMsM+aX&b z5XP2|b_Xgi%)eiB2ICIG6;$Qod^Xy~^~k$Q{>;9FVAITea>8wzu_Iv6V)n;aamACk z+RHHV7ty>EF&ie%7oNcQ%Cq?p?LFn-?Gw@Zk$8Yx>K|GbSRkMpda6?~3k>HTAb zP<`G}knY*Y7wz=of5W9t?E~X{3K_>{RcVhudq_oa(QN!Nlwy>RidPAkqfOq}bE2g@ zy0^>wQORsagY(`!kV1xkqRXGnz9^+x z%+X%h&p82+_O;!Ht8#$OHH_eud(Z~r@7r1jN9yx`_Dk!H-e_sRN1A&UY>NKa;W2OX zbCh`272(%ZBBkA?{mr6`vIh0R&pT&HAHOPt(e_0zBgCvS#5*40rt~!7U@yL@o3{;1 z0qNgx$?|(O-gL9H!~?>014?c9@TDww{Q|_wcvNTdeeg*Du9`7- zA@ZON2SvR#4|rkI zQIZ}X%xAeOCrr{~CJ4DacND0v`JdSMdzg{sVWv=q!_>XKR-dOrxBTJ+%<8{u7f%Rr z{J#3m?~~pMZ$^*pE?3c;713vig{tMvyBVW_L4HeQ@$FUCTUq$RsPRb|rZ6!_JD%o~Ar}AQ8pC3kQ zQ2bo=V5bL&OVbt?gdm?oU0)x+D{hyGQIMbQ_Yu7eIm0KBUa}p9W#M^G!0KubE*DqUwix+if4}iITi{1&&hKVwIQdySX8t1-BS! z0}JVu`+bVH{K{?}rENd5&`Ooc7GC}r-gc_HExoWPN|)&hgy$L@68d{~8-$Dr-}-Ye zMf}AFls?XkUz8b`HJ~YtoRp>0eA;%~4=BVzdM(zEsBkw*aHku&v z_#y$(JbaCkspJYz*|xVEb~%&S%4V?G;w~T)TBc18%9L;;dnz2}Gp5JqHVpgz>-Zp} zBgaLagT%Eovy>?2aqN-g0lASFo~)G)BLI*;?#*y$+cI{}rODeIhu6c;gB289F*M{{qK^q7LkjkqMK44L;SJU$hK5RX;1aZSlTE(FB3!P z>8wTF8#YdxKEf^7k5baW&K%nB{_!i59}Ccx&f~At+BLRqDW7d=P34uPmoITpL-i>A{UpSLz`#Gte!4VHNo@r=jwGL$MYWM;5V-#1;G`)QoZ& z4|LP5K5jHGll-cV<_zjv{oTqUaU9@3GNxy)ce;oDfnt1^+bb!}o0K^ra#zqs3`NAn z@17$yE5yNWdLze6e^ZL{n3o@TuR++QL$zR^dofp6^N+54^!Q+Kyxzh%_8F1x2>9<( z`dF?M%D(5$NL^n+8w^z#4e()2Ykbq|9B@oJSp>NVwzXT{+V>Wg5oPYoKeqIqiBXgH zvG=y8W4`RX!A}*ioj6YE^Wdxh)<{v>$BTE~b#=ky%WaFtF?UiPWze4fj z!@olO4g-EHY@bH;zOBxBAx(?Q|t)q>(2)i9FyI)$8J2Qa9%qAJDeQgB2L=>ZZNq zONQyYN}&V_TIcLV+8djQBLcBBA3Y^82i${u8fHM5{WLzcaT4#7gqcu z6qHR0VFYUE$@nKrrO%Yrn|^E`FYs4sw&u>1Sn<_t`mmOjM0=}t5b#V6uf%z{o&wY6 z=JWq;usps0e4m@M{Eya&z$psxS~p@!3lLCuN%F9f>4de3vlLU9#$6%(Vp)0g`2N=Y z1w{;7xf`wbqoun=6y!ppSl+&+&vs-5Vs5Ox62xk2z%8ocLLsa8{t6fb7nbO*2fm(1 zf7uYtk6Poo{|*_coQbT%%i^o5lQ=YEpD!?D33N3_DJ zAa%MVwb{wE-p)*@LGwO%vux(MqjHA=7tU3yr@4hLkIg*B{|H7rHAGD zme7=yN0Mi^cBse>A-qTMR{WF1(&$?Hj|1Gf@(7(WV$tK4$egfdg$hQ~pp|Zi^qP`U z53rKCpI=tNH@^a#mmMN#i1WPL-E|ekT7bHr60j*irc8?;2Xtj=Iv~t;9Vdg%mU&n~ zIi=7e^wtfgg_B5FgFi-L%zHe{B=3&&=zgojMOK;7QX}C+UEW#gJH-aHj6gWs`49(J$X~HWhL%>H{;9u9{jUraca_Ej zZCjf!pa0Bz=AE5Ems93Q+Volxdo)$|?3J3)dH>112reI`wHMX^vfY)Beg`=O{_4+9 z5q@?mNmQ|%yS^khW<(C{syzmz2 z--aM-ac$Q5M-3JnKaV5o?Bibb$JRLGf;m;Cv6(Z^<%cZ{ zQnMcF1j6S%PPCU5W zSXFIJj1KGbF~rXsb`vkGg5{@Vy~e9bC^PFe5eMU*dON~MG68O+Jp!;Zoiw)dDLup} zNSs?u9~P~oZ@8M|Lvd>>(Azk+`o+SC^3hgb&WZC)ADS#bpgc$San7-Y@buzP#k;C6 z?HtjS|K2#ncRx{_gmhbOckB_o4KbO+17rCyF;E-1WU2N|c3a-0kYXo6i%^^9O*>JM zI8C>a=Q~@n^up*RQlqtkdn|7zJlC}NO+ehlLJ8pu?mY|EI-sjIj}g&`|2=kCgVfr& zw)W$~^P8?b*~c@uEOy4>-m+_!9?j|*jDg|}|H1?WZQUVQJg6QBQ+t~Qi=K7| z#&4aiBi_||nno>xhJVXk-k6J>FMA!I0g-Sh4sna?d|P0*l5O5wA6|g0rCIKp--j4b zSKC0ZtQ#}{pqWxPhk*V>@|)iwMfz#3PElyt=(^I?xoC6vejUe@%oFUKh>np$b(=Hk zPC@;o8P}mB0Vvz1Ck=WSH*VBu@}6w(JQ0|6^LuTB{cjc>5m9?Kj{xL(5APAtlMSn=!;!bB3uxDdS^#^&|Wv%i$g;9esa; zZbvT`{#1*cxp14ugP451dJU>V%mtaRr?si+x_xqQYFKlBezBXp_}=v+ptT06in7IW zlek0&NZ!%uN}(|Aj>U+#+vJ{^VhV|s*kIVD1dA%Rsk=34-%isYCd}DNzUuOcF_hn6 zFL_)E|7;?982hHIXzsO0t#7~&uR<+JwV*d0`W_4o(r1&JM1om@8XSP=J+F)rriT@7 zI^5oHl^Jq_NDrhf;xgs`JU$ z>YD#p()Xeum5Sx*~e? zxr8y`IC1pE%ijKh$0zeQ`ILvBR8p&BZH%00tNpH5aCqS4 zBFh?C{9X%nfjrXB`PFEP=R;0>k;0>)e8Asd3#)6Gjjy}UPm=6dtn>1ZtVWfLBu z(cJaw;r!d>>-D^Sv?iG2q_x1ns~n%*PY_kztJ7(&0{pzAS7&lnv5_Im9~DfR*hZ}v zY$H-+i`FL_pHSEA)n?eIM|GLW`iDLTc;FL(=zNXU8Ksi(8iPu%!+_p_xAPqa*^1Hc zih{W`{Av5TYWaaNb!rBs)xcU&!V!>Bi)+2e~tV3cM4TFy12@=D*+2) z)hCO-&1APx0{OI2{D!67!;fkdxX{JF+IyxKl@rx-6Wtz&nZX(-2V`dYU-lXWnnCj& zTpag`?TN9;&RkL3W^!n3-MR&%Qx5!iv__W zZ*C@~rP9j+6wkhaSa0ewmG(4fanoz`zsxZg!jmx|2g@B`H*xN=mD6}Zlqii1G(*c3 z*|xUswwq?d0)S_^rKb>EmrC7}1OAWjvAy8irA1zP1z}3?UHzBaNy{Odwoa3yc^9=U z<3V?W#>ikyZaZ3N!{UNu10OhnDCRl;M$UUkBpmkFJWSficW^kF9+6<#K^zip{>bJO zsk6?1g>ZPaQJ49%rki7G^;f_oVALU}$A2(>hHZUs^6uLUOi{yffmL;lY5S(~rvC@( z`gTAW@ywYd8Q5TO4>wna*Rg-vZj4|{Q>=-4(^y+rh;5A>h=FNG^D10e;sUY~sflJ? zsayBCnZC@AZh${Y0ozd)zDz|QERfV@DTP>;)77l>%TEZdLV__1@>z1kw7b@(DdZ3Eew-PJ1T4{g5Z(flJ~t$9 zBU|4h`LHp{+ z14-7pybPvAFD{kJq&VfnLU{2|LDC{nXxkewkhi|r5$;5Db5rhr5UuU1QgGArQ0Ao> z`PP2H0^%Vey@$uwF{0JkM$3oxIjs$jjXsOZ$ThFIDJ=2Lq-lTiZBtUvy7E)RyL3zM8JhylBf9FIvuM>-KL(NWvFnd7c=Z@NI- z2FvB73CaB*IAs`RG1eb;ZBbgP#8UKDJJN(CM$>%xXr~UJ4US8ziaMxw~tF#S-&$vTHjAc~L+n+N0ezl!tdT zvp}VAX#@|E7*gOACi#)B{4zVJY)sXs9@5lx4*WygrJvO&^{c(1kxMTM8tTANoc{e+ ze19z9OjlhNY&)-~V#_m|hw>?b$&^tnACW1TLK`^#Vs_`<+KzC@d{DLG(_xaOkU zg?|$pw})quZ~nWsx=nb|`BJs$NCs22RAH#sZwL>L)rmUt`09Yv8SuWg;51{82i8|q z^r^~)59I6wj*4ncMDRy=x1htP>w#G1-ZDvEqtx@(|1N2otT*3Vo4Zx@{PdH`7>QOs z>CWwodkJC6gC~af}vv+Lzp&DI)DX4C|LNv1AdXE32BMP918NI3sXc7vnQFlGPUmABo2 z+z{rnKPCpaz|5HYpN48|H^m$rpM>ALrmIF;zG2}3Gi*gv(JF_hDqjDc-eX-i1G8XJ zl{-E$Dgt&xqxNJTfAGHf*ugSsXE}bW7|2n(K;#UD5m00d#P8@%wgzjBb z(wXKN$1XQ@T*3S-Hy>@?ni$cp*xIL@sBQ!oR`|W3ifG%_f zWY)SoyKRhE7uq`ckzw^ouB_kUk%$^7I6S5yxku2*oatKhcyD8+TiX-wVAjc>6_w>`e9wQV zM5FD3q)lH7dFQToNh4r<`b3k3|u`8nnDaWq9w3pB@sIO(>@3405ci{-OQE3@u&5ZI^J{ddWL zJOX;kl)LD>-|8<|#w_>>S$zTbd7Hi7U-Mk)2>WJd0L?zdEn}`~Z+bR6Ng(Tv((5a% z(|PL-2+jrYg&{{+_8W3x?o?6Fbk=pEf2y~bJ)0+_IDTY9Dp1$;7kfg;Y9QRFA2P#) zaADp-TG{8XGX8ct3>>D`BTW5bUO$cfzPw^Z=f%*=caB3JJ>?DYD19FJSGrJ6uQKbb zMWx)dDbkXZB$ZM`w_R1jF0QK9{w#gbCux=Vj49c%#eu!J3f|;DcB1T-95ON*|B9;~ z>FeJz&{3`O?4>5T!1g$N8IKl^vfora3TOt5av5HnK`>ZpJ`X{xhR=#87H?oq#kUfW z#L8AF!g0!3tlmB$`7k!N#h5-a!Se7kNuztL5c=k}FnQY+kaD-Om8d^f@VTw4tLsA9 zVu~X_T?9wzrn8ueZKjJ9<=`XHEBPU2CO#LSwx@99JxK|MgA!~Vva$WK)CA4EN06UH zFvYCT9~vB&x$Ig(moCb33WlmW2)3+3tZNZ1gEXTOdx$UI8@yy86)e=%UJ(4eOFL^o zg_6VD%6QaNIuAB9bp({$N_l=qdS-%0&5;UKn8spjihqkkuY|uRGi$$35n$SgO0-3} zdK>8!47~0&n1Za? z3jDbGkH#+dcO^J>c<*4Cpgs=h_H&cB#~i~C(FsE}T!CgFZElU0$PrF9HkJvX%)nS} zRrChffmS)-CB-lw>15itS;g&LEQL#D%=ff=#`rt3mk89w8YinoCb?=5ow*;&d)CP5 zAgp!Ij+}l>pdHf630Dvt-oKbCaps-NC|Hm5#X+j|v;;zb=+D;b<2i$DF$ClqlezM) zHbztiXkR7LYJdo914x}dq21PL){1Ks*L$k5uzXk1MQ`{}4-OFSw{TMZqNx4r_mpp% z2T{+DU}HMfsv zX$Pe!=U1xHNZQZpb^mv6^06|YHuMF-_24WEY~Q!e`PAz9#ZkgM&`?1kp*Go7+^`uY zMgUt1mswqu__o#$cls$d?b6A-;6&`kl=u&T2mWyh`Sp9yW6d`|C9CIS3m_C?bxp#P zH0l6G_a7A7&gFtoc}zLHRPoNSyrQf_%AtOXFqT z|5Xv@(BBSm$>h%4rd^BWAn}r`8!zJxF*6LPxgwb)Z_*8wWN3)h>M0l;NNeM}=ALx6 zn#XKSst>6=L}3qr9(bMTSAx4H{O5N+>F*qpAc~m5%3-nu_H;sNrA8{dMC*Rt zpnvwGc?~IxUQp}KhrM>9v)R<~Ken(xwqqGJuCAjwR-Z7{#!Ion(oq^3H=oTMyDOMP zUrn2dWL}KXm6jM#_YFKa6Yh}~*%ofj>>Z16)rFaa+gHs9rJeE**PDh;&ptX1K$Nf~ zj`^%LZhYU{G?;`%+X@NSWh?@~4e^gO%Su-6n17?iY3!0|DjmlKh7h((pNxRL#k}XjGNKcc^%aAIYDX=|7%uA7kN(I+n z|5g)%ob(E)BNL725)G%E^iXcwG3*?y+Xq`4v5kq?)s^vSQ8w56=1>CtJ^qhbX~u>D zR3aWeJI!=RSE%Mwf=p2kh*}^P?8Fr6kPtuc$?4pa!M-#uSu!mmv(%p9h<}d*tJY@D zegU}fuM8)ck7Wr*u$v3={#c-tU7L>9JXSoL6+W*lIF@iPa+UBf;)IO}8R|ONKd%aN z9qfaBHf)s;iL*t?EsgT%$r11o;`UJ{N|I-Mhc3NIE4@rbl|Jg9r+%K{No3}>ip{Dc z#-v$8QZ*uA(w6^7J&2f6Vy>7nH*0xrl30Gn`A7tyg*_625Jiv_we)i* z=U2!a{x$sGVAo9<|2JadHCMjH>c?=sop!9Z*Y{n567IQNCz=s!9Iy8z9J&ZA$Sz{G z!)Dc1Fc<67&R=BTT)UG(3c>~yKmX-|tU-mY4B!)+4gH7EbJh_^QR8Ho3D#ZtOcY6S@|tgx-6W{|Hdi-*_JXF%Ri?(0NP@? zm%IITtAA~qac=&^p*!r(W_`V6SD?L&5ufHW^JKju9%oD-ts&=LdMeKL6SO>O1*zE_ zf0A`&VRLflnV8lCFl*=KIx_SK;+>~HB;vM{RlR0y4V~;15l!rh+KtJjDA_g(8HuvS zmu6lE(6N!2WgZvFS)qRAOGhEN0Hp>NdRO@}*Nw#sb7sJuvx4`dVvE`*pXkpoiJuGa z&as_dKQY){)L|$++45cg?^0lpK%C5LTE>TL8q}j0Q{JlwiaX$qB}~GTA7WJ9B)|UH z!z-Zu_@kr*VqaSeI-m28E3?-WjKpg(omLBEHomqh+ge_1CDdMSS`JuZy@*?@R25@A z+igh~KU`y^UcsBLu7NOn9cASetEB5;r!RSE@fF{vuPYjDY^wES3p37%^>4aZjVhMP zuGIgWKjuNL8MOj_r2EcV>+BUH7*i{wWCXQ;3?FVsJT@^!OCKLN z9ul8V86)$aLlQ~T#oQ1{!VHo6eF}nFTe0*RhjxYc!927`>L=8&Ym{zWS$X$KPx9U# zp%edqiq3+e>GolxHY$pbfzl|YGD2c>Sb%_l#0G4mdt)O;rwNKQju@qMY(rv}! zOmCTr-gIB(ugizew`qvMJX*dNmrTNt_Z9pb0B`rQp0ias*=3t_!Le{^3HO;jWclDB z-hKs}hIPGG=5)q`j1J^;LBHzC$!0I?Wa0+gF5n)VuU$b&=BbF^URIdn^$IV@MuUQ1 zr|YbvV;@fp{P4p}Xp1vpE?(9RW<45Y{OUL}syxQYTQ507e(PhBFI%?^-!I3yjW@$W zH9qvI5}-JJ#X^~1isY2*WRRG^^Kay_g=gl6S*bk)yldlwgu0SIr4g+@&?M~oL`46P zY-q)`jQZkNkHk5DYo;bL*s>Axjaf&a=gis{A;zL?`)@mn_({c9l%i69t<=Q-(%0yx zyEz(SwvERA{CBc2iF>R)s`CJ)mafYvW4((VC zPm=v>(}p+OE}txHM!zqHg~eMoiaT-8;kVfB^xB7VpH6gFn0z6cPJXdBdU8VCjn~fSrWlmwkEjnQz>_Z>cooU) zk*!%AFi+JV&$8#|)4K50%A>%XsT$X4DrI=tL-hMUY(oZ5pdan1eg)8M8gu@UO*GRI zyhgxdOy^IDMhR9oe|!pbZU9er8b`wcDKA>&W}`>oClNB2_I7cHvr?}cta|bbilSa^ zf2;sd(H=WzLh6ea62hp(y9z}P0Tkhv^I_rfORB{Vy%y z26Q#HVr_SE%>=2~*?DJ0n{0mb=HScUb*)xOc+;xNDfhCozvf1k+&SN=YZZ+Ni`fqnR^!1O5IXpVn=*WHKoZO*i zcc!C$!L(L z#om%$%w&>M+Pg^}j5LqCL1CU>G|baY-9iWRe53E*30`OXNDWSv8~I~w9Tm-RTd)|2 zFYOZ|e|;HkZ>etpA$mJETAxf==KWk-Pwg=|1=Z#o>?bEmtMfzJjI<{fn=Nko$yg+4 zjtqn>hqYIi{8T&Zm%hGRRY|VR8_2+Ht(WEpXKZ*LS1m-Wt6dGUuGyT-=Mm6!hzjq{ zAohW!zE#&`j9d|17x(0^c!|G%ZS1giG~w7{;6dH{7v+pM?!kc2rp((@tzey=T3=?& zpnadV%RsTs13%76R`|gC;#K^!ITlbK7y?zQy4oijye6YnehbY_{+Yg$Z}j}FK8t_! zjm#b;B0B2R<06+x)qP^pqHnvS1BS*59G)?&nJwE-jH~?&%??bHlYH1TKq@Ni$|>8q z)gg>AcCmV`dMEuzZq>K>kmczP`rlz+`Aiq)JP%?x=h0{+EaWs{;rPcJzi|PfXH%dd z0-bl)BBIeP-{Wt{y7=OeUf)MFh=5d^EuQFwCDJOBUpX=&+r`hPcK<%J-x{nDyk(?Z zod}Hete!0`>9HC=Kl2)^mdnHE5|wlRY{tj|srl&go|#}3o#FqM$0>583pS|!{qI9L zGn^Pmt4KM)@1V0j)gwgTkNlv{?7za(2k)>%JL`h(jJLkH&|7e3w?l+o*Nbz_a-Gk` za8CVYVVAt=dpTHPvmJI0HE$!6Z!w$?iT627F9k^uQrhO{!#Rq6XhO5Q@rL(bf-9U4 zkhTHC;XrDl|71dO zs46@{Rl^|)Ci#%Pqag$3W*6hj$*AGx7Ab32v;F7T5ElJ4?XOC=EZD~h>VmJh!sD#= zzcXisJA+C|y;D*OxB^M4oK>vXEHzU$O4Mr+jon>3T1m;g5!vJag~;v{XKwy8Uj;N4 zj!jKox57WOB?C)(vhOS&6n(OcMC4)gEp8;X*`_6i5#O0-8&wUuX}?Qt9M#a!hLVZpnPlbCZ?8{DTvP zEJsSBUR9K7#$`MQ&|LUw)x_AMhLicC@XgQ|^;{Q?JhE$0uPHJ> zf#@E``N864fmdStaq0BJW}~C4ueOVW>P02j92zQ}PX8<-y7%F3SZ?;)aTG#VhmGrT z`x{@RG`V{>H z;nwWJGmzfs9}Z`bag_ZC?)BY2l+ll=9Y^1f^Len3mEm1UDgBEB?RSoxtP;|;pi<`4 zZV_=m@hSGW#vtj+Kh+$ZYvvRxeKJ*08tL$FztCH8p{w#qT)ls`o=X5tM#5BOA9tdz z7w;{$(tMj)Rb6a&EOGu-Q9kdD0Fr-UWyp+#=B10i+dBXCcN@oSNruar>s8m@%BoXu zGqe!NqmAAqxGOm}ylpg>57bi+b>*=@XpJ2`neh-I0P(oO0dnW z2^{_I;!4d+jO+Yxe>R#?l`44^28Ca5@6ON%RBra0&A$2H8Gtvz7e@#$MIqVrB!Cmr zja?-!0ky1e<4)%P%z5E~4Hhq6Z;zXl?E?GqGBz#Coe)xlvCbOQql(@#bNkvdbC>WvPPdu)WPw(VlSojR|{ejQ)HRaD(9kf9-_;#hdpnkPiP;5m_fm?^#O0k+aJ z6s=MY{Y#*Bg7Tf&3wT(KtJK%eD(IoH(_#7XDl~|AP{QwUR%2E-_4abs;fV>wo5^M zIwf)?3J&xgAGN(mj~l76Kl&I=tpTDtF_7ZGkRj;*&XlHk0t}gy&hK?PLUg82-tXgW zCc#tKSyg){!R|gWj;((Rz%x?IksG~=oPSr04aw-1SdyiUxJu%f&JXzrSeUjd8*y|jH0x>RZHjOI3{JMQK zX!$pUUu<^6Zm@8vLBibLZ2!1O?Vw(l0KbkFSVc8p@Ia-KrwUB394g{ZQ<)tPSIKnx z1E(a{TysbsWzD_;tJk<9nvsI`u-Pu#4(H6uF%j-oZEFAFjOEQS6z%xj&3_)qhR^@K zKc%Ku%qJB+l9at-q-4F|8JVerA_g5$aCzBdzl%%Z#Y_>i8|A$B}=3EZs|T{ril`lA3-2iLfc1(&02RVL7j z&mxEN6laF`5x$tb2S?93Y@9DQSL$f=yEY3PH6Rp=IB0Zxz$8EI-Mt4jUEd{?13Zx7 zM|A%+SY2ljG_H`Xw%|FL=<{(OmkQu0S*I}oOQ2)$GP5##v-Z8JsH(D&$@VaR@}>da zBrAuYfW^k1wv|mC#8@Nby4Hw_<8Pbg-E``UE$}Ve&*&?YMT^eG?%IF$nLulHq1LnM z%o~RZYse}$%aLI-S~EhrtsTB&R$1927%Ae*H%mmCLu6i5hcPT$D8mbvUySda*P*sr zb82>xO5iEt;%g(lJN4mw7~wRX)tm+w<)t{y>k^|U`26wjgxp{32)aEy zbF~}cQ&SsT(lrt3l?BQUb?o$bmAvdi%%*QI;GZWwX_lDzQLj*x#HGx1NGFmlj(ChU ziw~e2E9N>;%H#L+BQ58O1tw0{?C7=F)u4+uZsO&rH@JqZYACBnMaIoe%am4css%0< zvbDV~J8YXCS2D7co%okDZ3aYWT8S&gJ^{4f{w>d?-|!VtZ^pCfVWolK5+L)FMNBU& zOjhwC^mO&KgX)SO&zDjv3@M8Xc>TxDUZL0OpdR_qLwR_2)OWtx;(^`Nzk9~jH|TpM z%KbB^1Mh+DJ;}e@fsJnd55q((dO}dcMK-g-zSU%QyV~+f>~-7(Q?}*3xgFFzZ;23m zJqk6fG??_}Y=tFAHxtd)`xNm@!}}(OtP{+8hxE#`k!*W?ei73)w**DkEI)#KBLBgI zCf4~e*30>8wFmrliUbL5MYMEQG-|=nKiPlF{|IMB41k%Bp*L+Ha zuI-k{jR^0|sq8ExYOd}c#vO09q-2+X$`W52Ct3z;$UW~JXFVu#&T8MwZz6QL*GUrX z?hFkdasiUXkjLZa;$o}<7RAK`N#TBd=gM615MS<4uElk62)7xNVH^|2rd_DNiRPwNy#RYN=tmV4Yu}Lqs3VD}e0Yp7^S^*XrGWjZ?b4Pab!r z@KbVbex|wMmHDo{%0!=juL#1awggbak`gA z_;%~DbgnL8{}Dn?AAOgvV&JT1uNKS}=U@0}_C3+^F=RT$=VTHCMxJ{xJhPskYx+~H zJF(dGzsAX;1XytTd**W~ES{M1^5D%Qi|#jCkH&HX4lc#5bIs24`vN(?#C}>b_uNjp zIW&erECOOmo6L71C z;ck8wnr^VOV2hsN{uH|hSzw0NfB34hb?ZlOlYM6Id$Y6U2A(AGCsvEU`3nV2ovuF) z()Q-5O?9KQXCLgv&d@~rW-g|fNIR5%&{pkgYUXdH0h6xJ=`TM&D9no!s=A(;Se@%2 zE+>9he5y0kldv{oyKzv6QLt5H6gCL~>O;fRjP%JrD-rto$T#Cgx``z5HUph}*}*5Y z4Y0&|`R$;(5sroJT(ARu1ze4{f1QHQ*WZtmSjU7+L7WnV4*r1k!m{Gmk4p`(-k(Oh z7c$`4cfV^F%6~S|E=^j`AmXzT9!;sKZsfu0!GRt%hyR`7DntkGYqOiI!*>^O^aJCl&BU-@-jywU-vx4~z4a@sP2o5)&;6^Y@vMX>*~&IDw7-!8Cabp4y`B|zwi}&(iM&Ao1(on=%&^znGcpv>`0kHId{z0^v3@U z*(Z2PuffjhRn<73TGkd-ID9!wo!@{}ELD~F7zOK$-Vg69fkdu-+UfgiocqoHL>}F$ zDecr+OCia`?9`?7YFbQ zu90f0KDl9X+sfFr2-i4kXt7cx*tT&>^ckY4bewcmipur3C3f1y>(w?GA5vUNuXidZ zQx>oT%o+XU<1>fmHKva}2%$OB(TXdUm27Z|8k#rddHRrJf?uLCyF*gpw1#1lp_=33 z->D@trH^=DW=Q@X(PD7JJVk4Bp+4}A`({ALai4N8Y2HaIx9Is5PS2dp!w?F1AUdmFPorpCvo!EKuO@Gft|DZ(NqoQ;~q0|Hzn4O0;`_{ zq)N*l;jSY!Hz65pl01_wQR?I0S^JG0QXCAvolNfOZ(re_M|Oi{tFq~($(xFVf;P!X zl@1DHqJJp&-sRe|YfdWQI+@Op?nor0@4ayBaRWv*>UUH!8?&F55Y(}Ne>7HInwt{T zBNyOUal7mD6T8I4CrZZRYY(anCU3{eP(EhJc+9u+ch&a=P=S)%e0&nQaZWmw3F`L` zgI^UJcWvr)H*z~4nM=?#$A0m$1jsKikl3oDMscfsky>6 zNYspv2anxiTOk>z<;f{>=2##r&HDLi?N{3x9c|wH{OEi|WFvs@ED&!eovO+F8GR4{&?WEk^$4}Zlj+TIa-!jJ|eg`HLHfUQaGyhVf>q*&Mszq${u zIK;2NyAv>1XT|@K3!7>v<(bauM`VMc*7*jW^*kRK~c&w&%-ec^T)2%kpp=y z3~SoACze|5{ZwZp8WAHN@Q0Fz`STZd4y7EK#x*yOf~~S?9X)_dPkb1fhk?=ox@I6t z4Q}WT`xO5b=%H&wcJyBQ4DVfTUC?&hC69m%y%;$mB#+C^s-wg-AMJGm=>r@`X>FF?T;pbH$f!90l zC>6yVGs0`{%mU2(q1m9r)VFX|t=ECii!)PdB1%I;DF3a$!JR}oPA=brL=Dad#B}A3 z2e5v74`uaM&I8nz45r|6Jk1iLUmT@bvoST61MAr&7p1rjGhJV_t4@Rd?8;!(JnJw+ zLq?OeX|SzPI#IQ_+${SQd#w8z6<-1;qp4V)Wpt8Qr(U8XqG4+uU|Ulmqtwl7I5>f^ zs`10c+=ffaUh`RZW#p%}xc_k8Utfp>am+)L=l+yCy<38LKL|*=fbL(`q#&7Ll3K7< zgj@H^cDHT|hxTxzKW@(5{P1Sx*_vZU$2WtddN0u@G4;a@_V$1IG?)qDHwfGa!QMHj zV`$#>>K`1Jp3=PST&(-ZqSD>(!b8u?)~RO|37i_k_#TY#^EsQ_|A9#Ml7TA2=_{y@~E`9r$6gBsh^~@KKUy6V5>p z4-8&Uix|osyIxh_^UgfU+h&;y+p)p@Fz7a9GyvWzs8_4n>Np9-H{E5TlUwG>$4~7h z#tSNDH>4DCnX3v5sT;mzXno@m06Edl*?}9|BkDZ^neDX!YB1>%PE}lq?i$XmW`sLV zEcFh{TonM%jvt_K6;Qg)Fj-K$){T>IuVY236G)Rj&hh4zf!)lTf1>5`gM;`eB|XVA zBJAJgHPkkaO^buz`}j3zQBfYUZ|lp~>iX zy}3^BpGnVOilF)M$SG4kqWw+nU)_;Vn$7imE)Nb2uW&^6g>wUhGSNJv>3;v{Vg!1U zVkfI*K7M)NH);&|YrjNs3sbWHF-q|4$)7AzUYf56Q+Q_}bIre<3G?~XRHp0?R#`Ax zBZ+|g4Q@@@2?eg{^9`vYX5ge&N~WY zUgHkX)fu8vpNt(sNL~r1iL>7{;Q_AkMHNBTkui{xy9w?)*X!>vh!nl(fyPPZNs)2O zYV>yuXxT;6NY^+q%VC3c`MUi*pN-^G&@k+EQexjCO?b9vk0}huU{N+6C_2YpJ)edWF@aO9N&@BmZGf z%D^u2GPflnZ=-85z5%m1DMMF}Cr+ zBBCEwY_};|hSBnQaW`Z1HWI{P#mq6{uazN99{OIwQ_cJhsx^Im2>(0t+w#h3zu8zY zW6gZ0wVn-ko!48@jrH&KJfFCP`Ccg~pU7sj%iX}B#ySNd)BemGYUk2l=z^*8b|U4c zib3+E!3utihphDnL-K}a_IRP*%fIbReluzC?jJPSvpla|jZs_j`R?qIjzcf=SCL&T z#KvtuaMZS@|1hn4=KiPSvS-C|b9K$WI$!Qj80`EI-tL{U+;jSR!JA9W`2%kVaoFYV z%+hl?7B$STB}n6Vz^M5Tzb}Su>nFum9zXQ*HjZ!{*$?L}a0Ky-qYr#E&3(%@0mVZl ziOb`SUw!dT@EdC z!b%kWFiNB1%SEML-3;mJ3a}f@scIbOn?1H*$u(}Ma+!ORy}=dj;KFHo93j|~p4h6Y zr6F-JDYIfKzIWkW5e}T`7&$j&BrF_br88t!F5Nn^k>POwPi-NL+qFX?Tp)m$q(v8g zcbnR%VU-uwueKj4=%B+=NOtqHK!I`G1^I(d3TjM(Jusq8ubTZ9ej;#`_oC+4lsi}B zeI}uqwT4>K=iAUG2O=+*!Ge02pUwO}ade3KLd4lgclFO6pq?2!0Y9SbROPqjWXtr6 z_Oh-Cvr~8&^AFxLkAr|6(AM{_vaSTf;fgeS4@f0fWMGm=HL|_$4Semx=XEtl(K9%I zBe1Mijx$%q&5|CUi2i!7`Zrx6;1bn{lMD%tttDuU2ww1KRO^iL0z6-1EyDCOm{xZ7;C2B?UdhFo|AE`nGL z`$YJ1d7muP&;E>y-oqq-<0^b5iM?KXV3g@zp{rY6p^4m1fa#k z(fzVyxNc!{InqjJL@B__Wqh{ax*~;Hg zwzSmhHC8tC^Xq)q{022*%L<=JTowp?_-p~&SGgrz_wZVX>nU-(hm_1$rJ{Xp5QY2> zLP8jvI_&LaOV-9|*5`{1NtzHi>L{u)m;AttU5tyryQqzw2XIeof@8mFFM1Ul$dGlga@ zYOlxEXzUbc@K)D7&tlgoH1Ftt+K$vN=>m<`E#DB z&reJ2h_&aN;9AVTJG;T7HfS`_TjLnlfcnrNs*JFg#3-WnP(I)on^Q@+eSq6IgWHo< z>y(RRXXh4hczE0G)zHgX{-ywIz~aiC$gTkX-XCTD7ofhbv?Xc@v@Pp)jpoX49Nyta zJEZ(_gSMKZ!V=TyyN~cXn(Y7qFN;<#ha3P)uTQv}9~ado@v=awh9klG37=B~uMcf^ zcA<9L;dsC+dz69Y2x{_VqHGPsk|(Ny{PS@PBg+?r2@h`qBihWmYzZ7jyZ{YAlE6|!|-^`|^ zinzP%@6BSCoq(FvJ921Cx~<7edN4a#nFjw&&vv#*ShnPIwvF34YF%LOULG}~t@pu~ zY_|BR_?%n(laClx^;TwduixdwFKcF9Y0JuER4KuM`_OUTyi=K0pN!j;(7+seilC*` z63il}0T#D=wVjjfn{iEBAi?8mOBy&X?_2N|(GFKyzGLz9e`id`m^$vVrm`S1QFJmP zi?vpd&KWG4k!vRrE-^@}YYO06nEM#Q+Ywi2bI0^Qlx9E)nkXWVVQC4VZPy)v zg`e$sBRvPNjxCaB2RcT_xbSGwZ1qym4vafD3WGtv_0Zdr48x|$s&7~7oemAnd*r-^jE|Yhc9-cPM65A^1(Ui-5Bn=uH?UJy3Ql! zEPWlnag)-atYXC675p9DU(Hu54oEjH{T;8_%^GTc|L9J2+d$;ifzom_pSCeKoz%|a zvqq``I|eV!-JQYPUmy_%?&)Zf;`K;Uh+AoSU5hVPPHzgf` zTf^sF?PK8Hi5Z*JyVhq>DLjKOLVESbw(0fDM-zB@M9G$<;Sl?qkB-%I3S~blcfuyt z98_ImP$l=Rq@rgBv%cg_%-vj+4lv^OulwY@fA~Qq!Td;H+Zkq$;3f_Unwc!97G2>i z5i%PK0Y1O3#sKY@*LB__$}P{#470Z_v@^pcIS-Zh0Li6A$e*-|;Por}xMI5HV{0o( zMHnNWIBdVO-_z)ufR*rq`ilMbsGHk?1WGtU<#y_6;P`LL)Ao>Ci;NpU8 zcehztJfR8pPZ zG@~vp*?vcE=Yv@#_679HwMM{0j=f@|NQ*dM4Ls-E@D``O%t1Y%bg)jIGp0vfLJ8~? zhWt@pp&Vj2LCIdGae|=m3}UxYS(GlP&U2VcDYXSgFbg!yJHwBn)1qIIoh>SSEBWh| zt5m>x@rS+-i=s#R7dQdEJe49yQeh(`TQJo-(qAHptu7tgu$KC3h89S2C@cWW+y6v*JSGA4*?%?l#hY z&W=5O*ufrgTe3x3m+fi-i6us7f%;Fg)?k{c4g(^5zjaP{pJ(r;kJZwpEYJO;^lnUQ za6@Ftf!$Rrd%-s}KJAWFyXhz61d+q&og=yIS&kA2-kE z?Q&LjUlVH1?K65_aLHtM$)~SOkLK}@^7hlwEl)PIVSARW9^)16?2@T|a}SAg3U<^m`ht=sK@ zM~6PU#b|iXN;*DrQ;JeXycd355a3PrLTfC(Z5p)^FI=B>O|KVC{p+gwD*+`pd#U33 zG7NSy`QMx)sbR=XB%{bAs5xHLRO#RiXQhV*@5dT%<&?VCuNlYSg->x)S42Pt&kX(G7cXK)AH?LM+Ox}FR9Oeu z{y4&Qf9sEmmxJjvO1ci0Pl#1nRM98EKmtbA^jenzi-Jgn;7;kduGefX=v)1qno$ED zDdeM1^F{KE@)KS^l#D!?2nLiP9p=K!?BCF;4%k0=XN9`J#qZK1Oce_bO8oC+xhEp` zS@%E-5Agw^;d#c$+mfmZ1XiOV{iI-GgCn@@6=9+IU!-Jyexh0k8&&wBxPYLhZkA)b z;=OsBx50=fE;p$u689468JN1CBDq&dbcbbtB<#~P$q(eSv8V+nm&k ztSHz369W}cVh7r%KO?X1q#`wE+9B>_B6|&G@AT(^`y;TrygNb`>$@!bUhcFT9k%!X z)kuT?`W`!vY^`iSMjM>RF(cr`ePWYrXQq~B){@e&du z4iA#f%-w)5tgf@Sjagv+Ss&noMXumxceur%KV%mkD=r$=A!Qz>kE9ai-;`UV<_I#@ zmJDeI9@n^&QRgq1pqGn1l>IYBNzaxbOCewzupu<=x&tzquv)-Q_6u({Y-LEr+GxEn z{F`l7Iq;E|^ZPf=^2V0$%$(1FPTYjePfeD9g044%58Ir^b4C9Pz*^l6k!1~Z`4O$5 zW-ZWQzLoSje?)T5Q4y8~D!KWWFmt+>lH>UM^x#sd5 zc#?fAw3gqoLOOVt%31Q}uYWd~FM3Ks$S@P{(a7h8=spo~JX_AiCk2a7__*#h8e_MU zKSNI%2X<<$r{0KY01_1yTKyyY* z@#}O|r%KQax|}`YH7uvahhEdF)kd83E9A9!qD6DAm#)|{Cvb8ON54QCXstJbr!8jV z$vdxW$|sdQbR}{oZ5-7<$*&;+PLyhY+nlq~7rru3_n7%=4Zj1XN2%4o5zTTd5tu?MRMGE|Fl2FklD28|5BuLmUNzlByj?n>1(2nfdM#BLoVW_q0U z8)jn^>LyJK2nh#umZu?i3-4^W?FYl%R?RP83_bA%Rz@7$JTCHe#6t|Lahh7y7#+U7 zayON@i-0xFlxf6g+Cq#dGr41@+aE%`Oe49F?bg15QogT=uEpQ3Ee@m*5(*eMQWN|5 zb~}R9c&vlxWmgdVkJe6?@Yx0#nbH8;;r&o&Qqak22&e~9(BIhIgqH`_U(#w!X2s@KSa!aw|X+zk@^C~&*ucNR!uPdKK6E`Z)1 z2$bj&_P7GJ1l2F&hx5$al!6g{BiiPi(a^RRQ+UhwbDzKc16^QcSeF286}D9q%jOxr zfRsq=S|UpQ^GHDnR=7_mzZz72=$PxG?oG`z^XmpfVvnM<4pNH{iVXu@a6BP+T z?MoIH^S;ae)lvs~?CMmV3=B5M6*xF@=~4tov|v+zm3V zqKBO0Pc7IdM0kx5BDa_lkhVg%DC-WPc?KC0hkyEY48|Y;} zqGE)6((40dj-VpHnN<5Il`^Nz{E24`;^c!ORu}Au-{Dse3nPXuT}CsZasa{$MI)Qq>hQV>T;lB1exg9ejYoRZa_bxrQg|Nz$+h)%hyj}P*=j?K*Rjm* zgu3xO`-*B)EJ<7iUeYB_LeJRN%S<0cgqCkSIGMGMy}VE8VH1qY>-+wT0b);3BlOEU z4&#jUgF}czE=qUGUeo{?mFiBROsh;&d;i+t2Ba|RwaHDqu0t)e!hP6Sh%Xkybnn%ny%OyEybczK>QZ1@R5c`FTQJkMsX$Qfbs&2x&9ESVe}M zwbK@a*`JTIdaL9SS)b#p-fvc(S)QJ_tu8%n=Q=|K5^rkMdUmvUU-}uO`SpCUXyqTY zq1kdtfIF?m4%?d>kPxyp`YI%yH3h3_{eAAg8xJ>ebf~`As=%4G1vMgGH3=)9_s6tw z&Fp|H)x2SZiQ};ag8T8E-05Nox`SMYiE`6r>Q^_8nf;UtW)lhr1W9eW|GlnIzkCJW zmEu8SXGJHw)IpdcZicRXQ*f~2x--Nj!wPIXe1LbMszQWKqd;Tsh%fznQM0bi+%YVJ zB{29lb>hK9@7G=p^hmZaWI#GD*JC<2%z~z`NY=~g<0W;!`+crhGNOU*ifgD6h_@nA z&1FRYcLulAuCvIz_k$(aSypLQ8gdcl6=$-E_1kulo96!aM}Z>w-aLU0%K`R#1p=e? z5o@7gQt6X>`6Kg>&}DH$%W4+$HR~`b*FRwU2ab;B3Y@dlJYwpR&UjFv8fqM9x!pEv zkWP{a;8Ui!e>7$+oBPXtt9Jk$eW-M1>LjmEGYNd=vTN#%4QuG7$?Iwgj)9nXd2xO) zBhUR~ZqF~ExrFSB#bBFGTzkNb+x(Gkhh6yko{(u)t8|z8pwLDCtNHadev#1Mw}s$p zmfGj>UewLGMHWe$n6jdx(;bzq!Ae=WzJk+JgRV4ww7C+Hu`)z-&;NiOw2+Wid#?NV zcqLvTz+>!|mWE>3>U(^@lPn`z>hj6F6IADZrNd!}&HKO+O&Fh$XnqEpW*1K;dq_y>Zb&$45D zi}4kRq~^!PPVED#HQCn+ct6QMenGb;SPkRi{urGrKHsZ661wVgm;JEHO($%lCAJ&E z18 zt$yxW=^A$kEPAi|a+`Gho^14j>U|rrXy(rBYA!;y&ySW|$<+Q2=Q=~-L9{4fN_M!9 zRL0(t7FFk-X6l`L#);R>NmAPrv+PcWmFC}f1bt|W*Nr2rB&;SSe0d(@KmUOGnI1S` zm<}k&O{G9{G4j&NUuc&M#E>!wUC1HUGl*j0ePkO>rp0c zbPw2eSz*CA@BTE0S&Xzduor=?q>X%?Uu6Rn46h4D&?El2BR&sj$E>xErH}VfYIzkD zcCJEs**_5*88I&6WnQ_XZfwstco9cQN}O)v3OU@SSDj zujxJZ@bxgp)chY3&}^*vF@GI$G94g)6zqE6f!gEG`?$tp*Q3ckmZ7HQqO6-+B%zNiuE(`eiGH0*Pmk>l2mV&5GXq%5?r zD`%?})GwJ`PTHQgH7`bknEB^l*!UBQr)9&jkpp!A*|W@&#aC~{ ztr`*o@WS{@{F7?YNQHAnej%Msbtlt~3mm{9(Fnj(IWH)CCFzz}=!(KWQ{*)372&rF z+|cj4MRzlJB;BrgltpeM3I}(?2AQrQ45^e^`OSXRB@g}fRX000UCC=59<`1uNQFk_ zrFmD2guR;b%y>Hjs*L_;Th3>~c7k}+N$n|46hkH%r3OB+L__4U_JSLlc+xwpy^;~_ zSILc?Y;gKqnd1?z!tFaJ2~0U6g{=8(MKFiqxZ{eKica%IVL#lzci5wta{85YOCV^k z(8E1edJZd|J5(l$LA8Kf#5I!EkIC&sExxP}J8sWM(E}w-q-0-j0>PzVQs7l{eQ6v? zM#j7Mq9Z&JDW*V+zCvhwWLv4p^t06mf<>xbg!-jG?YRoNSe}tfXfVZS0{Vo#zW)dn57Hs4p-EZEaiAqKD~yTAY-p z+j8NC7|C@6L*i5=idC8N1M%^T#x zVJ^RCFUqZZBMY=Y8Tf~u^njZC4z(p$G1vJYx9Av}cjPS=65M2cdP z&x;$B8gX@Fb3u?R(lUb>?vmH;zV(wk*bMxMkzC9iZ>;|M&4Sm7tX{9Y;4%phUDW&e z0m~pFVayZ|V~*0@lt>Yiq1LUmj~bb$2r-ou`FtZe)v$HHLk!BS{O#ZQ*-M{0iXVgD zXfqn@w@SX`)TV@Ox2q8sGr5CI?7%X`6i$G;ngU-=MaqIcCV&a94fQpE-% z-9Agr%~EhK`=>!&xxp)P?Z(?lC~29&8u7D<+KKvVm|SHVhCe0HNtOKdaznS<{HI@b zzX>0j!Fp)FxV0m?zNj9nc8sAY_xwyPUa-l-rHGKtXunj7U+>1Gdl~jEQ^BY!phLSh zsTIq@%`4+5{A{du2&TCY-t9ksGSiOT3;n=lBz)2^4=dz}7&oc7VH;7pccWSL3QE9` zG%rwdgZKC$Y2;W@1{eB&9G!(*lmFX>v9O4*L6?exGC~@pEV`uGMo2TpKyon30;B~T z9n!I&HpWPm5=O`9?ik(WZ}0m*JjZj~pXh3qORV%XV0V*o^=3|xF@zjmkRlYSy-9GH0y=%Is>%IHpUba z4+in7ZB;>6kJl6FMZ5Qd=$!+KoNY$an@tG)wJ6KfHNEkeCsLINP6xcMxK`dHjtSrw z*n{+ziayF0!Vo#4CVisX0LG>|S&Y<)%BW#ddmOBXwmE(s^c?2dvjM(f8Yu)#R4ClSSBU_GL^ux z`O2c&9Ao%%;Q64N4_AizN>*xd5&zJ#(ezUBxO2&k~0;z8Nc- zxfyM4&PUT^6#=GRtvi!~T<=nh%=T6cpA6)D)=hL;>LZ?#lCy017VXdn15c2ew!1xx z*?9~Q^DlCk7duQbofB!>hWkPw)?7K=$3yh6*=Ii$P3`k_Q4-(QJ4Q~1V6sp97T&IU zf=VKOTxKe(EcFs$mgr8OlHNsgL;*AGsc38}!m1`67>JK_0!h(pmr#Do2Z7+DaVl5F zXv>$%p{8FLLC(^27y=hm(Qt4?CFfdL<$e(_4u}j2P3aDwZ<7%dRuJeN_-0<5vml`i zaH0)8xQp80k=j7A#jJ<7PqfeqXiL94ePuqvHj6d`Gl+v!a*aQF5F9(*q6acOsYR_l z3;)KoK8N*wWK6R%N!O0N^)CF?j`Gaaj;}pof7p7zHm_Nlurr;E!prV^# zg9TK0A=&jqP(=9DsN_b@=Uns805Xe~Q9Ye&m+n$Al=|!=ykd>eLVD~8G|yzpkB|p7l2(t}TIF;RgAvV^F4X3Q-xo`k;Db1)(@br;tA}8w zTJ;>@q#P{x7G*6OzjQM6^{zLpOnCe(bA1R7FBC}6rGUByuvU&+3;}DyIRa(=Ui)REPKk1*SP#=9`yzG~cpI9v=#!qfh`%A`g^2U~-LJEIcdSVjmq)ultM_}eT%4XlS5y*WCzQ#p)!Ck%Cp{)?C zn@&Q;CtNkj+&-V`MArtEO9#( z@#ks&gxvIS=Cz+(`%L8vrOufCQnZlX&yG^-j~cn%fj#k*g1^!MyRCqw+`!{t-yo`r zSXi{L&;laHlY|9oYdf<~q{n#)TE#qFH95d)~`dgu@T+Gv_e_}UM{${(uh~k&#yPv zQjmOEibgE*lGY$@lV1ly3;z-uzB^OU;%N2lF^i(*xEQAg^_`JGmjAEg`gK>yOq+YR zLwuz-sQb{0ZFwn%veI#np70`IP3wDsT+x0A1*P;_HsteQjZFvCReZ9KPJjh2%1JC%xKSk5OO&QRC-QIVN zLN1L`+nr#1jmww0IlZw=@6b$~hjn(z6p2V)14d7($@`J*7JqgE{A+wEI=MD45|vYp z6QX>b{g9I0V~udjnpjqf;=b{P?h3^VgJY8*v{Qk%Xt$H+wn4-Ky;j4Wv9ZZ8f5oDWTq$R@ zd#sXKOo<~K99@=4o`zHE?*#i$OolQ+$ni zSwd9xNuZZh5#Wu$#sXNT#6I1E3W@C-?ymf5X(4uO<-K=+E#~5~?Z4ht^TXsBb8h8f zrdPeSn456}{w!HqFuGmm2E{D4i2so_UqOMUxO#Uxtvf(~>IjbW}n|d;4GO?fR@)(r0Md_2Dq7;99Z}q z*XuJ-p``i{;kQ?-X-DE@h8D(F*37job@;vUp9~?ID~Xyv`!f@`jSbZzYO9!+l^0Ro zLRut_^N3Np52=R92k#C2Qi_=3W%XieKs!VNj~F^rBbwanVheG9$B<2&(_ee}F@gDx zD!{Jc%4ESnf{b9a6w>8|0bg14?1HTx-YvQga+n}s)%e_TJA)p=9v?0lsG_|Pg#r?i zCQ!G?GxCdS$6VszlY)?(ge&|>6EbXAa0Ij^T(M3}w)iL~Fkic(I8^nbH(c@^hvTXr zIV5a)=Gy4R=B7JT?j;LzuZkYr<99b`bI-JMqG40bWUcv5xZ8rAin3vEUPaZrh@EqU zaemy6s(VjcTsFG7lKC%eSf*1^PE=?rnZv6KDl?jfHVj9gUbnR}j)k`nKl@?_W7_Lv zHo?^)87uKS>2<4hUFjZf&U8SVj1Mnv^`3UkTxydKgR-Ln`n&6NmoQ^6B|pya0+)DT zT!qTm%S~fzLhui<_)M*yp}Nj{>S~=s^0GHlySj`*d71t~M-gNGy>Z?d?tr><(?1S*^bY(N7_B~s#6*7tZ``${K$YT+FHCAUC0F{6CCCxmk9|5U+l7fhiQ4MpjZ^MLwz(%Ya6vqCK#@C7K@{rdLYZZHA zE&(oW1D*Kuv~7*Fxwdu~o7oV{9jALP22r&EPBJqg?jKkHYd~laMdF)Q|~K@@W+}VN z5Drd*mLe|+--%sg|1C@@L~5a;4=<9SAaJ6>>v0#FHn{2Iy7{adv|PkI*lYl!n{Yp{ zb+1V$P#KVr7iN9kwN!&ZN*^(8LcQv2GNhoiBHnw`>05vNr>{DhjR{-DD&^7&&7M0e z2_B;^_BC~&jW0ZHvaa1CW0fJ?BV_g^Y`atGmA#i#zJKT_U);NcWrPO ze}}rIzeyPsPO@?$4GoRf2c2gH@`IP9^aZs~Te{~!s*J*ZnLJIbfBOsg`TSeA!xz=O zWO?m3Ub2;l*LeX6(pVpC#Vq4DrAiTQn_Y3vA(ntJb8T-wiR811H0yJ8ZYNC0*p#|M zHa7{LH@w|)`DBPIPkl!adOSo;bRNkC)C5|ARL&+>c0FAXs??vl8H)FVTQfo^Z#(0O zkiD>up)0v+NxuO^2D-Q_u@{e5;&hF@AO^_HcA}{U?ALU%!VicJ)v3GI%(pP_H zo9?#cn81MoYF&4%p{d+lU24((y>5?5i!^+U4=%ssW`X6#sO#6pq;|r^9fIdPD2Btn z@uH}BGhAecoDuEg_Q|t8(5ioX6)7%Tnfu2Em#R~oT4R2|v)HkDhAO6Nol7!Kr?;}(1d{!#fgW`ah;Qu3*b`Tso?SPfpAipQ#F9~yh8u!pMf3AcUnEsTjl>~ z;C<*16-$!LQcut!{e~DgGJGsvZXaXa*Dmw-lZUu?R>A{Ne5?bII5TNlCNN z4Q4O9=n>qE$V2OtH2=D_%;7eT#RR@myqJ0o#>;{S-{Cu2A5!W`9ON$gAqXkXK371!(WZU&{JOK@5Oap!0};!<+`ggpoyd|QiDLw^9aLGqd&QMnj+R`E z;`tFNy7mhbB`^snY+H8RzIu}>>|J0IdK^a-@{|Q1@rDP~)Kg48>k2q$CV3Waa%C)p z%C5w}OW%6xLPQ1Uek&`3yg*Sq&6bfzEMnudh+L{e;l zZ@!?0)Thc9w~8`!I_A%#0dbvdTM6erXFW84p7@;+(2SM3Z$U zSuc!+SJ^ejqUz4q?s|<0WHrmama4cP&xQ*(FYu3Ea(gW;bV4bTi&W=Yfd_hvHl#ZEj}1qKd zA|Tggf9C<=eOmhz6=QinfekX#XAxZHh`y6o3?jz3qeN3GD`8+|QNzWzQD2W3!xbw9%(?U0hP zS|4Io#Ih9Ye~vm-MbzEcy~BX;Li@pYlS*`;uP3c;{B~ikTJ3couXY*Z^8QkJ@%VxZ zzo}Fq(&9H294OYmfJ?QvHJ$H1RNu6eg`~8OJm3a)&6%@&J$u~){jWltXLs92QEMSc!1VKB8fDv<_RxHz7BIkteoN{wq@k}1kM7ad#x~RB? zcMag}!BVE()D~8hD_XM0zP)g*ve+qQxRiKnOoL!H1h4p!csO2;|p`wzkzJog@I-1f*DcpQdq@;y%SVoJ5T zq;HeFRgi_XUutDOsIiTk6=hrbl9Dyc6VCj61a%Xs`z`=w+T1o=r1$gCLAPXF`D!F; zce@qu;coWzdsG9)9g*0Q${Kpo6hE+7OlVG*n%+FMh1L-A>_B@9w(f?cE!dZ=U^q#+t^&ZI|OJW2{39sBz`Fco0cN#_5!WZ!T*mo)|W# zZ8~ADMmjXfmkVDK#J}?UVDp|d`m?_m> za}5Ce75Tx`wo-teM<+$BY}|_QeyJ1_^+t=^EKoxrd#iJWV%~?d+4xBLK6VU?>rhea zRKK=)5UIa=T6OZ}U1uIHq7LZ&Y3<$U>)!NQip^M^`wp>X@vHQQx_)Pakg=Liqr`JR zWj`p@R!Df>#x!g$Z+w#&NcEhZ7%S|p`MCo z@#+w-$DdU=P7#LQJKFR;=1CK6d#K+w=|FF!-O{7-1E)i~yDd9rZ^x1{JkoaG`9$bO zq36CYc~cvYZ--|8_zWgdexEsY9%QF97bHaN6k?NpYjD5)JH4+q-2EU%@V=WV?e>On z<+Gr~o+00We0=_a(Xm>~ORRyR<2u%Mr~gu@Tc_PEH?_Fh7uk(s$v6L^LKfvJEf1=& z-rCy!-AFj+;r%rLxpv?c&!aDq_G$XM$xQd^`y_m=qs3||vU7D_w~Kr$PrcXUKOLDU z%|z)rCrHI<5B6GgGfkA&0!~|)+?&)>S|-$|2S7v4PMw(;WptRN$}US(om1Mo&L{J{ z`99Qwab?Q0+;`}ATW;p}`#gym3!_bL<|LXsf3FD3G;3e~<{ytMnUq<1X8|- z%9_w@9!dLDByadkq#Z>zIW59{T-BE~7Ey>^tf{6tw|2f{1OT8~eOKkY>DyanB=g{Q zuJ<+2S?sTd4KUA&6F)x=)l9eRm)6CD%bFb~#zMSf!Hbxt{%K^Kq-!GAs$9B&OpWM? zaXjX6-K?!mx`rQ^$!>hi>6$7z8}gX?$hkts{YfGLq7`neP|+9oY;ehwM3>30x0dpk zo_Ip;MqxTeor5OqIbQPOg(eP1-@hJ%^Rr^iO&b5vxZtAg<{Z20taYvHouhV7o^pws z<7SVwWn=Xr)TvH@Yh*=-PdSp1Fw7NDG-@E3PPR91R9N$uc!7S%`qWtd6HwUh`JyUM zP%*l%Y;^308<1T8NYuh*gaAjZN@mi(qH$-?b(-JzGYU>lJ#;FdxnxcTmq*uV4g4H@ zG;x^fI%C!y$shj5x~>hwbA456<@Q@ldUmP2half^^lXPN8^u6a)3Q)Qu!QU4s4{X> z=B#+ISiOLdgob-B7W(-1&Ob>_VCrdh!fwZGnkdZ4oVJKb;7FUemES=zM`3$K>?;PB zzzbbB_6uh#e(&_Na%oGMi@S?-5`SFWfAw0lC+?IQnzKtCm&KYbbbrewM6|oyTr+3h z=E@QIAdB@g?hhROox=exk<7Kvo8bDlJT4NG0-$$25!ZFizfeKYEjsYN8N^lis2 zRNAy5!WJbzmV}&WQ^bpZNjr|sM^iN+!)N1?s^@iXHo-=8IkJUbT<#oKmB)eVEdc_U z&dpJ~ky{%;S*G63`@~nu*;L2a_i;JFC}LU9LGb~o!)-jEv)x0xve$+OA!e(fgD{GK zF-ruX-B#W@89GWDRaVC(?OD^ae{bVfk8>8$Jj5BNo=eBTN{zk>M7j z+wf}LBo3$I5-cEL+u{et`gZ^|#j9SjjDE!He<>OthSB7jKxcq9j&&vV+`jsE4Af*; z<*PoyA9V}1GA%1!u8(px;)??Qh$`rpTuL16GhLixDc> zSU+&;!@9S-E@>52-h10purF z(=-}u(KX3&JFZWd31N>lx5zJZo`A}q57i&?m~$v=i$?H&~_MGuneuVjtq zC`6{%wl}5?*2LTq+Al}PVhwF1t&ctzA-k?QblPwlV-h%$mbj7Oi%@;%4n`IUX?D+E z3SDcY$(@-_A(&)(v#N!MdBL~*@TaM6$EZ+hYA9zsil*t-)4M-Zt%Z$wztxo;2E+g7 z$@RiG4V&_nE>C5q1)8*F*Z;~6S2#-Rv1Wdm@fo|zj@urF_cq|s3~$(WRGO3~ub0c< z5~yh;HdL;{0yUe?pl$`>SY+$;&HRRIVL1(LS6?xpaC&}UcoZq-dhC5Ju&3G)tlCka zP~4TA_xRMPG!H@kR=Qhaq!(y0IdG1TOp6m)k$Ol4JHU&uC7S&+Z|wuaWfm)N0JXSr z7iTHAaM!SX%k>Ei@`~t8v6X+ZtoP z&0Hd~$*#8J7H@$$1)XXBSk-^UY{bG_0y@qJFvr^3dr-{++XvAsWk;%94sl)!8mT=o z#%b|{BM+dsX0;gu((hf>u}MFfndQ^!QNrgYbxcrNZY7Uv|?A$n8quGfy z*X@yh#s}#P?_v)d(xHsrFE(J>yv17-GO2KgfPtS}TlKB=A6$3=`$sce!h4-q@^TB) z4*-;Oa83_N6#cIEO&?f~(d=_Jeis+`-lV|imSmL8XoDYX31Ew|IeK3py`ZW@eak+Z zOx{Mhdo2?c}wWu2l6Jmy`;Uay_%_|6$!(&TrM*;t7~{=!*Qc;t&fUdIQy?C{VxYM2T{Dw2EsEhl6ux6c4 zZ_}g|R?%M;+4g6#;OW-gfQ^BD&_hhb(@9{FbuEBb;Gh`8W;Bt38%~9~xa9w^T{j|a z#VABbDkRa;{J ziRZ6$#M8PFV6H2>x%9-C_F6JuUUBhx|GfGpifiRiWUhei9SU^cU*srq3F=@sV*$1ItlT2)+d7og1SnJR*q6^3QBM z0+-$a;6YJB@jt-K3gGjJDcx3WbY}=}c_ch!;wpCY{=Dt21%K^nS-~my;EBnCWDJ{rjLqlIDxVDq?%@Tq z^dK!i6TS18N-5)aT+!m;okO+Hc`L>Pod??6*s9%Sc1ZF3+Xw^UC%XpW@rGqkh^U_K z^#s(WiAI~FN0$&|KZos?3|4Zx`Ap>}N=nOTv3w~@5V`!@dnrX?eu-al({S(Bu17c1 zq>p>&TQ%>cXk^n-;FDdGeWv9MmMHs5!;2?tMgo2HA-$lGvYCUb&<+6^tn0h2)rd6e z;fMuta#eY@!X@=3`sTykTnNjxVl$UbUiG)XGIe%hKhy>Q7(u*K->nt03PG(bf2|?^DSRlRV!?dA}b2rlop-YhzSz zUmfZ5m)pubV93Zq!Wob&)h1zGiMi?HFisA02Q(VjgC?E&zhyfpJ>7qN>V@Sn zt1-n(Ll`;gpeBDZnS^Vv6@ypV&6^V7m93s)En`5&!V(>suUYLeJa_oI{m(1^(M+eO zB(BF4K~P>n3^}evZ!MnL9INpbw(f7HY>oY+q2*|xR|9(BygI!y?>9KRGWq*P_xKc; zrW(g}UX@xn+94N?PPHio+m6ty|qg~VTE3i4v_<>rDHpbd~*hPyi7a-|=p z=82o_vVh~1YIfPbzBP~O>>~s#3z*0$L~cSjOzz<)5=mzY0+`at$j9>0Nb5ekV5XqZ zI+L2;sqS9g8h`Gj_%9d#Shrv06lI-0EM|zb7f{^9K(%k!a)eGQAx%=I{-(OxbDk$WP8I@81^gsUdh58*#07jj{!(JBKcR>nKKbOAa6DHugGnR>HN^G_;+wqMG ze)r+k+NN1U_{HO~l`WQC0#bHVK;(%y-ndbp?7X%ij0AU19IC!X3`rLqg&Er{YI6oj zdzkSRYzJL;L#mt%9?A`VlP3d=b9vn@4lre?EN<`;trECgMUj8g)L5RB2( zk-Llrl`2$WU}lz{uuAjbQ*;9;XmqDQzct+;yfhx9bykvk@NWCvCwn_;{2Kh=vm&14 zG*uBAhQYJtfc+M4O&F=uHoRwC?^quDY9ko*%}t}Be4z%rgeQz6w!xYbQR?Ou-I;f+ zQjfaZHMR9`3MDT_N=@G6&5~SFx>q^gEY>o$#&Bt`L@QN0gxooFt78Jy5%>fgkS6YO ziz7Dt)MsEJkykN8HMu_XlpNzmy}oV;o;hWzcul45lu6R2JC}|p-*&N=4<{CPa$#CY zHG<-;PVISeBm)iGgfZR$r0@F|L$I0s7(GC+Ji~s|id*u06v0a=9l`Py^M!J&AqukZ zQ{k6_$yOP<&EcPOoU*c~O@AjIa(r*oh|SX*nd3U!%4CIc6}tTGVhz5J_T^>sdoE(R zT-ME!WUgvvL=o53vqn7ETQQ9_7v(lf_lUHw*1miLM!gl_8_y6ocS`$-8>j0oSJ{>7 z^B4;E7{&h(=x6{Kb!zAIZzfURVSQQ=U!87ydhhA=OCZ?{QQt4mQB%Nf5kCvTj9 z^jdsN;wM#k07ohFeFCk_6UTd~7jHJd`{pcNNkjDNi$xMu*zrRL{uZX=-Wm1yOj?x0 z+D=sM9>(>aN(IpN>8RYvkaTw2MJm4DNCBmG`hCc~(`P9TC`D=X+be$k28w7ZCzN8V z`$q3wCRDlu;;B$NZnB4mE5N^Ckq$uxEZOcQEPg8!>XYZV*qD4_^d|7}_h5PMkYdTz ze>4t(r*7Z3UQ%@WXLlY=L`}5fHGi0)f5m_@PY!Y_3bh*yOhZO>0WwkYP zAlII@f}STI!)j0{q@<_4Z(vE`dCJnAxyjV*@nga(66|`Bymic7NEF1UBj+J?OOxtc zHQF>o6^JKR?{n(xY7aDl1MSDoBnN$hnzw$vbskHKq#I()Y9TN$W2oILB4lPFG4Q?p zaP4P$NT+VXq2LBDwYuJ}6j6Y8Zbk`!Zn7-euf>37CB7!L+sL}=K+zRtuItlvH}7Ww z!Fm&M7OUe zDhc$JRTGkC+K)3r%7pBg%VCzu9+C0nOtII8%DV0UXv|C`)9N4m(1xi1d^y~06t?8Z zLX#=EEVtyl@PV31&d!OKa^r`%o?VttsJH&I>k(d9p!336BOcJ`<{`-8J?F?|=UKHe z+cGZ7CU3x7m87Al)jCDajWIIwFGF5=RQ=2(5}B>7E}k@qVSZ+NOpH7z0KMUl!?4KP z7azrKvP5Q8ZpcWA1lz>*&B+l&vI-Xxaps>Ru~Ms}b5;rVXMoskp(b~&ZE^o5Pb{ga z;_s`m_CuzndcI`LCh(iwr?WL*bq)V-d(UE5{u_S{OoVf%uT+!MrShaZ58dLy2=1R4 zn?n})E6sLC;pbV2*8VjONW)SJfL-IsZJC5$goMt1Dmf>E=**iYB z31EQcZ;gzFOc45r6VfgwM3Ua{8hWqK1|ofJiC@y#mp;v1+^*awo8CNM(UQZYzs^Kj z>~{a6e=p$`Naeq;LIxh`#-GQ9vQ7=q!KsUsl%Cp3sGOx}{K85s&=nbW^v<%~niPw^<`P}fz`X5VF}vM-0^xV^8(Nv)7`yEo^#p-h zl%WAQw;3dMbF)<=#z7HUzHALC2}>^s#%IsG!w#~}n`kQh$(2J^aSpM~K(fMlCZC(p zrIDL2@@`~E0a-{2D$qPtqF31uIPpL40auOEQM6Og`cy^f9YUe}9y$QrES2Dj(`BbD zJs1eus*osSR_wp0)>xzfkX0|*X==}~3k9{SvwHwrb~a)w2pQUrkljC@KCBV%? zs_XP^YFo14AZW88EanjrMXw%3?i(u~-vw45wxYP4n8({|K0SzbGt=&Fmh%x&fC`HIBBUO3XWH9Cm8dymGWams&Tb{6&MAr#a{!B=ClRZfeJ9gTUp|Q!w1AV=5r&9{ z)*6ninhv>Ar}LDeV!o0)?_qgwZI2F_;gsO(ZhtW%!659p@l`owMZAUITtm1Nyc`!> zUg52Xht9+_Yu@&2hKAi0XX88>2++}e8?5^6gR73$Vdi@u4WsI^h4p zeIKT1<6OmN-~=k$($wFfPsBXm@2}Ly57OQRy4!v)t3QQXws1fI3B~g%(XH?U@;w(% z&y$_MyW%gWL<;ik0*bP$jK6P3rVafUC=XoOVPm(o`#q-=NHxZuYCuF@9LKj{9<-7U zjq~Lx!21>GyOY_cT_w%)7R|gU?gE7hvs$Tb@ZVGfK_8lyIcJd$cz&v{mdm~W3BLV# z^mPX|$5o3PiTkiSzvQ@t%6y;EuiAUTXh*HAr2>6ut8dPnx0hbrqk2qzq#Ko@y^E|) z+Y%3LZ5=S)qGw*^110jAV$XBx5hemr>WYq-8wIIWhfAt<7;Qmg>=XdtT_R1EC#4=( zwFagGvdMuDK;y&daUvZG2$PI8rMs~A32#+YVi8MqFhTizVnhP;O`r`_BdoT+u5t_A)05Mm>LLxbdjoqUvZf;IY-)$hsYR`?V=fFZwrHKDJd; z9A0gm4*RM%m;H4hEv5kh$gb-LAGcKxO2S=~eEL+>X;OBQbFH3P&UAWaNTg`%9M9Vf zY@6!8s+RY31?|nr=C#MP>_$3NrWPLBvS3?8EH#RGNOp9sD{< zC;ECRaEH#y6Lw~IHVxQ5h9W$l8y=+btK3yEk{ZRVkh32HWv$1j5Apy6Z{k@dgYt|JB{6|TQcsyn$c@{vE@0ySe3 z9F<(Zxn`j{14#hFpRJ760UGa7hojCGz>6e1t~;yx3Q(1L2b_7q#)%OI-gKG%35h3_ z)1IiyxR#+sU$Ze6?NspXOmkrcR#Q^va8u^AK(%OhilTr%$LAXvKM8xBa-2WgLvn9q z+PmHggSh5ry2!G&=J^O06{$iV-af20$x}&7lb!d!a2|T|B0y%WUhTw4R<(oLhZPu# z-gYtESTkHQ`p({+ybI)c9=T^7cV!K98*ug7$AjYhp*H6e!+KwXFQe7OdsJ6zO3BD< zEA{WS%H#BELm<5k!n1IHghK!|Sut-;gJ4XQIWF3OH*ernIbJyQrQ_f2Kjy|8znAKi zCwCWMEF8)ACq_{MFt=!=y$X=U@#hV)R%HAU!l2znM{3|6QX%D?*UGkgt8y z9Ia5@!xmfWn-5^XRcI1_6lEVMoAvcQ8B5!)u6#JaJUR|j62-c(l`5<#j|u%LY};Qf zNUln0QT51MJLVDhZzW^Q*SMVsorkK5`+sla6~u|Em=_Ald2{?RZ^*Wj^qGp_c@bf^!K6ikXx-Eu%yN*Ms~1WY-}hS6WVF=dQnK@F53mqmK>Bt z;KnZ(gh>{J`^p!cPax%Y_w6evE)6proQ31G*YUPKp|hO*Lm#Mns1nUD8p8&O^8@fqI_v|aDR#jnA8R<% zy&>M#Y|gsv6TW(3nWE0HiP)^?yy&VIIBMyt7EbgnlyI_jqjMgkVdF1wTJj8{Z?*Ey z3uR;bTQU@LB#k=29=+MR()8jYar?5IoGgCX_%?WDmLY6NKzC~%euz!gUUu(KG!A^f z_K&7qH{4$#hvX}jSonsHQ~hCZW!4@)Pn2)-MBZYs-$Dqi9T9$!7&M*VfV;lFyQO;| zPnMUPsXCJ@S7Jxjk3SzN-4@E=?@=H@qtn7GkR92NO9o=P)*qgMGwX5!m+T4sl*jn6W# zxXSZh?JC2OIR0a0_zBMg;Y3^tVC?j12?bf`yl{c^3Bav?G#U_I(Z9DS2iVyg_3a>8 z)y^@6qD0X3v7h$0+ave#(KFtj=ce16cO4-i?-lJ1un0{vnekdrrZvRW*LpHq>cXgN z)#6sv!*Q04Jv3xM-O2X|tq^@lcO>shnS#JXZS$0?g45Xv>+aSs|NKna6qHDZC~nA( z{d-Eed?IbsCLIK(D1+T?loE0fn?Hv}ZRH-PGwIUStoiB#>@K#aQ|5{&MqpJNC;Q4G zJ5I7b&G?*T7x2^lVb_|zlH@5r_c3jICypHNQQF=vXkCB2i9N+EQ?DYj^|aQ*Y$Ff) z*h3sPSHRR`+Rd4Jocx>fR@}xY$48nL)ity6y5RN?fsgu|$cr*Z)?$FL0YTf!pd|S3 z68$0cfaZ_WMk;>(8xnh~e4%2+gslzoNZ@VVwE2D7Zv;gLe88n?p4-nW!fY;{i-&Iq zU3=O6SOZlRX~VQ9{byO&#VUr{Y54RPU2IsfqrgcA!gpoRKOb4quB(c4_pp%M7HQcY zol<9gZx{!d@>k6lcf9N0;Nua!zXNanR^K{%v)=em*(%hwfYPiy_9k%%JGyw< zsjpGC0z6bvPyGUFwQIVBOk6n3=8_rzIb4$zh!2ljATAj+w!h7|*Z;V#Hd+YXDqG^+ zS1V!A7;z&eJqgP=;~jbcWLEzn+#fkxpLm`jf19UilX+}d(89^qpSWfzlsu5efj&?j zurrkzGnm)?rgXbR2%B4Fda%*9(&>9tT8)cEeqvKt+wY%sSij`!C+O{c;%HxGKKARh zYJaaJJ@8S`ZwaqCRNKNZ&Ptl6CT*^-l;o50HEZ+lK^dEpRGDg{ZlU_E;46zq?+TTVlY&2sVO2sp@C?6c{x3(|RGY*58Uy2;rScp3ETs_DM1#<6 zu_J3A{*=NjM42RA?`CF}YhD1?O!x5hri(|!CT}sA!EV``;F7mTzW->hQjOi;`0aPB zLzuq{uM9*hpfpC1!sftA#^7y_z&)W=f30fgA$O14!?N}2#!tk;DqmC;I)L_M3PaI4d+u%8bAzN(_P(!>mv*P{K2{XMMb+J zzeSGtr$Xd!KB=un;xQ9V^3@W)`q1Tcs-|d9NK9sZ`tu}f;Jd;k8Y3N6h?m$85@Zp%`wCwayJ^k((JTo9met6uTyR^tVxg$fy-b8H544#7S=2Rgl;R<~92{w%%M zH}xz5ZXNzH^{jb14K|(IIsQ}F45y~)C)UV2C;;cq3*)?M^p~ig?4x2vyuNk1%=vZ} z0?Uhn@{G5@F8^6o$445i>E6zLMkKf+tg8)U-$(F>=|K+*I7#QbxTrz_rAZ59uWo|y-{x6?zePNubJlR-SF1M)3PNVT zB^ZtBvR+2h8_PtGNABmV&)(=WM>h&h^@Y7oEAYM3ZNAQ!*ZP=MfeM09NxgA#PjAX6 zPC5)}tDjSV@qqK(nfq+7P1;HG#Ku@@H+Zf!&XnB)@qFvdzd{!rrhn|K?+}!zSvXM4h_vZJZUaHzb z0WXp1*O7OdRehAHmyDG~?98c1x$@2q$Im@%A#Ps+!Sw{w-thq(+s{-asO@Im$xR-W zIY8fIZ+3ougp9c&NyiO{SAFu>GPa7ZbU`20@hgP`c}LWr+Ep(86*ccTZ|}k=X})1i z2(t}?`_}e*LF^roIn&%XP^fQd0;Awd4GImLOc~06;S&QZKk(@WT?nXtu=_kthXQ5)4=J_8Y9BSGhlNT1(K%7zks&VXq|e zUR47nlIY&muzK*>9UyD`Ww7oQ3qAle%F3k9s(@nPkgUn+!W zCJbzf*RQEBRv4~G!igrLUbl5CAmP_Lc^Mj_G;_`J>QW{DWTx(6l5g3(yvFTuvR~J(@`Ze5mUy}Eo?PL4|+O8q9V!&$zU%l#d;b}4rND4rh zK%EMJB&q#<64o}Cg*K9WYVp%xN?$VQ;UAP+q}ymEPU+rxIx`E5v}w3EA&O-R)B8I; z;GLor@3x!f(d-6F)A`aX0n?cr-f&IrVB;R_gCHWMsUoC6mt^d1%`nS$K_9(NuNQC0 zixWuz7u}jKV3p@?J*gFi5jyH398e~g!9Xrqn~&1zHPok*t!YA>vg@V@r~(F42y>v{ ziEmMXB78LbYuCYv`CI>JMzeQ0oHkZcx(1p)1nvhdWYXrxgOikTXQ;hZr}U0RQ#K&n zrO4<}-rw-B>j$&xHFBJT+eOW8$xU`i4Af9GAQJGRXuplA$io#zcNYdjk244qJT0&q zhfEwyR44f)Ro4=b_4#6}L;ICtvFQvyeg`>Bx;akk1&(>{upabm3#tjKp8wzF|Q)c|VG;L3Bn z6K)=E0VwrLf0ZI875$Pa(`r^7cP0^ghWh_mU5_e)bl&e&6$A)6dApd%G<&y14$7%J zdAvgsxTpj;%2nq8HLOx|-eRr8ob?5Mpi{#8Rc%A!=Npp0k3#hlDRh|LG0Da@8O`+c zfwi}(Dudl=ZT+r@MANTMS2~v5PmC>)eymjj^TN6skzKLgiVP1k~^d>{*8{GcS`418*FouP6DNw9%qK8$X* zQrwq?YS0@~lWG-SwKE6>!H z24T|ae$+ni;2GUqXF3SjWNF`q0a^X*aRsklOM^4z!sd#58y>0lOl{S})~#Wfr0tgL zk{SPKa5b-#5^q}}=7&B~iCsE>bdxHlFzP}iv*7RkH7K<2=fFKG zbEoFQfunK)?k%p$EX9?Ynz%AIiW?De&M7$WQ3x>u{cPQJDR!mF|cO z+_~bRAFFk8bCl|bP`(X8{?P#e<-vkVJ%jS=O?Zt-@$b?il5^XdImPq*{W=t>lVt>) z>&4rz?(qvYP?I!4i*~JnX`pOx<}j&duJ>o z_M{A&}C%LadB_)Lv8o_t1x6g0;1&2MubVDr~j z@8CbKx=<+N-5Y3rtmd{(@|)*3Kll)89ETb1z}L}w$JDZm7kl=jmCNJCUcE|HKx~qv zw}+1qN*OD8ax?#sDifPeFE$mAXOZnmvreV6;LXH@wBmJPeo)?RV==`}TMZlR8e*;U z7x7g|Ec?p7Qjpk|W)SMMH+?$5*N71BCdyKEZ_c&hCeeR|c?^uX8O{Dl^;dm~+cIJa zmaPP&Bs{(<=T3u-2Pc|)m|$)R26HDbOj$WylRd3hz{Bi5S43DL=;Fl6R zu*slYNE{~;JJU`B-Y$|YK3vn@j}fwbQ@lM|9Rdv(oQ6O9ZS=6Pm?~=Y#1?V{P{`JK6unK0O zg>Jl%yf+UZU3OrK{BAgBuu#1J0yZu!Ri?lbXx#4CAaU3*@~||URY-K8lNF$|WjDA| zC~49kuv>w#st{jOb-xPrf3q#^jNdR&%D0*Lm-cBK=dC#UPoVn4x{KP$HxYy^CP&Yr zBHec!cBkV$`6qgG>4v28q`bUrwrwo(ZPvGh*T^#l7a!DV`U|TIf5(uK8IJDM z-r3A_Q=O2JtwOqQ3gdc)yeu~3`~-lsAi)3_E?*)?RYl}!UJof9P*UhbdNbV(Fsk{u zy5NW&GCzhcXtbn0A$n?`iI99fzOsyg`>HBL6))S~_*>Bd12rSw$%ROVV7O5ux3 zcpVRoELGxNf2OO*Dc33SS&m6!YZB}z(5SlDW+P(h@a=po9=cu;#jSuiWaEv0Hqg#d zHQMa8Q~1>rF!`;dYtfK-gl*ai#PuUeunP4jW0h%lfzGEkEz<2Y->=SM%Z+D7%6`pr zyvy{VT4SQnY%@Dcv*C(widbmBLbjxG)UD`#eoOJ`#QH&K!C&zfnPlOz*j#ND=)l|b z?{2OK8#acY4?e?R(LSY|gH2IS`?}+hQwIrm0}0D*yoeys6&|JJZVVv3;5bHNuTEzL z(0Sb6`Okvt5uR#^5NP7tNyy0Du~N(&R#9#iH#Au@{J_oUqHJ>qU#AdH=!Tt)-uaw* z@%V2C@v+UWfM)Pyhg}U4?^i)QoA>)zF~ai&qc0KpK<=z2fukv~LOlOT!4U6yi4k0t z^%(uf>~Bs?Id6*pQ+vAKL(UMx`Ucr`O_2w-??Hr-lo)O3LN!eV)y2l4g|56q+NkWo z5@G|G!tDTk`YHxE!WUH?bx~MZaVAdWo2{n{C=v9R+3tkp(*I6Q2*8SkC~@9Lnyele ztHq*QrJR5gjjfPLWT4Zl`efmD4?rKpr9S|ZI4D923C+`TY??52=aRJLuSiKfF_5J~ z*7FRW`74V$KByBtc9CH`s%(l2unHlC{;J_jp)_v4`qs;#nV)u0PHfv8A-aWUpxuO% z4AqBr6Lq;@@trICjc`|R5}Nb$FkR`Fet)Rt^mhV^@JXad}zO^5puLM zw(xoqBjLl~e5bdoQL=YP^nPe zW{4178Pzu9!%Tio?5%)IoUu9;YPc-T2L1u^oQVWd?cM5W*dC;rIDRS8hC%HPoA~{H z4O;Z?iYB!`X=?upB%8Zg8Ipt>QhQE(E53)ZoXK2_PNJyxart1*r@uE4=T7I5%~$B> zr~1E~`krN|5B`<3nvZrOoj+E!ZU_sl4+TrK^`h?hj@5F2HXKu3(t@rhHO5ZRzr0|r zx;jyU|K`h-K?M|}mZ^n#zgyGu-&E_#D1ggrL!OMJ?hlM%&fgb&YZK7@yEL7-yf5Qn z94>nUHKB0<_g5w1@RfxxX~kNcZqPf)x2~sx96fX& zRxOOTdAP2o`!_7%o#57{n7tDxHC7x7`8N*~E_mbwSpAn1$T44Le;JFc-iQOU(XfDx zw)-h6w=0T$AaVGY>!i-xbI7?cBMZ3;DblF8e{-0vh?>!at(lWY2D}g5s8{GQ_so@2 zlTcfTb?_hVU*hUJxxo24JMGR@!xBGQOj^-Pa}>(vJqJkHVbYQ@&wG%VTz&^qWq-46 z-88(6S?@ZPRgpnMka>%9B~tYk-WyjT4gxP11~RWTGyE0*nww&=5T|>-PH`6(XV~C0 zL)gNUz1YMQV@x_wy0r<`BL{O5+Hq!}t(^~w<{AZO8e=cT1=zSs zTgN)yYh4CSAzC<5Ty?9n|Ip+A-l*@Ev!Sr=oA_&2M1k>NOPMVpytL6|?9U*S7Oy|6s8o zX7MwV_`IaLFZaQ2L}2sITO-baJmqHqWmUj9UucVq)6uU&bCc}9S`X^kb9^=)FRi+N zd7b#hJslvUDiq5#&_`-(*5P47-vXgJ`?Vgf>M##ag?QFu;(!Wrb(d9hvU~_VJGX5| zyBTe7B-t+P6OU5`!W+>K5dU4u8A;x&$bNLZ;K$3xX7*goHya%`zvPAGh&Cl2C3u-} z)*%yA;w27L8~wHF))mLJ1~sAAEqC5(_9bTS;e(pyyUcJJ$%9Ypw-gDg6+28t9PJ@R z%`k$US#oOeX4_x9hKEc1UI!0TehucEM5^R0;?K%4md{73_Cmn8FH6R|th#s(}5>Ix6%ww4YN8%Xe;f8JK4)=u;j_?(1GJ~7HYRgC9 z*5jPzedZ<9XJj+H8u8f%P#M;{} zZV8i{H?$}0-)r+KsFY?K#pyel#v>K(%~OcG@eou$x@%fCE?tbC;}azMOIc!WA4zBd z^NJ*5wuJy_rI*T8Q_248=T7K2b24P5JXND{wwkNV6M}EkYrHmhY-aDKkVdxYYlOG? zuIbu3zN#pj){>?YaR7VmIyb4|fR!ymSsKeph*7^VV~0;7sdNT1JkQmtxw+4^QKjis z)K~XZV}fr%ccEsezSMZF#lyvlq+xv9Lasn7+;vo^Q8Ub4(F|CLtBgw!S@p3VX|Kb6 zv=|q7p3J8!ach)QeJqb-IiBFvRAS-+=*|eoS{U zdM}7uh%d0ocS680kU@+ne*Q^~Be(TH|Cbr4@u0tUn%HjkMCQ*WlZ@PZiuw}t+(LXk z&5dqeR@WI#8c8?3@Y8CC-!z+TnS%%i}hDd(}7 z`DNJYq+DpgqZae1vliQw0>(X>szU^ZY&g}amst|T?&%hhyS{P3P>1 zXfFZ+*IE+J6r25`9Me8CEA_GuNy_8>Xd>*HiH&t+QB+|kkzV45=|-EU`gv|M*CfXf z@O8hL!GSWRao}o&6PrW7vx*D(Qx>T!Z0tKI^iF7uR3)u}&aD@;LpdI)Nt;pCEfh^3 zzs?D*KV&PH>*kiyF2C6|?{nOWB0Vmd$>3isnI}0YW|hrD=@9Q2k=~fbsGv5D`ZE+H@r24&g zdiSIvxq|?m11sE? zJlE5`I!a344Ovg9Du|}iB2s(0p!dy=CqrTO(N2!myCMT_evC&etw4cU4R$FVt=aH8D4a`O#X_i}ztAJxvOtGn0}>C4Ow3Gp|Sf1_S@G>KSE) ztQ8q3r+wTzsDba!B^!E=a;7flSWS*i6%@}(;|ktuIReHvB3GeqzQj-Pe>-2<%WMs) z21T0JqqsWT7tG0rg*pX2H+Q;W^rY}){r@gmV3(R+1TRX6WemJwZo00!PI0=|slUaK zYKT^K`~&-VE zQcdhG`?<=gk|@YLt4@rM`@3!H175K8jPdK?AbXsrJ#}3~Pj8gBL1W0auzJ5fPx@M1 zGY}O6e0G2D9q1z*8NWk$V8yFw3Kr~>V>l=^Y8z4Y+Kr#E4K)+x{j=qI;paYY7Qg$H z*aGtfx3(jkswx}c?zIf1U#OOHc;9v0^|=iY>r98NZqfGBgR-L?hWpl=3tCp>u-*xv zII!-sqTP&Gl;Z_2&1}tfQ2=~f-weL*_p_KAs6t-JjE6)u zz3;)3%9@tJEMXhIl*&k%1AB^VQvoxpNDF6nN~KJoyPTWw9RgM<^!;O&#cqFy()|6N zxO&N3XX{x?QVzc6Cn3NW(eyU^h80MNqt9)^;Hbkb;9S5G; z{mT^4xZY4nSuAF!KiW;tT9{Qg#m zy}_%dhlL#*kLex2yy3FUz5t0yKoj?edgIa$v-G_odnJ{DQz@&p(9#l2Do3zE7;pps z20fOCiN@F~Ad@gN;{T-5pc)2!tMxrjB_%SuvZ~uJI@LY$W#VuFq&0IfU$5Z#=0Ftd zXog`-fUU42aByHfGWKV-h1t73p%MuY3*AG?=OMRsz8iFyFDa#i#$JyH2dlanp%P`k z?R;lE(~2;d@R;D>&?#jP{Zvpm>oXZYkyd(5hmI=TJSwOyb9{W5_IPlN1{_38-%3~n zd`XO2(qY{}HL){eZ`Ga)7is9&WLZGDY(EU7-NMA0I~L5Ax$T8YBbI!ZcP-72znW~= zFvsTbN}tc8Ja>t&U{#4Dg+DWXulU&qo?6^Px~=9>S~uPh=h+Hqp^%nn{`uPv84J;I zay6VqvwuSDrRJn^Tmb@Y2Vx{0544w>5t3@t`hw#4vU$s?F`tOzYQ;!bJ4jz5lz! z2%ydg1%#z=p_g9GljeZ!p+6&)-GAP!{>b;kXfy+3Pkq;E@jj1i9U2NQ{hA>fW~5cj z)F=PPl#cY}Tr^Y;md{IsTg4i%lAqL)4di5^HiF~?#yS-hmcU^t44fx3?%=`FZ0QZ#?myuy zGQhuQXG=|iPi&}f=TrPt@9fxv-dQ%=ekwGA2dJFgenQOA1K)2g%c^!$`f3NGH1i%m zuIuH4w4`{!csjx>U$->=G5@*Ra(DCWWen$lob1)tnGOjaM2#(a)yN!4HR&RWq!YxL zD6^!-$-2P)R#gXYW#N3eM;~oHN&*e^f>7GA! zLixD^LZ0}(PA3ez&%D^e=v%TM_fkz>cI1P|>JXfp-u8`*^iLcZi885MH7Q?vn|~IhU|x8E|O->Yj+?8`W(U zs9*;-;PiHCKgAw%4O=p<^J5|jl&RLq#k@4O>^3L;(N66+O&=jrH=7Y~A0JFVx&&~| zURcLrede3IE<`>NEuAFYX0BVU#bsjYToK=p{D=Vb7I{c{>0$Y#UbE5>Pr1moP;L=D zDzW;iHGKO@{Eza;ZSlZNqxd2-?rIFvyRegkV#jf=T;XnVnTmvog}{p1lKH#|Jb*Z; zQ?mTM;Qdt6%eFW3?MAcfQIB`0LI=apkf2r$^Co+UdY}K?tI}YFU0wy%&K|#qx-v1{ z5B|G!texlZ1`q!oyh?pS3&K0r=mdFT1l_$Q%@lfZ@%Nm=ofiS0#R-Ej#Q5-;33>e% zx~BeQGHc4?L!HH0lN2<#-DQ;IJXT;>)u@n8)O9^kS{Q8MJDi@2?6xLQ^2&+7Eoj7q zN0i2#HpJeP%V}E~%dUG@$JdAVodN8iTu4)&yN(+P%1$h|>Gly=c(jrX$8$gX zG^lB==KImsna<`h=hb^iHruuXY|w{wNmPeILGH;Htt7050`E9rn^SycT9Bk-o;fKk7X<{z zT&GnA0uq_exHX5QcK}w0l$k-|fTc91TqNgKD$=VqVYo8g+P)ypqESN{j|mu`NG|`M z(Vp*7`Ae<<>J@KKi;EQHlL$lTX&o)CJQ%TGY*a{gg6*_+tkSu5teT+v@&q)_z+REX z^&{TVa$e`&RsRcaQf)%eo@gw7ivC9=;X7yeyKg;k6UbYsoIA4)6&hA-m6j@pnaK<8 zav)m%(R$+TgDYqB)ni!MVH^LXK5AGin)%1Ms(1xE{cv|WB~JzHwg`GN=arq}I-@R@ z)KcdXc|&8j+dkDR!MHrjca&$Ir)hkmf8$|=XYoKj%*@xq@w0pP3f#fG)ZVMAXXY$o z4WxH-vT?vMGG+?H1d`o7+!|urFUgy5LVx#ZkbP_j(4PN?N~Y4{%;77W#I$2?LqN68 zSc8DPj9cxk!%yMj5Y`4vUHGD45urFP)F?piohe7h&b%&jn6=*`Hid8BsrIk2hp8KB zu9IDSZ0Iec7$!>j$KGR}6rXmJ_{Bd|58Ow*yUQi4Phl*h0 z=3XFoX3u|IY)Sba^djXHe=@mW!aOpI0z}R5Yo2z%%ruQ`SDT9-)JZS`b&~t%B4)>c zN1GbyHd&{!1gLFCJevg>$7FCX;)=rC80YTq4GYXHFn0Q z=3CQWbtBy@D$YXeXOh}RgCBO^=*QBCe_HPT%7>t^_1iX`hyCYr{$Y-63Kd!VV&KjB zTaq?~P3kXqV%B9nyYLOl@2W_++{hH&kj=g1DnWRn+polQ(<`yS+gTom*mSkXkC!HY z+N=UE_{S!^+g`C<0y3t3cCRfxo}iO2&4-G>@1FY$x7`amB6R-#sKX|}sCGqGtNW+C z1v(TF$pg9wTTe}KiuUtr!qzw8>|E)5J1h_Gt+ydW;hl`W9xHi$6UO*rid2ZueXo8hs8U3xI0@+jILzK#PO zR{=Gn89TpF^W-zz;iRLh4_Ra>fU%x45aE`sPTeY}j|OClDXoiNv)?wr*G= zn$j}6``KKuYH@1%qg$~zhsMUnfx5MP*!(4BkqF&x)3B@=qvb>Ng%Y z+vIA>7tgG}E#OU%=jpWUt4{4mcvI?M{&}~H3|@P~2s zDY{wn160At`0KMQyd1x?UB=c0I(e}uo`TO)qw7H8%LQZIxlRbG7`dGL4D>WGQ)k_0 zm9O@A?puW>kr9$3xOlW+go8w2v-7~f6g}`XOsdvGb&u!ApWu-N5oS0=mL5G1e{p@7 z;04ApuEIRN`gTF}iT)|dJ9yh2=C4`r;Vsq?2Ezx}qFKGaxUUe3&(tSCo27^Ld+sxu zFf-lS@$;l9ypOaDl)mlyM#h=)=zVePq9qG&R(JMQ=il239T5_loa1#pwm@2-Nl(Q~ z8E_ZNy4ypdPeA(xzXNV|q}2U)dq8;~nToHjc^BYkr~Aik1mp_8W?o>02$JA`YO&v= zP?8`VSLnt*Y$aXwX=c!mmI6XFrXo`}$X88m+v@Wt)v7nY_dba$q99MYyMno-=Bhk# zMmh?B&%o3oq{5EE7w(*nO~1*}T9?y;nWpXn?|}a<-F-Jwt_n&>(c!z_8B_tM-|6)- zu37N-CQPc7wktdDbWwuWUZg>m|2UODP&iWMkzX9(ztyQ!v)aNHHk!((#~B>(sHeB} zOr$deda9c=@b2Q#3xP(H4qHXU$y&A!$6xuf1Zw0sh@s=~AEbPkZkiTFp@`iK0l98d zN?&uF5CkiC(c*oQEdow9Phv`0U01Tvrk2`$xF9wvuxvl*o`%y>cFL-L`Pc68K@ng; zve=CDzjDuJ4RvkGmMFG9oi3H}qx4l`E$#{Cu8k;+7CLy6Z_IWljlj=elJ4DqwTtj) z@mK1;rde9%K}r4?U(0ul7a_lL_(o#DmlKoN%q52>wXBBHo|$sjYTu28jC^EkKk9@K zT|`{rL`~8eusr=AB5~_24i*a^O;P+7x%v86!;d8`mzhUZ)Pqj_Ahjt=bqPWpk1{T9LF6Isi3un-lbMq%z2yG0 zp$-bvlMS;sUDw!r$JfB-lcv3gBNs1E$j*eLP4rxLr9++=T}txw@)jW|8I zg9_=lLG}Lyn{NZF;dOn7BnhML|`IOudyMLu*h!JJI; z{@RV>>Km&~7~=>r>eKU!hi-oLp$MA~b1KWJbCIOE^{X zFDpSaTOLUt9F@I*?c$^*-SXt|rdV8((fAdB+Z$aP~a)05Jm2-h5mFi3e(*`|}t z3gv(1vKXl?HhbDwW7qePmF$UWJpWdnoPaeZJx}wUV6zZLG1}=R$A)FHwax=#_|240 zWw+K{cE7Px%bYG#4MQDm{<-k`eC3j<5B&Ky&TCCGdW!M0As~Z7(*lSPgQ}<|mW+N+ z_P0%1Lq?i?UKI=%r{WQ)Jn+I`oA55IEA6nVTL)LXd+hzn|f6>EPuo}y(7kP<26ig&L^^WG#$ zOZ<1qs$}-8?X^&OiOy#ClkbQziM}~lgvHU!=cGQoVAyx+OX^bnX^ZfSTi%N!PITMs>o$z z=6RVvCBL~v&pIKkh&ds+tXe=}ztdq3a^G5iFO0dnXF~73k@%MaLg5fAX`4nchVZN@ zub`w%1X}CI+&;T&?Z^fxl=tfArP&9!A8iVTaHpU`OK9KR@IG~;=Rd-IlYuO&^r%_kh~z;?=cwq5jB@!h6_63wFbzXq6DIc2Bkt_C#!7`B$gdaNc;@Kk_pMdnajo%^sA8=wLYBr zl^woqpGYb~CqF!TNFP&1);|BXv~46DREjCENDNf~FjRg+8_h<$nm>InkC(T;_$y(h zqiXu!C2&bq;UU}EYVbD;u=3bwK{Q6A+X#Q_-)Ae|`UxMrwF(%DlPtJaCJ|^}nsEr) zc$V{g_70>rZ}728Je*qM0_?7Q%TSVVRV?5Rh^T zLpXa9i8+WPU;*x1xoj_Ev-zd-6u8=Vl@@7NJNEq*$8r5)&C=&5sQ^^|Y|vnC^I9<( z>;k@A$mw2~_VjZ+h#4)O!l7zDT6OR*zNz1hmRd9J-Vfhc%zAEFAaI2w%wFJ4PHio~iOv@8rglq&zzA(a_{STM6>%~?2yxQJT` z5i^|&d`^{AZm$Q{(K&@}cyq`nZ4h)PAd+ejB8rF72qD#FsQkHW#dbY;1-= z2$);as{bOrAc6&&)u}7P|6O8GbE1Vkvf=ZLOw5;GUSg{V7z_WCCasgN;m7|QtkiYQ zd;>v~UPz#dAp`HNIo34n9x?T-i>!HE{qIt%KE38VkTucq;PZ-QnUQ11o0KgL4X;x^ zZu8W%oZbJbGkQVvL6s?)QZc+7(My=3rT}h*^N2Ii?1vd5cV+}U*XkKd;_KCx?4(*x z!;T|>ILoV3AJeuXmDy7biGm%Z$DV$SR^Ytle_PwePY*fyIk>bscs{Y;X4~#oQ9XGNsH1;^&(nqdQ8YU_-l;u%IkEnGx?_42 zZ4j85SD&1fr{uL^5N)5$*mM(7;ak8|8AkOjx6n#bdH^`cU5RAlfEsE~B$mtR9GffR z-0cL(C?!3|-T1LRF9W~>v)%wX4}eSivdQ5G9si!@{O1Ef0rWm?YTa?wg?wL{0FnxAUo>j_`k}k0h-rO3$-G9Q&`k~SJwQ&x_-`!S& ziY*~Wyf2ceHT;HN%&uPU5u zvUeZapLXZGK&Z=YPgsInR*I~OIQxB$o*OsC+1AxV3uzPP;QbAok+?$vQ+$+-_%Ee; zYflJBzwU4EC$kql+$q|MG-zFZP=}}6Z~6pkq<9?bYni64)S z%$Q0=6PZto#$iUALH2#|KNhxJ^@_9SjI*d1j?2=2%qYJGfT-Vkzb2Fb!e^ z%Uohc-%KrV#O73KSr#6rvdoUY)AW8(lH6IsMPNM9 zyE^yk4wqqslxL$Y*ea>tog4S}+Pa2B=tF>`^0anUUZ^I>Yp^}hHoRyf_U~QPZpm3G zNPm3ycWKDfhLskRjaDL0cFyxat#05>JPqYeYP$cxj(vFBqa1O|50xXB%{ zc#cnCiG0M?+lNWhoyJ896`rF4v(5bR{f44HgS{;MRfUpvO?J<>q+fzZIW(ddM4Ng` zYN>22HbvyEYr+#kFJ_#o90C+W@oRg$$yYFdVC_+gS**14=``SpCSjz~)|9={V=2BJ zA|eA<;y(CZh75`T6cOlbW$k{PxlcF?q&e9e^L2nac-8TS1MZP5HQ(wka(eb0*R-4;!?h|q>luPTkz;+R~2OU#|l>xNaKG{6E>++LT8a6b3rxWi4`ET1(a zapbUA`tK63eyO719h5yc$=|rho4c^~b{!!#&*z$I%HVNC$1gI`l{fHW8dm8cSYU<);gBz_VOHPtH4&?M{M^3k<-Y(sag|D{qG?`4^IY? zK|KQ~^ot?x6kA41r`V7cAHRnveQ%+=npMc^X7ylm9?_QRqd1ac*dZjgp?{1<3#U zKaCfQ{;7=B+&ar+#w&N}8R|s%sJx>-y*0WQ+Yk2w9ML1sq7ZkdlZ8p=BHwmc%H1Ux z;N6fzylJv=XO*V^`#aVX&V~(!_=egE-5%Ny_2w8|t?3N@J!CS8$S^n`OSNl@0XfBs z&t7~#eO&D-r<)d_3iKqT*+XA6dnkcv*z)*=aU}H*1)KGRzb4NAj${cvOuAYBXLcU_-27B|HhF&$IaEPo|+{R2yGn)%WwK**kfDb|yv@C(1<#waI|xO!$m38Tho8&Ff9CAfi?4 zLH1jWa@NEHjL1r{RiBh=fant`3A;u~qgJV|@Ssk{z z#J_{XS~Qs#w+#G0ZX38Do?@7~ZBqcTOZd4lE|raJ!+9BIlwQMOQ5~XH3N4D^$alXg zgnMi5;RDhYTK^JV+wVgWO5P%jttIL+IkI&+5tF^wFq4ScsGuw0(|n*@cIS6XctrPRini7};U zxy78soiTkHIqSID1KkT$PsX^JB^h^>R`=ebUfkC&oR@w^aUH{s|1Sb6_Yg_IkU+ur z&5Fz(*(((HpCOwRIt7gYPD0Y}l@7fxE5jyEm4@GxavL&#N~S?KW-u~8lsACM9{8D> zYHdP{SiWw)Gh%vVu@ftrSKu@aQtr)Z!^jXr6RGY8MoC@`N^*}I&}L{=JJJzSR<=vw z4rkT24Ijb<8vflgctWX3@>O<@?w}M_Ij?rjG%o*aW2R2j>D%36Y`0Yhy)j_ySTmVy zV-OECoyD1RH?7;K1*fO5^aJ;lkma*(r99x>G^kfyj5F|C9f_XCRMM>afZkFG$gQ=s z3f?zs=V`LQc#C#s90O5yZC4Jugg@de-p}L-W{#KGOrZwi+^=~3FROIm4CFd8n?ttE zDzUCLs^M8&TeA&boIF+UIq&q;-F9F`m(%2ecW=g)!H@p8qX)B|b2)Wjm+j{!5^`Gch)g^R& z)1dG=eACi(@RX@`>(=Fqd!p8V`?k=I6|%dYuJqDVa%E6sWi)a=%5Kq`k77lwT3wMd58qwvdfrVOb^PZKNbsgqt@@*{J6RLt+axKci5=B z;@~q(@UBV4AvoQCl8a8~1AdmWyM{T98d@b7#Q}}tv)0@ySYi7#*n2ct$K~Ge1fti} z>v%$>XM%sWXkB=mwLTidj*_?hae#MVDrRaH(6qCv;$KqEk-m$zQGMPVfl^#sLa6;b z$ZfhE1%%pb_M5rLE<_t`+t__oHhJRH)SOJt6;>BkHni&_PvUme;9 zbG+8|bSa!!n zq;~aFCmXa~=f!OVhs(^Xw#q?~mgA83G5RyDI)e&a!e6_&jJc%RdU=TyH>IZ1n3)!E zUsMOQYH3M3uEL*=$d%1KPfgsM!D%mTm^M$1K{#-71%}1iPBVG_<_G25uu10!CYlpLNRiWA+bZ?LZ_wO{ME2nPdG(`8LQS)39a zcae-n+{f94svbp23#hMp>Tpjgdy^jv}i(O5ivU{Z3-0FDS9N8@q zm=`%gSo)cto=rRCjEDnTfp^)So6Kj6ROh^m_h<-n+^{@izYk*E*z*o73$psA@;W$} zKW-OBDELKtTGk}2fSO_23)rU`gGXg8C9_4qx<Nu=biqlqdOCydEnrsf?7Y;3W-*k*ofZriI&fkBlA^73Dh$s)bnI*^Prp06aahK zjSGTK>h%#rfU3XU-D0^=;Alu+?<0k4jfi3Ig4`o(2}@(t4W0@T8SFgZyODlU3J z=t!L$75~-O%~Th(Um{_vtzd_c9*z8H1#oh$`tv@w1)+^fH>*3$OVPF6*>_{%Ug|{y z75)d;F0ek|Zki|jGL)IV*ts#NfONHJo=xdiw-WX;uDt~Zpd9ULD|;8qAW3H<3qu21 zj|g1Jbrh%f_zf%ns?fR@xGj`lm$>*+mW(gVM0R3GB-XFg*dRfCwCGa&r|QkeGf25D zkuk(@ZKD}>8bjHFIx;KRWV^Xc&-(2yKQ%WxK#nRdLF$0290-h;L(LZ=Vkmp4cMh{X zX^=Slbb8GjMO~Z{_|xpn`+%5bIF$aq3Mpsq#+Cc+eDeqyT_SP^kOnzA$~8%j8>Z>wIQ|g6`UmgOJCwCR z7AJ+JIuX@S2rJEAO?LJ#9TN}E_2&@#0L_;9)3lxu^L;qS;$k$`?X>X%@IQ>2(=BpN zdi|qAq_MSF?Jf4RdipTAu_@`%sGG!eP?@7Rct+_S#Lh0p0%$1hf6WjO<5iBDDAmr- zli&&h*oNw4|1*cHDDY3n&((vwUCHfZdE`USa42U8%~lc|Dahz=Jp-Ot10zD(Sn!~2FijDb0Q zPE5U6AM3F60`!3X;O1c|%Z#3dZeN+X@?S`)Sx)V;Q)b^vWgyf>|9SCyW-Z+{(b|b1 zhCUw*I!G;|oDXgxCwJ2`Xv4NN-%eu6aGO>6o+4swBR&WFPiB&MmaY7QE@FVh8>lGc z7XLsp=f`pTQDkp{e#yMP_?Dc*k2v-)+u)b)PLGysy?}mj-4Y9xGdZJ-HYBllssSJRw?~u zBP+?itjyNPN@N*M>RlRZrh?n1cFO>-e2E;V~#hMnw+C zS)U=JHT~wCp0D;gdn}Y1qLD?vz|tO%71HlPZjievTS2i7r&r~RYz5U%^g!+kUP@%b zb;0b~hRE@nUbN0ilhcjY27S|QlWL+F6xphlLdd*(-5lSKl|o2AScD^&ft>cshO>rPOJjnv!MvihuF!o$Tolop}+Au zB{n!@!w5R{@z98><|BH|apq7N$R9ze7V+{rI)58|sId~^3m z#YA>CDnhb4e=JrV{XDqmAZ;DRZ#Lt9vV?L2&y)qo)56}!BP+X-SHI|(L*?d{5RNGw z&#cdiAU`>?4<h{MBHvmS~Eahq!AU(Tdwd~izItOKJ&|%Bq(m{SU*5=?hYJ0#L~GlcruG#x@YZa$M! zf#i;}4cQTL0M$Q^e0q?7t%7Rg-im}d)C$CA%vM3V$Pe!i`j}JQ?M=7VL`>XsV7_gx#-yFC-m^W{C@|E^xm*tn)a;R0Gy$>5l(}u*$H}7Yr=0NmmR{<93`(R=OCKg@0alCmX;v6uVfDQ-O z2*+}FWxD1CT?uEUZ+-j5%94dkGbdGM9s8IZg!pDcAgYH~WhuLh>uPi7WYj5D$coQ# zCa@QfAYk_-IMoI4DNxf0_H!dVap_^DaDb&(ne!FP(j^9%Ko2#@AzY@}>QaY0~xcGAU%CV`T*PieW0wGp~ z1)>*R@znk}Qk^3x0jF%@82vdLuMcb>KcGKf`@P(ZS~qs>2np3&YMWzrzD9C{LZdDD z|5J1pUQNFL8%Oj za-=l){q6S$+~+*!JkPnG`+i^7^}2fMY6FJqcDm|>>k{fdv$cal(*)m&rU#;2)I1E1 zLQPA2o*chnkvxahvk}rMfqm5rn5Y#*pwTs&aJTeNfe7j zX#F*LED2+!3u zGFvazET{YEq%jwfZO35A(C3(Phf~4tsFrHx$2S-<%~TQL%_BjEA+-yXWQN}iOrPG> zHePh5Sz$JTRp|Z2Y2)W5N%DMIZeiZ+xuo6&`moQ$EU)U|=Cg6AS87y&_1GVVGTh&v zZv#FKj@5AscBWK=L$=ea%KT(sNs%Xs3SO}yCKB=}^UG&hJbq|f<$`F1poPXPa?bkfGPb^vAKr!E*wM_Tc8PrqecST#4R1sCLw9CEgd0+W_6U{vpI)F4U0V5TI(QecDp5o2`=4%`p=Y4kS*V}IJKKq z*z)PJhfaRX&mtRbtghdyrk(nu_;~U}0r1DLMhlG8y$5YL{3?@#U4bL?k zDK|L^;^QOK%_H-iqHkv!m!v=IIbJrcjTe!e%dA=p&s!*ki;SNH$gfD9GMkM-5zo%h z7>A(cKAis5s&ehGVj3#MN@N?m+Or6*H8*2}DyXGBscGv%u=#K7usc*kc|(2l`W8y2 zy8hyv??alF`T_Iu0a;J55^Nir)Zs~X? zCnm_Z*0!Wt0Jmuh5fyw2CkJ!;02+@O=(nS>K8; z2EAtN>gw`f)MejxcN%ZnXWy#P57$9LrmL5a1?_PcjExS780Z19h_^hT0P z^gi??)W)Lqt5lwNhKdD7dln8_PNfjmDv+wksQ}PF+kZ^ZYiEXTgX7zHVLWb#dV%o#NA$?NG1M$t%h?m=1k&E)i^jC+Z{F;nt7-b?4sx zz%SCjFLIO9WZYcpfw_9AiUFp$GN+RelaqL%+Q!6L^)00_--XwU$^Ycq%A3PT-;+Q; zO3v+o2-CmNzvK-1&;O$Xgv=+H7aKMb&Q|VoY7U`mUaSi8p+g<1r$#@pcSR^L+$lj; z_CC(%{Q2hq(}f5Z;M2urymR5~WX)YQ>TDI%3>x`D(D-BWY$bT+B89hQ^aZMdTrV%0J;K^qS2jdY0RLtK>A`F9dLoEPqUOyalV896l-UFLMH*}LUgt=W4^ zBqf22vRzBP1NWrJ&kGWqSXbTI-jpF-4AyjdI(j_7$poUakNCs#{&S6wYvu~%*AVR9 z3`y_OKdQZOUV3aFa`M#VS?yu`<`aHh&nq+SP4d%C3;A&cxldz5wz|0lHK|V{KF6Bb z{pDKk%DXbS-iMU`byVgp@AC%UT@q0;h5wHs^e}Lt0mgdlr8VI}Q9*Bx99y~DkRGu4 z`5YD-&F9|&eO+`siBjGuib*ngqg|(%C%S$Le(7eJ67NCpd9=-i-WLTa(}xJ`-kQH3 z|CEG7TzX`exy$q5`1Pg<{eUYLZuxL&>0&Xm(7!plh5Mt3Fe2SOdDyR_tzS2SYLL#= z0q^u`;l?m0L6f&mO$_Kec$rQzn>Ni$sLCBaHczwl@9)z8MWr8~PH+IUxVqM^ymu<* z#oe0N7hy}cNv)DDW?q4p1((VnO84GOJWgF%mKL?sZ$F)w`V>L(V^DWB=Q6Xh18W2*}{A`raob5xeXQim;|46eMKNPI1oC$cyi=huMXfQr(6!=&}2;8@e$*>YEQ3lmMC z-qb?|4U~hqIo`onHOh&{ytqsJsKAx6X8)+PlsYq8?bDIS;x!K^P>}of8tQ>~1U~0jcd+=E+o` z&6s`HysL;C>X+KlXYTwKz91e300fr;7{Ou>IrjMKBI+N}>wT*Mx$<9gSR{E#`n zX73=TL!Bp2zc#%r#=D1MvbiA>5gE`4xEKSHb3#Pg41J3TS}rRX{@bZZ>|HuS@#(&V z>m)!@SIkOYR3Zh-!(_y9Ou3DpePtA_FKl-%m6>lxCADkC3w`jMU|N|K+FfEcnAgq_ zACmS=f#CR(88ZwE%QGftf;C;9nv!iRrr+OOK6lvl<>GWVv3^apGFT9eGW;(wRkvIp zN^Coh>GHD7zv>GOct)x-)pZMI2|#=lM`w zp)bK=xbtA08R{p|NN;2_cE%XVLZo5!O1P#`>45W`?*nBwBjGeM+HzlGKX$;l45Yl9xk#2%@t&QJ}l+Qfe7Ys0Mq!ZA#iPEP+}=5+hpAY*L3fK@2EoHC%8$WjlJ9NJ;ubwb&Y3F_XoNrBCsEH2G4t zxw`i;&E2h(BTUhm$i$f;b4b6ZzPp!vS^H%f+W*H z!MLW6TO6vsMTj&Q=Srb>ccQBI*E?9X2Gwm(pjuH|pO}Vr(w0n2>r3OV?|mF72f;Xk zWTGPZB2^L%2j)7S%@t~k+6TQ}Cz=fGajc*mI27|0lfdPPIfHt4bS1x7ojgpo5=HEN z@GspD_xMn9IzGLfW~gOjBQa{B`Yi^da&Xy^;FJgPPsV@oD}06c#XqA^N{dJGNQt#<%lmzx^XiuKUtH9A;eWSe|VJ79&I2uWALH6 zM<2LmWFZr<{VutQ$^|(gt7-aW|EFkd2Q&B5wo)c&Ts;Y6fXF{~&S|FC;H6L`h0zP; zK>;)GF3#h-$A9?CN}Qt2>M{FVz|aGo^=EvV$);d;4x=R3{88^YWtIV}Z1&1|6kAb) zWuLtC8oPCbdul(trlecnoc$Al^pw6n-o`pvjv7tdmI+>)Fx>VU_`!85t_@5=88U_s`I| z(ozbTneG)clOtLYXg~>i<~5b^-^x}v-f>#5)#)T_>+k>-;GX}aURpXNt8vM(H(pJc`6ImMMD@@KLbfQvYU~hXSh~lD1Lm_t+*Oi&nVgW> zl=WiQiwv%w`8bz38r}_Aa{qR-#Z1oG$1ro>cIQ;NtZD~RxM_gtVUx0q41qRTWeLIxXwEv8)eB#l2--@R&u8{gm zJfW28?Sn`sH_70Z1J9HkWgVv1W#dh5j#+};OyMa1jEW~`GYaExSh9W#`NKx@1L)lG zL-S@v;gBwPMiBL>!-+mk1i%a-+%DF$s8*(e$WMakE@;@0IWZ`AEhaJ12b+~?U-g5OuNVr1fT*k^`Nb z)KbRhAdUVttudUSV)8)Nzilg`bo$;tZnyY{kM~St5jbTgVH=b?DAOnfjteTB+slkt zdhW;V0uuWj!$AMi-%AFi@p3woxAKugSrz2!lZ|7LLuHQ)W?nDD7h_}qIOmITL?fe? z>V@~&tM5j2cIebF?t?h!`c#_;OR;a->f#nT{;ROa4B2BI>O;T9&r-5$0+QI>K(lt4 zLzy}Q@sG-$g%F=}+lKj#X9!tYv~G?4Hsp}!j_0jBigT8(c|$hSkj}2QWE)}Q znrPFMIwSkf<8EaqWHD{B&xN0>c-trO2xm$!N76K~9Q2vl(^Wr)AWqvx;kye!f(-R` zk|ezZghzln6ur!n>4Bd*~ zf4^^b_U!o#ht{D&f7m^-G_Qzup3z3@yK_}GPp7y4m`E2+y{23~2bdTkA-;!J=EeVM zyt*JYeadnqZsk1v!P1AF8OL7ezXk^tTH>@b*UOvi+&L{9y*s^5SE9yGm(zohN;eUP z(tLJM+nhc&4Acv#p|b->*|i@rC)Lk2g(!?usdN3YIrwp`a&UQ)%wcK7pYqss%|Fs- z_sjOb4Y_+N@h5n|)BOHg z3~Lt^^=@{mDlJ?eys8+7egV|j^#D}vY=RL+oPiU34v=22(iwJ~GQCt%}^()9#0E=$*)mO1&PKdh6YJd`czM$49o z3SxbPB-HaGGDOWH=J$y8025GyZEd^?WoR{laPuBPA1GA-%pM~GHwX2ZN($PU@LhYe z9VQ`V!HQ?h)F^SP1!5@D>i3d8$SRP17Fip*IQ@4`ZZpK?jCWnZja}&`*_@XC2{IY3 z>KBS-qa*)XXjS>gaITHrv5vA?j)nYkS3w+xwYA2iTJeo7!Ue-){~T6kbiOaV*>rJt zm4SZndH)@D!@!P%=PUT4Sz`uQiNh0M>({K=lGh7p#1hbb_EYK8a(k?!{ms(5ugB{n zG#m0N)ax88AM7;R^gsBSL~Ut{qye@T#99#a@g-dS^oeN~q~HnAa_HfLvMzj|sDm%uM)L0-O=XO3LXm+m8+Nimt*L1Za-e21!e$iJ!Sj1W= zzc%>0XY_h`?_%tD<~{^Iu9f4^^v{!w*&^0e z&#-{Z2hdIX&)zXr`l?LKtiw<+Eco38W7L)f>Q7JN$Iq) z^2#W!wBkoj!ZQrh6#KUnk%6^w$Dj`Kb&z7398)gI9@Fg>gCUIL@hNE<;&ILUAn&pp zPrjz=wwe!0tj2$dGBA{P?t>lAMB({BMUOJVlMq^(@??w5^`LpGJyLLbeF9k}oLfD;NDR6zB zu!gmHe%O3{6hL-{hJc8ysbQIzpWe?JBfwW}E$Nqz9BpP%+wnGB za2^w$t@HjL9fNq@vKl$pMM!BHYt=36)}{Cq-om|8tJ!DHbQ*s!eD^<%#~^2agF$-l z#-~a3=YqjycxSwO_}*VAU;>#o`c4Tlm5s$3EQZ}{y2R8WX`@~IU#xA596dT z)HUn(2+4X5PXsJfUR5ulsJDu5P_2S0T<+K?+GxrTDmY>T%>A5{pz&qeyWEp)`>S_+ zxOsN3^i)@z!#Av~k*=x^v^=f%vqEonuBr5P5z0FT&8tNgdpQe`!s#Q?yT^%!{4@); zu6KVh#-mJ4u>KmrO5A2atUrz%>0i;_X42}2)sh%Mk(EsB15hOe=BvJkGSy_hw|t@7 z+e`&{9p4mcy7Y+K@#vf|zb6AcVtd51n~_{9@*aiJAJ5C=`drQm_nAe|@=%9(;Iibt zV_kWL9f4mk4zs+FRpgx57u`39>w0m3gp9`&nYkxK+I9L0R?MChK<#J11DNH4DqFX(6J%_5-I3<01!jp`P+7nRqsj}`o!-n^|>tZ*j)+#OIc$^sxx z#h?lH#?PsyqzeUNPm`LGgTo!HDb37%pYpRA|H(vpdyAQM#-y?pvQk;$HnHr&RPgAdaOk#tVi)U~$xC=?H}W?(WgZf-xl3A3 ziC|sK{BsUl46A*$(M4SJbsb0Q$we~<(oND`fszw|S_hX-L$Oxs~tomPHQxLV=3*P=JIJg@l<0EY3oy6=`BK@@t zQnpOBVk?a=DWU2oXZExFkIp$J=)iisS#w_+{%6CHsc2iQ5eE}TgdUi_jtZyAbP;WR zvrcxS;U4eiHTvj%j8d}Q1|0z3dOUfztegBxIBU8j$D{}dd!vvo{rDoYm0R2F>bj!(aU#N@>P2qY3-42$9; z%N=wD;65y36JPzHc4|#OvS9Ba97V~4d)+HoV1s(X1E&FKlXs!!lJ7~7k94_!nusI3dLr$n9SOhhTg>-K+|AFYFmnQr zJ+eyK$byORs>5fiQj&8rPEJOG=;Q@l`?W3`hoE#8p+FCffJ4iaDh8X zYCw|QO@T*gUa{=ap*MyCllqk7SyTZaUq4AKAELn)*Ft^Ge^uIG1pb;VT`PIl+oe8#oTVnJc%q(xH(}04V-vKdBTLd{77-MN2fiF}!a6BTst$HVaw>;~X z!7V5N_q4DvF*d>$M9H7}`#cYLudh7a8nV2-c(KnL*W^={COI82Dd=B%WQ6Lt^ASw| zC6;Vn5T3rDVUA-9SS%@iGv|_U1+7~=bG=_gqPwJ2Y-p*oVK#QzZ2HzjygFVo0{%YQ^Z*VD0bawCp?Uzl{`EiSy&SA1v*Rb z*zcLXHy7bTl^@}kOnCHXe@!>)#DGz^H=_%p#ZSU%Sb!1}aB#LbGx>JUzxj|x1}y$@ z+AUo4t4R_ecI-(#d_@M*zQtjhd*@}-wHd>!5AIKpa!9^1YLSi+SFZdm`GNQxV0Q$0 zUS)fdFq#qc{F8*5fRXNWh3%58+-=$5a%Bjcw7_HcA2i1Ko7tp1VRek#pzOP)@hC3! zI9Z~-5e{yLG>^8_Ezm8Wxp0+PeCG@%2%E5k2J~~cyV0&chcoVnH!H6jzhk+EdNKFt#6^!b(oD?Msr@g)L0NljS(NP6aEz@R)o&?_`8AWZT!4dh%u?C)ZNtN%FqL$4)yXG z&4o-eJ0sE$i7iEw-BKUs-;Z~CP`wud6dSh3E~to0ArLvc_9LZzLq|Ey!DW{rZvNZI zoubC->dXsVFQHl$DJb@E`>ft)4OJuxWJ{0+ZC7S@^fsqJ3&k zbP6-mh+B0EF1?v|nj?WN+s%+;$L-D0gi7f|`cdAROJWFTLll zqPy+=2dS`KCR@>aY7d)g&P>uPnnuKhIzJIua(UAN1m}W~Xq_K|6`Q!+6498&+rQ2H z%fBjF)L78a7idofk%9>vMiOdcRJY;MZ(k1ytz=dFIk@2Ntv0xr)mvX&ze!k<1-O8kB0j6W3xN`Mql8f+!FowdEe=U-xzuh87$DMO{q_HOIk2Yf6IZ)k>P7+xe zW02q$G|rAEsT7}Eccy#uZO{i4D>-u_M$Lu16)SA1korX`K2zZy*iurA)IFEE9xNQj zuUGaMmR4vd6D^!BGuCj3a)0`gWtIcX1qk0rJS6Ab$vl#k;H$l|{nlmSMoJ|smzWy! z=&Qb2JFWparib6y_%DTB0h;F{z*W&s8Vvb|;T)oNcz1JG(OWd|FgK#3+k+G`J`0u_ zDetMR@?G~Ylu4;u+5FwGFgL0 zbcum6vM=Z))ZOUTljq(l9Xlr7*AGmYe9!xu?gdV`6dli3Ja%snA9P*H`!Xx$F2?(P z2E(Oqepq??_#dBZTF)X~Q08t+#lmLj?(Zf8A)qvSrO_Bl+E#@7jiX}oDX@#+M|O8~ z$8TE&*(^Q@L*#^7HJ~o;cD%DdoHTbq3bjc+7jHKV9J42k%zCjHiIwoo`rOAZ7SIGg zJ$*3r&MjM{rB#1W%@R!Gb&) z+G$WdZvnXPRW?@S8untGG=s=W(kT9|w?{A#%zh!T%(sGe)cm-zj%H@)5O_>0f=WHV` ziyYDvaU`8lvVOR0UTugA%W>gUfW0otm8h$8Wb7Mv?qkA;uLs?%N&bl_x)E9K*i=F@dT-y^nx$Wi-NJ$2%y zE3z?HSxW`@Zno~rTUhl;$kn@Ym4ii%2n|f7R)Hdylk^y^Fyse-8zGZjh zx$D=(jpcZ{%6kpDi`vZ>3lb+z*|b1vTZ_WpGRMiaZ_0w$LbknuK}M(HQ=S;+<E*umTtR$CTL3VNLZ*c^>qzHbV3E0Wj6Nh^x+A%I@9562g(9!mxh9{EISi57(PEJm zYBZ=ghUUl$isHfuioSPE7<&K@B_Bx!@@TK}Rk_X~Y9vWz885y5N{hqB<@C46p^K-$ z7|jQNs7s>n1YPH@_n{D{9}PO6j};n|vpE^f`e!W?1<-`LOny(EI(1XKB*5J+h02T@ zWXyk@3m6eJ8iRgc{*YDyyJsDxB7F8_Iv4CS6qqS>k&V^o;fnq&3cu1hQQ;uRVWQIP zdPB+SA{CYUvo;vK_+jrd2ZCw=MJe;=&d_CzZLY zdf$_;cm~>iPY}+dGLRcDTyw{zwQL$lC>+eZ2S=ct*1s^#=_S;d^B^cwL`d9JGGsz~ zxt<|Ax;NT4t_I$_P|%E3Jd9T~hQDHaxV5TibeNQ}w_ZoNm>+E%jA-<5Rd~^J#?p!c zCwqHd_J{Q9`6Z&-}x4O+WpV=eKK9ZxO zET9YeNbO_}>_1MB3Lb9JX2^x}oQ6|1?XNc-E#yGS6Rx2TQJ2e|S^)W3Y4d#P%)poD z*dJTQJm!^dtuFG=>(Y>sOR%i1O7w#!%zu4Fpl>^MX92PaI({WfIhrRgO35_4o=^F* zh~XDhyHLybn^nmOc~$SfrIO5a4EQdW`hhLq?A_7K2;#4)SN10nFN0KiF~%O#CtxF- z5iL}8-kxmgTKyxi?Vn}=6Ph6(*Z-cb8$xk!m+Ffm_E@z|aZ9eOQr?8dHf$l2K#uXIevykVpO}!Q3fgN?E%Fv~ zTcq7=2C^1riBycUHlnDeZJTQ=HRju;5bHYPh3FN_{#&IifDCEFO;_yhL$H2tUDX2i z;uYKdw73RNqPiz!bFhfS%A&$Ls0_yoDZIN+g{93_=u0K@xhsu_bR?I51aBQltB@2W zb5-n36kc^KBU;?Xp+6>J4Zb2(;6z6h0W|E?&DciTp{At!CwoSgOjO8`fx6>TrC*$WLc)!PWc=Mc_< za(2(B$IVf6nWHj^vO%H7W+wfO#1PsYmGCF?AK-Pzv`}g8c4vkxGR)z!4)Jb0lR8WX;VM@J< z724{=*8>epvlHOl%4bPwIZ*4r_D;brbCeLyrqTqw0mn9LFd4*xx(shW=kzNI(4N}< zsDn*|-NN%$3-pv8W=?j-*?gtDwl1h<8*rlg`ndxnP@tP@t-1HjPK3>ndG%$wZaO`})*Gws@KX z#a3WUYK)MgeO@z~6^=*Rdn&dC$#18;v^#s*Cih!a1d_qZR`EQ-DpbCD{IpSuPvawe zsw)4dz?J>tzPc|yrVTLp(#D*UiDv6p_KHI5p6AlG1ZJg!(x581(d(yAS<7ifw`vmS z@twYvqu-FJsw6I#VZn-p5P`umxdqhJojB9;V?R+~Fy@fi)@+S1G1#)PI6$1s_s=m0(-hqh0)N!h1ruk4k=u z4JBw}t?i9%wH|(_x9~1%*uTrQc5>z8x$%k3-q`oWW@&G4|`E>tbH0mp%XtK_oXs7ZWb*13XEey?ek=zuB=+TJ&N%}Ut&`QxS4yD z#G52l=-@M7JzMrg;_bfdwIV?z>FXnCH;vBQqfuND06CD-gsatgbi|&HS^gXTC3xPi zF_Z9Y%@8c*+bwrSEO6@Q;LZ06l67^M7HdGx%+>vg_1%7VayD^=NiXDOQ(J3<6G!hu zy(brc4hoXQF@8n{rDCZvQq&IJgn2wb3!uplb-q`>JoBN+7Kdl}?S!#?hdzz17=NNKJ*IstX~XL$>`jdA@2p#xLKC8r*+W^5j2GtunG3yw4vGw}+0FHt z{#jmU6FhYgBtRxwR`?v0HgRqFl72Ao_@G6_st8*w)%w@1vcFrdjNRDl)~{xh*+xO* z7>lIILS{d6%eL7!HJZ)J#aMBUoZp{TVnIIHNnkSlzXLs~wP(CKd1+|710_ML5vcb| zmBL*X(u%dd`Pf?}!OzOdkmlk&n|2#L34z{_{UurLD9DyO$E^}cUXjhKGvhTPmbn{b zB~V=!I-oh>;RfoSOKrrzLxu4?lkA-Fu1rRkG%xk)$|F}WH8wf&YO#7^s-YZtBHCxH z_;J3QI|Xe_Ex-%Zxp#+_PbKsDFlKmQ^gJ%YD0>2^Be;y4 zKHYkNUsf*w4pxl4vsUEQ{egXyIXf)vlJDhro>LYx=DpUmJf9vo-kEI#)?epUerB=Wl%;$;dKXuekd5t5W)TD+0HWBT`qNSeny$ zf%i6=-J8aPlBWOO;pmEUP&g;2*vVHMY44(nYhBpds#a9ce@@k=2(~UNYeryDW8DUC zBy8sHYrWvnoH#zyqiu%cju~@4m|=OKiTivQV>g?7l2BaY-l@r8{iL6R^e_q^GG7-y2%DzwJ6)uOJTrC$l^^rP zg!OgvAJKkJ$IUk^>N4Cy5i{yd<15Kg(M~uQm1mL9_Xcnu=5?Jdj{BZJvg+*eue_GG zcw6Rv8GrQecm_z*99w>4`iYm!WViHRR_%BLoKj}G9IY2=MkE-{p|;l}Imt~-D?VOy z!(oC;Cb%}b|3^1(*ISI-A|gUUARShGNn6V0bAa0>-Vg!jPpqbVEiJp*Y2sSTHB`F^ z=?Kq-xkN-xtKY^fwxpr}6ApO%Yr{+-XO6^oF-!4TpDK+FkX2Zl{}YFL+o7ct+c%f- ztHSBsc#(02(onj${F*UTnnz>?BfeNE{n2lMmEs$GW}>FBANXeI{_~ey{GpGGBO%&-__aDcsW%SFpX}aF(jADEAEZ&ZQ|g@XcC}1*61=k(F3+iPPw|^Q zwEx%@isn6@$$?|P)SvDtbATEUa!_5jmqD}?aQfCZUZ={3D5A>xITy zgz$4}A`N#rdv6!tf_mC^Ufhchh83>Ml7#Y9D8E;dEmtC1o=aVo20fmPomevbIgMgm zW73k`hynEY2n07wX?D9At_P|nMMR5Cd&yNY@8oq}t@ZJmu0E(VtU8W?1=!uhW4yx) zb@iR|Y5*YkKi(aqe)yALpuH+RK-`4)kjPxW{S2-`L;K+5paFKzyi{bI4G-sjwiBdX zq}DYo$COuV?0^^U@VAcn$5wbMsV>9J_Kb<5@^t5XmKi%;I_+uw$~6^p9naB@iN8*@ zQ2km*Pq-g0GCy~@uBJ@H*TzuTEubQK@x=QWA-*r(J=%Qbw~7RdTdNr8s8V7#A$&^; z{69Kz6S4j9HT|93>gs=vg8kbTXfZ(`;Kf&RAsx#e8tL97-hc)W6Hr;L@1Rs;)n=PPd_3At8uFSM7Mu6xjMjgv2 zk%#b5_-Nsq1Ldu2-&!-?-l7QavB|_wbv{7KY$i4dszH5CtOPzQewdRHH*G{ryWujv zlysX@)Rtn)x4<52cq793tNI<;^z-+*XcmM3xa4gjppdanNbsxOo=5>1&1t7*|Jl}s43Wx7MM;2(?saV+`Jzy82j`1X2t5jHdKRP! z#Ok@`r5U>Lb8sLn*dv3+lLt0nE+0L z$!ghM9s@N(;ze_w>T|hH6RaZ^elFMy7)>o5f_JTW9Y-Ar#iXtaB zbONO@pz1tHZrj-4?qe4n-R1Y9eFQ?d`=Ip?)Q8==AQMcmk-?h`-7D8f`3MTKI)-{* zHe(M#DZ>5<-yjgYECph2?OiC2ZrES3jWE4e7VB5yP)*9J?MA=h`urNU0P)T!c*&() zK+j(#%E-ApUUppx^Jkw_S-0_^{sxm7ubpR3>obcHh2X)}tFg~X?NV7xG#|$W1SX(q z+fJbxpvtb~wk1ySu8t-?Sx}p)re%5*i#^ky$WcdwERP6>i^UHM2X>0n~Zggtj z`yW}TmzO|juFSGpty{Ze&3dRbHZD-|!rjN(;XNqUgTw4)c;;f=MtSeAl@`~65nvjZ zys|QYOQXXZQnp{zu}m&q&|U25gk&D W%h-V~M|gOBe=%4A`t>B?Sf-47z8n>P9%U_V3P93Nlr*mRG0Q z(|d{=wrRBItWRuAKQRNLb^TE_$|c(pHM=K9*EjKANa)L^O%S*DMO?W9?bZA3`?|Nq}a5Zg~XK$I*-$S(si(UjXJ6=Ih-)0P& zILY_)KTDS6^Dbk)!v<|SWKstg`Z?OPv)ihs=EGLZEeo8U!eX{-%kB{McG=a00Q?Xf zzr%{>K^gODb{xYrwA3Pwt%ggFeDBlrDM-4H$!(n2+1AVQDloIJDQwpJj3^$x>hRPc zz$?^YTQA@+7&Sb?E1E8@HvHh(*;`;gp$i;-Z&kj8n&(ePxUS=QA@~LXT;lM&!c?%(L4>Pp`JbGmO_|2*-&76;_jqy;yE)9`wF6(y@!WtcT&?A>B9qr7np zH`=0iFDzG(KfCt*sVC^MnmyaOtLrMg%jKWJ%^~YeUPlQb5*6@zW z4G-(xA*OaGevC%iH-?UlgeUynGN;rYNqH}_0yidd0ZlvVXUsoK1qf&15gGbPf4_J^*0;Cxgkm zv+rAyCXrYpKsVT6Zr8c2+N^b7#Sg9E|2Y@Sgp_=3p7@sI@g2jiN%?MV^qp4HtCbz3 zg^OF+FG_77P5)_s?s7|vo3Qa2c#?A7RfZ~~6=Ln-O~n=5XQC@iY_VpXdi}hq)D07^ zNhB-fJEqq4%gj`OG}QDkLANeQt(E~KLsCu7rgZ|#Ooe1&3Kd8`U+YsTSsv?S@qxxc zQgZP|XL)H4m%mBbopoif-{2?J{g1BJ4H_tH;e3`R@|gL`-!&7PEB(`grRujl$Lnk` zrt|+0Lw&Q6#brWRdhoFe6C!^mHzoPisAi~D6CpMA$+sQ1M%Qjz^Yw%3fB9sW6C`Ih*Dk)|Cm=H*-IGU3sRxn>Zr?dVVHNg3o0zZQGX z#$S{JUSQH9E`7X8tbs<6TENX+9+(7vqvdGf9^~Ri%d-8u5NZnGhm~8iS%3fl-gi2_xjgx~-T>cnJJ5@d4>&#we^pndz%7fx|+INAWA4t#P5&xbfC07#dqO?O5kV?yW{^YJl&K)jEVdh~v4rqiSu zXKy8UaJlr=S)OtTK;Ln!&Q}nmpe)(}aQh$K3d+jzz4Z__yVkctRo^5i87GH#ZOf%$ z+xqc=57!CE%MN_ykx~wpgA&v1j!0y{{eUQPt!X{HuDbkV)>`H$xGQy9qp|LDzL8dX zAMM18MdiZ+i6cJ$qpSK^9(U9T0#6G$U+R9S1*s88_LJ*j8sk)!t8h+-Yvpt$E^Ny} zeHWRq-;Y1UB;dYj4pmhOp&MPzjFUY4yIfJj2bGVy@HiM6wt2GX8;A|j&@JIxvyR}t ziQZMb!Ec?CkaC|eVduAV*}0M_<6+nIIhxiFUfbPaEwLr{#FoKB(%RNvi=~7873ZD4 z@WSAF2?-!JkY_lUG0U(-OFf^+&8YgTmj@mYCK76}VfH_|okEz4O`bCd5qG zM-XLPiE06iJPzXwzq?QWhts?GP(tTIq#kg0B=3>Mxk57w*idE-2yI~*`tLU-E*i6D z?SlLrbZeCvn9wiR^yN;K*H5kJ-^P-Bb+VT7F{>1_n{G4 z@n)><+q3mT^NlxWt<%eLiPTKL&E4C&{PrQ^y>32C!!A6RQ9x~~nM`8zxO_0uDB~vt zg#EMQGJ$dME&p7Jg1O|f6Dx>jcFFyNH!5Ae%zMjBgn1f`yg;3)-s&1DHeF0`{`;#U zZ}UvA-%iB-NJ*PKPs#TQ=hMQ-U6Gzx<+;XuXR_kO7??MfZ*ViO>y zcAxe(7_J{wYUePh^?gnG`JU|mMCh=a{Q?fkYX1s@(l|^v%A8EK!h<`+F900I6Sv<- zev_ySGavb_uGF)FaOUOG`h#C;O(X8CEJ~*dh?QNUZt5w&Hu;HS-3U%wqe-z zCyIy)h?EM_-HioEOKgKt(y%eQ^FsurJ4Z<8Xc#a;q+|4`F%SmB(J;FF_9yH(-o5Yh zT=#vQr{*u==$arT7U6WwF-GqxjyXd`thm4Z&y}TFlFfBG18+C^LBfY(=P;HoEP+?t z=UJkOMybZJ;Z?EI!H5J98FqAP#xWc~*Ji`0n&iDmuo=sKI+Lo4v^Mz9tG}K*xspRE zp5unDG0?hCvp@s}n3;+o8JUxzpuH)H@!BGSH6ulRMcX7)F`FK5{FLF;uPxIen`fwD z^ugPZxw+;Wa;~NyPQ$ta%|J_Z=-{ZC9IviUmn9;CO^xJkuZ@=RW_15E^V{iMY_R9e z&j7FcM3Y3aiUy1Q@XSMXCK5VL2bMdYS}Z1SX@E?!WzsNkrdTogO}{=q=@A9$LrZy9 zyQd<|xZ*QlV`-qHcxJ9wd>9AK>M=9V1!uIUU(@QjUdvKU1h|g%YWyIg5Uhf`$IA2{ zPoo<+1wj+>x#CPNAbG7_dVd1jC4Dx#peaQ(Xy-bO8Vlq7cf%{7VYQui-@YZe%dgKt zMgFLzs7&6o`E2H?O@^38s;utH5^@-jgK(M8{NFIcsn682#a+0Eu$JGXwU#iAwSsSu zv8eg<`kH>l??U4N2Yz#kpEmIWMe5D+UwAQOy#}<&Hi9%#ZS1-faSQeq=~q-_$Rg~H1MEsX zNDoByXo($K4kQ|*;qLP|A3eKnK5`z~^C6`Pu=?ltu>9dgiTC<*<&?+$y`QU|M>4h> z$YwY2b=&b(E_aSdmVN6i3KYq1&L0(uZs=(ArB``HeU+^M-}RkD#H+uCm*yD;3B$~S zGxUPZ%NjiuskFO<;eC z*}`M#E68tlqfDxlY5>E+e>m|T)M43vFIr$&khWN#E&e3%Kf=$J_~akgw1X>v(pzPf(nQ3+UFQ^){L3LL@Rh#*r zf+O)_9;SeJfgE|UkwSJ0VXEaT?%phar`my(qdu`dok#%eS*>vM zw2Jhv%ti>!%w-`ros&YL8Ih#sRq(lwBc`F$rtq`cUE^6MXr4|Ih|5ujZYsSPwv_z! zw8)^4A&IGcpz@osT=pLa9XW`cIT}2kocyi_sv-8Ut)C!!e6WT~bzIa&OS_DJVrUlu zgHsaMh7Mq7p-}0SH}a+q&@2to!ieJiX1mpa^GWrC2ftW6DjphL;!1wmHJKz&5a3fI zpToZhS{Hc-sf^MSb^YN4TsGGLjB()a(qJl&2$28yl zaNJkf89^zUpdt!PY!Y_IWU(Iqc+X=>SZ$4c!6pN(Ix=L=uR=cyuhSl4$s&1{OmL)2 zcpR4EhXzqToP>JZ>?h#WlVooB9+xi5>mn%lrs%qEWrGXvnQ)-=oSLm5J3fcD(-P1Bjbq7IO?g1&0)FvE?Sh zKj;P)WxJVCTJVAI6}I!$SL>okwS=AJq!^)$Qss0KtKQ5P)IKAyE}enED-FsyUDCat zAW>X4i;a6VPF~1JS(vyYAdYXlxGtIzQpr(8<2h`QH+&~QHnp*%%?$FHy5MDH&CvYD zWTU5TW%(7Fc9bR#Etb{|e6Y)UzHI>C3mICgUuZ};CULJcN=HcvaNw=rDVFTa^BGg+ z&5lis(K{B4_ABJquVQV`ru_c(^?Kr`j@GZzK4Vg*@L&yOoOg~GNId0@_6A#IqWWJ~ zqAt=Hp`P(}F608k7IWWjR9lz#A)7`vgO~|sUZkO{^T%*AWuMR2SICFR47KEu`)4#l zR z=*){^JkE}*;A=Mk+st(4e@4tTt)3I#R#-Q zw;K|SUJ}J3T@0OB<&!m+-%wKyp^cjDzgn|rRxI)HS6Q{({n}Oo_DCszr6Wyls@-H& z`U4{xWlvy(C5PbRAshK06F?IvN>7!KRB5e=6V>F?DDt>Vd;6J4f{>}34$BTc;&rpl ztJrn$iL^~-=et{F#&$Vo?pQQ4hE*tcw&cq7Bg>*6s^rI->(cYTfj^Mi6Xh8f;YOB7 zD_!X0)6&BPlZ`aKqy+T&aj89ijvZLnh6{DTntI!Na=t$EJ4(SBO%AN23m_mgOh6(TXw*$Mpd1Y0$cMl zNc_(3d_K}zBu5oz`dH+T#bS=*a&@rNX11$-OJqjRr{V&?)Z4NbJ|IP_0{&e3qaN$N z;@(tvYLz+=^L+?1*u2>X&Pb?7Jj=_9lDWEB5h21QN-gyK(CPTIckKPH z(J|8OZC$n1@5lFP#$Sdj>uTygy}24nPpD80wGE|XeNi<3>#aYTroDkE*JlmCx8TH+ zLLAvDXU$1f^+>Y{Nc!uhCDrcu8!6k9vd$L~bMQ$;kK^BsvX-}!i=BfNHVq{Wzk@~* z;%mYn8lROXLYwbvwCe6D_=IWqX$BQWq)hWUUHlIp@fRlg$=9713uTwVGzLFFj%CDb zg5s(kId4IwI09^gCbWv?I>MJ^8*gO!0a6kN=gdc<;(Kc8Tt5E}8m~k3TFsZg_dS zq-GMa3kbU{n*)JgQ_sTIbRN6*xQa`+jx|5bbgNAK7^?C4*09g2s}WiT2UphBVWI4L z#&cP)g3u^Pd_o~|#bcps5hmU4}tP`SqsEwi7&`ZgqB|2kpM>btxg}wn)ohQ<8IH$wk6qlaN;udn7$a_j{lCw#bBh10d1G`EZ)W%l)evO9Ftergh-n=rxY2kOiR zL~Us_B}FY zb>{cb^T>lg66AhD;KL7n1p6ICR)BuEuGC>;0x=bmg;TT#?|h~)d>sO7Pj-Z@)w&ZW za@!`Ss^_L6xGW%Iw(yCu`BUc=15tk++NGN0P)h&J3mLEN%EQmh(lgUbwL5j5{>%My9<3gyfKEc|f?Gjqea^>)PD1kDXh!_8a!6%fHm2RI^Jv%j z7Mt_zPNJ=RfqRw69XD1WPTz^Qp^q+6BFg92j>u=Sg zj%~4bKjik`Zj;y08cp?Blv#~fw!c&nW}kjk7^;E>*X=hO20i3|Rw*;n!HB1%WROp# z>V3i0X6Y_*9>EE~_WE;kI=DXLzFN2jjH*;1@O3VqWqoy5Ful_=?h!EI1^|W*t)dCMS%&ayA)tvlq^UDI%(J87tl&4dQ zXiPmK7#E!xKf}0AdHHubdRe#v9X;$#17G1e5|T(g2>I%Tr^&EHpOX(lh4e-Quh_`<^6xdz~R?kXseMjy;&~p%8_i#*%WN2t{c=P9da`CNLYLa zu4p=T{Rp!7D%CMzoaa%(rOkYM(bzSEq1_km!Y1R^+c6E*+0Q8HhMw+>evtw7<0TJT zQ~4Bz_l2ZZw{uA+AstqnJryoSA|k7P9bG1o%Q?{8RSO)%NL2;`_P_P|{TxCf z<)C!k@|K0HYP-vx{E&!%aBCj`rB? z6R33HlhX9MP^nE6!r2oHXOkk|OE-Kl;+UNm>m#?twsgBlJO%!8vN5!?mnh6757R`z zE=6%Z#mc4H^8FeT@=*yR2v)qYk!F-Ymks?OBNO}W9`PfGpa zcgq2h;V5urhL0dc`)V|eSF!xHW!<+J`9qS z)7yc6@EO|Ck_dH&@x#<_?Hs?4FK{QkQGz1HNrs1lHUOa*>!^VY}r;k>Bt-MRYxNB?fLItY?q;?hN_jMV7=$dUei8qlYi z`Q_f-mL)er3!hro-V&JSqloNJ%b4zQG>^;Y#i%5ttY@zR747oyV0rQYp*6MJ8J)Mm z5M@K*3z{(D7+YMZ*L5)N3Xb6!x^(_oUdP|VyW|X@u!RY7mS=%7yH2x~4rkA?HBIeMMJEL-47U;x za-%XnRgf4(Y$o2hESZaA7)>!D$OgM;ctrBH7s+ZcH}v33?iJAz?KJQhtk0JkUFaq>Z8+$T;9wpSWg8?0Y89$1*@?wcKzB!*@0T1wN?; z%CbOBsFb1QzZ-mpuqu`z;u%OC0v5kz>v-82YBUwUup8$jCt_fB+<#x)z5IV=d88q? zij#$hNNU7HOu*l=XJmL(i16Zmif(f(Q|YdU`j(6@rYvQA>-J9q(^8Md-Qb;j*BC#AI-EajN=x{URk0va(Zd{B*kMt32N(7vnt5XJuYQX7lixl* zdct=-jeJO|AJ6OyUBC3^@EcAS_HI3-l2C24;AbGaun;j)o4U#ffqB8=4)TpAl~OjUO=#g|_HVkFHG^=T_)q!A@#7kGP1UXXH=LG)Dsw*0 z(8_o)(wdFdJD)CR|?!?FxLXiz}aU7#DuO!@Ij<7d$n!YeLl`g7p&m<9N!SW#uj`hS(cNKz^mNW(KeA^ zFYiK96S3r<|9)oq`98_;`JW5riw|%X*2R3DcFn+-^FZGqvs-5hy8s5HRSx8G2>2Ag zJ}+;?T)$h#J%nO{$Wc-=s{1uuL5^Ao{NEE}Fn6@AVhatU>i97%Vy4pIYB765JF@zV z(#^-Asg!&Duu@Ay#l-xv>mu?HE@q&&&Xf6)P^zslJAdE55M>OrUv|z|ipIPG;z$xK zV1nBmP{wLLAo*v!iZCax-koOhzostZ=$!a4{7^&d;||=ei6KIM=Bs3n4=7S}_bolr zMvi3ST-DW%uVT(?#&b$ox=slb6gsT4G(G)E)F21}j5$3dFZ(m>cO-&`^)7($d%CvX;e3XpIx|0to2UDID z%7GdG1INa^T2~k;t`D~uMb9*7(=n)QPDC#VpyL5Q&(tLDpR{_G6y2SP!Mxm|%$_UF zZMvBnC8l0L-Lwe>ayXm*uF^MLWz0#P&k&eW#!mcjh)qS3L=QK#3m=g=3A#pWSBnD_>uU%t>Sv&m;SN^+4<)RZyS4Nvm*+_BbVNss)!?mX4(pQQtS%#kU`G9=~$<*9-TMN^) zbL$FID0N)U;)bh6`}n?XAzA3^`c?fiZhyq~xHf>83&9(4qf!~8fO5S^Q5P2Y8YEa3 zbwCfwNhwv4fRk7T3&%Hpbv$lCOAMV&qf-iMKU5kL7~?ZmF~`iwxy2o6$Q)w!QhUEbl!O4dU8|$H7n>T zP>6P2lBfquw~_hZSsA7PCDPeTQ5Pw(gVo@m5A|phME@i3eR>G!w+|cF5`Y|n5q*su~hEu|tKh)1fq@?p4lVmDN z8q=94E*imA&a_mU`BT?=nze4X=_Y_bsq*G++_;^ShKcm`AEuj*f3t9jUn_s2gpLVb ztaInp)7{{Gawn}4BRky)cRP*|zZzdGnV;*gO>t0!81|qbIjD?uE=iJzqHFbDUqowD z^9B!?1omB86w)R}tZqdZrkx@h)Ty^fFqR4nB3!k^OP+%s%`;>k;)J`*k_0dFSi=BzZEIvf%y>uNxE-U@W()INb$ zwpJrEFcGB-_js~f_vSxSrOC`ZFI#NOuNl{TTlL7RaW4OA1@V4GLr13HuW8v7-b8cD z%NWLr%ha{1Hw;|C^|@Jj%WF@OPPN=|w9=RU1&9ws#|85P*bNLe>miXV+D- zZW;ZEr#mGpHMuv0qZ3Jw%$q?|bk=HqzxFjXv<3nNCA1?llG`@jM3wz1w@lvOZ8il@ zjftswacBv(1FLvD_HVy_;dgsF`&veyRgpY%mqOq<3v&xVu8VKm>!ALq8JDPtt_uiu z(NSq|J&0)X(Q2R8CNnfXRPQXpISnAEO5X#W6!qOC1uK#X)bG($QYu^iLXcZF3Kt1Hz@y$4^ z*c2=y){mTvj_TH*`XfKaD8?vSpVdWK*9pk(umaA~w$DKrpRnHr#@ugh@qR_Z_hdk^ zUZ`ch-o)}cC3vDt=zZ18D~t69%zD=YP&y`w5)Cq#rCQZ!#dHtC|!VyEy#~b5IpRlnO8g4s1ADm{$Pu}iiZQW`jFvvOpQ{}k0L8^T`A-m-L%a)xr% z9d&yHv=}0jE%>g6M6UiYNL4`}zUQ2?_wS{hlala-?NVbc@?(0v0wIBmQIMh!~9-VXB-x3oF_D^4^iJ zdt;?xCG@{JzY#&Hb%YJCIiXG@Nz+kpuP6H_g0;77sDGu&l*x}POwWLs6Y$aEXO$5K z!Ah2?#X1N@0o5IAF0-ksXpp>Yu7e!I*Zijd_RyS`M>z6vm-TVEYc8(VwLvQYb9_JI z@~uq;_?|u{y(U{4^vw@=3T%9d=z1sI%xI1*{-KBOkCmaOcN45v2q(cl+1)B<^yisw zXYm@wiQ292@CDB__z?qh2a0#in(m5~|LI^t|LjK@*UFs(by8*PrMOn)a=QK1_V4+6 zyWyP-)VTMG+x)KZqcs0+SoKdh=++;Kar|f(Li-ke_olDu7sJad?AM>1Oz>1&jY2k~ zX`uaQny=6+c@x&f5trsI>DHsWJW(wjBtU`3QCX~4?GvVU>ylzv4kuAHMe6iFzOJQkE(oKILg(L?ryVmk(*?c_V)4h7i8NlN%;e*Hc=WJ@5AeR@V)Q7bSsU-zY49Rb{BsziLN3jjQvS4!Co&h~wo zrphgG--FGQ=QtYIG96OCuR_0>(GyMY&<^NFNPbUBG`5qIK#tS-!96^E{h z!Y^z@gja?&7R6-u^lx{B#|~?0$Uw9hzAp*1C1i?6}F z3x}eI@TaiDyhRR~niDOerlA6-ki}scLH*rd#4E}3NtJ>1z2jm>>VbO35okw{O zl?RTB2jghXDY_g3A(ja*GVj`do%~Rtv%Py%aFF4eT$<$GME9n7*b2V;@|(&DQ`7Dz ze(|^^pCA27{p)*qIyaD!!(X|jx|GEiab?~%Lk@ko^@wi<@-wgGgwX7hAa1rAKVo*+ z*>qOnM4FxtKyu}yW3qzqWaum`m2W__$_++4K52Jy@%pUVSy$N)sgoVB3+Zgk`p#WS z5&>-UFAX;9pii2_a)cwvB}7j#MDD^zi#4=<6Z;D0n*bijSMmEj(uuwtIOGUzHmJ)G zb4<5~(Jibk?tFHriA6~Je}p>pO#xF1YKC}V+D&eFgw=+46#AgbbfOuet6Mr8(Kd*j z`2bSDnHlV|s$&CA+Q8|uB|?_~rXROcSj61@sMkKJJa?4WKgJW@q&qSn>-f5tBR$Ht ze;*b_ex$!sMb>7}tMWpJ&5b;6Y7HzutIoyM;apqdS;X1 zu+VGuV{(MW*8w6^ZjH=YlLE(%TFF{O#M_XPf@c=%?Hul;?1fWj9&JasO)U3HQ^0;& zMmiRX#mA~#fXm(xn1pyJd=vYEQ0^Waf=$jd54Q9h>(@PTeVf4T z+>6g~>kf<84R;=mJexr9wQL8%9d><;&Sw*%u|EtQcDO^UJX3Y#gmi|7YXu$Q_ajEz zKk~R{dK9x)T7PtQj=!3RG~Iu7WqZ)2Nb)Eunqt`nwhsPI>5d`)FU{lBnmv628lGis zj#{Wa^TR5>%ai`>_iOZ0erguvIe~aX6BN73{a=@i%|+|DZ*5R8OG++VIcd5=@K@69o7ZneBUYTx{5v?hMS^c1d7ym$GX^>Ee|oN(uQytCiUYECgqi56CH0!>14BfHX7`PnBzK{L`A8^j{GZM1t_H^g1l zU~6bRM7DQWL`-5ia??vh2VM#q?wn8CM8J|OMsK^sG*yOaP0zS8pqxF@|xw?KnAIeMvxCe~}zrGj;$@v-K}f%xGNC(0DBJ zrD=vhpHAvnVq*|srHf(rRgyLj8uwi@N6ot9rq22O8g&OM6OAaJSD;)+q=Ag_LdL^Qqdt@K#t=P_OS^=` zi<5F%5t#jB3`JjqCv$`KA`4r&gip`sJVSU`jCM@&s}65G{W(CU{O9iJN?{CT_0A>{ z>>^|QQa2vL(D-B9B(F%VDDKa-yV8v7!02tUz(ERO`DE>=On2#LWN!BWohRh4tkly5 z2i>Tc;4A)y5h43O#LgcaqRsl^Sh(n{2A z=OE?c-rv~RRwT+zU-Pkr3PhSp{cc1UFB^tFS-u%JNK-e`2TGs!* z{eqI@yx8DdN_BB+^6sf{Nd30SAJKld!xnrY^eH$m~4zI zL5b#>lrO4=QDK|2j96MfoTW^YTS?5}7`QZs@@!plQoJXE{S91k=_M(F^%3p^eQn|} zw>)8TS{!X}?Lw{H-e9iqaKX4ImM{2mQFyQHWkrE&Msaw-BYEq~jl|6=9)AM9SgaxN z4;N;(zrY9Ry%*KROBX*;pUMqXau*om74yC`Naj?zWhj-u9&)&X-WvUsfSZzVHGByx zx@k1czaiVtRm$|pGur#f{X@hX}WunO{Mm2gz0v8M@tURw^^oyZf4*77>4 zKC~Pm9V?#txtlV~^@&=T*Csak&TN}*MefyU?OnqiU5hT^$8|+QQIGRFxD~9i?h|Ay znp0dk>{VjSw+{V4%Z_mI-DQ1z;$R5i-b1F25Wg8}?UGUj^9K3g2Pv3RX50J?v^3iN zAq@~fj5-GfhF>%G1m63?zr`#xUE@cd1`Uq9!^Nii5i) zNf>Z;fDB({@epUW-HJf)8%e)zZ6vG9j6~_B!i6j>d7(XxXoB%vG4u?xem2B&!_6z)Pq-w-y=LBp`73nvFXpeRjrhQZhijSx` z*E8StxWvUW@r;sz^a4Jg12-;nYbC3wyxvG;idagRMI4Sk_5zsA((6?U#m}dzj^`zY z&Q^T?dOo9DTp`}$ta#Zcu?Mmyp~D@tFBxuM)20`!cgtN zLpg3Q8nbX$66`2X2&$`85V6aVlE3pmySlQH^&KP;Sc&1c_$#>{Q8sS%B4o68T&9+r)*n;=eh70l(SJ8Y2#))e{zsBKyY!8hZC9HMzbB(CEVcyeE&M+yP#cML zjL^t|%i60Yvidk?N z6r=3TecNhi;8Be*kTqmH9!$8INq&J=Y=02zQ05+LZZd@&zLtj2DtBkJQ|`Y?mUo2D zM3_=T=%_?QZPr%JtH&)T5TXBWq}nmwoNmmYe%)3d9YGo!XB3loY)3x~{|(Nk5mI|? zE_vewA$92dNCs&ZPN=I8ExaDTCvM*_@mLyo@GhdG-F0v>zcJKW78D8PNEkNsWIV3u zc<%LVdu+&MNqjj@4yv;wnQ~-!Ct1!PstVKE21c_`GAnQsqa{^A)-FXYIZ~%5oz(@; zl#x&uA5bimGefjcB$R_OCi#e^$M`W>M&j$ixji+5R(RnyyX`oax_h%vY$EAdE7kWE zb*-AnFH&-*dL#>2?PIykL=3;|T<9)*W-%Y*POB_sy{VVmO7}2jWM{7OT$>O*cRDR2 zR0`OTKj0fiOim!))2Gmwjf?}Bbvl7nU=eI@S(8+WlXFT~7?)7$m;d5~#7t&GSz>7% zHr+etf9Ewekltb^J!vMlMW=c}PbKgCifIM6;CP!%aNG7PatBI*VYpElWxj>+ z?Kd-AoC9&9F+<3Zg2p;NR)@>-4~w@&)d$<8WC4c1hxmP5=gXci4-F0?wJ9ry5+j_R z3Ux9`>-D$0@_X%QA$a#K9W;Nfi^XDQq~024_B`HVLQm%fwGK32^QV`#qT~G*)@w>~ z=MVOK7op{;DZsDto_aYvDkzpL?^8KT3V`OpB zpjVwfdrU^R;kxIqKrsfiJ79^iN%`ef?yn;Pj@cG`fHah zlMsmB;7Pou<#02Tug-#u%F};0yfrjjXe`fcXUo)HrVVattK7{ZyvB~BCLIlmc{E%e znitf&$M;`v8<|^wq(P>W+}63aR}v#8Y5rk+nM zeioi!C7E_p)$-7Sw5vbGf(O^8rW5(LjqxNJ^yhy!+?|IWH)L16qh)Q{ACaEQRxLw1 zc=aeY6+E3^$7_wTT9)1qE=KXIcmu| zb#2vmI&y;|Hd*$#!WKT{m;G*aoMtTJgR&x_u2e$~ZSMXAqVu9lB%nbwBZi8Da6T=U z8R`1q(X7M5WP)yk8cU1w5h4$v_ED|QWkxs3Z&-LS8L|$Wpv>RYKc3!X8yt3OXgt}Q zH!Q2Xw>(4BL+^s3DgCh0D;8CA@yoM9CN{-fej5gv6y1=m86{Pu=f;_(2iTK9T;hW! z7C!+LPskr?75vZq@yCJSs$d{e(y!8dj^(wA%zR;yzYY0iW zcAr@2Y@=zs#BIvx)EfCO!HF7Epj!6Nzu(o`AZZw72T;?+Eg|v8vAv~zFQWU+6=4iu zg0Qg)hdZfR&Sz5H5IZ|%0>q=FO6eP80x4LTVFsz3p>vU!KYb_Qrs7}ec6FK8@^m9! zr=?4H_Cm6bslWDG@HR7~>5~)yKCCe$PGxFc7bO$EKGAi z^EB3_YY*f$OD3yK=;o`C`;{yoF!ICjcbCwB`71R?>%QmE2M}OLw3&ssWr`B-BB6=u z$zaj)uTk*dR<+WWcf$oQ@eVs7QwY>9Fd`Pmz`1y1awSn<6ac%aWvodse0_L_-? z{j71&GX=Bx6lCpe-<0CN8=n}14lpmO9;H%}OFkNWr`hH>*Dv#TNokW#8{zTh=M!SF zPS>w9x|+2v-KGn#bJzTS5^CM)Jv)Xjjcv8tSCdER{fUnl$gO>of^UL!o<8>LcKzFi zE<{%;YSDW_8(d?Rr1+TnA`4bn;q9SF8u4Z!-nx?Dy`m3kj>mTKS%V^-heri&78J+y z`EvshZG}W~Tjy74s*rHmw)XBP-SYOy5pEBs_X@drLLQ>;p-{qI$v;Qsjpy=2y`Yn5 zKrM-;X1B-gz0X*+k?wi|H^=)TeXQY}z{$mwNJx5mlBH+GU%xrVwP@oA_6W-6vuGJ( z$kTA$FQMW(9)H{_G(PaMcW)Xqw)n#R`;y6gCSm~CJ4zZPTT!4gtl@xbIY9%Of0SK8 z!I!)`HI6If&B#E{HTueujmmHkSAMdB086xrW8hmzBo>-sp2oq^xZ4OgqGL z!EYGT5TQ06hdwM`FjRT!aP98-4mrpJjP6ZeXBWTN2fdWv9@LR)NbRTaaUFpSdc_%X zGQNZZCuAGt!wSC|gGF`m2v^@1qy>KWmp0)_dm__~*ly<`Xb7vP>PkgDvMG!wGa_fJ zZcg}Wr=HMu;l|CrlY4PWA4BQlNt=dx9mYs#$r7LU{c&7-S>RdGW{&m8-hII{U7u;* z_#7#Ce@J2IzJ{kk4ua`@&7qMYbg z`$~I^^vq}(N{AY?QI!mfS-z-;pYrXV4coLDr0$njt1sDf(tz37%}|W{Itxtswqi)R zZ^z6De;8lZFnnG|SoaplOSqLrW7+SjLu6*Bg~eYl)RrD1(BcUHbv^-F%lDJh zl|wF0xmsf1^L@fT8FYA7cuySo|F0s;AYc*e#pYhNmdU?@<2IHy6$f0o8dp)XwPnms zi*t?^!QIbX6E!BS6QlqjIq%9y?HGE*@g73I7x&c~usIts8c*ZUTjAtiw2%U8Ah&`3 z+dL{Jj@36C?MY8(jU**}WS%5>R)9|`VH!rIur;tG-=#5+`3yLQO}lT%fX>I4t$Ycl z6d#qf)a`Glmy~&CZj|R1=T)lXbpHc6LpP1g;Q5ZtDsJ93fto?-=0DW2r0pAL2YFJq z*7Ut3G;^zz`u3h${51_bKlB;qjy_3cf=Na= zO~u;eh_Eth^V=|dI?QKMBdaePBXHj#sJhY8G9M!rt6GJg_#Sg8ornrAT%Q~PR0TI^ zjPrUb2;Pqvl--ZcUQ^|wt8aT<;NeZ@vHz z+nwEzRJfDlVd&`mv7te{nA!ZY(-L6shvBRRs8_8(IP;&~kUE2G!@a{CtxHb|nE^F8 zt;g}D%U)5A$i+6pWptg%lJesPw_8nA_iSsm{9i7^GyhPW+x!7_mhK3=ZcShsmmD=o zQp(}w^-bgDN$IP)9%X(Qe@91RXIfC$dAhyj)C!@MZx`RabxYs_8P7&JA{FeIQ)bPotFs$bR!W#I^nhMK-aPtx9gKlbH zY&qy=H>17pr9U9;DVr$C0E2P7)Z&CSB^Q65HcP#Yk4wr}^V&yml?U;zvtirx;aXX* zffgb2lD7~XeYQIkYglGH!f#XI2ZK(tRTTf27b3EBetupKL1sjDRG0L9@~&NGd^yMR ziMaHP)~hMaLh2QBL!AZQs<{(rbRt!ib~s9dyZth@shH5YX`B**=gJFr>G7^K(xRGh zKG9-f_+1^nK;=JqsplDr8)9xQC*o<5Bh#Y?Rj81x&KM_E z^|(4o;C>Yqgor5AZCCALn#xmxN^a$ga~i@1k}f_)uW#~W7{szy$#X#D%bf&{yNMRClUYjhBA* z`4D#NJ)%UewiieyDYTK1Cynxbw+k!3f{Eip_IpV5Hc|iNT&ys&P?>y~C%&qGVkGo6 z;44%D@J#|XoIl?dqA5Oh&MkZr1M2p0Do&`We0QI{#=zqH_5sqO&8=lC!GAVShptrY zyC{*s&{{_Vj;~*EAm0;9&yMXg+<~znq)p-*=v@H??E(*nykFk4=D6z< z(Us!Y*ckdWzK&*op1T$wL{=Nm#3t=)pGY{L86ih)e#XvaBRz0eMsf;r(i8Z?=mt>yYn${;@&@>Oousu) zs_abZOShFO%GkbBlwefVpl-Y(p4Oqa$dF1{AkOW|wgE|^j&yF?<5rOV{I*X$e}?wwqCaD3Uv zh$$Egn~SvhIpV6#V4V^uq)Y@MR_(S6qWy(31|?D|2CZRPwSCR51Eu#8SmSfZi9?X( zZ~qF9%;}K!%sHz8DH?vk^_DlBL;SCUFrb?)nLy*qJ6$LTCunW(r>MSfH;+mz_YPh9 zJz`UvD*FfJB%a5kvBYgQ?xwZoa=I4B+3iMT;55=|QnB{6(Y^PhZ5B}BAzx?a@i8F3 zE`a|D_{Hw61p(Yey<)K$G8r#RF&Cz(Rp;8}S>RM7&|wDFD_N8InWSoar@Ca>00n?X zOCc77CwF${xeh?Yi1?xeA{~WvfV+-|r)3ZIkR8F$K~^{>S?SN$%AK~m`lx13tRbtr zlznSAXfr0cECKQd?*e}}o;;tQeZ&xgCC^S^4{1}D?0y|qKre1FR!J2UXmKm5+}}C4 zXV|7(J)FOGLH2chwPWp-EMc||Z`@u5*36E0yiHeddwlQiM@XKO$}w7MUeQ5$D8dqM z+-a%_!Rv@i4a~`IBd+lCKkav59X>%q^Y1n|8yPHQS~4ISTet0tYz0cE^3Zb+Fz*y+D)dArisXm6W0uKo6JC%Mai4Hu2xkYkE2~`ka_8SVp(2 zL-386r;aD|^ieM6LoIk^QW5&^O0aFs1<&^To}X1#_9`EH=qD>uJ>>a!!=v)oM`nNS zwk^IF3pgQFky{Vm4r`G7W{X79bk`V>V7@%iC;?&kOc)dJ#UHYD%&hi@DhV^FB2%5D`2{Oo z?$^P2#XX$`seSEnmeJTz)4I2WgGASdeq)LEC8@!4%)JfL_Ph}d+{B3#Uq7;8j{NA8 ztA3wQ-g)$`b@eeKJytS`xMXN%K=HD5_-xfoq3cYFq0#y-s9=dj&h&t$dlOi}VHS&8 zL`K`H$`fhcxNdAasAf+UulLCwJx9KdsH5<TXARMwDLC*@%4FX2z3T4-4O#|MBMx zurLa6XV3^nI^sXr54((%9ZtRpzxXp{_%6DmO{1>SE*&YR(a^MF2*Ukh;VfC>{^`j# zUubvh6X>X9JK5%|)*hyq-9WB!J>C~k7@z0P@|%jieCNMeUEotIu7>s_s{wxBqynhE z$=ha~j&5HJq0Jg-?o|F4n)6Lb(xDKt3PQo5PLxmqUnQO7aDj$rTyh@gFZ-Hn@0IO`~?bL%(Is zXf40bSgp5nooh?_bKfa9yxd>g{cGa3HoY-@auI6bJe^F{UXst&+oG2m&r z5?P14#<20Lrz6&de190;GAy)TG)&9KMPt&YD-IkU_Sn5l0lv+vZY14DkC6_`Mhg7$ zX)32baok3Vsrm}XEVd_0oJ7rY3C?FyWDDob`u8-uv$U7)>v2Gacr*?eV! zNxTNl89a{oIQ>4qs4 zy&qX&qgp)hrxiyRuan`jN{c4sUkduF z^26#ubX(bW);@Wq2Jj-(Aiah8TXyOjE_nbxx5Bt3L)lexk9CIt+tmD5n=C+>ZZMenO}##^#A8=1)Bh#!!RHdKpIA=hzJrA18JqVv5})jsC0L2gfJM= z-SK<({<*()ANR4{*L_{z&*wY=4oR_-E?#a#!L>bOrSlW+>;u6;CUWI?3Q4jC*yp{u zsXLATm3H)|P@*z{tRlQqzqwop)BW`3sqOp<#5IILuqLwSi`op!vDjsp)hNvJTKM2W z;nJ)9g*fZL*oTk3)iB>J~vU{d!n)YV|_6W zo%iYT(d9jjXIM@Hlu#wW-s=#PqNvw|)R?l)D?mEG3zkZMXXa>33>xiVy}5b7SDBEN z2V?A-c^QhzCk-pBJ0LJEjlSlpSE`5CX{*aKR|VCv)_~Q2*I&CV+{i*kQ?mJC_0=s) ziOO3G=i9SdvsU4-o#(JGsuXsR@xLn!(^kADUNz66a}1AxvN%Ld*H8PG1*|5?ON-92E$pNw zCzJOkWLMFvyQA~i@dNSqYE!byz1Bp-Wy_RVx;T~2ytjR{i?Pk0ey9+t*A7pHlT>_;v({F4k`|A)bSEQH2u>DYg&6=|%oM%DiAQkT z{<59gH&phvdhWM)I}5PJckNu2uze9*-=5)D%mV=YQss=-b&S!dRe?9w-yuOB_uff} z{@iWsr}lI{n-6PjtV!032Rpl&n42ntf7E!67rP{&IlC-eIpB z{vGTtyV)p3vD2i0&~c@pxq6-QUmdWSMzBP+!ej%O?ThE3@HI6h;@S8CVJqjlhUbyK zHLoR5tCX$4$Js@ZI`!Fsn-?C6cq^)&EM8XfMCKs=u~Oye)!{@ZFD{prHdcNLz(*SO zum1EfudM9R1MBX-zwj4YJLjntC+ZmjgA+N^?Po38b^d&*2%q$S%2$T)>uj&bYXK%7 zFRqN1 z7P;VkJZ#ELc4a8V!K* zJbcjXz2w>s$iiih>kRNVGEM)%Rvnoqbk^0YIYl@gqbVgjZU+8`GF%6gGqU6II;8Mm zp7}1d_Dy6Tgc%{$9m*vB!e9nTjO}xB9i*h_KKqDrhu@gZBs!+GEydll zgVpQjnuEX5mk(0D-vo7?CiA@ga@#vD?y1ap_CeBmSF$CeF`s{hULaXq+8KKHbLW8Z z1F5n{0K%s+6-gs~8Ohe32Pa8iy~k4)epYeig-q{kSRQ@tbNKu-xMyOvF3(bf8*9HP zm?o6DYa<<)Ag*V&A+qAe@9T0T{8uEa`nzDG*@*^nJl&e~%T=Ik`lru+0cS$8k3=$* z17q7El--A^TYGP%k!L3+CPm-PhECKON?ZVkPeBHs7M=rzg}ZJ+tchpo~wOYx%QC9k(m z^_uHllGF`zz?Y++@m-|u;yOlHFQ@95)4+?)gJQ&%a>jS)<{_&w#oD8KV_H)MpgT7k z1+Ifbh7X_eou{{PT4s%XpsdW+lU=xss?0s{gR<{B06__%lLm+qR_E*DSGY?iNpOF0zXe;T{+RM%cyQz zzTJB60(RHTj%U&&O-jy3MVQgi4`(Ri5Ep$%s9%jCZe!9a7z@7ZcitB*7-7xvo+~wd z>@n;2>^8QD%%B{k&yzKAfG(o8%bb$-it&Bz5QjDFnfjb#e~_uamy^4qFM9cv(=tv) z;Nnl`pW$0~PGW`@#dSU@kfcX&E>^73b4who>UMi+jUp!=Xsf)3K!FrU!u6X9)EuFj z#5&vdjGOjVcEQupkpQKe*!xn>O9SJ%S+_(Y3j8MLHfW^Cm0E_8XE$N7%*L?3g_1$c z<_U%)Y=T!`Q>J79MPVsrt!4T&FgQB=?Ar(0!go+u{F--b%^-H~WEiDIYJ2HgPTpfk zA7AU_4iRxAHA}kxyJGezOt_5h87LpI-e>QP9HwD=ig3`HG37L=hEsDO@H`w=+S3nr zera0;t)?6WvQp){j}+gWWzl67_Ys4@)U;w&{-qn zxWb`ISynL1bjOmwm67TWxgNe=7+o54Nyx95B2%yNgS9%Z%s#uWgnvxls!pBVrp2)$ zZlhh~@lXq5S~lJH@JG`YS1osRyxG`Jx%n|N-N+Mbn3iOhq#wsherFJfmupK$k`2h_ zpJ*Ir#51Rk5uEqs6W`kK>^YpXLHaD6chvGJE>D7TYgHuccaGo<9KuE|$A3E;AZ0s) zXP&o-P$}tGj6&V$AG>l0l3~B*0DN!OS9cw_)@DH<*m0@(fK!I4S8rr5^g?qAWcgn$ zg`(^_D%jk1Oa}wuL?SOrZcsn2)~jej*;KCyDmHroGmnW_rf+gZ-?ca65Hs?=_u>h? ze-VVp8HjJ*F#9Lm)W>Slg!aX z)fFhU^BQ3+l|Q!S9Y?bWMp`g4$=H@p#FjQMKAaP}bX*%QN`j{C-G45<(PwxsH~eBV z4WlcURdXD;VXUwl#)~SzmuQPtaQV7#44MT&b8mSRZMM+4hZ4AluNn44cT0ML>C0@o zOMay)9~M(?*iu*Go|sQ}mk1B5@1|@V6#3Lh6FL0pmbed;hYrm=Qt|V;-1@|gywz8)G zflp`()>5-MaV6+%%&RIo>Yur$2iFsHS#rnKzBv`}N!ZtH8SC;c4tN^K!T#pTZ}uj+ zx9M4-7Y}G0i>Eq^JK%hUkM@|MBI8`pX3SNQE>z*O>~H<*CMnXQUoJ?DeePsr%*bCO zwA*S~$Z8GYv6;K7?RbS~{@lZk8LZz?K;|bkac;1-5{xdBB$we<(zAPrDR+s^$In3~ z+43fGpc3?_`Nq_=uS(3%dukE&&(yjG|3Vh*X8nH8)c$EC8_S|q%kE0C6qr*j4l z7Oy~pK^UYr&{&%GcAz4dd@qU7pHuW;$&Q{_TmLP{h2;Pp>UQPRRl^@>{0Q2?N@?mo* zgSs1O*yk#eLM_O{Vt2%Ick9Uxo#Nes(C;!(>B7w!OkM0dHOO#0-CXIjlTkg)@|;Xv zm55UEHx$Q)KB;B%lJKKiPQR9#VAmpUXm8Ht#bx!W-#_+pi`5-4Zh7UBm4!V{rd{<- zn4+a=puPJ|ShVMn51&c|ym0S2fX~XQ>c6oY4~rG%|y9uBrKpaYTbP6ZOY3heS~so~U*F zyqrQxbPBQ2b+1?y_2Pa|4fLFjyn20FXAm4kqu*i*j)8U`x6qe zUtq0iIBJ+C6a6dR7II>9)^P+D?c+%DD1`NA?D+j{sj5Vr?xQn3RBocReN;;$TOgJ- z&bGjCZkbqhms;MWDBuuEl=Ti+^~fgN*+6U2$1&t~ z?*Fd*S?J?VLRe$u+g^8UZ}rr3r7p1w<+N`#);0UjktzrS@e^N@UXX z8u0x7gUaZq%~A&gurDS%EH=C%Tprz0SMXwMl$E+l)7TFw`&(A+%?ne6DZiz-%?0f0 zURc9xQPFxHzL-k^v3!oul|#^%`9^ieda&b6_GC${+V7hB{k5eI0X8>g>)X@5(v-U2F$Zn- zmVf`kL7~D)o)S% z>t1erIeZaE4vr<`UN;e`6^pm?_lp=rDG@9)eH$W+)`ltb$oJ5NgBXVL+*3CEi)SJ= z#Be%BX=?)%`UwJ8bH)C8bEE5ne(@La9Qyk*6!kNa2&zFoa!dip>EsAzYFD9OHs2Kb zB%Bw}(c8_k=#%RzAOPEd%ycz!EVUb}--3r#emA!zo|rlcoI&kXr+siYE*3)f+^=Hl zqcy&6n#AidB3}J-5D5>311Exl}~> zO{4d0o!aebXqSwOM1O2Qd{CwXT0AZhU@(JKbI3h0{M^U=ecju?{9l$T00CNjtwN{) zvh)`Sda<5B-!9X? zH|?8VeJedNUOm5^nc~^CEK47%1UBtP14J$c1MtXisv!p5(jPDH?-l8f>we!8MEqQg z8UJ7nY+o2ab#RX>r<L^~zN- zIok5UC&539hnT~fN&;5q9oS){%Ae`c+lHMLomlyi_$GMIeaxuG*n%yQSO~}(`{Aqc zuzWN<&$U=4Nq(9fE!olkqynO8pdNxrSNp#Jm2P#TX81(-D4 zaH|cn+J)@Kjb-G*fx!XQiGa%VGCyv;Jnm)l6C zdrQ^P{3EWlA!MsSN|@7!T)Ti@k!|OSClX^A)?>hb&x=@%dW_0l`<-yQ!hJa&sDRUS zqAM)_yoIhPM3sYId7qlHTi&PcuP~!koqHC2{`1fHK;(YOGh)xc^-`D{7Swhyi00^oEdtt=}mJSnT$M5>kE9GHW$zKyYH;BCm5FQRd{os}fW61oxFSZ^;@+j9Y}}k|j=d z$}e5~hfk`&W~qtU$WcjKQ?t&PxL@zT9s)PTJdZHC2(ZftXXH^F2Z~FybznEp4KfS>9l)qMqS!D zC2V#LGDOzqtk^h#7Q7IP@xz~^RRCt6zYN_6ByX$-(`J{*(FsKpkxXCohMh|uW$U`} z`Babh0DmR5x*hB!Z7C%S-Qp}~6fKW!DS)O6)uqPC?irQs7CMC0j}=yndQ8eayWA;$ zSY;vTzEIlk$;&*0*;W!g^W05}9+z9Z##PgrDL((IgE^DJLk}uD)g+tNaG}dwj3HuL z-TR=ArZrzV{K3(Ds$>7$50uKxRst6sBxyB^9AMP!UmvC9CY!eP1?=2)VhE@d^CtXSLqWRc}EV!9J)h`Uo`*eu$TS+nRctI+eu~A}bZrL#Dov3%cuXq6_8E!chj2w7~0kPvh zMuD8KxP4E@f*f}T42k0?RHU$kgwzY41=)KZpi!#6_Icmd z1?u90fW32a_URuKj?jBbK1YSLmyTp&mYS;y`#_C7FuRa*lG_r)G8WNsng*se%+LSYWB)jHiXTk-PGC3Er>KQJLsp6MW5cA6SCFh@?B)Lq ztzq#K&_C;1DwixvP1$CDPrBYY< zdPqN>Iwi#%P)kIfe4*yb#67I9OtzK$elkzyW7WN|JEE%+E4})8V}Z6nvQwb)P0)8` zYG1W3k64{r#N`HFse4ALzU~-CJ$|^0v;nfF298Bap$Ccy|UyJr@Z{#OQS3iqTU-!jRbPQA&jW*2yG zvZ1nRN)HSyA~YbHkL$sn)s`Bwlty0&AvFh{vtR?~q(NF@!UC}du9_P6B*hH3{K`($ zjcN_0p0g8R`ZpCQRB9#l#OiF~rQ3LX*fWi0xm{8dgtuIz?}5-#S1UUXwIi&FNIf@rs2IIGcb5 zRehS;y@D#&S>92W)m2Rxpht( zCLH=|KEq2vWFzjr4*LC)M&n;!@pI$V+2Gn#ICJXw*Of=>n=?l)ISq{zm%HY_|(iwnagyEaudp~prl*9^_n$;@1)1QgY`^04 z{-Sl0b*L&A6;(0avxM99j4hkv5&iLk#uwv@M?ZXeA8{Z@V%b?cl`4T-O5!sI13LJT zlfI^+Hb`nk3YY&+eg46nX?^!T=?Xc0)R=3Gl zM5NOf6>CSL#WBfM=R-2S(<}A)X6$v*Xvy=hOELb;38kcK7Vj2~KcP;<+9?l*G$9bKw2>IJ@a? zdB;PR(Rt+u3ZZiDPRLR7oj$4d(!pK8b75M%Xsw-QVUtbl_H_))XkzkV+y6zyX~7YV&n`iVxJ{$Xy=4_FGjldY!R`_6_(!U-|Px zr(gRe3Rbp~V;Y$lmw1lI!=R?x_e~mc>Ydcw@?*I$CW^*dY}VS!ms@9+Kgba$#2q8e zTuo1}-Y+P(#f4mp$UeUy7ODEgzrkB!+u4_MI!>_QmNxPf)crpP{|$4|sF8;;w0c7M*OjewtX zmFd&XTXJmf*{D@;x}X=7|9xzcavWhSz^R{0LH-v#_xo9VHfYx?%OW`TKvQX6{Qcpn z40K$jHyq6as2{F+LisFg`^~d+1p==5hgsNsiRWu`v>|_oz8g0S&Wi}U^_p#2*#~z^SRk7f zP{Xukk!TrGk{}>99J*on294lL<&I3s20WO@aq$wg04`P&KEA{+PSle~L!G@1e}mfc zdJ@_4*`JAmf~+<&`W4ah7pVW3s24kKh|+8B&S*KSW(4X7x(Cjjn>;O9ZI-}t`bVXY zOQ^1gC&H?Uf>C$l-Dd+!{(YRN^vTJp)ByHcb1HA}5C+XY*k0=x-z?wsn6;yOTvrO& zZo=aWP`_N6U%{8c7~$nD|JuX^U5`Grjm#Fk=;a5wvWSf{O>7r?F8gbCFIyr}(}qqJ zW4(2@p-qIO1wkq76SL_K&o43x@N3Lzm)(*v?EZW;H<{cX%)I0}tS%$%%SP z!LEUF{XbBCG4|Zid*qCj+^kfFNfkrn>bVn7;odWM?}qGy_GxHIk~Cs9#I?T9EkxCX z4V{y7XARCuy9oJ3@OZ{QHV?~a1xDOxIqUD4Rihc%19@7RT4-VE%aMM^13`upKDe0* zbCOpG6W#XFBuAc_9BkP)BP3CRPi(g7U^1SSEb116>AP3}WRCu0{z2OuWe=Ur9K%X$ znZmvAoiYnw*Nm|*@Zwc%j$dcmMLBSLjuSJ8uetS~oS-zH!@Dm5u*=|kfnkqG*)Gpj zyK{aAq&0~QIY$L+5!GB0(lY!)SMc<`)0P?A_>2YCGaIX#zPU_uvAf?q_nzQSecqt0 z`QAHE7AfMANT0w7k%gYnQ0}^TzZK?QL!ItV5??YY{;-kZ27}6WnG-alMh4A7E>YKT{st=O?47$#t(czjY#$%ugQV3k;}Hdgv{}= ztn;_uXO0<4g}w*_$-_TV_|hu0$bGCQDBIxt&I9X^2L#Z1vD5ODWl>LTo%_a%R#Dx{}WJv~SB45v)d}X z%zy7d9R^uSmRCbV9CN4rN_!>ui-Ez$+dAEI{bkD&tSwA4*xSpkOb^{du!SttJcp`V zS@|{(;b~B~>=sUB4dF%PD6cG4fhSh&uuoZ=qxs`EJZ1ya&Zg6AM`8)A{aBNRM|TO$ zke`i2=OlNF==Pk}BExKDh}@lN;Jr8*u&T*M|gp(kg*|)m5aUs3cK!1oxfTEEtD?lar(Te(~(G z?1@d52vh;A6@BUpVqhEX^=&YgK@b^*lYVhUxD|IiDvUdn-+16mUbEb*UQ&WKikSgB zexU#PJTDukvZ~NQx{zpK=%Y1Odu*EhatdwkK3WLy7%rM@Q~IIAcG*(3b5OkbuybZr z@;xbwt)!AI{-7XPsu1AvYj?W0|5M+~zCFJ+V_ldafJToggd0lO@xsP43T3qG4K!iH znI)zCj^$~BK(T8$L#7Yk!5$5U*Q&%2<77BfZ82%mS}Wf#f0c%PdpNFFw(LbM(f0Y_ zhq~^0zA^|6CfeTGG6QL|4`}^rmoG3j30)OWY0J=kvUwprYO09;j7|}$<&o5?QFB81 z5u~h5JNs(0nGGSsETa$cf4oTrSZ!Ydy8!nn{A&0nUY=U*NL2q?QLGf9@moRia)RKE z1}@Usr7|+F=%+kw3_Wm}UTJy--b9)OWiY;|OCcOaHT!VzG#o#zJy%y3{Si1YZ$#(v zgT~dvtg-^4aqE9t52mR2h#dXULT>$rQ4TSGlvzkW~5iZj?MSl zwu}Vdr&9lRL~o)%JwD!d1>H8n2S@B<$mO(|Zk45GH-S4GAI2%b+Jlz5hFvA4~LyjR)+f*&j#OOC8NY;gMvoX}hB_`14 zu`x$KwOygj5MG!1U}K>1;g@Ab4R7!dk;ozz*(Nrlf5W*)cQiOuJr>ZA83#MfnYA{} zrEhqtDUzb;F8NKMW=NKuLC}bt9BL$H8RYEM0Ife|h@iRO3pB?|b=mL5Bv2j~uEt$o zQe{S#11r0wW9&x%cg4Y0*k4S9^$1jM_TSyE%w-jfHz4(YSDc3vW{f7{2-1d4%=I^1 zFaYaF;rlP~byoYBrSr^B*tc@Yv`A$K(k-E6H<4XNea}t%x$b$XLDjsNiMx_n>H1)^ z?5v7NLr>~eaG{w4>KkJMt86w58rUKZXp>u?lUSD$ZdVi9R@iuzoqF|N|Z*#1`BHHzI9B< z^OMBq*bbaYvO9N;3T)$`Ql)>UIo7PUy5)TO2BwG|aXXMTS^DhMSjHhdyXt~WW{`}| z5{2k`Sp+ShtyQ$87nNvW)dzf8wn0Gbp67nC82_ua)A8!7qGRvu%|%Ngw<7H3B22*K zpDQnf=Mo_8>4c8^gkj&ZWxvfatRpg2fGU6syeMe-uU)I-2QEawde`Zs-dvwEA-WP2 zH9lPokGajxu}~Q9Cb4<2P=Nr|ZVIlAf{S;TjjC}SBv@>oP+3oLav8}xTVKOYlN<+C zKo?fHq#`c@i{IpUY%idVsyw8hDXsAx4Vj%iIT8hRKzm9XiX# zFq^I4=E4T9mK>(cINK2p$Wz(anNWgN(N;xIf=Rx{v^yljCit&{?naR&GPW+z2FBHV z8xY}m$*Ifa`a0g5n-abS<{y909XzFmy6=^Il54Dm7K`cm@9Hz#0<+p7G>9`)0!TE-it!RJ^D7zF6#X;h~1q}U4j&oWJ2xl9;{ezY`*82Y0~Uzb8eg8 z|L8!=bzz>3p`9G>=Zx&PrA+6D%Wp*^T0;%~U_Ugjm2fJyxzFk>gOWlDP~hoiX>-lW z7=bs#<(;dfUln#pf6k3wiUb6)A!J;)aB>

MUyPVEq($;Mg7ZmX{;q5DKg$+QQX7r{cOY84V$n974Hr2F8iU8S#_gZz-ZVC=p)u94#MZWM3|3V;mj9SqPPr_VpOot5B&9L(K3jv%p$_FaPhgfcbtJlZ6z z%`(mex}!S>kb4E3nTKjG=Fd!*>Q-lY#(T<)TQLbXd4CWp9u=NnCwWxhoeiwt4a8WR zc6Y`bi++Nop!E_D28=AhE!{`XYYL%s>`Faq^f-LxoR73Pw>dM#`r(h-nTZ;m{R}Q` zr^*Kjm2rVvR&z1uY7e8*YNX}#qQ~!8Mb?+e3@Gp3%`<(_b%^!})gz5-Ll>sG_>>KSGfs5Sd(>9fI@&Gp-W)WGvE5f-6q=4SINGXlm#d+|Eo ze(%(a$SLyhpK4D6n215+OBE4_*8MfB^*h~j4c3?jGc0_H&5Wzb?Q|Pn$z=2dqFMS8 z-96Ty@~?w*NhDQ+<-`v9wdawlBZV%hh3fjBTh`qAa=|k+PwKDga`$i*w#H0WEyyxa z$7`uS$2t5~8$eJ(T24)ZO7yr3%{%c5g!MKo4^9Xy1l%ri<&R^w z9xGWW0RKI8YqA=z>nF`!B zpY%(N?vK?`zo^E-PeIm^OY#)ff#brSF45_OW!6D;*!Z$n^%4e|dF{M<{zzT!aSwWV ze${J~3gtClK*-GW%ZBfUXH7fR72XsLwLG!B&D`jJDODBVZhD@p?1!f}CL}oc#V|Dn z;+?^lD_iP&un!<8hn#ojdBcS3_EGDIr9q4X2{)u&Dpx-mkNWgL0SBaimFR44JsDp_ z5aM{|E#QIqoqH7jT{PIM^GjW-LMJ}y<<8*-amrs}p+Q`G=PH>hlTq8R0&sr5SuoHH6iR7@drAFkwh8ZU0G4P5n=g^PXNf9` zF4HGrfO|Ah20HREiK_aT12tR#ywfDw6w^vKUmoFU(iH`zZqf3apM93dI!SXGT^`Q4*NY}yXf z^j9T>aVu{&YQW_7jA5{Eeo8wPjTPmD%7lq+=8ZSJSSbBG_U0?E94*$cui#4oeG!a= zBidB}?W%wQzAV8|C#qYfx#pPtz-CUir>x}2$9Rby-u#;U@0Ya5&{Vk@YqN-BYm7(O zRG)y}tJr2)icPAxXyD!B>_^xPqRdC7T)@V738byL=lPt^UY~iK^^oT7fjp?7h!pPC zl%=m2;4{=h6Mw@*-)jCM5x(2)30mj0be6Q|xWNPfaZ01jq$LxtizU3rylKTv&F2S~ z-*<{;=n+mmB{K6gh8rv6X_w29T#-&&LTZ&@kstH|@^C=HMqpv;#k%k!Iy+pVLW%ANsoO;|^j1UwQMd zn-@_ZV}?af+?I26O5eO3X50sXb}{lK&sTYZn^DP8tmlV7I<$J0|cwa_uVy&p!8q+~LzYi*{Afgsz;UegqToZpF$TnoDv zefyZNI6B?h^DTN(+sF_NRA1nek*b+Dbq8tgHF}%9l1NDPASgn^#JOmnHWKIFQXN~~ zwgsw5U~h3&!L0tI=YCgo=j;D*uO@ADp(y8@K%Mm0q}NTWRGfIqe>3M6ofv%d+MKUE zGr!g^!R7DhLk5F3Uoi+t+n;S~f#)jjYW_)zJ@ULAL$(!F4>D_60J-=TuUOW*vx>g! zs2y(jFhrr@G&ln-&d$dOA?PT>zPVv+!%qFi1sr1xw^Nuh%Cq7OHj+ct^1|AdDsK+# z+^*_;<7`8b87<|~D*paqJr6M*vi7Eb$=w9*b*03wtbalE0GPjyuG!3-P%7D5%on%fpRW?W!zjR5MITZy6rAfK6ZZ!JrGnNGL3WufwuVWo9Gahv4B ztM*;1>dye5PH~S}J%P78Wk=WQQVI!fbWVR2+Kj+XO7#r2LVNrtu#RV^Sf;B-KAsisPtEvV(CTB|7o+5ixv;FW^nC)$rhLSfE*f zeDTK*HYn_)=rRHKvoT{Xrlk)dFd%Kui|Vc(4opN)1R4>pDgQ`qx_eqyAKE}`jv_&> z2jcu{hvhoTWd1t++Qpae!{vH&E5*3_G`=2zjEDDUbyEhGO=jymJZhR@QO1aw_~K)s z+n2VDF8J)ba^lKhx-{`Ef9`E>$OgLMy;;Ei5iU=i{1iZ_p6Ytr9O1CWHfw)QDEF#R zq`7HWO)mT0!eR|US}IliE-iqiou8mLx0-pmdM^T$ZE0NKwzgF?hnmgnz8( zWUZ#C(Wss36jt$)AIM$3Uu`gLGCJa6ROP^h)I!e@Xr zuU!YJHJf=bI{rc8&d$m3fJhf1bj{RzRY#(>c-GPHB=kV7ygM%2!NSt7V!1}1mS>#> zw%SUNJljm1Ej}x(s);28k@xYgm|@#~~M!J^b_Kz4~o zM59hfLHQKyiT|@6+54p$S(Q6qwxn)dy`!A%I=%iB6n>cbxIhRu@y)MnZMKS<*+_jE z*Tl?D)hEWOh|EvSXFU*yEh5|w?+?gi#8w9PhI$~eI_I6=Cf7H7cNiIGU=drNKa!h_ zRxGpwAL^F`(4I_Hblz1L(+4Gs(^=hY`JYo}bd=oSp*!BB#<_VbzlnS5#N$sA zfZzLA(EG9E`AVDeZL;Z|2d3LSao!fDnMqVAU*6kB$3B*Uyav7^2&q1eYl(8j{JYCw zF?mV$z5@MtL)eQ^gFHqd2Z}9iZ@rCGW?X6P@;IJY;)%HY9gbz+HU33hmpDHsZ>l*{O{|pJ027sX(;khVR2eg z5o~b-4>1Ej9UuLBbasJQ4=A`0BN^p z#e**?eVdR&L&M-xTl~v^1!NnrTI|bY<`-;c9v44~Hy_@rnPUBVG4!k0qqC`6-e&T2 zEJW(SxoYa%f}_n!HZB6JTocTDFtMd0=N!@f1CY6XdJ77v!~|1{`z(gtTS%g?A3~ji z$b~A(C>t< zHaWw3-9qkddRSB32sF@bE*0{*OGnl@d+VmvUi{tm!R90ZCbE}5!~D5=;ROof7&0`G z7jULw>Fi`Z3-?*R&Pr_p)YV7HVx&bfrE(TZ@(enLUOVb5u1e4B zADYC(fHf+Sl{Rb+yX{v*!an7AcvcMX7}bw^x9S^C?W?H!xVid^!}33Q1dpS#mcKT^ zQshi0QN2jRTwG9Q9f)>5=LRG~Rui%7EFi2d?K)c1hn}$n?aIV{3QL ztzHuW-bhf(G53pm>Q}G(J)`xA#F=VPY|~y`HOT!p!?E$v13LE3aVY zwjO0ksC(B38ht{gxA*-Ldmq{;qIs~N?=;rmBYzQZhD1-syP8iw${R6B-_iKN6H5#W z`o}!t{OKsCwSJ9uQa|Y+?6U`GW~*zc^4R=y0NDqb@yR`s2R@kR3pDIHCe?_zKB#&B z@%xRFjNvTK6H&R+k=eBSC&Sl?RKD(_-Sb()Kk!0-FEySRGBQ<$>KyUyV8eVq3-^1k zHk+XBH`Us3-celGrM4wUV-e=Vh+uwC; z?Rv!GKb`buJR*sZlSum6k{Ru4{k~yzpX^Yb_nxU&Z3W%utKDd{(EFFF$AvF@xPzkd z>rd!5dd*q9wg1Mn%_>K5pw}-An*GqEqIAO}aN@d*VGB>yMHXsG>M=3n;;|QVYJtf& zr+LFtTbS4MI>-0mm85gi(KJRM$`fLcFJ|YSpg?+6++FA~rjDwyp()Ak@V*8p+NNGJ zd(xcsOeTZx`sS$fJ^5Q?oGAkFA}s|d=J5G!A1ht?ADw}miGcN>=lG`xe3pO6813Ta z98BHs%{l?GN0B-(D~0E`jDYpnKbPFYCpxT}Co(5WAMq+;5AcJ?pppDqmxM4{4i>Fy zx<2jolN@iu*yqfsF^jDH5xa_CKoc1?xd*s|nPi*KA0xezCRhdLzH=d2`Lc{` zXBan?(OJ99~~CII5z&b^#`oqiAGJ-`7!5bii9<>M!!n*6rpLc6nycy*CgmhwP(edX{wq zH`@dITjm9}Ez2jK^C9`z8*pw@k$Z{K>1LJyhiI?Ohn04He(%0ZC$kB^pbWo%;XIwL zh0;IDm_;X!`gXh#Z!dtcSDmXv)=UNoeA}9rUUIx156;IUQHWYeGa*fBNS(Db1ug`=7TV; z{F>qW)#H*&_ah?+vXxavpLKh zHu=8|hBuOuoG@Itm10#l#i#vHaJ(&~3NzH#KT>-L4*FvJPpDW1m^~)`*JnOeFZtc9 z-{^)>D~};2`ro$ccBfN=SyGby#~J^^=VbK+Z|=Y-&lN*pZT6`nCrpj&ub**#u76B1 z?T7S}U48xan|{f=F|uE@=b`!HdV>FMYqjf%&ZD{>UE^2%CCHZplRIq_w0@Ao*?){13$U52 zocz@2P(gs(@H`LYgvl)4fkhD>UepB)Vaz+!Kg}CAK<4nuRq2-_jPqp~^w4Zz49~ub zJ!-m2ERedS);QbbzO6a*9jDlF_^8!Ns`9x7V)C8QXwhsRqJJX#2(*S`NmbgKZ9$X;OLz76q#00JV{AV^w{EdOKa+K z&F=a**t`Giu=r;%j0q}tHeOZi8W%%L7ci&?%y3upnh+i6Fjx1a3*wG!1>l%m-odqO z`NKyr9D$uFtVQ$`U{@0pq+H~KjOs_gy-JonfKWbWcmWue(w`CzU`?dPq*?fxlJmb0 zy`TE3s7}e7WL2O;WNm$)kG5jo%-`y=jU|cm{Z`l!DwptL>oKU2{u;kKR*-S2^1~%N zUIFkC@mVyt#3XdK?)5Z%FBZ$#-$<~q6`z~VVG=&2$eEWTY^jHCQ$$${2}t69 zR4R++X{~jf4#0;p$9Rk-%I^vThfmAZ&YpyXuwk$<`&Su0r{F59ul3(8_!ZZqU7PG|3% zo#0Zj{Fx4i6aQA2g&tRtTG5^P`L0Ft_yCh3lB~TpaP@wTl)IqUn8FW!zd>L;@R%j7 zU1VBaer7(C)iwF*&`G1F_k<=J+{H<3VR%+KMLz%)Ew7ArKGp<$IVT6WTn>-aZ3VHt zof|SWGPIO#+=#7Ab_d@U$I?w&PE&-15lmyhaFjVxYVA1p=L^EVRdJ+vZJcERJ?tCW zZ^+B95>-?tHN^(RPG;BWp(;ZU$y>z&{FtEss2)W#i8S=Jgh_6jj!uj;ovPdh*Z#uN zIr|PvzNWX`Hy8C(e0A{cfOPekJT#^8bNIsjL_n;Erv)2m@;9(Y`X48Qs;kgU;k%F! zPPZ@1n}~g?xC8XS%ZqhOulz&ev_@1*xTdI#liQup0Sb2iM4#c;0DX&(lHjR@t4CxxA5>)$p*;)PP zLLY@`IMR|R7d%aUFV!J@)%%faa_FF@k47M|wpyq3y=0elKQSNi9>Nt)HEqA@j@C z=!}TEq+H|NeMksP{qFF;8L!MVWb*ldU%@yT?iS}0@M!Zhlphl&S=JBAROD=SVTv(( zKDh&E`SpM>%QjIN3bstSQ!*=iKL^dKzB3aRVRfPnT#r<(sF_l6^L_^;cJ{+}Rr*Y$ z=-8tco6|~@!yG9y;6KtQq$qul^lMF&KLC;=q#85|Wf2c5fvW?iUphj~O){LfX~f+H zJQw-=2izdl0SPT|bvp%Q^4@B~EM>m)bD%xXQn@SR{Yqh>ywmAzib_AB$CwZ97w3{uxIKby-0?y z6RvZNJz>Ecc6^vX(Go#Mp$+TqVQBemwM^x*a^=b~>hYQY*_ozq`CRFuGe8`T==^et zcD*-EPGP7+1K{2DHWFgx=wpNgriXnj!$aEUeITNT4FF;u!pCryKKHrji_;YA9g zdPk6D6Z`e&$erPyDT)v#INz5)@i-YLJ+6fa%+(%puEdBsOIo$3ZFNslqFGa`^aNWF z$!g|uD+^M8plvqXqaL%mEp*AX2sd?WjIF*=phyhgQ%qj=(zkaO?ltqArgs@ z3E0CrfvNjuddC2dl@*99zdm;3CLv^?CJ#C#QgcRIY-uWTB*eE*JTIt5V)qxy-G|$E zlFg~@27dokW~Rg^XHW%3;t+0kc8@*H4jKx_Pb(H2In>Fu8Lb|t#WRv#>)xc`vm%5| zweNTbOa>!>rSn1fyahF~b-jb69qlSf*^8IiaG!f#A&O;5wsvo3J!+$T2g&KtY=>(+ zT(ez`Ir#Ut(QUTt6MAEDJY%#pp|(EEoi!P3sK=Vu6#GT_@%N*_r;laXCzL~L%y!Ct z4tXO76b@>{f17TSM+vSozpsZ|IhJ|(S$iV8nwPH`25Sl6vrk%=GOF!LMufMx83t}p zJI*LqBPTQlplW9{e=n4gtd&G9Wre@Q(Y&Sy1qQRLFl(fx9krgKu}9MpX%6girpB2Dr!9WZ9n@s% zaZdlA8fEN;D^0t^G{)GvOq8ryb-0CbA9pX$SDvJ5gZjZAo?4!UPE$L>wW?gRZ#kw|8?55^hL}Uf*x98am4}3#E!qf za2_8;bxEw`8+$X{xI2+Y?`Ol7<6Rq-s^a{vh5Ok#_~&@xus$Aw;5r25u(FFXgn zUs|(*4yT$Z5_fCa2EN?wh=@I0!Z_);$89a&K$&4;*d;pIOzD?qMCE6VgqZd0M>>rb zD-E$wdDGePh}RPm|5I7tw<`Z+T!CE${IN`em>$PU0xi-z1cY738#Tl>*7T10zI~ia zw|qrgJ@8UdTiVR;oIIwrYsC|5ifLDmT07PlOunsW&afwwiZj(`)rpcBCbPwR#($)( zR#os<`*ams604fQ7C9c!w};x_(7U_=%h?-RF&r{FsQ*GGsB&q@Ti18$qh}pU_z}Bp z?A2~&t2da?k3DG_^TjtB;@ga_i5+Y5)Co(HH@b9{O8-T^%k;@CdcWEBgC=6vbapH6 z+Ub}Rqc&^kjl*gn)YNTV-P*5jG;_u7<(2?99hPKUWBVJD7VXU97YsPQ7&O0Mzpj^a}JH<^-r~U|f3rzI$TlZ32is&h6kb&)|!;HTLgNYR_&x;%jPO z1&aMzUE(ifgIFrqgG)&9Jo*rrn>u%8As}Q!bt0>bL%az|sDYMtC0%+g>!@t0vLK|u z%rtEQgoky&cR~t%9xffvtpL=&^Z%dlJf$#b81N#6wGq}<4^E7H_VC+h3=Ad%5 zCmQe;KqeM{QEGyg%%`}I)qy;f8iw?mpG1S9bO+VNycV|)4yvBEf&c*g$hU9pB>X+=2!bzUPOJU-*tH%%;6azKnBe}ZK5GbA6{(G*34gVZsS|=Pi8VV1w*4<8x6e_{A((hj9Tk* z5S)8wn4cY4ock?%uan+sMP+cDgOmeSX`z~2;7>An0DyX;gCAp2x_8~}Vc}9YJ(wL< zfQ=tWr!hR&EU)Rbn=5h#YoJPheDzxvK}XG=ZQ}7x=_Yl z)?=OKGA!)#8L4{6_bz*sU})JK)6w=T=d$nl){v5oFT_3pe2# zjm29>EWs>8O^_-S_v;*XFGXvO%3jnh*N@K~%FGkO8Jk4<|Hs(w^}W^e+4Nkp=E_#8 z@&ll*E0_2v9A?y?Q3*d|^BUeFKs%M(M9{Y}{?i&dh`jBIbj`aSeEc^Kkmg^0XaD+< zsf>QpX7E`uMS-TH@+U%Ne5D#a5EZ;~Zl}3hm6bszSe-sbT7iJMcfG5jPPYf1 z$Hm8c!97@}%}OIU1aXD)j$tUNCWhPdLpzk`3*M)>m$D74+2`6_GyTaTB|KH4X8YT- zBsEwe0nO*e8zajp>S=Ok@oc!r^fOA4BBC)Wkuu1k6k#vMOuK(Np!DQVwH0wh|BzwE z_D<9vNGDp-KK>80C~Kd7R9D??cEsnAO&06%;DYf(Kl7E4vo4tGTsBSwrZh@Eoqe^h#Bv(whU_B>RcwPrOc>S^N z+d-7$XaAnC`0Mtp9_Wwna3(W?!xZCo4r&}uI(DHNJ5`Xy!dQ&b)<#$4k0r`A61t`u zHDKnhv@Es2bh5rAc2~FE?V6L|HRW2{CZxA}yl$Iu3F<=`J6B}lF2W3)$}lSv0{vV7 zj%jXL8zrGj@FP(OAl%^437pnqpeGwmzuqS}U3fchCg+Pbqe0|2q73<2dq0Y(MAO>< zLCTyFx8U7pB8hMN&nBeIyiccP{uxSRb4F`w%H)NoZyBjrZdjrk)=HuVI)JSvLSlV1 z#ETaH+#WkYqIMAb6C!N(B*?&TRGO}|dN-3(tW2%aLE^{Hm8`ah#l?0qYJpbLkB@}A?SV2_T`olH`hQdkKTC^OTq3N2tvHU39sTYO*RiG4kUmfWc=JIF z5E&lRky9`D^nTAPf}OD67Ba_) zE0Wqn(RB8;qkr4qxwum%%hP#}tUhbq3r!O?7d8iCx6da;5BK`D8^3aYK#jakv*6)V2UQcwUN^$F}T>k&> zWSv%u>_XEYmjiT&RYMadNUX1R4bGcj6j>*moU+h)Hp_dxi<=?ZNIRS?Y*!(E>fL8- zyPL4jd0XKgjIM9FNSQ7qoT09JQF~UNiqoqD;@(e}LK~#G83?Bkf%RIq91~(z&ZSHJ z$h7{l5#wd!uaF@SNUIxSwpd@{+p3S;VReQpZ@{nj5jtsnGHx==$NU&zdz%|ZxD_o) zFohjI+`B-X0j9nt2V!Uz#MdS5o=_;7GhBXFhIwxiYBIEbWChU5s=!w4g~x%xX`z6* zE{c1NKhfB?PAIbP<&Cy5)kF~&55r&bfWakYa9m;0rX!$H{?bbHF$bpLcYQC`W3FI4 z7!=dY86i?|%VD(PA5nlg#RY1`T^6Wb@-a~PlV@|tk6}!U;N?;Dt?;3DC>LzA_1I~| zTfU|TcV3B)4lxZ$w4$LDvB+e)-%h_%7EJmU7v@zRh?^F`xJXM}-N-+hv z#02-I6{snD?sQLl2=-MLQv7w~CKrMiqQ=i1qVhE#1nw^067cWI4ov{ddJr}Dj@>^1 zO+tGa=x3*(7gl-m_Byo^jKAVOz=s%*)98vde-h0z+_nt8X~l~6BfLzf7@}r!DA>m& zj;9ba(o4b&)w_}ABci2A70%Z|udVzGRsbX3WYu-fYc-#9(x#9W!NO=oJq5G4AlUv# zmE3AOtz1&C<8K84?y~P|#;J;Bt<5)yv7N-;-JBV4%&(v#HdLBbaCkt&nqm5y^}Q+* zq1YkVv5ck0XJw%t_a+}Xn5syy!y|WyX1^ascgT7S-x0&RS(1db*E{#Yk(Q zBPYem8Q-6yr6VQIqk`jkg;MB`7;TvqnJr~MlgxgXKr*l;Gpo+h;xzbd?2%{jy&(C) z^))lwuS;%CFH{K^8VTMq>(Op!W7yx2H+F5FPviLIRrNmgy=ssjw%SVlS=0n+2Aq$F zZT1b|3^gKdPyK9PXag{8hdu1;IhLG$ZW}QMQ6XJxF<;91Unbrtqo>Gou8CY&CM%-* z8C`Aeze+?(UpWHE3GYyuOd!%xgvrt9yrbyg@`xaRTVK7$!2^s#xzwwT4og* zd5o_KPmrHU&4ziU@$6|607A;&y=D~Tw~b-eso~Gwv@Xma7VBd3JLdkvr}HxcuS?m} zU{y6tGM)Eo)V+SW&dJ`tjZ(+zX*VgqL`Td6xF~D&O6%jh?2O> z7{voA;o^N$t>qLdHt5$Md$y|NAvhu;XsO#7;p8*MJ)Mq zvT1)v4XZT>prkf?}DZhiUchEB!2p^nIE{ z3-<;)M33XC1$ggQl!c!O?*>6^TV?&Yw1nq?Ii^aj1=3k#%hJ=L_2>XK=Opdkw>w|Q zOCw?YA60b&$jjNJ>QR_>kU>q`NqME2yqC4p9G~`^k!pqPOgB^B%B#bd=BXPx)g!uB zWGOjXOXTfdzy0uVQ|7(ykf4oMm1qgZGy;#i(6ROjK^?aTgtcgM>@{_~FbGz@vYWNTf}VQQT0SX!$SBc+G+nOTwsCBi0Hz*6|K}t?{9QeAee$6;1Lrusv*25q*V?2Iw z8p8-{*TeKfUOJ^dy=cb-zd+4iw0V9334V3%j#}H%=qP{{%3!6+Ril@tR!2&7nomqemv^wt);gFRo!_4E=onWwdS{>Pgu(WWnXt-q%Z!#Cug3Ou27gbAY@aN-BJpI7~-#f}@Br6Z0^DyYPG41IAC(3kGw6UpH&MClg5>okY87F^2m3rP+r!EuKYd&_U_ z_n7XDLz=ntx$0uBC^w3lT?QiK<J%B^ zhgjdU)s@s4`1OU5H&Jlmdh(-kqkyX^xjZ;E>>eSYon^v@DGrKhfqm1mP8s=_me>++6?9RAk%W4@muhN9ZNi3gCf5ENSrA3>0xl zEkJ$8acm;@Q10BpYsjoz^xr9{D_*+&>v;y*DV%t(pY-NCc)e!Y=O{8xUnrtN<2*;} z57nB3*gBl;C_slp1~9~CRm+n0rA~!kE~%ih#)Z&PL60iu?&PZb8vq{~z2E`cD(@f7pm7+-Hu4!W0xCr?uGWs##l+I>_`rXNoRG(?+$BnceyC(yl|#bIA6?JNg#?v(;?cO`C5` z)o+-;3As>#%|=SMcmzEk4~g0|6%9jM)gIf*C&A=P$UamX*N?`nAv9lK(;Ou8+gmi~ zGHV1f)zF;)s-#g3etip~)KMGb!e#e&k=|WGS(DxO@mo{&A_TtR_Y8{n9e78!Xe7r-)l)<9p!}IOMRWADqEh>I7Q0|u^1)N+T!XCM@>yHO&_hZ+ zWmd}xvXHOg2QBA>g+Tv#G4TL$q4TU|_FQrYM8$U3f0Fhe{TPx{weOk!_~&ZBe%NwxvEfjNvmZf`U46d7^0;n|L+0tppZ7RsqQq@dqTa+NVGTI z{PA7I*)`#XA&pFCmBaAs$b{A?aDJVJ8;2o*?>{Q@w-_m_y|4ne;OgBZ;&7K5n`EAX zWR*Tc!BcIuAr6?+JV8%rFJKbBTC)3?ySu87+>1~MN#JgIIdk;s1dsBr{a;3yDV~?V zUcMv2hrJc&k|d75c~m2?o4kyZeX#g?)n}cKi1Uh(CZT*jU6;MT zhToIkgLA(O9QjH={bDAU%=aUv=W}=PDi=;jnT{_-{zZt`JblR`1vz^MN?)OAy`KWZ z`7NF}XT5FbM0=7VaPdCpj6q>CkO z=yW)sXXR=rPYZQGZ!!C*ewLKzub?c9L7|zO$QFmWF#zEXnXT?BjcP-`$D%SZ+XWcy zUo7dMPEOlKzb;Qv?dFUZWMjCt$z#=lVV98TbPfQrOd>-#NkbYgwI zujnz04vGGrTkSpr;Z_tw`CR-(e@s`UGz*;bWoU^x==%WStIy*=dS z4uy$btt!&G!RFMgKbT`Lh+pUeu%Moqsl9kge5Pmk6(gbu?UvcM&{3yL6?Y3>JH^F+bd#WEuMz+mIizf=1zul?Z0w55`ERc@ydmtaJ?k&R6D zmFt$K!G?d|zY#v+mI(V9Z`boSI@89Hzft{TVod1jP6KzbX>nrqnOT?UzxFjbbO(fa zbd1mc=V*Uw|J{WzLVEqWb1ve?Z+YBWp0~;rwg2O7vA}DA?lhCfET63P&9A|KFHv+( z`iYU%Z|4Y3d|CY2{rpDbYsbJB&6E%uF6Q-osO!94-!(k_#}&D;mDj%hYe}MY+Vkc3 zGKnqM>o^hZP6wxVHd!QT)4-A=|LP8LX<~_@J+D;2UDlq{nV!=2w{tt4P@!*EJt?eC z?G8gJx=2L6j9g9}NifW-4aob8{J$Ma7P3A#LL%K+|7X;%{;)|aI^O1;*^grnaDX3cR<^ri$EUT?B$C$Zsm zytDV=oB=LT(8e=Bu0;OT`#ZTJxUGVWtmn1(QN`+C#?2JB*Vg3~v%laa(l%(8o54I@ z{T-g&b7A)w6Sclmr+Z%kN@0VaIqIWIDvV%xQDi!voX0O4j~oJ7P;@n_+d(L+Z~n~2 zJIB>ng@73a>~VGa%CU`7%guC=R+=VGS^7d@#U1ryQcb^;3u`V$^T^@(|2lV&t57gk zn2nj^3SHuS27_;3sB-mz%*G25Y+gw9Nc7r%(ztH#Z6U5$j)3uM4Tjk_nCY10&naEW z#*%l(wNxBu&67%x7=;9Ew{*iJoZ!PG@6~r!1vj1nX693C9nT_*;cbUprmRow1HrF? z+g;*nfwgQPt%$-A)EgHp?;DoU4LTKzhlvs+GW&O+iAJ%{Nfd`@$RUbhm^sV;N;<@7 z=fv8=nM5!^G;TszvsaC;VIvL@nJqq9RIeq*tD;I4W4li4&DGp?yKyCCZ4nrOCb&^V zslR*N-q6Q0czs`VaqsxaoXU`gCEgx`@Oj-Ha;&}wE}Rkb+-Bi-nq}DODGXurqbPhc zIrO&y%;?xjEsdb>^o7-LhmV{mEgx6TMbRw_6@=By)U}g4A}}U0?cUL_Veq|{73}?M z$lM;lV?keVyV;lDKigwXe4c&UfMZ=o!g46rNHJEQooow#R$$u24chbRysKr6@Q*Uf z$1{?48rPvaMohlrWP=hVz5DVXWcb}b6 z*mX|tVLqzUi17oaSC$gXeNB&fukTM5zq@D8=S$(8~->YDM3-`6FmU&6N zrM%Y5Kstrz3L8#du1n9}S+(oG8uAiG2iJ>ww3s~++W?FRFla*mn5{X#vJHCu>%DyO zJ^%lxB1h?l(i?*KVp?7O@a!8Z7H@-td$A{;X1*2RDEad5^AVYA1jgV=*0%Ms=(jqM z47uqkgp6826aq%!K+(VIZ_1Olb_aQmf6hEE>klG~Rc-|WEgrCtoq@Dp(F;b0LtW?w z;gVYVXT*6EnalO2!QE!0p+h}{Eua9S7a`A1iT2*?SY*Rp^fkyq}*moD5~ov>cVD zUEx(0KNJXtZenM)&PxLl5I5aCXWr1X3FXWBTkA)ULhRbkMw5TMcAl9=Ye1O2pU?W8 znu}iVVm^&_v>KTIsGQW*s>a)p-2Bx}<3S}nNXDN-bs4P^`YUumws;L zQl0qOQH8c3f+KEhoZTSal~vQJ)L6iRE4#07Y0bjb?eYHpDKoKgEB<;e4MVszz}8Z6%k}v`b!SJ$oC}MQY`ZDG*o>C_W6wJD zyp`M&MUZ-!HG^Av$cmk8=U+$U_o=IAwgXhXzun;n4`QMjo7+3$GgVf!sUKD7e;-okcJABiUgHnR`zle;nQ-(k z(rH?{ZH!?P0F<%6FSNRlI1ykE)NRWAA%7sf8D*$#N-SX(3q8f#j1v1!s?U~F#zkV! z!(dq1GGm133`w{dGCS-n*ms`VKXkno+Zx#@k&yb+HuX_ENQw5+tGiIJjA$%0UA^!C z!)HQ13n|0qJDX7&65&;*sj}iLKh31Xp!L2sMjCok@9Rw{czQrR8HDKz ztGWWCAGCml4!ybWf8#>oZaH#AXpjtERo2bj4KRJ19)MO|;DmR1&ee0_Wa58fY#1 z#a?wwZ1#3p!wxF>zV^_RWXVcr@}T zfIl10{Kpcu5YM0=WVWn)Te>vNscqS#x0v&>^_!o%kd?ak&HWGUb(es&P(5~>nj(eLf7^iRAU;IY$9d`Y5Fr z*p;Sx2E@cHt@^}gY~u$hAh-2Exevc={vOFoElp0Csz0fr+eFCb=TP-<%)=JX>`F5$ z6S<>?_g@p|(wVXpqmS2YM&Q7qfb|!cMLvvjW9KqQVe`i%D{i?i#VZDin}Q8Wz-aGa zLZRgaE*mSgHxD^r_G?gv+2TglM!G;PJy8C*e26v%Y_BkS7*YAx%6d5!W1fX?vHpB9 z)3!@&Rh9;~B_Rp_jJ#S$=I`F0iR*F@Ig%qSXpjooLhXFAYmIXcYosR{bQ`L!)~4r# z)*uc)YUee%A*c25{r{*qPVTl34h(<0QGQ$Rv`1H4m$U!0i`5}x_u*1Jl4qLJV@r}) zsG5+2I+A1%**4y-_-NmE*@zI`wjY0|fT_OTDFV`Zn9-bb3iU}r-Rsu0Gm>d8yj({} z(Rtv2Xk+fXAuhM7kNF8AxPL+|blR_?-^8N`2tkeiWsz2e2%ynXe$shcRaJ!qUGGAr zv={GWwG44MH<2XgDdB0font(=3U`s%qWog^&r$xqCOJ~>{p?|xO|}q%yv0#2J00Be zXwh197A;>TMxNXhr<5@%Cg7$$)Js=RS!z_G$7z5?>~L#9C!BabAYEm4ldv z=6Znz8+slP>>EZ(t>vde=(C(G42=Y4%Bndp&|zMzx1aW)ymzq?t_pi8k0y@l={G=1 zNO{D`8PV!_(+0YL}>LK_S9@Ce%#7EC1|-fgdcI;q}mq@xWloZ`>=ufrqE=uv26D ze_7ESk~6r-=EFl|cB?$IoNIp#FyA(Y$9KY{He0Y}#VEFO0MeQg#(|l%4b>lLGONaU z-BFVLJD0;8Y7d)Xt^DT};O8+UjE|-CBu6|_8j&yO>;P@CheKI;d45*6V_YcfhSCvo zPN!m<{z*>f+LlS-zjvh`?B_JUMlxA7IdW67F~3Iq)5bEQEUan)5d(cZ%RWWiC~bsjL9^q=Yh4eabWRMgDGsE?Yg<%FF7)$)a+%G-G9< z-_E1$L*5Hwa%%~(cJ~J2UDC9bZ#j!X!Cy_AJ7+w2@@_4|i_awQB_lXC-Ea@x{|@%2 znh0dFM5y_F`Fiz4uVX4A`PC9sII&}Hx)WQb>*;3Y)Bk(IG@|HKbH+zFbm`0J%PCfw zx$ed?)5@93S%b6^;W&Rvam0oU9+XkoCik4Ie@><(KjqK7VVTRw&e)w>XQdm)}0os`a9e zu9&Y@$>*)LMaxV$@@PG4@<$NMW&GxC++X(|75OV4-#3Skl3`<#V!#5@&DaMmvcXGO zDLd|g!hYAK2C+z4+L|`26?)OKGBJTtWYrNa_6>as;ra3_ojVK(VzY0@UgF;3fJ z_2mP1y7gFjTZJrTV~dsTh2F7ej&WY_`c$#vlWkss{cK42kkJJI$71hZnS~EOukj>2 z4tHEqL=9G)#3R|Y{%C#}D-bvLQb^6|j9RIdjd20^wEo1Yhz!)e3YbL)m}vL|?dGcQ zGPe%dj`^h*b|*K=aR&hBmkS;!?|}n!^RHK_hFXb1TZ8@rW)w*_;$(Bg?`g$+(XW19 z5nF4vja5D?@{T}}DoO36gSB)EF;}w=X}!e6I(lvY_~|(#0Tu^Jf7bg$$EsrR$;IT`~0*#2Q z9NRl4P8#Nd@E97zR&Ui5R@uUt1N4o*F)l6bl*Pt;1}o=dOw56$C@+)=`@F+(hSvgEuYvxiVZ(O~edj~YrKP@Y z8_u_m`PJb>DR-+QXY>QtC-uG$OL>93uB6sTGMBfs>Jf#xZH|PhSBe~SCsi!F-!z=r ztH(@FYf06;54J(UVEdrgkK}VEZhV$(aLNFRNfUqDM}o?MhrCA?Fw=ou1qd zmhk|PnJ_4ZyROS?E$hnm4R;XP_MAYv-4G!AL z^4E8HjoMq4e*ClB?ki0P$0)<*`53i>bWYr&Z94($+ai#Ay*_em(%GX_+W)V(;be6p z-(%AGctyj?Zv&UyWPBw-BZAq$@1Vlg;AY~4e7U_nG|s1t|9OM1!@Xl`Ke9n~@{HBQ zeo^VH|9HU5;nH!j62NJ^<8+1@Si>uD%PaKuPjfIZl~C zkdj6G+t)h_am2F~Krr8ymVC{N6U6S54ft}*o4M{^f@d^KRWt>o&eK04GTkdqLVk&F z#QCK|x2D#tRT;k~&?&=s=(xj!(GPwC|NeaWu%!@qV0`~XbQzz5NIq|pN3EL&|2{0U z8`v#!a_CS?-C6NP?WQUib_l_J#H=Q5b<5}5!+pjQd_8ceAAh!~F zU7=re|1ne-JX2>YpR`6-NbbyQ{4u-{nB1s^?*rF<=zavg!)%RSxoAQQ{n|0C0MoJm zd7hSc6M6n06*J!1v+)rii;|c=wK)28_{1r2I))NS8@6%bl)XtAz8a?Vl1nH1hWE4- zi7L%YRnqd=k}n+Rn+qRqNN7BU&h{n+)tL4HxC3$@3VDY)BrcmGbb9-?kmt&M)xnp` zR+yae8W-2qf~BG_E7td^0BCJihwN83srKCtd#~R&LG`r2%Zn!P}_fx z+9^2Y7MQ~VJtQHn6&Pa761fl}Ewy+0sYx}|&(uf>t*{DrvPI}9KiRjTgj+Np{r%sv z+a@Ke{tx>YG?1&^pJ%Cw=;oPA#evS8ql!wVn|_ecWDk#I1cKxtLq3f$!?t@+0BK16e2LT*o8DfA_6FO6AqDOIzTX--O#RWxrFT_UNJz4ETFGIK;}kEJ8a*z) z78yP5qR}b#G@;vRM1Ma|u%LOv%IE&^?EMA5`8p`{UCVdg#>46(|MYrx0*YF_?leDa zS(-RG-|d#{M)M=Z&(`gI^wbNx89zG!rk#vj=-f;Am*i~de~Zv8wp^d(?N^f-{^#KT zC_2l4rvAST+bAlCh_t9Q2uL^l3|c@28!$?x8QqPjAdST6kdCp@8;w$HpJLi1Q=W}1zUDPtM82);Q;CG|C*d|jT{Z;Ev{|rR|jn5X6Cb-&TC#`g6 z#S_UxlD6lPth?{OvDkNOg>i%x6Mpq_ z^Phg#jJZ&{VKzbA_kY*AD20&H)2lA&MsdHr;OtgKzcmZ9mZ?_*uXErHTRI(fr_$@HgW zeWvi$)%UVui%kuWplaWnlH)pAi7oMnqR5!2rb4&m{o~j7Xzhjf%y86+Em#)#8%Ax3RqQ+6eoOi19l1o$9Qug1 zwrEe59aS>72BBn}(=q<1zQuLQ%u8h|KnE`AsIdn$_IMp}v}PdvjiRQtdcGS%==^$5 zcf7}eKPup%ePEfAjm)OohiKsK+DUf)0os}SUK>EmNb@z96KyYH!~68w;sxX6tC4q3 zXF(1a0ulK3+8Y^OhD2+-7eEWB1EFs7Ty$7D+nQBBa+)c%7|+SKfp!=fS(RoKY$oEj zfI>O4*ogCvlF{D!)?3nn8N)N0TIn>ZM}u!|@yLp)0&rKJVI{af7l`RcstpXO`L7Gr z2L!3&l$)E`LiPA3+#2bkDHOFs0aMRrqg}h5j=yap@s&k?wypVxZf&@?+@?*&iEEVtuK;;gnl}V&d;D{t8K&>1f4O;g;5TXzNq4ziAO6sG)!9^CmW}1yGu0o}ltfDnjhSZ5RXN}I#I?g+l zob<4oJ=!@TUUq&?Y{BDz>b0m9t{g2jFV-kZeF{0Z>{Vpag+fLLAn?TG`fT?rA6B;$ zw?5d&`mRpaGLZx7S`8UYasqWE%v2hm=9^fvrZ+CN^7REMUZ0`>r`0d2z6%hv~vl5VMLzg+p2P{h!vDEP` zu7Y`4 z+j=SXz)38yWXIrOYrt-KZLw7_KU=*iu!hDmzo{n9ctT{X7;=|n=JRN74jN{;#2{RO z=B(FMYMA8p_Abv@3arlVmnuqRnx&xn&PV$CsU(y4miO@t@6GD}_R7O_#%^o9cRbw6 zASD|VV6KT)O6-r2XKsr47s*{_l^+r&aI1ulM7Il|sur-Jk+qHFN6yM>{93}@&=}8t zZZKj;|L#%$s!6M((bOO6|6L0hD{OAFE84#@`@LXU?Eu=!MNkJ?O-AVEc{|(X91TP{cb)M0DZD;oYTuRMe~&iyMC}dR&jsi=3~6O ztAmNrXPZ~>6c~^#Cp;m7Agy~2sA+rM$x|^s{qBKddxs3elS#-k(of>XNATtb6ttD& z0FFv2a?hmOa4Q#7+plGD8za9!IaUtr0G*CPB|9p2v6ot1F;0Qm?GZaF@3Rhh`k474 zl*7{MM{FAM%4!fzWZnSrzM3@2^`0bUR7l{oh|M8uGXNf;foLYoGWKR5GAYZ1UC&f40(L=8$`(-$@f=Tv$gDK<12)R zbjL8sjIJ@9(?H7AOgdPSS{t=W0#syv`##PVY$0{X>wPt+l&WTkxZeErRf9%CiE~3 zLK<}(tz!{-I%=8?7@wF?VymLvF#-!jlPWJh8DWIDwYWgdpDKkCBM(lx3cE}T^;fDz2-r_(mj{xF-<}5P8{!%qMd_3 zYbQ#Y(k?mIoq?7c*QoPr7Dg8DI3w_>X*KmJWt8eNwM zF07eMm^fZ5vNU_}*d+Ij!4{oR)LtQ9Se9F;!J3=+MZ0%Vv-XJP#JD925E_7sA~EmR zRE&}U%28#7nM^cT|4otH^&kfsCq^&2CN9ny_=R!)vDp~!?xlcMm{G^q*?(A*l*@fR z*zEnD+vyAeQC2B)`sI~EbD8v2E-6`f6!}WP?exF*=|7y3V%)l40Y16mk4hgj&a%K1 zN8{abrk9Uc#vC-OFQzK`Dh-BI-YDRguIj-r&WCh^A+oB(YD(vYbs=HnV_ztbKe2)< zFAjTQpTx8ARgZ#uYZp;sY|Bm+;LSyYhtta00mFYdzVqtakxOFkPOd5V8?x?-FE;yT znuSL6&dD5A76%%8Snt9*v}|eSk-E%OanK(yP5PC{^-t?a@-W}!ZzWEZf|6si%wW>> zw@;2LA6AbFx4a2yG<37fAWOPDFhAYtQdNna5?@n_IW-+vsdXn2#DNJjbtAN}7LB(ZMotVg5f?2VcsIlGPUsv3C_Np$(pBv55@jw1K z9p%GUGI{Rz9Z8yxqQ2~&Y`$9*Veed)T@0USPwTqFR9V>e)PCfYvx9L4x+2I+{vdio z{Ge*#iece@*RHq7mYkaOG+Tz+>L)b*)chy1Y)yiebmC1+o*J3-&z{q$C^)?xDq|;R;qXO%;)Ziw6=lR z1=}P@Is~11@gc8=+{N;#t7M3l?ye`xT-1PTyOfMlcq~Xon)Qj;#S}&39#)4;)ueJ^ zFD*H5@+aE@+-!&DWOqf5pB9O&xvykRGJBkt{25m8sgq!T|5Hk!|2 z$KDjy*U8||aP}ucoVS>; zjoJnO>_|^6kSHE*RN!1%A7Ti3Kz$g*X&8RS$aSOOcV$`|%jpd37ErXWu|{sP+*iIU z$82;KQt^ zIx``n+{rpLxxksQrRVTgT@UriYGJum=Kz+1@0nTiGJC5|*7tY{T6r*v*#Jsdr+L1$Eu)#Bq<-l*#+V0&ZyvTpKP5B}#%k68**(W1Gcxrp#!&TTh7yS+ z2exXbAqu5$CcYYQsX^>_W-GN zO;bZH&VluNa(oinx^ze%D;A=}WnfRPxHKgO9}+cpCvk14!S49XRvEmn4H(`&X<(j_ zTWVSb=y`_@>(rI4$Dvek=B}y-b^ahs&hNy1=GrW)$@>MHFdGx^8^k7UmMg)?0_t~s zL{zN3%>LlN4=DBk({0aa>lE=9E@_@8aEYc^Ln6SWeZWXcJIzOsrrtqto)8b!T{P97 zLt_Dm!g$$^TCp^Ar)6?$f`CP6IW0A zbljv&vm}s(HHK)Xi90z9Ku*8v9;+{vm6P}J6w23NVGKBkLxk&E$QfM+Y3rC&;J}NY6V!? zHVqiHg|{sC-*izJC$HIMi5;RPRF!tfeZL60+IIPm$r~HS2^hB3f>}dF0qu7n{Qbc0 zW=qMK#MdqJ7ZO*M!}kX~_#G`;ylcJUZyS3kVxwWtsx_ZQeOARVj9Xv@auuUAw=#oVRpkGi zgfac4OkIvymG>dcR3=D%R-a5YIDo$;v1abDL}60I4}!+Cu&j_UYgviP*G5QkUkQs_ zR4o_s-#4^$|GekXQ5jkCazq5B+2vU<;+q-RW>QmL zSIm0KmOmA!sT>Rnq2@MyIQtKz@mga0sO%+r5WSawU}|4Nd)}Hx}Oznt3eui!NnN8SI&{+Ya8`yXr=ZW|y4culO~y|Hy{Y`A`iwh*G*awBV! z9^#FLJlz5#Q=9ctq|PGNBnvJ1RC^14YYkJbciOoH`%ud$X^6l~!dSIVpotHR4v7WQ z&D@kYQy#+Eo`>okq%y&&l_D(rFm5x+)%4RtT5?z`a1?<>BOFR6rhlQ@KkR`6_9sRN z@y3ZkXb&qd$)ci7p;yY%MeZ=zt?vnSIrR?1;MajAyBCyQQd;;(g9$b0jg9p3 zuK6a*kXZuvNR_LyZ`jcC@t=GxDC}LLXX3v95-Gj72hvM#J}woOw6O)nRzdD`tZRsi z?0FOG@^tH8-#?*Dkmw9nSzFQc`6HDp={2;1CMo`*DUMYexW?EUA^d?TRuhGc4W}2k zuURaW#c0ir<#an2>T|g1ZH`K|P?w8`f>{idZBS?79Bcu=fFFq;DDR!B0(_s6@!ggB zpZ4(dx92R&l9_fmQ|Z|&uQ}f^B@ne}4VVc^fz#l`lk zJxfm1yb*f28O!jNB^B~j9nNXGpx zIvy^|IZLqTW@UxHkb39-hjvZNg?C7~S=)+R*Z;*|-48$y)67I=v2*Xd`y8D`s)_7N z#rh2fWCJzzxlezF*&S>?F>ZXgm#oz4z@r2S@rEXP^VO92_2-3a$7MbVP;wz3KKXqoUa2@caf)i@w?q2NsfTI~(at&{ z0>(RxgG@WB3m;5-rLvsLPhN|8GT+HMQ35-oos;naDQRpcCA}4ZhE>+2)$=(hr-}3Z z=CVr%8NzQDha^(bLr56~+ zDn-M^yaNV-#9mvYpEXomK4hpF9+zx%DXW}b>7il+Jz4g$xns5;v4D?H*R~pJ^P{YO z>qQC<5K?3bty^xY42D7@z;i`M@!Rk}$-$}>LTN^EqB+>oHdgz#PfE^p8=e}}VfPP2 z!1Hra^ky_VMD|n;X-*|5TLGqtx`2I)k`LChvvNt5RPns5fjP}icrf=dqkf5%XqGb4 zR1g9{K&YD3dU@2E1?SI#b421gc zYB0gFvEaphA2*bw;)EcI>iIvc@BBc=<>s1wp4OYZi`AKeBBOB$*?K{!IyTaBELK3I z&P*V*PjV;s#ue@VuGtF^D4RTk>ZN32V$9@6ydrzl1UXl@)I_*{Y>O>w zH0G-Rr4~EQd83sI&A|r0V$(c+`gEl1O8HYC5#n%e>`ldqy5#cn~Q+ zOIXzZQ7!6r#)>RbXoYcYdQ+z}!{^y^X_P6tuiOdxUree>yL(}xM#pc2)&frg?Be}I z{@j>$W9VPSHt1NO+i5QE*RY;=rzQr}8LP9B<&K^$vjvIWbv42+VdIJ&DRo>OX*+Ze zt%=_a`D+%igsfqiyVo|%_EqZo8Dv1&ww+yQzAM1PzeC;TmmvR%BIIQ9>R$ah>!~!l z?Rq_~SpA~n9&gOo2J@EhTbur%>H>i7jDc#~mKxDHZx>|oV~$<@YG`y$?)wR4(Y>-b za`e!AQxV^0gJ$@rcmCnx-spw?p0wUilGJvp^aJF^lRV_}1y9OPGXJ~wSEk~^b_tmt z*c@%5mjYUIJA8I^M9`har>9NSU^!SWWKXsKckM1Q$AxS;)1N*hi}7fGq+ll5J(w_% zT@c1hvhWWkDAyLn{~3OWE}1?Hu`@auc!}bo`&Ag=Ke;v^MG8ED7Fwix;L0WR*#x2?9&he%TL#TZ8_!w|&%E}4eV?C}>-U{;kegon_y7r8b4_%JDN zgp;%?5`4df|5Eq0!m(er%rjQggco4AV=zwVoEebAk1W+oZMFC9k+MnNqc15}(bz?};4B0?`58XLm*l4G=lgH+S?T8%7tsdivf@lzsT)TO>h@<_!!-p+#NB#V|4!shT>ZL$o7+j0WZl+h z$gN=8y|^6c=yZhni1T@8k;m>|30(PhyNJWcc;EtKB9;F_;wsE;`%XuElA=`HYqz^HzTJOh{tnsTj9 zr#>DA4`U@uGM;<;ITq|Oq`oRV``K@|nR@R5-iQpUP;D|s_y;z28|0dqKxgpKl*F+s z*`#0YG6{o(Pd(jFTQnj2viA<%bX z@{Q6V33;E+9>_>1<#S}IujN|Xo1l7KWx43nJ0(MJvI!K<8f0K1ohFqKdWJLaFY2y# zKi55=HEZ@o!>v#AM=k5{kITHbGA2?D7>@@_VGSpT<)|<64dJW$sBfZk^*}aHYiGZo zT|(4zTiT+%1>R#V)Msck2kk{8p}^FM>k_g>`*dAY+jb}rGu`di9;L+6=Ra89D8{z8 zp+7iI3>^jw=Iy5x@>Dn35p-|j>RR{__l-GSGDnE5mgxCg@1N>yN{c^}*)X?N{=qe3 zJF|td|68#MER&sk*@;W0K@4|AJmEcQ#>L3xoF>Drwbnp>qMD|IzG^-2gj?I(EC}`* zWmY4RgQRE~$ZRVa+yC@6SjdOhCK>kbcNJgtzY&X_df6)9&0-1=?5kJfWuP#nPl#qx zbM{=ki3ZfWYdTrw1dgA3?92Bge23$YM3fehi>~UDy?^?CBT!Ok8%7p_To^c2gS~*6hDj?2|Zw%Zd#UERKb?9aH(^ zYg$aEsrv8C`64WIn(Ra7;6fsLkIa4%)ZPGDJPhiji1JR4cmIA54JDa84CHxO7qp1+ z@K>DhX#f%$ju46Sy8FTA!H$O1od+=W(!Q!FyT`X?+FOPP?I&ZZr<=V9V=%LxS0}eu zuo^^bvx@mJ1B)8d(&FC2dN%P8M)=1@Yn4y%6NesHAl!aG#}$&41hQ$co^{ujwf*|525ZCcRzX7Rg-;rpeAnFYFjrT|Ep`FMlSk$b5azn8uWI) z$bQ=|XzG_;U4NLN!t#@e{ne~*4osiLlrcvPOjN_x-G;S^hSy2X1I-93&8WGj^Qq^p z<%A;iuZp`udVctW97Vp>rdoyv)UhknKJbQhro8_&3;|W!CAu9hd$1i`k#7 zFR(tZk7_f^a)5VIQ_O z|0(hC+0co^(Y9g*S|)=nr38Xt(X|rMuY#&Ax)mxY5$`a}NMUaxe8{DQnqL0;VkJO^P*ry(0Y;bg9Xh_$6tIgx}5KLG3y z20*JRi0YT2Cz;!uX^Kqjj z{Y?F9ThPQ!MM%+ZIPCeEm9q?I#`?IYft9~k(QtNrs!&|=+SlF{1dTi>I9_VQki+*7 z-e3uN)AXj3jimzsfTrgg%H}@W5D}v!)j~<;eoO59aO_FY_GFF2iRe4W9tG)Q2f5D4fBMhZ|NVisL=5kkwL#>9QT%gszQc?r(>lTJIUnn2HD znTox}CdvpTw(apK8aC*|*xZ1r)!8o#MeU3tCIK#E^( z>zjGEk?S&zsU|a0A&ESqyl2FUE^oEwIamVmA$qsSxI^H`;S={Z-s;SLbZE$L1HdJ} zJR4j$&31P$6!@DCbI^34M_RtGRhx5Z&*-zLCRqO`QN|6U9$iH~Dh(V|lAGvz84;^t z;z-wvX>8@!An<;m4zuB&4%z?*#@&7%=@$_tJpa0Mw#CZnN&r#A=&B6YX@7CnDgy)Y zf#g%|F6<*#4W0P7#tWk{N@-=dDR$VsiLbX#WCCZ>-;qXNP1L}As|1zmVIkO zCzTj4xWAN6V;YEk6;T~pH#*>xXF^xe=4if@{-n8`+LVt;Vu#nk`AH*qHr?!d?JN0= z?8oA28MHe9ir28;t?nxM+bf6c;rK;Z%HBnozlQ-ps_&>wX{!Hi%n>o#!acTC3K*^p zA48JfVxEnjEj2c4<%)4rs$X%nP1f~77e))z1L=RK#<=|9mD6kTA#5OpjW!Cx6$JTI zmpI(m=7fDg(QytmhD0Cc1KhzZ##!B657|m`dn!8lX4>Z@J@m$&5nj)~c0ST!Wqztc z7_XPn?Ehnme6_sF0Zx&*QM`Ck3(QZ{GFI9d7%wtDXtUTb4$w@kVX)q|+RLvF@S%eRmCm(P&Qi||f#qO{a`s>|Y^H}T$8@~1qz78pTh(1=3-2Cm z^9SK#3_x*x|8s~yo7RcaHCKgLN@BsE%eUVuz2ADm-SWtt*aU>v;B=%r!T=JjA zxl-_O$Zpcru;IVs^v8r(QfIE&mdhCzony{(g5B0b3+{qs+9}=Rgh>V2eDn3=9gky^ z0o$)(TnoSax<7+54bFy5L}KSkz6Ot6Q8kUXyy012;gAOHmv)3!@ zuJ|r!uq~GNXSE#2Yp?DdB1Hah)W#fx$9hLermHndB&NVG$5M)s`m3{KC7N~73&~R- zp3={+Q3=&XF^|=^EVwQx$LyZQrOfbzX;kB^N7m%ne4S4>-h#&0$j*Borf|PHJz%ou zinrz5yMQaSwjs$_-*h;g>~|W4oFXYvX>-j$&jNbFt8vcs>7w`crMmH&R;wo6X^*9;I zDZp@^6IpoSH6fy4cASe;AA)zqoMD2FD1xA^)BPESVWo~OWT3o-w@mIS^8_L!D{OLJm2l^60YkOhId zr(vbt&+xvFEs;v?d>fd+*d-2Do<_!jdLOrL+d!win~-4MoUK9I^LL3YINESWo3FtitxE4d6npDx8XSFT>L}K-{ee{p6v`#id_C4pbOtmED{o@1kNTKqc!R8R^{rT8< zE*8_#Lqb-79xqe>rOugwT2DKJm{-}#T8hH6qt2EX9wv@}D3TJFphmeIYPb3Vl9D(M z5ftHRgcuN^)7{{Fo1pH@idiq1oLB9v$Oi`WGU(@^kJzOz%=@^Va;N*3%!KgwtSHS9 za$VSE5YZ~N9X$wnoOXp1hbeH~OVo*nx!Db4$#aH?wXYpjkoBX#mvw zsYP>M#z>ZXK6h+f;6Be-_H^+=shHuL#SokE*ww~q9gtLu>8(GO9Fl%>)mGru>^I9r z{_pqS1vwF=**p;zdQnUO~y3 zO~)AW3m5o)d`Q*TS*A!JaDRduz^+4_@2(!~hxJmD&0#ZFTc`aOEfj_6?R<+TNv~!N z3w_1A^kxLMlZXt%3LHBkBS$r}e*q4I=LHMLZ3VjVm;_^^2OeXs`YP>^NX>Aw)`-ez zh1+{dPD*1^8ptvN4J`fKqi9B_F+Nqswbw6pP0K*ek`0GFCsw@-Xt zDm&zlD?VNLsX+1J4%lU^2k_0QcD~+-gDTE7p&nJ3d?W7|9(nZ#M{3bAZyW3}Mx={` zTL00Xsj4S@lKUb(Ge+s61$U=Mo}7Kt#tskVYh@{|IxMf+PiK!tvNerDZ#kj`C$It8 z&$Plo`pvw!3U+4e*88I-Wk+zk7Db_Cf!_09UU!As23wG{88`%v(DA!C@V0_ zW#;`29Bhiv?{K(PNtwMoyHZOq4Re58nfUf_`k&BlF4`@xFLT zXN|A{zNo~Ge)^|aHu|J)l^`yE>-9^bVs#d!eeUA9DV`fT80^^cdYPw=@kEqtNH|ge zF`P>k+%ub^7GpAK`l7|A#gT?-X3GekF0$cgclr^PaCDXdH$qNQqOpuw-?Kob86nd+ z*;}z_rX#r13(HukUcB+H#!;UBaY9Q3AH+W-tGU(PAH;xZ-gYdVEr=5=ofKBc{Lbdo z;w`gbG*+;7j*nl|lsIGfRfzClX^T9@TkaoiWl-S0h>(YAJ^KO(GGwN5!TV>W>;+8P zq&l3~je3AomRs{;vnHn*#3Gf{CJy=QOpr+fE}6Ij7BpKN1lz`Ws&)cUAIsaG{Kf}Hn|MVirF@K$=Ao_pYhKYIPqe_ z7$v+wwLsy;<41&6l2llo`E>qcy3^43nI%P8e2I^ux5SupCV($UY#@33S)%lA9JZuV zb!79gD!~8;>{V)q26#G+T=@+t@n~P8gV~Okmgel;J5y60%8&Y}!`$Rm((z=icn&+h z{RKM=jr|wBLek?kJvjW`HxLjHPWUo~_h`^_eJ_H)6Xq1lGLm1-DF4&Hk*yq2fbcEV zUpsHBxA_|gwfTIAF-ufYp?!Rf@Yzh!wijL$Uc++KYr!Jn&m10 z@#{@>J)c^Wc==fRDtV78BgT*-YT*Q!BH55~9QWs=?SbjAhVi4YEJ1NMb4Za9<<(XD zrAc0fSX2LLQ1ckU?@==NQv8gUa6UjGU?Me9vb!WL zsU!NnVtHsNT+Pe9+Jt?uJF@#zi_`5zm&G9n;P@t|*KiTQ+OF^nmt~dpVWmg>tOh1J z)4DO~ArT?<{~e2lP!_}4R{n8~8rtL1l0j^YO4Z(z6p#3{I7}7X6 z;FS5b_4M}hA%Q4i?0sG;xV`R+rWkR0G#4niG{FH z&vjl}ml(&tx_kArJWoiz3A#rLnH$hgGl_Xm%`e~(pX z=B3C`y9Q389$FJlFELiVuJ&O}5uK?dM=AHKX}X`7!1m5<2hbz_Q$M4Om)A+xk}9R$ zFN2~a>>q6CZE?8;;Irt$A!Ey4H<-J9@Ae>jhvYy5)SCc?UbcmvHr4()&5Hz$Lb`Sx zDkbP7PX+2DiO>ieY>`D&=>1?@xSlnsQMg$+Jc`5xF9o8lpEhN(6q?ZQT$E%i2O1-_ za-nUe?hucz3?z0Y9Ubg%cpv7_6tgy{1ZI3IHEr&2C%f(Tib925zKb zw#nQLymbzH^ubNalje$jN@A>w3m{H1zI3=ZUuNX*Zf(JS>SGf(RK4uFWlp!0Et*LB z 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 literal 0 HcmV?d00001 diff --git a/Example Code Files/chapter8/dog_data.xml b/Example Code Files/chapter8/dog_data.xml new file mode 100644 index 0000000..e99d19f --- /dev/null +++ b/Example Code Files/chapter8/dog_data.xml @@ -0,0 +1,15 @@ + + + +SallyBee +19 +Yellow +Akita + + +Pete +24 +Black +Basset Hound + + diff --git a/Example Code Files/chapter8/e23ajaxdemo.css b/Example Code Files/chapter8/e23ajaxdemo.css new file mode 100644 index 0000000..4b1681c --- /dev/null +++ b/Example Code Files/chapter8/e23ajaxdemo.css @@ -0,0 +1,30 @@ +body { background-color: #000000; +font-family: Arial, Verdana, sans-serif; } +#wrapper { margin: 0 auto; +width: 85%; +min-width: 800px; +background-color: #cc0000; +color: #000066; +float: top; +} +#header { background-color: #ff0000; +color: #00005D; +font-size: 125%; +text-align: center; +padding: 20px 20px 20px 20px; +background-repeat: no-repeat; } +h1 { margin-bottom: 10px; } +#content { background-color: #ffffff; +color: #000000; +padding: 10px 20px; +overflow: auto; } +#footer { font-size: 80%; +text-align: center; +padding: 5px; +background-color: #0000FF; +color: #ffffff; +clear: both;} +h2 { color: #000000; +font-family: Arial, sans-serif; } +#floatright { float: right; +margin: 10px; } \ No newline at end of file diff --git a/Example Code Files/chapter8/e54get_breeds.php b/Example Code Files/chapter8/e54get_breeds.php new file mode 100644 index 0000000..0d5e6c2 --- /dev/null +++ b/Example Code Files/chapter8/e54get_breeds.php @@ -0,0 +1,45 @@ +asXML(); + + $this->result = ""; + + return $this->result; + } + else + { + throw new Exception("Breed xml file missing or corrupt"); + // return FALSE; + } + + +} +} +?> diff --git a/Example Code Files/chapter8/e5breeds.xml b/Example Code Files/chapter8/e5breeds.xml new file mode 100644 index 0000000..f7ff17b --- /dev/null +++ b/Example Code Files/chapter8/e5breeds.xml @@ -0,0 +1,183 @@ + + +Affenpinscher +Afghan Hound +Airedale Terrier +Akita +Alaskan Malamute +American English Coonhound +American Eskimo Dog +American Foxhound +American Staffordshire Terrier +American Water Spaniel +Anatolian Shepherd Dog +Australian Cattle Dog +Australian Shepherd +Australian Terrier +Basenji +Basset Hound +Beagle +Bearded Collie +Beauceron +Bedlington Terrier +Belgian Malinois +Belgian Sheepdog +Belgian Tervuren +Bernese Mountain Dog +Bichon Frise +Black Russian Terrier +Black and Tan Coonhound +Bloodhound +Bluetick Coonhound +Border Collie +Border Terrier +Borzoi +Boston Terrier +Bouvier des Flandres +Boxer +Boykin Spaniel +Briard +Brittany +Brussels Griffon +Bull Terrier +Bulldog +Bullmastiff +Cairn Terrier +Canaan Dog +Cane Corso +Cardigan Welsh Corgi +Cavalier King Charles Spaniel +Cesky Terrier +Chesapeake Bay Retriever +Chihuahua +Chinese Crested +Chinese Shar-Pei +Chinook +Chow Chow +Clumber Spaniel +Cocker Spaniel +Collie +Coton de Tulear +Curly-Coated Retriever +Dachshund +Dalmatian +Dandie Dinmont Terrier +Doberman Pinscher +Dogue de Bordeaux +English Cocker Spaniel +English Foxhound +English Setter +English Springer Spaniel +English Toy Spaniel +Entlebucher Mountain Dog +Field Spaniel +Finnish Lapphund +Finnish Spitz +Flat-Coated Retriever +French Bulldog +German Pinscher +German Shepherd Dog +German Shorthaired Pointer +German Wirehaired Pointer +Giant Schnauzer +Glen of Imaal Terrier +Golden Retriever +Gordon Setter +Great Dane +Great Pyrenees +Greater Swiss Mountain Dog +Greyhound +Harrier +Havanese +Ibizan Hound +Icelandic Sheepdog +Irish Red and White Setter +Irish Setter +Irish Terrier +Irish Water Spaniel +Irish Wolfhound +Italian Greyhound +Japanese Chin +Keeshond +Kerry Blue Terrier +Komondor +Kuvasz +Labrador Retriever +Lakeland Terrier +Leonberger +Lhasa Apso +Lowchen +Maltese +Manchester Terrier +Mastiff +Miniature Bull Terrier +Miniature Pinscher +Miniature Schnauzer +Neapolitan Mastiff +Newfoundland +Norfolk Terrier +Norwegian Buhund +Norwegian Elkhound +Norwegian Lundehund +Norwich Terrier +Nova Scotia Duck Tolling Retriever +Old English Sheepdog +Otterhound +Papillon +Parson Russell Terrier +Pekingese +Pembroke Welsh Corgi +Petit Basset Griffon Vendeen +Pharaoh Hound +Plott +Pointer +Polish Lowland Sheepdog +Pomeranian +Poodle +Portuguese Podengo Pequeno +Portuguese Water Dog +Pug +Puli +Pyrenean Shepherd +Rat Terrier +Redbone Coonhound +Rhodesian Ridgeback +Rottweiler +Russell Terrier +Saluki +Samoyed +Schipperke +Scottish Deerhound +Scottish Terrier +Sealyham Terrier +Shetland Sheepdog +Shiba Inu +Shih Tzu +Siberian Husky +Silky Terrier +Skye Terrier +Smooth Fox Terrier +Soft Coated Wheaten Terrier +Spinone Italiano +St. Bernard +Staffordshire Bull Terrier +Standard Schnauzer +Sussex Spaniel +Swedish Vallhund +Tibetan Mastiff +Tibetan Spaniel +Tibetan Terrier +Toy Fox Terrier +Treeing Walker Coonhound +Vizsla +Weimaraner +Welsh Springer Spaniel +Welsh Terrier +West Highland White Terrier +Whippet +Wire Fox Terrier +Wirehaired Pointing Griffon +Wirehaired Vizsla +Xoloitzcuintli +Yorkshire Terrier + \ No newline at end of file diff --git a/Example Code Files/chapter8/e5validator.js b/Example Code Files/chapter8/e5validator.js new file mode 100644 index 0000000..597b9a9 --- /dev/null +++ b/Example Code Files/chapter8/e5validator.js @@ -0,0 +1,102 @@ +function allalphabetic(the_string) +{ + + var letters = /^[a-zA-Z ]+$/; + + if (the_string.match(letters)) + { + + return true; + + } + else + { + + return false; + } +} + +function validate_dog_name(the_string) +{ + + if ((the_string.length > 0) && (allalphabetic(the_string)) && (the_string.length <= 20)) + { + + + return true; + } + else + { + + return false; + } +} + +function validate_dog_breed(the_string) +{ + + if (the_string == "Select a dog breed") + { + + return false; + } + else + { + + return true; + } +} + +function validate_dog_weight(the_string) +{ + if ((the_string > 0 && the_string <=120) && (!isNaN(the_string))) + { + + return true; + } + else + { + + return false; + } +} + +function validate_input(form) +{ + var error_message = ""; + + + if (!validate_dog_name(form.dog_name.value)) + { + + error_message += "Invalid dog name. "; + + } + + + if (!validate_dog_breed(form.dog_breed.value)) + { + + error_message += "Invalid dog breed. "; + } + + + if (!validate_dog_weight(form.dog_weight.value)) + { + + error_message += "Invalid dog weight. "; + } + + if (error_message.length > 0) + { + + alert(error_message); + return false; + + } + else + { + return true; + } + +} diff --git a/Example Code Files/chapter8/e65dog_container.php b/Example Code Files/chapter8/e65dog_container.php new file mode 100644 index 0000000..53cf47f --- /dev/null +++ b/Example Code Files/chapter8/e65dog_container.php @@ -0,0 +1,82 @@ +app = $value; +} +else +{ +exit; +} +} + +public function set_app($value) +{ +$this->app = $value; +} + +public function get_dog_application($search_value) +{ + +$xmlDoc = new DOMDocument(); + +if ( file_exists("e7dog_applications.xml") ) + +{ +$xmlDoc->load( 'e7dog_applications.xml' ); + +$searchNode = $xmlDoc->getElementsByTagName( "type" ); + +foreach( $searchNode as $searchNode ) +{ + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == $search_value) + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + return $xmlLocation->item(0)->nodeValue; + break; + + } + +} +} + throw new Exception("Dog applications xml file missing or corrupt"); + // return FALSE; +} +function create_object($properties_array) +{ + + $dog_loc = $this->get_dog_application($this->app); + if(($dog_loc == FALSE) || (!file_exists($dog_loc))) + { + + throw new Exception("File $dog_loc missing or corrupt."); + // return FALSE; + } + else + { + + require_once($dog_loc); + $class_array = get_declared_classes(); + $last_position = count($class_array) - 1; + $class_name = $class_array[$last_position]; + $dog_object = new $class_name($properties_array); + + return $dog_object; + } + +} + +} + +?> \ No newline at end of file diff --git a/Example Code Files/chapter8/e65dog_data.php b/Example Code Files/chapter8/e65dog_data.php new file mode 100644 index 0000000..712eb69 --- /dev/null +++ b/Example Code Files/chapter8/e65dog_data.php @@ -0,0 +1,177 @@ +load( 'e7dog_applications.xml' ); + $searchNode = $xmlDoc->getElementsByTagName( "type" ); + + foreach( $searchNode as $searchNode ) + { + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == "datastorage") + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + $this->dog_data_xml = $xmlLocation->item(0)->nodeValue; + + break; + } + + } + } + else + { + throw new Exception("Dog applications xml file missing or corrupt"); + } + $xmlfile = file_get_contents($this->dog_data_xml); + $xmlstring = simplexml_load_string($xmlfile); + + if ($xmlstring === false) { + $errorString = "Failed loading XML: "; + foreach(libxml_get_errors() as $error) { + $errorString .= $error->message . " " ; } + throw new Exception($errorString); } + $json = json_encode($xmlstring); + $this->dogs_array = json_decode($json,TRUE); + +} + +function __destruct() +{ + + $xmlstring = ''; + $xmlstring .= "\n\n"; + foreach ($this->dogs_array as $dogs=>$dogs_value) { + foreach ($dogs_value as $dog => $dog_value) + { + $xmlstring .="<$dogs>\n"; + foreach ($dog_value as $column => $column_value) + { + $xmlstring .= "<$column>" . $dog_value[$column] . "\n"; + } + $xmlstring .= "\n"; + } + } + $xmlstring .= "\n"; + +$new_valid_data_file = preg_replace('/[0-9]+/', '', $this->dog_data_xml); +// remove the previous date and time if it exists +$oldxmldata = date('mdYhis') . $new_valid_data_file; +if (!rename($this->dog_data_xml, $oldxmldata)) + { + throw new Exception("Backup file $oldxmldata could not be created."); + } +file_put_contents($new_valid_data_file,$xmlstring); + +} + + +private function deleteRecord($recordNumber) +{ + foreach ($this->dogs_array as $dogs=>&$dogs_value) { + for($J=$recordNumber; $J < count($dogs_value) -1; $J++) { + + foreach ($dogs_value[$J] as $column => $column_value) + { + + $dogs_value[$J][$column] = $dogs_value[$J + 1][$column]; + } + +} + unset ($dogs_value[count($dogs_value) -1]); + } + + $change_string = date('mdYhis') . " | Delete | " . $recordNumber . "\n"; + $chge_log_file = date('mdYhis') . $this->change_log_file; + error_log($change_string,3,$chge_log_file); // might exceed 120 chars + } + +private function readRecords($recordNumber) + { + + if($recordNumber === "ALL") { + return $this->dogs_array["dog"]; + + } + else + { + return $this->dogs_array["dog"][$recordNumber]; + } +} + +private function insertRecords($records_array) +{ + $dogs_array_size = count($this->dogs_array["dog"]); + + for($I=0;$I< count($records_array);$I++) + { + $this->dogs_array["dog"][$dogs_array_size + $I] = $records_array[$I]; + + } + + $change_string = date('mdYhis') . " | Insert | " . serialize($records_array) . "\n"; + $chge_log_file = date('mdYhis') . $this->change_log_file; + error_log($change_string,3,$chge_log_file); // might exceed 120 chars + +} + +private function updateRecords($records_array) +{ + +$chge_string = ""; + foreach ($records_array as $records=>$records_value) + { + + + $this->dogs_array["dog"][$records] = $records_array[$records]; + + } + + $change_string = date('mdYhis') . " | Update | " . serialize($records_array) . "\n"; + $chge_log_file = date('mdYhis') . $this->change_log_file; + error_log($change_string,3,$chge_log_file); // might exceed 120 chars + + +} +function setChangeLogFile($value) +{ + + $this->dog_data_xml = $value; + +} +function processRecords($change_Type, $records_array) +{ + +switch($change_Type) +{ + + case "Delete": + + $this->deleteRecord($records_array); + break; + case "Insert": + $this->insertRecords($records_array); + break; + case "Update": + $this->updateRecords($records_array); + break; + case "Display": + return $this->readRecords($records_array); + break; + default: + throw new Exception("Invalid XML file change type: $change_Type"); +} + +} +} + +?> \ No newline at end of file diff --git a/Example Code Files/chapter8/e73registration.php b/Example Code Files/chapter8/e73registration.php new file mode 100644 index 0000000..f342de3 --- /dev/null +++ b/Example Code Files/chapter8/e73registration.php @@ -0,0 +1,104 @@ += 8))) +{ + throw new Exception("Invalid Userid and/or Password Format"); +} +else +{ + + $hashed_password = password_hash($password, PASSWORD_DEFAULT); + + + + + libxml_use_internal_errors(true); + $xmlDoc = new DOMDocument(); + if ( file_exists("e7dog_applications.xml") ) + { + $xmlDoc->load( 'e7dog_applications.xml' ); + $searchNode = $xmlDoc->getElementsByTagName( "type" ); + + foreach( $searchNode as $searchNode ) + { + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == "UIDPASS") + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + $dog_data_xml = $xmlLocation->item(0)->nodeValue; + + break; + } + + } + } + else + { + throw new Exception("Dog applications xml file missing or corrupt"); + } +$newupstring = "\n" . $userid . "\n" . $hashed_password . "\n"; +$newupstring .= "" . date('Y-m-d', strtotime('+30 days')) . "\n"; +$newupstring .= "0\n" . date('mdYhis') . "\n"; +$newupstring .= "" . date('mdYhis') . "\n\n"; + + $input = file_get_contents($dog_data_xml); + + $find = ""; + $find_q = preg_quote($find,'/'); + $output = preg_replace("/^$find_q(\n|\$)/m","",$input); + + $output = $output . $newupstring; + + file_put_contents($dog_data_xml,$output); + + $login_string = date('mdYhis') . " | New Userid | " . $userid . "\n"; + error_log($login_string,3,$user_log_file); + header("Location: e8login.php"); + + } + } + } + + catch(Exception $e) + { + + echo $e->getMessage(); + } + +?> + +ABC Canine Shelter Reservation System + + + + +

+ +
+
+Userid must contain eight or more characters.
+Password must contain at least one number, one uppercase and lowercase letter, and at least 8 total characters.
+Username:
+Password:
+ +
+
+ +
+ + diff --git a/Example Code Files/chapter8/e74login.php b/Example Code Files/chapter8/e74login.php new file mode 100644 index 0000000..3fbf215 --- /dev/null +++ b/Example Code Files/chapter8/e74login.php @@ -0,0 +1,185 @@ +'; + $xmlstring .= "\n\n"; + + + foreach($valid_useridpasswords as $users) + { + foreach($users as $user) + { + + $xmlstring .="\n" . $user['userid'] . "\n"; + $xmlstring .="" . $user['password'] . "\n"; + $xmlstring .="" . $user['datestamp'] . "\n"; + $xmlstring .= "" . $user['attempts'] . "\n"; + $xmlstring .= "" . $user['lastattempt'] . "\n"; + $xmlstring .= "" . $user['validattempt'] . "\n\n"; + + } + } + $xmlstring .= "\n"; + +$new_valid_data_file = preg_replace('/[0-9]+/', '', $dog_data_xml); +// remove the previous date and time if it exists +$oldxmldata = date('mdYhis') . $new_valid_data_file; +if (!rename($dog_data_xml, $oldxmldata)) + { + throw new Exception("Backup file $oldxmldata could not be created."); + } +file_put_contents($new_valid_data_file,$xmlstring); + +} + +function retrieve_useridpasswordfile() +{ + +$xmlDoc = new DOMDocument(); + if ( file_exists("e7dog_applications.xml") ) + { + $xmlDoc->load( 'e7dog_applications.xml' ); + $searchNode = $xmlDoc->getElementsByTagName( "type" ); + + foreach( $searchNode as $searchNode ) + { + $valueID = $searchNode->getAttribute('ID'); + + if($valueID == "UIDPASS") + { + + $xmlLocation = $searchNode->getElementsByTagName( "location" ); + $dog_data_xml = $xmlLocation->item(0)->nodeValue; + + break; + } + + } + } + else + { + throw new Exception("Dog applications xml file missing or corrupt"); + } + + return $dog_data_xml; + +} + +try { +if ((isset($_POST['username'])) && (isset($_POST['password']))) +{ + + libxml_use_internal_errors(true); + + $dog_data_xml = retrieve_useridpasswordfile(); + $xmlfile = file_get_contents($dog_data_xml); + $xmlstring = simplexml_load_string($xmlfile); + + if ($xmlstring === false) { + $errorString = "Failed loading XML: "; + foreach(libxml_get_errors() as $error) { + $errorString .= $error->message . " " ; } + throw new Exception($errorString); } + $json = json_encode($xmlstring); + + $valid_useridpasswords = json_decode($json,TRUE); + + $userid = $_POST['username']; + $password = $_POST['password']; + + $I = 0; + $passed = FALSE; + foreach($valid_useridpasswords as $users) + { + + foreach($users as $user) + { + + if (in_array($userid, $user)) + { + $hash = $user['password']; + $currenttime = strtotime(date('Y-m-d')); + $stamptime = strtotime($user['datestamp']); + + if ($currenttime > $stamptime) + { + + // password expired force password change + + header("Location: e75changepassword.php"); + } + + if (($user['attempts'] < 3) || ( date('mdYhis', strtotime('-5 minutes')) >= $user['lastattempt'])) + { + + if(password_verify($password,$hash)) + { + $passed = TRUE; + $valid_useridpasswords['user'][$I]['validattempt'] = date('mdYhis'); // shows last time successful login + $valid_useridpasswords['user'][$I]['attempts'] = 0; // successful login resets to zero + $_SESSION['username'] = $userid; + $_SESSION['password'] = $password; + saveupfile($dog_data_xml,$valid_useridpasswords); // save changes before header call + $login_string = date('mdYhis') . " | Login | " . $userid . "\n"; + error_log($login_string,3,$user_log_file); + header("Location: e8lab.php"); + } + else + { + $valid_useridpasswords['user'][$I]['lastattempt'] = date('mdYhis'); // last attempted login + } + } + } + + $I++; + + } +} + // drops to here if not valid password/userid or too many attempts + if (!$passed) + { + $I--; + echo "Invalid Userid/Password"; + $valid_useridpasswords['user'][$I]['attempts'] = $user['attempts'] + 1; // add 1 to attempts + // if not successful must save the values + saveupfile($dog_data_xml,$valid_useridpasswords); + } + } + } + + catch(Exception $e) + { + + echo $e->getMessage(); + } + +?> + +ABC Canine Shelter Reservation System + + + + +
+ +
+
+Userid must contain eight or more characters.
+Password must contain at least one number, one uppercase and lowercase letter, and at least 8 total characters.
+Username:
+Password:
+ +
+
+ +
+ + diff --git a/Example Code Files/chapter8/e75changepassword.php b/Example Code Files/chapter8/e75changepassword.php new file mode 100644 index 0000000..db444df --- /dev/null +++ b/Example Code Files/chapter8/e75changepassword.php @@ -0,0 +1,38 @@ + +ABC Canine Shelter Reservation System + + + + +
+ +
+
+Userid must contain eight or more characters.
+Password must contain at least one number, one uppercase and lowercase letter, and at least 8 total characters.
+Username:
+Old Password:
+New Password:
+Confirm Password: + + +
+
+ +
+ + diff --git a/Example Code Files/chapter8/e7dog_applications.xml b/Example Code Files/chapter8/e7dog_applications.xml new file mode 100644 index 0000000..8406a41 --- /dev/null +++ b/Example Code Files/chapter8/e7dog_applications.xml @@ -0,0 +1,33 @@ + + + + +e8dog.php + + + + +e54get_breeds.php + + + + +e5breeds.xml + + + + +dog_data.xml + + + + +e65dog_data.php + + + + +uidpass.xml + + + \ No newline at end of file diff --git a/Example Code Files/chapter8/e81getlists.js b/Example Code Files/chapter8/e81getlists.js new file mode 100644 index 0000000..04c6fd4 --- /dev/null +++ b/Example Code Files/chapter8/e81getlists.js @@ -0,0 +1,51 @@ +function getXMLHttp() +{ + var xmlHttp; + try + { + xmlHttp = new XMLHttpRequest(); + } + catch(e) + { + //Internet Explorer is different than the others + try + { + xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); + } + catch(e) + { + try + { + xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + catch(e) + { + alert("Old browser? Upgrade today so you can use AJAX!") + return false; + } + } + } + return xmlHttp; +} +function AjaxRequest(value) +{ + var xmlHttp = getXMLHttp(); + xmlHttp.onreadystatechange = function() + { + if(xmlHttp.readyState == 4) + { + HandleResponse(xmlHttp.responseText); + } + } + xmlHttp.open("GET", value, true); + xmlHttp.send(null); +} +function HandleResponse(response) +{ + + var responsevalues = response.split('|'); + document.getElementById('AjaxResponse').innerHTML = responsevalues[0]; + document.getElementById('AjaxReturnValue').innerHTML = responsevalues[1]; + obj = JSON.parse(responsevalues[2]); + +} diff --git a/Example Code Files/chapter8/e82lab.php b/Example Code Files/chapter8/e82lab.php new file mode 100644 index 0000000..7068f25 --- /dev/null +++ b/Example Code Files/chapter8/e82lab.php @@ -0,0 +1,154 @@ +"; +echo "
Login | Create an account"; +echo "

"; + +} +else if(($_SERVER['HTTP_REFERER'] == 'http://127.0.0.1:8080/mysite/bgchapter8/login.php') || ($_SERVER['HTTP_REFERER'] == 'http://127.0.0.1:8080/mysite/bgchapter8/lab.php')) +{ + +if (isset($_SESSION['message'])) +{ +echo $_SESSION['message']; +} +else +{ +echo "

Welcome back, " . $_SESSION['username'] . "

"; +} + +?> + + + +ABC Canine Shelter Reservation System + + + + + + + +

ABC Canine Shelter Reservation System

+
+ + +

Pick the dog name and breed to change from the dropdown box, then click the button.
For new dog information select 'NEW'.

+ +Select 'NEW' or Dog's Name/Breed
+

+
+
+

Please note the required format of information.

+ +
+Enter Your Dog's Name (max 20 characters, alphabetic)

+Select Your Dog's Color:
+Brown
+Black
+Yellow
+White
+Mixed

+ +Enter Your Dog's Weight (numeric only)

+ + +Select Your Dog's Breed

+ + + + +
+
+
+
+ + + + diff --git a/Example Code Files/chapter8/e83dog_interface.php b/Example Code Files/chapter8/e83dog_interface.php new file mode 100644 index 0000000..1beb6b3 --- /dev/null +++ b/Example Code Files/chapter8/e83dog_interface.php @@ -0,0 +1,189 @@ +", "/", "$" ); + $value = str_ireplace($bad_chars,"",$value); + return $value; + +} + +class setException extends Exception { + public function errorMessage() { + + list($name_error, $breed_error, $color_error, $weight_error) = explode(',', $this->getMessage()); + + $name_error == 'TRUE' ? $eMessage = '' : $eMessage = 'Name update not successful
'; + $breed_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Breed update not successful
'; + $color_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Color update not successful
'; + $weight_error == 'TRUE' ? $eMessage .= '' : $eMessage .= 'Weight update not successful
'; + + return $eMessage; + } + } + +function get_dog_app_properties($lab) +{ + +print "Your dog's name is " . $lab->get_dog_name() . "
"; +print "Your dog weights " . $lab->get_dog_weight() . " lbs.
"; +print "Your dog's breed is " . $lab->get_dog_breed() . "
"; +print "Your dog's color is " . $lab->get_dog_color() . "
"; + +} +//----------------Main Section------------------------------------- +try { + if ( file_exists("e65dog_container.php")) + { + Require_once("e65dog_container.php"); + } + else + { + throw new Exception("Dog container file missing or corrupt"); + } + + if (isset($_POST['dog_app'])) + { + + if ((isset($_POST['dog_name'])) && (isset($_POST['dog_breed'])) && (isset($_POST['dog_color'])) && (isset($_POST['dog_weight']))) + { + + $container = new dog_container(clean_input($_POST['dog_app'])); + $dog_name = clean_input(filter_input(INPUT_POST, "dog_name")); + $dog_breed = clean_input($_POST['dog_breed']); + $dog_color = clean_input($_POST['dog_color']); + $dog_weight = clean_input($_POST['dog_weight']); + $dog_index = clean_input($_POST['index']); + $breedxml = $container->get_dog_application("breeds"); + if ((isset($_POST['insert'])) || (isset($_POST['update']))) + { + + if (isset($_POST['insert'])) + { + + $insert = TRUE; + } + else + { + + $insert = FALSE; + } + $properties_array = array($dog_name,$dog_breed,$dog_color,$dog_weight,$breedxml,$insert,$dog_index); + $lab = $container->create_object($properties_array); + $_SESSION['message'] = "Dog $dog_name Insert/Update was successful
"; + + header("Location: e8lab.php"); + //print "Dog $dog_name Insert/Update was successful
"; + //get_dog_app_properties($lab); + } + else if($_POST['delete']) + { + + $properties_array = $dog_index; + $lab = $container->create_object($properties_array); + $_SESSION['message'] = "Dog $dog_name Deletion was successful
"; + + header("Location: e8lab.php"); + // print "Dog $dog_name Deletion was successful
"; + } + } + + else + { + + print "

Missing or invalid parameters. Please go back to the dog.php page to enter valid information.
"; + + print "Dog Creation Page"; + + } + } + else // select box + { + + $container = new dog_container("selectbox"); + + $properties_array = array("selectbox"); + + $lab = $container->create_object($properties_array); + $container->set_app("breeds"); + $dog_app = $container->get_dog_application("breeds"); + $method_array = get_class_methods($lab); + $last_position = count($method_array) - 1; + $method_name = $method_array[$last_position]; + $result = $lab->$method_name($dog_app); + + $container = NULL; + // read dog_data array + + $container = new dog_container("dog"); + $properties = "dog"; + $lab = $container->create_object($properties); + $container->set_app("dog"); + $dog_app = $container->get_dog_application("dog"); + $method_array = get_class_methods($lab); + $last_position = count($method_array) - 1; + $method_name = $method_array[$last_position]; + + $returned_array = $lab->$method_name("ALL"); + + $resultstring = ""; + + print $result . "|" . $resultstring . "|" . '{ "dogs" : ' . json_encode($returned_array) . "}"; + + } + } + catch(setException $e) + { + echo $e->errorMessage(); // displays to the user + + $date = date('m.d.Y h:i:s'); + $errormessage = $e->errorMessage(); + $eMessage = $date . " | User Error | " . $errormessage . "\n"; + error_log($eMessage,3,USER_ERROR_LOG); // writes message to user error log file + + } + catch(Exception $e) + { + + echo "The system is currently unavailable. Please try again later."; // displays message to the user + + $date = date('m.d.Y h:i:s'); + $eMessage = $date . " | System Error | " . $e->getMessage() . " | " . $e->getFile() . " | ". $e->getLine() . "\n"; + error_log($eMessage,3,ERROR_LOG); // writes message to error log file + + // error_log("Date/Time: $date - Serious System Problems with Dog Application. Check error log for details", 1, "noone@helpme.com", "Subject: Dog Application Error \nFrom: System Log " . "\r\n"); + // e-mails personnel to alert them of a system problem + + } +?> diff --git a/Example Code Files/chapter8/e84dog.php b/Example Code Files/chapter8/e84dog.php new file mode 100644 index 0000000..8f9e7fd --- /dev/null +++ b/Example Code Files/chapter8/e84dog.php @@ -0,0 +1,175 @@ +breedxml = $properties_array[4]; + +$name_error = $this->set_dog_name($properties_array[0]) == TRUE ? 'TRUE,' : 'FALSE,'; +$color_error = $this->set_dog_color($properties_array[2]) == TRUE ? 'TRUE,' : 'FALSE,'; +$weight_error= $this->set_dog_weight($properties_array[3]) == TRUE ? 'TRUE' : 'FALSE'; +$breed_error = $this->set_dog_breed($properties_array[1]) == TRUE ? 'TRUE,' : 'FALSE,'; +$this->error_message = $name_error . $breed_error . $color_error . $weight_error; + + +if(stristr($this->error_message, 'FALSE')) +{ + throw new setException($this->error_message); +} +if((is_bool($properties_array[5])) && ($properties_array[6] > -1)) +{ // confirms true or false and valid index or takes default + $this->insert = $properties_array[5]; + $this->index = $properties_array[6]; +} +$this->change_dog_data("Insert/Update"); +} +if(is_numeric($properties_array)) +{ // confirms valid index don't delete if not valid + $this->index = $properties_array; + $this->change_dog_data("Delete"); +} + + +} +else +{ +exit; +} +} +function clean_input() { } + +function set_dog_name($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 20) ? $this->dog_name = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_weight($value) +{ +$error_message = TRUE; +(ctype_digit($value) && ($value > 0 && $value <= 120)) ? $this->dog_weight = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_breed($value) +{ +$error_message = TRUE; +($this->validator_breed($value) === TRUE) ? $this->dog_breed = $value : $this->error_message = FALSE; +return $this->error_message; +} +function set_dog_color($value) +{ +$error_message = TRUE; +(ctype_alpha($value) && strlen($value) <= 15) ? $this->dog_color = $value : $this->error_message = FALSE; +return $this->error_message; +} +// ----------------------------------------- Get Methods ------------------------------------------------------------ +function get_dog_name() +{ +return $this->dog_name; +} +function get_dog_weight() +{ +return $this->dog_weight; +} +function get_dog_breed() +{ +return $this->dog_breed; +} +function get_dog_color() +{ +return $this->dog_color; +} +function get_properties() +{ +return "$this->dog_name,$this->dog_weight,$this->dog_breed,$this->dog_color."; +} +// ----------------------------------General Methods--------------------------------------------- + +private function validator_breed($value) +{ + +$breed_file = simplexml_load_file($this->breedxml); +$xmlText = $breed_file->asXML(); + +if(stristr($xmlText, $value) === FALSE) +{ +return FALSE; +} +else +{ +return TRUE; +} +} + +private function change_dog_data($type) +{ +if ( file_exists("e65dog_container.php")) { + require_once("e65dog_container.php"); // use chapter 5 container w exception handling + } else { + throw new Exception("Dog container file missing or corrupt"); + } + + $container = new dog_container("dogdata"); // sets the tag name to look for in XML file + $properties_array = array("dogdata"); // not used but must be passed into create_object + $dog_data = $container->create_object($properties_array); // creates dog_data object + $method_array = get_class_methods($dog_data); + $last_position = count($method_array) - 1; + $method_name = $method_array[$last_position]; + + if (($this->index > -1) && ($type == "Delete")) + { + $record_Array = $this->index; + $dog_data->$method_name("Delete",$record_Array); + } + else if (($this->index == -1) && ($type == "Insert/Update")) + { + $record_Array = array(array('dog_name'=>"$this->dog_name", 'dog_weight'=>"$this->dog_weight", 'dog_color'=>"$this->dog_color", 'dog_breed'=>"$this->dog_breed")); + $dog_data->$method_name("Insert",$record_Array); + + } + else if ($type == "Insert/Update") + { + $record_Array = array($this->index => array('dog_name'=>"$this->dog_name", 'dog_weight'=>"$this->dog_weight", 'dog_color'=>"$this->dog_color", 'dog_breed'=>"$this->dog_breed")); + $dog_data->$method_name("Update",$record_Array); + + } + + + $dog_data = NULL; + +} + +function display_dog_data($record) +{ +if ( file_exists("e65dog_container.php")) { + require_once("e65dog_container.php"); // use chapter 5 container w exception handling + } else { + throw new Exception("Dog container file missing or corrupt"); + } + + $container = new dog_container("dogdata"); // sets the tag name to look for in XML file + $properties_array = array("dogdata"); // not used but must be passed into create_object + $dog_data = $container->create_object($properties_array); // creates dog_data object + $method_array = get_class_methods($dog_data); + $last_position = count($method_array) - 1; + $method_name = $method_array[$last_position]; + $record_Array = $record; + + return $dog_data->$method_name("Display",$record_Array); + +} +} +?> \ No newline at end of file diff --git a/Example Code Files/chapter8/e85lab.php b/Example Code Files/chapter8/e85lab.php new file mode 100644 index 0000000..4761a2c --- /dev/null +++ b/Example Code Files/chapter8/e85lab.php @@ -0,0 +1,171 @@ +ABC Canine Shelter Reservation System"; +echo ""; +echo "

"; +echo "
"; +echo "You must login to access the ABC Canine Shelter Reservation System"; +echo "

"; +echo "Login | Create an account"; +echo "

"; +echo "
"; +echo ""; +} +else if(($_SERVER['HTTP_REFERER'] == 'http://127.0.0.1:8080/mysite/bgchapter8/ExampleFile7.4/e74login.php') || ($_SERVER['HTTP_REFERER'] == 'http://127.0.0.1:8080/mysite/bgchapter8/ExampleFile7.4/e8lab.php')) +{ +?> + + + +ABC Canine Shelter Reservation System + + + + + + + +
+ +
+" . $_SESSION['message'] . "

"; +} +else +{ +echo "

Welcome back, " . $_SESSION['username'] . "

"; +} +?> +
+ + +

Pick the dog name and breed to change from the dropdown box, then click the button.
For new dog information select 'NEW'.

+ +Select 'NEW' or Dog's Name/Breed
+

+
+
+

Please note the required format of information.

+ +
+Enter Your Dog's Name (max 20 characters, alphabetic)

+Select Your Dog's Color:
+Brown
+Black
+Yellow
+White
+Mixed

+ +Enter Your Dog's Weight (numeric only)

+ + +Select Your Dog's Breed

+ + + + +
+
+
+
+ +
+ +
+ + + \ No newline at end of file diff --git a/Example Code Files/chapter8/e86readerrorlog.php b/Example Code Files/chapter8/e86readerrorlog.php new file mode 100644 index 0000000..62a8b9f --- /dev/null +++ b/Example Code Files/chapter8/e86readerrorlog.php @@ -0,0 +1,95 @@ +ABC Canine Shelter Reservation System"; +echo ""; + +echo ""; + +echo ""; +echo "
"; +echo ""; +echo ""; +echo ""; + +for ($J=$row_Count; $J >= 0; $J--) +{ + echo ""; + + for($I=0; $I < 3; $I++) + { + echo " "; + } + echo ""; +} +echo "
Log File: " . ERROR_LOG . "
Date/TimeError TypeError Message
Delete " . $error_Array[$J][$I] . "
"; +echo "
"; +echo ""; +} +const ERROR_LOG = "Errors.log"; + +if ((!isset($_SESSION['username'])) || (!isset($_SESSION['password']))) { +echo "ABC Canine Shelter Reservation System"; +echo ""; +echo "
"; +echo "
"; +echo "You must login to access the ABC Canine Shelter Reservation System"; +echo "

"; +echo "Login | Create an account"; +echo "

"; +echo "
"; +echo ""; +} +else +{ + +$logFile = fopen(ERROR_LOG, "r"); +$row_Count = 0; +while(!feof($logFile)) +{ +$error_Array[$row_Count] = explode(' | ', fgets($logFile)); + $row_Count++; +} +$row_Count--; +fclose($logFile); + +if(isset($_GET['rn'])) +{ + +deleteRecord($_GET['rn'], $row_Count, $error_Array); +saveChanges($row_Count,$error_Array,ERROR_LOG); +} + +displayRecords($row_Count,$error_Array); +} +?> \ No newline at end of file diff --git a/Example Code Files/chapter8/e8ajaxcall.js b/Example Code Files/chapter8/e8ajaxcall.js new file mode 100644 index 0000000..7e7d2d5 --- /dev/null +++ b/Example Code Files/chapter8/e8ajaxcall.js @@ -0,0 +1,46 @@ +function getXMLHttp() +{ + var xmlHttp; + try + { + xmlHttp = new XMLHttpRequest(); + } + catch(e) + { + //Internet Explorer is different than the others + try + { + xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); + } + catch(e) + { + try + { + xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + catch(e) + { + alert("Old browser? Upgrade today so you can use AJAX!") + return false; + } + } + } + return xmlHttp; +} +function AjaxRequest(value) +{ + var xmlHttp = getXMLHttp(); + xmlHttp.onreadystatechange = function() + { + if(xmlHttp.readyState == 4) + { + HandleResponse(xmlHttp.responseText); + } + } + xmlHttp.open("GET", value, true); + xmlHttp.send(null); +} +function HandleResponse(response) +{ + document.getElementById('AjaxResponse').innerHTML = response; +} diff --git a/Example Code Files/chapter8/uidpass.xml b/Example Code Files/chapter8/uidpass.xml new file mode 100644 index 0000000..e271f40 --- /dev/null +++ b/Example Code Files/chapter8/uidpass.xml @@ -0,0 +1,19 @@ + + + +Poppoppop +$2y$10$8xzP2XCGyEVKSuTOB7enjua5lZybhkkqXj6kOSFaEKyE3A22Am90q +2015-09-05 +18 +08062015042256 +08062015042443 + + +Fredfred +$2y$10$.MC43rkbLfSCEJzH8OJDw.5EboVYvTmy068eE9iEI0myvxAnQGs5i +2015-10-15 +0 +09172015080436 +09172015080454 + + diff --git a/Example Code Files/chapter8/user.log b/Example Code Files/chapter8/user.log new file mode 100644 index 0000000..b4cc6ce --- /dev/null +++ b/Example Code Files/chapter8/user.log @@ -0,0 +1,315 @@ +08212015062205 | Login | Fredfred +08212015070307 | Login | Fredfred +08212015071741 | Login | Fredfred +08212015073701 | Login | Fredfred +08212015075047 | Login | Fredfred +08212015081724 | Login | Fredfred +08212015081843 | Login | Fredfred +08212015082113 | Login | Fredfred +08212015082617 | Login | Fredfred +08212015082727 | Login | Fredfred +08212015082918 | Login | Fredfred +08212015084535 | Login | Fredfred +08212015084608 | Login | Fredfred +08212015085639 | Login | Fredfred +08212015092521 | Login | Fredfred +08212015093646 | Login | Fredfred +08212015093821 | Login | Fredfred +08212015093844 | Login | Fredfred +08212015094311 | Login | Fredfred +08212015095125 | Login | Fredfred +08212015101850 | Login | Fredfred +08212015101914 | Login | Fredfred +08212015102225 | Login | Fredfred +08212015102400 | Login | Fredfred +08212015102542 | Login | Fredfred +08212015102939 | Login | Fredfred +08212015103208 | Login | Fredfred +08212015103326 | Login | Fredfred +08212015103505 | Login | Fredfred +08212015103637 | Login | Fredfred +08212015103725 | Login | Fredfred +08212015103818 | Login | Fredfred +08212015104044 | Login | Fredfred +08212015104133 | Login | Fredfred +08212015104258 | Login | Fredfred +08212015104443 | Login | Fredfred +08212015104524 | Login | Fredfred +08212015104952 | Login | Fredfred +08212015105015 | Login | Fredfred +08212015105343 | Login | Fredfred +08212015105444 | Login | Fredfred +08212015105609 | Login | Fredfred +08212015105751 | Login | Fredfred +08212015105926 | Login | Fredfred +08212015110003 | Login | Fredfred +08212015110245 | Login | Fredfred +08212015110617 | Login | Fredfred +08212015110722 | Login | Fredfred +08212015110844 | Login | Fredfred +08212015110947 | Login | Fredfred +08212015111134 | Login | Fredfred +08212015111411 | Login | Fredfred +08212015111529 | Login | Fredfred +08212015111615 | Login | Fredfred +08212015111745 | Login | Fredfred +08212015112138 | Login | Fredfred +08212015112316 | Login | Fredfred +08212015112724 | Login | Fredfred +08212015113417 | Login | Fredfred +08212015113837 | Login | Fredfred +08212015114109 | Login | Fredfred +08212015114340 | Login | Fredfred +08212015114429 | Login | Fredfred +08212015114607 | Login | Fredfred +08212015115145 | Login | Fredfred +08212015115618 | Login | Fredfred +08212015115819 | Login | Fredfred +08212015115924 | Login | Fredfred +08222015120701 | Login | Fredfred +08222015121011 | Login | Fredfred +08222015121118 | Login | Fredfred +08222015121327 | Login | Fredfred +08222015121417 | Login | Fredfred +08222015121537 | Login | Fredfred +08222015121809 | Login | Fredfred +08222015122043 | Login | Fredfred +08222015122122 | Login | Fredfred +08222015122305 | Login | Fredfred +08222015122409 | Login | Fredfred +08222015122445 | Login | Fredfred +08222015122545 | Login | Fredfred +08222015122700 | Login | Fredfred +08222015122847 | Login | Fredfred +08222015122916 | Login | Fredfred +08222015082526 | Login | Fredfred +08222015082706 | Login | Fredfred +08222015082920 | Login | Fredfred +08222015084634 | Login | Fredfred +08222015085205 | Login | Fredfred +08222015085641 | Login | Fredfred +08222015085743 | Login | Fredfred +08222015085911 | Login | Fredfred +08222015090234 | Login | Fredfred +08222015091207 | Login | Fredfred +08222015093500 | Login | Fredfred +08222015093647 | Login | Fredfred +08222015093805 | Login | Fredfred +08222015093851 | Login | Fredfred +08222015094029 | Login | Fredfred +08222015094116 | Login | Fredfred +08222015094304 | Login | Fredfred +08222015094400 | Login | Fredfred +08222015094521 | Login | Fredfred +08222015094720 | Login | Fredfred +08222015094933 | Login | Fredfred +08222015095050 | Login | Fredfred +08222015095202 | Login | Fredfred +08222015095445 | Login | Fredfred +08222015095629 | Login | Fredfred +08222015100058 | Login | Fredfred +08222015101324 | Login | Fredfred +08222015101445 | Login | Fredfred +08222015101758 | Login | Fredfred +08222015102300 | Login | Fredfred +08222015102502 | Login | Fredfred +08222015102837 | Login | Fredfred +08222015102938 | Login | Fredfred +08222015103058 | Login | Fredfred +08222015103232 | Login | Fredfred +08222015103346 | Login | Fredfred +08222015103459 | Login | Fredfred +08222015103533 | Login | Fredfred +08222015103658 | Login | Fredfred +08222015103821 | Login | Fredfred +08222015103953 | Login | Fredfred +08222015104101 | Login | Fredfred +08222015104123 | Login | Fredfred +08222015104208 | Login | Fredfred +08222015104248 | Login | Fredfred +08222015104329 | Login | Fredfred +08222015104824 | Login | Fredfred +08222015104950 | Login | Fredfred +08222015105507 | Login | Fredfred +08222015105558 | Login | Fredfred +08222015105659 | Login | Fredfred +08222015110239 | Login | Fredfred +08222015110430 | Login | Fredfred +08222015110609 | Login | Fredfred +08222015110841 | Login | Fredfred +08222015111052 | Login | Fredfred +08222015111736 | Login | Fredfred +08222015112144 | Login | Fredfred +08222015112231 | Login | Fredfred +08232015044017 | Login | Fredfred +08232015044127 | Login | Fredfred +08232015044812 | Login | Fredfred +08232015045434 | Login | Fredfred +08232015045922 | Login | Fredfred +08232015050151 | Login | Fredfred +08232015050337 | Login | Fredfred +08232015050514 | Login | Fredfred +08232015050627 | Login | Fredfred +08232015051523 | Login | Fredfred +08232015051636 | Login | Fredfred +08232015051805 | Login | Fredfred +08232015051856 | Login | Fredfred +08232015051919 | Login | Fredfred +08232015052030 | Login | Fredfred +08232015052412 | Login | Fredfred +08232015052605 | Login | Fredfred +08232015053424 | Login | Fredfred +08232015053900 | Login | Fredfred +08232015054119 | Login | Fredfred +08232015054346 | Login | Fredfred +08232015054512 | Login | Fredfred +08232015054617 | Login | Fredfred +08232015054840 | Login | Fredfred +08232015054950 | Login | Fredfred +08232015055111 | Login | Fredfred +08232015055308 | Login | Fredfred +08232015055506 | Login | Fredfred +08232015055647 | Login | Fredfred +08232015055829 | Login | Fredfred +08232015060717 | Login | Fredfred +08232015060902 | Login | Fredfred +08232015062504 | Login | Fredfred +08232015063056 | Login | Fredfred +08232015063254 | Login | Fredfred +08232015063503 | Login | Fredfred +08232015064223 | Login | Fredfred +08232015064412 | Login | Fredfred +08232015084531 | Login | Fredfred +08232015085046 | Login | Fredfred +08232015085515 | Login | Fredfred +08232015085733 | Login | Fredfred +08232015085938 | Login | Fredfred +08232015090340 | Login | Fredfred +08232015091640 | Login | Fredfred +08232015092652 | Login | Fredfred +08232015092801 | Login | Fredfred +08232015092950 | Login | Fredfred +08232015093539 | Login | Fredfred +08232015093837 | Login | Fredfred +08232015094202 | Login | Fredfred +08232015094815 | Login | Fredfred +08232015100216 | Login | Fredfred +08232015100408 | Login | Fredfred +08232015100504 | Login | Fredfred +08232015100610 | Login | Fredfred +08232015101310 | Login | Fredfred +08232015101517 | Login | Fredfred +08232015102154 | Login | Fredfred +08232015102343 | Login | Fredfred +08232015102624 | Login | Fredfred +08232015102701 | Login | Fredfred +08232015102936 | Login | Fredfred +08232015103140 | Login | Fredfred +08232015103212 | Login | Fredfred +08232015103840 | Login | Fredfred +08232015104338 | Login | Fredfred +08232015104912 | Login | Fredfred +08232015112035 | Login | Fredfred +08242015122337 | Login | Fredfred +08242015122637 | Login | Fredfred +08252015045249 | Login | Fredfred +08262015013743 | Login | Fredfred +08262015014016 | Login | Fredfred +08262015014455 | Login | Fredfred +08262015014943 | Login | Fredfred +08262015015119 | Login | Fredfred +08262015015237 | Login | Fredfred +08262015020615 | Login | Fredfred +08262015020856 | Login | Fredfred +08262015021045 | Login | Fredfred +08262015021100 | Login | Fredfred +08262015021603 | Login | Fredfred +08262015021937 | Login | Fredfred +08262015022123 | Login | Fredfred +08262015022408 | Login | Fredfred +08262015022808 | Login | Fredfred +08262015023346 | Login | Fredfred +08262015023519 | Login | Fredfred +08262015032353 | Login | Fredfred +08262015032603 | Login | Fredfred +08262015032815 | Login | Fredfred +08262015033227 | Login | Fredfred +08262015033601 | Login | Fredfred +08262015034250 | Login | Fredfred +08262015034538 | Login | Fredfred +08262015042020 | Login | Fredfred +08262015042401 | Login | Fredfred +08262015043607 | Login | Fredfred +08262015043921 | Login | Fredfred +08272015114549 | Login | Fredfred +08272015115020 | Login | Fredfred +08272015115631 | Login | Fredfred +08272015120055 | Login | Fredfred +08272015120341 | Login | Fredfred +08272015121026 | Login | Fredfred +08272015121536 | Login | Fredfred +08272015011234 | Login | Fredfred +08272015014902 | Login | Fredfred +08272015015405 | Login | Fredfred +08272015015526 | Login | Fredfred +08272015020032 | Login | Fredfred +08272015020114 | Login | Fredfred +08272015020735 | Login | Fredfred +08272015021456 | Login | Fredfred +08272015021626 | Login | Fredfred +08272015024340 | Login | Fredfred +08272015025327 | Login | Fredfred +08272015030049 | Login | Fredfred +08272015035321 | Login | Fredfred +08272015035621 | Login | Fredfred +08272015035732 | Login | Fredfred +08272015041055 | Login | Fredfred +08272015041908 | Login | Fredfred +08272015043654 | Login | Fredfred +08272015043931 | Login | Fredfred +08272015044320 | Login | Fredfred +08272015044729 | Login | Fredfred +08272015045022 | Login | Fredfred +08272015045259 | Login | Fredfred +08272015045331 | Login | Fredfred +08272015052217 | Login | Fredfred +08272015052317 | Login | Fredfred +08272015053443 | Login | Fredfred +08272015053725 | Login | Fredfred +08272015054108 | Login | Fredfred +08272015054219 | Login | Fredfred +08272015075952 | Login | Fredfred +08272015080242 | Login | Fredfred +08272015080502 | Login | Fredfred +08272015080828 | Login | Fredfred +08272015081044 | Login | Fredfred +08312015121638 | Login | Fredfred +08312015121808 | Login | Fredfred +09032015121248 | Login | Fredfred +09032015121825 | Login | Fredfred +09032015122246 | Login | Fredfred +09032015122510 | Login | Fredfred +09032015124556 | Login | Fredfred +09032015124818 | Login | Fredfred +09152015120046 | Login | Fredfred +09152015122323 | Login | Fredfred +09152015013117 | Login | Fredfred +09152015021827 | Login | Fredfred +09152015022055 | Login | Fredfred +09152015024020 | Login | Fredfred +09152015024847 | New Userid | Fredfred +09152015024940 | New Userid | Fredfred +09152015025200 | Login | Fredfred +09152015025200 | Login | Fredfred +09152015030310 | Login | Fredfred +09152015030311 | Login | Fredfred +09152015075646 | Login | Fredfred +09152015075646 | Login | Fredfred +09152015080459 | Login | Fredfred +09162015050215 | Login | Fredfred +09162015051103 | Login | Fredfred +09162015051751 | Login | Fredfred +09162015052047 | Login | Fredfred +09172015040313 | Login | Fredfred +09172015052047 | Login | Fredfred +09172015080454 | Login | Fredfred diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..f79fa94 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,27 @@ +Freeware License, some rights reserved + +Copyright (c) 2016 Steve Prettyman + +Permission is hereby granted, free of charge, to anyone obtaining a copy +of this software and associated documentation files (the "Software"), +to work with the Software within the limits of freeware distribution and fair use. +This includes the rights to use, copy, and modify the Software for personal use. +Users are also allowed and encouraged to submit corrections and modifications +to the Software for the benefit of other users. + +It is not allowed to reuse, modify, or redistribute the Software for +commercial use in any way, or for a user’s educational materials such as books +or blog articles without prior permission from the copyright holder. + +The above copyright notice and this permission notice need to be included +in all copies or substantial portions of the software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS OR APRESS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..73ecbb0 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +#Apress Source Code + +This repository accompanies [*Learn PHP 7*](http://www.apress.com/9781484217290) by Steve Prettyman (Apress, 2016). + +![Cover image](9781484217290.jpg) + +Download the files as a zip using the green button, or clone the repository to your machine using Git. + +##Releases + +Release v1.0 corresponds to the code in the published book, without corrections or updates. + +##Contributions + +See the file Contributing.md for more information on how you can contribute to this repository. diff --git a/contributing.md b/contributing.md new file mode 100644 index 0000000..f6005ad --- /dev/null +++ b/contributing.md @@ -0,0 +1,14 @@ +# Contributing to Apress Source Code + +Copyright for Apress source code belongs to the author(s). However, under fair use you are encouraged to fork and contribute minor corrections and updates for the benefit of the author(s) and other readers. + +## How to Contribute + +1. Make sure you have a GitHub account. +2. Fork the repository for the relevant book. +3. Create a new branch on which to make your change, e.g. +`git checkout -b my_code_contribution` +4. Commit your change. Include a commit message describing the correction. Please note that if your commit message is not clear, the correction will not be accepted. +5. Submit a pull request. + +Thank you for your contribution! \ No newline at end of file