From 159f04271cdd740e477ede2b20f624d0dc4e3004 Mon Sep 17 00:00:00 2001 From: pbg2h21ama Date: Tue, 31 Jan 2023 21:24:48 +0100 Subject: [PATCH] Registrierung abgeschlossen --- .../java/com/example/vpr_javafx/Data.java | 93 ++++++++++++++++-- .../example/vpr_javafx/HelloController.java | 21 ++-- .../classes/com/example/vpr_javafx/Data.class | Bin 11198 -> 12791 bytes .../example/vpr_javafx/HelloController.class | Bin 11217 -> 11951 bytes .../example/vpr_javafx/Registration-view.fxml | 36 ++++--- 5 files changed, 118 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/example/vpr_javafx/Data.java b/src/main/java/com/example/vpr_javafx/Data.java index 1fd7dd3..d7be404 100644 --- a/src/main/java/com/example/vpr_javafx/Data.java +++ b/src/main/java/com/example/vpr_javafx/Data.java @@ -3,7 +3,9 @@ package com.example.vpr_javafx; import javafx.scene.control.Alert; import javafx.scene.control.PasswordField; import javafx.scene.control.TextField; +import org.w3c.dom.Text; +import java.awt.*; import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -285,8 +287,11 @@ public class Data { /** * The method validates the user input * - * @return boolean inputValid - * @author Kevin Maier, Kevin Pfannenstiel + * @param tfPhone Phone number the user typed in + * @param pfPassword Password the user typed in + * @param controller Controller + * @return phoneNumberValid && passwordValid + * @author Kevin Maier, Kevin Pfannenstiel */ public boolean validateData(TextField tfPhone, PasswordField pfPassword, HelloController controller) { @@ -295,6 +300,8 @@ public class Data { boolean phoneNumberValid = false; boolean passwordValid = false; + Alert alert = new Alert(Alert.AlertType.WARNING); + HashMap users = readLoginData(); String phoneNumber = tfPhone.getText(); @@ -305,10 +312,8 @@ public class Data { if (password.isEmpty() || phoneNumber.isEmpty()) { - Alert alert = new Alert(Alert.AlertType.WARNING); - alert.setContentText("Login fehlgeschlagen. Es wurde nichts eingegeben."); + alert.setContentText("Login fehlgeschlagen. Anmeldedaten unvollständig."); alert.show(); - return false; } Matcher phoneNumberMatcher = phoneNumberPattern.matcher(phoneNumber); @@ -319,22 +324,18 @@ public class Data { if (!users.containsKey(phoneNumber) || !phoneNumberMatchFound || phoneNumber.length() >= 15) { - Alert alert = new Alert(Alert.AlertType.WARNING); alert.setContentText("Login fehlgeschlagen. Die eingegebenen Daten sind falsch."); alert.show(); - return false; } else { phoneNumberValid = true; } - if (!users.get(phoneNumber).equals(password) || !passwordMatchFound || password.length() <8) + if (!users.get(phoneNumber).equals(password) || !passwordMatchFound) { - Alert alert = new Alert(Alert.AlertType.WARNING); alert.setContentText("Login fehlgeschlagen. Die eingegebenen Daten sind falsch."); alert.show(); - return false; } else { @@ -345,6 +346,78 @@ public class Data { return phoneNumberValid && passwordValid; } + /** + * + * @param tfPhone + * @param pfPassword + * @param controller + * @author Kevin Maier + */ + public boolean validateRegistration(TextField tfName, TextField tfPhone, PasswordField pfPassword, TextField tfStreet, TextField tfHouseNumber, TextField tfPostalCode, TextField tfCity, TextField tfChild, HelloController controller) + { + boolean phoneNumberMatchFound; + boolean passwordMatchFound; + boolean postalCodeFound; + boolean phoneNumberValid = false; + boolean passwordValid = false; + boolean postalCodeValid = false; + + Alert alert = new Alert(Alert.AlertType.WARNING); + + HashMap users = readLoginData(); + + String phoneNumber = tfPhone.getText(); + String password = pfPassword.getText(); + String postalCode = tfPostalCode.getText(); + + Pattern phoneNumberPattern = Pattern.compile("[0-9]*"); + Pattern passwordPattern = Pattern.compile("^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$"); + Pattern postalCodePattern = Pattern.compile("[0-9]{5}"); + + if (tfName.getText().isEmpty() || tfPhone.getText().isEmpty() || pfPassword.getText().isEmpty() || tfStreet.getText().isEmpty() || tfHouseNumber.getText().isEmpty() || tfPostalCode.getText().isEmpty() || tfCity.getText().isEmpty() || tfChild.getText().isEmpty()) + { + alert.setContentText("Registrierung fehlgeschlagen. Registrierungsdaten unvollständig."); + alert.show(); + } + + Matcher phoneNumberMatcher = phoneNumberPattern.matcher(phoneNumber); + Matcher passwordMatcher = passwordPattern.matcher(password); + Matcher postalCodeMatcher = postalCodePattern.matcher(postalCode); + + phoneNumberMatchFound = phoneNumberMatcher.find(); + passwordMatchFound = passwordMatcher.find(); + postalCodeFound = postalCodeMatcher.find(); + + if (users.containsKey(phoneNumber) || !phoneNumberMatchFound || phoneNumber.length() >= 15) + { + alert.setContentText("Registrierung fehlgeschlagen. Die eingegebenen Telefonnummer ist bereits vergeben oder ist nicht korrekt."); + alert.show(); + } + else + { + phoneNumberValid = true; + } + if (!passwordMatchFound) + { + alert.setContentText("Registrierung fehlgeschlagen. Das Passwort muss mindestens 8 Zeichen lang sein und mindestens 1 Ziffer und 1 Zeichen beinhalten."); + alert.show(); + } + else + { + passwordValid = true; + } + if (!postalCodeFound) + { + alert.setContentText("Registrierung fehlgeschlagen. Die Postleitzahl ist nicht richtig."); + } + else + { + postalCodeValid = true; + } + + return phoneNumberValid && passwordValid && postalCodeValid; + } + /** * The method changes the orders.txt file by removing canceled orders diff --git a/src/main/java/com/example/vpr_javafx/HelloController.java b/src/main/java/com/example/vpr_javafx/HelloController.java index f4e89cc..361a657 100644 --- a/src/main/java/com/example/vpr_javafx/HelloController.java +++ b/src/main/java/com/example/vpr_javafx/HelloController.java @@ -304,7 +304,7 @@ public class HelloController { } /** - * OnRegistrationButton() lässt einen neuen Nutzer anlegen + * OnRegistrationButton() creates a new user * @param event * @throws IOException * @author Kevin Maier @@ -313,17 +313,18 @@ public class HelloController { protected void OnRegistrationButton(ActionEvent event) throws IOException { Alert alert = new Alert(Alert.AlertType.WARNING); - Data validData = new Data("user.txt"); + Data validRegistration = new Data("user.txt"); - if (tfName.getText().isEmpty() || tfPhone.getText().isEmpty() || tfChild.getText().isEmpty()) + if (validRegistration.validateRegistration(tfName, tfPhone, pfPassword, tfStreet, tfHouseNumber, tfPostalCode, tfCity, tfChild, this)) { - alert.setContentText("Registrierungsdaten unvollständig"); - } - else if (validData.validateData(tfPhone, pfPassword, this)) - { - try (FileWriter writer = new FileWriter("user.txt")){ - writer.write(tfName.getText() + ";" + tfStreet.getText() + " " + tfHouseNumber.getText() + "," + tfPostalCode + " " + tfCity.getText() + ";" + tfPhone.getText() + ";" + tfChild.getText() + ";" + pfPassword.getText()); - writer.flush(); + try (FileWriter writer = new FileWriter("user.txt", true)){ + writer.write(tfName.getText() + ";" + tfStreet.getText() + " " + tfHouseNumber.getText() + "," + tfPostalCode.getText() + " " + tfCity.getText() + ";" + tfPhone.getText() + ";" + tfChild.getText() + ";" + pfPassword.getText() + System.lineSeparator()); + + Parent root = FXMLLoader.load(getClass().getResource("MenuOverview-view.fxml")); + Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); + Scene scene = new Scene(root); + stage.setScene(scene); + stage.show(); } catch (IOException e) { diff --git a/target/classes/com/example/vpr_javafx/Data.class b/target/classes/com/example/vpr_javafx/Data.class index 3666df4e8701beeceb00de2c40a24db55facc7ef..0fcf1aae126f1beba6529c83f8ba55e2816a74c1 100644 GIT binary patch delta 5218 zcmai23wTu3wf@)1WZsj>J2~Msk(5UWiAg2M@F;{>g+fF?5Ebi?oFoIu49rY;SsazB z7i_h9su<9!)RxxzM#Cc(rTB~focLmNX&Yd`Ad9@es;e8iA@Z-Pmq5Y}1$PRdB%kS+=JmaUj@kc?! zym&`67HYRTyE?37YiC!a!;000X2rU#t~RSJlColIG0eg+N zqHqA8`0*Dw1&(BAd>xnCeXny`q+b^m6eNHVk_l1#3PCsLvAo@6rA9gVeFNhT{9IzM!| zm8MB9(G_8^NsIaIiM0(KQy;oK+TPCfm7X_NX8Z~c?TmEM4BaUDw`o)HE{G>nT?}kv zq_a!MsiX0S5-KQemRm~ftNg?B%eYG|H18D?wJxc!xB4r_4i}VPygC()#}-6lR_z8W z+0>It#bb-D^(nWE6c}?OZVB0k{Z*6C5%`-J;-Lp=mYe93DnZ%G$lA#Iy5zcOtfOx3 z8B<;vEo1yLR>s+50?Q{?3w-ee^POy{O|4IPalh2~WugLepeq`)7Fnw!iAXA*D1;$( zempAY3Yy2+3(7{?#{%QS4SxBu!dY%>S3GGIB1a~vL5+fvadXDcQ%=;WT-Plk#9|#& z)$-^2Wr~FDsd-H@ZTGc#@f?}G`{RQ5MK;+-iw@fRi$Au%TRg_zRdQ=Z@!CjNRH1Hg z*CQ$;B6Z{D4KmGZ&n_+{6%SQlDVn&+0oPnfr~Tgc}kvkNuSE+9{Z89=VhOrD343O{a*P5 z&rb;f5w|>Rmzu3|$lhpHJ6=!~Xp=e8e$gE6^MbpAJ0LRM{E@P>GrIOb!j!bfqI|@LDZrQ=VCN9=kXK9B+SHQ z%%SdL-d%!eScvIZf*E>+g{+w8p+uTwHdhWKD9yB#%Q+sofRYm?8WEST(z_s<p$l^<&BHj%M?GDij0JT263ph3bFhe-#kiE8ZiccNOLZ`-nVxz~)4}9& zMx!j&Axy`)aw#PjXIIM-N^aVylBJY9v@}vKqvTD~T)B?g$7L^&WmG!oOkyzqx#*V5 zb^HNXa)n$;$Freko~ckX&z7rDIky1D=O}hzlnY@Onoi;h$;5sYWB+<4cEIshdKB1Q zKH>pGB|&D;DWHu>uxPK7-mGL`-3%$lB*YoUY6h@|qmsA`J-8ZcIbs8~8?heO;0A2M z7F>(lk;V>OkDb&!gw1#gH=-Xm;Sg@d5sr8RTk%`mf)DX+{2906Z@4XuQ@CB6xI^+_ zOF8b8QMgOSVw=>XSI)-{nTdP2_21*}-NzK&FRj=qEAf3v;6eEYekhx+D?dg8Qjc1HP9575g zXH?>#F#(5+20U+s@q*EemyEArz*vNrjpaCOwBhGQ7mgTf@tUy-M-3aV8+YLi4Tp`~ zzj|Xu77oUhay2zhOgENDgc9LkERYqH2nS;>10fvJxY%fxHi}+cW=s`}8}6g&Qfa5o zk8#GTEHI3_v%oOyEHI2)q~kO&LL^Pb#(W|(SC7&V(W5#CA#xSUhd{)By0T27_L0i) zAW2pdD60lZQhrWSlcbjBfOqNl?}(50iH{G6j}M8DkBE=o6CZydKK_X1I6-XuNoV6q zLcJa}*=%4;HX8`Z90sPyQ6XKF6gi5eo05l?CuPIM3Ki~oT-c4vCB`Tf*e}(QpCLl# zS^V^~`6^0##^}<)a8@&%HN=W4Ue@S-9nK6^3g9G5;Aa?%|7Ah?CkqTnLBT>XSXXke zQXJSIxf+|j;v)tRwq8Qj>h2uPA{J8%IOOGXRz2I|uhmNozTd zOAM#D?(~LfmDa4+ZueJ>8gzRD%h~yuqTN1GHBGxck~xEvz%QlDS2;`>hT%LYjF1Xc z%5d#gHJ2YT#D&p=F8EO<8|50hP|TXEs!Aq>%7ctXCyq|Dke;HOJO{g7@(orJhzsd@ z$6y_~mibJ}b^M*qlA2_k`J8ktr_q_y=<3J7vM2G%9=sNISNGxduxCOaejWDK^x?N* zU*S7@@w>3U@FR5zn7%$N-VUGX<+T?<(_Q$7KAbS!efZe)EA6M@JW~(*G`u2c=Jnxk zjSe%YF1e;h4LI40!V*U>0_x_U`N0QJWV(4E%bM8*r=!uS$BOYBhjGdNUbstgw|`-z z*Z%RC;X2LjY(bD3t91%}6nHO-O$ z8M7MJffAnrG4)(&h(52xza4o>&&enB&|pcR7X>AGz3`U=d*O2If+Oc)?x2H>A8gej z<}^yYuS^s0tGK=0JfX!gOxCcjBrujmu9n4Z5{uY0S%+rXz}9>XOQCANX|~zx*iNq} zxHl8n-{kx9jd)XT#wW4`f0wN|MGPA99dQv@L9wMwwn>Hb$|%_()pDOql%0wUl8?0B z-7Fi}I<{rVKuOVp?V6IJ1*R339OMZU+UL1t#6W>-G*Ggh;!fLW^4 z>?&lghG}*cF=NGYAFUNLZvoA-5@ye-c~**Md@lEsabugJj_Y zR92kkUS_ct6lm`4P>kwDd6rR{eu{)czKV?`&i`W>S*a+gS?NE8ixg8c{N>d2@v|(@ z8XeYuXH)fzkqlo4DO+p=jY7@Yo$`Ivy4WF(a1Yc8`?G$8m+ir{`J`!MOHQMsNQ#T3 zbgz^zEs|kHGD1lme4QRuB$YXP@r=2 zWBV{Z>^9vw4PlSzb~J>&raQMG>@(fYhOmEvY7PC{QBl*6Ez49ZFny-q4vjBOkKcpd zu#@D!OW7H;Ua2H)eG82`P4`}zuwQDyp0a({skh00sow>!@~019mJ-K)b_Jq;GL>|G zDy5poSt@tnEga|hCquCW8!F^6xaDyk8J??~rQhh@CLgT;XC+dX5ZU0!GG}IB{ggnf5 zItMfIiabIoSJK&6naqUv=?U{mK-FJvQvGEHTpFK59N%X~DKs~MuMA66dm(Oz>eZb@ zwT^1_RU?gmY2hU7ITH#Z&a;iEqfWgu;2b>bJW5XV2X4e(55*x4Ng4o#u2<=40PpsU&Ko)UUuUZ91>(0^HVcY1!`R| zwkWtErr|Yn`uBq2#=6wux)W~*981TIowO`h!&~@+ia)yXC%kQRx~k;QhF8mRsCZY9 zPDQE4PN#i<3&-%jiVxiQ5FZIf_Dz&09>vFQ*zt)V$EZwA<6>W^G^fgmPX&eNN9sc1 ztX0AKhPq(1w!WdJE*Q?wni0)vX>M8>%nFBU>toTZU?^M{tP8H-oQ9+LiyME%Zhygn!hnr8!cGRvpE@}f%%Q$I!!d}a>@W>hsQrZ ziD%8FeVU{oUlscFzs^})F{dWXqnezOCKz1V7z;(h^J>Du{EfkAS#vBF37h_RiY`!Q z)i`B{@r`F>@=$@hEEtVFvp*K9YYx|`l4%rp{mu*-=9b|y!dU2CHt{S$VuW65iWcR^ z%oyG&*=`wa#@Evj3I`Vk8*7?sVv(jKD3a^OLo!BCKHAu;XBc*0PGGEC@=agaYa1fb zU=k8!oVlow5Jp$zoNv0TprMA&S{Q4h&q_7Pkh9$~UM3jzzA~BEe!nl0V4Er^Hl9o_ zXrGgOKxBi_lk&9j;Gk^dsnpMmHwIm2%+jCDw1wztL7JuW2O%gmeCgY~Ki6cx+@;Fh zrVVYz-t=F~y~e5`5xL)ZbI2IigY=JxQyw-nf336|VSldeph@I){tV-=-=F9LkzhAO zN{nOvA(JLC6}(8`GZQvs!G&QG;I~0g_|&9SCi6`RiEwkTn3=*eN{k6ZTjJ*KB8~&O z@F5Rr$j1nb!+4Gca5ko40xCFGi4x4`$O4q23X`o97BKO~BUPrzRGu7wPtKtxJNLL` z8YKsG6eA+%(mEf?q)evs^fUydTxQU^1#sshDnH^Nu)Nn$Ighewdhdprr#Dp43}&h*8;L5;|dE%F+7|*k0#8dGz+6K8-1t+DKwt0u0)0`q@=~EaIl3s zk;l%EMI5xzn5I7e+p$&_TlhT)N|h|3;r&p1=S--*a~GIUxpyFxQ%F&fsUo1FtQ$+E z7kf3aU)YNsu>Fk|dD`7sdll0OG{2I2R}e%k^{t{c^#rztkQ(TOwS*BSfCyKu!v%=q zV#Kf-Ep)^N{%^$P*o^Jif?e2(TM@@TT#EZ}86LwG=)yKUgDdeOuEOiM8t-uBaqM7~ zx)xvIx;T2UQyjQnyx1j!VMr!!kZjy2g}7Nt&`JmGA++1*$J?bEcStRBc{TP*6ZXj# z?3XKWm+ZjZawG1M+iD3fzf~6ES!EfXS61SP(tsC~^>|6y zidPf^uPQg;HH!|L7{5YgML!*si)1NB9GIe1$wib%2W6ftqeMC=vt&6XR~(f}x%`-- zh6|KZxtIY@r0PLZ!!b8TD{K0Rq1@6>48`athO$FeoF+yVlcrb4Ofu7Mt+FU$t*Y&# z$Z`xmgCfSgBhzH1@$|?*Uy=k#lvRC6;yx>CB}qQjfz8EV?Sb_XbAwdjnZgPGDwoq)QzoGdWVEo|222C-lR`3KQ;9 z9_+-05+X{I?29er|4D@2xz(rVW_~Xbm<7xQCc^B#L|8+74YHQYN{s4JT^7EnEFHi% ztcl+u8{Mo>|6*-Ag&8F00#=&kB3La7HcA3XY9lFKB&140I!Q#$!aJ3b&W1CC2(zf=QOy?`BW7 z%+8<_A<1yFzoy6_=%T|fX&A~p8YbzMS-CuZ=ou!A=rh5MG-;OgG$DmW*eo->J~b`q z9qIQZD{BwUOi_{k9b35={z&WM^ zzYDnXI`C>hOM3kf-V7ury<@)Iy4Hb3dyuHR_-@6}E*!0X6z_H7c)+83l1_Bsr0(g! zX9*AJ)|xLlY;B5v8St7jUlrSQulcg;PE$#DE0R)et?-y%z8m1%i;OdL`gC8iz*Oq9 zl-i0N);3X|;ttxBWtF^)?WQ>{8~g}DPsD1%qF$W|uFjSQ(N`B-uLCC215`?}>4 ziJR=>*rjrr)%CmOa+cBrgvju1awRF#h->60l4qPOFVA zg|mnE0FTKzyr|+el`Vo4Q!zv}NBMb+A3*PkGc9~)t`q)!Z=H&N@&lxgNKcu@>x^74 zyUa`?VgF7jUaD5R5UB3NQ!5Z@```*EY_HZeQr@k5I)i^2J@dcT3iY&2{ zALf;GAInJyrB)kp@d`4*Y9kt&QDC)^#5gu1M|P7yZr(UXh{3mqU8vmZBTl@`47h=p z0~gu}`6juU0Y6Djn>E=ipK56DmG;7+|vWK@)8!O>Sxs?|U zJ3HSIxn1JtGUNNNWxZQhpWZr?6~Vlg?S|IF%O%Oo56NqGC7!2|sAXW2se<=^O_^(D zrM07%^t`L~Q2Cj9?3N;9YoWeU{ecd%R2Motj=oxb2hI5z%~9k|*~@o2BfO94aF6x8 e&w4&!Js*-sIL{wP?Dj|Hz%*SRmB*w5`o94KJMn`6 diff --git a/target/classes/com/example/vpr_javafx/HelloController.class b/target/classes/com/example/vpr_javafx/HelloController.class index 3e7d74d67e44b256d89a09bd5276d972b7c1dca6..1634636c24cdee3e29d06e9e001af601ac445618 100644 GIT binary patch delta 5387 zcmZ`-33yXg7XJU&G-<=@3WZjrQz~c|pt31eK{jhyS{$g<)*`kvErGUyHl=`QTn11O zT%yRLh@ya^B3oE0tB7ohxT20Cjt+<$;E01GI_JK;hAsiVmvi&q|GvANbN+jpBl&B_ z*bn@K3XE`@Za@y?1;I}+Jh=asyQ zXfvg_BF~@TFlsjwO)x~b7tBTA>@pg=8>n+sm-eX#W?d(mCh--#5^fk31A!);G zOeJC`6i+G6aJn+GoE47zYNy*#ZD$J8b%e4D(KcncL8vIMD$kI8JFCjCFH9Y6XE$cp zc(u;%>_H@YyGOV6`XbWo?4|JDM6y6}-g%J`{p`G!eQdl=XQtvtH+tW+8n>fTPOrjQ zFg%v%)I)sjOb z$u5$j>>Q2|<)~Y9{+%PeZ$x#E%;T*#j@Fsa+x)aRZ*+9Fr%>nZ94W4>F3E9KW%p2{ z#^}7m#PVt#+1(X(r_SO=n86#Tvs7VW)g}3k(kef(OlNsx&|o@sPB6i|@wL@{W`)km z^v0+`b?Ka>Kv_^$wbRe6)>%WhSBvQ#IfZpLPSrV$(~0(m&$`7}y?4gM=giP~H{C>d zi963VqPkQCMjq?b>hINgU!#}yP#q8G{D*o;s~U%Ul%v8i&h02w+*vwj^Fi-hF)875 zIM>F9bYZozJT{iIg=C za#gtzO1ulO$ICXBf|VJH==6oOf(|n&rPLO(wTX^sbJN^<+Xr8OkNn zUl5tGihWV6h8aPyX+g02gJ3g*VDp1ub5ZVTG4T^Yh))HLJQsJo zE&yJ{)&#*e2f^xtV0(gKyP9JjIqCz=LBU*@)Z%13L9hpdV2=gC76-wW3+8F=_g8`t zHwMAB2f^NMiE#y2w%Ev3NNK>7|5d<|Z7zZVOzxrvVgQq?uLUMIUkgm`ycU>Tcg--5 zhIDjk25NY}rAw4hHRmZ=YJrI^x4=Y+TVSHZpr>itDJgD26e(_ji4wQKM2K5pl|e93 z;Q&wkZ{)jD(E#Yjq7i{e5xrH09@v^JG#afN^+h%7i*MA|rdeNyMtuoP@8+tQG!)!xJo-L8E_@V0^g39#TH*fAH;m?zjHd{t0g_&^7~#x-Is ze4T3%!qwgfI;0h-v5^Ro&qXqBG2*er7?WgR3Fa7iGuLswyvL3xZs0~)hflprkb_M& zXW=GUna0)Yt%>=XM_w-_S(Z?rlapL73tWLztU@=ugr0aAeXtsR@hXO54f60h3b78Q zSdR(V2seC~jxCstdYr^IoWXYdjvcswU9@61!?B04c#G|^mx;eF=e1CGImyb~YOiBDL8Pg#r4cn?13efWZN@FnNrD=xrsK8vsAV)}-w z@hxA&3E9y}?!C94ZmrjIIl(GcP$2< zKeWqmLAwHfYF83k29|5RY18^JRJ)E=tuMok!=8jzNY$*|%q?>4-86EmIK_gV{Dbw< z3Pm6O#y6y8l_K~ow@J%}q5PKHr4@$RT*V!-#BfB(JiEAC#4|!m;hWjq18Uca&)?!+ z6$M&9zeoADxJ1Q;LE}D&uKj`(;_?fKvSA?q5|@PAU{`G$4|tQ42gNnM94$QP_p^6; za(g2J?J_ACgK)WWFGii+oUiHFLuLdXO1@cz2riR%f$4H-cR@#XMLN5oJ2TLmR~zr@ zWkmNifoQzOjK*kO$#?j!%-j)iJk0mx_|nmeNBF+%`BD-3fq!;64J+&(IX~cRJ#7W+ z7`};7IrT^^h)vprRIiZ{q!?z277n2A%!iI(qzHQ+@2Ynb&OP^?;B4(tP-+H3#_c`DPs7i4&Qj z={|h76F>WK#)n^b;(wXedYmgr2;GDWnYILLg3U)HSbdZQ_&8`K5;8;0mY!)%2vuF# z386by!mifn!#kn@7=ryC9AOqdz)?wrEXl0X^_O%Rj#C^WX)+9Fm}|JNNFs9?QVmyyN`|*HTxFG< z*6C5cvdK!8@C{c(Jx&2}N3r7%Y zgsfDCHX9Ocl$*}RtiNP>YqJi4jlM9?d1wP|IB30OxP0mlbUBHYGOYwEj@5H`!6xPo zH*Jn-b4{CRX=sE>6pTpsag^8s(-w8{e;;dD&jyxs^#cymj#rLTBPKR9suDu|NT4xU zD78Yl%d{iJ-lHZlZINlmnzqEW4%3b|?L?2+s4}hbeXVR#GeV#mm&?XSAxsoBnztgJ zqa{Q0k;Ve_U?DPjyC_7Fh|w4+#qU5N$6}nQYz2!^%M#qfQp}=5LZ%E0ST0^3j}@Z8 zuW^FJ`9y5@h!pQ-CEjI~NV7|1c(M^Q{ro3w20)ld_GkQD1S=Yc`A=zSa#g*}FQgSB z$-kXnO3Q*YY~(R%g*LmCzG_H$Y?hHCRJctJYea~Tp8M6QNkiEp(~dQ5iD@0C9dFu+ zrmZrq$FwtjeCXoY^$>*xr^wmW$=OYnvzvw_PM6;n?!wiaA)02ati9om zdHzL2M0)S3F>oKIh9rA(Y%^SE%a7Y*7|*wUSC~xMQypq@2yU$tDav| zRaNUhzP-AmOHBEhK-DccI@&(HB40GvCv%vZh~-yRyn#?5p&9 zeJ=LG)h_l?%gmHn0-tNCvGE}L>L_GCVtRVuiMX<%z1Uyp0Hrx{ff^{|I7sJULD4)#6@kcv!LgN`>*Vb^t9S>IWNxD@Avv!`=R8&rF*E%|H3hzMW%%)&t5#mC)89hj z0M#*H=K`gmop^DQx5_)q?=4r{MLHMrcY#w0=`l-qx08m>rGcLkQnQvILXBId^Y<#I zT$Q!W!(6Cjmw0GgsT_JAF-$qMN8tOo&etyC13FisR6@^FULHdi*XUf!SebZ2eojGQ z-gQM23i4fC!iRLOQxP2PubCtO*@2RRRzux2b1m-9H5c{Ev zXZewnAFB!f9JtecBI#4HmuPpTvv)Mlsh4Zb-)MdjDD9f<_=ZReJmyY|aPqsrk*))c zAldHrO^B>@gec85``` zFlPL^;}^r=uh?!I?0^l{WP_cs!H%`Y3^DcT)}UZDnAgTKh7ER~4Ytk(+iZh9C799L z@6X#18*Q+|HrUCw7$4@wHXG@M^kz)?Uj-c5=~pm}Npfx`T9}4D$ZUhX+tz|APqgN# z%+LxmG?f=yftt#MZ7|7%Z7|7%Z7|7%Z7@lMZ7|7$pmF)J<83xX$%1VLOCoE9#i2c7 zCHp*L9$)8WdgGALqOU`XJ_CqDVvEjBEjm?Sw-$Zw%lb4-m%difqUS>GMRa~U@Q3tLG{omKE|!` z=HTPph6rvBM5knws1`X5>I0y>QRIpn2Mb! z$8(sA2KccHi?IhQu@~pjh#wKef3Y7w;~=AOh%tDH@pzd@ILu@mmHOZqGjN;(ae^c8 zDo5j_!Cai;jX2FBS!WsE;B9z|m3W&~c!za(mv`em-h=n~06yRvoR!n|5g*6Lve!@e z96sePoa26c&ZGE($MF^4z}I{m-|{TJ;}{ncZk{hYUH!x6o=Ga z|Km<+MPeBLEz5}&(~jgtJ})gNCh{9LNGn?0yo0;ATf(J-){`%Aj|574EuAlBaxW-T zIk=CFDhjkwA&)XBE>Uq|(qxC^fxxOBNjw;+?=h}(%e&0MLm`g_F7-$?(Cji}10oHv8PM27XX%TK+0PDnO-L?{PuY*u z{EU5!53+NRNt@+(?L%7gOPusv6?%~f&P-rxkUi>gXO<$#U+;_{vNplf#9m4jduKb` z4ojP*$I_5t2s_A(L(Bq#yvFSaa-ez)sfRl|(rW41QSL~0RFK!YBahU>rPKxS<{sIu z2dlAx!?97$(N>XDK5wH%HO z0_@~aG;k1ha|rfvxM}%O;u#Mn@HkIM=C{u9aFpHF%K{{vaIT4?OZW4-n=F}U$$U#@J5<9EMs}olV{D%wb41=`$%4$#d!Z#K zXNBHNEICd2Mh%$J-0-*~LrAz$E|fV!skY=;k$0*&ELq?P8YWO^0h29RV##TioMB0i zC4EZnkxgo*n|-)aHa-f`lHTGt28p~*&e2$8@Oli8OD&r@7|ZdJ9CD?ooq(yFh*^>W zt9X-vI_BYS7GMQ$##-KjjVzQ%nuKR0J?`RUiOMOGON;RuOC(K}N=lrH&p16C9%5-L z6r%AVU*~B_AaRmR&qzy?tK%f!kXD2o(ZhUGS`K7L@Vq6hNVz2Bu57Lh9elg_Wa5Af zm3)E{vDVm#AnTOXELmX5LQ77zWQirGS#pLYJ(l!Ya$%5ng>7eGfTTRoBgUI4#+xO^ zD@O{w@(DW|*GO$MjB_wXu7_OC#m&4O#qxEeF3>AN3k)BFlF%{u%?SOYY)-B~AYzqR zLoQ|>&uF5tL}K)wMlMtv4f5ViNRokqbnsG_)`?>kwC{3~_(4vP77;*di{q zCl-W>%Pivkt%!!DvM|hCZ86ukVp_z>VdBFUaf>~%Buw0D5x3hA4cX4LFtgrbHrOzQ zI3rAa!6F9jiJma=phY}lPxQ(DEt|h$F;CerL)XJR~R${`aHTwW!i=B$fcnn zO=`M#r4=ECS~Hd(#%jXYf-v@I7~2-cj)k$;!`Ou|b`c$n&?HP~2BmVdCYE~5npo0U zGv*CrcZ9LEVQgbFrcPJ$$&{8^rb-1AZ(dLi^IFp38kC-1kRJNEtX_@aduDF^6W + - + - - + + + @@ -17,18 +19,28 @@ + + -