From 5421662bffbcc48841a0bfec20c1014b1383695d Mon Sep 17 00:00:00 2001 From: 00fly <00fly@noreply.gitcode.com> Date: Sat, 26 Oct 2024 21:22:50 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8docker=20Web?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E4=B8=80=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md" | 42 ++++++ .../pom-deps.xml" | 82 ++++++++++++ .../pom-lib.xml" | 96 ++++++++++++++ .../pom.xml" | 124 ++++++++++++++++++ .../main/java/com/fly/simple/MainRun.java" | 35 +++++ .../java/com/fly/simple/TemplateRun.java" | 83 ++++++++++++ .../com/fly/simple/utils/FreeMarkerUtil.java" | 66 ++++++++++ .../com/fly/simple/utils/ShellExecutor.java" | 60 +++++++++ .../src/main/resources/log4j2.xml" | 13 ++ .../main/resources/templates/index.html.ftl" | 73 +++++++++++ 10 files changed, 674 insertions(+) create mode 100644 "\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/README.md" create mode 100644 "\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/pom-deps.xml" create mode 100644 "\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/pom-lib.xml" create mode 100644 "\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/pom.xml" create mode 100644 "\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/MainRun.java" create mode 100644 "\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/TemplateRun.java" create mode 100644 "\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/utils/FreeMarkerUtil.java" create mode 100644 "\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/utils/ShellExecutor.java" create mode 100644 "\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/resources/log4j2.xml" create mode 100644 "\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/resources/templates/index.html.ftl" diff --git "a/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/README.md" "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/README.md" new file mode 100644 index 0000000..805417c --- /dev/null +++ "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/README.md" @@ -0,0 +1,42 @@ +# 一、需求概况 +现有某云主机服务器,用来做项目演示用,上面运行了docker应用,现希望有一总览页面,用来展示部署的应用。 +# 二、业务流程 + +```mermaid +graph LR +A(获取docker信息)--> B(模板生成页面)--> C(挂载到nginx) + +``` +/usr/share/nginx/html/index.html + +任务调度采用`crontab` + +演示地址:[http://124.71.129.204](http://124.71.129.204/) + + + + + + +# 三、Java工程打包 + +## 1. 一体化可执行包 + +配置文件:pom-deps.xml + +## 2. 带外部依赖lib的可执行包 + +配置文件:pom-lib.xml + + +## 3. 执行命令 +```shell +#完整打包 +mvn clean package + +#一体化可执行包 +mvn clean package -f pom-deps.xml + +#带外部依赖lib的可执行包 +mvn clean package -f pom-lib.xml +``` \ No newline at end of file diff --git "a/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/pom-deps.xml" "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/pom-deps.xml" new file mode 100644 index 0000000..dcb862c --- /dev/null +++ "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/pom-deps.xml" @@ -0,0 +1,82 @@ + + + 4.0.0 + com.fly + docker-show + 0.0.1 + java-depend + http://maven.apache.org + jar + + + UTF-8 + UTF-8 + 1.8 + + + + org.freemarker + freemarker + 2.3.32 + + + org.apache.logging.log4j + log4j-slf4j-impl + 2.12.1 + + + org.apache.commons + commons-lang3 + 3.5 + + + org.projectlombok + lombok + 1.18.12 + provided + + + + ${project.artifactId} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + + + + maven-assembly-plugin + 3.5.0 + + false + + + com.fly.simple.TemplateRun + + + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + diff --git "a/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/pom-lib.xml" "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/pom-lib.xml" new file mode 100644 index 0000000..4feb584 --- /dev/null +++ "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/pom-lib.xml" @@ -0,0 +1,96 @@ + + + 4.0.0 + com.fly + docker-show + 0.0.1 + java-depend + http://maven.apache.org + jar + + + UTF-8 + UTF-8 + 1.8 + + + + org.freemarker + freemarker + 2.3.32 + + + org.apache.logging.log4j + log4j-slf4j-impl + 2.12.1 + + + org.apache.commons + commons-lang3 + 3.5 + + + org.projectlombok + lombok + 1.18.12 + provided + + + + ${project.artifactId} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.2 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + lombok + runtime + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + + true + lib + com.fly.simple.MainRun + + + ./ + + + + + + + diff --git "a/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/pom.xml" "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/pom.xml" new file mode 100644 index 0000000..65da686 --- /dev/null +++ "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/pom.xml" @@ -0,0 +1,124 @@ + + + 4.0.0 + com.fly + docker-show + 0.0.1 + java-depend + http://maven.apache.org + jar + + + UTF-8 + UTF-8 + 1.8 + + + + org.freemarker + freemarker + 2.3.32 + + + org.apache.logging.log4j + log4j-slf4j-impl + 2.12.1 + + + org.apache.commons + commons-lang3 + 3.5 + + + org.projectlombok + lombok + 1.18.12 + provided + + + + ${project.artifactId} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + + + + maven-assembly-plugin + 3.5.0 + + true + + + com.fly.simple.TemplateRun + + + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.2 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + lombok + runtime + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + + true + lib + com.fly.simple.MainRun + + + ./ + + + + + + + diff --git "a/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/MainRun.java" "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/MainRun.java" new file mode 100644 index 0000000..f22cf27 --- /dev/null +++ "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/MainRun.java" @@ -0,0 +1,35 @@ +package com.fly.simple; + +import java.io.IOException; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import com.fly.simple.utils.ShellExecutor; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class MainRun +{ + static ScheduledExecutorService service = new ScheduledThreadPoolExecutor(1); + + /** + * 线程池保证程序一直运行 + * + * @param args + */ + public static void main(String[] args) + { + service.scheduleAtFixedRate(() -> { + try + { + log.info("######## {}", ShellExecutor.getDockerInfo()); + } + catch (IOException e) + { + log.error(e.getMessage(), e); + } + }, 2, 10, TimeUnit.SECONDS); + } +} diff --git "a/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/TemplateRun.java" "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/TemplateRun.java" new file mode 100644 index 0000000..34839fc --- /dev/null +++ "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/TemplateRun.java" @@ -0,0 +1,83 @@ +package com.fly.simple; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.net.URL; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.SystemUtils; + +import com.fly.simple.utils.FreeMarkerUtil; +import com.fly.simple.utils.ShellExecutor; + +import freemarker.template.TemplateException; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class TemplateRun +{ + public static void main(String[] args) + throws IOException, TemplateException, InterruptedException + { + // Jar运行,必须提供参数server.net.ip + URL url = TemplateRun.class.getProtectionDomain().getCodeSource().getLocation(); + String ip = null; + if (url.getPath().endsWith(".jar")) + { + if (args.length > 0) + { + ip = Stream.of(args).filter(arg -> arg.contains("--server.net.ip")).map(arg -> StringUtils.substringAfter(arg, "=")).collect(Collectors.joining()); + log.info("JarPath: {}, ServerIp: {}", url.getPath(), ip); + } + if (StringUtils.isBlank(ip)) + { + log.error("please start jar like:\n java -jar docker-show-jar-with-dependencies.jar --server.net.ip=124.71.129.204"); + return; + } + } + + // 写入文件 + if (SystemUtils.IS_OS_WINDOWS) + { + File file = new File("index.html"); + creatPage(ip, file); + + // 打开页面10秒后删除文件 + Runtime.getRuntime().exec("cmd /c start /min " + file.getCanonicalPath()); + TimeUnit.SECONDS.sleep(10); + file.deleteOnExit(); + return; + } + if (SystemUtils.IS_OS_LINUX) + { + // crontab -e + // */30 * * * * java -jar /work/gitcode/docker-run/docker-show-jar-with-dependencies.jar --server.net.ip=124.71.129.204 + creatPage(ip, new File("/usr/share/nginx/html/index.html")); + } + } + + private static void creatPage(String ip, File file) + throws IOException, TemplateException + { + // 收集docker信息 + Map model = new HashMap<>(3); + model.put("date", new Date()); + model.put("map", ShellExecutor.getDockerInfo()); + model.put("ip", StringUtils.defaultIfBlank(ip, "127.0.0.1")); + + // {mysql5=[3306, 13306], mysql8=[23306], redis-server=[6379]} + String content = FreeMarkerUtil.renderTemplate("/templates/index.html.ftl", model); + try (FileWriter writer = new FileWriter(file)) + { + writer.write(content); + writer.flush(); + } + } +} diff --git "a/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/utils/FreeMarkerUtil.java" "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/utils/FreeMarkerUtil.java" new file mode 100644 index 0000000..540f36f --- /dev/null +++ "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/utils/FreeMarkerUtil.java" @@ -0,0 +1,66 @@ +package com.fly.simple.utils; + +import java.io.IOException; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.util.Map; + +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; + +/** + * + * FreeMarkers + * + * @author 00fly + * @version [版本号, 2017-4-4] + * @see [相关类/方法] + * @since [产品/模块版本] + */ +public class FreeMarkerUtil +{ + private static Configuration config; + + static + { + config = new Configuration(Configuration.VERSION_2_3_32); + config.setDefaultEncoding(StandardCharsets.UTF_8.name()); + } + + /** + * 获取模板填充model解析后的内容 + * + * @param template + * @param model + * @return + * @throws IOException + * @throws TemplateException + * @see [类、类#方法、类#成员] + */ + private static String renderTemplate(Template template, Map model) + throws TemplateException, IOException + { + StringWriter result = new StringWriter(); + template.process(model, result); + return result.toString(); + } + + /** + * 获取模板填充model后的内容 + * + * @param templatePath + * @param model + * @return + * @throws IOException + * @throws TemplateException + * @see [类、类#方法、类#成员] + */ + public static String renderTemplate(String templatePath, Map model) + throws TemplateException, IOException + { + config.setClassForTemplateLoading(FreeMarkerUtil.class, "/"); + Template template = config.getTemplate(templatePath); + return renderTemplate(template, model); + } +} \ No newline at end of file diff --git "a/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/utils/ShellExecutor.java" "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/utils/ShellExecutor.java" new file mode 100644 index 0000000..4774266 --- /dev/null +++ "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/java/com/fly/simple/utils/ShellExecutor.java" @@ -0,0 +1,60 @@ +package com.fly.simple.utils; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.SystemUtils; + +public class ShellExecutor +{ + /** + * execute命令 + * + * @param command + * @throws IOException + * @see [类、类#方法、类#成员] + */ + public static List execute(String command) + throws IOException + { + List resultList = new ArrayList<>(); + String[] cmd = SystemUtils.IS_OS_WINDOWS ? new String[] {"cmd", "/c", command} : new String[] {"/bin/sh", "-c", command}; + Process ps = Runtime.getRuntime().exec(cmd); + try (InputStream in = ps.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in))) + { + String line; + while ((line = br.readLine()) != null) + { + resultList.add(line); + } + } + return resultList; + } + + public static Map> getDockerInfo() + throws IOException + { + // ribbon-user-1 8081/tcp + // ribbon-movie 8082/tcp + // ribbon-gateway 0.0.0.0:8085->8080/tcp, :::8085->8080/tcp + String dockerCmd = "docker ps --format \"{{.Names}} {{.Ports}}\""; + Map> map = new TreeMap<>(); + execute(dockerCmd).stream() + .filter(line -> StringUtils.contains(line, "->"))// 保留带端口映射的应用 + .map(line -> Collections.singletonMap(StringUtils.substringBefore(line, " "), + Stream.of(StringUtils.substringAfter(line, " ").split(",")).map(p -> StringUtils.substringBetween(p, ":", "->")).filter(StringUtils::isNotBlank).map(p -> p.replace(":", "")).sorted().collect(Collectors.toSet()))) + .forEach(it -> map.putAll(it)); + return map; + } +} diff --git "a/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/resources/log4j2.xml" "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/resources/log4j2.xml" new file mode 100644 index 0000000..0bb64bd --- /dev/null +++ "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/resources/log4j2.xml" @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git "a/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/resources/templates/index.html.ftl" "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/resources/templates/index.html.ftl" new file mode 100644 index 0000000..9beeabd --- /dev/null +++ "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/src/main/resources/templates/index.html.ftl" @@ -0,0 +1,73 @@ + + + + + + +Welcome to nginx! + +
+ + + + + + + <#list map?keys as key> + + + + + + +
No.ApplicationPorts
${key_index+1}${key} + <#list map[key] as port> + ${port}     + +
+

更新时间:${date?string('yyyy-MM-dd HH:mm:ss')}

+
+ + + \ No newline at end of file -- Gitee From bd904f906eb0a419ec8ed8f1681cb6103f00da38 Mon Sep 17 00:00:00 2001 From: 00fly <00fly@noreply.gitcode.com> Date: Sat, 26 Oct 2024 21:27:37 +0800 Subject: [PATCH 2/6] update README.md --- .../README.md" | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git "a/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/README.md" "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/README.md" index 805417c..8e4480a 100644 --- "a/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/README.md" +++ "b/\346\234\215\345\212\241\345\231\250docker Web\345\272\224\347\224\250\344\270\200\350\247\210/README.md" @@ -39,4 +39,15 @@ mvn clean package -f pom-deps.xml #带外部依赖lib的可执行包 mvn clean package -f pom-lib.xml -``` \ No newline at end of file +``` + +# 四、部署步骤 + +将`docker-show-jar-with-dependencies.jar`拷贝到服务器位置 `/work/gitcode/docker-run` + +输入`crontab -e`添加如下内容,实现每30分钟执行一次生成页面,并复制到nginx首页位置`/usr/share/nginx/html/index.html` + +```bash +*/10 * * * * java -jar /work/gitcode/docker-run/docker-show-jar-with-dependencies.jar --server.net.ip=124.71.129.204 +``` +这边的124.71.129.204为服务器ip。 \ No newline at end of file -- Gitee From 836f4f8dc7856c4c7bff006a38c53d55e2b7b1cf Mon Sep 17 00:00:00 2001 From: 00fly <00fly@noreply.gitcode.com> Date: Sun, 27 Oct 2024 09:55:51 +0800 Subject: [PATCH 3/6] =?UTF-8?q?add=20=E7=A5=9E=E5=A5=87=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=81=A2=E5=A4=8D=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pom.xml" | 67 +++ .../java/com/fly/procode/core/DateUtil.java" | 19 + .../java/com/fly/procode/core/Service.java" | 232 +++++++++ .../com/fly/procode/process/RunProgress.java" | 80 +++ .../com/fly/procode/ui/ProCodeToolFrame.java" | 161 ++++++ .../com/fly/procode/ui/ProCodeToolSJ.java" | 472 ++++++++++++++++++ .../src/main/resources/image/icon.gif" | Bin 0 -> 1867 bytes 7 files changed, 1031 insertions(+) create mode 100644 "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/pom.xml" create mode 100644 "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/core/DateUtil.java" create mode 100644 "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/core/Service.java" create mode 100644 "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/process/RunProgress.java" create mode 100644 "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolFrame.java" create mode 100644 "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolSJ.java" create mode 100644 "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/resources/image/icon.gif" diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/pom.xml" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/pom.xml" new file mode 100644 index 0000000..f8bfd13 --- /dev/null +++ "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/pom.xml" @@ -0,0 +1,67 @@ + + 4.0.0 + com.fly + procode + 0.0.1-SNAPSHOT + jar + procode + http://maven.apache.org + + 1.8 + UTF-8 + + + + + org.eclipse.platform + org.eclipse.swt.win32.win32.x86_64 + 3.112.0 + + + org.eclipse.platform + org.eclipse.swt.gtk.linux.aarch64 + + + org.eclipse.platform + org.eclipse.swt.gtk.linux.arm + + + + + + org.eclipse.platform + org.eclipse.jface + 3.17.0 + + + org.eclipse.platform + org.eclipse.swt + + + + + org.eclipse.platform + org.eclipse.equinox.common + 3.11.0 + + + org.eclipse.platform + org.eclipse.core.commands + 3.9.800 + + + + + + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + + diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/core/DateUtil.java" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/core/DateUtil.java" new file mode 100644 index 0000000..bd55040 --- /dev/null +++ "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/core/DateUtil.java" @@ -0,0 +1,19 @@ +package com.fly.procode.core; + +import java.text.SimpleDateFormat; + +public class DateUtil +{ + public final static String MMDDHHMM = "_MMddHHmm"; + + public static final String getCurrDateTimeStr(String formatStr) + { + SimpleDateFormat sdf = new SimpleDateFormat(formatStr); + return sdf.format(System.currentTimeMillis()); + } + + public static final String getCurrDateTimeStr() + { + return getCurrDateTimeStr(MMDDHHMM); + } +} diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/core/Service.java" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/core/Service.java" new file mode 100644 index 0000000..d6da27f --- /dev/null +++ "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/core/Service.java" @@ -0,0 +1,232 @@ +package com.fly.procode.core; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.util.ArrayList; +import java.util.List; +import java.util.Observable; + +import com.fly.procode.process.RunProgress; + +/** + * 核心业务逻辑类 + */ +public class Service extends Observable +{ + // 项目源代码目录 + private String sourcePath; + + private RunProgress runProcess; + + // 构造函数 + public Service() + { + super(); + } + + public RunProgress getRunProcess() + { + return runProcess; + } + + public void setRunProcess(RunProgress runProcess) + { + this.runProcess = runProcess; + } + + public String getSourcePath() + { + return sourcePath; + } + + public void setSourcePath(String sourcePath) + { + this.sourcePath = sourcePath; + } + + // 创建备份文件 + public void createBakFile(String bootPath, String bakFileName, List fileFilter, String pwdtext) + { + // InputStream,OutputStream 并不负责文件创建或删除 + // 这部分功能由File来实现 + File bakfile = new File(bakFileName); + if (bakfile.exists()) + { + bakfile.delete(); + } + if (!"".equals(pwdtext)) + { + // new FileOutputStream(File file,boolean append) + try (OutputStream fos = new FileOutputStream(bakFileName, false); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos, "ISO-8859-1"))) + { + writer.write("It is a encrypt backup File"); + writer.newLine(); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + // 备份文件 + bakFile(bootPath, bakFileName, fileFilter, pwdtext); + } + + // 递归备份文件 + private void bakFile(String bootPath, String bakFileName, List fileFilter, String pwdtext) + { + File file = new File(sourcePath); + if (file.exists() && file.isDirectory() && !file.getName().startsWith(".")) + { + File[] files = file.listFiles(); + for (int i = 0; i < files.length; i++) + { + File f1 = files[i]; + if (f1.isDirectory()) + { + Service p = new Service(); + p.setRunProcess(runProcess); + p.addObserver(runProcess); + p.setSourcePath(f1.getPath()); + p.bakFile(bootPath, bakFileName, fileFilter, pwdtext); + } + else if (f1.isFile()) + { + if (isExtraFile(f1.getName(), fileFilter)) + { + setChanged(); + notifyObservers("开始处理文件: " + f1.getName()); + List list = new ArrayList(); + String text = "//goto " + f1.getPath().substring(bootPath.length()); + list.add(text); + list.addAll(getFiletext(f1.getPath())); + writeFile(list, bakFileName, pwdtext); + } + } + } + } + } + + // 以append 方式将text 写入 bakFile + private void writeFile(List list, String bakFileName, String pwdtext) + { + // 设置缓冲区大小为8192 bytes + try (OutputStream os = new FileOutputStream(bakFileName, true); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "ISO-8859-1"), 8192)) + { + for (String text : list) + { + writer.write(text); + writer.newLine(); + } + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + // 获取文件内容 + private List getFiletext(String filePath) + { + // 设置缓冲区大小为8192 bytes + List list = new ArrayList(); + try (InputStream is = new FileInputStream(filePath); BufferedReader in = new BufferedReader(new InputStreamReader(is, "ISO-8859-1"), 8192)) + { + String text; + while ((text = in.readLine()) != null) + { + list.add(text); + } + return list; + } + catch (IOException e) + { + e.printStackTrace(); + return null; + } + } + + // 是否为需要备份的文件类型 + private boolean isExtraFile(String fileName, List fileFilter) + { + for (String postfix : fileFilter) + { + if (fileName.endsWith(postfix)) + { + return true; + } + } + return false; + } + + // 从备份文件恢复文件至dir + public void createSourceFile(String bakFile, String dir) + { + File f = new File(bakFile); + String separator = System.getProperty("file.separator"); + int beginIndex = bakFile.lastIndexOf(separator) + 1; + int endIndex = bakFile.indexOf("_"); + String t; + if (endIndex > 0) + { + t = bakFile.substring(beginIndex, endIndex) + separator; + } + else + { + t = bakFile.substring(beginIndex, bakFile.indexOf(".")) + separator; + } + dir = dir + t; + List list = getFiletext(f.getPath()); + BufferedWriter writer = null; + for (String text : list) + { + try + { + if (text.trim().startsWith("//goto ")) + { + // close old file + if (writer != null) + { + writer.close(); + } + // creat new file + int pos = text.indexOf("//goto ") + 7; + File file = new File(dir + text.substring(pos)); + file.getParentFile().mkdirs(); + OutputStream os = new FileOutputStream(file); + writer = new BufferedWriter(new OutputStreamWriter(os, "8859_1"), 8192); + } + else + { + if (writer != null) + { + writer.write(text); + writer.newLine(); + } + } + } + catch (IOException e) + { + e.printStackTrace(); + } + } + try + { + if (writer != null) + { + writer.close(); + } + } + catch (IOException e) + { + e.printStackTrace(); + } + } +} diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/process/RunProgress.java" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/process/RunProgress.java" new file mode 100644 index 0000000..501e9a2 --- /dev/null +++ "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/process/RunProgress.java" @@ -0,0 +1,80 @@ +package com.fly.procode.process; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; +import java.util.Observable; +import java.util.Observer; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.operation.IRunnableWithProgress; + +import com.fly.procode.core.Service; + +/** + * + * 创建代码进度条线程 + * + * @author 00fly + * @version [版本号, 2017年5月3日] + * @see [相关类/方法] + * @since [产品/模块版本] + */ +public class RunProgress implements IRunnableWithProgress, Observer +{ + private String sourcePath; + + private String bakFileName; + + private List fileFilter; + + private String pwdtext; + + private IProgressMonitor monitor; + + public RunProgress(String bootPath, String bakFileName, List fileFilter, String pwdtext) + { + super(); + this.sourcePath = bootPath; + this.bakFileName = bakFileName; + this.fileFilter = fileFilter; + this.pwdtext = pwdtext; + } + + @Override + public void run(IProgressMonitor monitor) + throws InvocationTargetException, InterruptedException + { + // 在当前目录,创建并运行脚本 + try + { + monitor.beginTask("代码备份", IProgressMonitor.UNKNOWN); + monitor.subTask("代码备份中......"); + creatAndRun(sourcePath, bakFileName, fileFilter, pwdtext, monitor); + monitor.done(); + } + catch (Exception e) + { + throw new InvocationTargetException(e.getCause(), e.getMessage()); + } + } + + // 运行代码创建程序 + private void creatAndRun(String sourcePath, String bakFileName, List fileFilter, String pwdtext, IProgressMonitor monitor) + { + this.monitor = monitor; + Service service = new Service(); + service.setRunProcess(this); + service.addObserver(this); + service.setSourcePath(sourcePath); + service.createBakFile(sourcePath, bakFileName, fileFilter, pwdtext); + } + + @Override + public void update(Observable observable, Object msg) + { + if (msg instanceof String) + { + monitor.subTask((String)msg); + } + } +} diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolFrame.java" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolFrame.java" new file mode 100644 index 0000000..e6531c5 --- /dev/null +++ "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolFrame.java" @@ -0,0 +1,161 @@ +package com.fly.procode.ui; + +import java.awt.BorderLayout; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.net.URL; +import java.nio.charset.StandardCharsets; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; + +/** + * + * 工具UI简化版本 + * + * @author 00fly + * @version [版本号, 2023年3月3日] + * @see [相关类/方法] + * @since [产品/模块版本] + */ +public class ProCodeToolFrame extends JFrame +{ + private static final long serialVersionUID = -2145267777297657212L; + + JFrame frame = this; + + public ProCodeToolFrame() + { + initComponent(); + this.setVisible(true); + this.setResizable(true); + this.setAlwaysOnTop(true); + this.setTitle("代码恢复工具 V1.0"); + this.setBounds(400, 200, 1200, 550); + this.setDefaultCloseOperation(EXIT_ON_CLOSE); + try + { + // 设定用户界面的外观 + UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + SwingUtilities.updateComponentTreeUI(this); + } + catch (Exception e) + { + } + } + + /** + * 组件初始化 + * + * @see [类、类#方法、类#成员] + */ + private void initComponent() + { + // 加载图标 + URL url = getClass().getResource("/image/icon.gif"); + if (url != null) + { + this.setIconImage(getToolkit().createImage(url)); + } + + JTextArea textArea = new JTextArea(); + textArea.setToolTipText("请输入全部待恢复代码"); + + // JTextArea不自带滚动条,因此就需要把文本区放到一个滚动窗格中 + JScrollPane scroll = new JScrollPane(textArea); + scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + + JButton button = new JButton("开始恢复代码"); + this.add(scroll, BorderLayout.CENTER); + this.add(button, BorderLayout.SOUTH); + button.addMouseListener(new MouseAdapter() + { + @Override + public void mouseClicked(MouseEvent event) + { + try + { + String dir = new File(" ").getCanonicalPath(); + createSourceFile(textArea.getText(), dir); + JOptionPane.showMessageDialog(frame, "恢复文件到目录: " + dir + " 成功!", "提示", JOptionPane.INFORMATION_MESSAGE); + } + catch (Exception e) + { + JOptionPane.showMessageDialog(frame, e.getMessage(), "系統异常", JOptionPane.ERROR_MESSAGE); + } + } + }); + } + + /** + * 恢复文件至dir + * + * @param text + * @param dir + */ + private void createSourceFile(String text, String dir) + { + String[] textArr = text.split("\n"); + BufferedWriter writer = null; + for (String line : textArr) + { + try + { + if (line.trim().startsWith("//goto ")) + { + // close old file + if (writer != null) + { + writer.close(); + } + // creat new file + int pos = line.indexOf("//goto ") + 7; + File file = new File(dir + line.substring(pos)); + file.getParentFile().mkdirs(); + OutputStream os = new FileOutputStream(file); + writer = new BufferedWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8), 8192); + } + else + { + if (writer != null) + { + writer.write(line); + writer.newLine(); + } + } + } + catch (IOException e) + { + e.printStackTrace(); + } + } + try + { + if (writer != null) + { + writer.close(); + } + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + public static void main(String[] args) + { + SwingUtilities.invokeLater(() -> new ProCodeToolFrame()); + } +} diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolSJ.java" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolSJ.java" new file mode 100644 index 0000000..49d54b0 --- /dev/null +++ "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolSJ.java" @@ -0,0 +1,472 @@ +package com.fly.procode.ui; + +import java.awt.Desktop; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jface.dialogs.IInputValidator; +import org.eclipse.jface.dialogs.InputDialog; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.window.Window; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.DirectoryDialog; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.TabFolder; +import org.eclipse.swt.widgets.TabItem; +import org.eclipse.swt.widgets.Text; + +import com.fly.procode.core.DateUtil; +import com.fly.procode.core.Service; +import com.fly.procode.process.RunProgress; + +/** + * + * swt jface版本 + * + * @author 00fly + * @version [版本号, 2020年4月24日] + * @see [相关类/方法] + * @since [产品/模块版本] + */ +public class ProCodeToolSJ +{ + Display display; + + Shell shell; + + org.eclipse.swt.widgets.List listJava; + + org.eclipse.swt.widgets.List listPage; + + public ProCodeToolSJ() + { + super(); + display = new Display(); + shell = new Shell(display, SWT.MIN | SWT.CLOSE | SWT.ON_TOP); + InputStream is = this.getClass().getResourceAsStream("/image/icon.gif"); + if (is != null) + { + shell.setImage(new Image(display, is)); + } + shell.setText("代码备份恢复工具 V1.1.0"); + shell.setSize(540, 383); + Rectangle screeRec = display.getBounds(); + Rectangle shellRec = shell.getBounds(); + if (shellRec.height > screeRec.height) + { + shellRec.height = screeRec.height; + } + if (shellRec.width > screeRec.width) + { + shellRec.width = screeRec.width; + } + shell.setLocation((screeRec.width - shellRec.width) / 2, (screeRec.height - shellRec.height) / 2); + addMenu(); + setContent(); + shell.open(); + while (!shell.isDisposed()) + { + if (!display.readAndDispatch()) + { + display.sleep(); + } + } + display.dispose(); + } + + // main + public static void main(String[] args) + { + new ProCodeToolSJ(); + } + + // Menu set + private void addMenu() + { + Menu m = new Menu(shell, SWT.BAR); + // create a file menu and add an exit item + MenuItem file = new MenuItem(m, SWT.CASCADE); + file.setText("文件(&F)"); + file.setAccelerator(SWT.CTRL + 'F'); + Menu filemenu = new Menu(shell, SWT.DROP_DOWN); + file.setMenu(filemenu); + MenuItem openMenuItem = new MenuItem(filemenu, SWT.CASCADE); + openMenuItem.setText("最近备份(&O)"); + openMenuItem.setAccelerator(SWT.CTRL + 'O'); + Menu submenu = new Menu(shell, SWT.DROP_DOWN); + openMenuItem.setMenu(submenu); + MenuItem childItem = new MenuItem(submenu, SWT.PUSH); + childItem.setText("Child"); + MenuItem saveMenuItem = new MenuItem(filemenu, SWT.CASCADE); + saveMenuItem.setText("最近恢复(&S)"); + saveMenuItem.setAccelerator(SWT.CTRL + 'S'); + Menu submenu2 = new Menu(shell, SWT.DROP_DOWN); + saveMenuItem.setMenu(submenu2); + MenuItem childItem2 = new MenuItem(submenu2, SWT.PUSH); + childItem2.setText("Child2"); + new MenuItem(filemenu, SWT.SEPARATOR); + MenuItem exitMenuItem = new MenuItem(filemenu, SWT.PUSH); + exitMenuItem.setText("退出(&X)"); + exitMenuItem.setAccelerator(SWT.CTRL + 'X'); + exitMenuItem.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent e) + { + System.exit(0); + } + }); + // create a Help menu and add an about item + MenuItem help = new MenuItem(m, SWT.CASCADE); + help.setText("帮助(&H)"); + help.setAccelerator(SWT.CTRL + 'H'); + Menu helpmenu = new Menu(shell, SWT.DROP_DOWN); + help.setMenu(helpmenu); + MenuItem useMenuItem = new MenuItem(helpmenu, SWT.PUSH); + useMenuItem.setText("使用指南(&U)"); + new MenuItem(helpmenu, SWT.SEPARATOR); + MenuItem aboutMenuItem = new MenuItem(helpmenu, SWT.PUSH); + aboutMenuItem.setText("关于工具(&A)"); + useMenuItem.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent event) + { + MessageDialog.openInformation(shell, "使用指南", "请按以下顺序操作:" + "\n 文件备份" + "\n 1. 选择项目源文件的目录。" + "\n 2. 选择需要备份的文件类型。" + "\n 3. 选择备份文件输出目录。" + "\n 4. 导出文件。" + "\n " + "\n 文件恢复 " + "\n 1. 到备份目录下选择备份文件。" + "\n 2. 选择备份文件的恢复目录。" + "\n 3. 恢复文件"); + } + }); + aboutMenuItem.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent event) + { + MessageDialog.openInformation(shell, "关于本工具", "代码备份恢复工具。\n\nkailin 于2010年5月。"); + } + }); + shell.setMenuBar(m); + } + + public void setContent() + { + TabFolder tabFolder = new TabFolder(shell, SWT.NONE); + tabFolder.setBounds(5, 2, 525, 328); + TabItem item = new TabItem(tabFolder, SWT.NONE); + item.setText(" 代码备份 "); + item.setControl(new BakPanlTab(tabFolder, SWT.NONE)); + TabItem item2 = new TabItem(tabFolder, SWT.NONE); + item2.setText(" 代码恢复 "); + item2.setControl(new RestorePanlTab(tabFolder, SWT.NONE)); + } + + // 备份面板 + class BakPanlTab extends Composite + { + Button pwdButton; + + Text tpwd = new Text(this, SWT.NONE); + + public BakPanlTab(Composite c, int style) + { + super(c, style); + Label sourceLabel = new Label(this, SWT.NONE); + sourceLabel.setText("项目源文件目录:"); + sourceLabel.setBounds(20, 30, 100, 18); + final Text tsourcePath = new Text(this, SWT.BORDER); + tsourcePath.setBackground(display.getSystemColor(SWT.COLOR_WHITE)); + tsourcePath.setEditable(false); + tsourcePath.setBounds(120, 30, 300, 20); + Button sourceBrowse = new Button(this, SWT.PUSH); + sourceBrowse.setText("选择"); + sourceBrowse.setBounds(430, 30, 70, 20); + sourceBrowse.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent event) + { + DirectoryDialog dialog = new DirectoryDialog(shell); + dialog.setFilterPath(tsourcePath.getText()); + String fileName = dialog.open(); + if (fileName != null) + { + if (fileName.endsWith("\\")) + { + tsourcePath.setText(fileName); + } + else + { + tsourcePath.setText(fileName + "\\"); + } + // 新源文件目录被选中,清空密码 + tpwd.setText(""); + pwdButton.setEnabled(true); + } + } + }); + Label fileTypeLabel = new Label(this, SWT.NONE); + fileTypeLabel.setText("源文件类型:"); + fileTypeLabel.setBounds(20, 60, 100, 18); + + listJava = new org.eclipse.swt.widgets.List(this, SWT.BORDER | SWT.V_SCROLL | SWT.SIMPLE | SWT.MULTI); + listJava.setBounds(120, 60, 120, 110); + listJava.setToolTipText("选择需要备份的源文件类型,支持多选!"); + String[] fileTypes = {".java", ".xml", ".yml", ".properties", ".sql"}; + listJava.setItems(fileTypes); + + listPage = new org.eclipse.swt.widgets.List(this, SWT.BORDER | SWT.V_SCROLL | SWT.SIMPLE | SWT.MULTI); + listPage.setBounds(280, 60, 120, 110); + listPage.setToolTipText("选择需要备份的源文件类型,支持多选!"); + String[] fileTypes2 = {".html", ".js", ".css", ".vue", ".jsp"}; + listPage.setItems(fileTypes2); + + Label pwdLabel = new Label(this, SWT.NONE); + pwdLabel.setText("可选项:"); + pwdLabel.setBounds(20, 180, 100, 18); + pwdButton = new Button(this, SWT.PUSH); + pwdButton.setText("设置密码"); + pwdButton.setBounds(120, 180, 100, 20); + pwdButton.setEnabled(false); + pwdButton.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent event) + { + InputDialog dlg = new InputDialog(shell, "带密码备份", "请输入8位密码(包括字母,数字和字符):", "", new LengthValidator()); + if (dlg.open() == Window.OK) + { + tpwd.setText(dlg.getValue()); + MessageDialog.openInformation(shell, "恭喜你", "密码设置成功!"); + } + } + }); + Label bakeLabel = new Label(this, SWT.NONE); + bakeLabel.setText("备份至目录:"); + bakeLabel.setBounds(20, 210, 100, 18); + final Text tbakPath = new Text(this, SWT.BORDER); + tbakPath.setBackground(display.getSystemColor(SWT.COLOR_WHITE)); + tbakPath.setEditable(false); + tbakPath.setText(new File(" ").getAbsolutePath().trim()); + tbakPath.setBounds(120, 210, 300, 20); + Button bakBrowse = new Button(this, SWT.PUSH); + bakBrowse.setText("选择"); + bakBrowse.setBounds(430, 210, 70, 20); + bakBrowse.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent event) + { + DirectoryDialog dialog = new DirectoryDialog(shell); + dialog.setFilterPath(tbakPath.getText()); + String fileName = dialog.open(); + if (fileName != null) + { + if (fileName.endsWith("\\")) + { + tbakPath.setText(fileName); + } + else + { + tbakPath.setText(fileName + "\\"); + } + } + } + }); + Button bakButton = new Button(this, SWT.PUSH); + bakButton.setText("开始备份"); + bakButton.setBounds(220, 250, 100, 40); + bakButton.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent event) + { + if ("".equals(tsourcePath.getText())) + { + MessageDialog.openWarning(shell, "警告", "项目源文件目录不可为空!"); + return; + } + if (listJava.getSelectionCount() + listPage.getSelectionCount() < 1) + { + MessageDialog.openError(shell, "警告", "请选择源文件类型,支持多选!"); + listJava.setFocus(); + return; + } + String sourcePath = tsourcePath.getText(); + String bakFileName = tbakPath.getText() + new File(sourcePath).getName() + DateUtil.getCurrDateTimeStr() + ".bak"; + try + { + List fileTypes = new ArrayList(); + for (String it : listJava.getSelection()) + { + fileTypes.add(it); + } + for (String it : listPage.getSelection()) + { + fileTypes.add(it); + } + String pwdtext = tpwd.getText(); + IRunnableWithProgress runnable = new RunProgress(sourcePath, bakFileName, fileTypes, pwdtext); + new ProgressMonitorDialog(shell).run(true, false, runnable); + String message = "创建明文备份文件 " + bakFileName + " 成功!"; + if (!"".equals(pwdtext)) + { + message = "创建加密备份文件 " + bakFileName + " 成功!"; + } + MessageDialog.openInformation(shell, "提示", message); + } + catch (InvocationTargetException e) + { + MessageDialog.openError(shell, "警告", e.getMessage()); + } + catch (InterruptedException e) + { + MessageDialog.openInformation(shell, "Cancelled", "刷新操作被用户取消!"); + } + catch (RuntimeException e) + { + MessageDialog.openError(shell, "错误", "创建备份文件 " + bakFileName + " 失败!"); + } + if (MessageDialog.openConfirm(shell, "查看备份文件", "处理完成,是否直接查看文件?")) + { + try + { + Desktop.getDesktop().open(new File(bakFileName).getParentFile()); + } + catch (IOException e) + { + } + } + } + }); + } + + // 密码长度验证 + class LengthValidator implements IInputValidator + { + @Override + public String isValid(String newText) + { + int len = newText.length(); + if (len < 8) + { + return "长度少于8位"; + } + if (len > 8) + { + return "长度大于8位"; + } + return null; + } + } + } + + // 恢复面板 + class RestorePanlTab extends Composite + { + public RestorePanlTab(Composite c, int style) + { + super(c, style); + Label bakeLabel = new Label(this, SWT.NONE); + bakeLabel.setText("选择备份文件:"); + bakeLabel.setBounds(20, 30, 100, 18); + final Text tbakPath = new Text(this, SWT.BORDER); + tbakPath.setBackground(display.getSystemColor(SWT.COLOR_WHITE)); + tbakPath.setEditable(false); + tbakPath.setBounds(120, 30, 300, 20); + Button bakBrowse = new Button(this, SWT.PUSH); + bakBrowse.setText("选择"); + bakBrowse.setBounds(430, 30, 70, 20); + bakBrowse.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent event) + { + FileDialog fileDialog = new FileDialog(shell, SWT.OPEN); + fileDialog.setText("选择文件"); + String[] filterExt = {"*.bak"}; + fileDialog.setFilterExtensions(filterExt); + String selected = fileDialog.open(); + if (selected == null) + { + return; + } + tbakPath.setText(selected); + } + }); + Label sourceLabel = new Label(this, SWT.NONE); + sourceLabel.setText("恢复至目录:"); + sourceLabel.setBounds(20, 100, 100, 18); + final Text tsourcePath = new Text(this, SWT.BORDER); + tsourcePath.setBackground(display.getSystemColor(SWT.COLOR_WHITE)); + tsourcePath.setEditable(false); + tsourcePath.setText(new File(" ").getAbsolutePath().trim()); + tsourcePath.setBounds(120, 100, 300, 20); + Button sourceBrowse = new Button(this, SWT.PUSH); + sourceBrowse.setText("选择"); + sourceBrowse.setBounds(430, 100, 70, 20); + sourceBrowse.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent event) + { + DirectoryDialog dialog = new DirectoryDialog(shell); + dialog.setFilterPath(tsourcePath.getText()); + String fileName = dialog.open(); + if (fileName != null) + { + if (fileName.endsWith("\\")) + { + tsourcePath.setText(fileName); + } + else + { + tsourcePath.setText(fileName + "\\"); + } + } + } + }); + Button resetButton = new Button(this, SWT.PUSH); + resetButton.setText("开始恢复"); + resetButton.setBounds(220, 170, 100, 40); + resetButton.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent event) + { + if ("".equals(tbakPath.getText()) || "".equals(tsourcePath.getText())) + { + MessageDialog.openWarning(shell, "警告", "备份文件或恢复目录不可为空!"); + } + else + { + String dir = tsourcePath.getText(); + try + { + new Service().createSourceFile(tbakPath.getText(), dir); + MessageDialog.openInformation(shell, "提示", "恢复文件到目录: " + dir + " 成功!"); + } + catch (RuntimeException e) + { + MessageDialog.openError(shell, "错误", "恢复文件失败,请重新检查备份文件!"); + } + } + } + }); + } + } +} diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/resources/image/icon.gif" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/resources/image/icon.gif" new file mode 100644 index 0000000000000000000000000000000000000000..b1a689d7272f228f122f6ac7f3628ecc74516a17 GIT binary patch literal 1867 zcmV-R2ekM{Nk%w1VK4wN0Qdg@qX`A13I?YP2&xSRsSXLR5D2al45=9vu@VWg6brBv z4YU^zxfu?&84$G{6TKZ0vmhG3Ar-nO9=;?Pt|lb0DJHZnD7rE$yE81hJUG5eM!!{4 zz!n6<7zM={1&_=|2zu+J`D0a65u^2;y)|sLWa$4weQSxF+@@YZzYC`^CLjP_+`e{z`Y*YViQ1Nk2@^wxB zazy`jNdI+B|9MOEd{p*$Tl;la{dZjddQks+RR4Zb|9w~ge_7&lX6$}u^LJzSdu9KA zVcUXx_k&;mfKva0SO0=s|A<-ggKhtSWB-L=|Al4$glhPTVE>C_|A}V*j%WIdZ~u#E z|BY(@j%@#ocK?uW{hDq5l5zi(a{rcf|CM|Dn{oe`cmJPp{+oOMp>+SCf6;`3)`*4K zi-y*ck=d1!-nDm&5{+@yQosIFIlk23M_N9yeqJ#dWivOsJ{;G}stdH=i zpZlko{;iSzs+#|>mHxDw|G1yyva#m1v+KIH_phV=w5I>MqyN6B|G}mH!>a$tt^dcd z_{6;b%(VW@y8qI=?aAy*wp#j*8ktx`S0)f@bCKY@cr`f{`B(y z|Nj6000930A^8LW3IP8AEC2ui05AYB000R80RIUbNU)&6g9sBUT*$DYLxs8^)tN{U zlC6gr2}*QiN*FnC-$H)#Wy(<2Z$ol}D;FI)Zf_zzjOA$W+N|odx`i9^THLtYymEtcmtoXz zeEmueEYk92%hyt0=a74ZH_vkTA73Yq-^;)^lP=KSFe7ZR~Kps=oWTFK@b!PNqgGG^P^s3Wk2B*($78Tu}uXClIs* zHR?R)AfDCmYN{{3usCFzf(i<2tj1OWM6v_fV9jB7K1iyb(^9*Nkaw&>B&*qOTSd21 zOz|y2Hc)fegXZQLZLiesk_#T!S{g60^wvAY4-pU~#VCiZcFnn_3PWu!7++!~yqLmT z#m5R8A#x5*5G2YW>ZIl`y2McH3&y#GBJ37rY^%k`AlEDM5ks^9NI^BU_9(y?!~AQY z*}lpx&Q<7a1kXbZ(QrX7Q1gv3(pvm7#?&wd9ne-as-5Iq^g) z8;gCn=m|r9dg^I^aKS-x_S^H203Q!EF##h>bKK7ShQG;0O$Q0cKt}rDfHB-GXQs1X0kO9N z0%)KogGfLO%Ah>^-LH4s8v+Le5QwJ;G>2qfSGI>4R| z)20It4B!CAnBhSvEI@z)cpwEjNTL!!z<~h>fC55f$R8>ofGSoI02J6j6t~F5E;b|} F06RJDo|gas literal 0 HcmV?d00001 -- Gitee From 73d53a7e97ebc61a4d5ae514a69dbd1396e48bab Mon Sep 17 00:00:00 2001 From: 00fly <00fly@noreply.gitcode.com> Date: Sun, 27 Oct 2024 10:08:10 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.gitignore" | 7 ++ .../pom-simple.xml" | 92 +++++++++++++++++++ .../pom.xml" | 29 +++++- .../java/com/fly/procode/core/Service.java" | 13 ++- .../com/fly/procode/ui/ProCodeToolSJ.java" | 25 +++-- .../fly/procode/ui/ProCodeToolSimple.java" | 18 ++-- 6 files changed, 160 insertions(+), 24 deletions(-) create mode 100644 "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/.gitignore" create mode 100644 "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/pom-simple.xml" rename "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolFrame.java" => "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolSimple.java" (90%) diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/.gitignore" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/.gitignore" new file mode 100644 index 0000000..9ac5367 --- /dev/null +++ "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/.gitignore" @@ -0,0 +1,7 @@ +target/ +logs/ +.classpath +.project +.settings +.factorypath +upload/ \ No newline at end of file diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/pom-simple.xml" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/pom-simple.xml" new file mode 100644 index 0000000..659c667 --- /dev/null +++ "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/pom-simple.xml" @@ -0,0 +1,92 @@ + + 4.0.0 + com.fly + procode-simple + 0.0.1 + jar + procode + http://maven.apache.org + + 1.8 + UTF-8 + + + + + org.eclipse.platform + org.eclipse.swt.win32.win32.x86_64 + 3.112.0 + + + org.eclipse.platform + org.eclipse.swt.gtk.linux.aarch64 + + + org.eclipse.platform + org.eclipse.swt.gtk.linux.arm + + + + + + org.eclipse.platform + org.eclipse.jface + 3.17.0 + + + org.eclipse.platform + org.eclipse.swt + + + + + org.eclipse.platform + org.eclipse.equinox.common + 3.11.0 + + + org.eclipse.platform + org.eclipse.core.commands + 3.9.800 + + + + + + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + + maven-assembly-plugin + 3.5.0 + + false + + + com.fly.procode.ui.ProCodeToolSimple + + + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + \ No newline at end of file diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/pom.xml" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/pom.xml" index f8bfd13..62cd90e 100644 --- "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/pom.xml" +++ "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/pom.xml" @@ -4,7 +4,7 @@ 4.0.0 com.fly procode - 0.0.1-SNAPSHOT + 0.0.1 jar procode http://maven.apache.org @@ -56,12 +56,37 @@ maven-compiler-plugin - 3.7.0 + 3.8.1 1.8 1.8 + + maven-assembly-plugin + 3.5.0 + + false + + + com.fly.procode.ui.ProCodeToolSJ + + + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/core/Service.java" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/core/Service.java" index d6da27f..13ee0d3 100644 --- "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/core/Service.java" +++ "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/core/Service.java" @@ -99,6 +99,10 @@ public class Service extends Observable } else if (f1.isFile()) { + if (f1.getPath().contains("\\target\\")) + { + return; + } if (isExtraFile(f1.getName(), fileFilter)) { setChanged(); @@ -170,17 +174,16 @@ public class Service extends Observable public void createSourceFile(String bakFile, String dir) { File f = new File(bakFile); - String separator = System.getProperty("file.separator"); - int beginIndex = bakFile.lastIndexOf(separator) + 1; + int beginIndex = bakFile.lastIndexOf(File.separator) + 1; int endIndex = bakFile.indexOf("_"); String t; if (endIndex > 0) { - t = bakFile.substring(beginIndex, endIndex) + separator; + t = bakFile.substring(beginIndex, endIndex) + File.separator; } else { - t = bakFile.substring(beginIndex, bakFile.indexOf(".")) + separator; + t = bakFile.substring(beginIndex, bakFile.indexOf(".")) + File.separator; } dir = dir + t; List list = getFiletext(f.getPath()); @@ -198,7 +201,7 @@ public class Service extends Observable } // creat new file int pos = text.indexOf("//goto ") + 7; - File file = new File(dir + text.substring(pos)); + File file = new File(dir + text.substring(pos).replace("\\", File.separator)); file.getParentFile().mkdirs(); OutputStream os = new FileOutputStream(file); writer = new BufferedWriter(new OutputStreamWriter(os, "8859_1"), 8192); diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolSJ.java" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolSJ.java" index 49d54b0..e096ed7 100644 --- "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolSJ.java" +++ "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolSJ.java" @@ -7,6 +7,7 @@ import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; +import java.util.stream.IntStream; import org.eclipse.jface.dialogs.IInputValidator; import org.eclipse.jface.dialogs.InputDialog; @@ -149,7 +150,9 @@ public class ProCodeToolSJ @Override public void widgetSelected(SelectionEvent event) { - MessageDialog.openInformation(shell, "使用指南", "请按以下顺序操作:" + "\n 文件备份" + "\n 1. 选择项目源文件的目录。" + "\n 2. 选择需要备份的文件类型。" + "\n 3. 选择备份文件输出目录。" + "\n 4. 导出文件。" + "\n " + "\n 文件恢复 " + "\n 1. 到备份目录下选择备份文件。" + "\n 2. 选择备份文件的恢复目录。" + "\n 3. 恢复文件"); + MessageDialog.openInformation(shell, + "使用指南", + "请按以下顺序操作:" + "\n 文件备份" + "\n 1. 选择项目源文件的目录。" + "\n 2. 选择需要备份的文件类型。" + "\n 3. 选择备份文件输出目录。" + "\n 4. 导出文件。" + "\n " + "\n 文件恢复 " + "\n 1. 到备份目录下选择备份文件。" + "\n 2. 选择备份文件的恢复目录。" + "\n 3. 恢复文件"); } }); aboutMenuItem.addSelectionListener(new SelectionAdapter() @@ -157,7 +160,7 @@ public class ProCodeToolSJ @Override public void widgetSelected(SelectionEvent event) { - MessageDialog.openInformation(shell, "关于本工具", "代码备份恢复工具。\n\nkailin 于2010年5月。"); + MessageDialog.openInformation(shell, "关于本工具", "代码备份恢复工具。\n\n00fly 于2010年5月。"); } }); shell.setMenuBar(m); @@ -187,14 +190,14 @@ public class ProCodeToolSJ super(c, style); Label sourceLabel = new Label(this, SWT.NONE); sourceLabel.setText("项目源文件目录:"); - sourceLabel.setBounds(20, 30, 100, 18); + sourceLabel.setBounds(20, 10, 100, 18); final Text tsourcePath = new Text(this, SWT.BORDER); tsourcePath.setBackground(display.getSystemColor(SWT.COLOR_WHITE)); tsourcePath.setEditable(false); - tsourcePath.setBounds(120, 30, 300, 20); + tsourcePath.setBounds(120, 10, 300, 20); Button sourceBrowse = new Button(this, SWT.PUSH); sourceBrowse.setText("选择"); - sourceBrowse.setBounds(430, 30, 70, 20); + sourceBrowse.setBounds(430, 10, 70, 20); sourceBrowse.addSelectionListener(new SelectionAdapter() { @Override @@ -221,19 +224,21 @@ public class ProCodeToolSJ }); Label fileTypeLabel = new Label(this, SWT.NONE); fileTypeLabel.setText("源文件类型:"); - fileTypeLabel.setBounds(20, 60, 100, 18); + fileTypeLabel.setBounds(20, 40, 100, 18); listJava = new org.eclipse.swt.widgets.List(this, SWT.BORDER | SWT.V_SCROLL | SWT.SIMPLE | SWT.MULTI); - listJava.setBounds(120, 60, 120, 110); + listJava.setBounds(120, 40, 120, 128); listJava.setToolTipText("选择需要备份的源文件类型,支持多选!"); - String[] fileTypes = {".java", ".xml", ".yml", ".properties", ".sql"}; + String[] fileTypes = {".java", ".xml", ".yml", ".yaml", ".properties", ".sql", "Dockerfile"}; listJava.setItems(fileTypes); + IntStream.range(0, fileTypes.length).forEach(index -> listJava.select(index)); listPage = new org.eclipse.swt.widgets.List(this, SWT.BORDER | SWT.V_SCROLL | SWT.SIMPLE | SWT.MULTI); - listPage.setBounds(280, 60, 120, 110); + listPage.setBounds(280, 40, 120, 128); listPage.setToolTipText("选择需要备份的源文件类型,支持多选!"); - String[] fileTypes2 = {".html", ".js", ".css", ".vue", ".jsp"}; + String[] fileTypes2 = {".htm", ".html", ".json", ".js", ".css", ".vue", ".jsp", ".sh"}; listPage.setItems(fileTypes2); + IntStream.range(0, fileTypes2.length).forEach(index -> listPage.select(index)); Label pwdLabel = new Label(this, SWT.NONE); pwdLabel.setText("可选项:"); diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolFrame.java" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolSimple.java" similarity index 90% rename from "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolFrame.java" rename to "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolSimple.java" index e6531c5..243b29c 100644 --- "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolFrame.java" +++ "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/src/main/java/com/fly/procode/ui/ProCodeToolSimple.java" @@ -22,20 +22,20 @@ import javax.swing.UIManager; /** * - * 工具UI简化版本 + * 工具UI简化版本,Swing技术实现 * * @author 00fly * @version [版本号, 2023年3月3日] * @see [相关类/方法] * @since [产品/模块版本] */ -public class ProCodeToolFrame extends JFrame +public class ProCodeToolSimple extends JFrame { private static final long serialVersionUID = -2145267777297657212L; JFrame frame = this; - public ProCodeToolFrame() + public ProCodeToolSimple() { initComponent(); this.setVisible(true); @@ -62,7 +62,7 @@ public class ProCodeToolFrame extends JFrame */ private void initComponent() { - // 加载图标 + // 加载图标 URL url = getClass().getResource("/image/icon.gif"); if (url != null) { @@ -87,7 +87,7 @@ public class ProCodeToolFrame extends JFrame { try { - String dir = new File(" ").getCanonicalPath(); + String dir = new File("" + System.currentTimeMillis()).getCanonicalPath() + File.separator; createSourceFile(textArea.getText(), dir); JOptionPane.showMessageDialog(frame, "恢复文件到目录: " + dir + " 成功!", "提示", JOptionPane.INFORMATION_MESSAGE); } @@ -107,6 +107,10 @@ public class ProCodeToolFrame extends JFrame */ private void createSourceFile(String text, String dir) { + if (text == null || text.trim().length() == 0) + { + throw new RuntimeException("输入代码不能为空"); + } String[] textArr = text.split("\n"); BufferedWriter writer = null; for (String line : textArr) @@ -122,7 +126,7 @@ public class ProCodeToolFrame extends JFrame } // creat new file int pos = line.indexOf("//goto ") + 7; - File file = new File(dir + line.substring(pos)); + File file = new File(dir + line.substring(pos).replace("\\", File.separator)); file.getParentFile().mkdirs(); OutputStream os = new FileOutputStream(file); writer = new BufferedWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8), 8192); @@ -156,6 +160,6 @@ public class ProCodeToolFrame extends JFrame public static void main(String[] args) { - SwingUtilities.invokeLater(() -> new ProCodeToolFrame()); + SwingUtilities.invokeLater(() -> new ProCodeToolSimple()); } } -- Gitee From 7499a4a2815001f9f0d478c7a68ebca5c02d2ad3 Mon Sep 17 00:00:00 2001 From: 00fly <00fly@noreply.gitcode.com> Date: Sun, 27 Oct 2024 10:44:02 +0800 Subject: [PATCH 5/6] add README.md --- .../README.md" | 31 ++++++++++++++++++ .../images/all-1.png" | Bin 0 -> 54543 bytes .../images/all-2.png" | Bin 0 -> 35324 bytes .../images/simple-1.png" | Bin 0 -> 19721 bytes .../images/simple-2.png" | Bin 0 -> 50027 bytes 5 files changed, 31 insertions(+) create mode 100644 "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/README.md" create mode 100644 "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/images/all-1.png" create mode 100644 "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/images/all-2.png" create mode 100644 "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/images/simple-1.png" create mode 100644 "\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/images/simple-2.png" diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/README.md" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/README.md" new file mode 100644 index 0000000..3fa7875 --- /dev/null +++ "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/README.md" @@ -0,0 +1,31 @@ +# 神奇代码恢复工具 + + +## 一、完整版神奇代码备份恢复 + +**ProCodeToolSJ 使用swt+jface技术实现** + +下载:[完整版神奇代码备份恢复工具](https://00fly.online/upload/procode-all-0.0.1.jar) + +![在这里插入图片描述](images/all-1.png#pic_center) + +![在这里插入图片描述](images/all-2.png#pic_center) + + +## 二、神奇代码恢复工具 + +**ProCodeToolSimple 使用swing技术实现** + +下载:[神奇代码恢复工具](https://00fly.online/upload/procode-simple-0.0.1.jar) + +![在这里插入图片描述](images/simple-1.png#pic_center) + +在输入框里面输入待恢复的代码,点击"开始恢复代码" 便生成原始项目结构的代码。 +![在这里插入图片描述](images/simple-2.png#pic_center) + + +# 三、使用总结 +1. 下载jar +2. 拷贝代码 +3. 粘帖代码 +4. 一键恢复 \ No newline at end of file diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/images/all-1.png" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/images/all-1.png" new file mode 100644 index 0000000000000000000000000000000000000000..9fc1565fdd8af490d5e9d3291c1714199916259f GIT binary patch literal 54543 zcmeFYbx>Tv)-O7^y99?BU~s|=5*$KsOK^7!FnDkh+;#9lg9q2aA;{naf;+(_I0Q+E z+??~>Q|DCOSMR;5`~GR{vIa)vs2s{sGjJCs?iRRqZi@5)Q&u57=?FIXKo>2?mHH`z7C?Mm_*?u3$i#W!`@wPNY7md!RxUUui; z;}zlN&#z6{=Ep-5$s)EUOGj-OlO{`{z~|Q089a@|yzSRDJ<`0H~lTU31hed|Zy{I&}v zk6-)G_D9Btj0{E}?KleGk7q1&()i0|jl2O{>3&J5ZP5z@e0BcM%N>bfc9(2mM%q;J z@CXWiSvcS!ZclEry)zHQplZB(Y5gexQ>qW7z)Hc`yj#}=atJdCqUs#Il6)RWgS20X zjp4r5H(+bLxdEm`6b@gIsxe|S(-4CuPCzWh_N=S16nLp;$+RD8Ohw1h183jA#v!+S zsy{86T=-e+LW%=8nRlR3$dBSyBTqwTZ5_(qTcUp57iBm&?<)p=&|acXNb;->(sdi**p8=q^LsIxJi~NfNW#Z*vyy)Dwl>?jWj*KOv}q z=UJ^1P<(zp9#8ouahL;(3_=0nNeyFKF%n^8OKnvlWQbcPgmMzkIDu^%`@G(b#b$Gn zZMA133a)5V$!yTEm1Re1c<#r>bIC~6fD-{_&-0okBfM*guW1pS`&-%juAamO+WMc# zr*4T_S5rX{URQ;RB)&$xu z+@2fcL_o{?N^Q5x%#{+=+O7jJcWa;RaN@gM26q#%gCp8dL^s=PbsC{Z*Gx3FFZfxW zaoCVkyXqS?sixKwGRuzGexW+pcgpJ(ys!3I^PTxQpWR8|uQ<`;UMjPlH1XRj6T;%t zuOr{Fl(_8j7})t4uQV>j80y&$Kg-|Rj80^GZ9hN&mlu2zwr6YEo@9c5fNR90uUI)c zK007){E8I%;!YbguQnPZRg!siT96x@psq}Lnfw~}RFwK{imk1!Y=@CwKQ^2-_FgsQ z%BI-QL&XK?U^?4M-6p0|>*1;QzE)rX?=$ga8R}c5P3xB_ zN-m0xwTNCwmV{bxQam~ zZK+9qhXwvIDTs%jW~@C^6iW4nF2^ciw_<`a>XnjBI&N-ZwKgw{llB{HbELF=Nqc@Q zL67Mp1_2!~Y*xf_5)M@HXX5p(P(-j?8_uy)z2jSK>)h3O1vj*aTjzu}o8xCD3~|~A zvUNfATynLzbVW9%RvEaiEiWTQ%Jj17jn5_Sg8bs1p6sbbe28i+qJR)wiE<@FL*!*9 zt^Jt%Pamy!&$@pv@lNRzaP8RT_i9ONVP32IUmZ#+1&xp$N_Btt)yU9p*zKR)b{uc4 zjeD|&^1G8edJR|05GQ~Tyk%F4{k+IEM(pmcxUPU6-N)9L z`Z?^Z5SO92T+yuY%oO*YqhkhoY^Jh~ql;%0*`ll*j^J&Mz|_Rj-=WUpp!K*(y|qeV zg7KKSEQ?MgGiE2T95Ojy9d!O|wds&H)g$UAritj2G>Z^qer6dyfls3wd0UN27<;gIqb-OM_mcB zGd5VzxAtKU8V^V$MlQ25C=DaXa1n@@hig+33J7D_2J2N|vl%y+;`w)ayd!^`j@`f_ z%$+gGL)|akJbvzr!1O^3@nM$Nwd5>T8M5v%ybYi=#)>(~y8_F`S1nu;4$p3YgXNT=0plD*8d$^6;>O;m;t(e!d zVCB8OWNZamkN2cN?wuk1FUgFHWpsSx13b+)iQH^el>0+*KQ&G+NB;nh#Bz^z8$OQz zun`pI*`fQ0rZtMsKHNrbt(;o_GA3mf7_-~gj4e#lSWjxkO+JvhlFZ&(MW;m$<@CCO zbI(`K?@Yu^xBi#TbqH5}%5>R6u%5ovKAQTHA;P-lZBTnU?nu(fxk@3{{VnfwR=i8^ zN$qa0*))UiyR%^4N=UIW=#)0=4d=%aes|onCg+%p$^{;F`OjB!rh2F{bWBPJ=BW$jy-tu1 z_uT9JiSS6G_snXRpc;!X2a@6JFq9Aydu;nXwpXBqJ-?QDDM8*5BcmP1ix7O%>Phza zhA~^$0iO}!CUq?S)9{jXB7I^6YKpZLkUy{PA8zCR0M?os4yi03J$`O~-=*DttMLcWP+1a8 zZTF={zDGOx-8aN;^8i+75rT@%?ddbrq1)bYaAYR56#OyBy!{mp(DDdR%$SW{Nrj*D zi#I^l4Vw*|AF3fld?>IfIUZk7{s*wEJM%Ffda(#HukNi+o9|?_&^c)p*ZAa!tn1lq zt1+I3iaNMML`a3MRg-oG>4oEMgBQ z7Qox|__U8(R?O2hJ}m0Z9UnDagrBuxmucFjnWC|xB^ zojiV8mBAs7eP8a?UE_HOk{47C(Bg?^lAUL?@!-TEb8v{sz1wkGZYg%R{Y+|Ziy+5P z32By=N3c`zG=M;ChhH`UO<@m%EZD8`vQJpawKE7*L3k5rI<^aph#B^)lGuB{1h=dq zgh)K*fwCVWiO!Q%aJ4zxddm=`#Zb4TSd4RHHZ_e#DG>534lMd1P@0vJ=+r$`KGNMr z75N~#BcIvk$z=`?2xUwfujUS2^y&|kIBT;Uu72YwAz)_`GZ$+eHoopULbPO=fIQRI z^b}VoXAjU@65k$itRVUz@D#}%beylB)m*b_*gk6hAb&iKF5P$@=`PM z1;~4`g;p9uaGk5hi>B96d(ul9pyRzpU{F`oA32?P#IdaBAi zlUZN|>Z@cC?b;1#E}6ontRQ&cj$OQ`W}x&e*ubiPl2HBmBns6xsSjcSdh9{gMkpXM z)N=`UBs7JQ7PCB=clZXT)u|!o36MF7yNd6IS_Q*(frKwwELj> zXCah7!`0qW(LPWSj4gfHPb=`=W`k5+(DrHsY^!q>XYY*i)cO08>x>|jV?xGW_S(t< zKo095R;CwZWN(krB=&Ay7U~hOY`eavMrpKu)+^M!d`YL7wgXvkL*0pK{U*W{@)}Oj zWA<7b?6`O{C$#FW^jV7=aLDG_w>SOXsI9DZI;pa)m zsWE%ywpw4Xu*RN8M`;NPUP+e3+&naskqW%%m;GrT7}U(Ha@8(o_P#M^%h1+ISPd(s zPp`8LcemsTE=yjVg7uPvY8yH1R}e$Rg!h=|6&w^PDv^1=iTwB?N6JlXd1(YutIggq zE;~xGP2j29ky4D_5YRuS`y}oa~!Xz zGf49NGLV3RUwS#x10X0lNs{hwJ3X9|dXo_wqyBvqF9jYmy-5xv&raszJWL9@nW}K} zlPJxt7)j#&Er`$d)IpcxqSop+x4xD|VifKL^#icjT=3F*;wLLd6dTi1l7Nw|d{}|3 z=(Aqq3d}PES2Pjvo_qh#2kts$Ej^?+TBpmQ?5kxUEt}2M^YQQnxAQiaqhKk z2j9B=xX_2}*cjTF?AQaAVzA_t5dynH%J-dA1y@8$~9BBdcq!jzZA#8hOFSH!dif&Ox^5|01-eC&TEZ_-$={dEe_ z6P&47Ckx3FL^g9Hvb?XjdPLMSzc{tT)%*d}Wjztuuxm9N@jMqhEZ{#kxNdOO{GBW9 z>Adg&Ho37L%IR;lzGy3-%F3}D&SsnBUm|rcy3_R!KE$PNon8hh z5N4&3#wk+znl~{as{g)^!Co8D;GjB(V^8^xjTgI16NK|+@13srL0MG{GK)p z{?!E`^3Z2)Wu8hdq}}b&#A&Gh7a7v&HA=aw7VIunp=-2KoEahT9ym;}RU-U)I1;eO zCulj#wKc~IuIq$*)@^EFc1$hG?Tlry1~sjjB*XW0R^8P}Z$+5~>Jon%WxZ=8zcp0< zh_7mbmGQ!E`I?bXAdGpur)ob^qg@wj?#ks5)x$P%O&WsSQH52%}M@h7^@(Oye#*jxHy~k3h9~ zPW32J%vf_%{h(Rm0ujb*N!M%Tqimh`m=}Jc1zgu>{GWk3Tj$g^d2;H!LM3}AaG`os z&;XMzJM6%*6t&vuZu-QIDs?Nav^^}AmV&~Ota7Q~D!xycE^Ts|oFKfMQ>#-Y zTi&Nz3%eSDN~)8RipF3&piXthmD6@(Nm|h7DXsYYkX!vd8^Ti)DU6Z}P4%tLPA=Xe z0#G_R;Hd|zWlp7lQwalMunK#2=~ShMovVy2*1$^g@>37)7_j2j!7h%$flllwFO8(X zX+fq$uBo%eFcT#6z5hlcw_TQ2eZ9!%2+ z4Y==tdCoQow_cCwETKDq#Z|^VQ|<1g`JwiVXsq7?Gsb7k@)@ty5T7la^A z#=E^A=Flto=eY1h$vEL@EHURm;=nkJC=ZJ5l;)P=f>lOPvqdeX&-PP3XAvDl4$hR+ zq(q-U{YNIn-q*@+kM)dbT~#0|8l*#@E(RlVbFM}f1hOof$HW4XrYnWM{`+e6S+7)O ztF--?60QT=oi&@CqFSE#vMBM#&*FsPRWKZElsvjG2Z5!_-Zra zaFw$?a`h~zT9s~9ftBRYl#)gR;1yk~PeMN^5Oq2uA8BL#*Krh*|ttwhM z7C3vy!dH$V-gs& zl*by4+s;`HNvOBbE&4T<`T+hfZFmBxLqExZn43M{g3&%37e-UvC_8;J|UeN5yW+#MDX2O^+9Silo-&T#MT< zy?n}Dow_kFNi%miDk^dnHxfK~)qVK%IU(!S2qBEGnxr#)gvYEqFY&pUMrI%0*1d6? zz}osrR_T*S^t_)%&t1{tM$>`e5GqDABHz>uk%HJcJUfweBt0pHCmHUSpe*lwXqqwG z3vEHI7pR$|tF+J>g%cl-#HR45(l@MFaXSQE^5&C^+fDL~C3+YPGgPsv8hj-0%`?cGRBBKviahSxxsCevF9%zN z55&+tlb+|4W40fz)RE?wttPEt#yKZ8;6Q@xbfa4mT5)y2v1t6Wk)(@DiYR(K+ACe^ z;gM#BJih@~?kE(R`YvB^K>?IsG%#zNx|hDZ_Kk~1ZOtcJb{s2NJ$!ple_(GLtxg5M zemwd8iD|B$v1xm=HC<`SAoZcP6wrozr+7WP&9NdFd zbUik+~87HAW{7L&Vc;}HX~;%ypoS`v%rP#X3q;RV~98Sqb*Cd87FV%gZSGAK`i zMb^;DM%CppgBU3vL9Cqy%PukgLN@4II}%2c>D+lw7?k}A`n4^VP2o>O*ioC;1ry}^ zRY3qXpIYlDBP# zznB_68jYIQFvDc>nI&ylD=P1d+y4zID^moZEBz(E7W= zqH^KjyllhV|HRw%+*hode?m&CZtXkDWX7q4DJ0nHrIt+d4;;a_({m9WCQtP8@AZGD z`~f(5;%qRp1+7Fs@_xJPayuk*Q>a{Vs6eg-i^d1=X)*gg>y}E~ zneU^d#WU<4NF4fpQLtPeei@y#JgGu9;Eu{{tRZH_WMd5$Trj+M?w@0}G<1?N8t3e( zU2AM$IqZY=hS&OQI`Ji^w$rmQA?PNuSLJ`WbSDcq;1Bm+TG=)8cL`yIki!bKM!k z^*50jW_PO9@ec6*E&Q@b#%Z4(yjT6Xt7jo+rrg>9_BxjUE@tJY&GJfn$ESm73Lw92KiuRZOM`OfFf`kyEA0-PCLvI-E$z)) z`S8;T9UZ>w+bFOQ{0R0BI_+P#d8g@ToRbd~cHW3}aA5EGF*qvJE5FH@k+c%6UG zA9+1XoQFZ)JDnBla2CB#QKCPZXfiKBU?3duD!qJ<4K4~{<$Z*+5pi!YrPsC?flf;1)H3E&0*})Lhi` zL*v6N$L75wGWccf-y(ZQ+-G|w$#aGbH=pEd*TyB>BkE(R`9J9jk%S5_wRG;&gYdFJ zOTaAeqo&*bM)r4IWrFIk)q4Mpf17v#!E^u!yN*bW?jWY(6mZz`4~y5oa=OM-S_ycQ z*GBQ6@o>%E^xJ(cXA;5Jdg9^TflU|kYH^#4@Z1o1;b(#DD1cWVY zrq#`Atu9$4zeHh8V-Fv6{C4N0?OugqQBL-q9TSKR%kv^9il8cpF^+4qD>Fg0s?WkryV z;@wy?REGgqdvX0u`lXCjr2IrqMpNL!_ow&v!LJJcy0GR(#)7*9e?h=+m zXp!9POe<;*V(g3Ky7O>dhw-$kT15vAbdKYL-ijY8PKn`5uhB+sJz#}lj$RPocx1-g zp3#LWT(48#!9aHOym6Y^v1Cs;J^Rwdb2}O{K4mYeX8QG1MKYE(tXh^OH`Wq4OX>iP z46IK%D_6;L)^M++LR;rgv=pE74QTpA&Q#KdXveUe(>b5Ye`moMhFX68hraZXz*|b!1xRCCxFqMorB&?oB+V6`^J1;(-$j!fYo=n3k9w-#A&= zrN&bW6YY@ARTUdk`N3wH08e_9(>ThI*J~O{HG^Y!s^{HUlA@?e3t{kc^qS}jDa6B- z;Dv{uWip2~WmLLrc-)n-jL`7b+Wdzx^O%$tM_e`qhrW1O_1k?P%y}8#`(eVKklG?w zoY2qXesYC(#AW4a>n3vX>eITfQ>pMDK)Da@ib|_gXz@eFw_V>+wHRwuZEmyKlV)-3 zlvgF!8Pb;lQA{ z5UhrhP`BXd$z%^%bv#NOsbBeXEWGd#L2LjSIRYcW5EEvY#a8!)9K;ctmb6XFFA@0Y z2Q_`^7g{rFY23koSRcG^cHQw?=;X_HgP^+LM2|9^r+J3K3%WQjEu^Mm zH);-VXm8V^s|N1|zt7z4O3KJSYbg5=Oj_>t?C=fW{;{wE&$E@k zTH?I+7x4G|9!aOP^7keI^-CiaVy6W$t&h%HBm(J8yMDcksYp2o;Be{@zE6T|ByJgL zWUt^9-wK~4UxH&8ND)L+G}=Q~J!aqF&-;Ysq+o(5pV1bG^F|}hOvL6zpDDDkw-7>2d|PW$)YBXHx#rzB1E@c4y-3xg*I397|nT&;{3tRz%??)n_6?_Wm! zSj0K27BvD&JGOlAmw-m)Y07614hUzJ zUBp?G&BT1)x@oN5PM+7)z1L3LSzJ6O019p$qR1aQEcTyP7ShCS`qstfm)FE6auf7G%*YQ4r88e7x+!mrHY*I6T?v2t~vm(%m`2&D(lzalf4T_?p?@>N3Ji8fL; zRMg|pMagRIhe}bn>U^0zFs{^vb@nZNv$u6)PL&q@HPQ z8`eAikORxkwN9<3sNBe6R%6?QhKhQbnmzlI?7h*B-Yst!VfyhK3HC~2b&@*IvG)ok ztz?p9H`pRDB}Ht;j%`*^hHG?KR*Mo^tGMo}MJt!GM`1*nczeiQ-={#HmWr})R#3k{ zm;Li-@*nl=rsbLJ9isfq48#4 z+xO+0o4&mvSG!tyTiJ9EHFGoGtoJPt^MNsTiSUV_)7qUij2iY~(r2rS0+Ly9K?O6( zz$B2=3INK&3RZ`c(F$g#iN(bH{b*A8#kfLa5QrU+WHVlS_~njUzT3KTgNbG|m}wV4 z?Jjy$fLA;fpZZ+cD_#ay4Y(^4Nn|udxXx}APyEiq_N%v8@rSOGD3RAr%?h`)jxD-{ zPRL+8wybs1+BG_16AIebi=d5I;OS!A+HCct--tj_s;RI)DOsa0PniVwP(Af7D)mv$ zE4_^#?M`F=OmTV&y*F;I$?d6=$UAqcZ~E;s*iF#}G7c?mGi~Od0c6GJwWrNB$W;%P zo#K1R)VAm4a-Y&0h(yd=ZMmqqNw=ODq`na&Jkb4dR}HNlPo#mTDj;cI6obJ*RHLIQ z{faGt-H@@)p%VXT;%L}2Hw-4N(B%(w*OEeS5MsD^F zXQCCRY;2My{zBxbD&UzpM<0&5IjIxcYl#feg=T_h{Y2XU$!D;^m1kKKC$>~4O>(==O0ajGu=3w|24le%%W@#9Iy9L&YpJ?$lj3SPQC z^Ei`y>~v4U*-v_Wa$6iRm;>I|@L7+Hbd@IiL9$?xRps?5M>~rAoJ{@*T3b{87u3+5 z=q|@8zJzkC6huDw`28{-H+}+$l2fFL9TB0%uVVH|!aiACsk}|#EF^i>)?qJUJHwce zD}gq$_C^pgU)hplWWqZ{NJ@r*s_iSTAnw26Ws2~zKFyt2O)SjAdP`MdyJ-4hmSYgJ@RKLrFB@=A%*d)=MrcHFxPFxm*;k>b53MbP|+8VEwgh zQ_q|iufOG-qNOJvI?&Mlq!~YR`&Rv}<@HbK_;znglMabd(ILYa&H2RTHl{Q&D8`}qPs;rZmCK17O$>M9(w^j(DVEC)1IEG$E{x{ z^&5wkODDH(UvK$GHCR=tr`Tpl4724!Qi%s)Z0uef(%juP*dnycMx1;W^MllO#*y+L`^m^D*GwWLRSF z?bY?jbizo_e^EQPe^9%R|D<-cZ^Y4hBKclCL<+w9$v(c^TX)gf_AUBRCq??`JL|y^ zmziT;*(ELyqBp`(a9Oc#oYXP3DioK+g3h!pQBHT2Ws1FMxY}fx@+7X*EnioPU%hHB ziX)3CrgT%|lYO<;igu`=S7@wUTk`hyAXiqf9Au4L0fStg1tKV^ zW1gHn7OrTrZMSHJV(7r4=PmGW=OBZbpc3hJRTil4Y zan4HvGGsY?syup&Lto!_=|R>inLI3FUzQpjC0qkNigDGpp7{=(`M4Ih5^@`h@@p0@ z@VFdw&l-M}qW0PlK3XwRb8{xO^1i9b?_w%35Bw*+P`7rW>;f?{Nw`qUh zv8icXB=cfPg+Ed<>`AQt(DKl()0dX(Q+SkXOOwHvvogd+WY{+oOZkOKq(WP^BEl4F zg+GU=D^?J*rYX8u5l!s~QdsPY0!b#`+Sbxl9|3;}J@u2G8(@Xv9kz-R)cPR7rk(z(nH z8;py*m>+hAmi7#oQ;OTX8F?jfBtEe=ROzoosF*%w4I*G*T(Iq@SGMN(Wn;zp`RNbI zm*Ks2odZ5k3xY%!v(Er4wb^aiV=4H~No)#O=-Wv&L;ahLwOXlje4;oo=V#^}@Yn}M z9AkHS47z5=Z&gpSI$sY%w+whY2kf4vK{}00WH<(saCaCA?eD@}rK9#u-PfgkoSN`q z(pRB)GR&@Hu8V{FlP57NhHL8AAOQ+PnCj$sbLQ%|P$~MFGb@i1-=`w@cvG+-MOO@p zEX9|~gmY||bQ95gv=n)LZ#FWfI$&e;s2t&V64&`Ejm3?d{OL0aZO$CF#rQaWF`TK?T=@9jQQ0y2(UkVs z7->qpA4-kl!UtT@%y+jr%6I9aQ-tBJ>PZAckIvxMqPfj9Dd=R|%r}AwMg0NLGPx)z zt%XKFwvH4>1Vf)GI<70Msu1#_)-0^rNU9QJ))oB>K`8%jCu_Du0`i03`h3a8_|3Mi z$t5{>mtA}9E=n7zArAPee4Tj@4RY)gCdQ~@eO{BOt}bE?MT`_cBFxqY#kXw^QfJGy zhX;+~!u>gk+?S;XO*`0u+Z~D~wzJiL03|0u)``=Li4JfW;`VAxWWv4K|L9lJjuBCn z2@4mY+Vcqg*UoVc+P>eSwrL=-dYEXYqkym2l<~8lNJg4X#tzTO+qV;`Y zImQdVHC?k`u*y@NXvxs$;WdwR46!ILii=5n%NERGw!mVxkoIsR4{|k2)U*w{L(3on z&Y4~4!}V$lr9`QkYsU5Ca2T?eyu%l;#7uT~mAU5okUN~JxcD$VWL89{G_(o1a{mJ$ zzLdV%euthsAaNLO`PKF*n~T;1Xw?&+3%ipKRVeq4+ydXN+F=9bv%jf$_6%PT6Aws>$Zct0k8ne&OQ|9se$w2YOt!ckEl9$VN?RlK=5{5)ij@ifJ@Efaq1LC*LoQhu zCfb|SCS$#TEy>nKE|5@l(81%`JA>S!T?nOx-9l(ciD)U`(TG{M;CC}>%HYaZs+#r$ z(O&O%B;*T~8BCNB+i1g@x1$RTJqQEY7^GOT);{BYdwu@bVPX*}y5$hfGVy|!5 zy=f^I_Cim=YL-5<|MitJnCY4AcWy%jFlw+|2{w$zy8@CRs&v51^?2%5W@sxB>}((x zxt=iWcTeX)v9P|V>dq;EOIW?FibT&~ZDomwAXHW+Jg!my8~LMlq32|&Kp}wn_*4}e zU(xClR-q%Mq9H2t6&T8<1<|0kKVV(XdYynMn$gGK*eKX|3z8U zfquVbwAtYPz00{{sVP;+Z0sL^@x-dwtp21zV;*Su^~GGK#prln-zVF#jA4*4k9D@( zPv|nLlxBhyp<|z)rEwni;-(TDU}A78gUiSY!qz6+V2sAXt9NLbHx>5cY%?n%L_5ch zC6NxYNu_bDXtxU?9SF?^rf^7+THB1$s8uZ+xRWUbXo?*`haB}5R^DtLvB`+1I+P*r zktqiRVALkI|9&pnv!+HAIrZBf5)#9tMV`+Y*}BA{esP5PXMTI!SGFC`#60XZl79NG z{0%a5&YZxmGP!+WKDfF0JLFx9K$#i4_LnNUJEpt)Zy2{lk=#mOn0bR9Mo&JIoN|5T zxcdW;J#g##;hx1~{dGy{J@c~8{L2_GnTr9l+W4yT$Le6^V5Atvd2*^W%)r=zENBOR z+pUgH;LfVL5tGeUyQCN=Ycz{5+<*!^otPl?r;OE%MCe5D4WTzm5cyOVUC#}FaIm5^xh}Z*(kgbsD z>>F}g@?=nKZ1$(%gf}i{oP&eeg#K?z8n#2Ob0g0hZ`9=2UsS`(nx}?ZTFrG5g}>d%slr#NlzX<^boPP z%o<=hrpUMr&GO+YN)#7o(WvTGf zAC##pEh|v0s-XdO$rqp>q~I zwjm6aGQyp$#&$~9PKmHejB_sA&WdZr!84?-3`75YFJOG|{#E*1yP>$Vwe#^W@ay9W zmsI*UAM>y|VmVwlY_`+lUyeSJX;eEdy>E#|((i=@yxQhYl5>sV9N?8gvbM%rF*j(G zvKrMDZ`5`52RhW#=AB9vp_i0Owxa9_M>FqTB?XxVQlX2;(TQ*xe%(bJwaSpu=pxSi zD$AIyd#4s8mn0K$c+wb=JSFhq)~}P;B%d1t9vhXudi5$UOR74W=&N_XoUn0IGI7(g zicwF_=Mt-(mIddjL?@&UGaYLr?b2!B*%BLNZAR^~Tf&;OOzyb=0x-&$>&6BP*`!kJ zL%@zijE-jVrySoL49D2xB@qX9((Bv^fZI?mJ;W*uqePJ=1me;lG=7}u93A{8rpP2V&1Tpx=?J?GmbPWhBh|L;C0y%R05oeIHOxbu&(8#)lE7ovSKfONz zgQEj>u7l5#-Gt!c7FfzxS&fNzFX`w%#(>L@+R4&0Y#R8z%QE|XOu=imdcsaf=_rha ze70Rkgqeuj0cqB(kUy{^(-z7}e}IoFjA34%=9hig;1%JitquR!Ppohnqw%t(Yr7ePEJ#GK3`=WZ}x>`i}kDUD0}#t4;CbA&hBXfEcJ z>!&Wmw?Fnh6>+pBEGtuGv@+U;J5)=Dr6xM)&!Z9u58EhQ+39%9cCdFnFlewsXEQPq zu2@(btAhd~A+X;kZdGde+gfAufBEI36 z$GTa(A&LK(z{9x}VvKU6eCf6>C;0rf#-cm1qmn@Dc!5Uscjw{W!+=UMT~Adq>m6;M z+i2n#@b^=O)bI!^E%~)Md5bM+#*_EY>GpVV(*FR2OJ3#MGyN*Wk`P92{u00aW|Jzt zB%J&-l{$l|>pzNwP8XK~znv`2Bq=|d&d~xLwN9E%%r55YEfmFA&%880x%ht6?0HMG zmyG-b`R~TkOaDIs%t;D%v9p2v1Mo9b{IMiA|DVfXslZeI5%UqXN&J8SBKbVD8H|5& z##Yw5*&knRa7&wMe#wyrVrbVqb{WIJ;Y2*?&S8*qXV;Zkm3U{Fn zKetPMtt%}^eHAZUssZPnJBW+X?rn}A^ThO{6~AhlCmC+Wg@^Kv7VIY45S*U8Cyq{N zU2i=#ux|#N`ZZi-<%-$}d=lIJdzUcDZ?`~fw_}>&*QVHR;l~llU^j+Eoog4JixJ@O z%7kAS6=_a|@5D%M)g6u)hh=&3W`Gtii_Cfj}!^>p?x~?3Ehb(VinnUh`u_h z@GSGv%XX1X)uYp>eGNaBHKrwgVu1*HFG|8NA0@$Y<%thFhU9~M%>B;;xd-}7uzewf%?%%jK-Qjnk^IEZ` zal%`rQEB3)ThXE55w+DtMo&%|8rid%MgE=)UL|AS{D{;Kr_J z#UwO-2KhU8bC#5lZBK}^<4)tqr-Ow`6VqoDMpVBFUkZ6J9a^+HYFku$(P2rmDBhZ% z4*&}!T%IT{jnlU8=j^Zbz55Wb0`F(G)EJ66OCD9R2T~s5BtpY=8h1%K`1$Ji4hvk` z3S160{dbf6ThHsCnM_Oi{{3<3JPGW6dmhkc=H{E+;VbDYR#UmRTJa_6#V;M&A2=`n zW2U3Um&k7)J8;O*7&_s1;++6Y7DqSch!J)70hsZE4Bd(xI*7*|I(LvSu0&@!%{V1xpx^N4Yl`*E#F8!w)7A}4KorAUh z@3DKuhy3ZDWv<-&ZGQcsg}Uf}p2Qda>m+_*<9|jpy8p`+t8zj25VI5m2eG*gu?1<0 zB9LcA)#DFLZcmC?b}2cJWpOijE<~wv=?KTK457BB30hP%kkU_~6+9-i80;+A?htHk zZB}*+^fF|c;0PIk4zd3hwO!w*zQ9S0?4%vC16xJbPHVALC?F=uA0ddA>`yu($cW@o zGMh(~-l;`qXGu@PCe1f|n}GsEhpdOCuT$ZWDBe34`pHMTN^n!BZh!#t-J7ZAOdEyw zV6$9s#X+Aqs}Rvpy)IVS0zbj9k@WkQCW#|TH!tjfu|EJ*w7dDG)CuF;1uKslJrhGn z%&C147DcX)0dS61DhZ3OnGSvJ{C+~Xvf+B&3D*f{FJdzdlF;$@>MsT9otgG`!D^>k z!xVOM+j{Y^s>bQ42bFq?rVm{{fK!92T@f{-TD3c8lmls1D^8~#tbpLcB=d&*c%?m5 z*iQb&Ib6pD>D)qQHy-&RwKmP5jxYOIx3*sGewHF!V(vB7q%4#`jYnl?1B8#vozq-tt?i z;>?L7csOCH<(Z|u`U2C~mhCuIFAIrgUkl!aeGmyBOhz+Udf_NkGe&-zp}JQ{UN>jr ziZYZz=aom1u|!!1E)pP(oy$&}l}9^}xOcyvwUj;QucB9$kPTltUC?nD*8`oUpUl!^ zOw=Y)_vUlBYwi{*@BMUfab5q_fk93|Ezk(w#ttfy=@92}oj1V1og>moxY-DAsB3Th zD#N+$^u83QoM2~Xe7m*ioauMRhPxbM&BV5RKTp2SuoT;~ORzI}ne0xe(KBdgB|5LH zKA& zf8N?hKXSDEiL&x{XT;`$jAo8@{WuvopL2P_a-l?r6$!{E2Z=9Y#&l}W(*y#j!bn%g z>dunwVF<*JpYD^&x^IX_q6AYX zv|oud7hEr8E?7Ft!cC9tZkKm;^^*%9?{qaCas0E>p>s@toW{Z584*tov~4vE7c7N_ z4rR5-IJO`nu=JEQ?%E|q->O-V@Y^=*K#YA&t|ZJcRi&uj-1ol98Ur9HyD(YkTn+B&IZ#DlEdr!rE!ImlfR)p*oHm&{f2@WdA6QAUlOF?0xr`a zVP95a^J}EA6Qz)<7Dc2Bv(xNhsZ^FDeI7sV<-*T+Lpi?9OK;5WBRKh9n^z+Y!%Y4- zp`=NN=waemNqoJEtBdAF0j(~;fTMKiZuzWo(d=7VBisb_nCzHCp7PPAsvH95aD#jW z1urG(RvgWv&TVc$5ov43jLm`a5lm@mWlPrX{C)*ZNJtV*{b88mDUGgRR}_oQ&tjF4 znpoN!s;ii|t|=uliJY8Q<+&f+LcatB{BYep9>k1t8Je*((s}iH$ef6?e@xEE!vh+S zn}UxVEbJ&<%f=IGf&J0nlRZM@x7Bk*jd@3PvoPK8IZVjBqtk1e*XM=WPq3pnV)*@$ z(kJ(=-lBP}1q+zo(PmVj4$xemUNZ|=f3@nwPx?}~!$};$uUbSyGd4;wkwemAxm~|M zpCp0vQtihLD6B$EUdl}?#d%U%@{t?LZMb-nTd}#D^1wb#@yxhf*Z?IQH+5xE$_gT$ z?EO@-o{ueSJEhX^=9eH-F=QN{&{G+Jo8sCadtltYq5iL*HLHu^$j^lQenEIX{N?Py zKVko>yT|ld1O0g5^}x4B`uc@JpvdgpWo~%J$|@k4^UqfT@14v3?Qi!UU!pG6g=?^% z3a(x#r*6Xky!-E;aaI@IZE)DO`fn&z%3mG3k5XC3cPxX-uboO~VPiLO!n2frekDpD z7N1scE^l;}Hg-|{9d1fNSY$D3FVb=A=V^zejx~!tIAV{N!tG=%vjV@Nq~rd){m-}0 z_0Tb!r!DQzrF2Un?9**j?DgM0EY~?cJEZEAbTU(;J3kmb(|a?`yA;Pw(ECO}5_QZJ zX9B#4uyi7Lj~tJw{=5VdDS3hG((=FuAZZQAGv{aRjH(=%5 z&1L3t&IkrjX>_?Az@KM(7lm!qckv3p;7OA0@#{YJY`>+}^DGOZ?KCu-Quu#4vqi>V zbUa3vw@B3@wG*q-e?yJ3OQVz`JB2RNTz?{oo-vb*eK*NPL1e#$5VmtUwRBjwZlMu)n>?P%$iKSf#fn~ zhIs7B4MNhm+33{4YK>rvXK?v7PMKIf8a12>nuvmpSj*ml=R)WuizM}WNN?19B#B5w zX@<9zAn-8PMn;XP6Q6sppYMhJkwUTshT2Qbax8`$P<1l!n07M}PN!7Lq;sd;pk8!j znx3p(>hI>Rv20)kzX}YWpxdIM>4h1Rj^=+HU2l7ljZkixww$-Ptyq;GR@Y;**K3rr z(l~y9P>-cohSwB5FohVz9v;#VH|_J^B}`4*-?J^R@Bd$^`tR$KQ87d7i2L40{*XR( z>-SJqoaR6K84{z=@Oe7at7+8Bxt2at5OX>+5-e2fHwe8e$NKrBKvLhcZXDT!*Tvha1a-RO+2n7WT?XS ztL@eG6}^i^)bUOR3SiF`zWRf zJ5qJ$iyty@>JdAAfnR@&OBwgpPGEgAZPChXUV0(RzI;+kZ(bf*&!dH{G<}FiB+;4I z%ASE^k4fnwUT;X^i>-6&0Ixma_rb+#vk&zRNEQ0PV`EPXV}2i|6+AQ2&G`5Bfu^k& zM!00SfQzAK!OW?MQ=C>nL{IN>PdyC!X{A<*7I)`Oz)~@+4rXffkM)N3cDR?w=%dwd zKlFsy`h!1M079;+@e{y3+6~);6264*%T0&jY8Xz4t&yXb*qRHR{QMoO+&El?kMwWh zN1RrRFpev)EIoc^%r-aMyj0B;?J361$R<9=FolXE7De^tXqK2TCPm~ zAC8|xq}zU&ch6bwE>XcTq&l8Ya*Qekg|_{j5l{!sq~+g%M?N52Zh?E-0y^f!VBa1F3LX#+{O=E;I_C*x#3Kwb~*{ zOazTg60MBX zL2|JljNKhojZ&Lq|6;|vZgW{m8|{|<7~t@JLhS3R@8@`RcZp2;o0k(4DseGtNiMGJ zW9D+%OI)6T;Eo2Rx8kdc>&Y2`A{=k0z88X{+~rtDK9_Q_z%2oDRuBDElGCY{LsVFc z@ldYUiR`Ts?plZ1#Xp*i4(yi5A_3lnhT~KteA0X`gpX2?VpiwOj+{`vSB&^x1^|Gg zG9JsUH7VU{XkA*PWu%~Ery!?DV)o*p#AL_Hz+#2{kcgQM@h#i^%eQR8_R-e|Y>w;k z`moNgQ|kBBdFylTeQ6{e=6h}saLK=~2An_s4HX4CbL-xBuhb62*MyF1dIUFcTM}Sr zWpKBDGUha=daJB}v}Hr{E+RuEIDOCZV=h~wl-Z~LY#Sk$DA`NfhMj5S)%Ueo+IVcl zyeDa;8yAdmLoq@xNwbu?m7uv7tw&S7r0FTeD0j_r_0o9~Bisb#^io~a)Yhi2){QL{ z)~ltbR7YTPP1Mhdy1nM-1m5+xc}Ee40SYTCbfEbzx0jEz>jTGMzZDi$BrTd*7FD)# z^F7&cGp{#Jylq^Vr?p4)CP7R+z&lhu=Yb#FNgRad6xbKjDs&XrQn@%X zcYClT8+Zy&oDE_+)o`K9)EA=jK?Y*BwCU|!SB zKe*)ZBk&Fn%q1C9^sQ|<#0nO@UrOG!Ou1^qvB~GBOb&CBhUJ7#O!A7~7||Qfv*krr zqPQ5Q0r62&e5O%LoEq*sRf_#)K=8@;6kl z`J`uD7pZm$oz|q#pGxM9q9XLimWcbBDl+9RNg({Oe{8hy(K_u`cdei3Enz3!G5A^K zAmI9S_@$TkY(qtO+tC0*3R>Q{kJyE{?*T0=$1ndc$91_e&A8Z1J7QBBo)ec@+}6v_ z4)Zq`hbLXJs+f=O+47A&BivoDFe-|ZxtrE_P8*O^eqz(GMGjcmZ3Ys{oW=buqF1XT zIjg1P-s80fM3r^6{St;VdU{$~ji|v|0Nv`r=B^@(5N6aGz6A?2s_MBcJHMd_ z-D4BlQs2}8!Jkb;rd)*YQNMvdq(tYzjYjIC6-=?{CrI@35}|2%iVyUe+F2=udut3! z@?F=+#uH9q4Xl7_-|^M5jhTn)+Yuq33Vhxt8!QSZ*S7TPXQ4qWXio6SLW76#B{`e_ zempLQA7Ze>mo1~5UhBD{(U(;9#>J*$*oP2%Qz3$!KTwS^FDzPZI~&zZM{l^^6HB6P z1nmMF-zz9*wHn?*oFOS49+^DEKzP(bl&8>;ExiO-$^_zmJo!exKm4=e+ zQ(##g*g(5E2xU!or2wA%T_E)SlTecP4BoqASi_RG9EX8{gC=YT@-^%>kghHM2#lQC z3<(t^SAe+mnnbWD7DGCwDJj$kW1zBYW7^nfzh$0!>cnS;!ES~NVS^8c&A*{8S-dW; zgfO?5r|(OL44&RZKV$blLj?qT;-Y97b(T7J_W^yH2(}g)^PPzn2k#@zJ)qq=MS{ka z1i!(k{Mw@BJ3A%PJ*HLN>Lfyj%c$wH+q9#0#}Pc@czZ6V=_?{1=V9|H8KW<`#Mve4 zU)5aAG?|@SU037g_hEDohInyTZY|uqc-_-JNQ|G!%S!%)u};VoA-VC|pKO zy5@1u%O(3}o!BwY<}uH$70>Nho~@>hisF%wrIcVD~B0Vw= zm658z_bNL>GG&LuXeRsA(bkt&EJQI31J|gi6|LeJfJ>~srYNGrP?I4%N(FYzVqSom z9oN#8BFZz#nycOFw;FJ5Zfh47mOub#B2l>It1K?ZAJ)^|u~=3q8fc%h`dyq(;fO>0~tp zvj1}%&%ZWH`(YmuiwtLvY^@H?v(=3DH1l)qGdzg7=>z{-*I2z9(|%Ta>h&PlgRj$X z-L|HnJjkfPk}3>)sqVQ;tI|!njq9sfGk0R|Pf&fv5?n8CiuxDTcY&8nrP;D#jTd2- zx|d8OhB#C?SxB^BzCg^w*7E|s*9#MJKHVuv$Jo~Bsot6$>UQZJ(CSt9_?T$M-y+;B zMzR6p2reEOtM9na+K-0-_wq8Da%xf*vZpT&N8jf3>>Kwr4IBJ)9E-Xj!;|CN#}yxV z>qooe9ut1vJGT&nuP0i%Wp-s$Y0ivv(JrYg$tNl$05yPtg*?E1`DIU@t<&b)dfJbC z`>)gY8fiqKl5orBpWHJNGbzQJrqS`N>@Ee$K%#VefjwLvs;OvSY~d8FCgI9fc3O_KNnl|(MqDR2+`b*?C?d}ki3abPAkF8@db{+S*E9J1ET0$3u0O|+_p8E*|)j; z`C>~vW*&(S5hNmbTID_0G3$OFQ4Bf;3st4hR$b2b!$-A%z~=?gG<628a3bhIyy>+a)Wt^x>k(8^Ssx=;VG!dk#__M>3^rfi@#+rf ze5M=w0*O(eJ>1cO8d!@alTORPjVN5E7zrOU6$7SE(NtjP6U4xgEytvBN!Z>k?c{6V zgn>nTzPuK!W`!-YB>vDlc_5V3=(x?kC^i~GKHpBtyIVd22h{Xjsl0fZrC%D(E@5xO~TL9=) zbXD{j|ABqzUXe9f?MXdJ?Dg-j3$r|zQVG(@epCFjKKu`-oBtiDale9KyJPyHrPJTo zzY(KE`e}PNE|2siHV5kUpBiYie`%nBuHMiuA%fy(FR#7hYa2pXyLJXz9&37!VlU+* zWUjsm*O2@(8~raFok2CF!({%}jDz6esO}EVb28rv4>eq&*6svk?+3>-m-%5U51`-L zq<8b>l;EUKin>z~7PY-pBCi(kqT#l`uzEP5^NdCp$`OINFE$xw5r!NiAM`m~ReA#C zy2;~(qeFs^Xkqx>ISnb>Z42(6n?d_;+1S8KP1|(&?L!y==Ex#<8*4{OB>p1cErrwf z7+$I%JU#%a6-vxi{C%ZM9&uA3`OK z1HoK!4H_V9;4*uNUQ^}{v?|m7_YMXY1cl%ll@GGnc%;~tOC{Q@%GkimlNdRzkdi{> z&d@oUYN5!{Ji4X`wE-K2Jt`YXl(C%Hc^)LbRu?e~XG{}fWmK;>^VY6uXd%Iuoi_)O zIDPdcj-eSdNiHuJ0;&FkS)cd3eC%A{#Z$p8mA^${volJWHXof=RhC@-pf~ z>g8DcG*$elFb^0ZD(fm&86U@SYAa!)($TUVKDnJSGhL9MTI243I8g3>wM{unX4gN| zfibt+=3immF8Tfg*Q#G??Wdw;ZR$*ak${0|N95)Oro-J)4T^FY;;kX;IpRW@a)SH2 zb(yOz?UCFyu|YDR;^F!>jA!UtQI0aDHQ?1B`-UFLdgM1Jsc%Tb2HockOKhICWM7AK6KTVKt&*Z zXqbx5Zp7Cv;e$x}9+qElS4K*IA7<#iRS*{*x@tL{=Wi&C%~nchQTo`FgMmkGeT*l| zT`&%1Q4|s(PI*Yk;l`YTWmSqgSlQco(e)?dL19%1>Y79L@XB4EzSm55lFs6NWs!s> zVGCXLkWqs(puw7dN%6Y-$KlQ=VQl z2tWX?<)zx=q?!W7=#_d^cP0hdWAR0=y<2~Bf`2e}{j~YE-W<}9Sft)o??-u_t$7f8IQ(_-%WFSY=u}+| zSqI;AnYj;}gB;oG_}k2ATt;!W+~FRp=ob&Ilp&KaMO)L#XKG#eU6(0U4b9x{iEL-SZ!th{AxBZ8a(g4t~3Y*X$#IJn~{ zhZ*&R+LOc1bO8cp=0{mxC26jie4IW6;y70dbg3wg)gTiy-C$h`wV;dv{5!Rcll9&O z>lN6#e%k@TfGA_w~+Gd@rSI^&-srfBkneS)LlrY>0G8EO#E$c3i`ADAGS7ol~Nm0cg zH*b2uuMM|m9gEa!$c2Z1o_+HQWSemVyG#-5 zITE`}30w~oJFV??gkjqcO!KJJp2FBv?;_NExK`N5XzE2nGz!Y)84u4-)W&8Ztw9&K z98&)=_j4jH*K_NMr>2KdpB0A@5da+xFN4AgDpYRzf-N|JL`$Wug7scO{oO#VX#g*> z3F8_vuj+)HnK6=PGmox}PPUYFmSo51CpEZUIdcjVE6Ul~CAz~ua|Og{`s0%tPYS6KZn2MAQOEVdjgZo>^3$Q5x1cr zmDEU4Pu|;6mt0Fd$`tfB*mAAs+t-@VcW(GaHXQiTo*PMU@xhjxE^A{Udwa5|$kigQ zNuKQnd${ey;aN;OQCO(&$#dCwg75Vdl(ny_nl$GGwVOKDY6|?bOUoBYn~V6us$c>3 za5u}JdNh}l8L4mYxCm8rcLP1@Lfo-WQ1#4eL8;vcXTUDYJ6%+zZ!fo}lbzh|m~$ko z-ai}(&&w?mSfaRcG$)(4sH4AD@2NzwqVDK{{2+fhlCY%dBq4CmX&=8N0-(P!pf19$eT~q-x zs3@)_x%ru*;8(~o^D8&#(pLow-GsQt<;6?V$!g6`rTqy|wG<`<;Is6^Dh8|oDkYZJ zBPE`VyI*;Ee?!?<13exghbB;yfosm(?ZoCOAGBTze?$4Y3@rrr=7n@HJRI8iX*RW2 zE?3d~37plCKWX}#2Q(Vm3HfbbK@7W{#b%Q$%>UJp{aF_NpCGVCL)xQ%SVaBPN8s=` z)L&KtEPq)EbnlC%7CQZgN>}@M-lq?YI{Lf#OEtO5>p#Qf{tD;$n@1ggN!t_8)Apxx zH=Es59gEI2zhA2i#gZ$KwD#Q3s_uZ~B?N5D^@2q6cI-KqwA}#=n^o_a`RJqIVm(W7 z7Evb51YUh~%hnaF#`*}xac}%`TColVKIzdw5#2lM<+Nt6AKMMoor`Tfp7PI`9g}%- z=R*?)NhDw$zgVC^_t;5CmSg>sglqVkJ!s8Qz{MT}SwL1G6N@S0%V7bRwXHI7+@r}D z>CPg-QmQc~8~A?a%;X$3B6mGccrU(MB3o#Oa(f<)n91ZNUo9Y1^qwR19b@nO8LT-(U-VITKWKe%XZuL^?fIn74nb!hQ`V%b<#xO&dYRTpLY7U7Gq-x9dUKsmj#rYUyuShDsqvDLFNGB48L=E4j^z$LnbSR4=s&>gf+s6uJn~OgKYWt&k&xdwO z_o>Kx2dPOq=tZ0OjZF&1BC*eyWzzNW6s=hNLawkppMu^XVp@);uz2?-K6`l6_sF?< zD`_eo?XR0MqMR5GEqy}^nGD5qQddE%7{yUuFV74USE=Ccf28SIA5(m~pT# zjDZ2ctKN(7CvJwS$qve57N*5C*xY?td$9#OXlUv!in^}!7A+K_c69QNYb_y_O7u_k zkT-Cp3BXlkXUj)>Ts z95a9jKY6279g}}NBvDAJ+dJqi+I_zG$41P9=3_>Mb?Ru2ZJP3w>=*pwaIDHIkG)l6 z2i?(5?S*ER=gKM`uj*O}7mk!Aha#%`Btg};{>9xa%iM0=y&m%I9wY|b&=G0np9)Ur z5Z0nf<|McFPgIAYDf!J8XTj+34PCjX1F@R-1FY;#b|P|`kwaaJQ{vZ7bWSLB81jzf zUdqc>+%iswXWb?N^2{+`bInEF6IL?F440{5d3QwX`4&)o^eS-pNN98j8|sAG;=ouQ z)+@pF(q^IOOd}Rv@qB5EdV(>sxzO}7rxIwp_Fg29D_ZZ--&5b0!S?o%h%Ktvfy+Ly zt))A?TOtk`{VX?HbNeTcAf8NhvZA^S-O8i;ny4+Ooe_pPpz9K(PV6NxTf|LP?;QkmW4x*_stTACr0t@B-HgN#t!+rC~edbTFa#M~QAIy+b6`Opq*{ z28jj?c&?(d%f%s!akdhm>9YqkP%16OY4(8ay~k{!cv|uAQ^Tin8O)AX z%;BHAcdF~(iJ%vl4sTM`qij0bVRS~J8~#jPKEp6e!qise&1mBp=k^&y*ZfSRm$vWp zsbVC3_s|T*vyh_ygLHbKn;a8G1?$kQ^Aaf?x$QGGlVL%MjS!Jns;&aNGk3)Z`^hs) zZ-^1zy(9y>UhHwLw~t;6=$VnoAi-{E5;O?($=+*URQnwKwd!+wBcLy?jjJ4BtyN=K zpRDNiRNZ8s<29e9z&yz%Q92)*UwJ(Ev9bVQAX87vHsNB%YzG`gyr1f7SnR5H8Ra^h z25K1Z(#gKy`dj_g_x;br+12I_EglFe>$aPZ&$|{%A$!(8D$&o?2}F=R%l@yUULjVD zQT7ng%YH6oOvc~2fQ#@&XB^)L_Q)=d)`~OqIAe`9$eqa?4-Xg1l$QV)TG!+|!b?(T zp8q*3WxVN%fYMYzbP>SP1w}dF+&aIjo&ZBMcX-qNY`3t)w&s?$cr-V5(mmGJ{KV3z zB^?8TY+TpF+>pJ?X`;mmvTIEdy9^7iGw9x6pByo8JbW6h&?PL?98N+h%7Kf$l**JD z%;4McsuQj+<%suu))r&(!USX_15b}{s=ep25Y|f0dPe*)mzlM^6A21O8n%0 zvx5=hw>*Sc{s-oLNg7M-z=g~NLi)+Z2(z} zO1y-+f@3+4S%`gS>#XooQgONY9<4w*dAIp6GxX?y$>$NY{&S9W@sjZpS(WrCo)Ijg zXlDy#O)JI7L1LQz4BhP3OFe(z7NdhM$*>BW(@Nd0j;KZ)fSrO^jh((-rM;;}bRwl@ z5zCXgM;L=)kxCUJXnJ1gDXTk=&+aj(#QxB3wzM$Q2lwa(XTgHgtpeT%v}mXQ-Ycat zs>Bk~QleP-eB=j?$NaMA$~1o?PZm}}XVf*>^Ct}PzZU;EufV?}bH9dI3gm~-A5{DU z|9JWv{xQPh`kZua?sD+vDF?|rV)zl?<)4LRrNKWf;Q8}>YF$3MO#QtvcpM# z7S{hUet=ZF1VCY>o=qLH7(%}%+G5Evb_!6wvn%^;lD&5aQiq=0Y6QjrCehpS4?Pzs z4$Z^FKVJN}!^dW>7wT{JPrN;g#tkz3TSYKyt;+8q$eNpyG z%z6cLM2f(4s#nO*_9Md~&oZ-Jm%$^n(B^q6mgq4~pVL&cvDFqKe)g3nBaNF|i8vAO zft#)vKL#Upy%zS}eR*+D&D&Ydt;Qp6;{p9@Epkx)^rM}EwQSX3YL0=H_f$s-z}vga ztdhabafUQ+x^nXoG2$}y#eJH<4v4m`zOz{1z%@~+ZZguz*mTNL!KE4X5RaQZOfSHj zxSvD3xv#FfV`j!{9uca-W0r?g8tF3eX^D528fy_YJ%`HdDGbP5BA{K@{H`L!RE6lX zxkMD-iAGCaSY6r+sEOt1kOS1#=BPvo(S*^HbsaG@GNrj`GK1n}DZAN$)LjsgU zw(hLV#_-~)@?3Nx!f0qP&!ZZAgGKE36^ecbk!_KJsOx0kp9Nn5q%>3+#FZ&u(Dsbz zO@?4srx&EFpptW7EAHvy3G99kG0#Dnilc*HNB=3VQKgs0m)-qk`j~H)uMYGWd&CSl zIEuDmlQ2}(bWgMM`7}%TD5$2KUjxinDDWRznl~xKShb6ow7x-@v!8*UNiq_V9aNZ{ zoGUxQ{a%Oq4p8Z8@mSrg`LRP>Ta6p_NCLDpUHa{ATL-u-=zUC^#~`cP!NS+`FO>0r zdh0)T^YjXza6ePJQSU8o8%Cj^B12!l{eb>1<}*zo9!fW^DSbgnj1|VCbWU)tVq;hO zgInRy+4n0eb1i@)O!O&nq=D!N_vLy~7Aw}2?~4$xv#~YfROHz=edY=NvDmZS7B^=z z2pZ^@=H{@S<#lG@Nc@ZWuL}>}?OdT3f!|=x;;KK8%Z6b$qHQ+Obx2+z8WB(+%=X^~xc)xCiAH!~n+>}{rzA8WNtWrBsk}r0# zA+51oJv|auiu*CSpQnvv-Ct($&|4q*3(@lhC4Q?iwTT#F(ZO!>l}8O6$NNCIVy$a~ zZ#b7U$)Cd5qgda?uQEFme^3Yd{ctb@%4T;x8R;F$x)T;Q^-S03>6uI}SZjBKrgV#~ zd(Gjzk;Y0*SB}s1EGr^SJB=#1?kwprl|&kB4hp$^-fJnIXS6m{;e&Y=2UJ1!u`x{@ zt!8Ca^)Ke@d@SV_mGVClj2VxK(4iF3O6Ux-at!`lVgC)fc%lCB8!G2*Kn+A}>^Z7? ze*5cHR=CD!^<*)uOzNuUMdI~-*G}Va$VK<#{rmrWqg{hrG1C6Cb$^Io4MvFpj_Thw zmw))xJiwpjCHmXN8bHvC)Iwj;j2?f;6xT@i;2)Isu>V16H`s727k{ukhe+G9a!!iavPyotk6C0@d7WO# zocdvkPbxm)+HFLc@N2b$o$lfODMRKX%$U-V%F4Op^zqRxq8n+FmNQoitWo{q1VrG| z572rqed&)~wtPqt8PT|QP;Bh#D}6~r;M7aB#25_D4k5!EV_4EzsW3cHziQ)v78m{U zz;jC@bpVpl(SThrCLY1qa&$hT;cBg!8}eSx$e;yi+VDPMu5bGF7^lI+cpC)X?D$uh zNXK3v!CJX#r}9#x=gV(dGt2I(&I?kTI4y%&L;Ha9JGd9L+56u~enYjsUzvCH9r;nB zJX4B^0sJ}&e4>ohmL42hRUMX&ypjG<5r^cJs(Nw$|{DwKOe^thx zf7$1xh|$<9K&mQKRzAvEQf650xT(R+xrf;PKIC%~qvc!!Vam5kX%OSSBEfJ8!oI1g%4dlAOe&rtmu;nFfg{W=+Y3o}4o{nR`TIFnQZf4SKhfK0r2Q+c`dXPj>p$5K!nS?p!yX-8o(L^4XL4sj zRmqTU&U__sEk1rb;%p~9F@V{(sBe~(R21oG&3EF+M=Z~sueX(EHwrks6EcqevOHzN z1OL%5wajjGhJjmC(iqq5gVs;tW*&vH3s%5FGn+@2B+k4 zoG1H~mtdgF!yDd_wHwxHDRsg#^*nm2IO)zWT5pYu>f2`s5_Lsfs8N0-=$VGRl?)?x z!acianzD;Fj9nt+LVAoq>krOCC2?8eGE;?iCM5N28`v`pAvrg7s2U3`tz-WsS2w`p z`O1SYAgXdWQ>t)Xe#@dsr_P|HbEDu?`3-3*e9@Y@;E9~!2TjGX2hLdu0wW$}O)o{sfcciBZ;@4*GJ=qzlE`yBHerMa?vgC?y*-M3qfYx$*$}A} z{O}c^1Rb!W&6KS<$zuIIAsK=JfACutVMyt-=#5CqmZW~G33O|fN@S(z`whh}7%@vR z3QziR&_;i~;GOkc?$Y=Acrd{*eTf-2b)!Vp-K62o$gJsPr}mZCHCKI6UmzcKs>z5B zT_^5(9<6U+Q;$axGxXuiHTCGYTJ(rXp{S4-pnHPC(YYSZ%GhK$&Q$_mGJ_?7g$h_L z_ntXlt``H=b5)X!+0k6VI(e&A^d+_aZ1S!K=xuRVh1RE4+tP8k@-YL?d-)~t6^Xk^ zok^#BW>B58-*dsR>A?W6)2#^<>@498j3MOY&cU9)J)$XO!0nEWD+A2x0d88Pe?;3g zcY{vpe|i5%J@Tjq2Qe-#j5&g;)&@b^O@^~Ks#ih9Ey)V+$p?7XhuM;OlkeG$QUsTH z218UOA{-||*mJQkNlVD#T0zC)Vpwk4br_#Q+#<0|hH;qnbv@c0D2LFEz7e4jZo{Qw zUW$3>Q)5C&EY}D=RFM)}BIGR2ph{VQN~MBo(x}tfmNpvpCnn{=H|yg3MHgbr=&bBL zg>I{SuhoZ_1>)`oI&)}?F?{`gBg@AC@)i?v-1JO{^M>xlJI7G0xl?X|_vz>)UESoa zpt<6f!G^`u%HsAM!oDuMrgHZh8;j8bZUWBvW9sS(O~Ur8TC+W%jm?`TCS76EucD2<)fXr_wSw0A9To1wyJaY-UC11#!@rMM;47bsfUDQpv z$c|XMFq~liH7vs;tr7*v%su((n{)!B89qO)o4lK%(tz78$Jc!_RT7;Syd#zuYzxRx ze5B{!Nr@#r31|n;750FW+^bdNE1T{-%wUkVAi!HMY>sCr5_{EcSaeg~uC5(6chSuNK=!v;xC}nE+#$%f z4us#!KZq}KE%!kuUVZ%#o^chiFW7Y?QM`K8UI|=kn76wfa|kj-;=f^1L%=^lDaO@& zSH~WBoj{Ngex1I}hy~$AdT@*URi^-y=FabNrM4yW{6`NlD_A4B9+h$_?oDFH9mVNR z118jTp%kCKw$+d6Xi3$%z;9mS?rE>VZLD(F3~~_&=bh(MLvmy>ls1)U zDV^I+>TJZdI5Hbs&&l*i>e_3miK118w0&#x%^se|+dXXy-RtKh0LU2qoMgFV$;Wsb zke#r4jz>}Cd`{e&#uhDSrfW>|Kvl47A1yRmF;Tw>#h z9W4uz&(fut+>%KhuL-PY<~2)H7+4Cyzr6lt)iz?UY4^1uiG5>N&3jRTMNUztVB4o_ zBpMN*8iojlKpCjSoVQY?l`=PdW3OdZT}{l3<)SfP z)tvkwEK9p%fj^kQIFE8EzoGcBenT1Qyj~{ua7S){oim@X+|o1pD;;|COGYLo`YB>; zd3ZYNlMtOubD+`0nX}Up@grElsEhBr(B+YGfQR1KhLk(^qaYo znut_QiTf{3d1mL#ReiQloRW%9_j;h>UaMmiUzCDB83!MS6=ks~qG^G$6 z#ypGbBJ&TR#n}qTVcVY~!#kf6_J_=MUmkeAzjn-`_gZ>B^j8^KFMFR$3&Uq@@1xcE z6#)cPb7o%Ug&QGqubaI9S~S{+!PlC5|Lm!qZP>>@ZnQb>djE`T6_?F7co$Q3DeEEi z!1_A(8;Wc$<2jorZy)cm=jWq~a8fk-pEs6P-vnLgt?O~m*V{<8ncdE-iW7NwsZWajWF6co}F)=&jS8vLN`*ouNz74{zG75 zA#jso<8tko3bc8P`z*Smo{H#19j^izBE2*Q{5a65aNG^Wk+w<*&ZLN3m8XezAy1l zAZ;?ttt`Xp?qG)>woZEVDY54^%k}3!Iat1%;t(c?X5aon8;&10A-teB%@jJOGcAXm zpgm4m=3QOUs@f~Yn%OZ>EGtf-ZQ9CRuP{MrlaZSL8)}mv-fwn_)RHUe)tK`)6x4Xo zS*qtXTb0o@G_adar@I4PDQ_v4Z=Zy#9RMu=_AbRSG;2-9si5Jf^q2o@Kuzm z`{(v=4umxx`F{oc73gHT0r@Nkz9C zU47)Snr41<+gWmY?B=~T*`m3A?$WWk-LYD(BYWK4ebWG5PkMd(*tQmWy(#Q)&+-~I z4-icI$zpo9@su0eGkp1qUJhBdFMWlPe96!UtO873(F^?pZ%i&)=DEWg1JHcl^yS@r z+qOD2Lh!Mw3)mn+4GY|S@|$`R4%+(PYJ1D5INE;A7Ypw0?v~&*?he7--J$WIL4!l% zjRp}-J*3^3R8a7^fNfp z*hW-zI6o7Vj}eL#boY}JW)q+5yy_aaM6l`<1Sekl9Wh;{LAtH3g2~TKMfOv```0&5 zg0HhwnXkbrP-F6cs%H7NmH)?izsSj{W9%;&tv_Ke+lmUF9eYP~_yNed49%3aEAv@#e1{?Rb)KnGiu=vht}0T{gFUj zOfvA$9t;}pu%H{Kz51&*XaBlp1HK}P41UC=@+1UX8j+rd?kaJY=1643Dk~?x zFF7qbS5jt_$O}d0BR2!JggXPJ)|!;@$6@AtMz&qspXay;v6*Zqh1+k68jRC5YG%f2 zamIN+g`D+lr&258N-Ezn@3~gJH&uMhpiYCsj7?t=;0&XfkRO|*5T^O^|N8xaS_+8CAhkhvS#Pgq#z zNrA{F`c3WrS@w+!&>3Y9_R73f?t)=A#at-t^d-;vP6OpVH-&2aSc)M0SPx}R*}?#N z`i(k@i=RAv%BV!DXnml&)>9Z0%rOx0!zJ*WYNDvj4Z>N{jPQQ^?tFildY5F;pOzNB z&TP!b)ND~X)h$l?d0fFQ4kV|b*h74-yg4my2f9lMnPsnbcI;PgnVL^1V1i2YeF(eY zN*jWKON& zrnaUnW-{bKcZ^zOHI+nEPRBMKMT|1x0K5Vu!1$!F8F4pRLY-k?7C%jZuXFs!+HxI_ ze&(MIxP;c3Pjq=%EzjcHp94dxvwv`ujV6_pQF=gpZYIdalNw_5ajY|LJSj$DvEDZl zdn=Sw!s@T;HsR8-+(1{jjm2Thoa6XhjUwl?G^be+)DG(!s_@{4*&_$dWt{!I?)B&o zQyNj%QM~w)4s>}7l(akQt0W)fxU#R6T*kABE-H+KRyL50MNY;X)17#7WoOV`Z{?Ji z#(-?0Y@dSmh$xU>7D=`(_qfB_`LoJ}ujxRydE~}4+Kgdw6X95>^ex)11yn8_3QiO7$r4heAkCc5A2)VYjXZ)cCVT+^(J@#t{fd*fqyU1 zz;F4xe`f*PwautbS%Qy}Uzkh^O<-v%r}mpX4nHPPNwePO=AUq3>!*VH~c5KKP~ob>QaF>MA37Y&+oa+3&c=>eR?iG}x^#Sj*%1aq=q1 z={IeiT^m(IHP!>!x8J|JG{mwdUk?R1LjtFtTffh-{sBCsXe%f6Rv3}%9E<$kP24LO<(ia9dyS%xVzdR&B-+xaY_0$?1Y(+H?{Tnz z$CDs2Y%~{@v@Pee*X_?cLu|s|NzcI8Xv^<7`<_`lJ71aa zU6h(UPsiT7A?)K?)ZF(FT6+30Y{W|#>Ij*hx`0ph(GtI&-#FAP9A;7XQznSmdD9AK z2)I|ilHKdiVZJeIALDL$6af;30~C67x_9VTMq3PN$vCi@7r^cIrkYjkYxa8(e_DWs zjRNO7o@p(Bb1{=#5sWnwL#c$@s^D|SZcsh;dBq&EhVIUh!J?2Ds1|aKKm;#3+s{qd z>U;e`$t!tOK_hK}U`BG@0(k*2nn8@=J{oHFx(aQ0=e? z)3G?Q$K99sO*Ic-9238HXQr=kps)cWvu?A$M?Cu(#65ctxjsTG-4IQ8|2wOgZdt>W zk99ZOa1x`;#&HuB2^41d)cLUPE26C>O+4WI<@f53BzJx|HtXnmzmm;vBY*YGeg5pB zXJf6m0;(cn3fjgj4YWzqn=HcPfkM9&z|+8{NuRa5I9DdCZ-mMc{3xZ%v=b-cI))Xs zFF-DRgkrS9oR+yDaz3?%ItkI9FSK#wTkmk?%#$KtrQTg~@xBWB$IM(`Pb#88#eS8W z^|1+57&v{64;1q_9P~p#E(V^Pz&%Df@DcKeRU>k&On|NR5mEscEbaAfM)r4qlvwI& zMMX*?QXM3KpfQ(!1o9~DF(Gv7ni*-ICel#xahjd#uo0L;kf&mH$a!h-=+x}y>eR9B zSe2cGTr=fJ>Au!_bQ@?}Bkz&O?HL|voZ!Q${6QIIF)#hvTlrr;mj$RG;Q)YJ@+xyW)V=#pudl+1p*|(mGVE>zSsrUzcs< zU3zZ#RobGc;|57mSqus~krGF(KE02(WZ=u(OX)huFpj8?YgTGvfMw!Z`Cy4R`S@m; zRx9Hdni3sgBeg;dPfQr^gFiZB#?s;WdgMFR@&}|f?rQw!Iq%LTq(tX)h0cU^W5V$> z4OD9G&>DZ>V*Fv10fpdJgtjF10`ge{m+&$7d6ENSXGY7$b#VEuD<5bUqIvFn@7C(6 zqd!QMuyXag9jZ(BNz(bI1(l_%K<$tJ;_m#rnE0Qz%m4noFKjfDzNvq;3 zy??&!C;HPrOeBW=?i7v znjg7d75qnRZG)0#!@+;1c!qAI9LgUiztO|BiR>lBE^Li5P4=Az_Q97`6jqWPtnkMO z1Wu@Fnku#Tae@m734$zi{_%e^`1}TDn7K6A1`xdn>k24Yv89fs82>rUy90$3x4aQJ zPL_0tX~(H^EtbyM3Eq`ye=_xYZh%_ga=3TL*S}LL1CA2`N9z~RbwTo=@kUlH60J9T zjbL_-sVPECOVo5fA3NMkgT;@O3I@C6jC5A35`ndE^z!>!IWR@Us{8sh97`ocd9==c z4F+%A_R4LvhX@^`O{Dkwc#P^5BCp&G6JT!PrY(@@TNzzkqB~QMW_1?OS9nXLGTo+i zi<^1M`(Z{2h;x}J7#;mgOKmBp5FH);I*WsINDPKP@~z7h$^s8!l{;-i(8mHDz;`Kk zkB1s@vjPgaWghyxTt>zUZ!o8NDkXnDC2?lPaqYE{LR|xLkc!R?;%Ze}=NQ)+OSMjA zZo?c#6}>mGkl4kTo9;>_wrU8GK`6#X39vE)zX#`mC?L7Iwoe%lGeJ2Ht41wKMi;Z1}6b>f#fQ{LmnQk$1+=LTU*h2 zZdxv$$30rnSrR=lS+z?Fk)AI8z6&@0$6jNKBBp&#cRwWfK)mly;axjoC=hZ#EYCiu zl>QINmIzP2w%#wSGPi44r5vebM9mQwNQ~p&99{PxCoK#03R8M!k-*RCMTmQvEo#nI z2x}2RnbvKUIf-1BdlOQnGM`jbKB-8`s08d`+N#lAOHNLv$%9lTXGEr%X0i$d!6aD) zV%CD6!EfBybnrY6Jq-|YIX$LS`i|cd!pF2wXNSYV7-xvb^z-QV*|mmFEfPd4KR5-a z?`y7Fg6q2R$cj=efmr+%hFuNE_%cB~$B6DH4ciN&t&?EkN{-`rU9*KYhTlep z#XXA#oLw76rz*R#HZi>-g1`tXyQ0#dtH;+I$&?+rRDPXz#*BmERIw9_8LXm+1gO_9 zth$IO*(+>z5d-kp&d9k?_VByB$eWMQsPE=p7U0mcnzaE;Jxb^vyNbf{Ce0oKz9Lef z%&2b?-6jsV$Q{n4Z5>8$K1I0)+X_;XvX(cYX4D#MLr$DFBw$TW*?8HG-o-|<+;(op zFuZoXrA%n&l2*p>7}J+={G73IFu|RnLn2lt*$8-dYBXq0|6;N;fIek7I+k|df5WaC zN06Sp@&SExbG;wE0cXNoIm*PG%S6L~F|Sc1Uv}*{$vmr&6xM!Bh<;45Og(^LgoX6_ zlqE{~glz3u4(L8fLZixG@Ax}x%>iD>fMmJYAb&<~p@2yNA?tvguu}-$XUyib9o1O! zT#-?+$}R>&5iF#EX4N!yF0;|rnpm!kGhJqHB{EXO%c$2)huA?oRz@@(j61OEQOHzR zcQWbhdgPu)JZnx7ch|mEg_J!28<$2(*zpDT8tAgY((<(o7Idw+!B_9h$d`y(%p>qU zT&MMc#a+=|7~*lpX3pQT9COPGW7zGa+@Twha8u5NE=jOfT~A9}#yEJY6Nl}7_(aI2 zE6mR~ZPHv$#kj6v{*FmkyXk?*g6`w-x&9@1J8m2Lf%oD;dCdA~e-ljAm;gwfN5x# znVrH`t}-GV05&wYTJ|CO@H16qc+kgl8zl7mdti3I)~8H z*rKh>a=BrAO+@?}sMyiMx){FS+)wojG|Hp)eY8JYl)pks4p$`cnkfS8rezc{L2lK{ zkgUI7FEcjRPK3qVxp-N^vFBHs?rQy{KaK&Csp8ob3|lf8d{CNHL{~m_HMBtU{hXn; zb|I=+jm9aN8J4!%{#o;c6QrY~HWp*$klVMB zQoW?uxaj}z(Y|uSFS=^pqt|>(^|O`4n(b|ndARmU!HbjY^YrmUOa;Cwu9NIA z5qbErqUz|OhnMEBP%k?c>w{Llc`d#a{LW{Dg9N3my^Lyqs*Rlzi2K4Fx+1hT{*%3j*x4t!m;zUVIk83DORB z;lG@$u(J-M@+R+k5RFs%a-|6~0#bjy+*Jr`;JD)Z3W`#DFoV&{;jMDUudwFMIw@#v z;<`+%3&Ro^zqXdW@$7yD6%sM>J1m^!P8PAsrD_)70+5@mEk9Hd90T5Mc5BcP3=>V^ z!e11@iHa;~m+8z|?W^gK&&B ze}(hs5-tuz9D~AImVEH-gC|Ps2lr8oS=VIiDGK(n!_ifVV;29${e`+3DZ{C`uXnkt zaR^Xrgd)B_)Dt!XvI)uT7}rfWq7 z)7_I81v;fws#tAwfqGBu`=$ec{CgTjEnC#C0@z%iWsza4y(xK^R*k!j*v(q?She~0 zra9h^RJd}O;p;S)3J*C{mcDqb5vJO#y5Of5IlfwWoWY2}G_s{}rIXU|CBl}U*KXa5 zS+t}%cE}G~MWH%lrj=Sw{9}}vyfLYWH*RFay2&iZb&$}9@oAY-%Hz$3e~XfFCl}Px zoqC{WkBD;+5-&(DKG==b{bcsJ`0Dpvf4w(twp123-uQj1?PfB_frvQmzlBJTaKB)RPM* z4Fhp5tj_g6L@w1vsphc9)aej9wx; zKvSl}PvQmdazfNwEl*O2lt%_8Ze%F$W4xCs3Dm(LGFrbM#V$XH!FF*%NViCx*@{-n3uRHIWCM@nCeSYyc3Ne+xg@yYX?V} zFfDNgNUkb+#C988NJ9Ei zoMt-IH{#bPG_R&%OvVvnoB2+~rHEw+VwCh(3e2pY@M#Qx-pQc#C}=v_5kdaa%$^+kiMGVMqXa#C@U9*7Tr;s=68WWXUXO_eas>6^`Q z49Q?ZGZojPBB&t{2WyO*)2B*7j@^mkij(w>cP;llM&yvaWq4@A`zp$$XeuX0JG_Rb z_W68BXDx^t1rXV#o|adcvrGVCJJ7r2#kf_>;-MUIWv{7VHdpD%K^jmX$Tk zySLmxUuw)+;Om$c$T5uvAQ?RndRr?u-Uzb7t@gm>kN5rPE^WAq+M41nSy8VQFd&{I zN!q$KN6Z-Ir8O$Sxh%EpVke!nq; zr!E52*&8dw!KXYpv-e> z>&i(t6=U$H5O9y)VGjqy%7^la{$wa`-&X@cl0xDCsl@#g-LX@ZM~*~-U+ zJwSmLO+_M28sDi^kV1~{>?5fZ2s^8i*>`fPY@sqaW15k!j(Z41&TFi(Knk1RW&s8Z zCYL@2IO0uyq1)*D0*NIZx~9E&n)N;RcwXhvCo>|w@$tX&VnbB=2u8D^oDE+vb`x;? zxjJ_6BXNUs?k4*Nba>7!8!aT${6VwLmRxg_Z6ugUl66V`$?-8U)VTzV zv<(AgL+Y9i)78pSD>VA_vl<=m7U#5|-#i)v-xq&a=L!s`J6nK*&1X-wH;~r%zNrkr z-nfK(@QIF;!EGZxTrR|jpPk(jaj#U2M$?yPGp-GjT(^wPkWI8*O3abEjJ60*QY;=* zlg`VRF|5uIaYA+4qJ5HW9XR$7r-wf{XuRoCv0@a5kHaA%cmNOxMIRXRN^@17iS;n& zCcn^_D{18(^PPBYoThI65UUK$mlHFQrx(b#Y+85n^wV!M$X5G?QTwixim>lmI84J4 z&>l!Yt;}|AtwXm%ncTip`oT|b{@u?8EdjZv7indIuER|comO?*VdA(W#l@(JM*Glp z)mfK$w*_>fCY@MO%zk`ah8JF$WN}s!oQPNSA3nR@P0u&FYV6&J?Zzwsh1$f0h4h@O zj3O8Q)**u${q%^{LI*F_^(u=r=Vsqu%j)S42+)|dmW0|46ldd>iZ34uwf|t#*S!3c z9lymqau3-}_RF&8~a_G4?hvP2xUjdG5?6Wx4lI3Z8>il@lw{0PjH z%)E2T$p(rz6bz!n$^u~GJ{QLo@O8ben&fJVfuZ?gdGFK8y9SD2`obCE`zlbj-o z@1=i_I138D`BCdT&gbVl0!orvEJZevt|&7eUh7R?o-i|?t(a;tA>3U;T`qJdB43#O zbc2-YZ>eWt^cMt`@doSjOWOGG0#1w0ya7AQfR-}eS2nEHQ?*5tI^yGt2=jSvEB5dV z1;!pvkgCyRwgsM<;n{tgVXLva;X}YnjAEtSy{%2g^WP}gy2L4THS}=@`l#IEmFjzg z>%_0#@{^GkJMAEeP}^)At34C?iiJW)oHOjW>2-5rsV^TQkO&S1ODt`WQ>iD*Q-nqq z*?BJQ5*s|WjOIj=yz1*d+5W`dcTT++NDws$TX}wTdd96;j{=iSKoj~ZkprY-(szG4H1E)@2KBXz43+W?OVR0NO+hbI-cL|7~ z>~S9kd3%P%NvWF){Qf&o+!W^geKAMHyKutXW_zaWN?--$yaM;LHDSt!W6v??Hj-!mYVBmWl3W))(-W=1w!%-95tb_)&|4(-%q#5giwVnTif$9c=i%Okx>s{%m&BRcRPG2 zh|r0}=|&{;%Q!uF4ggqu2f4mw_+|L|P5N4{H-4y7U+GNc1|Q$ zI-MR8JlvF|JpY1`>T=b|E?lnIN-TpPG#hSHQKD#Ps>IlJDM=(EIG?B|(XXBfa?WxS z?I54=YBNho6@TVFMj$zQ>N5RT+;oO8XYjKr8!0 zqtQfmA`=PE>urMBft8V^&bAZ?DtI;n!9Th!Y$AwQL&6k*@I7y_k~auGek8i7&icnR z3PJTd0n$e@Ji?&4gl~ELC_U{Ag|<;yW!)d9lHq5`UxyiTW9>SWH1r4?S8hf+T=CQ% zSoZ)DU~YfgrQ_nh+tmQ?h1`a;bC${vhXq zzgyHK_QUA4YeH;`+c_sY8~%qMx~u2$4|$*7OT4H`CS1fX6BcDP&d2E4gs9b}BBN;vBMim+H@*^BXru=FsoUb;~#sshp#L z^C=jt0|w`|?kF0MA25=Mh@(=}EbJ&z%p}*+@U&{n7dEhT5Thh0$9=4cX=zz)PC?@E z!==dP_%Cj0?Eo32ystoBZ_gk1KF z@YJnXZ)(yvQC^Btck8;^7gny;`_bE6IS998jegjp{KCVp5QU#+*|Ssxnnyh|XtFbe z^SF?Jz!>-yT#FAVs_oQ2T1$r818&HsQlq97(5Tk#%8y1xjEqn?&t_e3l@mJSWk2iF z8BnUot?HU zr4ZoLo|GKEeW;TAV$xXQjr?_8nN2Mlq*I=w$4U+G%DoRR!(Rggl7;N z^3f_1ryCb?5F%_(5g_cQ+c265cos^1XqmKy6O^_dzZ=)6a(mY&x$$Ap&pW6c+o3o> z!?<&sVnB*7$C+eOfkr?vio-2J^WBQa#mb++NPSIopV#2Qp9AMj@fq`ko^_yI07@;% z$H8MtM9mw2Z?)>hb#f2nJ2s#sO`-uaINFVz^^D*P!MCNd#%9E+1a2F7tsw6) z+TXmG<8c?|ds^FdTV|!=@YRY&MB5cXs5Hy5&ipMJ9{sd&yL|kxCQS{vf>%`zk=23P z5g!AGr)*TeG@IbuoF+DIm2EfkPnyY?A`UB35D67!=+KBu`%e%j#H?!sgaYNOgK8&d zlW=j548)dFX~j)%sJE2%gE#VN{Xn`K-LP=s$?Ow-Qrd{Ka@ zpO57XIbBa2>DC)W>+Doyg|vvtX3&4rGShqTXZlI%i)H%a&QmgBh@(6_gD_MrHz)u! zsY}BE?*=cP4_`4Vv!KI-X-`y78?BdYSXek)+&1LuHsX;1Ba!E1AQ zH(5(auU4uLQT*{@?UET|?)>~ruIO&3SavC!aJYfFjuT1ej{w z?nf3>e%NVdBOOHPBH@H2tPZbPfHB*B*Q7o&AQ1nB))yW)wCz8L;TiUkjxL<~Em~_u zn!ghG3t`qNG5Vv5iV1s1aiWZMr2j<~ERy_mv!l=uys2OcXJ!$`vcRe1emQzHL2GRL zt4$`tuh33@o+^;Cy6DM4M%OHwv;!vS4=6v$oAjHIJanB_)${uztfNPI!WX+;@;U+$ zR!`nUhC^Xn$nZ#$pMpx(r1_P7?bSe|zBH8q!^6>W%Js)6H!b;I&h`V|H9y?nj_nG}C z?4NK}4XzHVV$zVeN%XHqoP+S2htZ@+V^qhJ_o*?K zAAWm(u|v|Z!X)}hkaDO;t35PTqOM4W6L#TlNfu)`6iRrV{RWlpOZm$-Kj_XT6xleb zjh>Cn^lmi(pCIs#@arZj#zB=zTEsmmvz}z*r>mom>vDF!DX5#|EMMwDwJ9ZcAWU+!VjN5+D?>4>9fy{T*T92E^KNbn=!%glSg-4Ct z6TmTkmlU6!{1uPu6T+%hTX;h2cg)^i-qI@cyJ~!4 z(`S_3xEf)hOw=!NxN6H&MiP+H)5cRY-FYB=35X+ViIZtMuZ8m-hc1iQC1S3{geVK< z>%+Yvvg{`msr}^?{_;2C`?JYrx06K?P>cKyq|Vf)I7F^eYOdk%R`l=F99^>9mSr>j z1Y4t;q<7NJ%Mvw_i&z95q@Xy4&Oo;>F6d%>Zl8&a=;O2$2b zB)9vWUJL%K+rwQ>f37~O9eihagbGY25X-SY-hg@jxX=E%q&u||qMRsul%#oH zNEPMyW-}k~HTmsSF+XFu^cz%<`LBU3Pz>^ZK^HV|?D6S1>0&=S<~U|QCSRn;E*kv0 zF@rZ0Y|50>FF3xP{a8!6+-&EXM*KP&e+D!zNXwDUUn*eWdEhQ4+)Q+yyCiS0syW)4 z!4$&7wf}-guOHA%ujXV`}oA7JdRH@pjwY^$Rq;Xq5 zh6cv#)7Yi$>NqkoqR`to6PI7%QNUg!l{mf-f5fe$Y}tN&4CaFS>Ym~}2InCok^y$x z#NPm$xA52i ziyaAY1=w`{b-otZGZd|H#ZHIl8y-_07dztGqRyi`N%f3-Lq3oL`X=mH&+rkjWW~x& zG+rj*GU43}|N0F7otp?Wo^IV&FQ?`>U$}eSmw(f{XA8HxtK6+6=`8jfJU^1-3}>0GaR|18!NV^RQA=U{ zIw@TXb-~>|W^Uh>{p70QlmjTa7tAkwvuy`W)4Qm8LVvTBrpo0j=!!vXI8w>KSEDS4 z&##m5S@V2+&9DCp2FhVeI=@_mEDHF4^Jm01lb)O z{?~-uAwU6?rM(1YX(#;$ytdu{DX(Mn*J(UMh>7QIpanf7!E{j`^oqVCa3FV(3x2zC>r2U8Gpcg5%$RZ#b$>P+jAX+Fl9)8;e(2NOPpgnnH^8q{uahYj z((&WonMkGBoaS#`w1n8QYjJk%4aZIZ_aRC8^Z{J^5Swlzn+yZj4WLVgfg3qA`SfPE zbsd^^3VmwQra>VQ%j}aU`B6AP)~bo=BhXsLXTUgorq<{Bti;MC~8J%j@OM z8S@)TsCjVfx6u7Bs}!+i-t(p9fL~|Jvxy3?#tV_9T%fZiBa^H7Ix{%{-G!$Ka`d1@ z&Oz=G%xGsjcGt$Z9odia1m!>s`b+mBw+M$~p=0AD=MR-)Hgr188_s3SdaNxgWIJ$( z!}2HbeO)$0`}v%0d6uB( z{d~ZF2ehx7-hg&=`C`Y=jt;O_!pDj%6D3oGtVFM%L@N_z6%!M4o0WB&Rlt(O0_oZW zdDju23sbbhW{-nfyubc%{6fCv)I$1_@#NOJZVq2E^jYBpOvFW)q{U#IbT}N%AQFRG z46ce`Dr0{frZD?{&)>HTTG#r~@zIkd(Paw%c*cH8Vad1s=fe&>^1t0jjrjkjHt$z! zY9D_t*A96-E@0(;44gp|jm9hxtfPm^UU* zIS|iy&f^#cSOFeb(QR|)DTnjqF_}JaIb>&pE(*a2sv-5r)5X14DenDutsu^{b(}BG zeuF2@J|q+JCciT@IXN_WM~mG6zRN=9u|`mN4a2AwB)$!|NRwyO`rnr-$-lXf@EzxZ z#QMc<1j2h66qSu;O`KJiyP?nAHd+9ScC3wh8>UffvA$M57{UdniWVdkq=20a~!FLD)p z^=5(=xaF;j))j>2PeuH1_}WRt9t+fC=Z+tgF(8{gCI!EjEzvB6|4RIXRHt&Mapdr@~ncE*RUGp57u|J4-Q$r-uK z9R15X%SU}l16EKk64$SPM_v8*G%C)2D(wE-%$mQ)_55A28~83{%KG~PVMy0O<(&1G zQIo7$cG)SKa%zownAk(gPFyk0KMnRJvD!yh`V{*0mRB9O+aUpiNtA3to5nr{cH~Bb zBz9?)r{|q+Ubs|wiac{`J|+U4C|J`a;GZsB8Ei_mwg2h3cb>$u`TysiRq)kxEZW6) zT(=A<9I8BkAXd8iv3odk$ZXfGBrrxk**qCPPP)e?)KyTk}Gi)5-8#?nAb1I@zyr~>LBZQ>_X!4 z75N83_g}*NAN`@WvVvdrM{e8y5@nb7sQU+6kB%Nln^g3HE2S*@w@~NEe?SPZC|Uix zkg?WvAdlXCjlwmqRtJ`YQfJL zNyds_vS^1tf^~5vDos5(p+j@^ck%C^%LXiEe}du6K7`rIiLkZo9jD&=+83Hv5Mp?6 z+7V&W1P)^~xC@g@Y)b11j{k_Y zRfIj^OJ17ewrIJwdhRETNmyZS>T2FR&?0Dz;&OxIIB2x^R@LLj+}+PLGH=l*si^;n zTJq4)kb`3s_hG`-_>8RaVNaj=Fq-u0gcZ%B6Q}iY_JCn3A;JUM(GkAof_Z$botfI& z@*o?(8B5f(6^J*IIXX~8c-^gRM{w2)aU6h{`$cZRG_lQAIgv7>jkM@?az;fD%1QEY znX79!do*aOFzAAXSVu)TBGl&=>Tcogwo9iUCHWKwQ z?@F@wGy&U;F=s92|##eq9&6N@2XjZ zFQSd+zUyGY2ddv|Hm$@$X>Md*vXaaUk`A9adykjt$Me8bVyCa)^z)9o7^m@v{U1hH zfS0-R(J&4J+GryDTN7DoIH-l=%O9G#-PsrKRv@G`(V_AIpsa72+&T=qWx>67SQ z2SWip-#Up@^hjW(mMvHglbW&xMx|Y;LgJff9M{*GP(4B6=|DZRIgGU@{HEcOewANF zkxNg8E7)7)8cEa+2wGp1#!iUyLwT&cxlmJl6Ny`nzMKvCy`XX z8}%5XF{&B@y2o8M;18_`1M5bVvw+G>GLR1@aB(Q+t4O;k2J207@p*jfJ%B z6tx3oZkdc>?Oj=Bi$)1xmA?fT%l%Fa22a~POk+8Q%E)lN6lVB1iD9|o6XK{)8A*nB z+z*kw{s)S#_JJIjZ&^6TVGCTb8Wz%H*&IX@22Lz>`11X9Ax1yCzas}V5cmPuoaRze zao^d<`cGHZ6cEdI$Y2ET^(a*n!a145jy4`gjk#7q;P}}`8G^=x`w?xB2(~{6^kVTg z2B><3Et9>k92lzBX~V2k6b(x2GI!L|MfWI#g^z(|lY;FVq#^9U+z~3AHny3Cn0#T(?au4O&ZUG>EHb> z{reYly}#Yq7T!v%v2}bP&gWrQq z?$2Ah)P$k#JEc%7RX~cW;lMoyG z1Kr^B&0`J+W5_+q_2?(6yTczxgVr4x(gxd`TgHFEyklo%-N4eGAaUVyD9P2c0BKdY zBF%*Uj=E;aZrk(U8&7<5&DCqgDRwo9KdicFN7e3s-UmH#F}1ZQY{7hPfFG6oBI90v z1E&O5;KH>W8Wy->N`o0daNlXLoZY!4?1>bICW<}6lA{Bk5JjRy2Prj%EN$)Dz{gF!@&#h6cGl!c;!fLW##H3K zeik#L#gJR$VQc(>6BX6mMcTX@52ySrB7q3DfvXN&gfP&?$xtDsGC2`FVJPy#Mn;R7 zAU2&s5|M^bpy2t)Dqn~p55NkNZ{izv+fB76CE!xQ zaCXu(dCe=tbHU+n-%B-I57kAUC_s~v@zHtjK%U4O`Gpf#YQcs|ehh2!E0FgmQOR{P z>O9+Uf~GUz(_jI`+bVq~|aFI(u-|gdqKee3Slm3FKS%U6BUF`mF_kCCH=8TB1@ORJLT<9uUK}c@y zTzYhLku9yQ7)bm!-cGFU1prOTf#h`j1+!OoSGD za$kI!_3T eSqwCIIFP~M#NFG1Y2xQ%>Yn-Ak5dJIt^N;w7G{e8 literal 0 HcmV?d00001 diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/images/all-2.png" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/images/all-2.png" new file mode 100644 index 0000000000000000000000000000000000000000..f837c5d3aee934a59db4306b31cf585038c8e121 GIT binary patch literal 35324 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 G-2VdR7U-Y= literal 0 HcmV?d00001 diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/images/simple-1.png" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/images/simple-1.png" new file mode 100644 index 0000000000000000000000000000000000000000..9cc0d0d6452c513372758da0e508a8dd8cb9409c GIT binary patch literal 19721 zcmeHu2UJtrwssU7Dk2COV#H_jb@aWh7;GuB#j&NbIJzd6@p@8jX)Pk_s+N-9c# z6DI(G6U0Bj@fbj!`0IameG~FOlRzAO{0=~I?nDI%HOUDkz)6Y|Borr(KLBnJjXX&L zAo*tS@7LLLXGqVVAUSpNG_l?IGO^(l3CY=WXHT6zMMg&KbL#Y&vnNQ-olF`crMP;H zM$h0poq%p)a{u5JD(YL}-e^iWEmwBIkdpU8cf+b!MMUpu>s#19c^Z?@NXx{`#^LVu z22ol$uuc@t@O@JMp!_7siBo6Jo<2uxm81ZiJaO{mxs#-)PMjjzNW4y*B#EKaK1Fdw z&LXyF{j}DZTY^HaPfAL^oMjRKPoJY=j=Sq_`R4ucDBvOqab6T86aZO3z0?bn7bZzY z#j`cNfv-JDviE(bCk{e1$EEP?rCn9tv9K=KJh(FUb1$X;@`yCEtKGiuH6UF&Vve6S z<(1%b(<*G0iDg#Fi)4l7=J^#hMs|`IeMV5|Vp$DhRFw``-}PI92W@ zh!j!HvmaPo&1-?{gAz2Yw`6;qMEe*SdZftj6gxqCbCFWQl2m4KI~Iqs@){tbUJPJ;^n@>tHSn+9$Z*- zalzbaZIK7#^awplgc02_z^2B9Dh)vwbeEt`IKMTtRrZcRvlWL~xS#RNS0Ak2b112n ziIhXJ%ZJddrY-75*p~JR8*MEupkqN<@az_kyvFosW7R$kG^jQ2lXJ@CYNl8nr1J1( z`k6)8DxNvK;|mNq>Hxf9OmV_s?64D``nkV+MTq%Hqf9}8`@*70Au{eBULDDn1XUc+ zy)hwg4u%-Jb=ocJ*_e2W03SbV3vEwb!6{o2z+>~eHYzA93~x^5ptH4c7f$%YsIu=v zuF(skwDDPN>=F`opn08vfb>*bRVJCx3vBW+*FhHa;$0c-MCZT-paR8)jB=4ieUF;7 zi&pdQ#t}9M3Bu2tb2S{AX|>a)RclmgL~OEz6RY_mG`QT-*m~nR2a!W*4|Px=12dGi zn~{i7dA#Qe$9oXnmtOGD+P|7IHm*xAQ@Iz<Q4L(XTaHwG=@G<9aFR_HK?;PNj>NGk_>G_J0L;+=o@`!=gL`E>Y6!P$X+#Y80v?q2 zB;~dg(pI8tKixB|aZ5cDx0!1v)lO%a#2v3G#3ISBbtM(4e}W4ezoJ2)N__2nUB$S! zJlHxXsZG#cEO)$av91w#2tK%c*{${BV!W3>Z*yzk>FNYf){cdnkW3y&aK@aX0xoFY z)<*9AvTe((mxzO=QKV{YYZ_nm z=YcrX#ts}RNGoGCb?4Hwd9S}PuhQ$@J?|iqV&vJQD+A)A%PcTE!+|( z%`+${$avac*ikbxfKZzDY5X&ZJf5sHs9jIRHu1oyf+5 zV0^tjr}ECy;0%ftg>v8fDIWhJQ0suQS_9TC)y2YA?cOfzvBNd?Z_;d6wAU-vc&*P; za6FH-zB_}4%GswLIW0HYP76LC!H%T1u|WL%AP{qK@;uIQUVeEb5AL@kjm=)!@<1$1 zb4%DGpekIqnX7l)ZQ~0R5Y95GorwfZ^5L%TSga8Heb*{=U`bb7Lg$9-(~(BT#hr5Z z0vIbgy{0EmEN~A$pellp(sokfyA-X3F(#~?7OT{I^enhf_ePN}=Uu^Vwz0H4C9wzS zb`{kE0ekaOE>D&$)wCQmDQ;?m%ZEP4yEZq9?}pPcfC=%W#@4Uq`R7e*_gaET;>S(j zeSIf3p~X|zUBuy^*d7f?#hx*)WQ)<|j}KPV5*tf)v;y7S$cgi3+Y==9lw`{P5;5}l z>GKqf%4-{_Rx#zo2b9EFwfSyAYw^v!Y=suJn}}KdFZ7rF+*4!WP`Oqs!NcLh&fLfs zj+Z>TEXX3dY|&)bcC0EN@XFd;5^`p=xh4VJe$3IrY114Oz zf21?6tC8`9CAHrXtMWB`u= zG2nL-LiH00u0ESCd(={7eUjgjE7YSBJ>G?Uk#9vUB7IhEkV;|llA&~h>U=d?DoNso z6IU>-&1OSoSs^wxGAar4u6ZUdB{)EqBRn|uPUq_{pkv{C+{F5lPbYJ`MMXup3N7uM^o3J-Fm<~T#DlVPh$8YzVpW%z^;wRp%527e zZQomlG2Nrlv<=Dnc7I@k68(lY{+$4uk{g?5iie6_wU71J!l9{de3{EItG5R zn;jgJB+B60*(3bSg(2|JwPg*@oN)|Dn0UXwvL`0>axWurGR&^NASg;SNK1Cw8(L2W zSKq|_-Luh$W0Q)qBp#Drx2c=IE`4``ZO@x_7xIatrTrJ5H@)Bg(E9tDU6lcmGgZjI zE`be>0h0B^kdu{h`pSfuItCO^2z}iTg0CoS5~en`>n3)cxPq+q;J>>&>lgt18ly=p z2J_N_dUrB?>JDdSC)_w@j=rQitZoIV?Z0d~C_M0y`&nJjpo~TXlb5Ww#Y7vLc_`Omak~)=1pwbtQw~8jgckeR()d&o^EIY)0tU6BXo)4FV=7?J3?#}lsJX{O4)$Z1T6f;b zlxE~c$#))JGE zp%A|#b(FCfbpO!Q`GdEe)Fv*#hnwsNtdpYSQd%3Lq;?mg(up%CI&ZJqBz*Fm-2`#H z!?9y$dLi?_PwX2`8L^mI<8?XET9B5MnbdfoV#6t_)vw!EnsKWn|0p;bH?zUBdlTW^ zkekkT!&#PT>gjoJzwZlwqC6e4DN{!s`ojato349T4=;mjr}{OoMT;`VxV%3tSx->- z0;zpGswuUXVRpVrd&BgII+A&>njt(nsO~9@XsYYcK^ym;(EL9ByL6yuvkkpq(2_yC}2FKT@>YR7<{JP0?Pedk61gmLo`Aq`94R#ALJ zGeNi;6f*k$(5Hx9KPFW)W66m9mF?zCl-SY4RKGHU5hUw5@xJEcnBI44a=+--(ox^u z61{T>om7;58#MNDLKNK{EhF_cNXtA>a>{>q59t5G&*X5Q8vbSe7yw&Q3<{ZYxq02F zXfIFe(3ThB$$H50R;|9ZCj)BQ8vO~B^c||3xFI*@-7E0Q+HXiqWM|myNZBUhup~

n9Mj}A| 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 literal 0 HcmV?d00001 diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/images/simple-2.png" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/images/simple-2.png" new file mode 100644 index 0000000000000000000000000000000000000000..b9614bda35dec477c6e2dc665a95c5af370ecb79 GIT binary patch literal 50027 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

J#}iXBwUGQv4jU`X|X{6Fk_dy%G?Z-;-i z(N)9Pit7oBbQnYy>ti0&bqJH|I~?@Ra{VKe2G*gkKyeVYd!nws5EIvtv(?G!hODeT z`>W}_K_(N&_cR0EmZ#ek$^f%+V8I%^;2}qj z12?p8HC?gX-tqwj?8{I(=Q(0{CN;p`NAZ>ebbNbbeZp&hFzNZ`a5ZkRHb!DgpbV3H zqV3wZwPD4#rJ`D4pnv)>dZBQ^POOG<4tbgHN@5L5viH*4r{d#atT42rBJ!X3361Sp zcO%dmS*JJ4Z8c_Iu6@7nRJq}+hW%3VhuS)w&tKonWhvMiDZy7W({=B7Qv^Bxw;vKWRtoT%wAvewDg*c1yu?_i1?>fxy)R|#OhCN6dg+Ls>@b{ckZz_m2 zu*_hann8ksSZbljiY{Dmey0+mmFCZi>@qrRSg`kj<9z9aAv%-5Q?k|qaB17EZ<46d zHa#`(sD2UFTysQz){=DOTr&l}{Dg@vJ63Qqjse+;Ns;SAJ+`M%{h`KgM6E1fKo-gg z{1C=Ee8o$!SEkvc}0Y{ySh#Nme{*?rak-~cOhOR z{WgA-e$kbh`@UN-Cx4+lGTzJPcg!16Foku44pI!eJYMA`vbiPcahd?3>qc~pFzrBsMqAk zp+vuHuOSxBip-7(n5(Sa19E-#`w#okJpYlf3hz(PB<>a_UWxG8 z$4p+i<3}y$+7j=!t=Po2T?l8$ajz`4UxlGw8eieKm3K_KdsVpJM8Sz?{L}F zyZZ}uvFPKQ`Tkk;_801X7uop`(PgkSNR~7>S3EeEQre7PUS4U%*yNm5*fOU6>P6U` zVkN6YG_Nd)08$C_*x?;UgGVLtj+P_fyw3sF?oUKBuLHv%-2C_ZQ^|`r@l Date: Sun, 27 Oct 2024 10:47:39 +0800 Subject: [PATCH 6/6] update --- .../README.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/README.md" "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/README.md" index 3fa7875..9ac0342 100644 --- "a/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/README.md" +++ "b/\347\245\236\345\245\207\344\273\243\347\240\201\346\201\242\345\244\215\345\267\245\345\205\267/README.md" @@ -5,7 +5,7 @@ **ProCodeToolSJ 使用swt+jface技术实现** -下载:[完整版神奇代码备份恢复工具](https://00fly.online/upload/procode-all-0.0.1.jar) +下载:[完整版神奇代码备份恢复工具](https://00fly.online/upload/procode-0.0.1.jar) ![在这里插入图片描述](images/all-1.png#pic_center) -- Gitee