From 7d3e52050ae162d8050934e8540a69ad7aed7631 Mon Sep 17 00:00:00 2001 From: Nathan Date: Wed, 4 Aug 2021 23:10:43 -0400 Subject: [PATCH] it worked --- .idea/compiler.xml | 1 + .idea/jarRepositories.xml | 20 ++++ .idea/vcs.xml | 6 ++ pom.xml | 43 ++++++-- src/main/java/MainApplication.java | 44 ++++++++ src/main/java/daos/Engine.java | 89 ++++++++++++++++ src/main/java/daos/PhoneRepository.java | 96 ++++++++++++++++++ src/main/java/daos/Repo.java | 45 ++++++++ src/main/java/models/Phone.java | 92 +++++++++++++++++ src/test/java/daos/PhoneRepositoryTest.java | 84 +++++++++++++++ target/classes/MainApplication.class | Bin 0 -> 2091 bytes target/classes/daos/Engine.class | Bin 0 -> 4003 bytes target/classes/daos/PhoneRepository.class | Bin 0 -> 4764 bytes target/classes/daos/Repo.class | Bin 0 -> 1299 bytes target/classes/models/Phone.class | Bin 0 -> 2725 bytes .../daos/PhoneRepositoryTest.class | Bin 0 -> 2766 bytes 16 files changed, 511 insertions(+), 9 deletions(-) create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/vcs.xml create mode 100644 src/main/java/MainApplication.java create mode 100644 src/main/java/daos/Engine.java create mode 100644 src/main/java/daos/PhoneRepository.java create mode 100644 src/main/java/daos/Repo.java create mode 100644 src/main/java/models/Phone.java create mode 100644 src/test/java/daos/PhoneRepositoryTest.java create mode 100644 target/classes/MainApplication.class create mode 100644 target/classes/daos/Engine.class create mode 100644 target/classes/daos/PhoneRepository.class create mode 100644 target/classes/daos/Repo.class create mode 100644 target/classes/models/Phone.class create mode 100644 target/test-classes/daos/PhoneRepositoryTest.class diff --git a/.idea/compiler.xml b/.idea/compiler.xml index f006a55..5a76f28 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -6,6 +6,7 @@ + diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..712ab9d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index d97c43d..3762cfe 100644 --- a/pom.xml +++ b/pom.xml @@ -4,15 +4,40 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.zipcoder.lab - jdbcdao + org.example + intro-to-jdbc 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.0 + + 1.8 + 1.8 + + + + - - - junit - junit - 4.10 - - + + + + com.fasterxml.jackson.core + jackson-databind + 2.12.3 + + + mysql + mysql-connector-java + 8.0.18 + + + junit + junit + RELEASE + test + + \ No newline at end of file diff --git a/src/main/java/MainApplication.java b/src/main/java/MainApplication.java new file mode 100644 index 0000000..f5455b9 --- /dev/null +++ b/src/main/java/MainApplication.java @@ -0,0 +1,44 @@ +import com.mysql.cj.jdbc.Driver; +import daos.Engine; +import daos.PhoneRepository; +import models.Phone; + + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.StringJoiner; + +/** + * @author git-leon + * @version 1.0.0 + * @date 8/2/21 9:49 AM + */ +public class MainApplication { + + public static void main(String[] args) { + Engine engine = new Engine(); + engine.registerJDBCDriver(); + Connection mysqlDbConnection = engine.getConnection("mysql"); + PhoneRepository phoneRepository = new PhoneRepository(mysqlDbConnection); + engine.executeStatement(mysqlDbConnection, "DROP DATABASE IF EXISTS walmart;"); + engine.executeStatement(mysqlDbConnection, "CREATE DATABASE IF NOT EXISTS walmart;"); + engine.executeStatement(mysqlDbConnection, "USE walmart;"); + engine.executeStatement(mysqlDbConnection, new StringBuilder() + .append("CREATE TABLE IF NOT EXISTS walmart.phone(") + .append("id int auto_increment primary key,") + .append("name text not null,") + .append("color varchar(30) not null,") + .append("carrier varchar(30),") + .append("cameras int,") + .append("price int not null);") + .toString()); + + phoneRepository.create(new Phone(20, "ePhone", "'blue'", "'sprint'",3, 425.0)); + phoneRepository.create(new Phone(21, "strawberry", "'red'", "'tmobile'", 3, 599.0)); + System.out.println(phoneRepository.readAll()); + + } +} \ No newline at end of file diff --git a/src/main/java/daos/Engine.java b/src/main/java/daos/Engine.java new file mode 100644 index 0000000..c9c4f64 --- /dev/null +++ b/src/main/java/daos/Engine.java @@ -0,0 +1,89 @@ +package daos; + +import com.mysql.cj.jdbc.Driver; + +import java.sql.*; +import java.util.StringJoiner; + +public class Engine { + + public Engine() { + } + + public void registerJDBCDriver() { + // Attempt to register JDBC Driver + try { + DriverManager.registerDriver(Driver.class.newInstance()); + } catch (InstantiationException | IllegalAccessException | SQLException e1) { + throw new RuntimeException(e1); + } + } + + public Connection getConnection(String dbVendor) { + String username = "nathan"; + String password = "greenLeaf1"; + String url = new StringBuilder() + .append("jdbc:") + .append(dbVendor) + .append("://127.0.0.1/") + .append("?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC") + .toString(); + try { + return DriverManager.getConnection(url, username, password); + } catch (SQLException e) { + throw new Error(e); + } + } + + static Statement getScrollableStatement(Connection connection) { + int resultSetType = ResultSet.TYPE_SCROLL_INSENSITIVE; + int resultSetConcurrency = ResultSet.CONCUR_READ_ONLY; + try { // scrollable statements can be iterated more than once without closing + return connection.createStatement(resultSetType, resultSetConcurrency); + } catch (SQLException e) { + throw new Error(e); + } + } + + public void executeStatement(Connection connection, String sqlStatement) { + try { + Statement statement = getScrollableStatement(connection); + statement.execute(sqlStatement); + } catch (SQLException e) { + throw new Error(e); + } + } + + static void printResults(ResultSet resultSet) { + try { + for (int rowNumber = 0; resultSet.next(); rowNumber++) { + String firstColumnData = resultSet.getString(1); + String secondColumnData = resultSet.getString(2); + String thirdColumnData = resultSet.getString(3); + String forthColumnData = resultSet.getString(4); + String fifthColumnData = resultSet.getString(5); + String sixthColumnData = resultSet.getString(6); + System.out.println(new StringJoiner("\n") + .add("Row number = " + rowNumber) + .add("First Column = " + firstColumnData) + .add("Second Column = " + secondColumnData) + .add("Third column = " + thirdColumnData) + .add("Forth column = " + forthColumnData) + .add("Fifth column = " + fifthColumnData) + .add("Sixth column = " + sixthColumnData)); + } + } catch (SQLException e) { + throw new Error(e); + } + } + + public ResultSet executeQuery(Connection connection, String sqlQuery) { + try { + Statement statement = getScrollableStatement(connection); + return statement.executeQuery(sqlQuery); + } catch (SQLException e) { + throw new Error(e); + } + } + +} diff --git a/src/main/java/daos/PhoneRepository.java b/src/main/java/daos/PhoneRepository.java new file mode 100644 index 0000000..260eb80 --- /dev/null +++ b/src/main/java/daos/PhoneRepository.java @@ -0,0 +1,96 @@ +package daos; + +import models.Phone; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author git-leon + * @version 1.0.0 + * @date 8/4/21 3:05 PM + */ +public class PhoneRepository implements Repo { + private Connection connection; + + public PhoneRepository(Connection connection) { + this.connection = connection; + } + + @Override + public Connection getConnection() { + return connection; + } + + public void create(Phone phone) { + executeStatement(String.format(new StringBuilder() + .append("INSERT INTO walmart.phone(") + .append("id, name, color, carrier, cameras, price)") + .append("VALUES (%s, '%s', %s, %s, %s, %s);") + .toString(), + phone.getId(), + phone.getName(), + phone.getColor(), + phone.getCarrier(), + phone.getCameras(), + phone.getPrice())); + } + + public List readAll() { + ResultSet resultSet = executeQuery("SELECT * FROM walmart.phone;"); + List list = new ArrayList<>(); + try { + while (resultSet.next()) { + String id = resultSet.getString(1); + String name = resultSet.getString(2); + String color = resultSet.getString(3); + String carrier = resultSet.getString(4); + Integer cameras = resultSet.getInt(5); + Double price = resultSet.getDouble(6); + list.add(new Phone( + Integer.parseInt(id), + name, + color, + carrier, + cameras, + price)); + } + } catch (SQLException throwables) { + throw new RuntimeException(throwables); + } + return list; + } + + public Phone read(Integer phoneId) { + return readAll() + .stream() + .filter(phone -> phone.getId() == phoneId) + .findAny() + .get(); + } + + public void update(Integer id, Phone newPhone) { + executeStatement(new StringBuilder() + .append("UPDATE phone SET ") + .append("name = '" + newPhone.getName() + "'") + .append(", color = " + newPhone.getColor()) + .append(", carrier = " + newPhone.getCarrier()) + .append(", cameras = " + newPhone.getCameras().toString()) + .append(", price = " + newPhone.getPrice().toString()) + .append("WHERE id =" + id.toString()).toString()); + } + + public void delete(Integer id) { + executeStatement("DELETE FROM phone WHERE id = " + id.toString()); + } + + public void delete(Phone phone) { + executeStatement("DELETE FROM phone WHERE id = " + phone.getId().toString()); + } + + + +} \ No newline at end of file diff --git a/src/main/java/daos/Repo.java b/src/main/java/daos/Repo.java new file mode 100644 index 0000000..0e3340a --- /dev/null +++ b/src/main/java/daos/Repo.java @@ -0,0 +1,45 @@ +package daos; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +/** + * @author git-leon + * @version 1.0.0 + * @date 8/4/21 3:15 PM + */ +public interface Repo { + default void executeStatement(String sqlStatement) { + try { + Statement statement = getScrollableStatement(); + statement.execute(sqlStatement); + } catch (SQLException e) { + throw new Error(e); + } + } + + default Statement getScrollableStatement() { + int resultSetType = ResultSet.TYPE_SCROLL_INSENSITIVE; + int resultSetConcurrency = ResultSet.CONCUR_READ_ONLY; + try { // scrollable statements can be iterated more than once without closing + return getConnection().createStatement(resultSetType, resultSetConcurrency); + } catch (SQLException e) { + throw new Error(e); + } + } + + default ResultSet executeQuery(String sqlQuery) { + try { + Statement statement = getScrollableStatement(); + return statement.executeQuery(sqlQuery); + } catch (SQLException e) { + throw new Error(e); + } + } + + Connection getConnection(); +} + + diff --git a/src/main/java/models/Phone.java b/src/main/java/models/Phone.java new file mode 100644 index 0000000..2715c69 --- /dev/null +++ b/src/main/java/models/Phone.java @@ -0,0 +1,92 @@ +package models; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class Phone { + + private Integer id; + private String name; + private String color; + private String carrier; + private Integer cameras; + private Double price; + + public Phone() { + } + + public Phone(Integer id, String name, String color, String carrier, Integer cameras, Double price) { + this.id = id; + this.name = name; + this.color = color; + this.carrier = carrier; + this.cameras = cameras; + this.price = price; + } + + + public Integer getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public String getCarrier() { + return carrier; + } + + public void setCarrier(String carrier) { + this.carrier = carrier; + } + + public Integer getCameras() { + return cameras; + } + + public void setCameras(Integer cameras) { + this.cameras = cameras; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + @Override + public String toString() { + try { + return new ObjectMapper().writeValueAsString(this); + } catch (JsonProcessingException e) { + return "Phone{" + + "id=" + id + + ", name='" + name + '\'' + + ", color=" + color + + ", carrier=" + carrier + + ", cameras=" + cameras + + ", price=" + price + + '}'; + } + } + +} diff --git a/src/test/java/daos/PhoneRepositoryTest.java b/src/test/java/daos/PhoneRepositoryTest.java new file mode 100644 index 0000000..9fd0dc2 --- /dev/null +++ b/src/test/java/daos/PhoneRepositoryTest.java @@ -0,0 +1,84 @@ +package daos; + +import com.mysql.cj.jdbc.Driver; +import models.Phone; +import org.junit.Assert; +import org.junit.Test; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.NoSuchElementException; + +public class PhoneRepositoryTest { + + @Test + public void readTest(){ + //given + Engine engine = new Engine(); + engine.registerJDBCDriver(); + Connection mysqlDbConnection = engine.getConnection("mysql"); + PhoneRepository phoneRepository = new PhoneRepository(mysqlDbConnection); + engine.executeStatement(mysqlDbConnection, "USE walmart;"); + + String expectedName = "FlipidyFlip"; + phoneRepository.create(new Phone(22, expectedName, "'grey'", "'sprint'", 5, 699.0)); + //when + Phone retrievedPhone = phoneRepository.read(22); + String actual = retrievedPhone.getName(); + //then + Assert.assertEquals(expectedName,actual); + } + + @Test + public void updateTest(){ + //given + Engine engine = new Engine(); + engine.registerJDBCDriver(); + Connection mysqlDbConnection = engine.getConnection("mysql"); + PhoneRepository phoneRepository = new PhoneRepository(mysqlDbConnection); + engine.executeStatement(mysqlDbConnection, "USE walmart;"); + phoneRepository.create(new Phone(31, "UpdateMePhone", "'space_grey'", "'sprint'", 7, 799.0)); + Phone newPhone = new Phone(31,"GrapeFruit5000","'gold'","'AT&T'",4,999.99 ); + //when + phoneRepository.update(31,newPhone); + //then + Phone retrievedPhone = phoneRepository.read(31); + Assert.assertEquals(newPhone,retrievedPhone); + } + + @Test(expected = java.util.NoSuchElementException.class) + public void testDelete_byId(){ + //given + Engine engine = new Engine(); + engine.registerJDBCDriver(); + Connection mysqlDbConnection = engine.getConnection("mysql"); + PhoneRepository phoneRepository = new PhoneRepository(mysqlDbConnection); + engine.executeStatement(mysqlDbConnection, "USE walmart;"); + phoneRepository.create(new Phone(55, "yPhone55", "'space_grey'", "'sprint'", 7, 799.0)); + //when + phoneRepository.delete(55); + Phone deleted = phoneRepository.read(55); + //then + + } + + @Test(expected = java.util.NoSuchElementException.class) + public void testDelete_byPhone(){ + //given + Engine engine = new Engine(); + engine.registerJDBCDriver(); + Connection mysqlDbConnection = engine.getConnection("mysql"); + PhoneRepository phoneRepository = new PhoneRepository(mysqlDbConnection); + engine.executeStatement(mysqlDbConnection, "USE walmart;"); + Phone myPhone = new Phone(55, "yPhone55", "'space_grey'", "'sprint'", 7, 799.0); + phoneRepository.create(myPhone); + //when + phoneRepository.delete(myPhone); + Phone deleted = phoneRepository.read(55); + //then + + } + + + +} diff --git a/target/classes/MainApplication.class b/target/classes/MainApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..6efbc719d27b8fdeaee6f76bd4f91b2cf58a7cf1 GIT binary patch literal 2091 zcmb7F*-{%v6g|zN8RQ{=Bo-SSkHL;4HaT&29D_h2!4^x9OiUcdZjIVv@MuPiMqr%X z`GHhk^O&l=?U4vV;D@M6-P3pP)8}^o{m-9&0eBNHf|$Upg1I2t zFe`_oig`INC`bjNAgy9iu0K@qk%}b+cY^4~tctsG&Zt;cv7%yC#hQwbRjf;KRzWU^ zd)QF%iHiFwHUo3df1r#&5TD{f5JUJ(Mt`W{a}|$NJPypgIP?v=z>$|aBZvZof+q@! z41rswZF;vE+GFtzhK>cNAQ*ZwrY%;grMz%+Ja3UClyMAhZE)9=>xQty+cGN*eVJu$ z+R1X+G7avTjy*$xN+exLr(SJ=e60GkzlO7Rfbyj+%-Rc99BT=*|?l zQ%R)#B}MHk?N@fJRDQv+ZDGh%4E^;4Bu|`($+oAw<=A3fl%0y{Iqp6cQ;)WGT27|H ztW$Ljv1rPjMp`yAE$i1Xi7AE)P336VlA=z(Bn>9E$=BDnB#^#O8T8cp>YAQP=92Tt zY+7Gh)YJEuvbn6j$E^}~y%`M_N(`?ptf!N?^eM}g)m*DJgLaR?96K`%w&FZrHLZeh z8RCtIlsV%kJ{xY@2P>w*hQlyw7If40bYAtGN2YDKq9kZpc1{zJNZWd8;a-3~IDOVQep|pel`ae0EzDr(J;8i6zfFv!MsY>a zta!q`lbT;hx#q4sf$pO4PRL0o5<90WUc%#{hHVSMWfS#^XTqp@BI|L_KO%~A^wm$>_d3ki=2E`Tk_&- z2B1zqssmRsPLGfLwSmcNi^geMC1_?eca9%`{qCz1GzNTO7&qu!s~g~Tyg{oj+@z<> zcV>(9z;ux8wsI!K^@)4BH$pfe>6O*B?8iF)ks85QNLLr4x`IYi{pFNXmdY8WJssUr++_C^kIF?1<392yDGR|J<2apeGd4Oi>>eyJY~ zjfJk&_1FK?|AFXK4Y3;HC%fE0KUF^f6@#?PA%t-eBe;Yy3=>= zU4n59qx9B}(ZhNT4{;rj$;Lnw-y?>f5y!6tvqWvYjtt(y+q6>g3*N!Igj*Ot;XS-h T$1s8)F+=g&N%{fVwBh!@yiOXi literal 0 HcmV?d00001 diff --git a/target/classes/daos/Engine.class b/target/classes/daos/Engine.class new file mode 100644 index 0000000000000000000000000000000000000000..e5fb7645b1619001dee4934538b5c112a05d50f0 GIT binary patch literal 4003 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 literal 0 HcmV?d00001 diff --git a/target/classes/daos/Repo.class b/target/classes/daos/Repo.class new file mode 100644 index 0000000000000000000000000000000000000000..97016f8c7a5dcf4e4dbcd88f2aa75c8ed2b833d9 GIT binary patch literal 1299 zcmZ{jT~8B16o%hv3)|Ax(o#wbMNvS@XZ^rWz#D=INr6BKM(>to0*ht0Znp}T{sC|O z3EtwBK@+|Ax0v`3)OXf(cM~z2ZfDLp^PYE}nf>SWcr4wKS$MtzkyPY#$Ps z(=e~%^)zncmP+2%a7V*}K)*bZM%R^1S9j&Hv|NF~TH{E6rPo`!bx?1*j%gh%PVEXL zR_uK#kZYKh+~^+fNoPmjYcW!2*oNNP)g4pK{a~sSDi;3;c3!rq=l59@5L`PHNo_S& zPYl_1P1|BN;U1bDfplYEw>$N1*|r(XP$Q5~o&RwvkY$1KVqI^0PDnwZbRgZP;n=N~ zau^XP)uti_BHpr&>~vdhQ@T5+ZTb{z0>vPibDn?sA{;I!9CpPIeKh7 z=n=9!z>wLh;$0zN0D;%9@Yo zKX>c7K<|=ineJnOaunUpp<};RC+6M1fxuu0gS#;t$txA>Z;8VpQqrf!VXhTL%^6?+b^r*3*dX8iqXB*1jobt!|q$jKPqU@E>!*`jhE6j{=US+e+NbP*g zHIAy}FV;1#@G qjdRlzj84+k^}tyOtv>>-5#&{?j~8{;*4MJJ@?-8@|<&?v&mn7zxorvEmfwdHJcqB_nmUUS^ zk)?&0U%2vbNIIi!S&QpVm64kC4 zwH?E;EZ4WgwXE$$^D|WrOXEa^Yc~P$w z4~@zXO}kO7*p69Tr?lnR6|>nSxmI6P%p=#b8|-V}woApw#*ykjIj$kSZ67-o^Pwdq zNh<jHBy1?7 zvp+eOYwn2NQnTIN$smoq01H8LpSv7@fH$=T%rZN8({)T zT4fnwh#&r8^kan5DAO7v=PwapPDOs?dG{kTj!IV`PpX6k=cG&tqDqpaV@i^=<4Tgm z6T~}Bn`u9}q8<_Xq1+heXv0Mwqa+5!>9+vw)mV}f(+6!cw1tW zy+GzdfxI6MB-RV$27%0<14Mc!Kt2cs67L0aI~2%=;XvZOK<*I8-E)8lbp*(rP?{uq zfh>jsxr+t55SpB6O`;db5`iqA14NiBK<;7D_Z8%b-V0y^*9!`DbXdx>=66cWZ(inK^cy?OliLw^-Z3)_!sa=2Rr``ayFNh W{-MwG73y=U%Q_zLewC*P9{vL%aPM~j literal 0 HcmV?d00001 diff --git a/target/test-classes/daos/PhoneRepositoryTest.class b/target/test-classes/daos/PhoneRepositoryTest.class new file mode 100644 index 0000000000000000000000000000000000000000..3ade699c48df693a89fb0d9a34093cc3293fb609 GIT binary patch literal 2766 zcmb7FTUQfT6#fQt8N(l!v8ZE7$8u=m1P zC^khwrB6ksObSXq99o3TyjwF%8sdvJ+qKGK#j0B5VA8fLt|^lx1<_2!DW=wH8roG6y_y(Um8zhs zivbI38oF8)S)TopOg~tfe(#xCDw~cwW}t*J{mqoDb*r!~Ct5VK8isA40;)raq9e8w zM4qUwvm|aJj19TxNY7ORE@}og@yx&$w!`?!z}NVO9rQqvJ1=~s29KM0@!0ovbk;G~ z#f($4+>znoVHKxRDlkqcF}d8goG|b$zGGC6sgV%_&+$SIH4@bds8_~lql50|*4SGt zfg_4m)fLX2^sTA1V{HnD=@o_B=voc^Nw1pCz1RPS2Ji80U+a8%JELMt(Qw?vLrJA_=l=mn(=jWu-^exzBO{mkAntBeplj&w#PfgQ} zW}y2X{+rDI)UH48qp=R1 zQWv6oi0$Io4!VZa-VVA)gK;`JJ{pP#;-Nj9Xe4$C?F`rn9Wf?$jK40NLN|JGf~a~h zi<4NyJILZRp5TlEaNA4L2cUB=g<%3Yh6TKj4+!QIrtu*^$A{=+6eGBT0KIhJDz1^Q zETdhgF2p^LnlVMhjeR1t0Eq}u_u?&x@JM)<&|^KZc&sBDRxF&Xv!F;)`=?^3V`sc= zt|dw2Fe4)=Z??o1u-M?Tz#Y?qq~ zt_0c6)foRL@|fgwtB&*!hL?Tt=q-?{GQSBZ>nuy$rN;9OsKEx*0kR5$(%HKPW(akb zP;V3J95cE@DZ~DrXZPM~s_vsY+{HTF**e^DAMP#Qq$veA>jMv}-hT~vnhCUF`d@+x BZ^r-t literal 0 HcmV?d00001