From 4e6a091c98ef3521040300153c5ddfb72dc6496a Mon Sep 17 00:00:00 2001 From: Gary <3489015381@qq.com> Date: Tue, 7 Jan 2025 21:25:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=BB=9F=E4=B8=80=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E7=BB=93=E6=9E=84=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 + .../java/com/gary/exercise/dto/ActionDto.java | 11 +- .../com/gary/exercise/enums/LakerPlayer.java | 34 +++ .../com/gary/exercise/enums/WolfPlayer.java | 4 + .../exercise/service/ExerciseService.java | 49 ++++ .../service/impl/ExerciseServiceImpl.java | 233 +++++++++++++++++- .../socket/ExerciseWebSocketHandler.java | 51 ++-- src/main/resources/exercise.xlsx | Bin 10380 -> 8038 bytes .../exercise/ExerciseApplicationTests.java | 17 +- .../com/gary/exercise/dto/ActionDto.class | Bin 2828 -> 5018 bytes .../exercise/service/ExerciseService.class | Bin 458 -> 1150 bytes .../service/impl/ExerciseServiceImpl$1.class | Bin 943 -> 943 bytes .../service/impl/ExerciseServiceImpl.class | Bin 4792 -> 9284 bytes .../socket/ExerciseWebSocketHandler.class | Bin 7303 -> 7400 bytes target/classes/exercise.xlsx | Bin 10380 -> 8038 bytes .../exercise/ExerciseApplicationTests.class | Bin 858 -> 1642 bytes 16 files changed, 358 insertions(+), 44 deletions(-) create mode 100644 src/main/java/com/gary/exercise/enums/LakerPlayer.java create mode 100644 src/main/java/com/gary/exercise/enums/WolfPlayer.java diff --git a/README.md b/README.md index c323144..2628825 100644 --- a/README.md +++ b/README.md @@ -1 +1,4 @@ # 解析excel 然后设置定时任务发送给前端消息内容 +使用websocket和前端进行连接 websocket地址 +ws://localhost:8080/exercise +# 这个行的顺序是从0开始的 diff --git a/src/main/java/com/gary/exercise/dto/ActionDto.java b/src/main/java/com/gary/exercise/dto/ActionDto.java index 71a52c9..98d11f6 100644 --- a/src/main/java/com/gary/exercise/dto/ActionDto.java +++ b/src/main/java/com/gary/exercise/dto/ActionDto.java @@ -8,7 +8,12 @@ import lombok.Data; */ @Data public class ActionDto { - private String human; - private String action; - private String description; + private String leftMinute; + private String leftSecond; + private String whichTeamAttack; + private int lakerScore; + private int wolfScore; + private String action; + private String getScoreType; + private Boolean isGetSocre; } diff --git a/src/main/java/com/gary/exercise/enums/LakerPlayer.java b/src/main/java/com/gary/exercise/enums/LakerPlayer.java new file mode 100644 index 0000000..6f43090 --- /dev/null +++ b/src/main/java/com/gary/exercise/enums/LakerPlayer.java @@ -0,0 +1,34 @@ +package com.gary.exercise.enums; + +import lombok.Data; + +import java.util.Arrays; + +public enum LakerPlayer { + AUSTIN_REAVES("奥斯汀-里维斯"), + DANGELO_RUSSELL("德安杰洛-拉塞尔"), + LEBRON_JAMES("勒布朗-詹姆斯"), + RUI_HACHIMURA("八村塁"), + ANTHONY_DAVIS("安东尼-戴维斯"), + GABE_VINCENT("盖布文森特"), + TORIAN_PRINCE("道尔顿-克内克特"), + MAXWELL_HEIDT("马克斯-克里斯蒂"), + BRONNY_JAMES("布朗尼-詹姆斯"); + + private final String chineseName; + + LakerPlayer(String chineseName) { + this.chineseName = chineseName; + } + + public String getChineseName() { + return chineseName; + } + + public static LakerPlayer searchLakerPlayerFormText(String text) { + return Arrays.stream(values()) + .filter(player -> text.contains(player.getChineseName())) + .findFirst() + .orElse(null); // 返回 null 表示未找到匹配项 + } +} diff --git a/src/main/java/com/gary/exercise/enums/WolfPlayer.java b/src/main/java/com/gary/exercise/enums/WolfPlayer.java new file mode 100644 index 0000000..3fd0a88 --- /dev/null +++ b/src/main/java/com/gary/exercise/enums/WolfPlayer.java @@ -0,0 +1,4 @@ +package com.gary.exercise.enums; + +public class WolfPlayer { +} diff --git a/src/main/java/com/gary/exercise/service/ExerciseService.java b/src/main/java/com/gary/exercise/service/ExerciseService.java index 503c36e..f7d6433 100644 --- a/src/main/java/com/gary/exercise/service/ExerciseService.java +++ b/src/main/java/com/gary/exercise/service/ExerciseService.java @@ -1,6 +1,9 @@ package com.gary.exercise.service; +import com.gary.exercise.dto.ActionDto; + import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -20,7 +23,53 @@ public interface ExerciseService { + /** + *从一行数据汇总获取湖人队的数据 + */ + String getLakerAction(ArrayList rowData); + /** + *从一行数据汇总获取森林狼队的数据 + */ + String getWolfAction(ArrayList rowData); + + /** + *判断当前回合哪个队在进攻 用1表示湖人 用0表示森林狼 用rowIndex表示当前回合数 + */ + String getActionTeam(int rowIndex) throws IOException; + + /** + *获取剩余的分钟数 + */ + String getLeftMinute(int rowIndex) throws IOException; + /** + *获取剩余的秒数 + */ + String getLeftSecond(int rowIndex) throws IOException; + /** + *封装统一返回结构返回给前端 + */ + ActionDto getResult(int rowIndex) throws IOException; + /** + *获取当前的湖人队比分 + */ + int getLakerScore(int rowIndex) throws IOException; + /** + *获取当前森林狼队比分 + */ + int getWolfScore(int rowIndex) throws IOException; + /** + *获取当前回合的得分类型 + */ + String getScoreType(int rowIndex) throws IOException; + /** + *判断球员是否得分 + */ + Boolean isGetScore(int rowIndex) throws IOException; + /** + *获取当前球队的action + */ + String getAction(int rowIndex) throws IOException; } diff --git a/src/main/java/com/gary/exercise/service/impl/ExerciseServiceImpl.java b/src/main/java/com/gary/exercise/service/impl/ExerciseServiceImpl.java index f7188b1..e4a726e 100644 --- a/src/main/java/com/gary/exercise/service/impl/ExerciseServiceImpl.java +++ b/src/main/java/com/gary/exercise/service/impl/ExerciseServiceImpl.java @@ -1,6 +1,7 @@ package com.gary.exercise.service.impl; import com.gary.exercise.config.FileConfig; +import com.gary.exercise.dto.ActionDto; import com.gary.exercise.service.ExerciseService; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -11,18 +12,17 @@ import java.io.FileInputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.*; + @Service public class ExerciseServiceImpl implements ExerciseService { - private final FileConfig fileConfig; public ExerciseServiceImpl(FileConfig fileConfig) { this.fileConfig = fileConfig; } - /** * 获取单元格的值,并转换为字符串 */ @@ -32,26 +32,33 @@ public class ExerciseServiceImpl implements ExerciseService { } return switch (cell.getCellType()) { case STRING -> cell.getStringCellValue(); + case BOOLEAN -> String.valueOf(cell.getBooleanCellValue()); + case FORMULA -> cell.getCellFormula(); + case BLANK -> ""; case NUMERIC -> { + // 检查是否为日期格式 if (DateUtil.isCellDateFormatted(cell)) { - yield new SimpleDateFormat("yyyy-MM-dd").format(cell.getDateCellValue()); + // 将日期格式化为字符串 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm"); + yield dateFormat.format(cell.getDateCellValue()); + } else { + // 处理数字类型 + yield String.valueOf(cell.getNumericCellValue()); } - yield String.valueOf(cell.getNumericCellValue()); } - case BOOLEAN -> String.valueOf(cell.getBooleanCellValue()); - case FORMULA -> cell.getCellFormula(); - case BLANK -> ""; default -> "UNKNOWN"; }; } + /** - * 读取 Excel 文件中一行的数据 + * 读取 Excel 文件中一行的数据 将每一个单元格使用List进行存储 + * * @param rowIndex 行号(从 0 开始) * @return 返回一行数据的列表 * @throws IOException 如果文件读取失败 */ @Override - public List readRow( int rowIndex) throws IOException { + public List readRow(int rowIndex) throws IOException { List rowData = new ArrayList<>(); String filePath = fileConfig.getFilePath(); String sheetName = fileConfig.getSheetNumber(); @@ -72,19 +79,221 @@ public class ExerciseServiceImpl implements ExerciseService { return rowData; } + @Override + public Map processRow(int rowIndex) throws IOException { + return Map.of(); + } + + @Override + public String getLakerAction(ArrayList rowData) { + if (rowData.size() != 4) + return null;//说明表示第一节 第二节 没有数据 + else { + if (rowData.get(3).isEmpty() && rowData.get(1).isEmpty()) { + //第一行和第二行的数据都是空 说明没有动作 + return null; + } + return rowData.get(1);//直接返回第一行的数据 + } + } + + @Override + public String getWolfAction(ArrayList rowData) { + if (rowData.size() != 4) + return null;//说明表示第一节 第二节 没有数据 + else { + if (rowData.get(3).isEmpty() && rowData.get(2).isEmpty()) { + //第一行和第二行的数据都是空 说明没有动作 + return null; + } + return rowData.get(3);//直接返回第三行的数据 + } + } + @Override + public String getActionTeam(int rowIndex) throws IOException { + ArrayList rowData = (ArrayList) this.readRow(rowIndex); + String lakerAction = this.getLakerAction(rowData); + System.out.println(lakerAction); + String wolfAction = this.getWolfAction(rowData); + System.out.println(wolfAction); + if(Objects.equals(lakerAction, " ") &&!wolfAction.isEmpty()){ + return "wolf"; + }else if (!lakerAction.isEmpty()&& Objects.equals(wolfAction, " ")){ + return "laker"; + } + return "null"; + } + /** + * 获取剩余的分钟数 + * + * @param rowIndex + */ + @Override + public String getLeftMinute(int rowIndex) throws IOException { + ArrayList rowData = (ArrayList) this.readRow(rowIndex); + String time = rowData.get(0); // 假设时间在第一列 + String minute = ""; + + // 使用 ":" 分割时间字符串 + String[] parts = time.split(":"); + if (parts.length > 0) { + minute = parts[0]; // 提取分钟部分 + } + + return minute; // 返回分钟 + } + /** + * 获取剩余的秒数 + * + * @param rowIndex + */ + @Override + public String getLeftSecond(int rowIndex) throws IOException { + ArrayList rowData = (ArrayList) this.readRow(rowIndex); + String time = rowData.get(0); // 假设时间在第一列 + String second = ""; + + // 使用 ":" 分割时间字符串 + String[] parts = time.split(":"); + if (parts.length > 1) { + second = parts[1]; // 提取秒数部分 + } + + return second; // 返回秒数 + } + + /** + * 封装统一返回结构返回给前端 + * + * @param rowIndex + */ + @Override + public ActionDto getResult(int rowIndex) throws IOException { + ActionDto actionDto = new ActionDto(); + String leftMinute = this.getLeftMinute(rowIndex); + System.out.println(leftMinute); + String leftSecond = this.getLeftSecond(rowIndex); + System.out.println(leftSecond); + String whichTeamAttack = this.getActionTeam(rowIndex); + System.out.println(whichTeamAttack); + String action = this.getLakerAction((ArrayList) this.readRow(rowIndex)); + System.out.println(action); + int lakerScore=this.getLakerScore(rowIndex); + System.out.println(lakerScore); + int wolfScore=this.getWolfScore(rowIndex); + System.out.println(wolfScore); + String getScoreType = this.getScoreType(rowIndex); + System.out.println(getScoreType); + Boolean isGetSocre = this.isGetScore(rowIndex); + System.out.println(isGetSocre); + + actionDto.setIsGetSocre(isGetSocre); + actionDto.setGetScoreType(getScoreType); + actionDto.setLakerScore(lakerScore); + actionDto.setWolfScore(wolfScore); + actionDto.setLeftMinute(leftMinute); + actionDto.setLeftSecond(leftSecond); + actionDto.setWhichTeamAttack(whichTeamAttack); + actionDto.setAction(action); + System.out.println(actionDto); + return actionDto; + } + + /** + * 获取当前的湖人队比分 + * + * @param rowIndex + */ @Override - public Map processRow(int rowIndex) throws IOException{ - List rowData = readRow(rowIndex); + public int getLakerScore(int rowIndex) throws IOException { + List rowData = this.readRow(rowIndex); // 读取 Excel 数据 + System.out.println(rowData); + String data=rowData.get(2); + System.out.println(data); + // 使用 "- 分割时间字符串 + String[] parts = data.split("-"); + if (parts.length > 1) { + return Integer.parseInt(parts[0]); // 提取湖人队比分 + } + return 0; + } + /** + * 获取当前森林狼队比分 + * + * @param rowIndex + */ + @Override + public int getWolfScore(int rowIndex) throws IOException { + List rowData = this.readRow(rowIndex); // 读取 Excel 数据 + System.out.println(rowData); + String data=rowData.get(2); + System.out.println(data); + // 使用 "- 分割时间字符串 + String[] parts = data.split("-"); + if (parts.length > 1) { + return Integer.parseInt(parts[1]); // 提取森林狼队比分 + } + return 0; + } + /** + * 获取当前回合的得分类型 + * + */ + @Override + public String getScoreType(int rowIndex) throws IOException { + String action = this.getAction(rowIndex); + // 检查是否包含 "三分" 或 "两分" + if (action.contains("三分")) { + return "三分"; + } else if (action.contains("两分")) { + return "两分"; // 如果有明确的两分投篮 + } + // 其他得分类型 + if (action.contains("篮板")) { + return "篮板"; + } else if (action.contains("抢断")) { + return "抢断"; + } else if (action.contains("罚球")) { + return "罚球"; + } else if (action.contains("盖帽")) { + return "盖帽"; + } else if (action.contains("犯规")) { + return "犯规"; + } + return "未知"; // 如果没有匹配的类型 + } + /** + * 判断球员是否得分 + * + */ + @Override + public Boolean isGetScore(int rowIndex) throws IOException { + String action = this.getAction(rowIndex); + return action.contains("命中") && !action.contains("不中"); + } - return Map.of(); + /** + * 获取当前球队的action + * + * @param rowIndex + */ + @Override + public String getAction(int rowIndex) throws IOException { + String whichTeamAttack = this.getActionTeam(rowIndex); + if (whichTeamAttack.equals("laker")) { + return this.getLakerAction((ArrayList) this.readRow(rowIndex)); + }else if (whichTeamAttack.equals("wolf")) { + return this.getWolfAction((ArrayList) this.readRow(rowIndex)); + } + else return ""; } diff --git a/src/main/java/com/gary/exercise/socket/ExerciseWebSocketHandler.java b/src/main/java/com/gary/exercise/socket/ExerciseWebSocketHandler.java index 973e93c..cc292b3 100644 --- a/src/main/java/com/gary/exercise/socket/ExerciseWebSocketHandler.java +++ b/src/main/java/com/gary/exercise/socket/ExerciseWebSocketHandler.java @@ -57,34 +57,35 @@ public class ExerciseWebSocketHandler implements WebSocketHandler { // 接收客户端的消息 String clientMessage = ((TextMessage) message).getPayload(); System.out.println("收到消息: " + clientMessage); - - // 启动一个线程来每秒发送一行数据 - new Thread(() -> { - try { - int rowIndex = 0; // 从第 0 行开始 - while (true) { - List rowData = exerciseService.readRow(rowIndex); // 读取 Excel 数据 - String rowString = String.join(", ", rowData); // 格式化为字符串 - session.sendMessage(new TextMessage(rowString)); // 发送给客户端 - - rowIndex++; // 移动到下一行 - Thread.sleep(1000); // 每秒发送一次 - - // 停止条件:到达 Excel 文件的末尾 - if (rowData.isEmpty()) { - session.sendMessage(new TextMessage("已到达文件末尾")); - break; - } - } - } catch (Exception e) { - log.error("发生错误: {}", e.getMessage()); + if(clientMessage.equals("可以发送消息!!!")){ + // 启动一个线程来每秒发送一行数据 + new Thread(() -> { try { - session.sendMessage(new TextMessage("发生错误: " + e.getMessage())); - } catch (IOException ioException) { + int rowIndex = 0; // 从第 0 行开始 + while (true) { + List rowData = exerciseService.readRow(rowIndex); // 读取 Excel 数据 + String rowString = String.join(", ", rowData); // 格式化为字符串 + session.sendMessage(new TextMessage(rowString)); // 发送给客户端 + + rowIndex++; // 移动到下一行 + Thread.sleep(3000); // 每秒发送一次 + + // 停止条件:到达 Excel 文件的末尾 + if (rowData.isEmpty()) { + session.sendMessage(new TextMessage("已到达文件末尾")); + break; + } + } + } catch (Exception e) { log.error("发生错误: {}", e.getMessage()); + try { + session.sendMessage(new TextMessage("发生错误: " + e.getMessage())); + } catch (IOException ioException) { + log.error("发生错误: {}", e.getMessage()); + } } - } - }).start(); + }).start(); + } } else { System.out.println("不支持的消息类型: " + message.getClass().getName()); } diff --git a/src/main/resources/exercise.xlsx b/src/main/resources/exercise.xlsx index 1ad14d3758d5cf140a72f22438de8a59f214755d..ab8928e632fa5850d7a4c4813a37755278a046d8 100644 GIT binary patch literal 8038 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 literal 10380 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 Vhl9*60Duhn_(L@Pn(o)P{|ACQJ^26t diff --git a/src/test/java/com/gary/exercise/ExerciseApplicationTests.java b/src/test/java/com/gary/exercise/ExerciseApplicationTests.java index 516034e..522b5f4 100644 --- a/src/test/java/com/gary/exercise/ExerciseApplicationTests.java +++ b/src/test/java/com/gary/exercise/ExerciseApplicationTests.java @@ -1,14 +1,14 @@ package com.gary.exercise; -import cn.hutool.core.io.resource.ClassPathResource; +import com.gary.exercise.config.FileConfig; +import com.gary.exercise.dto.ActionDto; +import com.gary.exercise.enums.LakerPlayer; import com.gary.exercise.service.ExerciseService; import com.gary.exercise.service.impl.ExerciseServiceImpl; -import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.io.IOException; -import java.util.List; -import java.util.Map; +import java.util.ArrayList; @SpringBootTest class ExerciseApplicationTests { @@ -23,6 +23,15 @@ class ExerciseApplicationTests { public static void main(String[] args) throws IOException { + FileConfig fileConfig =new FileConfig(); + ExerciseService exerciseService = new ExerciseServiceImpl(fileConfig); + ArrayList list= (ArrayList) exerciseService.readRow(12); + /* String whichTeamAttack= exerciseService.getActionTeam(6); + System.out.println(whichTeamAttack);*/ + ActionDto result= exerciseService.getResult(6); + System.out.println(result); + + } } diff --git a/target/classes/com/gary/exercise/dto/ActionDto.class b/target/classes/com/gary/exercise/dto/ActionDto.class index 20c301e9d332ed8f0498a8ad51235d093f97fc58..4302783147bedb8c3f4fc5938623e0d43532c944 100644 GIT binary patch literal 5018 zcmb7IU2_{(8Gcrlv@3aKD^6@zO`0#<;ICACrgR+#r_M*!+HQzL0&Re-<&C9S-gTvQ z(omp4pp*_5Ty_{{xL}4{kQv&UCY{Lz12<)cD~1b(Kf)E1^1S;Y9Z3r|GhUzfyzg_K zJ?A~odC%H^{`ceG1DMA<-msf@%g*agvs!OC<#pdHpRM|J&pqdR8uAV2roUWwcYH^~ z$Wn)X)o<3_jX5D4GBGS{0e01?dhWWo_n8z;-?0|_;jL8st z(`l|&y(a0kiiDmpQIb&Zj@P&uM8td0#33Qe+QHn!b=braahV&AAKnk}`9qwj%M9CZ3VFOzB!YeF=QV#Aorja9~B5)#&7u@~+OjQuu<2FUq{Kj!dd0 zB+r`o5}u3Ru58PJE|O?tWWbz>)9Qe5ZzOWY#Fr&9A`|W29toc{@w|j{42NP6?>Q6a z#XC&zMJ4B=!HXtdkd+%XyH#8C)}0aR^FIP1EeZ_DW-!^l#@+gkHB%NHHjY1+QC&LM>s zrKN0cml&fNPhI6nUv~VOw|>cP+FOqAG|3ka4Y!&6r0Ut+2&70iJy{VtQ?RjOx$*3V z8_%@RR<}FkP*psp?qWOBWYt(f)S?j`CJhxpcX* ze4Zz}>9lqltk8p9s~wzBmlgKn`4=bp=BQ7^6Dmw}zt`}+P%o^6tKLqt>RhOcsE5Lh zWqE%_$~mRPE%RG`)7}m>)f&#?yLo&MZ|eBI9N`~mnCMjgx_jH(bjl%jc&aaO4qo%F zhIdsZM8J^r1>0S3IIW2#&)eMDo>PuyBx=ReHBhR00{m44AJ=Hb6;UkOjmB!-cjgS- z)9^-n<&&Kp&ugAs{U(&DAg1u7ROkqQ>?x6n|C~|l-$li%j-C3dG!V@@7bW`%^I}4 zPJ@=WC)-i*oFdEd%j}ie)7WOFKZN#v09)bjY~ak{W!h#4z$JWzy~|N_m8~WhS0B*_ z(BES)g$~i+u0*`h5{L@DMCPtUy#Er2ioHaIU5WTbkU+HmLC?~Lb|vDcLjuuwFVXO> zM7+Bbh@R|ST5(q*UiS$^PxTV*+m(nPKM6!fdx=JNCAxyIVjvKtMM4pJc6#O^^khYj zg@{OzqE=X8JeCq#w-u5ymf&8F(=B2N=t< z(~mF_bZJb^^7)m-*qLQ#Htv*H*ehGa=orpZHs}^7sob z&}*~A{0$3e&@%B4Ud~&z3iu}u!lg9?kMmu@xNiIlLplu8{1{_8Qv5NrkMTrk=Ke1; zu5LGaM3k04bR&&E$HhzW%!qn=FPJcAVeQPsIb#;qIODcN*Lv7B`TLKY{8mU^XPYDY zqu&HL~+EgiqcIPTCgL<-t*n4d6> zX&r{9ar2>RpOCE6Pl;m`nHUgb(%r5ImQ`RKWUn^@>)qfEJ|PedG5UsdMkU9hf&3p- zxIp67pJ2Ud`4?4kn8SN+?AP0$D3_Q+`9eKGah>90@e!d-@{zK*z-N(9`7tU$@27|Q n340>iVf7Ps0C&lq!ng4TTY1xW`1}w*VlPkY$M^|;iqd}o`0b2_ literal 2828 zcma)8%W@k<6g@4?OY+!OM4UtvjC&tc$*Mhd(Wlb#2n3+*X zJ|cUH4%3GmVUaW_X=Uxdt2EEa4ahD-q+h^VgeaGFdO0E$bqmszr(H0pxVk0j@Lt7%K z`_8VU%2NEOjWHZ!uu3^$Tx#EJE%+8-HE4}+%OK3a2JakJgp6#i|# z*`$2(HLuQ_ce(G#c^uTjhC>-l)DCH6mEq)i+YOzTSaBaXfkPCFuIq(dwucziY?k=1zq(Iv?{J~>Mj{>RfG+1YmNK7B|_m7Rfcvc(Mf6=C!}UzTByO zt5+$n6*7=7f_76Lna&%{Vu#)?9-y&8Pl-SYZ+LCLF0MJUNh7LoIy&d%c_Do+dtMlX zKHpVB1)~O5v$%;{Cf200K4U2EA1%jy;O&UA;#Ow6Mk#pyBZlvjHj9CZbeX$bO%W7p zp10H9t@b-D5jn8&_M=@f0RB}1-#M0vP)xDJo6QX;6jciw45e=6lTq{L*~}Rwo*X5_ zn`cwhycL&hw$$W7AOaI)q_ce@464n<=M3Zj52gMoAuvIQK1D}3O`mk%(I_RatLRC0 z6g`JP&Vxbm8Jd-8#^|X}{|5GR1e>K#BMN44j>fhE5cE9F-i=o;(38mdxm_N~C z3j0JuhZ51K5sp zCD^9*4@OK_FL2C6ivBG20w>fklN@%eaj{2SP5x$xohP%C&eNr;vZ&;tQbj4_>D{7q zDn)LKjaTVmXYxy*Xvo*>96b#py_2iXY4cHoPUWf%YLAsGJ%Ks9hvGLfK3>t}LP3jH zEZH=*G*Qu`CF)nS$tvj4(y75MSWqvFvrS_im$5|I>R7`S8l{lMr?^TLr0Ivt1(II2 zU;)Re4YCDN-`2)g_rJYr4%G8XcZ|D6-Mgwc0IUD9dER|Cdse$p&!tX zsygd95ov5cSl+puGiT4vpTEC;1Hdu74Pb%6k<>jN3p3(4L?e|&ZqeK-iTu1sgyT4X z27`?oaVvNt(wJX-zd`931O`QPsRsgNi$U{zD6#L9PHg}y)RlKA z&D$5#3K4hF{m{`@VMGrd8p~kW=s`P;aL8aKRBS|}{CKFp6-qdqk?mHkpA80^l9{iJn* zA|-0CW^%)3s52w+vq}iQ{oj(l_sg}!fWbXla)343*+p2QD4?i8`DJL*X_3Kw`mNHp zkT@hLp3rhN`Cs*5k{im&Qs SzJ@o|w0o6EvVA{y`rscl9rPRk delta 40 vcmeyzaf+Gi)W2Q(7#J9A8H6`-*)dK&$fV22H2FP~7Z(E~gCJ0Xi9rYe4{QnS diff --git a/target/classes/com/gary/exercise/service/impl/ExerciseServiceImpl$1.class b/target/classes/com/gary/exercise/service/impl/ExerciseServiceImpl$1.class index c90b791d118d7f596ff4dbe6df1686b3e1bc9592..c3464d22c0937d8fac7d8bfc7e18548dd775f621 100644 GIT binary patch delta 78 zcmZ3_zMg$UA)}*{zrT;GqaP;&6N5AlgA9WJBLlmee~@pek0VG-j)y@WB*yCGez~Py(y+3-xsk@^s$3iSaKZ04#M52LJ#7 delta 78 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 V*HxiESfHw&0vG2ee&zz@{{qy<=>Y%$ diff --git a/target/classes/com/gary/exercise/socket/ExerciseWebSocketHandler.class b/target/classes/com/gary/exercise/socket/ExerciseWebSocketHandler.class index a2c4991e4decab2780df9f15a99cd6e2e5843b86..6d3dcdbefefa3737844526f6d497aded6d5986a9 100644 GIT binary patch delta 2589 zcmaJ@4OCRu5&q`w?t5={9|*fF;v$MD2(pMJ=U{+nVuCdq#9BlHMa^PXgQ6fT8cpn~ zG5#d2Mz2ZBX=0M5N*YrUNEX;liP5xaY;78wroTy>RuEg;q)mS<37z|PLv7D#&w)Gl zXJ+oq_s!h5`$~pO9Opld3;>uzGrJrQSwcE)CZrD@>bw*^K6vQxm7TkW!uyAIb-w@7 zuGpUgWteB+R@_EV1Do6YjjaSvZpC{47Jp%*f780cCH3nAYl3BYwHoFVlKy?L?4Fi@ z|85s7SYY6GEF@T3+BOlk=T@v~+E}>G-?B}#YtF-Ulf(y>g?c&eFknN4m}i~nEk~t+ zB~S^r)}X&7=zxNy20n`_vDG@&UXA4%Rv5TbJY&tae-3pTRvK6(-n8bacNxfr|A_78 ztThJiMu6jPXkF4A;F~SEd9`+|!#x@r46Mfn;kPxZ8x3qilX%-USKVx&1+BuX7OQR2 z%@(m-tx@kaunpVAi)xPZe(ccjc>^Kr6hrD9=WaZpVUK|a5fC%ADX!hvXJ9`{3D!-4 zdxIJt5`Hbsa{zTNXt>LXgE*w&5d(*DL>$yAla3M;U#3L)F#})1m&H|Wso&Y>Ksg>a z@C1%Y1R4W@X7-r7C~vtFPvL0|Up4TIOfAubyDiwzSXj}}8YE~9t@AfF2e;`s&O8nF zb`S19Jv=Zl^w_>j(eTjYCkIatXy_2fbg%k#1JB{47|=6vzQM#X{g;nEdF5#PaA#*} z=6yRHIDtARPNPdhw}BqKAjn?f>_wl3eghFi#hvzQ8t6G?uU8ZQ?7&~}R}FuYu>D<3 zN_sWx8duheKz&uynhk;A@XN=B4jz~BL?f3^K3tkfI!1&wdG5523FC&2hB?ky>G9Dx z=G{R=ibfWLtYqt1o2*l!?to5q14DRSC#SgIl}QQW30E2B7T=`5VbcUfCQ9=?YQ?D+evW#yd{pSU}3x_bjZfQqv`zsko}maFn# zgJ$WY3?ECYl&_$m9kYFBP!PuKGbpRj#DN&Ty%*c=6(?Bm4 zg|WB;9@g}Q@tH7|MNnhvcbRd#&0`{Lx;BE@8p^IgNrr?ahrvj~jTnzoWN|0V#7&ru zxtNa?{BG3X4%A{L>P)z1aJX5>3E@pnP@=hNEd5pS^yS_~{E*Xsi_ayNv7I0N2Ou$; zevF^+X%duF7C&V+SeXTW#{UVDX}O4vk`TMXcYwV!Erg%r7bYu(VnAG|r2$~68AFg5s z=rWa?`I^m0VXcX1yDqQ{8CZzD$;yrupq#zO(aXqE|6gG5u@T|doHUt%`B+N26wC8+ zG;deUo$cn0F*21n6olWv$6B0H0j_Y6Ha4o}_`}%RkNXIVef`)a$+(p#dx@Jev9f^q z5g(>yhaQgL3ueL{qtPzDBNxRe!GSnMS+I`4(6D=yudr&+nJr#vT)?E^z<4fRGrBA$ z6Z|=tjGgRZH~V;yy*$9w?!i**!!rIF$X=CoTgG5q!XVEkqbOuzB`dgkjM-|gtP31U zy!S71Wh(Nu<1NmS4#rd5Yne0S1!xod@kIrdE>X~jM@y~wQ54inu=ZkBKW+5)*TP{{{g{BqYcIkZx_u$zmiqmR(@lp@mvSG<&S^oTB9kxtOau9z* z;@11Q4Um2boUSi!=K$`1sQhsM(cOuz@cR`5ssiRDfFik5uHj{gBU{?i;k Y!YG@mq>(Du?u?Q8JnfG;=R4-)Xm zy>oKLwi(V#9}Im9zC0v8wJq6e%y z>;_!o!iP)MJyt<}11@(l8-4-by3V$>oem6K;i3_9)gfzgpcz+6%yV&-de15iv|@q8 zLKj!7LSKb{k&99+R*k+{B}-g<5=#aAE7vuziLDke%PSTI(1zY#RO{9w2WeP%$Js4U$MYJ9zNw_6+W%5_t*J5wD&b?w?FD%>tY=`m5^l_ z>#;%NCKoqjqd=Al$}BZomZfdNtrEAnh-0bRD2qdzu-V1!m?>bbj@{HLu|@5Xd3jw} z5Q4;_G;GJ`B<^%^7w#6Q*l~Y_^4lfBdj*V0k%M~N?_viYP}A*s<>pBT4fukKFXBrY zrB$)m8u~4tQ?Vco58}%b54rdX1NYj6;t_Ss&KHlWckF!sV=f-Y6Uqq`mi4eH$M4(m z_RdF6?d(3eckj%iTW)o*3-s`HJSFk8i#_;;nj2_L>qVbLzl&$^P4#%7)f&(+?ek4i zORPYDsq+bc#vdHKhd)aENh9=U)gC-7{;Fy+i^Sj6m6;7^{ZnAviJgh#+xMMFY(KG? zvBWq(PCNKFMkL;M@c~Br`!a2jVK}gb>Ef3-WDB2qF;pa^Iu)uD0aX;9F49yqTr1Mm z-Qme1sP=^`t&qS(b$%#U?FmXX5-zi|M7H*kqbjp5O3$-#*v88?92-Z~#;nWiiDDAL z6h-Q2)|6{XH0dIam@Li`2rq8@h@{Qewa1oq)=N=_V%Q|0z%9pFumI5EdpPfJxA^kwXno`&oROyOy*+f#)du1P|ch zc^snY0rgb&1>&H3H+#YgZCd2Hn>uDX6^HQxwIwR>9UP(K7pZ0OX4i-A4tws7;wAWT zfbtuBY;kX`Is$19h};Nwb~QKh9ICrgptGT`$U<_-0%bb(sc{< zA-QUx0|sM&-u2}V@gog3<%hUiP~Ewi@s=SbtIMn!#5DrlaI5-o?I5l<(1&n!0__Vm z0Hz0k4KacW$#OLW`2+;GmThSx49nTJ7#p+_)6hOvI#4@SaP3&Vwd~K2S)D|@%Im24 zv5uzleuMr6euAH-^1ji_n@nS}=>kn`R&`_utGxowOxN%d40#mjV3;+?;>)Z6oo6Ig zs1u7bf@W@#U|M>URp`ue{$FBmdWroEOPQVqG{RlC%`l(Vs~6qx-Q4U&Og7a>K_T#S zT5y1XYMf${J{q+${{(Iv#AgKNMh0<d&0pX)4r`nqHq*xzdbypg?ZP|; zXu-BItm+BITlfVNorKyXYd=P1GVBOb(UjwClWsvnzu$Pp8pXY-61SS?RXzh*Fon&RMx?|`JYlhn7#5ltpdv>ML}2#4$e?CZzwVbtYC_ao7d zu%1)lQBVJ!pbjl_f{x(lB4xduOw%--6BgsuxPsz%{`?-eQ8O$iP%xubSQN~U`of}c z{(vYR7Lyk(-7iX?_5A7=U8hfwBh$cj1!q6jPZDfX9K^( o@427LFU5>^na*FJ*S~q|KkzS_(Slj>R#@KZ_g33m9dC920~HnFr~m)} diff --git a/target/classes/exercise.xlsx b/target/classes/exercise.xlsx index 1ad14d3758d5cf140a72f22438de8a59f214755d..ab8928e632fa5850d7a4c4813a37755278a046d8 100644 GIT binary patch literal 8038 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 literal 10380 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 Vhl9*60Duhn_(L@Pn(o)P{|ACQJ^26t diff --git a/target/test-classes/com/gary/exercise/ExerciseApplicationTests.class b/target/test-classes/com/gary/exercise/ExerciseApplicationTests.class index 8019b435aa1b49884c005d7a6ca1a00dac91ec88..c4b1610c606a60147514d56425c41fcc137cb76a 100644 GIT binary patch literal 1642 zcmZ`(+foxj5IvJDSrZn4a8d9ADoPTN#T#CNXhhU#5Q|u;vV2;WA&hQzQo9p{Kk`+p zltQa4pZzGyo(+jW;>*mYyXSQG>68Bb=lf3p_pzEn3~>{Ng&rgr2HrUz9NTmJs=c=H zj=PE>u_%0@mKfrhY$b^kNSa7l=!M0Qb7jr0I>D~ZcX;56klQN4zyCgzIJx`M3pRo`G&aU?8j2A6j!W2WY%GEj#8y*dC zN`rK!-&E2rxOzU1mCPq`1=A)n7P814(Ls4PRJ=yxmkk0NX_h0T{VEW?Dl4kBmQP_8 zS53@Wurc4N?r02yS=TQ-pFlEAltVfr#u)l&SfO%!RdKuqkCQ?f!(2DUTO&KhU4&vR z%T3Zze@XcKWuvyigV)Z6N0xL+x{g8NSw1>7;1qZmvWx?S>}+v~GNx8`Twd3b3Qasaq=VvG+e1-h*$7;& z|C|ix{zvkhRyf1hdc#+u#w#KeG_->6OBF2@qH>`mgQ^{BSyi|6AU?|Ay}co&vK6fy zn>bT^N7>~l;t|>PCdy-y_D_t&6+>DtA^J+|bq0oOk@b4y?ZFMYZ<1w=ZXMsB+XKrP zUt#8EzM}7Q6nu-$Gz>b2=}aSu5uC&*7RWN%e1_Y&L%#?hO2=@QzI#ZabR}^QdBmeU zpXlx(+x!mgb5GG6O>epm2@dU8(rS&AX!(&6chb69y zJ&H7_(9}an-7YQK(sXjEV$jiS8(NUPOF&Lxhy^3XMP#Z6^4Uj_wK=~dJ^H!~1Pdc# R_^<0_sZqvbB59hQz!%$p6)*q*