From 2fd4a9941887024480eae98c08c47b0a4be29ddf Mon Sep 17 00:00:00 2001 From: Helvetica Volubi Date: Sat, 7 Jun 2025 22:11:50 +0800 Subject: [PATCH] Initial commit --- .gitattributes | 11 + .github/FUNDING.yml | 14 + .github/ISSUE_TEMPLATE/bug-report.yml | 68 +++ .github/ISSUE_TEMPLATE/feature-request.yml | 31 + .github/dependabot.yml | 12 + .github/workflows/build_1.21.5.yml | 73 +++ .gitignore | 18 + LICENSE.md | 31 + README.md | 93 +++ README_EN.md | 93 +++ build.gradle.kts | 108 ++++ docs/CONTRIBUTING.md | 87 +++ docs/CONTRIBUTING_EN.md | 91 +++ gradle.properties | 10 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43764 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 251 ++++++++ gradlew.bat | 94 +++ licenses/GPL.md | 675 +++++++++++++++++++++ licenses/MIT.md | 23 + lophine-api/build.gradle.kts.patch | 27 + lophine-server/build.gradle.kts.patch | 72 +++ lophine-server/src/build.gradle.kts.patch | 72 +++ public/image/legacy-lands-logo.png | Bin 0 -> 83468 bytes scripts/SetENV.sh | 28 + settings.gradle.kts | 16 + 26 files changed, 2005 insertions(+) create mode 100644 .gitattributes create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml create mode 100644 .github/ISSUE_TEMPLATE/feature-request.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/build_1.21.5.yml create mode 100644 .gitignore create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 README_EN.md create mode 100644 build.gradle.kts create mode 100644 docs/CONTRIBUTING.md create mode 100644 docs/CONTRIBUTING_EN.md create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 licenses/GPL.md create mode 100644 licenses/MIT.md create mode 100644 lophine-api/build.gradle.kts.patch create mode 100644 lophine-server/build.gradle.kts.patch create mode 100644 lophine-server/src/build.gradle.kts.patch create mode 100644 public/image/legacy-lands-logo.png create mode 100644 scripts/SetENV.sh create mode 100644 settings.gradle.kts diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..ece71ae --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# Linux start script should use lf +/gradlew text eol=lf + +# These are Windows script files and should use crlf +*.bat text eol=crlf + +# Binary files should be left untouched +*.jar binary \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..1f4299c --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,14 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: # Replace with a single Buy Me a Coffee username +custom: https://afdian.com/a/Luminol diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000..d616b7d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,68 @@ +name: Bug反馈 Bug report +description: + 报告Bug,插件不兼容情况,以及其他相关问题。 + Report issues with plugin incompatbility or other behavior related issues. +labels: + - bug +body: + - type: markdown + attributes: + value: | + 请详细描述您所遇到的Bug。确保您**真的**遇到了**服务端**Bug,而非原版特性或客户端Bug。 + Please describe the bug you encountered in detail. Make sure you're **actually** hitting a **server-side** bug, not a vanilla feature or client-side bug.
+ 如果您确定的话,就按照下面的模板填充信息,并提交反馈。 + If you are sure, follow the template below to fill in the information and submit your feedback.
+ 如果此bug被尝试修复,您可以帮助我们测试并回复。若bug的确被修复,您可以关闭issue来让开发者确认。 + If this bug is tried to fix, you can help us test and reply. If the bug is fixed, you can close the issue to let the developer confirm. + - type: input + id: LophineMC-version + attributes: + label: 服务端版本 LophineMC Version + description: + LophineMC服务端发行版本 LophineMC server release version (contains the git commit's hash)
+ 通过执行`/version`命令将获取到的内容复制到这里。 Run `/version` on your server and paste the full, unmodified output here. + placeholder: > + e.g. git-Lophine-"0635a89" (MC: 1.20.4) + validations: + required: true + - type: textarea + id: expected-behavior + attributes: + label: 预期的行为 Expected behavior + description: 你期望看到的情况是什么样。What you expected to see. + placeholder: e.g. 使用 /tpsbar [NAME] 命令可以切换TPSBAR的开关 + validations: + required: true + - type: textarea + id: actual-behavior + attributes: + label: 观测到的实际行为 Observed/Actual behavior + description: 你实际看到的。 What you actually saw. + placeholder: e.g. 使用 /tpsbar [NAME] 命令切换不了TPSBAR + validations: + required: true + - type: textarea + id: reproduce + attributes: + label: 复现步骤 Steps/models to reproduce + description: + 这里应该有一个图片、视频或其他信息来展现你的问题。
+ This may include a build schematic, a video, or detailed instructions to help reconstruct the issue. + placeholder: e.g. 登录其他账号,使用 /tpsbar [NAME] 命令切换不了TPSBAR + validations: + required: true + - type: textarea + id: plugin-list + attributes: + label: 插件与数据包列表。 Plugin and Datapack List. + description: + 服务器上的所有插件和数据包列表。 + All plugins and datapacks running on your server.
+ 执行命令`/plugins`查看插件列表。执行命令`/datapack list`查看数据包列表。 + To list plugins, run `/plugins`. For datapacks, run `/datapack list`. + validations: + required: true + - type: textarea + id: other + attributes: + label: 更多详细信息。 The more information. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 0000000..53862b1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,31 @@ +name: 新的需求 Feature Request +description: + 为Lophine提供新的想法。 + Suggest an idea for Lophine. +labels: + - enhancement +body: + - type: markdown + attributes: + value: | + 感谢您为 Lophine 提交新的需求!请尽可能详细地描述,以便我们可以更轻松地考虑和审查请求。 + Thank you for filling out a feature request for Lophine! Please be as detailed as possible so that we may consider and review the request easier.
+ 请搜索所有问题以避免重复的功能请求。如果您期望的功能已存在,请回复如果您有什么要补充的。 + We ask that you search all the issues to avoid a duplicate feature request. If one exists, please reply if you have anything to add.
+ 在请求新功能之前,请确保您使用的是最新版本并且您请求的功能不在 Lophine 中。 + Before requesting a new feature, please make sure you are using the latest version and that the feature you are requesting is not already in Paper.
+ 我们的开发人员可能没有过多时间来测试新功能的可用性,如新功能进入Test状态,您可以帮助我们进行测试并回复。 + Our developers may not have much time to test the usability of new functions. If the new functions enter the Test state, you can help us test and reply. + + - type: textarea + id: feature + attributes: + label: 描述你希望添加的功能。 Describe the feature you'd like. + placeholder: e.g. 添加新的PATH + validations: + required: true + - type: textarea + id: othre + attributes: + label: 其他 Other + description: 添加其他的信息。 Add any other context or screenshots about the feature request below. \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..3bcfc06 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + # Enable version updates for github actions + - package-ecosystem: "github-actions" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" diff --git a/.github/workflows/build_1.21.5.yml b/.github/workflows/build_1.21.5.yml new file mode 100644 index 0000000..999a469 --- /dev/null +++ b/.github/workflows/build_1.21.5.yml @@ -0,0 +1,73 @@ +name: Lophine CI - ver/1.21.5 + +on: + push: + branches: [ "ver/1.21.5" ] + pull_request: + branches: [ "ver/1.21.5" ] + +permissions: write-all + +jobs: + build: + runs-on: ubuntu-latest + environment: default + steps: + - name: Checkout Git Repository + uses: actions/checkout@v4 + + - name: Set up JDK + uses: actions/setup-java@v4 + with: + distribution: zulu + java-version: 22 + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Configure Git User Details + run: git config --global user.email "ci@luminolmc.com" && git config --global user.name "LuminolMC CI" + + - name: Apply All Patches + run: ./gradlew applyAllPatches + + - name: CreateMojmapPaperclipJar + run: ./gradlew createMojmapPaperclipJar + + - name: Publish to repo + if: github.event_name != 'pull_request' && false # do not push to any repo + continue-on-error: true + run: ./gradlew generateDevelopmentBundle publish -PpublishDevBundle=true + env: + PRIVATE_MAVEN_REPO_PASSWORD: ${{ secrets.PRIVATE_MAVEN_REPO_PASSWORD }} + PRIVATE_MAVEN_REPO_USERNAME: ${{ secrets.PRIVATE_MAVEN_REPO_USERNAME }} + + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ env.project_id_b }} CI Artifacts + path: lophine-server/build/libs/*-paperclip-*-mojmap.jar + + - name: SetENV + if: github.event_name != 'pull_request' + run: sh scripts/SetENV.sh + + - name: Create Release + if: github.event_name != 'pull_request' && false # early access, we won't provide any releases + uses: ncipollo/release-action@v1 + with: + tag: ${{ env.tag }} + name: ${{ env.project_id_b }} ${{ env.mcversion }} - ${{ env.commit_id }} + body: | + 📦Version: `${{ env.mcversion }}` | Commit ${{ env.commit_id }} [![download](https://img.shields.io/github/downloads/LuminolMC/${{ env.project_id }}/${{ env.tag }}/total?color=red&style=flat-square)](https://github.com/LuminolMC/${{ env.project_id }}/releases/download/${{ env.tag }}/${{ env.jar }}) + This release is automatically compiled by GitHub Actions + ### Commit Message + ${{ env.commit_msg }} + artifacts: ${{ env.jar_dir }} + generateReleaseNotes: true + prerelease: ${{ env.pre }} + makeLatest: ${{ env.make_latest }} + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e8ff269 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build + +/run + +/lightingluminol-server/build.gradle.kts +/lightingluminol-api/build.gradle.kts +/luminol-server/build.gradle.kts +/luminol-server/src/minecraft +/paper-server +/luminol-api/build.gradle.kts +/paper-api +/paper-api-generator + +.idea/ diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..fb78c0f --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,31 @@ +Lophine inherits its licensing from the included upstream projects. + +Lophine从上游继承了许可证。 + +As such, Lophine is licensed under the +[GNU General Public License version 3](licenses/GPL.md); as it inherits it from Luminol, +who in turn inherits it from the original Folia, Paper, Spigot, Bukkit and CraftBukkit projects. + +因此,Lophine中应当遵守[GNU通用公共许可证-第3版](licenses/GPL.md); +因为Lophine从上游Luminol继承了它,而Luminol又从其上游的Folia、Paper、Spigot、Bukkit和Craftbukkit项目中继承了它。 + +Any author who is _not_ listed below should be presumed to have released their work +under the original [GPL](licenses/GPL.md) license. + +任何 _未在下面列出_ 的作者都应该被认为他们的修改基于[原始GPL许可证](licenses/GPL.md)。 + +In the interest of promoting a better Minecraft platform for everyone, contributors +may choose to release their code under the more permissive [MIT License](licenses/MIT.md). + +为了向所有人推广一个更好的Minecraft平台,贡献者可以选择在更宽松的[MIT许可证](licenses/MIT.md)下发布他们的代码。 + +The authors listed below have chosen to release their code under that more permissive +[MIT License](licenses/MIT.md). Any contributor who wants their name added below +should submit a pull request to this project to add their name. + +下面列出的作者选择在更宽松的[MIT许可证](licenses/MIT.md)下发布他们的代码。 +任何希望使用[MIT许可证](licenses/MIT.md)发布的作者都应该向此项目提交一个拉取请求以在下方添加他们的名字。 + +```text +Helvetica Volubi +``` \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6ef0566 --- /dev/null +++ b/README.md @@ -0,0 +1,93 @@ +Logo + +# LightingLuminol + +

Lophine 是一个基于Luminol的分支,具有许多有用的优化和可配置的原版特性,目标是在Folia上实现更多生电的目标

+ +[![License](https://img.shields.io/github/license/LuminolMC/LightingLuminol?style=flat-square)](LICENSE.md) +[![Issues](https://img.shields.io/github/issues/LuminolMC/LightingLuminol?style=flat-square)](https://github.com/LuminolMC/LightingLuminol/issues) +![Commit Activity](https://img.shields.io/github/commit-activity/w/LuminolMC/LightingLuminol?style=flat-square) +![GitHub all releases](https://img.shields.io/github/downloads/LuminolMC/LightingLuminol/total?style=flat-square) + +[English](./README_EN.md) | **中文** + +## 特性 + - 支持部分Bukkit插件 + - 可配置的原版特性 + - Tpsbar 支持 + - 对单线程区域性能的优化 + - 更多有用的功能 + +## 下载 +任何版本都可以在 [Release](https://github.com/LuminolMC/LightingLuminol/releases), 中找到,你也可以通过[以下步骤](./README.md#构建)自己构建。 + +## 构建 +要构建一个paperclip jar,你需要运行以下命令。你可以在lightingluminol-server/build/libs中找到jar(注意:需要`JDK21`) + ```shell +./gradlew applyAllPatches && ./gradlew createMojmapPaperclipJar +``` +## 使用API +使用 Gradle: + +```kotlin +repositories { + maven { + url = "https://repo.menthamc.com/repository/maven-public/" + } +} + +dependencies { + compileOnly("me.earthme.luminol:luminol-api:$VERSION") +} + ``` + +使用 Maven + +```xml + + + menthamc + https://repo.menthamc.com/repository/maven-public/ + + + + + + me.earthme.luminol + luminol-api + $VERSION + + +``` + +## 联系方式 +> 如果您对这个项目感兴趣或有任何问题,请随时向我们提问。 + +**QQ群: [1015048616](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=QML5kIVsniPi1PlZvnjHQT_02EHsZ5Jc&authKey=%2FTCJsZC7JFQ9sxAroPCKuYnlV57Z5fyqp36ewXZk3Sn4iJ9p4MB1JKdc%2FFcX3HOM&noverify=0&group_code=1015048616)** | QQ频道: [点击加入](https://pd.qq.com/s/eq9krf9j) | Telegram: [点击加入](https://t.me/LuminolMinecraft) | Discord: [点击加入](https://discord.gg/Qd7m3V6eDx) + + +## 关于 Issue +当您遇到任何问题时,请向我们提问,我们将尽力解决,但请记得清楚地描述您的问题并提供足够的日志等信息。 + +## 贡献代码 +可查看 [Contributing](./docs/CONTRIBUTING.md) + +## BStats +![bStats](https://bstats.org/signatures/server-implementation/Luminol.svg "bStats") + +## 特别感谢 +Temporarily use Luminol's. +感谢[LegacyLands](https://github.com/LegacyLands)对本项目的赞助,如果你想开发一些跨folia/非folia平台的插件,[legacy-lands-library](https://github.com/LegacyLands/legacy-lands-library/)将会是个不错的lib + +![legacy-lands-logo](public/image/legacy-lands-logo.png) + +## 请给我们一个 ⭐Star! +> 你的每一个免费的 ⭐Star 就是我们每一个前进的动力。 + + + + + + Star历史表 + + diff --git a/README_EN.md b/README_EN.md new file mode 100644 index 0000000..0637ce0 --- /dev/null +++ b/README_EN.md @@ -0,0 +1,93 @@ + +Logo + +# LightingLuminol + +

LightingLuminol is a Luminol fork with many useful optimizations and configurable vanilla features, aims to provide more function for survival-usable circuit on folia

+ +[![License](https://img.shields.io/github/license/LuminolMC/LightingLuminol?style=flat-square)](LICENSE.md) +[![Issues](https://img.shields.io/github/issues/LuminolMC/LightingLuminol?style=flat-square)](https://github.com/LuminolMC/Luminol/issues) +![Commit Activity](https://img.shields.io/github/commit-activity/w/LuminolMC/LightingLuminol?style=flat-square) +![GitHub all releases](https://img.shields.io/github/downloads/LuminolMC/LightingLuminol/total?style=flat-square) + +**English** | [中文](./README.md) + +## Features + - Supported some Bukkit plugin + - Configurable vanilla features + - Tpsbar support + - Useful optimizations to improve the performance of single threaded region + - More functions + +## Download +Any versions are available in the [release](https://github.com/LuminolMC/LightingLuminol/releases), also you can build it by yourself through [the following steps](./README_EN.md#Build). + +## Build +To build a paperclip jar, you need to run the following command. You can find the jar in build/libs(Note: JDK21 is needed) + ```shell + ./gradlew applyPatches && ./gradlew createMojmapPaperclipJar +``` +## Using API +For gradle: + +```kotlin +repositories { + maven { + url = "https://repo.menthamc.com/repository/maven-public/" + } +} + +dependencies { + compileOnly("me.earthme.luminol:luminol-api:$VERSION") +} + ``` + +For maven + +```xml + + + menthamc + https://repo.menthamc.com/repository/maven-public/ + + + + + + me.earthme.luminol + luminol-api + $VERSION + + +``` + +## Contact +> If you are interested in this project or have any issue, feel free to ask us. + +**QQ Group: [1015048616](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=hTPlI5j6XB8pgk4sdx6RkjhBPGG1r4IR&authKey=pnu6uCKQP7Sja2CJWC15Qi3BeI%2FAsh8tU4m5muufMBjbB3zz%2BwHBZCTRRdSNKhld&noverify=0&group_code=1015048616)** | QQ Channel: [Click To Join](https://pd.qq.com/s/eq9krf9j) | Telegram: [Click To Join](https://t.me/LuminolMinecraft) | Discord: [Click To Join](https://discord.gg/Qd7m3V6eDx) + +## About Issue +When you meet any problems, just ask us, we will do our best to solve it, but remember to state your problem clear and provide enough logs etc.
+ +## Pull Requests +See [Contributing](./docs/CONTRIBUTING_EN.md) + +## BStats +Temporarily use Luminol's. +![bStats](https://bstats.org/signatures/server-implementation/Luminol.svg "bStats") + +## Special Thanks +Thanks [LegacyLands](https://github.com/LegacyLands) for sponsoring this project.If you want to develop some crossing folia/non-folia platform plugins, [legacy-lands-library](https://github.com/LegacyLands/legacy-lands-library/) will be a nice choice for you + +![legacy-lands-logo](public/image/legacy-lands-logo.png) + +## Please ⭐star us! + + + + + Star History Chart + + diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..ca15751 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,108 @@ +import org.gradle.api.tasks.testing.logging.TestExceptionFormat +import org.gradle.api.tasks.testing.logging.TestLogEvent + +plugins { + java // TODO java launcher tasks + id("io.papermc.paperweight.patcher") version "2.0.0-beta.17" +} + +paperweight { + upstreams.register("luminol") { + repo = github("LuminolMC", "Luminol") + ref = providers.gradleProperty("luminolRef") + + patchFile { + path = "luminol-server/build.gradle.kts" + outputFile = file("lophine-server/build.gradle.kts") + patchFile = file("lophine-server/build.gradle.kts.patch") + } + patchFile { + path = "luminol-api/build.gradle.kts" + outputFile = file("lophine-api/build.gradle.kts") + patchFile = file("lophine-api/build.gradle.kts.patch") + } + patchRepo("paperApi") { + upstreamPath = "paper-api" + patchesDir = file("lophine-api/paper-patches") + outputDir = file("paper-api") + } + patchRepo("foliaApi") { + upstreamPath = "folia-api" + patchesDir = file("lophine-api/folia-patches") + outputDir = file("folia-api") + } + patchDir("luminolApi") { + upstreamPath = "luminol-api" + excludes = listOf("build.gradle.kts", "build.gradle.kts.patch", "paper-patches") + patchesDir = file("lophine-api/luminol-patches") + outputDir = file("luminol-api") + } + } +} + +val paperMavenPublicUrl = "https://repo.papermc.io/repository/maven-public/" + +subprojects { + apply(plugin = "java-library") + apply(plugin = "maven-publish") + + extensions.configure { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } + } + + repositories { + mavenCentral() + maven(paperMavenPublicUrl) + } + + dependencies { + "testRuntimeOnly"("org.junit.platform:junit-platform-launcher") + } + + tasks.withType().configureEach { + isPreserveFileTimestamps = false + isReproducibleFileOrder = true + } + tasks.withType { + options.encoding = Charsets.UTF_8.name() + options.release = 21 + options.isFork = true + options.forkOptions.memoryMaximumSize = "6g" // Prevent OOM during building + } + tasks.withType { + options.encoding = Charsets.UTF_8.name() + } + tasks.withType { + filteringCharset = Charsets.UTF_8.name() + } + tasks.withType { + testLogging { + showStackTraces = true + exceptionFormat = TestExceptionFormat.FULL + events(TestLogEvent.STANDARD_OUT) + } + } + + extensions.configure { + repositories { + maven("https://repo.menthamc.com/repository/maven-snapshots/") { + name = "MenthaMC" + credentials(PasswordCredentials::class) { + username = System.getenv("MAVEN_REPO_USER") + password = System.getenv("MAVEN_REPO_PASSWORD") + } + } + } + } + + tasks.withType { + options { + (this as StandardJavadocDocletOptions).apply { + addStringOption("-add-modules", "jdk.incubator.vector") + addStringOption("Xdoclint:none", "-quiet") + } + } + } +} diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 0000000..9297713 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,87 @@ +为Lophine贡献代码 +=========== + +[English](./CONTRIBUTING_EN.md) | **中文** + +我们很开心您想为我们的项目做出贡献!一般来说,我们对PR的审核是十分宽松的; +但是如果您可以遵守下列的规则,我们可以更快地完成审核。 + +## 使用个人账户进行 Fork + +我们会定期尝试合并已有的 PR,如果有一些小问题,会尝试帮您解决这些问题。 + +但是如果您使用了组织账号进行 PR,我们就不能对您的 PR 进行修改了。因此我们只能关闭你的PR然后进行手动合并。 + +所以,请不要使用组织账号进行 Fork! + +您可以看看 [这个 Issue](https://github.com/isaacs/github/issues/1681) 来了解一下我们为什么无法修改组织账号的 PR。 + +## 开发环境 + +在开始开发之前,您首先需要拥有以下软件作为开发环境: + +- `git` +- `JDK 21 或更高版本` + +特别提醒:在操作前,您需要启用系统和Git的长路径支持,以下为部分平台的相关描述。 + +[`Windows`](https://learn.microsoft.com/windows/win32/fileio/maximum-file-path-limitation) +[`Git for Windows`](https://gitforwindows.org/faq.html#i-get-errors-trying-to-check-out-files-with-long-path-names) + +## 了解补丁(Patches) + +Lophine 使用和 Folia 一样的补丁系统,并为了针对不同部分的修改分成了两个目录: + +- `lophine-api` - 对 `Folia-API` / `Paper-API` / `Spigot-API` / `Bukkit-API` 进行的修改。 +- `lophine-server` - 对 Minecraft 标准服务器原有逻辑进行的修改。 + +补丁系统是基于 git 的,你可以在这里了解 git 的基本内容: + +如果你已经 Fork 了主储存库,那么下面你应该这么做: + +1. 将你的仓库 clone 到本地; +2. 在你的 IDE 或 终端 内执行 Gradle 的 `applyAllPatches` 任务,如果是在终端内,你可以执行 `./gradlew applyAllPatches`; +3. 在执行操作后,仓库根目录下应该存在以下目录对: `lophine-api` 和 `lophine-server` , `folia-api` 和 `folia-server` , 以及 `paper-api` 和 `paper-server`(下文称作 `*-api` 和 `*-server` ); +4. 进入 仓库根目录下的 `*-api` 和 `*-server` 文件夹进行修改。 + +以下为对上述各个文件夹的简单描述,详细描述可以参考[这里](https://github.com/Toffikk/paperweight-examples/blob/18241979c88068d5b061d95ad69c98ecb201c246/README.md): +1. API部分 + - `lophine-api` :暂无有效文件 + - `folia-api` :对folia-API的修改应当在此文件夹下进行 + - `paper-api` :对paper-API/spigot-API/bukkit-API的修改应该在此文件夹下进行 + +2. Server部分 + - `lophine-server` :对Minecraft原版服务器的修改应当在此文件夹下进行 + - `folia-server` :暂无有效文件 + - `paper-server` :对于非原版的对服务器逻辑的修改应当在此文件夹下进行 + +顺便一提,仓库根目录下的 `*-api` 和 `*-server` 并不是正常的 git 仓库: + +- 在应用补丁前,基点将会指向未被更改的源码 +- 在基点后的每一个提交都是一个补丁 +- 只有在 Luminol 最后一个提交后的提交才会被视为 lophine 补丁 + +## 增加补丁 + +按照以下步骤增加一个补丁是非常简单的: + +1. 对 `*-api` 和 `*-server` 进行修改; +2. 使用 git 添加你的修改,比如 `git add .`(不要提交新建的文件的修改); +3. 使用 `git commit -m <提交信息>` 进行提交; +4. 运行 Gradle 任务 `fixupPaperApiFilePatches` 生成新建文件的补丁文件(注意不要提交); +5. 运行 Gradle 任务 `rebuildAllServerPatches` 将你的提交转化为一个补丁; +6. 将你生成的补丁文件进行推送。 + +这样做以后,你就可以将你的补丁文件进行 PR 提交。 + +## 修改补丁 + +你可以使用以下方法来修改一个补丁的内容: + +1. 在 HEAD 上直接进行修改; +2. 使用 `git commit -a --fixup ` 来进行一个更正提交;(不要提交对在lophine新建文件的修改) + - 如果你想要更改提交信息,你也可以用 `--squash` 来代替 `--fixup`。 +3. 使用 `git rebase -i --autosquash base` 来进行自动变基,你只需要输入 `:q` 来关闭确认页面即可; +4. 运行 Gradle 任务 `fixupPaperApiFilePatches` 来修改已被修改的在lophine新建文件的补丁(注意不要提交); +5. 运行 Gradle 任务 `rebuildAllServerPatches` 来修改已被修改的补丁; +6. 将修改后的补丁 PR 发回储存库。 diff --git a/docs/CONTRIBUTING_EN.md b/docs/CONTRIBUTING_EN.md new file mode 100644 index 0000000..f2af417 --- /dev/null +++ b/docs/CONTRIBUTING_EN.md @@ -0,0 +1,91 @@ +Contributing to Lophine +=========== + +**English** | [中文](./CONTRIBUTING.md) + +We're glad that you want to contribute to our project! +In general, our review of pull requests is very lenient. +And if you can follow the rules below, we can complete the review faster. + +## Please fork using your personal account + +We regularly merge existing PRs. +If there are some small problems, we'll help you solve them by editing your PR. + +But, if your PR is from an organization, we can NOT edit your PR, so we must merge your PR manually. + +So, don't use organization accounts for fork! + +See also [This issue](https://github.com/isaacs/github/issues/1681), and then you'll know why we can't edit PRs from organizations. + +## Development Environment + +Before coding, you need these pieces of software / tools as Dev Environment. + +- `git` +- `JDK 21 or higher` + +PS: You need to enable long path support in your System and Git before start, some of the platform's resolution here. + +[`Windows`](https://learn.microsoft.com/windows/win32/fileio/maximum-file-path-limitation) +[`Git for Windows`](https://gitforwindows.org/faq.html#i-get-errors-trying-to-check-out-files-with-long-path-names) + +## Understanding "Patches" + +Lophine uses as the same patching system as Paper, +and has been divided into two directories for the purpose of modifying different parts of it: + +- `lophine-api` - Modifications to `Folia-API` / `Paper-API` / `Spigot-API` / `Bukkit-API`. +- `lophine-server` - Modifications to Minecraft Vanilla Server's source logic. + +The patching system is based on git, and you can learn about it at here: + +If you have forked the main repository, then you should follow the steps below: + +1. Clone your repository to local +2. Run Gradle's `applyAllPatches` task in your IDE or terminal (You can run `./gradlew applyAllPatches` directly in terminal.) +3. After performing the operation, the following directory pairs should exist in the root directory of the warehouse: `lophine-api` and `lophine-server` , `folia-api` and `folia-server` , `paper-api` and `paper-server` (Referred to `*-api` and `*-server` as below) +4. Enter `*-api` and `*-server` directory to carry out modifications. + +The following is the simple description of the aforementioned folders, detailed description can be referred to [here](https://github.com/Toffikk/paperweight-examples/blob/18241979c88068d5b061d95ad69c98ecb201c246/README.md): + +1. API part + - `lophine-api` : There is no valid file + - `folia-api` : Modifications to Folia API should be carried out in this folder + - `paper-api` : Modifications to Paper API/Spigot API/Bukkit API should be carried out in this folder + +2. Server part + - `lophine-server` : Modifications to Minecraft Vanilla Server's source logic should be carried out in this folder + - `folia-server` : There is no valid file + - `paper-server` : Modifications to non-vanilla server logic should be carried out in this folder + +BTW, `*-api` and `*-server` and are not normal git repositories. + +- Before applying patches, the base will point to unmodified source code. +- Every commit after the base is a patch. +- Only commits after the last commit of Luminol will be considered as Lophine patches. + +## Adding new patches + +It's very easy to add patches by following the steps below: + +1. Modify the code of `*-api` and `*-server` +2. Add these changes to the local git repository (For example, `git add .`) +3. Commit these changes using `git commit -m ` (PS: do not commit new-created files) +4. Run Gradle's task `fixupPaperApiFilePatches` to generate newly created files to new patches (PS: do not commit again before you run this task) +5. Run Gradle's task `rebuildAllServerPatches` to convert your commits to a new patch +6. Push your patches to your repository + +After pushing, you can open a PR to submit your patches. + +## Modifying patches + +You can modify an existing patch by following the steps below: + +1. Modify code at HEAD +2. Run `git commit -a --fixup ` in your terminal to make a fix-up commit (PS: do not commit changes of lophine-created files) + - If you want to edit the commit message, replace `--fixup` with `--squash` +3. Run `git rebase -i --autosquash base` to rebase automatically, then just type `:q` to close the confirm page +4. Run Gradle's task `fixupPaperApiFilePatches` to regenerate lophine-created files to patches (PS: do not commit again before you run this task) +5. Run Gradle's task `rebuildAllServerPatches` to modify existing patches +6. Push and PR again diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..accd6d5 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,10 @@ +group=me.earthme.lophine +version=1.21.5-R0.1-SNAPSHOT +mcVersion=1.21.5 + +luminolRef=785d82c4339056eccb40ada00a341f7d0e933db6 + +org.gradle.configuration-cache=true +org.gradle.caching=true +org.gradle.parallel=true +org.gradle.vfs.watch=false diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..1b33c55baabb587c669f562ae36f953de2481846 GIT binary patch literal 43764 zcma&OWmKeVvL#I6?i3D%6z=Zs?ofE*?rw#G$eqJB ziT4y8-Y@s9rkH0Tz>ll(^xkcTl)CY?rS&9VNd66Yc)g^6)JcWaY(5$5gt z8gr3SBXUTN;~cBgz&})qX%#!Fxom2Yau_`&8)+6aSN7YY+pS410rRUU*>J}qL0TnJ zRxt*7QeUqTh8j)Q&iavh<}L+$Jqz))<`IfKussVk%%Ah-Ti?Eo0hQH!rK%K=#EAw0 zwq@@~XNUXRnv8$;zv<6rCRJ6fPD^hfrh;0K?n z=p!u^3xOgWZ%f3+?+>H)9+w^$Tn1e;?UpVMJb!!;f)`6f&4|8mr+g)^@x>_rvnL0< zvD0Hu_N>$(Li7|Jgu0mRh&MV+<}`~Wi*+avM01E)Jtg=)-vViQKax!GeDc!xv$^mL z{#OVBA$U{(Zr8~Xm|cP@odkHC*1R8z6hcLY#N@3E-A8XEvpt066+3t9L_6Zg6j@9Q zj$$%~yO-OS6PUVrM2s)(T4#6=JpI_@Uz+!6=GdyVU?`!F=d;8#ZB@(5g7$A0(`eqY z8_i@3w$0*es5mrSjhW*qzrl!_LQWs4?VfLmo1Sd@Ztt53+etwzAT^8ow_*7Jp`Y|l z*UgSEwvxq+FYO!O*aLf-PinZYne7Ib6ny3u>MjQz=((r3NTEeU4=-i0LBq3H-VJH< z^>1RE3_JwrclUn9vb7HcGUaFRA0QHcnE;6)hnkp%lY1UII#WPAv?-;c?YH}LWB8Nl z{sx-@Z;QxWh9fX8SxLZk8;kMFlGD3Jc^QZVL4nO)1I$zQwvwM&_!kW+LMf&lApv#< zur|EyC|U@5OQuph$TC_ZU`{!vJp`13e9alaR0Dbn5ikLFH7>eIz4QbV|C=%7)F=qo z_>M&5N)d)7G(A%c>}UCrW!Ql_6_A{?R7&CL`;!KOb3 z8Z=$YkV-IF;c7zs{3-WDEFJzuakFbd*4LWd<_kBE8~BFcv}js_2OowRNzWCtCQ6&k z{&~Me92$m*@e0ANcWKuz)?YjB*VoSTx??-3Cc0l2U!X^;Bv@m87eKHukAljrD54R+ zE;@_w4NPe1>3`i5Qy*3^E9x#VB6?}v=~qIprrrd5|DFkg;v5ixo0IsBmik8=Y;zv2 z%Bcf%NE$a44bk^`i4VwDLTbX=q@j9;JWT9JncQ!+Y%2&HHk@1~*L8-{ZpY?(-a9J-1~<1ltr9i~D9`P{XTIFWA6IG8c4;6bFw*lzU-{+?b&%OcIoCiw00n>A1ra zFPE$y@>ebbZlf(sN_iWBzQKDV zmmaLX#zK!@ZdvCANfwV}9@2O&w)!5gSgQzHdk2Q`jG6KD7S+1R5&F)j6QTD^=hq&7 zHUW+r^da^%V(h(wonR(j?BOiC!;y=%nJvz?*aW&5E87qq;2z`EI(f zBJNNSMFF9U{sR-af5{IY&AtoGcoG)Iq-S^v{7+t0>7N(KRoPj;+2N5;9o_nxIGjJ@ z7bYQK)bX)vEhy~VL%N6g^NE@D5VtV+Q8U2%{ji_=6+i^G%xeskEhH>Sqr194PJ$fB zu1y^){?9Vkg(FY2h)3ZHrw0Z<@;(gd_dtF#6y_;Iwi{yX$?asr?0N0_B*CifEi7<6 zq`?OdQjCYbhVcg+7MSgIM|pJRu~`g?g3x?Tl+V}#$It`iD1j+!x+!;wS0+2e>#g?Z z*EA^k7W{jO1r^K~cD#5pamp+o@8&yw6;%b|uiT?{Wa=4+9<}aXWUuL#ZwN1a;lQod zW{pxWCYGXdEq9qAmvAB904}?97=re$>!I%wxPV#|f#@A*Y=qa%zHlDv^yWbR03%V0 zprLP+b(#fBqxI%FiF*-n8HtH6$8f(P6!H3V^ysgd8de-N(@|K!A< z^qP}jp(RaM9kQ(^K(U8O84?D)aU(g?1S8iWwe)gqpHCaFlJxb*ilr{KTnu4_@5{K- z)n=CCeCrPHO0WHz)dDtkbZfUfVBd?53}K>C5*-wC4hpDN8cGk3lu-ypq+EYpb_2H; z%vP4@&+c2p;thaTs$dc^1CDGlPG@A;yGR5@$UEqk6p58qpw#7lc<+W(WR;(vr(D>W z#(K$vE#uBkT=*q&uaZwzz=P5mjiee6>!lV?c}QIX%ZdkO1dHg>Fa#xcGT6~}1*2m9 zkc7l3ItD6Ie~o_aFjI$Ri=C!8uF4!Ky7iG9QTrxVbsQroi|r)SAon#*B*{}TB-?=@ z8~jJs;_R2iDd!$+n$%X6FO&PYS{YhDAS+U2o4su9x~1+U3z7YN5o0qUK&|g^klZ6X zj_vrM5SUTnz5`*}Hyts9ADwLu#x_L=nv$Z0`HqN`Zo=V>OQI)fh01n~*a%01%cx%0 z4LTFVjmW+ipVQv5rYcn3;d2o4qunWUY!p+?s~X~(ost@WR@r@EuDOSs8*MT4fiP>! zkfo^!PWJJ1MHgKS2D_hc?Bs?isSDO61>ebl$U*9*QY(b=i&rp3@3GV@z>KzcZOxip z^dzA~44;R~cnhWz7s$$v?_8y-k!DZys}Q?4IkSyR!)C0j$(Gm|t#e3|QAOFaV2}36 z?dPNY;@I=FaCwylc_;~kXlZsk$_eLkNb~TIl8QQ`mmH&$*zwwR8zHU*sId)rxHu*K z;yZWa8UmCwju%aSNLwD5fBl^b0Ux1%q8YR*uG`53Mi<`5uA^Dc6Ync)J3N7;zQ*75)hf%a@{$H+%S?SGT)ks60)?6j$ zspl|4Ad6@%-r1t*$tT(en!gIXTUDcsj?28ZEzz)dH)SV3bZ+pjMaW0oc~rOPZP@g! zb9E+ndeVO_Ib9c_>{)`01^`ZS198 z)(t=+{Azi11$eu%aU7jbwuQrO`vLOixuh~%4z@mKr_Oc;F%Uq01fA)^W&y+g16e?rkLhTxV!EqC%2}sx_1u7IBq|}Be&7WI z4I<;1-9tJsI&pQIhj>FPkQV9{(m!wYYV@i5h?A0#BN2wqlEwNDIq06|^2oYVa7<~h zI_OLan0Do*4R5P=a3H9`s5*>xU}_PSztg`+2mv)|3nIy=5#Z$%+@tZnr> zLcTI!Mxa`PY7%{;KW~!=;*t)R_sl<^b>eNO@w#fEt(tPMg_jpJpW$q_DoUlkY|uo> z0-1{ouA#;t%spf*7VjkK&$QrvwUERKt^Sdo)5@?qAP)>}Y!h4(JQ!7{wIdkA+|)bv z&8hBwoX4v|+fie}iTslaBX^i*TjwO}f{V)8*!dMmRPi%XAWc8<_IqK1jUsApk)+~R zNFTCD-h>M5Y{qTQ&0#j@I@tmXGj%rzhTW5%Bkh&sSc=$Fv;M@1y!zvYG5P2(2|(&W zlcbR1{--rJ&s!rB{G-sX5^PaM@3EqWVz_y9cwLR9xMig&9gq(voeI)W&{d6j1jh&< zARXi&APWE1FQWh7eoZjuP z;vdgX>zep^{{2%hem;e*gDJhK1Hj12nBLIJoL<=0+8SVEBx7!4Ea+hBY;A1gBwvY<)tj~T=H`^?3>zeWWm|LAwo*S4Z%bDVUe z6r)CH1H!(>OH#MXFJ2V(U(qxD{4Px2`8qfFLG+=a;B^~Te_Z!r3RO%Oc#ZAHKQxV5 zRYXxZ9T2A%NVJIu5Pu7!Mj>t%YDO$T@M=RR(~mi%sv(YXVl`yMLD;+WZ{vG9(@P#e zMo}ZiK^7^h6TV%cG+;jhJ0s>h&VERs=tuZz^Tlu~%d{ZHtq6hX$V9h)Bw|jVCMudd zwZ5l7In8NT)qEPGF$VSKg&fb0%R2RnUnqa){)V(X(s0U zkCdVZe6wy{+_WhZh3qLp245Y2RR$@g-!9PjJ&4~0cFSHMUn=>dapv)hy}|y91ZWTV zCh=z*!S3_?`$&-eZ6xIXUq8RGl9oK0BJw*TdU6A`LJqX9eS3X@F)g$jLkBWFscPhR zpCv8#KeAc^y>>Y$k^=r|K(DTC}T$0#jQBOwB#@`P6~*IuW_8JxCG}J4va{ zsZzt}tt+cv7=l&CEuVtjD6G2~_Meh%p4RGuY?hSt?(sreO_F}8r7Kp$qQdvCdZnDQ zxzc*qchE*E2=WK)^oRNa>Ttj`fpvF-JZ5tu5>X1xw)J@1!IqWjq)ESBG?J|ez`-Tc zi5a}GZx|w-h%5lNDE_3ho0hEXMoaofo#Z;$8|2;EDF&*L+e$u}K=u?pb;dv$SXeQM zD-~7P0i_`Wk$#YP$=hw3UVU+=^@Kuy$>6?~gIXx636jh{PHly_a2xNYe1l60`|y!7 z(u%;ILuW0DDJ)2%y`Zc~hOALnj1~txJtcdD#o4BCT68+8gZe`=^te6H_egxY#nZH&P*)hgYaoJ^qtmpeea`35Fw)cy!w@c#v6E29co8&D9CTCl%^GV|X;SpneSXzV~LXyRn-@K0Df z{tK-nDWA!q38M1~`xUIt_(MO^R(yNY#9@es9RQbY@Ia*xHhD&=k^T+ zJi@j2I|WcgW=PuAc>hs`(&CvgjL2a9Rx zCbZyUpi8NWUOi@S%t+Su4|r&UoU|ze9SVe7p@f1GBkrjkkq)T}X%Qo1g!SQ{O{P?m z-OfGyyWta+UCXH+-+(D^%kw#A1-U;?9129at7MeCCzC{DNgO zeSqsV>W^NIfTO~4({c}KUiuoH8A*J!Cb0*sp*w-Bg@YfBIPZFH!M}C=S=S7PLLcIG zs7K77g~W)~^|+mx9onzMm0qh(f~OsDTzVmRtz=aZTllgR zGUn~_5hw_k&rll<4G=G+`^Xlnw;jNYDJz@bE?|r866F2hA9v0-8=JO3g}IHB#b`hy zA42a0>{0L7CcabSD+F7?pGbS1KMvT{@1_@k!_+Ki|5~EMGt7T%u=79F)8xEiL5!EJ zzuxQ`NBliCoJMJdwu|);zRCD<5Sf?Y>U$trQ-;xj6!s5&w=9E7)%pZ+1Nh&8nCCwM zv5>Ket%I?cxr3vVva`YeR?dGxbG@pi{H#8@kFEf0Jq6~K4>kt26*bxv=P&jyE#e$| zDJB_~imk^-z|o!2njF2hL*|7sHCnzluhJjwLQGDmC)Y9 zr9ZN`s)uCd^XDvn)VirMgW~qfn1~SaN^7vcX#K1G`==UGaDVVx$0BQnubhX|{e z^i0}>k-;BP#Szk{cFjO{2x~LjK{^Upqd&<+03_iMLp0$!6_$@TbX>8U-f*-w-ew1?`CtD_0y_Lo|PfKi52p?`5$Jzx0E8`M0 zNIb?#!K$mM4X%`Ry_yhG5k@*+n4||2!~*+&pYLh~{`~o(W|o64^NrjP?-1Lgu?iK^ zTX6u3?#$?R?N!{599vg>G8RGHw)Hx&=|g4599y}mXNpM{EPKKXB&+m?==R3GsIq?G zL5fH={=zawB(sMlDBJ+{dgb)Vx3pu>L=mDV0{r1Qs{0Pn%TpopH{m(By4;{FBvi{I z$}x!Iw~MJOL~&)p93SDIfP3x%ROjg}X{Sme#hiJ&Yk&a;iR}V|n%PriZBY8SX2*;6 z4hdb^&h;Xz%)BDACY5AUsV!($lib4>11UmcgXKWpzRL8r2Srl*9Y(1uBQsY&hO&uv znDNff0tpHlLISam?o(lOp#CmFdH<6HmA0{UwfU#Y{8M+7od8b8|B|7ZYR9f<#+V|ZSaCQvI$~es~g(Pv{2&m_rKSB2QQ zMvT}$?Ll>V+!9Xh5^iy3?UG;dF-zh~RL#++roOCsW^cZ&({6q|?Jt6`?S8=16Y{oH zp50I7r1AC1(#{b`Aq5cw>ypNggHKM9vBx!W$eYIzD!4KbLsZGr2o8>g<@inmS3*>J zx8oG((8f!ei|M@JZB`p7+n<Q}?>h249<`7xJ?u}_n;Gq(&km#1ULN87CeTO~FY zS_Ty}0TgQhV zOh3T7{{x&LSYGQfKR1PDIkP!WnfC1$l+fs@Di+d4O=eVKeF~2fq#1<8hEvpwuqcaH z4A8u~r^gnY3u6}zj*RHjk{AHhrrDqaj?|6GaVJbV%o-nATw}ASFr!f`Oz|u_QPkR# z0mDudY1dZRlk@TyQ?%Eti=$_WNFtLpSx9=S^be{wXINp%MU?a`F66LNU<c;0&ngifmP9i;bj6&hdGMW^Kf8e6ZDXbQD&$QAAMo;OQ)G zW(qlHh;}!ZP)JKEjm$VZjTs@hk&4{?@+NADuYrr!R^cJzU{kGc1yB?;7mIyAWwhbeA_l_lw-iDVi7wcFurf5 z#Uw)A@a9fOf{D}AWE%<`s1L_AwpZ?F!Vac$LYkp<#A!!`XKaDC{A%)~K#5z6>Hv@V zBEqF(D5?@6r3Pwj$^krpPDCjB+UOszqUS;b2n>&iAFcw<*im2(b3|5u6SK!n9Sg4I z0KLcwA6{Mq?p%t>aW0W!PQ>iUeYvNjdKYqII!CE7SsS&Rj)eIw-K4jtI?II+0IdGq z2WT|L3RL?;GtGgt1LWfI4Ka`9dbZXc$TMJ~8#Juv@K^1RJN@yzdLS8$AJ(>g!U9`# zx}qr7JWlU+&m)VG*Se;rGisutS%!6yybi%B`bv|9rjS(xOUIvbNz5qtvC$_JYY+c& za*3*2$RUH8p%pSq>48xR)4qsp!Q7BEiJ*`^>^6INRbC@>+2q9?x(h0bpc>GaNFi$K zPH$6!#(~{8@0QZk=)QnM#I=bDx5vTvjm$f4K}%*s+((H2>tUTf==$wqyoI`oxI7>C z&>5fe)Yg)SmT)eA(|j@JYR1M%KixxC-Eceknf-;N=jJTwKvk#@|J^&5H0c+%KxHUI z6dQbwwVx3p?X<_VRVb2fStH?HH zFR@Mp=qX%#L3XL)+$PXKV|o|#DpHAoqvj6uQKe@M-mnhCSou7Dj4YuO6^*V`m)1lf z;)@e%1!Qg$10w8uEmz{ENb$^%u}B;J7sDd zump}onoD#!l=agcBR)iG!3AF0-63%@`K9G(CzKrm$VJ{v7^O9Ps7Zej|3m= zVXlR&yW6=Y%mD30G@|tf=yC7-#L!16Q=dq&@beWgaIL40k0n% z)QHrp2Jck#evLMM1RGt3WvQ936ZC9vEje0nFMfvmOHVI+&okB_K|l-;|4vW;qk>n~ z+|kk8#`K?x`q>`(f6A${wfw9Cx(^)~tX7<#TpxR#zYG2P+FY~mG{tnEkv~d6oUQA+ z&hNTL=~Y@rF`v-RZlts$nb$3(OL1&@Y11hhL9+zUb6)SP!;CD)^GUtUpCHBE`j1te zAGud@miCVFLk$fjsrcpjsadP__yj9iEZUW{Ll7PPi<$R;m1o!&Xdl~R_v0;oDX2z^!&8}zNGA}iYG|k zmehMd1%?R)u6R#<)B)1oe9TgYH5-CqUT8N7K-A-dm3hbm_W21p%8)H{O)xUlBVb+iUR}-v5dFaCyfSd zC6Bd7=N4A@+Bna=!-l|*_(nWGDpoyU>nH=}IOrLfS+-d40&(Wo*dDB9nQiA2Tse$R z;uq{`X7LLzP)%Y9aHa4YQ%H?htkWd3Owv&UYbr5NUDAH^<l@Z0Cx%`N+B*i!!1u>D8%;Qt1$ zE5O0{-`9gdDxZ!`0m}ywH!;c{oBfL-(BH<&SQ~smbcobU!j49O^f4&IIYh~f+hK*M zZwTp%{ZSAhMFj1qFaOA+3)p^gnXH^=)`NTYgTu!CLpEV2NF=~-`(}7p^Eof=@VUbd z_9U|8qF7Rueg&$qpSSkN%%%DpbV?8E8ivu@ensI0toJ7Eas^jyFReQ1JeY9plb^{m z&eQO)qPLZQ6O;FTr*aJq=$cMN)QlQO@G&%z?BKUs1&I^`lq>=QLODwa`(mFGC`0H< zOlc*|N?B5&!U6BuJvkL?s1&nsi$*5cCv7^j_*l&$-sBmRS85UIrE--7eD8Gr3^+o? zqG-Yl4S&E;>H>k^a0GdUI(|n1`ws@)1%sq2XBdK`mqrNq_b4N{#VpouCXLzNvjoFv zo9wMQ6l0+FT+?%N(ka*;%m~(?338bu32v26!{r)|w8J`EL|t$}TA4q_FJRX5 zCPa{hc_I(7TGE#@rO-(!$1H3N-C0{R$J=yPCXCtGk{4>=*B56JdXU9cQVwB`6~cQZ zf^qK21x_d>X%dT!!)CJQ3mlHA@ z{Prkgfs6=Tz%63$6Zr8CO0Ak3A)Cv#@BVKr&aiKG7RYxY$Yx>Bj#3gJk*~Ps-jc1l z;4nltQwwT4@Z)}Pb!3xM?+EW0qEKA)sqzw~!C6wd^{03-9aGf3Jmt=}w-*!yXupLf z;)>-7uvWN4Unn8b4kfIza-X=x*e4n5pU`HtgpFFd))s$C@#d>aUl3helLom+RYb&g zI7A9GXLRZPl}iQS*d$Azxg-VgcUr*lpLnbPKUV{QI|bsG{8bLG<%CF( zMoS4pRDtLVYOWG^@ox^h8xL~afW_9DcE#^1eEC1SVSb1BfDi^@g?#f6e%v~Aw>@w- zIY0k+2lGWNV|aA*e#`U3=+oBDmGeInfcL)>*!w|*;mWiKNG6wP6AW4-4imN!W)!hE zA02~S1*@Q`fD*+qX@f3!2yJX&6FsEfPditB%TWo3=HA;T3o2IrjS@9SSxv%{{7&4_ zdS#r4OU41~GYMiib#z#O;zohNbhJknrPPZS6sN$%HB=jUnlCO_w5Gw5EeE@KV>soy z2EZ?Y|4RQDDjt5y!WBlZ(8M)|HP<0YyG|D%RqD+K#e7-##o3IZxS^wQ5{Kbzb6h(i z#(wZ|^ei>8`%ta*!2tJzwMv+IFHLF`zTU8E^Mu!R*45_=ccqI};Zbyxw@U%a#2}%f zF>q?SrUa_a4H9l+uW8JHh2Oob>NyUwG=QH~-^ZebU*R@67DcXdz2{HVB4#@edz?B< z5!rQH3O0>A&ylROO%G^fimV*LX7>!%re{_Sm6N>S{+GW1LCnGImHRoF@csnFzn@P0 zM=jld0z%oz;j=>c7mMwzq$B^2mae7NiG}%>(wtmsDXkWk{?BeMpTrIt3Mizq?vRsf zi_WjNp+61uV(%gEU-Vf0;>~vcDhe(dzWdaf#4mH3o^v{0EWhj?E?$5v02sV@xL0l4 zX0_IMFtQ44PfWBbPYN#}qxa%=J%dlR{O!KyZvk^g5s?sTNycWYPJ^FK(nl3k?z-5t z39#hKrdO7V(@!TU)LAPY&ngnZ1MzLEeEiZznn7e-jLCy8LO zu^7_#z*%I-BjS#Pg-;zKWWqX-+Ly$T!4`vTe5ZOV0j?TJVA*2?*=82^GVlZIuH%9s zXiV&(T(QGHHah=s&7e|6y?g+XxZGmK55`wGV>@1U)Th&=JTgJq>4mI&Av2C z)w+kRoj_dA!;SfTfkgMPO>7Dw6&1*Hi1q?54Yng`JO&q->^CX21^PrU^JU#CJ_qhV zSG>afB%>2fx<~g8p=P8Yzxqc}s@>>{g7}F!;lCXvF#RV)^fyYb_)iKVCz1xEq=fJ| z0a7DMCK*FuP=NM*5h;*D`R4y$6cpW-E&-i{v`x=Jbk_xSn@2T3q!3HoAOB`@5Vg6) z{PW|@9o!e;v1jZ2{=Uw6S6o{g82x6g=k!)cFSC*oemHaVjg?VpEmtUuD2_J^A~$4* z3O7HsbA6wxw{TP5Kk)(Vm?gKo+_}11vbo{Tp_5x79P~#F)ahQXT)tSH5;;14?s)On zel1J>1x>+7;g1Iz2FRpnYz;sD0wG9Q!vuzE9yKi3@4a9Nh1!GGN?hA)!mZEnnHh&i zf?#ZEN2sFbf~kV;>K3UNj1&vFhc^sxgj8FCL4v>EOYL?2uuT`0eDH}R zmtUJMxVrV5H{L53hu3#qaWLUa#5zY?f5ozIn|PkMWNP%n zWB5!B0LZB0kLw$k39=!akkE9Q>F4j+q434jB4VmslQ;$ zKiO#FZ`p|dKS716jpcvR{QJkSNfDVhr2%~eHrW;fU45>>snr*S8Vik-5eN5k*c2Mp zyxvX&_cFbB6lODXznHHT|rsURe2!swomtrqc~w5 zymTM8!w`1{04CBprR!_F{5LB+2_SOuZN{b*!J~1ZiPpP-M;);!ce!rOPDLtgR@Ie1 zPreuqm4!H)hYePcW1WZ0Fyaqe%l}F~Orr)~+;mkS&pOhP5Ebb`cnUt!X_QhP4_4p( z8YKQCDKGIy>?WIFm3-}Br2-N`T&FOi?t)$hjphB9wOhBXU#Hb+zm&We_-O)s(wc`2 z8?VsvU;J>Ju7n}uUb3s1yPx_F*|FlAi=Ge=-kN?1;`~6szP%$3B0|8Sqp%ebM)F8v zADFrbeT0cgE>M0DMV@_Ze*GHM>q}wWMzt|GYC%}r{OXRG3Ij&<+nx9;4jE${Fj_r* z`{z1AW_6Myd)i6e0E-h&m{{CvzH=Xg!&(bLYgRMO_YVd8JU7W+7MuGWNE=4@OvP9+ zxi^vqS@5%+#gf*Z@RVyU9N1sO-(rY$24LGsg1>w>s6ST^@)|D9>cT50maXLUD{Fzf zt~tp{OSTEKg3ZSQyQQ5r51){%=?xlZ54*t1;Ow)zLe3i?8tD8YyY^k%M)e`V*r+vL zPqUf&m)U+zxps+NprxMHF{QSxv}>lE{JZETNk1&F+R~bp{_T$dbXL2UGnB|hgh*p4h$clt#6;NO~>zuyY@C-MD@)JCc5XrYOt`wW7! z_ti2hhZBMJNbn0O-uTxl_b6Hm313^fG@e;RrhIUK9@# z+DHGv_Ow$%S8D%RB}`doJjJy*aOa5mGHVHz0e0>>O_%+^56?IkA5eN+L1BVCp4~m=1eeL zb;#G!#^5G%6Mw}r1KnaKsLvJB%HZL)!3OxT{k$Yo-XrJ?|7{s4!H+S2o?N|^Z z)+?IE9H7h~Vxn5hTis^3wHYuOU84+bWd)cUKuHapq=&}WV#OxHpLab`NpwHm8LmOo zjri+!k;7j_?FP##CpM+pOVx*0wExEex z@`#)K<-ZrGyArK;a%Km`^+We|eT+#MygHOT6lXBmz`8|lyZOwL1+b+?Z$0OhMEp3R z&J=iRERpv~TC=p2-BYLC*?4 zxvPs9V@g=JT0>zky5Poj=fW_M!c)Xxz1<=&_ZcL=LMZJqlnO1P^xwGGW*Z+yTBvbV z-IFe6;(k1@$1;tS>{%pXZ_7w+i?N4A2=TXnGf=YhePg8bH8M|Lk-->+w8Y+FjZ;L=wSGwxfA`gqSn)f(XNuSm>6Y z@|#e-)I(PQ^G@N`%|_DZSb4_pkaEF0!-nqY+t#pyA>{9^*I-zw4SYA1_z2Bs$XGUZbGA;VeMo%CezHK0lO={L%G)dI-+8w?r9iexdoB{?l zbJ}C?huIhWXBVs7oo{!$lOTlvCLZ_KN1N+XJGuG$rh<^eUQIqcI7^pmqhBSaOKNRq zrx~w^?9C?*&rNwP_SPYmo;J-#!G|{`$JZK7DxsM3N^8iR4vvn>E4MU&Oe1DKJvLc~ zCT>KLZ1;t@My zRj_2hI^61T&LIz)S!+AQIV23n1>ng+LUvzv;xu!4;wpqb#EZz;F)BLUzT;8UA1x*6vJ zicB!3Mj03s*kGV{g`fpC?V^s(=JG-k1EMHbkdP4P*1^8p_TqO|;!Zr%GuP$8KLxuf z=pv*H;kzd;P|2`JmBt~h6|GxdU~@weK5O=X&5~w$HpfO}@l-T7@vTCxVOwCkoPQv8 z@aV_)I5HQtfs7^X=C03zYmH4m0S!V@JINm6#(JmZRHBD?T!m^DdiZJrhKpBcur2u1 zf9e4%k$$vcFopK5!CC`;ww(CKL~}mlxK_Pv!cOsFgVkNIghA2Au@)t6;Y3*2gK=5d z?|@1a)-(sQ%uFOmJ7v2iG&l&m^u&^6DJM#XzCrF%r>{2XKyxLD2rgWBD;i(!e4InDQBDg==^z;AzT2z~OmV0!?Z z0S9pX$+E;w3WN;v&NYT=+G8hf=6w0E1$0AOr61}eOvE8W1jX%>&Mjo7&!ulawgzLH zbcb+IF(s^3aj12WSi#pzIpijJJzkP?JzRawnxmNDSUR#7!29vHULCE<3Aa#be}ie~d|!V+ z%l~s9Odo$G&fH!t!+`rUT0T9DulF!Yq&BfQWFZV1L9D($r4H(}Gnf6k3^wa7g5|Ws zj7%d`!3(0bb55yhC6@Q{?H|2os{_F%o=;-h{@Yyyn*V7?{s%Grvpe!H^kl6tF4Zf5 z{Jv1~yZ*iIWL_9C*8pBMQArfJJ0d9Df6Kl#wa}7Xa#Ef_5B7=X}DzbQXVPfCwTO@9+@;A^Ti6il_C>g?A-GFwA0#U;t4;wOm-4oS})h z5&on>NAu67O?YCQr%7XIzY%LS4bha9*e*4bU4{lGCUmO2UQ2U)QOqClLo61Kx~3dI zmV3*(P6F_Tr-oP%x!0kTnnT?Ep5j;_IQ^pTRp=e8dmJtI4YgWd0}+b2=ATkOhgpXe z;jmw+FBLE}UIs4!&HflFr4)vMFOJ19W4f2^W(=2)F%TAL)+=F>IE$=e=@j-*bFLSg z)wf|uFQu+!=N-UzSef62u0-C8Zc7 zo6@F)c+nZA{H|+~7i$DCU0pL{0Ye|fKLuV^w!0Y^tT$isu%i1Iw&N|tX3kwFKJN(M zXS`k9js66o$r)x?TWL}Kxl`wUDUpwFx(w4Yk%49;$sgVvT~n8AgfG~HUcDt1TRo^s zdla@6heJB@JV z!vK;BUMznhzGK6PVtj0)GB=zTv6)Q9Yt@l#fv7>wKovLobMV-+(8)NJmyF8R zcB|_K7=FJGGn^X@JdFaat0uhKjp3>k#^&xE_}6NYNG?kgTp>2Iu?ElUjt4~E-?`Du z?mDCS9wbuS%fU?5BU@Ijx>1HG*N?gIP+<~xE4u=>H`8o((cS5M6@_OK%jSjFHirQK zN9@~NXFx*jS{<|bgSpC|SAnA@I)+GB=2W|JJChLI_mx+-J(mSJ!b)uUom6nH0#2^(L@JBlV#t zLl?j54s`Y3vE^c_3^Hl0TGu*tw_n?@HyO@ZrENxA+^!)OvUX28gDSF*xFtQzM$A+O zCG=n#6~r|3zt=8%GuG} z<#VCZ%2?3Q(Ad#Y7GMJ~{U3>E{5e@z6+rgZLX{Cxk^p-7dip^d29;2N1_mm4QkASo z-L`GWWPCq$uCo;X_BmGIpJFBlhl<8~EG{vOD1o|X$aB9KPhWO_cKiU*$HWEgtf=fn zsO%9bp~D2c@?*K9jVN@_vhR03>M_8h!_~%aN!Cnr?s-!;U3SVfmhRwk11A^8Ns`@KeE}+ zN$H}a1U6E;*j5&~Og!xHdfK5M<~xka)x-0N)K_&e7AjMz`toDzasH+^1bZlC!n()crk9kg@$(Y{wdKvbuUd04N^8}t1iOgsKF zGa%%XWx@WoVaNC1!|&{5ZbkopFre-Lu(LCE5HWZBoE#W@er9W<>R=^oYxBvypN#x3 zq#LC8&q)GFP=5^-bpHj?LW=)-g+3_)Ylps!3^YQ{9~O9&K)xgy zMkCWaApU-MI~e^cV{Je75Qr7eF%&_H)BvfyKL=gIA>;OSq(y z052BFz3E(Prg~09>|_Z@!qj}@;8yxnw+#Ej0?Rk<y}4ghbD569B{9hSFr*^ygZ zr6j7P#gtZh6tMk6?4V$*Jgz+#&ug;yOr>=qdI#9U&^am2qoh4Jy}H2%a|#Fs{E(5r z%!ijh;VuGA6)W)cJZx+;9Bp1LMUzN~x_8lQ#D3+sL{be-Jyeo@@dv7XguJ&S5vrH` z>QxOMWn7N-T!D@1(@4>ZlL^y5>m#0!HKovs12GRav4z!>p(1~xok8+_{| z#Ae4{9#NLh#Vj2&JuIn5$d6t@__`o}umFo(n0QxUtd2GKCyE+erwXY?`cm*h&^9*8 zJ+8x6fRZI-e$CRygofIQN^dWysCxgkyr{(_oBwwSRxZora1(%(aC!5BTtj^+YuevI zx?)H#(xlALUp6QJ!=l9N__$cxBZ5p&7;qD3PsXRFVd<({Kh+mShFWJNpy`N@ab7?9 zv5=klvCJ4bx|-pvOO2-+G)6O?$&)ncA#Urze2rlBfp#htudhx-NeRnJ@u%^_bfw4o z4|{b8SkPV3b>Wera1W(+N@p9H>dc6{cnkh-sgr?e%(YkWvK+0YXVwk0=d`)}*47*B z5JGkEdVix!w7-<%r0JF~`ZMMPe;f0EQHuYHxya`puazyph*ZSb1mJAt^k4549BfS; zK7~T&lRb=W{s&t`DJ$B}s-eH1&&-wEOH1KWsKn0a(ZI+G!v&W4A*cl>qAvUv6pbUR z#(f#EKV8~hk&8oayBz4vaswc(?qw1vn`yC zZQDl2PCB-&Uu@g9ZQHhO+v(W0bNig{-k0;;`+wM@#@J)8r?qOYs#&vUna8ILxN7S{ zp1s41KnR8miQJtJtOr|+qk}wrLt+N*z#5o`TmD1)E&QD(Vh&pjZJ_J*0!8dy_ z>^=@v=J)C`x&gjqAYu`}t^S=DFCtc0MkBU2zf|69?xW`Ck~(6zLD)gSE{7n~6w8j_ zoH&~$ED2k5-yRa0!r8fMRy z;QjBYUaUnpd}mf%iVFPR%Dg9!d>g`01m~>2s))`W|5!kc+_&Y>wD@@C9%>-lE`WB0 zOIf%FVD^cj#2hCkFgi-fgzIfOi+ya)MZK@IZhHT5FVEaSbv-oDDs0W)pA0&^nM0TW zmgJmd7b1R7b0a`UwWJYZXp4AJPteYLH>@M|xZFKwm!t3D3&q~av?i)WvAKHE{RqpD{{%OhYkK?47}+}` zrR2(Iv9bhVa;cDzJ%6ntcSbx7v7J@Y4x&+eWSKZ*eR7_=CVIUSB$^lfYe@g+p|LD{ zPSpQmxx@b$%d!05|H}WzBT4_cq?@~dvy<7s&QWtieJ9)hd4)$SZz}#H2UTi$CkFWW|I)v_-NjuH!VypONC=1`A=rm_jfzQ8Fu~1r8i{q-+S_j$ z#u^t&Xnfi5tZtl@^!fUJhx@~Cg0*vXMK}D{>|$#T*+mj(J_@c{jXBF|rm4-8%Z2o! z2z0o(4%8KljCm^>6HDK!{jI7p+RAPcty_~GZ~R_+=+UzZ0qzOwD=;YeZt*?3%UGdr z`c|BPE;yUbnyARUl&XWSNJ<+uRt%!xPF&K;(l$^JcA_CMH6)FZt{>6ah$|(9$2fc~ z=CD00uHM{qv;{Zk9FR0~u|3|Eiqv9?z2#^GqylT5>6JNZwKqKBzzQpKU2_pmtD;CT zi%Ktau!Y2Tldfu&b0UgmF(SSBID)15*r08eoUe#bT_K-G4VecJL2Pa=6D1K6({zj6 za(2Z{r!FY5W^y{qZ}08+h9f>EKd&PN90f}Sc0ejf%kB4+f#T8Q1=Pj=~#pi$U zp#5rMR%W25>k?<$;$x72pkLibu1N|jX4cWjD3q^Pk3js!uK6h7!dlvw24crL|MZs_ zb%Y%?Fyp0bY0HkG^XyS76Ts*|Giw{31LR~+WU5NejqfPr73Rp!xQ1mLgq@mdWncLy z%8}|nzS4P&`^;zAR-&nm5f;D-%yNQPwq4N7&yULM8bkttkD)hVU>h>t47`{8?n2&4 zjEfL}UEagLUYwdx0sB2QXGeRmL?sZ%J!XM`$@ODc2!y|2#7hys=b$LrGbvvjx`Iqi z&RDDm3YBrlKhl`O@%%&rhLWZ*ABFz2nHu7k~3@e4)kO3%$=?GEFUcCF=6-1n!x^vmu+Ai*amgXH+Rknl6U>#9w;A} zn2xanZSDu`4%%x}+~FG{Wbi1jo@wqBc5(5Xl~d0KW(^Iu(U3>WB@-(&vn_PJt9{1`e9Iic@+{VPc`vP776L*viP{wYB2Iff8hB%E3|o zGMOu)tJX!`qJ}ZPzq7>=`*9TmETN7xwU;^AmFZ-ckZjV5B2T09pYliaqGFY|X#E-8 z20b>y?(r-Fn5*WZ-GsK}4WM>@TTqsxvSYWL6>18q8Q`~JO1{vLND2wg@58OaU!EvT z1|o+f1mVXz2EKAbL!Q=QWQKDZpV|jznuJ}@-)1&cdo z^&~b4Mx{*1gurlH;Vhk5g_cM&6LOHS2 zRkLfO#HabR1JD4Vc2t828dCUG#DL}f5QDSBg?o)IYYi@_xVwR2w_ntlpAW0NWk$F1 z$If?*lP&Ka1oWfl!)1c3fl`g*lMW3JOn#)R1+tfwrs`aiFUgz3;XIJ>{QFxLCkK30 zNS-)#DON3yb!7LBHQJ$)4y%TN82DC2-9tOIqzhZ27@WY^<6}vXCWcR5iN{LN8{0u9 zNXayqD=G|e?O^*ms*4P?G%o@J1tN9_76e}E#66mr89%W_&w4n66~R;X_vWD(oArwj z4CpY`)_mH2FvDuxgT+akffhX0b_slJJ*?Jn3O3~moqu2Fs1oL*>7m=oVek2bnprnW zixkaIFU%+3XhNA@@9hyhFwqsH2bM|`P?G>i<-gy>NflhrN{$9?LZ1ynSE_Mj0rADF zhOz4FnK}wpLmQuV zgO4_Oz9GBu_NN>cPLA=`SP^$gxAnj;WjJnBi%Q1zg`*^cG;Q)#3Gv@c^j6L{arv>- zAW%8WrSAVY1sj$=umcAf#ZgC8UGZGoamK}hR7j6}i8#np8ruUlvgQ$j+AQglFsQQq zOjyHf22pxh9+h#n$21&$h?2uq0>C9P?P=Juw0|;oE~c$H{#RGfa>| zj)Iv&uOnaf@foiBJ}_;zyPHcZt1U~nOcNB{)og8Btv+;f@PIT*xz$x!G?u0Di$lo7 zOugtQ$Wx|C($fyJTZE1JvR~i7LP{ zbdIwqYghQAJi9p}V&$=*2Azev$6K@pyblphgpv8^9bN!?V}{BkC!o#bl&AP!3DAjM zmWFsvn2fKWCfjcAQmE+=c3Y7j@#7|{;;0f~PIodmq*;W9Fiak|gil6$w3%b_Pr6K_ zJEG@&!J%DgBZJDCMn^7mk`JV0&l07Bt`1ymM|;a)MOWz*bh2#d{i?SDe9IcHs7 zjCrnyQ*Y5GzIt}>`bD91o#~5H?4_nckAgotN{2%!?wsSl|LVmJht$uhGa+HiH>;av z8c?mcMYM7;mvWr6noUR{)gE!=i7cZUY7e;HXa221KkRoc2UB>s$Y(k%NzTSEr>W(u z<(4mcc)4rB_&bPzX*1?*ra%VF}P1nwiP5cykJ&W{!OTlz&Td0pOkVp+wc z@k=-Hg=()hNg=Q!Ub%`BONH{ z_=ZFgetj@)NvppAK2>8r!KAgi>#%*7;O-o9MOOfQjV-n@BX6;Xw;I`%HBkk20v`qoVd0)}L6_49y1IhR z_OS}+eto}OPVRn*?UHC{eGyFU7JkPz!+gX4P>?h3QOwGS63fv4D1*no^6PveUeE5% zlehjv_3_^j^C({a2&RSoVlOn71D8WwMu9@Nb@=E_>1R*ve3`#TF(NA0?d9IR_tm=P zOP-x;gS*vtyE1Cm zG0L?2nRUFj#aLr-R1fX*$sXhad)~xdA*=hF3zPZhha<2O$Ps+F07w*3#MTe?)T8|A!P!v+a|ot{|^$q(TX`35O{WI0RbU zCj?hgOv=Z)xV?F`@HKI11IKtT^ocP78cqHU!YS@cHI@{fPD?YXL)?sD~9thOAv4JM|K8OlQhPXgnevF=F7GKD2#sZW*d za}ma31wLm81IZxX(W#A9mBvLZr|PoLnP>S4BhpK8{YV_}C|p<)4#yO{#ISbco92^3 zv&kCE(q9Wi;9%7>>PQ!zSkM%qqqLZW7O`VXvcj;WcJ`2~v?ZTYB@$Q&^CTfvy?1r^ z;Cdi+PTtmQwHX_7Kz?r#1>D zS5lWU(Mw_$B&`ZPmqxpIvK<~fbXq?x20k1~9az-Q!uR78mCgRj*eQ>zh3c$W}>^+w^dIr-u{@s30J=)1zF8?Wn|H`GS<=>Om|DjzC{}Jt?{!fSJe*@$H zg>wFnlT)k#T?LslW zu$^7Uy~$SQ21cE?3Ijl+bLfuH^U5P^$@~*UY#|_`uvAIe(+wD2eF}z_y!pvomuVO; zS^9fbdv)pcm-B@CW|Upm<7s|0+$@@<&*>$a{aW+oJ%f+VMO<#wa)7n|JL5egEgoBv zl$BY(NQjE0#*nv=!kMnp&{2Le#30b)Ql2e!VkPLK*+{jv77H7)xG7&=aPHL7LK9ER z5lfHxBI5O{-3S?GU4X6$yVk>lFn;ApnwZybdC-GAvaznGW-lScIls-P?Km2mF>%B2 zkcrXTk+__hj-3f48U%|jX9*|Ps41U_cd>2QW81Lz9}%`mTDIhE)jYI$q$ma7Y-`>% z8=u+Oftgcj%~TU}3nP8&h7k+}$D-CCgS~wtWvM|UU77r^pUw3YCV80Ou*+bH0!mf0 zxzUq4ed6y>oYFz7+l18PGGzhB^pqSt)si=9M>~0(Bx9*5r~W7sa#w+_1TSj3Jn9mW zMuG9BxN=}4645Cpa#SVKjFst;9UUY@O<|wpnZk$kE+to^4!?0@?Cwr3(>!NjYbu?x z1!U-?0_O?k!NdM^-rIQ8p)%?M+2xkhltt*|l=%z2WFJhme7*2xD~@zk#`dQR$6Lmd zb3LOD4fdt$Cq>?1<%&Y^wTWX=eHQ49Xl_lFUA(YQYHGHhd}@!VpYHHm=(1-O=yfK#kKe|2Xc*9}?BDFN zD7FJM-AjVi)T~OG)hpSWqH>vlb41V#^G2B_EvYlWhDB{Z;Q9-0)ja(O+By`31=biA zG&Fs#5!%_mHi|E4Nm$;vVQ!*>=_F;ZC=1DTPB#CICS5fL2T3XmzyHu?bI;m7D4@#; ztr~;dGYwb?m^VebuULtS4lkC_7>KCS)F@)0OdxZIFZp@FM_pHnJes8YOvwB|++#G( z&dm*OP^cz95Wi15vh`Q+yB>R{8zqEhz5of>Po$9LNE{xS<)lg2*roP*sQ}3r3t<}; zPbDl{lk{pox~2(XY5=qg0z!W-x^PJ`VVtz$git7?)!h>`91&&hESZy1KCJ2nS^yMH z!=Q$eTyRi68rKxdDsdt+%J_&lapa{ds^HV9Ngp^YDvtq&-Xp}60B_w@Ma>_1TTC;^ zpbe!#gH}#fFLkNo#|`jcn?5LeUYto%==XBk6Ik0kc4$6Z+L3x^4=M6OI1=z5u#M%0 z0E`kevJEpJjvvN>+g`?gtnbo$@p4VumliZV3Z%CfXXB&wPS^5C+7of2tyVkMwNWBiTE2 z8CdPu3i{*vR-I(NY5syRR}I1TJOV@DJy-Xmvxn^IInF>Tx2e)eE9jVSz69$6T`M9-&om!T+I znia!ZWJRB28o_srWlAxtz4VVft8)cYloIoVF=pL zugnk@vFLXQ_^7;%hn9x;Vq?lzg7%CQR^c#S)Oc-8d=q_!2ZVH764V z!wDKSgP}BrVV6SfCLZnYe-7f;igDs9t+K*rbMAKsp9L$Kh<6Z;e7;xxced zn=FGY<}CUz31a2G}$Q(`_r~75PzM4l_({Hg&b@d8&jC}B?2<+ed`f#qMEWi z`gm!STV9E4sLaQX+sp5Nu9*;9g12naf5?=P9p@H@f}dxYprH+3ju)uDFt^V{G0APn zS;16Dk{*fm6&BCg#2vo?7cbkkI4R`S9SSEJ=#KBk3rl69SxnCnS#{*$!^T9UUmO#&XXKjHKBqLdt^3yVvu8yn|{ zZ#%1CP)8t-PAz(+_g?xyq;C2<9<5Yy<~C74Iw(y>uUL$+$mp(DRcCWbCKiGCZw@?_ zdomfp+C5xt;j5L@VfhF*xvZdXwA5pcdsG>G<8II-|1dhAgzS&KArcb0BD4ZZ#WfiEY{hkCq5%z9@f|!EwTm;UEjKJsUo696V>h zy##eXYX}GUu%t{Gql8vVZKkNhQeQ4C%n|RmxL4ee5$cgwlU+?V7a?(jI#&3wid+Kz5+x^G!bb#$q>QpR#BZ}Xo5UW^ zD&I`;?(a}Oys7-`I^|AkN?{XLZNa{@27Dv^s4pGowuyhHuXc zuctKG2x0{WCvg_sGN^n9myJ}&FXyGmUQnW7fR$=bj$AHR88-q$D!*8MNB{YvTTEyS zn22f@WMdvg5~o_2wkjItJN@?mDZ9UUlat2zCh(zVE=dGi$rjXF7&}*sxac^%HFD`Y zTM5D3u5x**{bW!68DL1A!s&$2XG@ytB~dX-?BF9U@XZABO`a|LM1X3HWCllgl0+uL z04S*PX$%|^WAq%jkzp~%9HyYIF{Ym?k)j3nMwPZ=hlCg9!G+t>tf0o|J2%t1 ztC+`((dUplgm3`+0JN~}&FRRJ3?l*>Y&TfjS>!ShS`*MwO{WIbAZR#<%M|4c4^dY8 z{Rh;-!qhY=dz5JthbWoovLY~jNaw>%tS4gHVlt5epV8ekXm#==Po$)}mh^u*cE>q7*kvX&gq)(AHoItMYH6^s6f(deNw%}1=7O~bTHSj1rm2|Cq+3M z93djjdomWCTCYu!3Slx2bZVy#CWDozNedIHbqa|otsUl+ut?>a;}OqPfQA05Yim_2 zs@^BjPoFHOYNc6VbNaR5QZfSMh2S*`BGwcHMM(1@w{-4jVqE8Eu0Bi%d!E*^Rj?cR z7qgxkINXZR)K^=fh{pc0DCKtrydVbVILI>@Y0!Jm>x-xM!gu%dehm?cC6ok_msDVA*J#{75%4IZt}X|tIVPReZS#aCvuHkZxc zHVMtUhT(wp09+w9j9eRqz~LtuSNi2rQx_QgQ(}jBt7NqyT&ma61ldD(s9x%@q~PQl zp6N*?=N$BtvjQ_xIT{+vhb1>{pM0Arde0!X-y))A4znDrVx8yrP3B1(7bKPE5jR@5 zwpzwT4cu~_qUG#zYMZ_!2Tkl9zP>M%cy>9Y(@&VoB84#%>amTAH{(hL4cDYt!^{8L z645F>BWO6QaFJ-{C-i|-d%j7#&7)$X7pv#%9J6da#9FB5KyDhkA+~)G0^87!^}AP>XaCSScr;kL;Z%RSPD2CgoJ;gpYT5&6NUK$86$T?jRH=w8nI9Z534O?5fk{kd z`(-t$8W|#$3>xoMfXvV^-A(Q~$8SKDE^!T;J+rQXP71XZ(kCCbP%bAQ1|%$%Ov9_a zyC`QP3uPvFoBqr_+$HenHklqyIr>PU_Fk5$2C+0eYy^~7U&(!B&&P2%7#mBUhM!z> z_B$Ko?{Pf6?)gpYs~N*y%-3!1>o-4;@1Zz9VQHh)j5U1aL-Hyu@1d?X;jtDBNk*vMXPn@ z+u@wxHN*{uHR!*g*4Xo&w;5A+=Pf9w#PeZ^x@UD?iQ&${K2c}UQgLRik-rKM#Y5rdDphdcNTF~cCX&9ViRP}`>L)QA4zNXeG)KXFzSDa6 zd^St;inY6J_i=5mcGTx4_^Ys`M3l%Q==f>{8S1LEHn{y(kbxn5g1ezt4CELqy)~TV6{;VW>O9?5^ ztcoxHRa0jQY7>wwHWcxA-BCwzsP>63Kt&3fy*n#Cha687CQurXaRQnf5wc9o8v7Rw zNwGr2fac;Wr-Ldehn7tF^(-gPJwPt@VR1f;AmKgxN&YPL;j=0^xKM{!wuU|^mh3NE zy35quf}MeL!PU;|{OW_x$TBothLylT-J>_x6p}B_jW1L>k)ps6n%7Rh z96mPkJIM0QFNYUM2H}YF5bs%@Chs6#pEnloQhEl?J-)es!(SoJpEPoMTdgA14-#mC zghayD-DJWtUu`TD8?4mR)w5E`^EHbsz2EjH5aQLYRcF{l7_Q5?CEEvzDo(zjh|BKg z3aJl_n#j&eFHsUw4~lxqnr!6NL*se)6H=A+T1e3xUJGQrd}oSPwSy5+$tt{2t5J5@(lFxl43amsARG74iyNC}uuS zd2$=(r6RdamdGx^eatX@F2D8?U23tDpR+Os?0Gq2&^dF+$9wiWf?=mDWfjo4LfRwL zI#SRV9iSz>XCSgEj!cW&9H-njJopYiYuq|2w<5R2!nZ27DyvU4UDrHpoNQZiGPkp@ z1$h4H46Zn~eqdj$pWrv;*t!rTYTfZ1_bdkZmVVIRC21YeU$iS-*XMNK`#p8Z_DJx| zk3Jssf^XP7v0X?MWFO{rACltn$^~q(M9rMYoVxG$15N;nP)A98k^m3CJx8>6}NrUd@wp-E#$Q0uUDQT5GoiK_R{ z<{`g;8s>UFLpbga#DAf%qbfi`WN1J@6IA~R!YBT}qp%V-j!ybkR{uY0X|x)gmzE0J z&)=eHPjBxJvrZSOmt|)hC+kIMI;qgOnuL3mbNR0g^<%|>9x7>{}>a2qYSZAGPt4it?8 zNcLc!Gy0>$jaU?}ZWxK78hbhzE+etM`67*-*x4DN>1_&{@5t7_c*n(qz>&K{Y?10s zXsw2&nQev#SUSd|D8w7ZD2>E<%g^; zV{yE_O}gq?Q|zL|jdqB^zcx7vo(^})QW?QKacx$yR zhG|XH|8$vDZNIfuxr-sYFR{^csEI*IM#_gd;9*C+SysUFejP0{{z7@P?1+&_o6=7V|EJLQun^XEMS)w(=@eMi5&bbH*a0f;iC~2J74V2DZIlLUHD&>mlug5+v z6xBN~8-ovZylyH&gG#ptYsNlT?-tzOh%V#Y33zlsJ{AIju`CjIgf$@gr8}JugRq^c zAVQ3;&uGaVlVw}SUSWnTkH_6DISN&k2QLMBe9YU=sA+WiX@z)FoSYX`^k@B!j;ZeC zf&**P?HQG6Rk98hZ*ozn6iS-dG}V>jQhb3?4NJB*2F?6N7Nd;EOOo;xR7acylLaLy z9)^lykX39d@8@I~iEVar4jmjjLWhR0d=EB@%I;FZM$rykBNN~jf>#WbH4U{MqhhF6 zU??@fSO~4EbU4MaeQ_UXQcFyO*Rae|VAPLYMJEU`Q_Q_%s2*>$#S^)&7er+&`9L=1 z4q4ao07Z2Vsa%(nP!kJ590YmvrWg+YrgXYs_lv&B5EcoD`%uL79WyYA$0>>qi6ov7 z%`ia~J^_l{p39EY zv>>b}Qs8vxsu&WcXEt8B#FD%L%ZpcVtY!rqVTHe;$p9rbb5O{^rFMB>auLn-^;s+-&P1#h~mf~YLg$8M9 zZ4#87;e-Y6x6QO<{McUzhy(%*6| z)`D~A(TJ$>+0H+mct(jfgL4x%^oC^T#u(bL)`E2tBI#V1kSikAWmOOYrO~#-cc_8! zCe|@1&mN2{*ceeiBldHCdrURk4>V}79_*TVP3aCyV*5n@jiNbOm+~EQ_}1#->_tI@ zqXv+jj2#8xJtW508rzFrYcJxoek@iW6SR@1%a%Bux&;>25%`j3UI`0DaUr7l79`B1 zqqUARhW1^h6=)6?;@v>xrZNM;t}{yY3P@|L}ey@gG( z9r{}WoYN(9TW&dE2dEJIXkyHA4&pU6ki=rx&l2{DLGbVmg4%3Dlfvn!GB>EVaY_%3+Df{fBiqJV>~Xf8A0aqUjgpa} zoF8YXO&^_x*Ej}nw-$-F@(ddB>%RWoPUj?p8U{t0=n>gAI83y<9Ce@Q#3&(soJ{64 z37@Vij1}5fmzAuIUnXX`EYe;!H-yTVTmhAy;y8VZeB#vD{vw9~P#DiFiKQ|kWwGFZ z=jK;JX*A;Jr{#x?n8XUOLS;C%f|zj-7vXtlf_DtP7bpurBeX%Hjwr z4lI-2TdFpzkjgiv!8Vfv`=SP+s=^i3+N~1ELNWUbH|ytVu>EyPN_3(4TM^QE1swRo zoV7Y_g)a>28+hZG0e7g%@2^s>pzR4^fzR-El}ARTmtu!zjZLuX%>#OoU3}|rFjJg} zQ2TmaygxJ#sbHVyiA5KE+yH0LREWr%^C*yR|@gM$nK2P zo}M}PV0v))uJh&33N>#aU376@ZH79u(Yw`EQ2hM3SJs9f99+cO6_pNW$j$L-CtAfe zYfM)ccwD!P%LiBk!eCD?fHCGvgMQ%Q2oT_gmf?OY=A>&PaZQOq4eT=lwbaf}33LCH zFD|)lu{K7$8n9gX#w4~URjZxWm@wlH%oL#G|I~Fb-v^0L0TWu+`B+ZG!yII)w05DU z>GO?n(TN+B=>HdxVDSlIH76pta$_LhbBg;eZ`M7OGcqt||qi zogS72W1IN%=)5JCyOHWoFP7pOFK0L*OAh=i%&VW&4^LF@R;+K)t^S!96?}^+5QBIs zjJNTCh)?)4k^H^g1&jc>gysM`y^8Rm3qsvkr$9AeWwYpa$b22=yAd1t<*{ zaowSEFP+{y?Ob}8&cwfqoy4Pb9IA~VnM3u!trIK$&&0Op#Ql4j>(EW?UNUv#*iH1$ z^j>+W{afcd`{e&`-A{g}{JnIzYib)!T56IT@YEs{4|`sMpW3c8@UCoIJv`XsAw!XC z34|Il$LpW}CIHFC5e*)}00I5{%OL*WZRGzC0?_}-9{#ue?-ug^ zLE|uv-~6xnSs_2_&CN9{9vyc!Xgtn36_g^wI0C4s0s^;8+p?|mm;Odt3`2ZjwtK;l zfd6j)*Fr#53>C6Y8(N5?$H0ma;BCF3HCjUs7rpb2Kf*x3Xcj#O8mvs#&33i+McX zQpBxD8!O{5Y8D&0*QjD=Yhl9%M0)&_vk}bmN_Ud^BPN;H=U^bn&(csl-pkA+GyY0Z zKV7sU_4n;}uR78ouo8O%g*V;79KY?3d>k6%gpcmQsKk&@Vkw9yna_3asGt`0Hmj59 z%0yiF*`jXhByBI9QsD=+>big5{)BGe&+U2gAARGe3ID)xrid~QN_{I>k}@tzL!Md_ z&=7>TWciblF@EMC3t4-WX{?!m!G6$M$1S?NzF*2KHMP3Go4=#ZHkeIv{eEd;s-yD# z_jU^Ba06TZqvV|Yd;Z_sN%$X=!T+&?#p+OQIHS%!LO`Hx0q_Y0MyGYFNoM{W;&@0@ zLM^!X4KhdtsET5G<0+|q0oqVXMW~-7LW9Bg}=E$YtNh1#1D^6Mz(V9?2g~I1( zoz9Cz=8Hw98zVLwC2AQvp@pBeKyidn6Xu0-1SY1((^Hu*-!HxFUPs)yJ+i`^BC>PC zjwd0mygOVK#d2pRC9LxqGc6;Ui>f{YW9Bvb>33bp^NcnZoH~w9(lM5@JiIlfa-6|k ziy31UoMN%fvQfhi8^T+=yrP{QEyb-jK~>$A4SZT-N56NYEbpvO&yUme&pWKs3^94D zH{oXnUTb3T@H+RgzML*lejx`WAyw*?K7B-I(VJx($2!NXYm%3`=F~TbLv3H<{>D?A zJo-FDYdSA-(Y%;4KUP2SpHKAIcv9-ld(UEJE7=TKp|Gryn;72?0LHqAN^fk6%8PCW z{g_-t)G5uCIf0I`*F0ZNl)Z>))MaLMpXgqWgj-y;R+@A+AzDjsTqw2Mo9ULKA3c70 z!7SOkMtZb+MStH>9MnvNV0G;pwSW9HgP+`tg}e{ij0H6Zt5zJ7iw`hEnvye!XbA@!~#%vIkzowCOvq5I5@$3wtc*w2R$7!$*?}vg4;eDyJ_1=ixJuEp3pUS27W?qq(P^8$_lU!mRChT}ctvZz4p!X^ zOSp|JOAi~f?UkwH#9k{0smZ7-#=lK6X3OFEMl7%)WIcHb=#ZN$L=aD`#DZKOG4p4r zwlQ~XDZ`R-RbF&hZZhu3(67kggsM-F4Y_tI^PH8PMJRcs7NS9ogF+?bZB*fcpJ z=LTM4W=N9yepVvTj&Hu~0?*vR1HgtEvf8w%Q;U0^`2@e8{SwgX5d(cQ|1(!|i$km! zvY03MK}j`sff;*-%mN~ST>xU$6Bu?*Hm%l@0dk;j@%>}jsgDcQ)Hn*UfuThz9(ww_ zasV`rSrp_^bp-0sx>i35FzJwA!d6cZ5#5#nr@GcPEjNnFHIrtUYm1^Z$;{d&{hQV9 z6EfFHaIS}46p^5I-D_EcwwzUUuO}mqRh&T7r9sfw`)G^Q%oHxEs~+XoM?8e*{-&!7 z7$m$lg9t9KP9282eke608^Q2E%H-xm|oJ8=*SyEo} z@&;TQ3K)jgspgKHyGiKVMCz>xmC=H5Fy3!=TP)-R3|&1S-B)!6q50wfLHKM@7Bq6E z44CY%G;GY>tC`~yh!qv~YdXw! zSkquvYNs6k1r7>Eza?Vkkxo6XRS$W7EzL&A`o>=$HXgBp{L(i^$}t`NcnAxzbH8Ht z2!;`bhKIh`f1hIFcI5bHI=ueKdzmB9)!z$s-BT4ItyY|NaA_+o=jO%MU5as9 zc2)aLP>N%u>wlaXTK!p)r?+~)L+0eCGb5{8WIk7K52$nufnQ+m8YF+GQc&{^(zh-$ z#wyWV*Zh@d!b(WwXqvfhQX)^aoHTBkc;4ossV3&Ut*k>AI|m+{#kh4B!`3*<)EJVj zwrxK>99v^k4&Y&`Awm>|exo}NvewV%E+@vOc>5>%H#BK9uaE2$vje zWYM5fKuOTtn96B_2~~!xJPIcXF>E_;yO8AwpJ4)V`Hht#wbO3Ung~@c%%=FX4)q+9 z99#>VC2!4l`~0WHs9FI$Nz+abUq# zz`Of97})Su=^rGp2S$)7N3rQCj#0%2YO<R&p>$<#lgXcUj=4H_{oAYiT3 z44*xDn-$wEzRw7#@6aD)EGO$0{!C5Z^7#yl1o;k0PhN=aVUQu~eTQ^Xy{z8Ow6tk83 z4{5xe%(hx)%nD&|e*6sTWH`4W&U!Jae#U4TnICheJmsw{l|CH?UA{a6?2GNgpZLyzU2UlFu1ZVwlALmh_DOs03J^Cjh1im`E3?9&zvNmg(MuMw&0^Lu$(#CJ*q6DjlKsY-RMJ^8yIY|{SQZ*9~CH|u9L z`R78^r=EbbR*_>5?-)I+$6i}G)%mN(`!X72KaV(MNUP7Nv3MS9S|Pe!%N2AeOt5zG zVJ;jI4HZ$W->Ai_4X+`9c(~m=@ek*m`ZQbv3ryI-AD#AH=`x$~WeW~M{Js57(K7(v ze5`};LG|%C_tmd>bkufMWmAo&B+DT9ZV~h(4jg0>^aeAqL`PEUzJJtI8W1M!bQWpv zvN(d}E1@nlYa!L!!A*RN!(Q3F%J?5PvQ0udu?q-T)j3JKV~NL>KRb~w-lWc685uS6 z=S#aR&B8Sc8>cGJ!!--?kwsJTUUm`Jk?7`H z7PrO~xgBrSW2_tTlCq1LH8*!o?pj?qxy8}(=r_;G18POrFh#;buWR0qU24+XUaVZ0 z?(sXcr@-YqvkCmHr{U2oPogHL{r#3r49TeR<{SJX1pcUqyWPrkYz^X8#QW~?F)R5i z>p^!i<;qM8Nf{-fd6!_&V*e_9qP6q(s<--&1Ttj01j0w>bXY7y1W*%Auu&p|XSOH=)V7Bd4fUKh&T1)@cvqhuD-d=?w}O zjI%i(f|thk0Go*!d7D%0^ztBfE*V=(ZIN84f5HU}T9?ulmEYzT5usi=DeuI*d|;M~ zp_=Cx^!4k#=m_qSPBr5EK~E?3J{dWWPH&oCcNepYVqL?nh4D5ynfWip$m*YlZ8r^Z zuFEUL-nW!3qjRCLIWPT0x)FDL7>Yt7@8dA?R2kF@WE>ysMY+)lTsgNM#3VbXVGL}F z1O(>q>2a+_`6r5Xv$NZAnp=Kgnr3)cL(^=8ypEeOf3q8(HGe@7Tt59;yFl||w|mnO zHDxg2G3z8=(6wjj9kbcEY@Z0iOd7Gq5GiPS5% z*sF1J<#daxDV2Z8H>wxOF<;yKzMeTaSOp_|XkS9Sfn6Mpe9UBi1cSTieGG5$O;ZLIIJ60Y>SN4vC?=yE_CWlo(EEE$e4j?z&^FM%kNmRtlbEL^dPPgvs9sbK5fGw*r@ z+!EU@u$T8!nZh?Fdf_qk$VuHk^yVw`h`_#KoS*N%epIIOfQUy_&V}VWDGp3tplMbf z5Se1sJUC$7N0F1-9jdV2mmGK{-}fu|Nv;12jDy0<-kf^AmkDnu6j~TPWOgy1MT68|D z=4=50jVbUKdKaQgD`eWGr3I&^<6uhkjz$YwItY8%Yp9{z4-{6g{73<_b*@XJ4Nm3-3z z?BW3{aY_ccRjb@W1)i5nLg|7BnWS!B`_Uo9CWaE`Ij327QH?i)9A}4Ug4wmxVVa^b z-4+m%-wwOl7cKH7+=x&nrCrbEC)Q$fpg&V83#uEH;C=GNMz`ps@^RxK%T*8%OPnC` z{WO~J%nxYJ`x|N%?&i7?;{_8t^jM&=50HlaOQj8fS}_`moH$c;vI<|cruPFnpT8yU zS%rPOCUSd5Zdb(zwk`hqwTQn)*&n)uYsP*F_(~xEWq}C= zv30kFmZFwJZ@ELVX3?$dXQh|icO7UrL*_5G=I^xXjImz`ZPp>?g#tf(ej~KaIU0algsG!IS09;>?MvqGg#c{i+}qY|{P8W~O%#>|gFd z<1dr$-oxyRGN17yZo1OwLnzwYs0|;IS_nymNB0IlSzPQ%-r`?T=;_XQ^~&#}b|AB} zkNbN5uB?-sUB-T5QLlg%Uk3)uHB;>VIzGe9_J9 zaeISkQm!v(9d(0ML^b9fR^sfHFlH?7Mvddt37OuR{|O0{uv)(&-6<87W4 zyO>s!=cPgP3O&7xxU5DlIPw_o3O>6o6Qb?JWs3qw#p3sBc3g$?Dx zi(6D+DYgV;GrUis-CL%Qe{nvZnwaVXmbhH(|GFh|Q)k=1uvA$I@1DXI7bKlQ@8D6P zS?(*?><>)G49q0wr;NajpxP4W2G)kHl6^=Z>hrNEI4Mwd_$O6$1dXF;Q#hE(-eeW6 zz03GJF%Wl?HO=_ztv5*zRlcU~{+{k%#N59mgm~eK>P!QZ6E?#Cu^2)+K8m@ySvZ*5 z|HDT}BkF@3!l(0%75G=1u2hETXEj!^1Z$!)!lyGXlWD!_vqGE$Z)#cUVBqlORW>0^ zDjyVTxwKHKG|0}j-`;!R-p>}qQfBl(?($7pP<+Y8QE#M8SCDq~k<+>Q^Zf@cT_WdX3~BSe z+|KK|7OL5Hm5(NFP~j>Ct3*$wi0n0!xl=(C61`q&cec@mFlH(sy%+RH<=s)8aAPN`SfJdkAQjdv82G5iRdv8 zh{9wHUZaniSEpslXl^_ODh}mypC?b*9FzLjb~H@3DFSe;D(A-K3t3eOTB(m~I6C;(-lKAvit(70k`%@+O*Ztdz;}|_TS~B?Tpmi=QKC^m_ z2YpEaT3iiz*;T~ap1yiA)a`dKMwu`^UhIUeltNQ1Yjo=q@bI@&3zH?rVUg=IxLy-ni zyxDu%-Fr{H6owTjZU2O5>nDb=q&Jz_TjeSq%!2m40x&U6w~GQ({quPL73IsJS;f`$ zsuhioqCBj(gJ>2hoo)Gou7(WP*pX)f=Y=!=k!&1K?EYY%jJ~X&DnK{^saPQK<1BJ z_A`_{%ZozcB(3w$z^To^6d|XuT@=X~wtW!+{4ID@N{AB~J6AL5vuY>JwvWCNFKsKh zd}@>q@_WV#QZ&UJ0#?X(pXR!oyXOEG3rqzHbCzGLONDb042i$})fM@XF)uSP(DHUc z^&{|$*xe{cs?Gp8=B%RY3L7#$ve$?TWh>MZdxF1zH1v}1z+$Ov#G7?%D)bBCyDe*% zSeKSpETC2V1){II>@UwJi>4uBN+iAx+82E~gb|Cr&8E^i&)A!uv-g?jzH99wU}8+# z$nh>yvb;TwZmS@7LrvuCu_d0-WxFNI&C7%sWuTL%YU!l|I1{|->=dlOeHOCtUO#zkS3ESO8LHV4hTdQL5EdV zuWD33fFPH}HPrW^s$Qn1Xgp&AT6<-He{{4%eIu3rN=iK|9mURdKXfB&Q?qGok%!cs ze53UP{Z!TO-Y@q2;;k2avA3`lm4OoN4@S*k=UA)7H;qZ`d8`XaYFCv?Ba+uGW@r5v z&&{nf(24WSBOhc7!qF^@0cz;XcUynNaj6w2349;s!K{KVqs5yS{ z7VubS`2OzT^5#1~6Tt^RTvt9-J|D2F>y~>2;jeF>g`hx5l%B3H=aLExQihuYngzlnBTYOTHJQMzl>kwqN5JYs)Ej zblA@ntkUS~xi+}y6|(81helS}Q~&VB37qyV|S3Y=><^1wh%msQM?fz z<58MX(=|PSUKCF#)dbhR%D&xgCD?$aR0qen+wpp6 zst}vX18!Be96TD??j1HsHTUx(a&@F?=gT`Q$oJFFyrh^;zgz!(NlAHGn0cJy@us=w zNhC#l5G;H}+>49Nsh12=ZPO2r*2OBQe5kpb&1?*PIBFitK8}FUfb~S-#hKfF0o#&d z#3aPkB$9scYku&kA6{0xHnBV#&Wei5J>5T-XX-gUXEPo+9b7WL=*XESc(3BshL`aj zXp}QIp*40}oWJt*l043e8_5;H5PI5c)U&IEw5dF(4zjX0y_lk9 zAp@!mK>WUqHo)-jop=DoK>&no>kAD=^qIE7qis&_*4~ z6q^EF$D@R~3_xseCG>Ikb6Gfofb$g|75PPyyZN&tiRxqovo_k zO|HA|sgy#B<32gyU9x^&)H$1jvw@qp+1b(eGAb)O%O!&pyX@^nQd^9BQ4{(F8<}|A zhF&)xusQhtoXOOhic=8#Xtt5&slLia3c*a?dIeczyTbC#>FTfiLST57nc3@Y#v_Eg#VUv zT8cKH#f3=1PNj!Oroz_MAR*pow%Y0*6YCYmUy^7`^r|j23Q~^*TW#cU7CHf0eAD_0 zEWEVddxFgQ7=!nEBQ|ibaScslvhuUk^*%b#QUNrEB{3PG@uTxNwW}Bs4$nS9wc(~O zG7Iq>aMsYkcr!9#A;HNsJrwTDYkK8ikdj{M;N$sN6BqJ<8~z>T20{J8Z2rRUuH7~3 z=tgS`AgxbBOMg87UT4Lwge`*Y=01Dvk>)^{Iu+n6fuVX4%}>?3czOGR$0 zpp*wp>bsFFSV`V;r_m+TZns$ZprIi`OUMhe^cLE$2O+pP3nP!YB$ry}2THx2QJs3< za1;>d-AggCarrQ>&Z!d@;mW+!q6eXhb&`GbzUDSxpl8AJ#Cm#tuc)_xh(2NV=5XMs zrf_ozRYO$NkC=pKFX5OH8v1>0i9Z$ec`~Mf+_jQ68spn(CJwclDhEEkH2Qw;${J$clv__nUjn5jA0wCLEnu1j;v!0vB>Ri6m9`;R{JMS%^)4FC zU0Z44+u$I$w=Bj|iu4DT5h~sS`C*zbmX?@-crY}E+hy>}2~C0Nn(EKk@5^qO4@l@! z6O0lr%tzGC`D^)8xU3FnMZVm0kX1sBWhaQyzVoXFWwr%Ny?=2M{5s#5i7fTu3gEkG zc{(Pr$v=;`Y#&`y*J}#M9ux>0?xu!`$9cUKm#Bdd_&S#LPTS?ZPV6zN6>W6JTS~-LfjL{mB=b(KMk3 z2HjBSlJeyUVqDd=Mt!=hpYsvby2GL&3~zm;0{^nZJq+4vb?5HH4wufvr}IX42sHeK zm@x?HN$8TsTavXs)tLDFJtY9b)y~Tl@7z4^I8oUQq4JckH@~CVQ;FoK(+e0XAM>1O z(ei}h?)JQp>)d=6ng-BZF1Z5hsAKW@mXq+hU?r8I(*%`tnIIOXw7V6ZK(T9RFJJe@ zZS!aC+p)Gf2Ujc=a6hx4!A1Th%YH!Lb^xpI!Eu` zmJO{9rw){B1Ql18d%F%da+Tbu1()?o(zT7StYqK6_w`e+fjXq5L^y(0 z09QA6H4oFj59c2wR~{~>jUoDzDdKz}5#onYPJRwa`SUO)Pd4)?(ENBaFVLJr6Kvz= zhTtXqbx09C1z~~iZt;g^9_2nCZ{};-b4dQJbv8HsWHXPVg^@(*!@xycp#R?a|L!+` zY5w))JWV`Gls(=}shH0#r*;~>_+-P5Qc978+QUd>J%`fyn{*TsiG-dWMiJXNgwBaT zJ=wgYFt+1ACW)XwtNx)Q9tA2LPoB&DkL16P)ERWQlY4%Y`-5aM9mZ{eKPUgI!~J3Z zkMd5A_p&v?V-o-6TUa8BndiX?ooviev(DKw=*bBVOW|=zps9=Yl|-R5@yJe*BPzN}a0mUsLn{4LfjB_oxpv(mwq# zSY*%E{iB)sNvWfzg-B!R!|+x(Q|b@>{-~cFvdDHA{F2sFGA5QGiIWy#3?P2JIpPKg6ncI^)dvqe`_|N=8 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH="\\\"\\\"" + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..db3a6ac --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH= + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/licenses/GPL.md b/licenses/GPL.md new file mode 100644 index 0000000..2fb2e74 --- /dev/null +++ b/licenses/GPL.md @@ -0,0 +1,675 @@ +### GNU GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +### Preamble + +The GNU General Public License is a free, copyleft license for +software and other kinds of works. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom +to share and change all versions of a program--to make sure it remains +free software for all its users. We, the Free Software Foundation, use +the GNU General Public License for most of our software; it applies +also to any other work released this way by its authors. You can apply +it to your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you +have certain responsibilities if you distribute copies of the +software, or if you modify it: responsibilities to respect the freedom +of others. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the +manufacturer can do so. This is fundamentally incompatible with the +aim of protecting users' freedom to change the software. The +systematic pattern of such abuse occurs in the area of products for +individuals to use, which is precisely where it is most unacceptable. +Therefore, we have designed this version of the GPL to prohibit the +practice for those products. If such problems arise substantially in +other domains, we stand ready to extend this provision to those +domains in future versions of the GPL, as needed to protect the +freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish +to avoid the special danger that patents applied to a free program +could make it effectively proprietary. To prevent this, the GPL +assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + +### TERMS AND CONDITIONS + +#### 0. Definitions. + +"This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds +of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of +an exact copy. The resulting work is called a "modified version" of +the earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user +through a computer network, with no transfer of a copy, is not +conveying. + +An interactive user interface displays "Appropriate Legal Notices" to +the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +#### 1. Source Code. + +The "source code" for a work means the preferred form of the work for +making modifications to it. "Object code" means any non-source form of +a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can +regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same +work. + +#### 2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, +without conditions so long as your license otherwise remains in force. +You may convey covered works to others for the sole purpose of having +them make modifications exclusively for you, or provide you with +facilities for running those works, provided that you comply with the +terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for +you must do so exclusively on your behalf, under your direction and +control, on terms that prohibit them from making any copies of your +copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 makes +it unnecessary. + +#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such +circumvention is effected by exercising rights under this License with +respect to the covered work, and you disclaim any intention to limit +operation or modification of the work as a means of enforcing, against +the work's users, your or third parties' legal rights to forbid +circumvention of technological measures. + +#### 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +#### 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these +conditions: + +- a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. +- b) The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in section 4 + to "keep intact all notices". +- c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. +- d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +#### 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of +sections 4 and 5, provided that you also convey the machine-readable +Corresponding Source under the terms of this License, in one of these +ways: + +- a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. +- b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding + Source from a network server at no charge. +- c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. +- d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. +- e) Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the general + public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, +family, or household purposes, or (2) anything designed or sold for +incorporation into a dwelling. In determining whether a product is a +consumer product, doubtful cases shall be resolved in favor of +coverage. For a particular product received by a particular user, +"normally used" refers to a typical or common use of that class of +product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected +to use, the product. A product is a consumer product regardless of +whether the product has substantial commercial, industrial or +non-consumer uses, unless such uses represent the only significant +mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to +install and execute modified versions of a covered work in that User +Product from a modified version of its Corresponding Source. The +information must suffice to ensure that the continued functioning of +the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or +updates for a work that has been modified or installed by the +recipient, or for the User Product in which it has been modified or +installed. Access to a network may be denied when the modification +itself materially and adversely affects the operation of the network +or violates the rules and protocols for communication across the +network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +#### 7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders +of that material) supplement the terms of this License with terms: + +- a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or +- b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or +- c) Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or +- d) Limiting the use for publicity purposes of names of licensors + or authors of the material; or +- e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or +- f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions + of it) with contractual assumptions of liability to the recipient, + for any liability that these contractual assumptions directly + impose on those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; the +above requirements apply either way. + +#### 8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +#### 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run +a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +#### 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +#### 11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned +or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on +the non-exercise of one or more of the rights that are specifically +granted under this License. You may not convey a covered work if you +are a party to an arrangement with a third party that is in the +business of distributing software, under which you make payment to the +third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties +who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by +you (or copies made from those copies), or (b) primarily for and in +connection with specific products or compilations that contain the +covered work, unless you entered into that arrangement, or that patent +license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +#### 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under +this License and any other pertinent obligations, then as a +consequence you may not convey it at all. For example, if you agree to +terms that obligate you to collect a royalty for further conveying +from those to whom you convey the Program, the only way you could +satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +#### 13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + +#### 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies that a certain numbered version of the GNU General Public +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that numbered version or +of any later version published by the Free Software Foundation. If the +Program does not specify a version number of the GNU General Public +License, you may choose any version ever published by the Free +Software Foundation. + +If the Program specifies that a proxy can decide which future versions +of the GNU General Public License can be used, that proxy's public +statement of acceptance of a version permanently authorizes you to +choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +#### 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +#### 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM +TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +#### 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + +### How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively state +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper +mail. + +If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands \`show w' and \`show c' should show the +appropriate parts of the General Public License. Of course, your +program's commands might be different; for a GUI interface, you would +use an "about box". + +You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU GPL, see . + +The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Lesser General Public License instead of this License. But first, +please read . diff --git a/licenses/MIT.md b/licenses/MIT.md new file mode 100644 index 0000000..6c40a95 --- /dev/null +++ b/licenses/MIT.md @@ -0,0 +1,23 @@ +The MIT License (MIT) +===================== + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the “Software”), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/lophine-api/build.gradle.kts.patch b/lophine-api/build.gradle.kts.patch new file mode 100644 index 0000000..50f4fd3 --- /dev/null +++ b/lophine-api/build.gradle.kts.patch @@ -0,0 +1,27 @@ +--- a/luminol-api/build.gradle.kts ++++ b/luminol-api/build.gradle.kts +@@ -103,20 +_,24 @@ + srcDir(generatedDir) + srcDir(file("../paper-api/src/main/java")) + srcDir(file("../folia-api/src/main/java")) ++ srcDir(file("../luminol-api/src/main/java")) + } + resources { + srcDir(file("../paper-api/src/main/resources")) + srcDir(file("../folia-api/src/main/resources")) ++ srcDir(file("../luminol-api/src/main/resources")) + } + } + test { + java { + srcDir(file("../paper-api/src/test/java")) + srcDir(file("../folia-api/src/test/java")) ++ srcDir(file("../luminol-api/src/test/java")) + } + resources { + srcDir(file("../paper-api/src/test/resources")) + srcDir(file("../folia-api/src/test/resources")) ++ srcDir(file("../luminol-api/src/test/resources")) + } + } + } diff --git a/lophine-server/build.gradle.kts.patch b/lophine-server/build.gradle.kts.patch new file mode 100644 index 0000000..8648ddd --- /dev/null +++ b/lophine-server/build.gradle.kts.patch @@ -0,0 +1,72 @@ +--- a/luminol-server/build.gradle.kts ++++ b/luminol-server/build.gradle.kts +@@ -54,7 +_,23 @@ + } + } + +- activeFork = luminol ++ val lophine = forks.register("lophine") { ++ forks = luminol ++ upstream.patchRepo("paperServer") { ++ upstreamRepo = luminol.patchedRepo("paperServer") ++ patchesDir = rootDirectory.dir("lophine-server/paper-patches") ++ outputDir = rootDirectory.dir("paper-server") ++ } ++ ++ upstream.patchDir("luminolServer") { ++ upstreamPath = "luminol-server" ++ excludes = setOf("src/minecraft", "paper-patches", "minecraft-patches", "build.gradle.kts", "build.gradle.kts.patch") ++ patchesDir = rootDirectory.dir("lophine-server/luminol-patches") ++ outputDir = rootDirectory.dir("luminol-server") ++ } ++ } ++ ++ activeFork = lophine + + spigot { + buildDataRef = "702e1a0a5072b2c4082371d5228cb30525687efc" +@@ -142,12 +_,16 @@ + resources { srcDir("../paper-server/src/main/resources") } + java { srcDir("../folia-server/src/main/java") } + resources { srcDir("../folia-server/src/main/resources") } ++ java { srcDir("../luminol-server/src/main/java") } ++ resources { srcDir("../luminol-server/src/main/resources") } + } + test { + java { srcDir("../paper-server/src/test/java") } + resources { srcDir("../paper-server/src/test/resources") } + java { srcDir("../folia-server/src/test/java") } + resources { srcDir("../folia-server/src/test/resources") } ++ java { srcDir("../luminol-server/src/main/java") } ++ resources { srcDir("../luminol-server/src/main/resources") } + } + } + val log4jPlugins = sourceSets.create("log4jPlugins") { +@@ -174,7 +_,7 @@ + } + + dependencies { +- implementation(project(":luminol-api")) // Luminol ++ implementation(project(":lophine-api")) // Luminol // Lophine + implementation("com.electronwill.night-config:toml:3.8.2") // Luminol - Night config + // Abomination start + implementation("com.github.luben:zstd-jni:1.5.4-1") +@@ -264,14 +_,14 @@ + val gitBranch = git.exec(providers, "rev-parse", "--abbrev-ref", "HEAD").get().trim() + attributes( + "Main-Class" to "org.bukkit.craftbukkit.Main", +- "Implementation-Title" to "Luminol", ++ "Implementation-Title" to "Lophine", + "Implementation-Version" to implementationVersion, + "Implementation-Vendor" to date, +- "Specification-Title" to "Luminol", ++ "Specification-Title" to "Lophine", + "Specification-Version" to project.version, + "Specification-Vendor" to "Luminol Team", +- "Brand-Id" to "luminolmc:luminol", +- "Brand-Name" to "Luminol", ++ "Brand-Id" to "luminolmc:lophine", ++ "Brand-Name" to "Lophine", + "Build-Number" to (build ?: ""), + "Build-Time" to buildTime.toString(), + "Git-Branch" to gitBranch, diff --git a/lophine-server/src/build.gradle.kts.patch b/lophine-server/src/build.gradle.kts.patch new file mode 100644 index 0000000..3c0f676 --- /dev/null +++ b/lophine-server/src/build.gradle.kts.patch @@ -0,0 +1,72 @@ +--- a/luminol-server/build.gradle.kts ++++ b/luminol-server/build.gradle.kts +@@ -54,7 +_,23 @@ + } + } + +- activeFork = luminol ++ val lophine = forks.register("lophine") { ++ forks = luminol ++ upstream.patchRepo("paperServer") { ++ upstreamRepo = luminol.patchedRepo("paperServer") ++ patchesDir = rootDirectory.dir("lophine-server/paper-patches") ++ outputDir = rootDirectory.dir("paper-server") ++ } ++ ++ upstream.patchDir("luminolServer") { ++ upstreamPath = "luminol-server" ++ excludes = setOf("src/minecraft", "paper-patches", "minecraft-patches", "build.gradle.kts", "build.gradle.kts.patch") ++ patchesDir = rootDirectory.dir("lophine-server/luminol-patches") ++ outputDir = rootDirectory.dir("luminol-server") ++ } ++ } ++ ++ activeFork = lophine + + spigot { + buildDataRef = "702e1a0a5072b2c4082371d5228cb30525687efc" +@@ -142,12 +_,16 @@ + resources { srcDir("../paper-server/src/main/resources") } + java { srcDir("../folia-server/src/main/java") } + resources { srcDir("../folia-server/src/main/resources") } ++ java { srcDir("../luminol-server/src/main/java") } ++ resources { srcDir("../luminol-server/src/main/resources") } + } + test { + java { srcDir("../paper-server/src/test/java") } + resources { srcDir("../paper-server/src/test/resources") } + java { srcDir("../folia-server/src/test/java") } + resources { srcDir("../folia-server/src/test/resources") } ++ java { srcDir("../luminol-server/src/main/java") } ++ resources { srcDir("../luminol-server/src/main/resources") } + } + } + val log4jPlugins = sourceSets.create("log4jPlugins") { +@@ -174,7 +_,7 @@ + } + + dependencies { +- implementation(project(":luminol-api")) // Luminol ++ implementation(project(":lophine-api")) // Lophine + implementation("com.electronwill.night-config:toml:3.8.2") // Luminol - Night config + // Abomination start + implementation("com.github.luben:zstd-jni:1.5.4-1") +@@ -264,14 +_,14 @@ + val gitBranch = git.exec(providers, "rev-parse", "--abbrev-ref", "HEAD").get().trim() + attributes( + "Main-Class" to "org.bukkit.craftbukkit.Main", +- "Implementation-Title" to "Luminol", ++ "Implementation-Title" to "Lophine", + "Implementation-Version" to implementationVersion, + "Implementation-Vendor" to date, +- "Specification-Title" to "Luminol", ++ "Specification-Title" to "Lophine", + "Specification-Version" to project.version, + "Specification-Vendor" to "Luminol Team", +- "Brand-Id" to "luminolmc:luminol", +- "Brand-Name" to "Luminol", ++ "Brand-Id" to "luminolmc:lophine", ++ "Brand-Name" to "Lophine", + "Build-Number" to (build ?: ""), + "Build-Time" to buildTime.toString(), + "Git-Branch" to gitBranch, diff --git a/public/image/legacy-lands-logo.png b/public/image/legacy-lands-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..76f9d7c914cb1c673ec74cf9bf6e2aa309370c78 GIT binary patch literal 83468 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%0DMo{dJ})T>Q4L%NF0qru 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 literal 0 HcmV?d00001 diff --git a/scripts/SetENV.sh b/scripts/SetENV.sh new file mode 100644 index 0000000..07b9a75 --- /dev/null +++ b/scripts/SetENV.sh @@ -0,0 +1,28 @@ +prop() { + grep "^[[:space:]]*${1}" gradle.properties | cut -d'=' -f2 | sed 's/^[[:space:]]*//; s/\r//' +} + +project_id="Lophine" +project_id_b="Lophine" + +commitid=$(git log --pretty='%h' -1) +mcversion=$(prop mcVersion) +grdversion=$(prop version) +preVersion=$(prop preVersion) +release_tag="$mcversion-$commitid" +jarName="$project_id-$mcversion-paperclip.jar" +jarName_dir="lophine-server/build/libs/$jarName" +make_latest=$([ $preVersion = "true" ] && echo "false" || echo "true") + +mv lophine-server/build/libs/$project_id-paperclip-$grdversion-mojmap.jar $jarName_dir + +echo "project_id=$project_id" >> $GITHUB_ENV +echo "project_id_b=$project_id_b" >> $GITHUB_ENV +echo "commit_id=$commitid" >> $GITHUB_ENV +echo "commit_msg=$(git log --pretty='> [%h] %s' -1)" >> $GITHUB_ENV +echo "mcversion=$mcversion" >> $GITHUB_ENV +echo "pre=$preVersion" >> $GITHUB_ENV +echo "tag=$release_tag" >> $GITHUB_ENV +echo "jar=$jarName" >> $GITHUB_ENV +echo "jar_dir=$jarName_dir" >> $GITHUB_ENV +echo "make_latest=$make_latest" >> $GITHUB_ENV diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..fabe33d --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,16 @@ +pluginManagement { + repositories { + gradlePluginPortal() + mavenLocal() + maven("https://repo.papermc.io/repository/maven-public/") + } +} + +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "0.9.0" +} + +rootProject.name = "lophine" + +include("lophine-api") +include("lophine-server")