From 5c099210f151249e9df50173afceca188255a917 Mon Sep 17 00:00:00 2001 From: Edwin_Carvajal Date: Sun, 31 Mar 2019 10:53:04 -0400 Subject: [PATCH 1/7] .idea file added. Switched to master to create new feature development branch. --- .idea/CodeBusters.iml | 9 + .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/encodings.xml | 4 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + .idea/workspace.xml | 452 +++++++++++++++++++++++++++ 7 files changed, 490 insertions(+) create mode 100644 .idea/CodeBusters.iml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml diff --git a/.idea/CodeBusters.iml b/.idea/CodeBusters.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/CodeBusters.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..b9d18bf --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..15a15b2 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..caf51dd --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..61e6741 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..70a3134 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + buildMessageDiv + fetch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -270,9 +226,9 @@ - + - + @@ -326,9 +282,6 @@ - - - @@ -367,20 +320,8 @@ - - - - - - - - - - - - - - + + @@ -388,8 +329,8 @@ - - + + @@ -402,8 +343,8 @@ - - + + @@ -417,34 +358,53 @@ - + + - - + + + + + - + - - + + - + + + + + + + + + + - + + + + - - + + - + - - + + + + + diff --git a/src/main/java/com/google/codeu/servlets/CloudSqlServlet.java b/src/main/java/com/google/codeu/servlets/CloudSqlServlet.java new file mode 100644 index 0000000..31e5655 --- /dev/null +++ b/src/main/java/com/google/codeu/servlets/CloudSqlServlet.java @@ -0,0 +1,104 @@ + /* + * Copyright 2016 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + package com.example.appengine.cloudsql; + + import com.google.apphosting.api.ApiProxy; + import com.google.common.base.Stopwatch; + + import java.io.IOException; + + import java.io.PrintWriter; + import java.net.Inet4Address; + import java.net.Inet6Address; + import java.net.InetAddress; + import java.sql.Connection; + import java.sql.DriverManager; + import java.sql.PreparedStatement; + import java.sql.ResultSet; + import java.sql.SQLException; + import java.sql.Timestamp; + import java.util.Date; + import java.util.Map; + import java.util.concurrent.TimeUnit; + + import javax.servlet.ServletException; + import javax.servlet.annotation.WebServlet; + import javax.servlet.http.HttpServlet; + import javax.servlet.http.HttpServletRequest; + import javax.servlet.http.HttpServletResponse; + +// [START gae_java8_mysql_app] +@SuppressWarnings("serial") +// With @WebServlet annotation the webapp/WEB-INF/web.xml is no longer required. +@WebServlet(name = "CloudSQL", + description = "CloudSQL: Write timestamps of visitors to Cloud SQL", + urlPatterns = "/cloudsql") +public class CloudSqlServlet extends HttpServlet { + Connection conn; + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, + ServletException { + + final String createTableSql = "CREATE TABLE IF NOT EXISTS visits ( " + + "visit_id SERIAL NOT NULL, ts timestamp NOT NULL, " + + "PRIMARY KEY (visit_id) );"; + final String createVisitSql = "INSERT INTO visits (ts) VALUES (?);"; + final String selectSql = "SELECT ts FROM visits ORDER BY ts DESC " + + "LIMIT 10;"; + + String path = req.getRequestURI(); + if (path.startsWith("/favicon.ico")) { + return; // ignore the request for favicon.ico + } + + PrintWriter out = resp.getWriter(); + resp.setContentType("text/plain"); + + Stopwatch stopwatch = Stopwatch.createStarted(); + try (PreparedStatement statementCreateVisit = conn.prepareStatement(createVisitSql)) { + conn.createStatement().executeUpdate(createTableSql); + statementCreateVisit.setTimestamp(1, new Timestamp(new Date().getTime())); + statementCreateVisit.executeUpdate(); + + try (ResultSet rs = conn.prepareStatement(selectSql).executeQuery()) { + stopwatch.stop(); + out.print("Last 10 visits:\n"); + while (rs.next()) { + String timeStamp = rs.getString("ts"); + out.println("Visited at time: " + timeStamp); + } + } + } catch (SQLException e) { + throw new ServletException("SQL error", e); + } + out.println("Query time (ms):" + stopwatch.elapsed(TimeUnit.MILLISECONDS)); + } + + @Override + public void init() throws ServletException { + String url = System.getProperty("cloudsql"); + log("connecting to: " + url); + try { + conn = DriverManager.getConnection(url); + } catch (SQLException e) { + throw new ServletException("Unable to connect to Cloud SQL", e); + } + } +} +// [END gae_java8_mysql_app] + From 78c9c7ca8821dd69e244806283788ff3df1a06ec Mon Sep 17 00:00:00 2001 From: Edwin_Carvajal Date: Wed, 10 Apr 2019 11:38:16 -0400 Subject: [PATCH 3/7] CloudSql Database created. Dependencies and properties created in .xml file and properties for sql created in config.properties --- .idea/workspace.xml | 79 ++++++---- pom.xml | 108 ++++++++------ .../codeu/servlets/CloudSqlServlet.java | 136 +++++++++--------- src/main/resources/config.properties | 17 +++ 4 files changed, 198 insertions(+), 142 deletions(-) create mode 100644 src/main/resources/config.properties diff --git a/.idea/workspace.xml b/.idea/workspace.xml index b0d73fb..1c68c96 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,8 +2,10 @@ - + + + buildMessageDiv fetch + conn @@ -46,13 +73,14 @@ @@ -120,17 +148,6 @@ - - - - - - - - - - - @@ -142,13 +159,6 @@ - - - - - - - - - + + @@ -229,17 +283,16 @@ - - + - - + + @@ -264,9 +317,9 @@ - + - + @@ -337,13 +390,6 @@ - - - - - - - @@ -351,13 +397,6 @@ - - - - - - - @@ -398,33 +437,51 @@ + + + + + + + + + + + + + + + + + - - - - - - - - + + - + + + + + + + + - + - - + + diff --git a/app.yml b/app.yml new file mode 100644 index 0000000..0e72d0d --- /dev/null +++ b/app.yml @@ -0,0 +1,2 @@ +beta_settings: + cloud_sql_instances: sp19-codeu-14-7857:us-central1:taxoverflow-database=tcp:52785 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 25e3fa5..fae5d6c 100644 --- a/pom.xml +++ b/pom.xml @@ -36,10 +36,10 @@ limitations under the License. INSTANCE_CONNECTION_NAME from Cloud Console > SQL > Instance Details > Properties or `gcloud sql instances describe | grep connectionName` --> - sp19-codeu-14-7857:us-central1-a:taxoverflow-database + sp19-codeu-14-7857:us-central1:taxoverflow-database root devPW123 - Database_CodeUWebApp + taxoverflow-database jdbc:mysql://google/${database}?cloudSqlInstance=${INSTANCE_CONNECTION_NAME}&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=${user}&password=${password}&useSSL=false diff --git a/src/main/java/com/google/codeu/servlets/CloudSqlServlet.java b/src/main/java/com/google/codeu/servlets/CloudSqlServlet.java index 8aea48d..4d9fac3 100644 --- a/src/main/java/com/google/codeu/servlets/CloudSqlServlet.java +++ b/src/main/java/com/google/codeu/servlets/CloudSqlServlet.java @@ -42,20 +42,6 @@ public class CloudSqlServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { - final String createProfileTableSql = - "CREATE TABLE IF NOT EXISTS PROFILE ( " - + "profileId SERIAL NOT NULL, first VARCHAR NOT NULL, " - + "first VARCHAR NOT NULL, isCPA BIT not NULL, " - + "PRIMARY KEY (profileId) );"; - final String createPostTableSql = - "CREATE TABLE IF NOT EXISTS POST ( " - + "postId SERIAL NOT NULL, memberId SERIAL NOT NULL, " - + "header VARCHAR(255), pointTotal INTEGER, " - + " FOREIGN KEY ( memberId ) REFERENCES PROFILE.profileId, PRIMARY KEY (postId) );"; - // final String createVisitSql = "INSERT INTO visits (ts) VALUES (?);"; - // final String selectSql = "SELECT ts FROM visits ORDER BY ts DESC " - // + "LIMIT 10;"; - String path = req.getRequestURI(); if (path.startsWith("/favicon.ico")) { return; // ignore the request for favicon.ico @@ -64,26 +50,104 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp) PrintWriter out = resp.getWriter(); resp.setContentType("text/plain"); - conn.createStatement().executeUpdate(createProfileTableSql); - conn.createStatement().executeUpdate(createPostTableSql); - // Stopwatch stopwatch = Stopwatch.createStarted(); - // try (PreparedStatement statementCreateVisit = conn.prepareStatement(createVisitSql)) { - // conn.createStatement().executeUpdate(createProfileTableSql); - // statementCreateVisit.setTimestamp(1, new Timestamp(new Date().getTime())); - // statementCreateVisit.executeUpdate(); - // - // try (ResultSet rs = conn.prepareStatement(selectSql).executeQuery()) { - // stopwatch.stop(); - // out.print("Last 10 visits:\n"); - // while (rs.next()) { - // String timeStamp = rs.getString("ts"); - // out.println("Visited at time: " + timeStamp); - // } - // } - // } catch (SQLException e) { - // throw new ServletException("SQL error", e); - // } - // out.println("Query time (ms):" + stopwatch.elapsed(TimeUnit.MILLISECONDS)); + if (request.getParameter("getQuestion") != null) { + // Perform get Question. + final String selectQuestionSql = "SELECT postId " + + "FROM POST " + + "WHERE header = '" + req.body.header + "'"; + + try(ResultSet rs = conn.prepareStatement(selectQuestionSql).executeQuery()){ + System.out.println("Query successfully completed"); + String queryResult = rs.getString(1); + resp.body.queryResult = queryResult; + + }catch(SQLException e){ + throw new ServletException("SQL error", e); + } + } + + } + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse resp) + throws IOException, ServletException { + + String path = req.getRequestURI(); + if (path.startsWith("/favicon.ico")) { + return; // ignore the request for favicon.ico + } + + + if (request.getParameter("saveAnswer") != null) { + // Perform save Answer. + final String createAnswerSql = + "INSERT INTO ANSWERS (postId, answer) " + + "VALUES ( " + + req.body.postID + ", " + + req.body.answer + " )"; + + try(ResultSet rs = conn.prepareStatement(createAnswerSql)){ + System.out.println("Query successfully completed"); + conn.createStatement().executeUpdate(createAnswerSql); + + }catch(SQLException e){ + throw new ServletException("SQL error", e); + } + + } + else if (request.getParameter("saveQuestion") != null) { + // Perform save Question. + final String createQuestionSql = + "INSERT INTO POST (memberId, header, pointTotal) " + + "VALUES ( " + + req.body.memberId + ", " + + req.body.header + ", " + + req.body.pointTotal + " )"; + + try(ResultSet rs = conn.prepareStatement(createQuestionSql)){ + System.out.println("Query successfully compiled"); + conn.createStatement().executeUpdate(createQuestionSql); + + }catch(SQLException e){ + throw new ServletException("SQL error", e); + } + + } + + + + } + + @Override + public void doPut(HttpServletRequest req, HttpServletResponse resp) + throws IOException, ServletException { + + String path = req.getRequestURI(); + if (path.startsWith("/favicon.ico")) { + return; // ignore the request for favicon.ico + } + + + if (request.getParameter("updatePoints") != null) { + // Perform save Answer. + final String updatePointsSql = + "UPDATE POST " + + "SET ( pointTotal = " + + req.body.pointTotal + " )" + + "WHERE postId = " + + req.body.postId; + } + + try(ResultSet rs = conn.prepareStatement(updatePointsSql)){ + System.out.println("Query successfully compiled"); + conn.createStatement().executeUpdate(updatePointsSql); + + }catch(SQLException e){ + throw new ServletException("SQL error", e); + } + + + } @Override @@ -95,6 +159,32 @@ public void init() throws ServletException { } catch (SQLException e) { throw new ServletException("Unable to connect to Cloud SQL", e); } + + final String createProfileTableSql = + "CREATE TABLE IF NOT EXISTS PROFILE ( " + + "ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, " + + "profileId AS 'UID' + RIGHT('00000000' + CAST(ID AS VARCHAR(8)), 8) PERSISTED, " + + "first VARCHAR NOT NULL, " + + "last VARCHAR NOT NULL, isCPA BIT not NULL, " + + "PRIMARY KEY (profileId) );"; + final String createPostTableSql = + "CREATE TABLE IF NOT EXISTS POST ( " + + "ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED," + + "postId AS 'UID' + RIGHT('00000000' + CAST(ID AS VARCHAR(8)), 8) PERSISTED," + + "memberId SERIAL NOT NULL, " + + "header VARCHAR, pointTotal INTEGER, " + + " FOREIGN KEY ( memberId ) REFERENCES PROFILE.profileId, PRIMARY KEY (postId) );"; + final String createAnswerTableSql = + "CREATE TABLE IF NOT EXISTS ANSWERS ( " + + "ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED," + + "answerId AS 'UID' + RIGHT('00000000' + CAST(ID AS VARCHAR(8)), 8) PERSISTED," + + "postId SERIAL NOT NULL, " + + "answer VARCHAR, " + + " FOREIGN KEY ( postId ) REFERENCES POST.postId, PRIMARY KEY (answerId) );"; + + conn.createStatement().executeUpdate(createProfileTableSql); + conn.createStatement().executeUpdate(createPostTableSql); + conn.createStatement().executeUpdate(createAnswerTableSql); } } // [END gae_java8_mysql_app] From a8b87a8c13fb455afedf1872a9a7eeafd8d2710e Mon Sep 17 00:00:00 2001 From: Edwin_Carvajal Date: Fri, 19 Apr 2019 21:22:10 -0400 Subject: [PATCH 5/7] Final commit before changing branches to deploy barebones master branch --- .idea/workspace.xml | 22 ++-- .../codeu/servlets/CloudSqlServlet.java | 112 ++++++++++-------- 2 files changed, 73 insertions(+), 61 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index fbebf30..9276cf4 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,9 +2,7 @@ - - @@ -14,6 +12,10 @@ + + @@ -37,8 +39,8 @@ - - + + @@ -85,6 +87,8 @@ buildMessageDiv fetch conn + response + request @@ -122,8 +126,8 @@ - + @@ -289,9 +293,9 @@ - + - + @@ -480,8 +484,8 @@ - - + + diff --git a/src/main/java/com/google/codeu/servlets/CloudSqlServlet.java b/src/main/java/com/google/codeu/servlets/CloudSqlServlet.java index 4d9fac3..8d098e8 100644 --- a/src/main/java/com/google/codeu/servlets/CloudSqlServlet.java +++ b/src/main/java/com/google/codeu/servlets/CloudSqlServlet.java @@ -20,6 +20,7 @@ import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; +import java.sql.ResultSet; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; @@ -50,22 +51,32 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp) PrintWriter out = resp.getWriter(); resp.setContentType("text/plain"); - if (request.getParameter("getQuestion") != null) { + if (req.getParameter("getQuestion") != null) { // Perform get Question. - final String selectQuestionSql = "SELECT postId " - + "FROM POST " - + "WHERE header = '" + req.body.header + "'"; + final String selectQuestionSql = + "SELECT postId " + "FROM POST " + "WHERE header = '" + req.body.header + "'"; - try(ResultSet rs = conn.prepareStatement(selectQuestionSql).executeQuery()){ - System.out.println("Query successfully completed"); - String queryResult = rs.getString(1); - resp.body.queryResult = queryResult; + try (ResultSet rs = conn.prepareStatement(selectQuestionSql).executeQuery()) { + System.out.println("Query successfully completed"); + String queryResult = rs.getString(1); + resp.body.queryResult = queryResult; - }catch(SQLException e){ - throw new ServletException("SQL error", e); + } catch (SQLException e) { + throw new ServletException("SQL error", e); } - } + } else if (req.getParameter("getMember") != null) { + // Perform get Member. + final String selectMemberSql = + "SELECT profileId " + "FROM PROFILE " + "WHERE email = '" + req.body.email + "'"; + try (ResultSet rs = conn.prepareStatement(selectMemberSql).executeQuery()) { + System.out.println("Query successfully completed"); + String queryResult = rs.getString(1); + resp.body.queryResult = queryResult; + } catch (SQLException e) { + throw new ServletException("SQL error", e); + } + } } @Override @@ -77,45 +88,44 @@ public void doPost(HttpServletRequest req, HttpServletResponse resp) return; // ignore the request for favicon.ico } - - if (request.getParameter("saveAnswer") != null) { + if (req.getParameter("saveAnswer") != null) { // Perform save Answer. final String createAnswerSql = - "INSERT INTO ANSWERS (postId, answer) " + - "VALUES ( " + - req.body.postID + ", " + - req.body.answer + " )"; - - try(ResultSet rs = conn.prepareStatement(createAnswerSql)){ + "INSERT INTO ANSWERS (postId, answer) " + + "VALUES ( " + + req.body.postID + + ", " + + req.body.answer + + " )"; + + try (ResultSet rs = conn.prepareStatement(createAnswerSql)) { System.out.println("Query successfully completed"); conn.createStatement().executeUpdate(createAnswerSql); - }catch(SQLException e){ + } catch (SQLException e) { throw new ServletException("SQL error", e); } - } - else if (request.getParameter("saveQuestion") != null) { + } else if (req.getParameter("saveQuestion") != null) { // Perform save Question. final String createQuestionSql = - "INSERT INTO POST (memberId, header, pointTotal) " + - "VALUES ( " + - req.body.memberId + ", " + - req.body.header + ", " + - req.body.pointTotal + " )"; - - try(ResultSet rs = conn.prepareStatement(createQuestionSql)){ + "INSERT INTO POST (memberId, header, pointTotal) " + + "VALUES ( " + + req.body.memberId + + ", " + + req.body.header + + ", " + + req.body.pointTotal + + " )"; + + try (ResultSet rs = conn.prepareStatement(createQuestionSql)) { System.out.println("Query successfully compiled"); conn.createStatement().executeUpdate(createQuestionSql); - }catch(SQLException e){ + } catch (SQLException e) { throw new ServletException("SQL error", e); } - } - - - } @Override @@ -127,27 +137,24 @@ public void doPut(HttpServletRequest req, HttpServletResponse resp) return; // ignore the request for favicon.ico } - - if (request.getParameter("updatePoints") != null) { + if (req.getParameter("updatePoints") != null) { // Perform save Answer. final String updatePointsSql = - "UPDATE POST " + - "SET ( pointTotal = " + - req.body.pointTotal + " )" + - "WHERE postId = " + - req.body.postId; - } - - try(ResultSet rs = conn.prepareStatement(updatePointsSql)){ - System.out.println("Query successfully compiled"); - conn.createStatement().executeUpdate(updatePointsSql); + "UPDATE POST " + + "SET ( pointTotal = " + + req.body.pointTotal + + " )" + + "WHERE postId = " + + req.body.postId; + + try (ResultSet rs = conn.prepareStatement(updatePointsSql)) { + System.out.println("Query successfully compiled"); + conn.createStatement().executeUpdate(updatePointsSql); - }catch(SQLException e){ - throw new ServletException("SQL error", e); + } catch (SQLException e) { + throw new ServletException("SQL error", e); + } } - - - } @Override @@ -165,7 +172,8 @@ public void init() throws ServletException { + "ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, " + "profileId AS 'UID' + RIGHT('00000000' + CAST(ID AS VARCHAR(8)), 8) PERSISTED, " + "first VARCHAR NOT NULL, " - + "last VARCHAR NOT NULL, isCPA BIT not NULL, " + + "last VARCHAR NOT NULL, isCPA BIT NOT NULL, " + + "email NVARCHAR NOT NULL, " + "PRIMARY KEY (profileId) );"; final String createPostTableSql = "CREATE TABLE IF NOT EXISTS POST ( " From 915f0e35dacfbbc7414fefe7f4b28c52766993ec Mon Sep 17 00:00:00 2001 From: Edwin_Carvajal Date: Thu, 25 Apr 2019 12:51:22 -0400 Subject: [PATCH 6/7] CodeU Snippet commit --- .idea/workspace.xml | 103 +++++------------- pom.xml | 2 +- .../codeu/servlets/CloudSqlServlet.java | 17 ++- 3 files changed, 44 insertions(+), 78 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 9276cf4..ad7215a 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,7 @@ - + @@ -19,19 +19,16 @@ - - - - - - - - - - + - - + + + + + + + + @@ -39,8 +36,8 @@ - - + + @@ -48,38 +45,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -126,8 +91,8 @@ - + @@ -202,21 +167,6 @@ - - - - - - - - - - - - - - -