From 70131e856d609c6b82bcf6b1a1ce861f9a73b001 Mon Sep 17 00:00:00 2001 From: Arthur Blanchot Date: Thu, 21 Jul 2022 19:36:05 +0200 Subject: [PATCH] Add Petal patches + refactor configuration --- gradle.properties | 4 +- gradle/wrapper/gradle-wrapper.jar | Bin 59821 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 6 + gradlew.bat | 14 +- patches/api/0001-Mirai-Configuration.patch | 4 +- patches/api/0003-Add-last-tick-time-API.patch | 8 +- .../api/0004-Optimize-Spigot-event-bus.patch | 4 +- .../api/0005-Skip-event-if-no-listeners.patch | 6 +- .../api/0007-Suspected-plugins-report.patch | 8 +- .../server/0001-Mirai-Branding-Changes.patch | 8 +- patches/server/0002-Mirai-Configuration.patch | 2683 ++++++++--------- .../0004-Reduce-constants-allocations.patch | 60 +- .../server/0009-Add-last-tick-time-API.patch | 6 +- ...dd-config-for-logging-login-location.patch | 16 +- .../0013-Configurable-max-bees-in-hive.patch | 12 +- .../0019-Better-handling-of-async-tasks.patch | 4 +- ...nc-chunk-writes-in-server.properties.patch | 4 +- .../0022-Remove-Spigot-tick-limiter.patch | 19 +- .../0023-Configurable-flight-checks.patch | 20 +- ...ptimise-player-list-ticksSpread-out-.patch | 4 +- .../0034-Disable-outdated-build-check.patch | 21 - ...er-showing-in-ping-before-server-fu.patch} | 0 ...35-Dont-send-useless-entity-packets.patch} | 19 +- ...Skip-events-if-there-s-no-listeners.patch} | 0 ...037-Fix-the-dead-lagging-the-server.patch} | 4 +- ...0038-Alternative-Keepalive-Handling.patch} | 16 +- ...settings-suppressing-pointless-logs.patch} | 69 +- ...040-Add-5-second-tps-average-in-tps.patch} | 6 +- ....patch => 0041-Fix-stuck-in-portals.patch} | 18 +- ...ities-can-use-portals-configuration.patch} | 17 +- ...onverter-for-itemstack-entity-deser.patch} | 0 ...I-goal-set-with-optimized-collectio.patch} | 0 ...kip-entity-move-if-movement-is-zero.patch} | 8 +- ...ent-updates-if-only-durability-chan.patch} | 0 ...ackets-if-player-has-Fire-Resistanc.patch} | 4 +- ...48-Packet-obfuscation-and-reduction.patch} | 12 +- ...tch => 0049-lithium-cached-hashcode.patch} | 0 ...-in-CraftPersistentDataTypeRegistry.patch} | 0 ...store-gamerules-in-fastutil-hashmap.patch} | 0 ...-carpetfixes-BiomeAccess-prediction.patch} | 0 ...chantment-table-book-animation-tick.patch} | 12 +- ...> 0054-Skip-cloning-loot-parameters.patch} | 0 ...055-lithium-precompute-shape-arrays.patch} | 0 ...tch => 0056-vmp-ingredient_matching.patch} | 0 ...-121706.patch => 0057-Fix-MC-121706.patch} | 0 ....patch => 0058-vmp-entity.iteration.patch} | 0 ...patch => 0059-vmp-spawn_density_cap.patch} | 0 ...60-lithium-entity.fast_elytra_check.patch} | 0 .../0061-Configurable-server-metrics.patch | 34 - ...iler.patch => 0061-lithium-profiler.patch} | 2 +- ...0062-lithium-entity.fast_hand_swing.patch} | 0 ...s-math.patch => 0063-c2me-opts-math.patch} | 0 ...thium-entity.fast_powder_snow_check.patch} | 0 ...0065-lithium-collections.attributes.patch} | 0 ...-lithium-collections.entity_by_type.patch} | 0 ...ithium-collections.entity_filtering.patch} | 0 ...=> 0068-lithium-chunk.serialization.patch} | 6 +- ...069-Configurable-criterion-triggers.patch} | 21 +- ...70-Set-item-stuck-sleep-to-15-ticks.patch} | 0 ... => 0071-Smarter-statistics-ticking.patch} | 0 ..._entity_tracking-and-ai.nearby_enti.patch} | 4 +- ...atch => 0073-some-entity-micro-opts.patch} | 6 +- ...nt-eat-blocks-in-non-ticking-chunks.patch} | 2 +- ...heck.patch => 0075-Fast-speed-check.patch} | 18 +- ...0076-lithium-cache-iterate-outwards.patch} | 0 ....raid.patch => 0077-lithium-ai.raid.patch} | 0 ...8-lithium-block.moving_block_shapes.patch} | 0 ...079-lithium-shapes.blockstate_cache.patch} | 0 ...thium-gen.patch => 0080-lithium-gen.patch} | 2 +- ...e-look-changes-from-crashing-the-se.patch} | 0 ...-more-collision-code-skipping-logic.patch} | 0 ...p-for-entity-trackers-for-faster-it.patch} | 2 +- ...cs.patch => 0084-c2me-reduce_allocs.patch} | 0 ...085-lithium-ai.sensor.secondary_poi.patch} | 0 ...ck-function-tag-running-before-load.patch} | 0 ...n.patch => 0087-lithium-suffocation.patch} | 4 +- ...Optimize-default-values-for-configs.patch} | 52 +- ...89-Configurable-map-update-interval.patch} | 12 +- ...er-saturation-depleting-on-peaceful.patch} | 0 ... 0091-Fix-mobs-attacking-themselves.patch} | 0 ...s-resetting-their-brewTime-when-bei.patch} | 0 ...> 0093-lithium-world.tick_scheduler.patch} | 0 ... 0094-Save-Json-list-asynchronously.patch} | 0 ...ps-the-predicate-order-of-collision.patch} | 4 +- ... 0096-Fix-head-rotation-packet-spam.patch} | 4 +- ...-Cache-block-break-animation-packet.patch} | 2 +- ...8-Use-more-fastutil-data-structures.patch} | 0 ...Math.round-and-Math.hypot-functions.patch} | 174 +- ...0100-Faster-Sheep.getOffspringColor.patch} | 0 ...ement-Velocity-VarInt-optimizations.patch} | 0 ...educe-work-done-by-game-event-system.patch | 135 + patches/server/0103-reduce-sensor-work.patch | 49 + 93 files changed, 1907 insertions(+), 1724 deletions(-) delete mode 100644 patches/server/0034-Disable-outdated-build-check.patch rename patches/server/{0035-Fix-outdated-server-showing-in-ping-before-server-fu.patch => 0034-Fix-outdated-server-showing-in-ping-before-server-fu.patch} (100%) rename patches/server/{0036-Dont-send-useless-entity-packets.patch => 0035-Dont-send-useless-entity-packets.patch} (79%) rename patches/server/{0037-Skip-events-if-there-s-no-listeners.patch => 0036-Skip-events-if-there-s-no-listeners.patch} (100%) rename patches/server/{0038-Fix-the-dead-lagging-the-server.patch => 0037-Fix-the-dead-lagging-the-server.patch} (91%) rename patches/server/{0039-Alternative-Keepalive-Handling.patch => 0038-Alternative-Keepalive-Handling.patch} (84%) rename patches/server/{0040-Logger-settings-suppressing-pointless-logs.patch => 0039-Logger-settings-suppressing-pointless-logs.patch} (60%) rename patches/server/{0041-Add-5-second-tps-average-in-tps.patch => 0040-Add-5-second-tps-average-in-tps.patch} (96%) rename patches/server/{0042-Fix-stuck-in-portals.patch => 0041-Fix-stuck-in-portals.patch} (76%) rename patches/server/{0043-Entities-can-use-portals-configuration.patch => 0042-Entities-can-use-portals-configuration.patch} (76%) rename patches/server/{0044-PaperPR-Use-DataConverter-for-itemstack-entity-deser.patch => 0043-PaperPR-Use-DataConverter-for-itemstack-entity-deser.patch} (100%) rename patches/server/{0045-lithium-replace-AI-goal-set-with-optimized-collectio.patch => 0044-lithium-replace-AI-goal-set-with-optimized-collectio.patch} (100%) rename patches/server/{0046-vmp-skip-entity-move-if-movement-is-zero.patch => 0045-vmp-skip-entity-move-if-movement-is-zero.patch} (86%) rename patches/server/{0047-Don-t-send-equipment-updates-if-only-durability-chan.patch => 0046-Don-t-send-equipment-updates-if-only-durability-chan.patch} (100%) rename patches/server/{0048-Don-t-send-fire-packets-if-player-has-Fire-Resistanc.patch => 0047-Don-t-send-fire-packets-if-player-has-Fire-Resistanc.patch} (88%) rename patches/server/{0049-Packet-obfuscation-and-reduction.patch => 0048-Packet-obfuscation-and-reduction.patch} (94%) rename patches/server/{0050-lithium-cached-hashcode.patch => 0049-lithium-cached-hashcode.patch} (100%) rename patches/server/{0051-PaperPR-Fix-CME-in-CraftPersistentDataTypeRegistry.patch => 0050-PaperPR-Fix-CME-in-CraftPersistentDataTypeRegistry.patch} (100%) rename patches/server/{0052-lithium-store-gamerules-in-fastutil-hashmap.patch => 0051-lithium-store-gamerules-in-fastutil-hashmap.patch} (100%) rename patches/server/{0053-carpetfixes-BiomeAccess-prediction.patch => 0052-carpetfixes-BiomeAccess-prediction.patch} (100%) rename patches/server/{0054-Configurable-enchantment-table-book-animation-tick.patch => 0053-Configurable-enchantment-table-book-animation-tick.patch} (75%) rename patches/server/{0055-Skip-cloning-loot-parameters.patch => 0054-Skip-cloning-loot-parameters.patch} (100%) rename patches/server/{0056-lithium-precompute-shape-arrays.patch => 0055-lithium-precompute-shape-arrays.patch} (100%) rename patches/server/{0057-vmp-ingredient_matching.patch => 0056-vmp-ingredient_matching.patch} (100%) rename patches/server/{0058-Fix-MC-121706.patch => 0057-Fix-MC-121706.patch} (100%) rename patches/server/{0059-vmp-entity.iteration.patch => 0058-vmp-entity.iteration.patch} (100%) rename patches/server/{0060-vmp-spawn_density_cap.patch => 0059-vmp-spawn_density_cap.patch} (100%) rename patches/server/{0062-lithium-entity.fast_elytra_check.patch => 0060-lithium-entity.fast_elytra_check.patch} (100%) delete mode 100644 patches/server/0061-Configurable-server-metrics.patch rename patches/server/{0063-lithium-profiler.patch => 0061-lithium-profiler.patch} (92%) rename patches/server/{0064-lithium-entity.fast_hand_swing.patch => 0062-lithium-entity.fast_hand_swing.patch} (100%) rename patches/server/{0065-c2me-opts-math.patch => 0063-c2me-opts-math.patch} (100%) rename patches/server/{0066-lithium-entity.fast_powder_snow_check.patch => 0064-lithium-entity.fast_powder_snow_check.patch} (100%) rename patches/server/{0067-lithium-collections.attributes.patch => 0065-lithium-collections.attributes.patch} (100%) rename patches/server/{0068-lithium-collections.entity_by_type.patch => 0066-lithium-collections.entity_by_type.patch} (100%) rename patches/server/{0069-lithium-collections.entity_filtering.patch => 0067-lithium-collections.entity_filtering.patch} (100%) rename patches/server/{0070-lithium-chunk.serialization.patch => 0068-lithium-chunk.serialization.patch} (98%) rename patches/server/{0071-Configurable-criterion-triggers.patch => 0069-Configurable-criterion-triggers.patch} (78%) rename patches/server/{0072-Set-item-stuck-sleep-to-15-ticks.patch => 0070-Set-item-stuck-sleep-to-15-ticks.patch} (100%) rename patches/server/{0073-Smarter-statistics-ticking.patch => 0071-Smarter-statistics-ticking.patch} (100%) rename patches/server/{0074-lithium-ai.nearby_entity_tracking-and-ai.nearby_enti.patch => 0072-lithium-ai.nearby_entity_tracking-and-ai.nearby_enti.patch} (99%) rename patches/server/{0075-some-entity-micro-opts.patch => 0073-some-entity-micro-opts.patch} (94%) rename patches/server/{0076-Dont-eat-blocks-in-non-ticking-chunks.patch => 0074-Dont-eat-blocks-in-non-ticking-chunks.patch} (96%) rename patches/server/{0077-Fast-speed-check.patch => 0075-Fast-speed-check.patch} (71%) rename patches/server/{0078-lithium-cache-iterate-outwards.patch => 0076-lithium-cache-iterate-outwards.patch} (100%) rename patches/server/{0079-lithium-ai.raid.patch => 0077-lithium-ai.raid.patch} (100%) rename patches/server/{0080-lithium-block.moving_block_shapes.patch => 0078-lithium-block.moving_block_shapes.patch} (100%) rename patches/server/{0081-lithium-shapes.blockstate_cache.patch => 0079-lithium-shapes.blockstate_cache.patch} (100%) rename patches/server/{0082-lithium-gen.patch => 0080-lithium-gen.patch} (99%) rename patches/server/{0083-PaperPR-Stop-large-look-changes-from-crashing-the-se.patch => 0081-PaperPR-Stop-large-look-changes-from-crashing-the-se.patch} (100%) rename patches/server/{0084-PaperPR-Add-more-collision-code-skipping-logic.patch => 0082-PaperPR-Add-more-collision-code-skipping-logic.patch} (100%) rename patches/server/{0085-vmp-use-linked-map-for-entity-trackers-for-faster-it.patch => 0083-vmp-use-linked-map-for-entity-trackers-for-faster-it.patch} (94%) rename patches/server/{0086-c2me-reduce_allocs.patch => 0084-c2me-reduce_allocs.patch} (100%) rename patches/server/{0087-lithium-ai.sensor.secondary_poi.patch => 0085-lithium-ai.sensor.secondary_poi.patch} (100%) rename patches/server/{0088-Fix-tick-function-tag-running-before-load.patch => 0086-Fix-tick-function-tag-running-before-load.patch} (100%) rename patches/server/{0089-lithium-suffocation.patch => 0087-lithium-suffocation.patch} (96%) rename patches/server/{0090-Optimize-default-values-for-configs.patch => 0088-Optimize-default-values-for-configs.patch} (91%) rename patches/server/{0091-Configurable-map-update-interval.patch => 0089-Configurable-map-update-interval.patch} (83%) rename patches/server/{0092-Fix-hunger-saturation-depleting-on-peaceful.patch => 0090-Fix-hunger-saturation-depleting-on-peaceful.patch} (100%) rename patches/server/{0093-Fix-mobs-attacking-themselves.patch => 0091-Fix-mobs-attacking-themselves.patch} (100%) rename patches/server/{0094-Fix-brewing-stands-resetting-their-brewTime-when-bei.patch => 0092-Fix-brewing-stands-resetting-their-brewTime-when-bei.patch} (100%) rename patches/server/{0095-lithium-world.tick_scheduler.patch => 0093-lithium-world.tick_scheduler.patch} (100%) rename patches/server/{0096-Save-Json-list-asynchronously.patch => 0094-Save-Json-list-asynchronously.patch} (100%) rename patches/server/{0097-Swaps-the-predicate-order-of-collision.patch => 0095-Swaps-the-predicate-order-of-collision.patch} (88%) rename patches/server/{0098-Fix-head-rotation-packet-spam.patch => 0096-Fix-head-rotation-packet-spam.patch} (89%) rename patches/server/{0099-Cache-block-break-animation-packet.patch => 0097-Cache-block-break-animation-packet.patch} (94%) rename patches/server/{0100-Use-more-fastutil-data-structures.patch => 0098-Use-more-fastutil-data-structures.patch} (100%) rename patches/server/{0101-Optimize-Math.round-and-Math.hypot-functions.patch => 0099-Optimize-Math.round-and-Math.hypot-functions.patch} (80%) rename patches/server/{0102-Faster-Sheep.getOffspringColor.patch => 0100-Faster-Sheep.getOffspringColor.patch} (100%) rename patches/server/{0103-Implement-Velocity-VarInt-optimizations.patch => 0101-Implement-Velocity-VarInt-optimizations.patch} (100%) create mode 100644 patches/server/0102-reduce-work-done-by-game-event-system.patch create mode 100644 patches/server/0103-reduce-sensor-work.patch diff --git a/gradle.properties b/gradle.properties index da83b82..99a0f2e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group=wtf.etil.mirai version=1.19-R0.1-SNAPSHOT mcVersion=1.19 packageVersion=1_19_R1 -pufferfishRef=ddbd29beb796b7878b8344543cf784794fd164eb +pufferfishRef=f6aa872dbfbb7c36c81d2043f4997c41fc0d065d org.gradle.caching=true org.gradle.caching.debug=false @@ -10,4 +10,4 @@ org.gradle.configureondemand=true org.gradle.parallel=true org.gradle.vfs.watch=false org.gradle.daemon=false -org.gradle.jvmargs=-Dfile.encoding=UTF-8 -Djdk.nio.maxCachedBufferSize=262144 +org.gradle.jvmargs=-Dfile.encoding=UTF-8 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 41d9927a4d4fb3f96a785543079b8df6723c946b..249e5832f090a2944b7473328c07c9755baa3196 100644 GIT binary patch delta 10197 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index aa991fc..8049c68 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c787..a69d9cb 100644 --- a/gradlew +++ b/gradlew @@ -205,6 +205,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# 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. diff --git a/gradlew.bat b/gradlew.bat index 107acd3..f127cfd 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +75,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +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! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +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 diff --git a/patches/api/0001-Mirai-Configuration.patch b/patches/api/0001-Mirai-Configuration.patch index 3bca687..38c8914 100644 --- a/patches/api/0001-Mirai-Configuration.patch +++ b/patches/api/0001-Mirai-Configuration.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Mirai Configuration diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index e756edf56995f4552387c2e1082307eb3dd48bb3..58bb08e35e26400f967af89bfe963b23bc4ff79d 100644 +index 56e261efa654e4a6872ccea28f0461df13845d13..b3421340e3cd0c091f6db2e1cb1b2f3201079a7e 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -1922,6 +1922,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -1937,6 +1937,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi } // Paper end diff --git a/patches/api/0003-Add-last-tick-time-API.patch b/patches/api/0003-Add-last-tick-time-API.patch index 4ef7469..f1c3d10 100644 --- a/patches/api/0003-Add-last-tick-time-API.patch +++ b/patches/api/0003-Add-last-tick-time-API.patch @@ -7,10 +7,10 @@ Original code by YatopiaMC, licensed under MIT You can find the original code on https://github.com/YatopiaMC/Yatopia diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 3506a7fa07ee6e53704b1df8d8d2bb08704bfc37..920b55c2b9f0209490271ce416c05f7a7d8e9b13 100644 +index 92a1462261029e804da73da2743bbd68e57841e9..89babe7bec9eee5034aada0907de8d1d805bcdfe 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -2380,6 +2380,16 @@ public final class Bukkit { +@@ -2397,6 +2397,16 @@ public final class Bukkit { return server.isStopping(); } @@ -28,10 +28,10 @@ index 3506a7fa07ee6e53704b1df8d8d2bb08704bfc37..920b55c2b9f0209490271ce416c05f7a * Returns the {@link com.destroystokyo.paper.entity.ai.MobGoals} manager * diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 58bb08e35e26400f967af89bfe963b23bc4ff79d..932fea11c30ddea6e7a3bf9d4ff516a8f792849c 100644 +index b3421340e3cd0c091f6db2e1cb1b2f3201079a7e..7a202fb00f0f81de8c657d60a4d0fd9d3d653e58 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2081,6 +2081,26 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2096,6 +2096,26 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ boolean isStopping(); diff --git a/patches/api/0004-Optimize-Spigot-event-bus.patch b/patches/api/0004-Optimize-Spigot-event-bus.patch index c99d153..2a8a0f0 100644 --- a/patches/api/0004-Optimize-Spigot-event-bus.patch +++ b/patches/api/0004-Optimize-Spigot-event-bus.patch @@ -24,10 +24,10 @@ index 419aec56b0e3fa8bcec2ea7f340caa3456b57d00..8530d926931a54ed1300c40cd1e0908b } } diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java -index aed2209b66f11a0d03473cf19437f3da0e9e573a..1e482ee08b2c0b155ac0a64f0913155f9612b83f 100644 +index 6aba652af2b2f054ad22c77e4e59f0ed3eddc685..8c9b19888430421a8cdef91d707fb43efc7b15ea 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java -@@ -648,11 +648,15 @@ public final class SimplePluginManager implements PluginManager { +@@ -653,11 +653,15 @@ public final class SimplePluginManager implements PluginManager { @Override public void callEvent(@NotNull Event event) { // Paper - replace callEvent by merging to below method diff --git a/patches/api/0005-Skip-event-if-no-listeners.patch b/patches/api/0005-Skip-event-if-no-listeners.patch index ff68793..e3562b2 100644 --- a/patches/api/0005-Skip-event-if-no-listeners.patch +++ b/patches/api/0005-Skip-event-if-no-listeners.patch @@ -7,10 +7,10 @@ Original code by Titaniumtown, licensed under GNU General Public License v3.0 You can find the original code on https://gitlab.com/Titaniumtown/JettPack diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java -index 1e482ee08b2c0b155ac0a64f0913155f9612b83f..c525e93712ceea029ed50237932d998610249205 100644 +index 8c9b19888430421a8cdef91d707fb43efc7b15ea..a18724748aca4032981f1123055a9abefa77d9e1 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java -@@ -647,6 +647,13 @@ public final class SimplePluginManager implements PluginManager { +@@ -652,6 +652,13 @@ public final class SimplePluginManager implements PluginManager { */ @Override public void callEvent(@NotNull Event event) { @@ -24,7 +24,7 @@ index 1e482ee08b2c0b155ac0a64f0913155f9612b83f..c525e93712ceea029ed50237932d9986 // Paper - replace callEvent by merging to below method // KTP start - optimize spigot event bus final boolean isAsync = event.isAsynchronous(); -@@ -658,8 +665,8 @@ public final class SimplePluginManager implements PluginManager { +@@ -663,8 +670,8 @@ public final class SimplePluginManager implements PluginManager { } // KTP end - optimize spigot event bus diff --git a/patches/api/0007-Suspected-plugins-report.patch b/patches/api/0007-Suspected-plugins-report.patch index 054d401..542a9ac 100644 --- a/patches/api/0007-Suspected-plugins-report.patch +++ b/patches/api/0007-Suspected-plugins-report.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Suspected plugins report Added "Suspected Plugins" to Watchdog, crash reports and exception messages diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java -index c525e93712ceea029ed50237932d998610249205..434d7c02001d16e542fd892ded23085fcf9e78a2 100644 +index a18724748aca4032981f1123055a9abefa77d9e1..cd09dcb1a41cbea5ef9f726281a82b7d362efacb 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java -@@ -618,7 +618,11 @@ public final class SimplePluginManager implements PluginManager { +@@ -623,7 +623,11 @@ public final class SimplePluginManager implements PluginManager { // Paper start private void handlePluginException(String msg, Throwable ex, Plugin plugin) { gg.pufferfish.pufferfish.sentry.SentryContext.setPluginContext(plugin); // Pufferfish @@ -22,7 +22,7 @@ index c525e93712ceea029ed50237932d998610249205..434d7c02001d16e542fd892ded23085f gg.pufferfish.pufferfish.sentry.SentryContext.removePluginContext(); // Pufferfish callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerPluginEnableDisableException(msg, ex, plugin))); } -@@ -692,7 +696,11 @@ public final class SimplePluginManager implements PluginManager { +@@ -697,7 +701,11 @@ public final class SimplePluginManager implements PluginManager { gg.pufferfish.pufferfish.sentry.SentryContext.setEventContext(event, registration); // Pufferfish // Paper start - error reporting String msg = "Could not pass event " + event.getEventName() + " to " + registration.getPlugin().getDescription().getFullName(); @@ -35,7 +35,7 @@ index c525e93712ceea029ed50237932d998610249205..434d7c02001d16e542fd892ded23085f gg.pufferfish.pufferfish.sentry.SentryContext.removeEventContext(); // Pufferfish if (!(event instanceof com.destroystokyo.paper.event.server.ServerExceptionEvent)) { // We don't want to cause an endless event loop callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerEventException(msg, ex, registration.getPlugin(), registration.getListener(), event))); -@@ -978,4 +986,10 @@ public final class SimplePluginManager implements PluginManager { +@@ -983,4 +991,10 @@ public final class SimplePluginManager implements PluginManager { } // Paper end diff --git a/patches/server/0001-Mirai-Branding-Changes.patch b/patches/server/0001-Mirai-Branding-Changes.patch index 709e354..acabe16 100644 --- a/patches/server/0001-Mirai-Branding-Changes.patch +++ b/patches/server/0001-Mirai-Branding-Changes.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Mirai Branding Changes diff --git a/build.gradle.kts b/build.gradle.kts -index a4a146d9c3e07bdf941d81147ca31daf4689a687..fb0da758cce2c7022aa23dfb3dc62f29513ba6a9 100644 +index 74c91f79576e85618fefb79be8d313ba871701c7..17867a1cbf2e4aec601b2bc836a2b3a808feb5b7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ plugins { @@ -69,7 +69,7 @@ index b0390eedb507d27426d1e1d73bd4ab63aec89ebe..509a9a5326d94200ca3d7a83ae47c6bb .completer(new ConsoleCommandCompleter(this.server)) .option(LineReader.Option.COMPLETE_IN_WORD, true); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index e96ff8b13b1237d7c70359b78e4d72938877191f..fc3d65885cc704f807ddcb07561b4a529827166c 100644 +index 7fd7c3be306d93201a61bb616f8c09cb066d4204..e995aa81665bdf582f753acec3f0584f0060c851 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1656,7 +1656,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop -Date: Thu, 2 Dec 2021 16:04:04 +0100 +From: Arthur Blanchot +Date: Wed, 20 Jul 2022 22:07:01 +0200 Subject: [PATCH] Mirai Configuration +diff --git a/src/main/java/co/aikar/timings/TimingsExport.java b/src/main/java/co/aikar/timings/TimingsExport.java +index 2cc44fbf8e5bd436b6d4e19f6c06b351e750cb31..848ffaab670a6a245c40e52c43e0e7e826b3acbb 100644 +--- a/src/main/java/co/aikar/timings/TimingsExport.java ++++ b/src/main/java/co/aikar/timings/TimingsExport.java +@@ -242,7 +242,8 @@ public class TimingsExport extends Thread { + pair("spigot", mapAsJSON(Bukkit.spigot().getSpigotConfig(), null)), + pair("bukkit", mapAsJSON(Bukkit.spigot().getBukkitConfig(), null)), + pair("paper", mapAsJSON(Bukkit.spigot().getPaperConfig(), null)), // Pufferfish +- pair("pufferfish", mapAsJSON(gg.pufferfish.pufferfish.PufferfishConfig.getConfigCopy(), null)) // Pufferfish ++ pair("pufferfish", mapAsJSON(gg.pufferfish.pufferfish.PufferfishConfig.getConfigCopy(), null)), // Pufferfish // Mirai ++ pair("mirai", mapAsJSON(wtf.etil.mirai.MiraiConfig.getConfigCopy(), null)) // Mirai + )); + + new TimingsExport(listeners, parent, history).start(); diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index 5d6ceeecfbb55a1bfe77a1f1ac39b02993e714e3..3e232156774b9df5be318dc6dc5035b326f1f1b3 100644 +index ad166788225841927bedc5243dbe94863c270425..ea461ff0b13a3ccba2f0ed02b9268712eaf728c1 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -@@ -228,6 +228,16 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -228,6 +228,8 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface // Paper end gg.pufferfish.pufferfish.PufferfishConfig.load(); // Pufferfish gg.pufferfish.pufferfish.PufferfishCommand.init(); // Pufferfish -+ -+ // Mirai start -+ try { -+ wtf.etil.mirai.MiraiConfig.init((java.io.File) options.valueOf("mirai-settings")); -+ } catch (Exception e) { -+ DedicatedServer.LOGGER.error("Unable to load server configuration", e); -+ return false; -+ } -+ wtf.etil.mirai.MiraiConfig.registerCommands(); -+ // Mirai end ++ wtf.etil.mirai.MiraiConfig.load(); // Mirai ++ wtf.etil.mirai.MiraiCommand.init(); // Mirai this.setPvpAllowed(dedicatedserverproperties.pvp); this.setFlightAllowed(dedicatedserverproperties.allowFlight); -diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 008e8cdb9bc17bbdcd4886fca8a50311262e457e..2e81f3eaec2d04e6bc88f7ce9a2bc861297e0383 100644 ---- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java -+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -957,6 +957,7 @@ public final class CraftServer implements Server { - - org.spigotmc.SpigotConfig.init((File) console.options.valueOf("spigot-settings")); // Spigot - this.console.paperConfigurations.reloadConfigs(this.console); -+ wtf.etil.mirai.MiraiConfig.init((File) console.options.valueOf("mirai-settings")); // Mirai - for (ServerLevel world : this.console.getAllLevels()) { - // world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty - world.setSpawnSettings(world.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && config.spawnMonsters, config.spawnAnimals); // Paper - per level difficulty (from MinecraftServer#setDifficulty(ServerLevel, Difficulty, boolean)) -diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index 1b9e91b20dd9a9375a0a2a6a4d7a0bcdce9e7b1a..dab3d736ae60b255b3151ddcf2b5832c14ecef53 100644 ---- a/src/main/java/org/bukkit/craftbukkit/Main.java -+++ b/src/main/java/org/bukkit/craftbukkit/Main.java -@@ -158,6 +158,14 @@ public class Main { - .describedAs("Jar file"); - // Paper end - -+ // Mirai start -+ acceptsAll(asList("mirai", "mirai-settings"), "File for mirai settings") -+ .withRequiredArg() -+ .ofType(File.class) -+ .defaultsTo(new File("mirai.yml")) -+ .describedAs("Yml file"); -+ // Mirai end -+ - // Paper start - acceptsAll(asList("server-name"), "Name of the server") - .withRequiredArg() -diff --git a/src/main/java/wtf/etil/mirai/MiraiConfig.java b/src/main/java/wtf/etil/mirai/MiraiConfig.java +diff --git a/src/main/java/wtf/etil/mirai/MiraiCommand.java b/src/main/java/wtf/etil/mirai/MiraiCommand.java new file mode 100644 -index 0000000000000000000000000000000000000000..5b30b329959811f99f13f32166574f90e765bcb1 +index 0000000000000000000000000000000000000000..d73428f5554384e5bbf1c8607073b50d74c9a4cc --- /dev/null -+++ b/src/main/java/wtf/etil/mirai/MiraiConfig.java -@@ -0,0 +1,189 @@ ++++ b/src/main/java/wtf/etil/mirai/MiraiCommand.java +@@ -0,0 +1,68 @@ +package wtf.etil.mirai; + -+import com.destroystokyo.paper.PaperCommand; -+import com.google.common.base.Throwables; ++import java.io.IOException; ++import java.util.Collections; ++import java.util.List; ++import java.util.stream.Collectors; ++import java.util.stream.Stream; ++import net.kyori.adventure.text.Component; ++import net.kyori.adventure.text.format.NamedTextColor; ++import net.md_5.bungee.api.ChatColor; +import net.minecraft.server.MinecraftServer; +import org.bukkit.Bukkit; ++import org.bukkit.Location; +import org.bukkit.command.Command; -+import org.bukkit.configuration.InvalidConfigurationException; -+import org.bukkit.configuration.file.YamlConfiguration; ++import org.bukkit.command.CommandSender; ++ ++public class MiraiCommand extends Command { ++ ++ public MiraiCommand() { ++ super("mirai"); ++ this.description = "Mirai related commands"; ++ this.usageMessage = "/mirai [reload | version]"; ++ this.setPermission("bukkit.command.mirai"); ++ } ++ ++ public static void init() { ++ MinecraftServer.getServer().server.getCommandMap().register("mirai", "Mirai", new MiraiCommand()); ++ } ++ ++ @Override ++ public List tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException { ++ if (args.length == 1) { ++ return Stream.of("reload", "version") ++ .filter(arg -> arg.startsWith(args[0].toLowerCase())) ++ .collect(Collectors.toList()); ++ } ++ return Collections.emptyList(); ++ } ++ ++ @Override ++ public boolean execute(CommandSender sender, String commandLabel, String[] args) { ++ if (!testPermission(sender)) return true; ++ String prefix = ChatColor.of("#12fff6") + "" + ChatColor.BOLD + "Mirai ยป " + ChatColor.of("#e8f9f9"); ++ ++ if (args.length != 1) { ++ sender.sendMessage(prefix + "Usage: " + usageMessage); ++ args = new String[]{"version"}; ++ } ++ ++ if (args[0].equalsIgnoreCase("reload")) { ++ MinecraftServer console = MinecraftServer.getServer(); ++ try { ++ MiraiConfig.load(); ++ } catch (IOException e) { ++ sender.sendMessage(Component.text("Failed to reload.", NamedTextColor.RED)); ++ e.printStackTrace(); ++ return true; ++ } ++ console.server.reloadCount++; ++ ++ Command.broadcastCommandMessage(sender, prefix + "Mirai configuration has been reloaded."); ++ } else if (args[0].equalsIgnoreCase("version")) { ++ Command.broadcastCommandMessage(sender, prefix + "This server is running " + Bukkit.getName() + " version " + Bukkit.getVersion() + " (Implementing API version " + Bukkit.getBukkitVersion() + ")"); ++ } ++ ++ return true; ++ } ++} +\ No newline at end of file +diff --git a/src/main/java/wtf/etil/mirai/MiraiConfig.java b/src/main/java/wtf/etil/mirai/MiraiConfig.java +new file mode 100644 +index 0000000000000000000000000000000000000000..50ec3059c0af3ebf561394f542d8fff1f5d66e9d +--- /dev/null ++++ b/src/main/java/wtf/etil/mirai/MiraiConfig.java +@@ -0,0 +1,134 @@ ++package wtf.etil.mirai; + +import java.io.File; +import java.io.IOException; -+import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; -+import java.util.HashMap; +import java.util.List; -+import java.util.Map; -+import java.util.concurrent.TimeUnit; -+import java.util.logging.Level; -+import java.util.regex.Pattern; ++import net.minecraft.server.MinecraftServer; ++import org.apache.logging.log4j.Level; ++import org.bukkit.configuration.ConfigurationSection; ++import org.bukkit.configuration.MemoryConfiguration; ++import org.jetbrains.annotations.Nullable; ++import org.simpleyaml.configuration.comments.CommentType; ++import org.simpleyaml.configuration.file.YamlFile; ++import org.simpleyaml.exceptions.InvalidConfigurationException; + +public class MiraiConfig { + -+ private static File CONFIG_FILE; -+ private static final String HEADER = "This is the main configuration file for options provided by Mirai."; ++ private static final YamlFile config = new YamlFile(); ++ private static int updates = 0; + -+ /*========================================================================*/ -+ public static YamlConfiguration config; -+ static int version; -+ static Map commands; -+ private static boolean verbose; -+ private static boolean fatalError; -+ /*========================================================================*/ -+ -+ public static void init(File configFile) { -+ CONFIG_FILE = configFile; -+ config = new YamlConfiguration(); -+ try { -+ config.load(CONFIG_FILE); -+ } catch (IOException ignored) { -+ } catch (InvalidConfigurationException ex) { -+ Bukkit.getLogger().log(Level.SEVERE, "Could not load mirai.yml, please correct your syntax errors.", ex); -+ throw Throwables.propagate(ex); ++ private static ConfigurationSection convertToBukkit(org.simpleyaml.configuration.ConfigurationSection section) { ++ ConfigurationSection newSection = new MemoryConfiguration(); ++ for (String key : section.getKeys(false)) { ++ if (section.isConfigurationSection(key)) { ++ newSection.set(key, convertToBukkit(section.getConfigurationSection(key))); ++ } else { ++ newSection.set(key, section.get(key)); ++ } + } -+ config.options().header(HEADER); -+ config.options().copyDefaults(true); -+ verbose = getBoolean("verbose", false); -+ -+ commands = new HashMap<>(); -+ commands.put("mirai", new PaperCommand("mirai")); -+ -+ version = getInt("config-version", 1); -+ set("config-version", 1); -+ readConfig(MiraiConfig.class, null); ++ return newSection; + } + -+ protected static void logError(String s) { -+ Bukkit.getLogger().severe(s); ++ public static ConfigurationSection getConfigCopy() { ++ return convertToBukkit(config); + } + -+ protected static void fatal(String s) { -+ fatalError = true; -+ throw new RuntimeException("Fatal mirai.yml config error: " + s); ++ public static int getUpdates() { ++ return updates; + } + -+ protected static void log(String s) { -+ if (verbose) { -+ Bukkit.getLogger().info(s); ++ public static void load() throws IOException { ++ File configFile = new File("mirai.yml"); ++ ++ if (configFile.exists()) { ++ try { ++ config.load(configFile); ++ } catch (InvalidConfigurationException e) { ++ throw new IOException(e); ++ } + } -+ } + -+ public static void registerCommands() { -+ for (Map.Entry entry : commands.entrySet()) { -+ MinecraftServer.getServer().server.getCommandMap().register(entry.getKey(), "Paper", entry.getValue()); -+ } -+ } ++ getString("info.version", "2.0"); ++ setComment("info", ++ "Mirai Configuration", ++ "Join our Discord at https://discord.gg/DdH6Yfu9gM", ++ "Download new builds at https://github.com/etil2jz/Mirai/releases"); + -+ static void readConfig(Class clazz, Object instance) { -+ for (Method method : clazz.getDeclaredMethods()) { -+ if (Modifier.isPrivate(method.getModifiers())) { -+ if (method.getParameterTypes().length == 0 && method.getReturnType() == Void.TYPE) { -+ try { -+ method.setAccessible(true); -+ method.invoke(instance); -+ } catch (InvocationTargetException ex) { -+ throw Throwables.propagate(ex.getCause()); -+ } catch (Exception ex) { -+ Bukkit.getLogger().log(Level.SEVERE, "Error invoking " + method, ex); -+ } ++ for (Method method : MiraiConfig.class.getDeclaredMethods()) { ++ if (Modifier.isStatic(method.getModifiers()) && Modifier.isPrivate(method.getModifiers()) && method.getParameterCount() == 0 && ++ method.getReturnType() == Void.TYPE && !method.getName().startsWith("lambda")) { ++ method.setAccessible(true); ++ try { ++ method.invoke(null); ++ } catch (Throwable t) { ++ MinecraftServer.LOGGER.warn("Failed to load configuration option from " + method.getName(), t); + } + } + } + -+ try { -+ config.save(CONFIG_FILE); -+ } catch (IOException ex) { -+ Bukkit.getLogger().log(Level.SEVERE, "Could not save " + CONFIG_FILE, ex); ++ updates++; ++ ++ config.save(configFile); ++ } ++ ++ private static void setComment(String key, String... comment) { ++ if (config.contains(key)) { ++ config.setComment(key, String.join("\n", comment), CommentType.BLOCK); + } + } + -+ private static final Pattern SPACE = Pattern.compile(" "); -+ private static final Pattern NOT_NUMERIC = Pattern.compile("[^-\\d.]"); -+ -+ public static int getSeconds(String str) { -+ str = SPACE.matcher(str).replaceAll(""); -+ final char unit = str.charAt(str.length() - 1); -+ str = NOT_NUMERIC.matcher(str).replaceAll(""); -+ double num; -+ try { -+ num = Double.parseDouble(str); -+ } catch (Exception e) { -+ num = 0D; ++ private static void ensureDefault(String key, Object defaultValue, String... comment) { ++ if (!config.contains(key)) { ++ config.set(key, defaultValue); ++ config.setComment(key, String.join("\n", comment), CommentType.BLOCK); + } -+ switch (unit) { -+ case 'd': -+ num *= (double) 60 * 60 * 24; -+ break; -+ case 'h': -+ num *= (double) 60 * 60; -+ break; -+ case 'm': -+ num *= (double) 60; -+ break; -+ default: -+ case 's': -+ break; -+ } -+ return (int) num; + } + -+ protected static String timeSummary(int seconds) { -+ String time = ""; -+ -+ if (seconds > 60 * 60 * 24) { -+ time += TimeUnit.SECONDS.toDays(seconds) + "d"; -+ seconds %= 60 * 60 * 24; -+ } -+ -+ if (seconds > 60 * 60) { -+ time += TimeUnit.SECONDS.toHours(seconds) + "h"; -+ seconds %= 60 * 60; -+ } -+ -+ if (seconds > 0) { -+ time += TimeUnit.SECONDS.toMinutes(seconds) + "m"; -+ } -+ return time; ++ private static boolean getBoolean(String key, boolean defaultValue, String... comment) { ++ return getBoolean(key, null, defaultValue, comment); + } + -+ private static void set(String path, Object val) { -+ config.set(path, val); ++ private static boolean getBoolean(String key, @Nullable String oldKey, boolean defaultValue, String... comment) { ++ ensureDefault(key, defaultValue, comment); ++ return config.getBoolean(key, defaultValue); + } + -+ private static boolean getBoolean(String path, boolean def) { -+ config.addDefault(path, def); -+ return config.getBoolean(path, config.getBoolean(path)); ++ private static int getInt(String key, int defaultValue, String... comment) { ++ return getInt(key, null, defaultValue, comment); + } + -+ private static double getDouble(String path, double def) { -+ config.addDefault(path, def); -+ return config.getDouble(path, config.getDouble(path)); ++ private static int getInt(String key, @Nullable String oldKey, int defaultValue, String... comment) { ++ ensureDefault(key, defaultValue, comment); ++ return config.getInt(key, defaultValue); + } + -+ private static float getFloat(String path, float def) { -+ // TODO: Figure out why getFloat() always returns the default value. -+ return (float) getDouble(path, (double) def); ++ private static double getDouble(String key, double defaultValue, String... comment) { ++ return getDouble(key, null, defaultValue, comment); + } + -+ private static int getInt(String path, int def) { -+ config.addDefault(path, def); -+ return config.getInt(path, config.getInt(path)); ++ private static double getDouble(String key, @Nullable String oldKey, double defaultValue, String... comment) { ++ ensureDefault(key, defaultValue, comment); ++ return config.getDouble(key, defaultValue); + } + -+ private static List getList(String path, T def) { -+ config.addDefault(path, def); -+ return (List) config.getList(path, config.getList(path)); ++ private static String getString(String key, String defaultValue, String... comment) { ++ return getOldString(key, null, defaultValue, comment); + } + -+ private static String getString(String path, String def) { -+ config.addDefault(path, def); -+ return config.getString(path, config.getString(path)); ++ private static String getOldString(String key, @Nullable String oldKey, String defaultValue, String... comment) { ++ ensureDefault(key, defaultValue, comment); ++ return config.getString(key, defaultValue); + } + -+ // Mirai - settings below ++ private static List getStringList(String key, List defaultValue, String... comment) { ++ return getStringList(key, null, defaultValue, comment); ++ } + -+ ++ private static List getStringList(String key, @Nullable String oldKey, List defaultValue, String... comment) { ++ ensureDefault(key, defaultValue, comment); ++ return config.getStringList(key); ++ } + +} \ No newline at end of file diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png -index a7d785f60c884ee4ee487cc364402d66c3dc2ecc..731191b7e805f07e465fae7fac49985456f8d8f6 100644 +index a7d785f60c884ee4ee487cc364402d66c3dc2ecc..17697262316fba32f4a87ea50a9bc8993be50820 100644 GIT binary patch -literal 60066 -zcmV(|K+(U6P)P!gTuDShRCwC#oN2Tq#g*TG5xLa*mVUj_3p7o$FOpb}1T7&fiSaOKv<%0dL6&CZ -z@%TuV=hz>t(K$0-X0wlveI)yX<*{XKX~tqe*u#K?goJ=bAod0W0=n6uK}|z1@Acbi -z$t5COd9$*zs*CQ!$6ko;TalF+8JU%F|8ejC-pHq%bG%pHbWhz^IzP8>b-R6Vb!T~D_2SaOHE-?RJ*jFnU-_QzOzLaAFpWEel^|Zd -z{^WFV{$LtMX_{KIxbdWo`~KtC|LguOo7g`A`+(Ph*MR-NEHDQw9{#>XTwg5jm3LKq -z-YbLhE|kkK{`@x0!IuAg{r1zIc;NQ;EzRybV}9@M85_sbNt({AoLD&>1|iN_6i7Et -zfwhiiy}^8I0lz*0&f&BpE7q8bNs^wVBvA+7_g6mm!ZVw1yX7Xx%k!#>BM7RX6ejHw_#P|Qu48e2o^HGA!oa81?YfOUa9s1*-*WXvgEUQW`S@v2 -zD9YlNUahljhkVO{(-SrF13f=kbJE6L=f3Z>9cQlMUf@1pClFH>e_$=&D -znkZwb`c-kU#ErtD`slOH$>sMQ*nt^B=jteEkCbH*>z)tP+)= -zan_O~2~j8N)rPp+5jQHV)WIpVHPXh!U8$A!FwSAEJbBO=Ee|nCjKQJ3024t%K_+f{D#wx9?vql$u#${mHeCD&i{*jZv2mAooL0SA0iQJzE08xN9 -z1dIysYcI|6I}hEv{bSws@^loZtXGh|bs^aZGhPyw<1MN@q -z?_ZvvVpHaqTXefIu>ntKO6?0kY)_^ubt-(#)Hp_tfD@%k -zs3?>}DT}yb)+_i+y)iMr_3wP}XJ^jvUEn7`L|y_QJ>E(E@eGhd`Ndk`H-7ra+h2O+ -z#b+;6DB%Qt5TwiPNMCZ!TAf9WVgk0le*@DyZ>Rg{@AI<%N$!7kmcMwuLZwm_2I2V? -zaiy$Dk>{rrlVP3E^NEuPn;NX^iM6={Z&R!>1hqQ4UM1>AVmScmBW|~FY0Sjr6!obY -z{Av|v(w!k00B!;Hp9nnVcm#;*y8#J#Sr2^WZ|{2k -z^ZVX@b93H67jA{8aHC!zsb^E{Md);gKFFV_yG#5@N(m2Vj -zMNT66N(goBQLflY -zv17nnl-9;s+jqfW?YfPxUUTJHHvr!P_8iX^<#+-}p1&w9#woz>-Ei9z|73CD;2MMk -z`>8YeKr6H;m9HG_*mChjTZn%792<9ji$`8v&hl2Yk0 -zhs(*00%HIH-q{_qXl0$TKEUMEihZB|^hFs+z74!VUcBQepK`na#0SzLSL&aA@Ajwu -z(fr)(I)}@YD$PKV2?JL`(c6Jh0qrE=s@e{wTMzTipGRDmuIG})y(}(w=*UE`fD9ny -zGkn~on$7yv3H&}N$Uz~|s;p@3iMzGjS)!YCg~a##dFqo>0?h8xA~s3Lvh0;G6yVs@ -zO3ou!X1N&T|7AP361oR~MZ!i?uDNgbYi#}SCsdhuDdUU)H=Z~YjX -z&p1c=PLjCDzL&WeS6Y#LU%6e@Gf -zA3HoxVN!=NHqUY!Bl(TV#x!B2f%IxEwTBVM+ZK5N|aw)pc5lq1|F`W@_~vSL@CbZ*1(W!cMyim_kf`lR3~Rh<7M{0 -zu@k*wJxkVd*;!|E`4v|&J-w2sZ^5J##-sRf>ad|MmtQMyOW9t+##$L`jPR71m1}li -zd-Vn10ImZ%1rI!y!^6iiK!#_iYwmbt&mX_~(sS>JJOM`GGmkmn3J*u50%qJiA6oir -z{@<SX573#h3j!i{LOjE{RA_tWoa+<$IVY -zA?+lDVL%+m*x1r-A7uXRS2*e14`6!x?fe3N?>By%bsJ6*mrf0lcQs}u3dSzKi2Q#J -z2sdc!23#dSCATO!P~fyP&iTbvm#+Ua;MQZ^njDJ&@rGukvv=&_>-TND`_~l;<>}N} -zmucx3D=jp^?^}))Zh;FA{x!GljQDnIBkwnhymerS$Q4UKEY=pB0~%qSYEK;EMiojX -zwX?3z7Yy?~>*G~wR3=uS{oM76mzN|;Rh^j3!KFa^I=f%#i~O4X{tk^QX|O3aicr-m -zS}7EHqqx;&Y4)I4pXs$LfB5bH`_R9N -zqE1t5Z2%;GUkuwAKoF~t5HR6dY+byOn|HMNQTrrLju+T9+ZjZV(w>-}fD^wx)FHKM -zBmeFcPG_CF=S`#lW)1Fycs-?1AF&y&9D6?r=E5e -zaoinD8Uprll3wmA2t9`*@T0e1jEAw-t5&MZzxSIT{&V2#$D%bkRsb^0H7UxEILKWp$yX#jaSnnY -z#CM8nwOOjIr*Q%fVeh><*Qh9Jp(<4fLX^vuF70&jGZ)JDQO@QGK$SaWefx6=F?PdB -zD&TaTC3K~p1IsxHA4dllXwS{lSi73AS;rXz#i?51Qp>^D-eT(H4OkZuw-=b0Su2+2 -z?KgJuTRnH{hJUOqO3+jYT3TOYXmyjo^W9yyk{ -z$*};C07&`|^$)JQ>F0lLlDMM1Aj$F=BRu0UmP5H*zm^I3yYWxi_4-r%+3Tlrx>;n` -zfi_N-et>mOLb^^sQA5WOVRa(+_m#tXdH^BuqK&x?fWE4%e40HrM_+*VWTd&5sezSW%A)^;)NF7`DG?H -zt|MC5Pf%<2BW|$Jvm~GY+?SY|o{@ZsQfdGKH9*Or>T{71vr=Af=$JYbVA4(x_=z6` -z(U-3M=)VE}6JQ5pdlZ+W86d-Xjm?k0%5~cx+;(N==W3;FuXyG7s4)dAJ5l1%%u(Tr -z_)%&He!y3sKc6+G&F%w>#HqnKEqtRBr&2d3CNaxPLaZN9lL)`CeTTx+5;w~UKbZ`4YCwWVhM`Z+UEId6P2@Z!15BsO@}50Z*RCaKHUu15 -z&wBV7$f-`+xA*MDZ)Q1{khHx-(3p@UX1le-sz#H~^ehR^VQgCDNk)nIz|Q4b?~deR -zWle^SV##CVQ)^|iG0P5o@FQ2=b;)Ub8F=kz&zoqD&f*QdlknT$z4fujGH`gFm*x?j -zl4~f(VZlKk90wE4`SXvlIl7tuwd+hKZN%)tGO@8JQEW|=SW)1KsTJ5x8!xCprHWBG -zZzyMeB_K-4EKQ1EZ^-ESLdYG;L<4ZBP~mx6l6yHcTsceQ^7gnxm`Cm=*|>ur*7BoT -zOQyc{=37)(uO?_VvEo+co{Dt{h;!vGS$=KJDokfdEE%3JMBk(-6O+@txa%bzy6>lX -z=HCl&ZU9_4U5!$75hXJ2V!5I&r97tOQ^rgtH{VZtWBDuDm;zq_O#c**qp%!}0Pz9S -zAA)cEx9hikcX@enrSAK)7NSnydGSyQY+imBgm1VVEb~Qa%R^o)9Tl|{F50nt^BsCJcwJyQMU2%gTJLcmH -zIP~D%4>giYP{W!v08YM8F%i(>`~57qqWjif!WApet75ix%0=j$XYMIe=R9xKc&Sy6e#X+V{rKIPL|jkKO4)X -z-kAQy^><&NjWKyKN8>BtM;kzj2*;*Jo=@)Sf#a)6DVs?_#1#by$fell6y@mVNxn|v -zm=0sEzI;88?G5;!uQyol+U#A5(9&Mhj`KBClg$ZK#zm5tU}~Dw8d2inpG@Q-1a%Ls -z94ZWij8v*2xRkWjmKUC|psQIM2I1H|TuccLsa*+@Ljy!D -zc;u&-=qk6wlH}qP;(~d#CTZNs`Vp|3s4MqnjOBe7Udn^p@8JhOxRG|djqitrB^liN -zpd1Pmm5Wm4c&I`clDy5xv1}|eH(4ufvoU_`74GgY4N8wTkQ^->WO#w$$8Y%IQ#UTm -z&#uj05w#`_##TU#4VW6zE+_eb)Hs|;_`+w-qV@6v{Qe*PB@^eI&E7rx#A1M^n`FEr -zW+JT1a*w6OS*oknVyyI-53J2<@G43Ou5!6T+8jKR7+l^vOE|p}4~1X#!Oy{9LE2bj -zNA3?-Rxq4}*LeamQ|yZ5T*S3%zy3CrO&dUKiH4PAx;Ss7`+^_z7?TFmGpl;b -zRo?%3;Ae#w@h*7D31LB$NDhwQx$b-S{baER4!;i$cLZ>Zrw<$|pRr{z;WbyC$22W& -z`p#crdTWxBrA0ci6IUrtEZrob;a8}KRXU3Y2`8q8!mvs-T>0Qt5pXyGhsxVH1c>c@ -z2k;wHcuJ#ujq_E$;(U;Z%dDA0XX0lyy*igd2UTfp1k^g?KQ7O~MEmFPS52b=ADlfz -zGX)$a?hfGwd4E}KU?~Cs -zS?$u?YH2OsO}C4&27h`ImnIAhW!Yy*iuIu9yj{PI6QFsyko}$tCXNOx0>WxdB5_k; -zmFM^D=FtbY;d=qNL&$gTCJiz;4A*k3*c>0U;T;M!mSD`rxjc&Vzm#wn3CMVdw!mntw+@TvvpeeMNsOiRX>B65bz;}w*dyf#|I&J|{_?Y#bd%5MN>$iPT78n*w(s5&XH+Pv#3=iKnH<GnMm= -zD2`fTgB_PQrg>Jk5+pL7N{jkFF`~gnyxuUnlg$Nw)4QFzrZynNTZlmC&m~@Vp93T3V|15 -zZKm)YNv2_(Pl5tDNi~UXwN6W_+e7+htY0T3DW-GuF=nH22=M -z?Ng7x;%)<`-Z{c``~jo@$Lf2ZT=>c358v}~$#2*+VDwGT5)Q+Y;$bYfr28MwK}bIi7brzH|h{8Z{;+1Q>DLmG;iqd>M+TX)i9Ya%K(NAK%XI-LDY{u^*s( -zw0X-fsjTAsgoQWo|lJ?pXKg*VybRq>LTrA|VcT5+KoK?B>L -zmAjessMS$Uz#-QeR&zaYm8>Xm&}h(}KY$-LP~@ZO2OfEG|44N=9po&qi8UqlZQko5PDQsMGEuj}GOq#Dg47QMNF#*a$5uUw!h<6P>1>))<1Vo7#9v;DHW -zw(lPY$#Db_um8hV{OqZP+g^F`>5DwiPm3_F8u{Zh!x5l?jHnh)mjLN=kM%Rv-k?rm -z+RL<_{Sl8OXEB|0XvKzZ*GOWl=2i2-R>=Azqg`PYN@XmQZ#hQu*$ltdAWb59K`D^P -zPm0!gXcwC+U4B-X7?YYIK2X#;2Z!xPn4C#LYdJ2Kt<%nyun74lw-^ElujoUHJgdRe -zDOsBu*Om6f&GM@aj7do2m}aBNOE0|4o4a?(s^-#)lnkh> -z^P)!Bk$RUFL=B|ubATkVfa$(2dB+PtikD<29)2#m^|@yr`;g}a -zi77JUYIudnkykB@hf8w(iBrdx^>z6}2=1+y*z?OBJZ+oQk~Xb4;~kDbdsMs%#v1Xn -zlcbx!qoEkMNM%tYiw031It=N|?x)gRfy)z#;$Ds1w=2)LJz-!qvUY`d#mrtLSLAI& -zt%Iy13BiW-W}f-Z39_&T -zlUjLA_qk`E!rJr@w{yTbMtowC@!QH9j&qXn^9Fqma~g;3TawJ{=&i806=?Q#$~)Ep -zQmn?UKJgkiKlS(nS7^^qv&?C^?w}acafi0g*hR{sMz*YlYN$DRO&#kL>08h9!t4|a -zNrFwSBm|w!tVa!7&hWCd!YIG*$5YP4|DU>R>$T*#%3oD=_r9F7&zUnfkHJ>B%8(Z$ -zMY2Q!1Q7{E2nmTNc;GSI{(uFR5RVXeKu82cL=ZN4fbfvK@sKeJatx9gECMz$1WOi) -z9mX?f&c61osup{H)pcrGojp3p2{YcKHC5eRr+e@2wQ8+zU8<#*XAnSgR=}1ee6!OY -zhr|d<(Q}mqiH%BSs!9h&)p||-Jv?rl6gWN_bG4Dp?Kkkx)eRim5{(DzJ4U*IQHG|4X5yfufQaNU -zneKUA$jH!8o%ZmmfX+r}mUmI?w1-OzvngXDjz}g&4}2R43Mf?oTT*5W*-|i%f?Ky) -z&S8piU_R%<5~k2WIO1s&UolG{{!6zanQ!Ph{nYv2HdWmfM|Hw0G-;wX?9S(r7ZX@p -z1KskcP2=(Q*38=Whl-q(vIa=p4lRb1xPtuw9vO^}W-d1!6CK+xf9dAO-)`_3q>p+( -z3P=p{{LUBt=H@SGW2iZj>o76EE)t(oA!SyWCz -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 -zs7G%;Fo5 q_~6PLXE?MVeB$9Qr+yJmc-2<)NdC?3tb7mGvR@w4zmdgY-KnC6fNV -zouer4r`gcQgCSX~!PrF7EGZmuZ-`X2wGtO2fGy9b*`aX=a$rmCTQ=wka)_qN7&%X5 -z#33?GDpZn`TD69^;8P;00)?3O!MnfswQlPo*Zlvt=rf9pDZ2kJeCz6`fhv&y;0O}R -z9-p{)=B+zZlh~NZB$46&d5IC#YvdO*xvh)8PJE^OlIjw+mBBT##Kurd5^*%#H+B2$R9wO4)vG-J#wqG) -z%>B0mB>9G43rNeY;F+kj~B>MS)mwP -zEQY+668E~;VNcqSJMKAgfbK9u++Xl~K0$t?Naqi*AgmSsJ`t3%)2Nq`M-k(Cim;L{ -zlE5c7%J9{xl0?3x7UPt4iNr>bhHNwdp&Zt$rnO+G%_Z2XQK?8O(j=D9Wzsk;*9mEo -z>LSNeDzdJi+p>==v9$fixFkP#+c+`Rv}!M&efuup6AJS`c)(Ny@XgEo{KjwxV-jm^ -zVZs*g>5i^GK1$A&2KZx4{8R@V1W##}_aurK6qcj&RX+55L>QAf6(WaLwlKBY=~{bAsQ?y -zX-ZFO9X4UA&R1W5gJ}1XoFCh5DrOd++9wgu$Q+BeGK$7a?wMznY`Q_*??HbDik!Cx -z1wVe%E-J?G?Ca;*)2UIEe7;gqAD6E_Mi$ER8oQSdE#uruc(I*IL}rR}hXLYYMlRID -z3h-Bx6hlOza0MQ; -zA&jUaBw=oN&9~*7sb@5yx)ueh==;P}INmz|%a~YT`mbK-{``mUYX9jE9#N>m`7M9? -z`9FKS-|s>c#V%wnnY^b8l8QizB$KV>L>ShrO>`Be(xf*U^V5&qPNUtR`{l1t{q1it -z>J%&{j%MR9|JI+sz;FD`ef-?t_!$4kpMRU<`xY3E3a*WE{@st?O{X)(u9=Q>IMb@| -zlMkHaZ-4s~?_27Ky4RFe>1vv?G~0pAZ&2iiB^JCWdK9KX95>0vTWnpvgv~8!twCjK -znzY%*0-4RpJ9W%xM6|WeV4P8rx`U2KZazeoWxTXLWOk~Jb&x=5sfWn8@Oy?e;3XMe -zHnOGTVF~Qjgt!1Kq=mx`Gc3Z!V9J?QzHc0<0W)$86NJ5rdwr1OR@m1_oIrhSOolND -zNm`Yx@6VooTN3Yq1%d}HRmtAd7_gqD3yp&jUNfdOK+xkMYzZ=ih$nJYdCb|+ny=R} -zc|7b|VEXyD-+cVT|MP!%Gw_BcocsO=VprjZvO#~QlBBt{MM9tfQR{x_i$94tay*Qb -zQhSIAR2$`x=qsTe3ia3+N@ -z@xZDK{reeDwP?Jb!tSJwrx-iNqoM>Fpm5l_!6jgFOJt2u -zk#Rl}1fr}(B)IVq86p#bT#p1|RjUnQp=}b=s@E|- -zFR;^4DZ+8rh*4wEcadXCAp-rMM;>JD?KOZ_@KUJPbLtj6!O8ej5H|HL*^!CzBF|_3 -z-dp_ePn=W)`F=7;4pjcmUq1J<&RIk__kyw)LS7pWfKhdmI}9TbxKrd?F{(B7BXHM-2-`om`>srB|CXIvE2 -z>oqQ{^%zL@4=|GaI%n_PG@pLtCSF+X(yrI!-uqg0PG4G~RjctY{?H>_c4i-t>Fmj -zEyN2(Aqrc>*dolJ?ggWK1liEy{0v=KYy@^HMJ~@F$qjjT%e%~ottGJqiH)&pqhb_W -z230V5j@jk?8vlKVhvR_zNt_5Z&5O^SW1;q_G -zDq+E215Vaft|@GxeMV09o$t#PvR_DB*+-5S7Hh@9v^*~T$RhXi`-Q)Mfi3iYMImkx -zeE#=->!*PfCWUqL9{Z16dFQRWZp2AggOa`=<6*!S;T_E;Gl -zBPvM8-g?53{R@n)T%i8KWt=sbsDM{2-L)}s)ZsV2_I|#wR%LeF=ectu8r7J$uC4RL -z@dH#6%j#yAYNeuj`XcAiJ8t5Gdz*ac(gwravDmKjjZ<5a=H|oq-odZ@#J#+5_BsG@ -zQp1>tqR1dZ0F}s4sWoZNFG)h{O1H;&Fu($dfk7T|(@dSEPLt7i%=OJKQ;jyBk5|)} -z5d?|8=Y<+!GsCEF$woQ;n8e{bgKNZK9O=+e$spfYX4LPJ6X7|0BYay#ZV+L96g&DA -z3lUT{df4wpDv6;HOzEBz340|7S+6%G%S%$L%lRlUGRhK`djpjbWK;di1H{njEiuq*Dl@zJfb-8eGud;@S`B!pE-fP -zdqP&woJxu&7-f>)BWZ;`q{=ROfqK084-_%XEqgmv+RYlKyG&9Ha04f<+WV3jroU2S -zCoeeMtnuaTf_7r5r%q3e*t_7be0ZcDbRzt3FxkkS7b;E{>3XO{9opq@9mZ(ZydY_w?r+_;vw`k0B)4N;eilzbJJ(Qp$lBvcTzw -zniQYjGXOb2#=rT!=QBfW_w6OjwpArDj{MqXxSm2iBFYPjPM4WG4R5cEIkdaR(e5U_ -zI&AN3;V@teRyNkzzc`DFBzJBwfVQw=EWG>pL2f^Kh!;;^;#;qt;_rO%1?cyA=%yu1 -zQE=z}1-5qjJahRS8uR;TH=AlX*Xa#mRUBfR+{xg+g*x}1I4CpP`qnnDZf5LmCc-jB -zR(+jh*0eF>Apk;QZqyHqDe?h>Y>g?2S&FC_>oLO1&XKj0ZN2-1TGT!*kX7 -zRQ=cpq|69>9~#o4YZ1gl?Ph2|*0W`QDz`=on|gt?3A4`oKh8N`fBGvQwIzfb*6v;@V=ROo;Y}rSH@d(`!V%eRctDGQKrWM -z@BJ%5MsKb3`1Gglq0_8M8MCXKJ+Acz?5QOnkYo`=#b{=AXAl++1Ud3?m%(TiDf{L; -zQWrGmc1!wETa1vfV-sUXJxpXuPv0@NB{Q=u5iv<_Nmn(Y8fO~)^QCyhRVm$*N6G9uA+?Cp^5UkZ_SvGO1Sx~-E -zfiF~b;p>A#=&qnxGFgc^Dis11Y3H!rKIWLg?p?)JFB4ZHzWMqUDzp2UsaDusPhmKg -zM95a1QTxjiSWSJqpXnO~A$=VQsORcXx%z*AU? -zTEZxXq==;dbbSl*0-K~ly&P67=q9enHO7cjrBK0YvrVm9Wjq{GZ8k^*fl9na$5R1a -zHA;~$!)8jmPI*c!*?wF#yf+{tazq-dt1@0=CdEYs&}HAlj*2hN%XP9XO{{-tea0IU -zyS$Tm7uId^cfPUmv0r|4;mP-6u?ism%I9BrqRb9$0_{>jAd$6qM+!(}5dEd8@x$36 -z!c7Jwm&ikzGd7?yGI-OC3gX7l>yu9nu+1In;|fo%$7GFp?wILtHA#7Mc^h`k2p|6H -z@(zFVrg0mEU! -z*!20pW5=j{oxjaJpE$~oAKcI9pMQ(zyM|laHQEMINso8>JaNy%#Kw>p -zKxAm75v=xEo10-eHH?Y^Yb;Sv-N9g8&TzECxadm#5C1L1?W58nskG^CT$bmjEE_l6 -z*_1wrVf<7)*P6u9yGTEzy>~&* -zdD+U7j2i%lW;yXumd0;~lcqDJgN*X%As6P;2nmugfjF2*D>wj}gj-Y>VSsoXd0UK5 -z@W#WX!Kpi=dG~(LeD%*h`pb|0vwsUHl&uQaC$FA+=k{_|H42_ujmR3p`VeS1tjZrK -zSq-VF22KTT&ta&f_OJRKgTcq1=cZtg7F2c$t`!x=RJgwbgD7H{M|^9&%gya3))~f| -zUG6`5fJU{7I0S0(9m$@)xwcNFQo$O-wUsrFJ@KQ=-E%Lu-Tyw=PI=`wH@NWI+pIpb -z!p4_&c;R=>v3hZvyYIV)U--3O=b0~kl>@U4e*LE&=U4C8#a4g7i#rzEAM#)R_=7CW -zOfwc|zgWUm@4x9Nzwzl0bD|yd+zV``B> -zZ-dCk6jmF;2IYe;g%6|6GF+`fk;I6*NqhZ7z9Qdmd&)26XrgMr9+L0(JG -zc~}$51?Bk(cX;i_NCH8FF|1#|dK+*O6ekkGD?e1^Sv87HLGBB0I*kNG5kbWSPZGn9 -zf?Qc%(l?-nAiW^i^#=&Eh%~D)FJIi?!8;wK5!qCOt$LMlw!uRjbtM^fxycXG5A(Gx(SmS~XmnkPdUIt6gj&?eS%(^U|%v -z<`${6i<5eckuf5BRMQ%gODi>08qJd1@oYnx7(7&QLg94RLpG&RQ8ijvprqwN((5wt -z#)}v#T$>2z4Th-r=4D7fQOmX?a9dF^KF2 -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 -zT|}1WazD2c~lBN*L%!nGe -zG!>>Aw{!+mjtWKKfZI}GuxzEr@JBQ*I@GqvqVC(pFr$->+5i4q$a;0AsugMx)Y2a9 -zxh^lCU*V6ES9#*`d)es^IrojPG1Xh=7k=#H+;j3I&)6!DnjuFQXUK|Nlp5DIH)vNf -zb{#oEF7Ig6Dvny9J$r;P8nEQgm#hk<^4^tvTsuW)bB&G46xcDgFt~EY@yJ+|WZ$4rUVvv6mFN*>a8U)H -z9>@DC855K?sHLgI*@vtqYBxy|qU-0GYb|oh?ZI5?66ZZ;n`54Qq2P}@=lQi?dW_jx -zosAct<<3rp=|gvLeQk}`dnwHb9-2>>uGi#-BMhU}cbGbO8*f*pS)?FWZC&8f?u7O6 -zc^Hf;EY$QT#}K=TIx1Q$8X4o&)!?;+_#mqUrOsCUyuAMx#%R!?6=d<5=M|X*hrNv> -z7D}eKF*pQH0;Q4~Kb)qT!iV%Kk2CD;%$QMcr$rQMR>GOybNPx9s^J2)+IfdI1(NSu -z`PBC<0(^uno=wpt#Y#L>5*a(BI&1}?nljyKu3B)Bp7=x~j2JLv;ga8U5$#8^J2U)-$w`CuoORbXf=7mfA$v2-R -zj^iK;2x!D%ZXwyc#Gctc>ATrlk{Q0ZJjdK!F~9jw9OEQ8$vdyJr`;fGbr|M3Z(LdC -zYvUSgYwO&!G>ZgT)haxH@d_tqW8Q8brec7AwIh5+0d|Oe2&`9yg1Vacch=}Z&(3J_ -zxUvnA23(mapuwtEF8c+w$*8~%NL!5(#25{+MWY^LIj1fpAom5pU*m(oj4ZL{`gL+& -z#@V24iae|NV66}_lzJ#jP|6_cs-=kG)UrO|(Kx}Pp`;i84_!15*JRp=NCo=>aJi*c -zIH=dCx0_rp9JlocP*{8c>k`5+R7@$^=m3$SV!R^UOd0fcxAx9b5n~u_AZbZ$9Jx6@lf?L -zI}5k+RXWVLg2J&9V~~ -z(9`=U=z3D^5hqksz4tFvH%~fVgrune$=g(Sf*`nNgSWDrx!wRzaSDex=)JLNxp?I| -zl}Z8;k{rz(zmI0SO5F`HsUbQDYK$M)`KY(bDmH9$Dky5IqCT*M4BM>a0#kH+K%s8q0smPS&AUc7pp-`$G& -z&mUdj$L~Hw62W&?dOTFU#_py4{BOw#<|A)yK(#y0Xa$^Qm*mu>HC6EwF`(06zlUDl|zJjOlrk2L4QW6iMsr#df(x#T-ah6Xz%?2?^Ts9Ic!XGS^NgZWr*g|^8^VAD$&J8rNNpNt~n-FY;$^ -zpM(GOKjHX;kI;5GPi>BQqjH -zlq5+=(u6ok#6X(LI;N5&vZQ{g#E4GR7UNX?e}c@|p>9h(B?H)Y!8(ip#Gyh~7>%e_ -zW9=vi$(;O!f^Tju+ru6kn>DJg;MKzMfA&)v*??$ug|2fj$~@A_2l?XpE#80nGzV_J -zl|e7Z4*I0~Z=!kO4Mr;)*h+`Q<>ZACS;gNk@oL84jgftes;*JiQjV$suYsv(icB(V -zeMo6}&O(sTS<6Ql*=I7=TRj1!j>q|PuQC0|hdFuTAb-$bruobt^P>ls=%@4i+wKI{ -zonvOyW!(|-2~J&l3@RA68V$S^T-EGh5_7A$Vtt)?&5l?&q8PmS+iAudB8&$#O%0?E -zrTGfNq~~E0MpwGCTPUAgSY@wv2Co=#Y;LVeeMnHRac4C?$fCM;hn%Y>=*RJ~U|K&; -zYrUx^iwUBj6a6F~uD^+J+YkVvu&zj8WQ?2|A&rS7FJaU8q8$T`g{6UM@XnCxMw+|bHKpibZo@qSFe`RNxiz3?DfGtmfowC8GH-wzai-LB&g~$ii;)l~}Z38rt)R)#% -zfOKeaWzF+p1fYEzN*5-JW`1|x4iZ_=2tgl;>+=c(aqSw4i^541%Xc)=2v*mY+1T2U -zb6P?W&FYC914mH)&!kB@A_{9OOmaOaa<~vVREBo}8$Q`b6r2wo9+k2L?&4l!rlq*V -z?$I6f-J)8lN($AqS|v>@;>DZ@J0)zFu-U?PRivIe)oOJVKl-Vk -z`8V?MxE86EI*e0L_7F`fI%(U`mni+_zrRGTedAO7D18cKb)Qey=4_36LEX9BS*nc| -z|L4f?SiZxr-+PdUZ#qUcwwzksA~ldilo}CBQERYs{v!7rn#Xh&aCs& -zMC+zIsP8?5*}cT_`AcN|g2N_a>`>=Y)%S-w9D^W7t5Tz0tzoeOyr4D+&*M`X@O(VF -zPMgFeDP^rIY2U<2nmLsoN-J`py;6QUaM{&O`8W{NjBu!DubzBQu>ur1 -z^qgk-5FetgQ6CRX)|CY^ZN#PPSNI3BBYyGF6l+_TD6W5-f9k=*{A(Y%kNz-Yr-<<} -zBpq`8DqY~|uYHZG9pRD`n`Pv~0hN0`OskQQW;;Yl>Sx#>MP)3DYPOOvywiU#e+U&G -z6~PEYaRU}rXK8;-?LqjHx=7py!yaFbTD)`c1eIaNP@EDS`+Ggw5oFr0RwdTF$No9x -zShG^2S*r;TZ!mZu@a%_G7a%kdvg4e`ospcnrm!{UmMg3QQy{-)p`AWq%T71 -zgsx2~%p(Fh8(V8aIixa|iOITM&VKeYTzKI{&VBnyb}pTle9Dn3J!J8ID{+#JjET)y -z$vGt=nDRps`V@g|tJN-KzculdmseyPO=&`~xJlzUlcBpta^7x_dcln6N$A!%$Ur=kd -zF;lZxlR|Tv`r|)KqY)7oW1Zb`s8Y#^%X;Ee+h>AVJ#>6TlX_3OsmVqldxNTnb*A?S -z6J%u+nTU#kSGyzr_QM}xIudD`QG1H|cuX|PD56+nZ1ktMDFIW`s-{(%l`6K33{)d< -z=>6agmP7oil?QK?i} -zTfWBMZtdq-tx9EkLke@|wK}!_4)HL<8O21oK2#n1z63d1)tZhy08ZHsj~L}xTPX@^ -z!+ggk!lHg;*3bNk69{FxVdT@?&Bn`LYVUD)>pOtTH~>~;D1viPs`S%DinnfcHw8K5 -znUjR9x5LUCuh2Po6h=KMSC=+w6gyqO`;L{!fstoSYxQ2zo|;=_7onM={iDsX7iDAjO0VRFNat@yKE6W_=3Zho&?Yp>iX$eCl{zgvnm3Abapfi846( -z>MN|qixf$NqV(Ho)wP%VORgd=y@YiF^pr_uI)kRIm6cZ?ms+Wi)7NK6(o_&* -zV|$Y%u3!O-lm1puzX`P|YSXjqT)n_(r_0{=-A!lzAp}O_xODh3h>g}3QGKejp3KfK -zuAS5BKjqDhcXieoz(?3kWHxbOFrLs-&#tMvH(@=(NhAygLT)J9s@xT-&sKIvK6u^a -z+_rC)sBjFYEX6pbXx8Y=x7o8g;7r<}3RoOt8?!-7wK8IV^&-de^E^_#!&@g#aO&El -z?5QMNIs6b6af^>|#kd3_`8LXCM36@Cz@9qiHio>hyuoa}LbFzfBn}c~0HDER_R1PchBW0W=maFl -z5vQ~(HMQAo-EGopOk>wxB9jtJ=iUw9BX3N-GqYxD -z3kzGNE4C_KL(Pkl_AqS9BS%;>Lw+b(K5ywz%pK3WZw2QDHx@HRRkj!bKTatY?=(x4Q@%l!}&uA{b-q`GjFhw6+~sZ -zFV$92ZhI%mhy*w}+u-Q@G^8m5n`3kU(WJ{Vt4iE=y^>N*E7YnLViN}*2Xc>qvU(ZN -ze<>sTaVjzbU;6SF_*Q!#OPy&p8yzaS1zRv~PBDrTs$1I-$M~OmN-J_yUi*V*tFbROoaV8Q-DGMat5F29X6>7nSNFs@cJ?&w7a* -z1df-E<+om;zWWH3W`q9PvQ*NVIdG6_v*m3v8p?pU*2}0YEbZMed-lX@I(vB%syR?? -zkUz>Pm?}R!8FQ$LVm+gYP2MBJx!z}I)MIRO)KNIhv}i!suDY>QYEu-&7Pv7&9*ctU -z)D-P{N~_4pMc`6ZUMv*A5@Fe(&c&!k&u;S6{wX%6wpe=M8?0Vm!_;09)im -zgv#^^VfC1;*Jyor@#${#eLV13uB@za{^|->S2sC(`8xg4NCZbv;Z?2KgfTItx-_ZP -z7!G?p`R9Max2BJB^zc!#d`w=cQP@I&aoB28ah7zaiz|(B`cu|5jT2h6I({rw&97=| -zgT{cAFg!7Uoou1a`^c4I7#WP -zUT680SD8C}oWb@cV<}HJW_sU&GWI126e4jP3#;62P4UnN9@{Xt!zIxopaUvoT{G3` -z4DQdP8m|ce*P7Wn=-P#HSK4DRvvo%U3G7k3eZX1;F866{Fj78jT|cz7Lw9#O5`5I6E?*G7Rhwf$W_PfYO -zBb~@x -zNy07Equ*ot-~npwX{0apNG|h&S(=SDb2IbYw!o#N1E+;~ur~4np&|?6%W7N`Dpu%v -zB0KK{`vjUG&bQVi1v{fYBReMc_tOs1wwi*K#d^XScx^^kW?QY3Y1T9w_= -z)D*Qrk7SgAF<~Z0XN9$!sx@@diSTX8eG?qF-u1&eP<69vxHLmLXxOV70de5}>SdvC -zl_`&T;6No)uY}Xy#HEE;yecx*wm0E>7W@Kt17RhSbo=so*55hH(GP!;osAU=sfRyi -z@#snU4%S9x8E7l2UgxY-_g$P{6rS;9nce+roTP(doYjepbCHdVGgz$Go`gKL)^kvx -z52F4;;5I075f+sRC`WJ9XP9R`GhZn;I4pV})%pO4U?wkCnsEU%U%z91f3-l-lH)yVo*{UQYg4|ko)EVd&Qw(eq^S#GUklXGQm}ZT=AAN+iKm0m>IqdSl2OnX6 -z|6ZXad0{Catddm@tQM;TtE4utkCgZmdOZVDek_S`g=Mg^%$4V#=Hj_4xDR}Uxx>eJ -ztQd0X&9886<191B9wrz4{g}pZ$a=lX${i14lbH7MHC#C(8o8g9Z#z|OmbrJW`rW-p -zyp5CV%DlTl-4cC|!q?TX@}3w2I*F+kRIT-1=^zcY>X()VS5-JV!RVLr$dR+Uz2V!a -znpp-B0sM^%7wE2RapdS-tX?@M-@uVGckmcQ_$Ww$A6pb+d0&{_g^40@@NIk-CxCSW -ztk>I9o5+)B*ld`hMnB9%f`%YgK|mycWYtH6ZGCo${`g(w7>U-y`3!_kUF5?!6+Zxu -z!a=iQNQ7@hkpus64aIDWlp=Uu|9FF9nxSoq3?dw_tic!=^in+u$3Ai&_x#WYc>b$j -z=Y=P~MK;bzs}<2orLmciz5JGDiL^3H`Oiw3KXq4I4nz4|;$H{HQ#&?D>j7;LVy`_?W6PA<~-OAO;t&fIK= -zM}Ov%q%FhO{`WuPmFHgK+V-|Y^!Ydf88B7QmSjTKLcU#*%VMplkx444Ali5|V)OKA -zmY@12Z~gHf@bqW?n5VkedEvu9!hxUs8LE|(WVpk%E3YybZZjPAIda=0EKPOTe(P(H -zCd{ubb2RJIDROqb@dhq3L5#;#y+vx`38jdRwX6fSSyinB3LIg12-!oYZX{u@G)2Eq -z8K6I9;fVa&Beoih(Q<8TJ6kx3=!^p&IXugmR@l07k!)*7Yj%!}<;w_#s3a^LIRO@- -z)CdJJf)sPJ3qqL?q?6p2d>1FKM^Utz0Pfgb$4@P#AO -zs81tF7}bVGD-~QcwCc -zpH}XRF@mg)h-@%q{n9EMmoKyV=9{douduSTz}n0-!@av0jYm9qWZElKR -z(Sd4>@z@Fy?>TxWE8qGH5%l9EW%1RQg{?}80++;|j}w_AE!nM5`L6N;Sd}k4rObfXcF>;VO}%koNLyo?TYBiw)R< -z%dfu3(#c!tZmv;e8N-cr4m@x_)m9tIioISun4g&wB(b8vFi_e9kKJ|aDfiu90`QR< -zZ+sRo5SZmAbbn#iAG9cC2wcwLB{tP!C~`0?GJ4}7S{fiUj@rPuB`YlhruP*gJ&IEq -zOs%?0@X*tX9V#nBa>W5E(U>$@XKh@iAO$R%)Xtm19pnXak8&VKy#dpm4tIazgIs>+ -z9H+nf4YrORVgBG=ndyshjtIVSK(v{ -zYdc+vGWrrGs|b6$$NKqqa3d==qvg}*q)nw=Xa3M}WQ1dbmz(FNXGHeM3yZLeK145y -z_|P1003-mwTLzG^Rfbfb6#;A^uc2ImCKJN~TGPQPa-iARV@B^HN7fI7H$3pW&@ajP -zJ)OdWf{>C-%;|F|9t#i%u+|zWjb_UBPKH+}It+!2ksu^R(1~Q!Zj_N!8UWrSRLFHy -zIF^ncW@^_Wm)?AbYp=Y*uA5FUb8x@N60t29_eS(Lw&<^IFj!e7-|6D2DYdy-_TBeB -z(pHmRcbm<3F4N8}!+GP^X-!u~y?@rvV=Jj>bM+F)_damK}1fTSAFQccDrwP^~I -z5Ia>4M9vCAOx2oHlPVTvT_*~PmXm?ThB%GiK-orhkccJ=9s!zhQD;!`L;widp_3@; -zXXUg;qo-hj^Vr7D4tY^%_QR0r*T}+R%;lG#XLkQ#wpOpp`|T`W=jaC>lb9h_6lEMg -z%uY=Ua!A$~uZYmxl1#%}pa^m*tyg>5VARBTcQ&sAlv$xf4taV)L9`^X22bu}LG?R6 -z?pg+TC+nm2)O}CozJ}&t0cmG_gcw1BqV=@v;W<=5?VtV>rBi&GhFJFFbObzQ2 -z+4lDjfx$^u!(^%xB=`ZOpCZeJBpjG;Q!q_uw+ -zmF8hdITV5D>lN`+cg;R&AE5E&)vWfC{b{ -z@Un{<5IukB%H(H-_*bb`3I)h8-bDLV4`LM*!+WZ%6X;GIy519cBJm -zMVK6nMyyd#Nve!@b~thGZB!c#K^`LU38K5TMr(Q(X<0LL -zQ7Y!OQCs~ThWS|F2h=<;!Au(?3Xp5Bzf5~+FWc*@;&!rq^&%%f`Y|ev7PiQx-|6-g -z)k;lN#c^!(*>M<|J!~|;_rNLO9Dpg8;`WE{f7Su=exPbI2P!aYKCEz`FuAm*3&I#9 -zgVoJ;R1G^htH?6x6bFD7^ehLYh#Yk(dr+aU07Xf*Q6NCQUu*R$%|?RFEnbEyoX8d- -za;dgOSSbdX6tD5ogAjVKn%Gbk^=yG1XH;t`Q8gh>6R=hy6^r3Wit$reUv^B^G0-0j -z*vtyD{)mIO9AkEIfg&%|oyS@>x300cco>VN7PpDx3Xv&T*%{E!96mn2uvXkh8fi@g -za#gJRF;XCRA=0RaaREq!FsHKLHZEY#f~ZOGm$`}fV5|OELG~1M{PmhreZ1A{(a$oW -zrWQp`9~7mYd*bFU$S~U2A+FZN=c*WIw3il{J8-0=mWG+BDH>JrTNC6^79SrU?}!Yy -zJo50fKmiz!Abh;T^TLmpOksoqWteV06y5-h8iOEk%0xy0tvlM$S;DDCE8vS|(cpfy -z+$-Q3512$OR2z(oh}@O}y!IC0t1DTenVBZ8P+F9`6hB@1c8URp@hB6kdbLqUXG$F; -zXN6x6Dqjh3=T>-K>_nl^Nn6Zt$Ywp|_Iqw&_rZM>d8zR#4WOf8Uj~1wGY`&CP1=a@ -z56A7<6)M((F@i`_l{$^@E>-{t1$-Spc`tOIP&5XN7qE3=BvMZSuWnT#UA0vJN*pv^ -z9C?PxN@6!o*%Dc;yaVO6TfH6n*@y`Iae*U`nsu~8`&_BN~83=pr-Z{oM&~)K~U?gk1Cu_n#4qmt)M9yM-sZhf?C}>({-xC -za9b=fxl0sqgO#uvzTdJbE8XyB5fE -zi_=oEBHs*$+sw}H70YnNv=KQDXuFKPgRAu7Dv`};rd68NhWBmK=TfXE41QCUtBt^_ -zn|qLURu39fb?cS;XgW|ePz5C@3ooqyJJVtUAm!;Z_ -zNl4QwCQW7AdnAi}BYu~9Tq5gcq_qY+n`?}=x7l^)?INs?^PK5ci)OVhh~kmMs&}wH -zs&jFiBx3`w_z#z$BX??M_ntGWmoJ_)k+D{4FM}xsI|Eq#z}~&Yzi;3~=na2DIaDJS -zIID#LJSs>M1@;gX9LppEGnEDgC?d!$SPPR`S3?IC>!4Cg=+t7?hZ$Mi#5#kPb_1mj -z2!f2deVWadgm8{WV|g{ojx;c_D{Ralxj3a#$G -zHohu5Bdl1x<4TRB(WFvu -zlGYo5q7s2armBxWD=OF*J;%o*c)0f4|jg8#hb;&#F_bB -zdrt#z0{}JwED!_BH{J987ruG<@17(wHi~is5-hK*j`zg?>nTUINqi$7(w8&~T-a5(4||fE#D-c@(2NZ$MPs6J6@=1hw$){6W?JM7 -zeKNg~ieD&;q5fWz52Lyo5(jHo#(Q?raE?L)f=UE66yqU|f@-ZrY8rAp28zhAC)?ze -zyv0JZO{-dGY?Yh`!KX~8)bcUrYY!iA}>#M0*IE0bN!;PQpM4LAn -z^jW@ehRg4~{oVCBHm+Ua*nJT%?uN2pEB&`4sY8cnYv)=+OP#SPwj`39R~j^6#?3&0AH0C@uX -z`^o*4C%*|lV;Yl4AoobuJ -z#L~Zw49%!ucQXYO>lG6<7gX+vlbG6cn-|Wn<7O%fI01TUta!1xO=IaGo~PEXk-;u> -zKg<>$D!9>ob6MEz-rLivPd&0-c-iT!t&0Rhka{0|SIQ`;t -ztX{cHTCY>B)tTFOfd0-F&ACOAY8@~0jYb0o-4*ig7L{g8yeGC-R#-WIh6~RNn0(Z4;`bPBuq7%6xQnZm3L8Ur@7e0jA5{jUpQKO5)>>FLKyjaoTMY0 -zkE`mw?Q{;0l*Nd2mePE#5=Y*XK~okg0;@ur0$Z3}lVH#^4jMs@7D<%Ihc=#HHVMzY -zafVNR;9gp_iXh?*A>T6b6QiOdt2KD#+%@i+&KV&{8zQJ!q!IV%Xk$R*SSi>?VLcNo -z?<}l>0-OM$QystO6GB`iwvH>Yqt~oUV3S3Ck8}_%-K|wRa|cPH8sho^42jrdGm`!? -zm#1!_89||LArrmLG%u -zpo26=5Pubw76)tVuC(#OgaQVs4wETAgK-#~KT*uB#M-5f$sGwVT4bhH=&b}Ui7fTn*T2Zc*IpuN -z&2Zw0Pf?M$6hj<~fKF^;*>|=;D0n_5n_XaL&mpPWJLq-kZLX5{x+Egd*EO?bt%->u -zX;-n9cCA*1i|0fb!oUfo8U^2jU5Px|b@=FOpz;SOfbMc_+XH%Eo3*XM3~Idf95<_@&o+t{7>;{{}S`rDg|BG%oA)mDR=%wAEbwDSUPp0TyH%Ao@fA%iMx87!V+1qa&M(QgsJFNWsF8r%63v=(B0)-x1`Ebbl9{)H|k_uIlq;O#(B#^N+&N>?#6BiG_=RtppAR(Le -z+@2%HUb=YZ)Lju25m6lEM^X`50DC9vkrf$Y6!iLa2Rbe`AR{X8LmWY345PxbIn3!7 -zmL!4$Qyq4-8?>qsduQi3v^2w>xoJAh8fgr1R8VPm_{P_tXIJMOv$I1WrCKraF^9vP -z%U4IdbFRq>!~+c -zI=H~X-FGt1g0 -ziO-;)q}-Wp;|41{m)y;)V6T@ZG&fb~->Nc^vb&BjeWhxngEx!R;HNU7CykSlp7sXS -zkhbSve~CB0`6T^*pL(Ywwchh=R3>FhNbA!`JW#L4sNbXBY$2?y=GqnCs_xn~w%4zb -zRBBk8%EvT$@-0A -zM7FRtUOIToXsp_cdO0^k1ug@?>xIZ9Xjng^=d*TiK$jnXwobaZh4Dn$I{r-;O6^oMWDu7@cv1vrVfRAp9&}}4UOUvBp6oRknKi` -z6v%}=LDj43iY`F2wCeS4(FInzBQ7t_(}@h-!ZDSARW*F*KB2DX -z$oT-16`@r8QgysH%sP$mL@7UdKWSgc44w}M-xb3DigPc&LVaP8cB@4`E)Wz?60o^s -z(=SFV7)I0*!^Y{av6}mgl?hQ?!^9QhYC|TdYP}(VZCnZ!QSr;t>u!1@qd07uG!a(K -zjs|45U}oJl_f#DLDH9wh9aycHN#-MBN{Yg -zEu%DMH#x7r^ekU1Zf5u47KgSj(7Se-tH;|_q-7`AiE(N4-wJa8w+_wS`ztqPw%E((U(NWF#2YmAJVEB$o} -zW~WD@&dhV~o%2}R<>cZtTYW1vLOAywsvECiNYa@hPMS>5-Nwey@UK1*v9wqt -z2C{6(a5y9z4(M)gv$3(x`n7AEKX-{2U%vt?tL(jFj#LtKj7W^d#dYir4X45(61jvO -z3gdGo4aWlpnIH$6(Ia$O2SPFi;@7k?DtL5vonQRuLrhK0GR$%Yqa2^t$QW-*M%|dx -z7)*>5wQn@I_?54-cI_%h_s;RwsjF-c;lqy{lA?>f-iS1Tt?fSD!I-z-a{R=H?&OYk -z!FXen_R -z;`aUQ87^a12K<++Eq>>h`xzGL;FJ)~^bDn(t60_Y? -z)XW%DZ9}YHQ&>Pk4GKm(+f460$eA}^XZ6x~9{$wNQt!-A6l0n5mS5SBQ^)yuL-H+r#t*m{CFZ5C4oywUoK-9cGg;jhPtn-t1>c -zL7hR)`gYERe!@o|o96C&4wGjE&Kj1t_weRQO2r`jc|6Wpy7L|`q!pfg<0DK0T -zu`i^F<;t5cuzBeM?S(~JGjr6Y+H~d@B_FM*%?k^G>$~i#s@R8(`}&N8;kL4t=Z_g} -zZ*l3ZSE+TD$p-)?m$%PCQfmT8SQK_ -zv-==#eDyONzWV`=+<70ah+Jfgq~2_=F2QF5>hS|0NCLch$HO1`+S6bB2R{*;xX7|$ -z($5BA0qD|&UfFUtF&9;0LpQg~Cu2VS(TACuo?|fR%ZsRa#UOlTRAB5XWS23OA?csI -zgnRWA!zgEUeT#GF-r@7Rk1|tj&|O_&=%CV^qSqf%ucnL!8JpW9&aS8Yjr(W$(B1n* -z*o%hSbfbBGe?3fkOt9#7JP2Ac@+S(TT_8ep9)N7-T8L+?YUb$ -zNNUZKHCeVL3u6m|ZQ_sshG$HMmq&m+0|{h+gn$!B7#uJd9$_@GF<@K5mMvQzWJ|57 -zTVv02_nq&pxz4cne%80D)>*asIq@Te$cA&*>AH2Rx`uQ1cfRTW{r^rtjj8DpwVQ0c -z=?yHMJHwX!*YL`kcFy=$-SN6dfg=O&@pTwTw$k6ZYvlJ2eoB2unnt=Eb%u;1gN!>qO;vd3>9T~@0)I6c50eVr-wA)oThK;pnGVujOrXibAEabZ(Sx7{JKIlO|${@EOP4eQ+wfAEEKY`FeP^2s8~ -zFXL1mFbo*eO)q6MU*)Df*YV0pzH`r<1`!bHWK;;F1>V!mGc+a -za_tR_Z`c4>LDV`;#s{nzGGwxu@gc6n0oQM<)uc4Fk+iu^@u~w9Cb!`E7A=Jvk5YNE -z?}^*w@;*7!BDSOCb3R%FCWA29z86s-IaL~4KK-#Tvgw*}>JyX9O^;Caz?Y~Xre3d0 -zIXATm)z629$|%+f3_gv!csj@W@(R6XgVIP%p7_1H%D)HMn*VwY!~g&fj?Zm5bn57H -z2LyWJoF4E~4Mr-nP&Df(gCfvM7V%il=bwGmI5yAD(A7Rcu7p}`VuJ|h*YVn?(e;z) -zm6OnDkhD{d%qKj2BH$UFCubV?X+mgHs*M({bw@Wg#5hD~(xl{a0j>2m);do10^YPu -zVY;jM;buCkYy8Ub5x)DXGC3Uq;OPXM!P8dUyCxwFoRk$0Y^?F@>Jr@~rI63CNe(AO -zam^^^H&34Djw^RjD?(~LtkZN%j!rttLeDVfg#-j_EF}c~EIre~xR^vGINuJ2e#B!g -zES=(}s~(_ODiOt9UVP$dzVIiXU~121(m3gR8J`sJ@&Schh%+WbR1LAh46eQ~&@T*& -zRp~gl*B5A6D|n{v$_bwT^f{(??qkF5y{~XU;joxKa8eEPR%I)v4<8yL+SQ7v*A)fX -zwAEnl?|vV6;FebKb2)TBzqFBKsg-ckrZTU;b~C^Du{x!~NTz>?7>9&cQ5=Ial*&a; -zzId902QQM_Hbbs9!c;jRNZaHztaM{8F4rmL1B^*A7OXY+zLbnX>B0E4d~a)FR?nTI -z+gP`ykug0rxBU?C5CCAlegnxKi{AZ~JAVDg-*@=^N{fN$Y-9n38C^38F~JR`hH~ih -z<8Qr_jpHNq2=Jdff;)5+Rb9Z_7vQ(fV=f${z1n8ITi{ZX=f#H4Q;jNlU$KQqV%KJz -z(lyXc6j9gF>U3ooA4MO76A6;D9eZpm1#GQ#86DezH57ub5kooqXBJ*Dc1@EptM6K>>; -zbi)%>*c{eK!;Zlsh`U`HtE>3NqUYwQ%*@j5)WvXo=fpU*O$p0BvF)%NYyRTd4vLtZ -z?w~0Q;kv9feQcYSkooY_$FO4~obrm?JXN6@K+ae~tyo`K>67K^p^3&gO64Nx=kh3F -zm{f?76w2hP6)v7QV#nvU>7RV-ZNCmg!{OD}Zy*+63O+nKHT5HFiwirnQr23h#aj%C -z$ODkgFN?Tl!jIg43lsT(wqGLm(kaw`{t3)YHR6dX>yMo0(xr$qW}LH3v#diBe6%sl -z1hIq_jX0s%>0y?`EkvxUU3`_NZQmMkZ -z7cYt~#MoF!oTM4;j7%lMNTtS!)AJO|ihL+dPa@NI_eySs#c`$8=8KIE-?4WKsf|g= -z4MMMsYtr_6Lt&1zm*S}aYn_A^z7DX)BF|1eNpP2sDrZy6cj*%v*=#4L&KFZ1G4l%p)N}^5|v${mJHcA)37@;PH6b>aB_b6rvC>9 -z5&%p0f6v?hNCAM&*!YHgM@9##HRqZg-hJDC_G}oVjYqKFA$|XUV(GqJoXA)B%vTzG -zTHb+X4UX+s0l{m1`80TZ07-{q(Q#zSX^GA5gF>;m^d{U>!>$kdZ{K!Qqr!W -z+m3LBa6tamXFH7KD%eazCMpK&708#ziBl!U>M&fhYn%(m&#_duQth(YB7^>fo9{zj -zY3cM^ja0A(@D|_GthYKm)@pFW#xYWxlHwtRX{aIA=T?%Vn>c*u;hB)g_Gp+TF1Ajw -z5}&7@EYnO^N&GJJYx68UcbKO?^*N58S|L}+;jENS1&P}2Mqs7fIV_>(vI5EW&6_CX -zOPsv0%>2qaonC~=yh%nHGc+KSkst)?De6*$>&DFOy_H8E{1cYH@;ORLkB;)BgWXxW -zNa?d5Wb2!Mh#$CNj{LcoNwm!8h!D-jE3Tw<;wcJ~qXe}H;v^woEhF5?XjCpop-@1F -zik?mcAUatMC>H~qB`Xf}yY#8G)K}V^I@RKY??WlahFXb&a?&#BwYyxLUn4K_1q`NE -zhdBad2Fb(d0Mo29=wexG{jgA8I{1YT{~Ba#{4Z-D4)B2U-}w*T_5ME2%E$?VVRsL* -zke0eV-g@H|Qkt|u0kgc!v6Bz-*w|L)&o85GL{&SEA9|7Fr_b@iv6KAXpZ_^WPMsEm -zYV{%-J;%awn?~1w0R0?E*U*b&a;3b?3Istw+>Nk_A$1<}iDTDnj*IJ-PIsAnXz&Ar -zrz253y?3w2m!CL6oM>`^?su4lx`zuFS9$W_OK9H{?~;gNSR7!CmBsq>g-dLj8D*>( -z(lr_VQASW;>7)Uz#KTA9n~?Qrja74zM!X^+nX^hrq;o-mGv}5_UOY~G?krz^=?t?o -zV|2PbG2SGJCCqBKJJPgt8Qc93qB=?p_ug|W-~aa?;0M3^0q%Lt^-PVA%EENRz{4!z -z7Q;7)9>!Wq&~)ff)3zyzi`cMZ7y9v!@}}btvbD2H(+`MF9%b~l2cWiz+0DDTBezU= -z^l6ONL`jM+*VsB9|Ie-?!koge#875M9UO*JZ#4C$vtwr>5 -z*B$r2A2<(qfcwiENMSnbR{7G&C8j27q}Iqh&C1$3>+Q~0_aJhfu`*&-5dnv -zkPX`LV0j1s^{JEWJMs_{QHK>TPq8*eE}y4k6qT8++)!BM#G$8IY&DtLe}G`eYe;>K -zm&;)iL+AzgL7t#mk&vrcDu_YoVww8HIHj=>MCD0oxzby-TtGZ8PuvSwaaE4@I#3AM -zJXvAX*W{EVjuMs@n_w+jxGzaK*`~67zcIKVPt@t!?)r)!6e}11@W=k%Z+@-P?$@8B -zU!IFx`1W^y*9ZUW`+nu81fS)c1^`Ds@Ht&?@YZYg@QydUhV}I|4n22-<40cL@WX#f -z8q5;-9h|R-OhW3Unj^foofrYES5mU!Z^muNKFlGqu8c)B=FnVqPTZ?<{tk*C>n?QS-28j}gg -z4Kw37SHq;K0NzsP=p_a~Lau{n&a-{%W=4uRdPxtZRmPU?G{!+AE?}KxFW?kw@v_AD -zgd8BI?Z+8)j#OoUYaGaQM0BIe7SGCTkU;5>jLu11@!99A4Mp*PXz?+o_?YpfVy7 -zZuG2SuX6lOBVh3ppWsa!uH&NbeOXy7fF&}9B5|*@|~`Axez;^j~p1qT*0z^Okn|omF8X;D7vb|mMZMnHi52| -z!5TJi7-My%NwHdjj4e^HU)6GnTel{>bm%$GpPOdy{;iBwLg7ym!Z_*hmZ{|{l2|V{ -zn|!60@-43*RMUpM4%yHU7AMWgBoQP4&U*Ar3#(#sxdLa;E^_FJ7uZ=1xoW1!=oLGK -zspFx8hv=mqBb73VHKb8YzEG56fH41QABP -z`ty(R!i5E{n3>GxOa`D3143Y69l^Sl&VR>Q+7(T?;GsjwY4DY%*@-#eQXX2|%w6Z6 -z=Wb8YDP4<}Sp|WYi&wt(s(rltm7~m0%#uHMl#$!-BMJh>$|Yeq419%inihFBbe7q_ -z@FE-5k5HtAD!mE36h|x}U)hg|9ki1!hfYUd{Vs>e&6Jp~6&WuC6qF~usnyjEy<*=UzfwE1_NzbjOZ>`Df>Pp^|7r{*n-y99sqgzcKmX6( -z_bb1ul`;b#=E%to%f?t%d#`9di~nG1&1Y;31HAJ -ztF)xX$(UsnCy+WK=VVS`PhcQ0%uJTR8aXf~O0m{T$g*NXZk|b~PK<#-%Tp#cOmO!2 -z1={T{X0G+{~2lcBN=?I3jWsmEqp`C)slLGvty6sVz~H@jTEfFUO^ub~9BoPx2&_ -zMv;HRo8I;FpFZ@36~M>26!@z$kgU^KgAdN`*!g{zjvu=|ABN`0(u((k_uh@Ybdu$V -zeu1giej7=Ei)vzT!__RQOGPx -zH^Os|DscCz?Xv503a&LVW3BhzD?K7EOOd$);kWHTLL`bqfsSe3DwVR7{WFMjzV -zrZh%wB;@Mi6k)L_pMPS*Ch~I|NIh^~MZ83y2D9l33I0@pVyG|*)0&;SYA0VSUCSqGpj_klh%A^k)2kiSZG} -zOkbwjSdzprG;w0VrSdpBb%ZTPtYIzh7%hi=DLBv?Tw+Ok34(ERJ`i)&M2==7!D*ii -z>8p{xLSmTPFvrd(kI_(&7OF_Nl%_1@itMy49=P~vyfa@U@h9koW8e&`IDwLRjx^J` -zwBnpNa<0Wko~<)Gkt0_vGg_@skm5~O1XVlTHaf7Fq(71><#sr|95Gc51l}}R^62y| -zF&-Beo91=5?e!1be$!L`;h+Aa5Aw_Z5WoQZ)f!0VMWUbn_Ba0PAN&s|{(P<5o0ISq)}-5Y>6hdSSxWTrf0Dh8CKFs8>_(O -zb2vntQQ*{RFBMGG3L*Q(p-?HxM46Y!T)b#&jEz-szPDz{H- -zip3cmO8N{Y4(N6&_?{v$hQlY%GCf)tH2B2Bq3JWSYce?iM<&bRGAdZD#j^}%kPI(e{H2oXZmu-2IoQ0b*NOa9$HEje;{Tnw-|7}gv2-z7TOUSz$5QN%UG-e+%P?> -zGlqPj%uKup-YW8Kgqi0f8_>}YIEfAMor*@fV&1j+zCfq{dM%NYCmxSTo`DCYYjM!Q^RyT9-btswqG*EA(b&v1U3q< -z0}&3dAf;}B^y`73S)9sM_rzL`TercL8$6ynok(>qwLm7&I;4>fnu%HsGrpAz`8*Y; -z>3Q&;_E%v3D66(Y-cK>|`~Yo%LX`o8elXKt8ZGnm$#p(_c!gafKF5kB?wfM#_Aaqt -zG>fGx8J#LIKBbA%72+hqph?pPCh9V?ah9`}T2!x`;K5HmO{15xao1Gp($sG-@zFi- -zF~G}=<9~^PWZU;0*!kWsJrv$ET@9(@V10A)Awy -zljv(Oee4jap<@i4N}hsrKoKuvVuP<>#RgnaaTIeJ{fdDYGsF%k`G&F3e|_Ts5uncq -zMjZedA~uo9Mhj9<@TnF9MoUE;WDC(*GMXKEKMaZi(|aOiT}wu(ugMi5HOQFp!K266 -zG**?10FqxImABNU44P#Ihp_-Kn3+*z1ku(GMEf-kGQM0lkT-S%1zHJjwX%3U3q3^| -zIC3Qq3AsRajHT1HLe%}X>jEaqj%vw+={9&i1O>rj*^FY9OhH#MQ7Q6NP@}9g3to=@ -zGdan4<7J*(cZ8uOwgQ~Qk0L^U6q6spVL^LRB@C6L5jj47Xc3ZxW4QwFoDR8m!m!$m -z*cY7Q#nV1dzF4Q|$8;kDqy&BmIa;32uRM5~nW9gvTw=N1!S_9Taem#eR0@qJ4*lMb -z@t52*|9`h^^6KcX{@4%y`<%8^re|$)WIyZc4LmInXuN)ROTwqfkhEiLF9iz%rEpTh -zM3U4rl`tbtj3nvOsB@N4FOWL@K(R;?%_PAnkF-=^Q!$}9F)1h3GwBfZXBJLnA}@)9 -z^`4_0*}e$B>My>5#Bm0=v~u;e0=kTnR6bXfByzu-Iy$MPn;5wto0LJL3$ob^Kk!gM -zd+`F5aFw&m=Q!Pnq%1y=V>ZUhlk=qlqR8tBf0pDESn1}AF$n}EHL|;m^9me;?<+f* -zBm*e$0!6cFSZ-P(4XUcqp33?v7F=w((1vR^dhDF^gau!txOS#U+bV*5LFC{V7=`N_ -zcmIA6_$-D+>NdwN7ja|!9A_4LQeiSq@)f*9Q(W(%ixaqFN&b%)1c+z%G>0#=c8uuk%R=F%FF~eZd_rh)5Vz>-ycRCV;onE=O}nc(qAfsTx_NG9rxeB&;P|0Rk=jZmm<_R78e(9RK&FNz=;=(+!^JwDHZpXCh9Xib}NjL5{ -z!^9}W%Lu#~qgC^e+_u7Ls7sHddbB>z7b_yW(c -z*3oLVSiHD^NgeB*7LPr5f~^xHB&q4Yrjs0HAT_5zzHg8ZWC1BGm=r4|U5n%u#(^=| -z*x)3GvcuBOgRf3shrS*Q0I=r=tQ8Di*~7X_z#n5+Y{K=Ein+0nR6;mSnmVqV$@2%# -zoZ)O7P%9NkEr@YgJ8-)hw#(&sDh;{co*`YmK)vhm0#Bae8wlEld@sR_O$$NBKpw;M -zHH+<(=g+r^*IQgP0srR~#qQCBp7JSen3aOfmez4@D0XR>0AG%~mf07%74N1&yr(2- -z#z*oEUzIcgCC(hDcZHagcp$AS&J^>CB89|yZJI&^Diqmt784ZO;YpoM;akb6DdY83!Bo!uW-GJp#`VxWX2?dcDkem=D -zyU=B-epr+mTAhe<3+o&`wZNstRe?B+%}$V?p5;TIJC5-}0*^tcA~ZD0S28sh_?{T2 -z7=T4O_+h>v-Rn?{1ti(FCX?ni29u<+J7WMhB!-hDRz!xXqXj0)P_25IzFr@S-s!@4 -zPI2!IlWdr&F)>yhgsK7#Y}GH(@yarD;|5en!swV`!mKm262+dJ&(7|PEUYK^{y@G> -z;ddORMi)Cij+vY5=SU7=xJezSR}1{j%-3ENsOMY=FQK&_uc<2V@k}nzm^;XNC6-Cd{`X&xBklcpE|H@ -zI$c;+ekCy!Y{FWzAxwBi`xs*ew@=T3r!d!)1G7C|R4p*_x8%iu3FeHP;AQutoGDZp>)x1Yy -z1=mEBSUMep>34TEG9=aKkkv8-76#dz1Son@!fLZe6iG5nKJ=L!uTUxFQ2p}t7oR%I -zp@oRsc2$XzOs&;eE5r=-PM72B4X&t-P$?GBAl_nNsJABA -zHIFoMl-fpS?@i4|>x>5q>m-yrvIzg+&I)7Y9Nj1;9|qJ$O02FmY_U*<9Wvb+HvdAyhBUW1}^NV%p -z2K?j|4R-I`PFkqZSy{!+FW|4NKrYXmpAa?tOpHf^5$Tpds-8BDa9SCq@Mo@k+%das^uc_oFV@)5{>FCP=N{Cd>2UH3$sC1=PnwO-~GwI8PYBFs;`3J#tm5SlO -zqsX6)m3{=i2TSW+K6z-7>$lWM%mAK(RM)~>z~Wk+H{E?3-(D$m@bC*9J9|+=$%#st -zQXz*JtF;U^>4T6-CR=MW7Iz5`#qgkO@z+6j!R3v3?~G|136<8GjvF@wY@aC-Cq_Et -z($y{m^r9S{)R0$2ieqEAfi&Epzcx_)N)uLEF?M{CvEDjD=%&X}4*Ud4T~B&eYVRgg -zsf2YhNF|Nkd+%pT1#Im>$p3 -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 -z#^jBaFr(ya^5qdhL$P)gp*2>fR2=1m+seV&<# -zF)4qK$nzJtdfy(fhE8nw(i6`zGn?;AaD#)4uHC?e<&?Yb8KGM8rMDvC7i8M>zE85g -zPGRTOly!_tdf){NG*XZoEltU@agl=Ok#u{c%Ev>|UGEWxijB!Ke^i@;(FeHq{O|C& -zOFM|K3MpvlSWW1qTrmzd>fv`<7-=Bp(I{LmMx_yjpv_{uf!{cF1#37eevh8Zr}@AJ -zV;ipi)bIVvZQslATH_ndgFsf<>fQII2j2G5(X*egw_3i!B@>fle8;`7HIlN&ycDDs6Zly(A3F!9bRnh=09Ax -ziSw>Z%`;dppSU#kYjZa|`bR%|;B7z;vWnF=q6Zml2JoD74dAVZp84`a$BrJqDW4Bh -zXPy5FMbOh3dqVXVy#&k#+ihB$`Pr(oM=hK1S~B>OThaMI+Mje4LxmYn0} -zk&rvLjPQY@t6&tXEz5Mi!zWL!aii!@Lf1NK#eglzIn>!_3H=FDuONoyk_Z#6Garre -zMB^$xmu@Dc%~S>2uAJKLN-(zZs>grlC$_v5XhH@f`9?Po$jZN~2d=&K%?A%Y{m|nN -zAG{9jC8tlF4bGjZlNLM*P6^jl+O*_+MLyIlwBf*1AliY-IBc;*(K%uGHkni@j$sdx -z;Y_}U#-1DY9G7SAnUP%g6&%?!Z8-d4y_o{R~&d7V#JFhPspYQvm;_zs>fVN6tjy< -zxQQC$lSPg-V_K)zu_(cb6^cbJoH@sZ&pg4K{@&dHXiv#`d~tmoUAdKVzK9nWH;aKlR{mXl_j~^F{Uf{f -ze{8A{+~g-V^>dydTTx5J4-_(OrWI>Z!uj4SwD+N$q{OS>>J3I)EeJGNH-L6zwlVaN -z`|pOSj^R65#Y$c7TC$hS1Tlxy<0Vg#zHL+uu{g$xc~U$+UA}^P*<)`Y{P>b* -zEo&dubd08#m<$ZfW`ap{TJqCicH1pq`Q`7=zXe$OTE_8>nuGj*8i{jmasBA?Z`?RK -z_Ndphz7rJ!Md}2(OJw1AGo|YS{{F2+c8+VA226EGZR0d!6%Wr>_^<392!x^^Yg?x< -z29nefC(wIkj~%_Zf15a>M2H&XIcW;nfSf{J%M*1hAwCN{5Ml-&xeWs)ga`7NKlls- -zlr0!51lhdiz$Q+tIC=c^sZ$g}j|bj#5AXZ&|ARNZ;Vzy(e1eBRf0*;D4Z7V}uvgVe -zne!JHh~q?>i`JQeF1X}2v$NB*d;JMSp6YwaqECkf!7~`OB9KH1( -zjiiS~IptJp(j=I>{WZ@8tRe`?&7v{ajjD;DsY6dHV1%-uv^v&ztYu -z$2C`7!KMwG=*hE`ZAffV8P`R;h6M-o)pm7k=(IKEG0o;lA2nJe -zK~t2+GvgR4W%~$`cRz4NGc0a{HOx2Rv^H#SH6RoLA+$(PXwWex@HzY3vn)3(?5HtW -z@foicCDdF^6st~)q+X+E#GA<|fzqthd!$%bD+P9bX+601TkrgXpSXhW1EQ}**YnM6 -zAdt-p_r7rGbKmvbj~qVr=*Rx>pPRVH>Uz$!g0km%ikuFlvF2+JEo8`!qVmuV+9pBE -z3I~ftIBX%C+dvFrpwusmJ=B4OV-*K7F^HjKEqPC16B)G)Ssbr$SY@aa<6!|ufMvE{ -zmOh^vF{s!mPDU}y#!@?HcCg#+T7{WX$n02=k#ZGbf-#D=fvQeK3&vNl8oly+Kqs4AOH#{)LB$Uw -z?D5fr#;1(O;qEHW_UgPfw@ENZR)I2o3L6Q+!P!2#R)dd6&S?OCr*Vweh12Y-OtI=k -zDC=Z^=`-tRIh}NbB-!G~GIxc+Qq-Dv=67Q~N8$uY%rj|+^R#(KZj2=7SaK1C(U5{y -ze4|d=^luRC)ZkNTb&s8&; -zjiVkmU%<v -z{L4pCcqD<(%t(Q)Gvm@viBm^A(R32SrZDNx>nrYdiM_a -zuM!D^`|laY-vk56B3wn_9KZAapZ>{nzx`7m`uz=lWoBf&lz583Xp6FnT;wqx=Q(Y9 -z?01g+<1;MfBb)}T!&$ij2ihnx94(DPDEEAbolM?s3v0wBnTsYL`}m>8YigV!8?&{u~#>F8Q=Ti-^xX^I6U>Kf~s^ef_Jp -z6Ox6XTtx6;rbp6CNFwR=2o(@o^W_&$@JEk5%MBYRxZ%KF_Fl1zn{PP44cA=Bg$G{G -z(}!Q;&mTR+Xh$2EoHo9x1SX@dD>g&r2U?EphDMI4Zw)5{JXF -zZZtWUQoy3|h%Fpi?I!E(PLQvT&Hwsc8@>y81PC0Y|HBUX-w*>Cgun^lJ9vbD^PM*@ -zescM@o<9B5>vGPMGMCX#$AKl6DwbT2tBbDy79-aD2oFW7Ey`sQezLOVyo+Z+J2>C1 -zGi^i4#gO@+i?#}_p=&I4n-HL3D6CLK*08}Zu&+4DrF@H~Z!lIfuOp7>i1(^Fo|{;v -z5o&6I$L~G)QU1$U{u4Lc@>*OXaW>9aoHgQgppO)A1~2r8qlkL5F2r%;l{{0`BAqDW -zk01ULy@wvwbzUg(m@pZ4^(MP|`@BZGG*?r|0#)vl~i4662!gAuX -zv6APujS;0VA0S__Y7YkTG6tfa39S9HC -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 -zM%R5+syMvKSZb|m>S>9=*U(oBd?%w -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 +literal 60263 +zcmV(`K-0g8P)Y*r8#^{v7RGOw+<`?HiOt~CL5CnJ^SQAEB(j^RSGP!ko)~GLLNiWTk +zG;U0cj?UidmUo#813Q;_oi!roi^^|B%v`LpV8ia>eQ$lu#_xaIPc(3vIri8&otc@@ +z$LH^RGya^|1msVLfzKP>HK*M4rjCI)k_tkCPr^On)?~8(2`U%NP~~`6ci}_58-cuNTiV=Rf}Or)LbryWaIKJ2NvS@CCmK +z%O)UyX~@b1G5|Ln0%HEXci+~y@PgfU_{z2u0`IQ?{)%4xr39%o8y&jc7#kSUI3{T~ +z5gRdD9`)67O}%%B2%rMs)r)$i(W*-iB@Bxog3Ee@fn{=f+bSTPo3!-N`)*-=?`c?5H>ylw$`k&Wtbl;3kK!zsC +z)YO!me)`7QR%9k>&2ntX*3S6eg^Q;i_1$M2|AX@zho1U_t-(1#M(jP_dqhMV%N^hC +zC2Flf1nDfyNl>av(S(eTPKtL95kLkeu_|enGFzXcP#yshvLvQh449bO%F^N@NgQL0 +zAq)Z*7UtPDHp(q;e@`lvDp{7Ph@hY#D)eu%1`fi3k)oWZsy{*aJl=j`sxmjT0!FeS +z$37qImty(J;eR?d0m-%bvBw@O2TX>grO}Um>xWnV#a_ME4X!qQ=8mc0*f<;y^ygnC +z{rp3D(2q{k?>E&=NG482L=aVxMzc#2Cy0QEL9&!msfsvHF({(yK^4U#03vu*K$xB1 +zi$*1aLXo7~p;{|bE|*zaSjejo>hu1EsKEEX^(C%#jq7vW8{G!bd<(zg>m6&fn{BCD2A1K9cy5d>zn}Ga}Rf|Ch_4?O;zIaKed+MQE +ztJl5U(PO85?mKfQT>es3E`QWGTHb>E<}2=3?|ziN;er#)yO%;aOj1cPsQ094O5BY} +zQ%BP4A|gbEGN@p@%X3`P%df>)oGRV}qF@X*ig0OyLoqhQB{56OJh`oJcK_S+P@TXO8eP%DCI}0`UNrmgY#MRrN`gl^xp9I +zwF$_7X{@c}3>wy#zTtDniE%dwFt=#;vg1#>>@<64oA@O4*ExBMH{*w!=6613KJxN= +zalhsb*ls<$Ow4jOrQ2%JYj^0yDXL(sMMbCvC90(|I&hj^yKSungv>iKm(fWT^1 +zSq_B_Ba993su*j~%+XrhN3}MAEtXL4uwjT%$B(}J5gzg6J?y^J(YXx62!ktE4PZd}B}acO=-bfX1NXlD89y16VEi74`wXeF(Y~OvDB;WifeEODrxpO_9_Ny8NpHXkM>Gcv42i90@ +z7@!JXVXRQ55EKAEXfyypS@j#4b9fwax_=A@2x1IQJuXYoG{qRfXBn;eO9)3NvDOe4 +zibTa~4vrDa;_Ux1JvPD}@Agm%g$U;yi2OlDejg_y1E?sf;QMKIpnF|~&nfPWy5v4~ +z-}_!O2H3M_Pk6Vx-7N!j6OjJ`fAPXse`Y!=_#3Lq-GIvp0;(8evUV>uS2}j9*}rO( +z5OU&Wwlg;K5qjUaH@^z5&6j?>z)OEtpin5{5o}OEMDQ*{RY8Q2s7z!7k~GF=4zCXH +zJqmcA;hiHal`-WaaWBp*2au1EblPZ^P#YPgJUT&8ETS$$ohOYGvNR=WF5*RyLTM#u +zoN~FwS3mR?9{iZ+aP)DPCGPc?e$|75h^zynf2gns{ajETfJQ;V3wT9?^Nki!5_S(6pk2+~a)r=Bp) +zSARLr@!P9hwfR}T|B*-Ww%#px(M$)#aJib0B`K=p6Cb2M388EPG|ln~VQhd6!dx;L +zYY?$(Uo^2#=*GR=w?IA+>K$T3%9SdUTehrv6z8#CA@g~TcZ&33a#@UtA~NH-{H3qT +zQO6ud6b2}YF*cWRMhsb&;#`J^05ViXhF}m79Uy4!0bTFn0Ml=P{zg^b; +z?fuWFD4T%f`xomKhQDwtxbXp%}mj21N-(=_H;jTz)t4g+FD-%q#f% +zZyMa8eiTP{+DxTgk~E{8dQ>%Uh{d}UTt;CBFFIM%9+SJVp>=1w5n6h)M*KSK=bQbI7QI0@;bDc30dgt7M5 +zc<~ow_GAZh#l}7wtu9>!?*;IvvU-M3dK7I)xmY9ULqQ)3^&S9YY%aH2-6p-Xmz(%< +zrAB#V6h-MZ8~8LO3L^?pl!N0lk1?kIRu!DW>R*0a(fs*Nr$JPyg23!WzvaY}&Z5z* +zGdDj+yVK?SzxXjHUhWE!$7B^fjLHv*Y-U7THqY$6TUVE4WN?&Vxv9ge6NEsf-a7DyRV7v+*4&A{G&$)mf(1 +zUB>PQpj4w+sS*|cA>&h4ElEvSw2i~+h=mR$a`4?7=m%ZuJHxlG=3YTFuGTG3~L*iSoD6xc0 +zXq~Gx-^_Q;Tjm*;?B<}PL$a_)Lj{A9Ws39K*A_}7hH7ODF#+nc1Ax;$9IB4x#w>|< +zl&a%Ir3y9-$l{o|xl9lSxmi~XA`liMR0Q=7MF^ZnoJR{mUjlhnIdo{g5oz;kgt16q +zadAr4O^KqABuVgzr`K7ce#x)ddhBI!QHZZEbCVn1mTlX2<&sVY%)1O%3Dz9Dq6n*h +zt3c>_uC9BP{zIPC7W7B>fmi>;d*AMy_x+Qr$tECujq7p){`yZIZH;-h3fJjR(hS7P +zkSiT@q(Q%OjO#L&TY57eoQZi&dk2?s4KAK<66@MeKs?^Bc@C&VWr{0J(f(On0P<_~ +z+V=~NdVL?ZP@+&9#{?Dxl2#MV5{k8vRk#F9U=VBau~0y@Ki=@Fk^!IL;}|IxF(L@7 +zNlCj$b72XrFg87zKi6GsV~FsQGJD<(+mAZ|f`G+~&gYgly$d@J-JL^%$cCyKtRMpr +z3}k@F(9$))a32)ZfdmSO>W7{8553PF&i&covD*aXpHVg5_~}Q0JQ|@2H~;}VAg6}_ +z0fUkfQqwjkHr~p+f70Q@ovrLlmN{>syS{>yIln5aP{bG_6HzKw07X<#BVhWH!z(C= +zfo5|aDO3o{6#!I~wA&&KLTsr7-h&Yc%mxtrzKI9){RV(`+eoRrVH}JhX|(7pEK?Y( +zQXU%tzu{5p7tLdWBDI4?n7!y1Oz%7ltYv=RUT$>Fn{nvjN0B6}kbthjK5Wt%e5h~e +z`NIZ&=Rj0?~%Ulh~qX= +zC_)(J&xr_Gw?|Nn&>%q6V~pTM5EKDGhK#WePSPAs?KUxmG8h3>#9HE|Wjc#>D$`R$ +z)iUZFtaUYlW}c9b#A6o4d +zfIno~hv3@imjOXP<;%wDL+^Qqv%mhIJ_m8 +zX|qjtVS&olEkxBy4zwUSd?Er~kPMS9vd~US`fbV<4llLFHm%j1S4}~YN|CsJSwwo2?@361& +zk~e+wFoW3xayFm>9^BKRcc+uERz14U){|KzOfo +zlPtfk)<$rxW^S-0Ea2B<$N+@mA=CcGU7>`>V2lM3j7t$~@Bjf=BM27fHzu6u0Kh1! +z!OEMC@Ahcz-Ai$LnlOhWTZLorJIK3gp5NKKkDyv3Dn?|TCSj$94MIBY +zCI?ljTz{pKpo;TrtKb}H#E~_eK?LQG?vWrvOUR&X)Jt`MMHN;3lp4MJeQta1Z~xu* +zP0YXXuWfZd94~#-r*3Q1d<*1kflL4fyoM-$5DxlqETx9y>)+zA_}#qvydxR$F$>Er +z66cY8VjJSr=M%U#I*#vluwelTMVxpr18}J15M^YjW(4I59td(nu851*;gIP6*?S8h +zNpd9b_vfyNgu>?Op=CH;{Fs@UnVI?fj@RfhE*;;%G2b%HF*7X9&e7uR&NLMyMM(13 +z8Hy*9g~e?5*$o_Jn_DO%RqCpgyWIWnkb-lHQ-=YDK}HbrsXOpIKvam$ifS@X@2X<0 +zXYtWTnO(d{y|+gU0ZaiQ8bqvTZpj=wzjT4HI_b0!uIe29;63{XXZXM`J;D!s_uEtC +z-_@99!9@h5bkTc~o}e6z>zMqWt?$3YyVo_cT5!DaI1xk~ +zi*=w4k;8*C#Pt#b+%~Fh5fja6C1!$Yq?#*LEuG`t`p`kQ(ORroqg4fL->axP;m}rr81>!`ez~BU +z?cg_SFzbAed!GFQ-uRAh;~j7L7JS=M_5T+Xv5!(?4h6-YXb;BkON9=26FDy;4{rCE +zK9zpE_rGak-3Cha+An|0vvo4L&ye2_#KO-`j0#8rwFrV4lsn>7ShvQ$+weF4)Sdj` +z8^4bK{B0lMQ_j|W@Ds;a1VmYE0-L7gVDA9MST9eRo;{y}f}#k5BFXWt!A%50B#IJZ +zL`Z2T&FPZqUP6;}ULgu%B;g2#4~7Cz*zNtgR-&mY#LW^nona!VIyP6X6IKnAyDwwG +zBY>1>#L%A^aAb3IjrrjP);F$E)iu>@jsZ@D54`s$_>50`Ie+p`{S|h0QYo*9P})w0 +z<bEP6y0(FzeIHZAS-Q|db|Car*wna(=Ox8*S}COztc`#5;dpx;-ZMeGmNB0u!H +z2j2b%wmi^l68TL5$@Lnql5O_w>+XNo-xc(&0(VFfj@m}jgT@Z3%w&CnUkojO@sEEx +zXISucUvVGdg`Y}$a?GkR%!Hdg2STC|=f=2m6%_%*5vXOOxAi-Y_q +z%WE)%W1(L!c7aRp8>F6MCRp1d=?@~RW7kc1biL#qZ~NAy6;-kE@~W&UEM4udS#QM9upLM_2cN*?(TOQa7N#8g_e&Y&AuJWUcZ@lilcYPr$_X{!sf{L0JRb!ms6eB0OauIm>$?>sjaEg?XNu=bv*I`$^JG@B(+6`AdT4>H|R!6G_Uup;m#0wqFah4U+tgheICFEEdY^cqA6>op+; +zsxt?eZ=qkdT+@0&^UD3aG{-tYbBPe#WJ+i@IU`^)n|Dau;bg}9KlTxR`1>ECay8h% +z`4&N>Fr>{Uc +zs=dgK+}Ux}kjG +zYae*$v#p0##5l^O*4eI#cno +zPrVE0TOR)2Z{$1I&*RWG9IpdS8+wP?cf#SSnr6MkrZrmE5Dix+t&sy}g>aaKt`bn| +ziuKVEv%Rw@AWl;adDajHBhY9zH?j`_B8ebE-?%|k37ZX4*SMWIA$Uxs6e%n(SLC9IpJHjJn~E;T>4BQRsZ*W-*u*)&)*3A8H`q-f*!&hreKJ` +z0F@u^h#)ipe#fVtWAE%a7LWW0-}l2mjqUE^Hw}wbLkLD2eAif^b`xUUGW@CwrV$M1 +z6s-lb(x3-{ +zp&xjN?8g9^ge-g|Fkn*VWDVzxofO49Kur3z5kV@TMfo#vHhaUDe95~Gv-AGzSU|FH +zy!tEOdU2xutpa}#@FLWdm7b+Il!qeYTHC2~e#eXM+Tq!EpC_Ik@zEdr8ou8?jl*`) +z#W~g+kB^ZW$IQ(!GkmilPV3IB5ixWsU^Y0L1yM)4S#>9^D6Ec;J0`N|(JBcQR*Dly +z9|V+AE(&2EV6{Xa5^~jzTP#L&T4OPw2%>^kbXOFpBI^41jAV2uydvt*q`bV2@jJzh-CBi=R{07D)PRp7 +zf5^{x>y~Gp2_ey^TR6Vx!FOD8TE7k9w?on#x%$8i6GOznib%8B6WO$x0Sw_Yo_o+G +z_O&;)$9o?BC?9h(T-$K6YVkfoGHx7uUAgIE#{Goxg4&8AZ97`WcuWqIQY +z)npgJz@VyKnG%llnnSE`U=c)gV0&vCi$V*ToW<4Wo#L^*24o +z52$!1fMr0K%mbEvs-#JT-{IWk84(hF`W*7#?_d8l-*+~mZxH3>f_QVE1cYK*}PS +z|Me^0uy20-t-x;sX$`7g4lo%(Z^t$CP)u}Y>e@;U|1m>eLJ8e4B`NYAu!$9#Z4-J +zWYW0`sVeX-!N;yl_kHjFDPr^kvore~B_}7cG5(i=%DIDaUbFOR46-KSw@=;Px4!Om +z-?g{psi#9o^r?<>^a#XkuiE)05&3-}9;ow&Wdl$|AU`+B_v4s4#0ayAa_^-bq6z-d +z_w(@8Lyp>(=wlZUv>2JYIk7n5m&+wVD%44_Z!*ZLHOwMZ6Z~pLY_{5Cuk#T^5^@DV +zSzU;LkQ*k6^5m#Xtcu%!|K(q)3szcUH%uMD>A>WKcf63oC +zJ;r;VVOtS;4VDB^MKO`CYB4k`Vu)RX?4Nu1VXj}l)**g26v`~F+2Sgl_7d{Vl!xQm +zWH>5Pi>MRt$nR%AeB-Nbwu?=?^(y_fDj?Edx%8a&D-r&vWuGIbCk%tM!;HAz6`^9t3c +z30h5QPOdW9YLAc`vmwr9KLTWcx&b(h2_h4a3F2nhO#(qI0!DLkgqzF~^M#P=K+s+| +z`eh5giqYu*m5i3nH%jXi$v@kyH+^wbFT5rQlC@!4FH%qDc)x+Z{b|!gK6ca0%7?)i +z&x;_CsO+;fMy0lu5r4!eDVwJmBx_cc +zLXK{WL)`@G9dxpXRJ)kYJGg^ +zwh@9(km*hm4pCy;cJU6aXFYR8bTUIlA#2!l6$Grb*8BH|m|HQU)V^YdR&}nkhnP?3 +z{BstOdV&$L=!qe6uz$dZKllqt`;3+mMn<`sGN3tp*)6ElPhh2BAvJ +zJbuiTsJIwuV?YeB(up-zt5bBkk0cKq!(sKgj&ynv-MyFU;Mut8KF(G6(;HCjAkv@w +zfU0&RvolcdBir{?3OiZ}1~3Dia`xgqoWJv4BzVLuy}wzb)udxw3oWrez;@0fTA`AJ +zS%uOuMBM&|P!9)0vtR?7wIbkz6B +zpRP!zwB8eC&q=0Yex`EmJOwL%vI4v~`){wm|Dk`n<+Y~@+0v&hW&OeL{F92l7C^vJ +zYSP=)h~p?ohD}=^xpa2U!R~}8%5rg?pZ&OTrV2DM;rl8MguGcH1bnSjRb2$|43#RG +zKw2lJbyW_^ZBA}bPj|84vw5PmP)!dyr+qTrWir2jxGAnaOEo=<)o0kf@LXQ-lHbbC +z{#gz$-@{$cdvRBD(suP86=A*VDh7M@MECBYonD5?AwmQ<2RDV@ZxMBvI1J7CS{Z^B +zMI`%B*?d(=jj#>6SO>m^%?4tg1BG_dD7b3U2?z$RsyMlE#NzY_6^9ukjI1ES5Z#qq +zh0<+6W3Q}~WZ1{ffndt(UU%O^fBdO}f2$`S&iyO?|M`lyy|}LH2LKg_fErf7fcDEa +z8;8L{5%4~8$N3#9CxGMHjbq+(qh|l2umF6BIIT1OUun&vU4W}F0AgRa5s>xAF*ijf +zdl(HNdWbDC2Abt5yXVi7^N3WsepWjN7m)cOx~qiM48MCJHJ*-v*>uj{nFH#bDX1`= +z&4?Bd*E{Gj61-=!KLv~sVejxF^Vtsmv14pnPE+}1s=;?y|08)f(%1~=>dy27K!i;jST0U;uGzq$7~7v)aJ<~&6coz2 +z!}Sd#SKx!g@!?R2An0Q)TbmdG^npMqJ*!i7peVDQT`WdI3{2_@ +zzgiO!f`M2hn&Rr3^Jfp)omQN`_r+Yi_qiNgxSMKr4y$%?)f~|YxGhyk3axJ`cUA?# +z1}QogLSI(PcAQ~o8-Pn7NVGJUn9Wij;q>IF--oi8e&Ae7Ns^~gk`15B2$k;*PoXy&-}k4`df39TnZFoRFw+lg-=!hBIOOJQ}$*R +zB7zg?z6rKrLhx<2!9_KrPN%C=Fzw8Swrx<60w#_097Nb06E`PVXi|RCWR9qV@_dZG +zL&$sx-IwV|Rikx<08+VboRT3|op7KP&ANdYi5pLd2K}1mJ&2>8)HsR6X2W!6kLjf1 +z%$=9Hbnm_FpSu$#`$#=S+!WC%XpOiUkqIUhBAU%Hiiot7)H&w!AlheKEoxZ|bH?dus>Bo#gpyee8N#*W +z`!=MZKR!NZ_&h%{%4jc-w>DAm{tzK@IK^TQAXOxAVM{*5H&<7dVC5t{MA$-1lskc +ztH`q$a{72`8EW|T5wTsOm7{GoERRoEo}O}gykN0h-yAR5+$3`~i{lecuU=ts;~H2( +z!wgV$De&l~7!H~iR55Y6QzB-Vz}~?j^Zi4r={{QTCS*wPTF+diq(U%n3&r0x6?0?_# +z;+7}3y!lK!>GD_q>R*jt_=Vpvx%k|(Uy8`SftS3l6jsr=>69Nyx|7mrOrz0&YmBfv +zb4)4)1o3NZbK1p2#C-BQw9ZC=$B;^yR8_~!v6lfGInJV4ikBQ;$D;I6nvTnVtbRCAu2FSx~vE(*TvLyMSaoUeInHXLIc%Y*q_YDnc;SxsJRKOr|?jRRzrg +z)TOL|Hc(ZDico04V2l!U_ueIF!G8rzVFzmKR&Kiq-2;PF|-sU +zL=8M5`|9*dZodA|Kl^9@%$u12_B3md4Cy*EvkT8T_c@6CZpm#xhgk+ve1c`IW%0IJrNU;pA(~}vWQ+))kDOk+ +zhTGlG$%R>zgq#sfSYzueu)a!MUcpvZ2+PMT8zJ$XS*aM4f$iIx#ERfh>gj7jada&&{$YJq6Z0~&G8$PIj1Y|d9mPom1G-J#q*GZyNt;Y}1s~y_^E=#mZlB}jirP7% +zm77#*_2gr$m!~QIVR<4Vh84eF2tL(sv`g>{V!I$T3u3c9-H(ZW-Mtsv73Q04c$yjB +zx5;VmA=~xI5yw{^BgmAKt+}?`uv)gPmu)B1>&|3bZ1bu*VGEl@pP>sAr_Ab_$#jZN +z&r)xNWPS(k>Y +z9+KBAJFN`&zI=_V48~sq<8uW=veOQ@UR*!twfDc{_vZM>(`{mX!SCPx$FHg`Jok71 +zuOj9I0*K4#-cW^>dN>aatQ3TyR$<&R0iwbF3=nd3+TlCK*Pw_5AR-7NN#pF+!oh69 +zDppLSC7SjXdxjzTAXL$=9y>-ustIhbfY`_eg@`#JMv&NR6;Vuj=UZCvtIqrr3m5_x +z!6gI=K%66NRxGZ4f^d2b-JjDQ9pjwf*NP*318!{BN#KIV%tH)7%&8p~TKsy62vqf) +z(1P1JKvODxC(JlS%(A5t1*A-kH+q&+Knb)6zoMC`d7d4cYeb+{1yMSYLH$cx#QWt`+tb=TS0s;xtK9@$Oo#} +zKyqPBktmm^76Tj2ayNuZBZt#~p-8(1abTWG6~WNHloT^Wl#TaXn%3O8zt3Z)xZ(?7 +zup;NDzuzntRMQ!*bDm?y%`^=Yfmx1!u*=(H=TA0%^DHws9hZs +z7FUT!AH*+j(E6t9-XbQHhnJP9CdJ9GlA`q?2BHC?U4a#4_8=ojlMD)_7$28~SL4Zw +zgSBtPS6JD8$N_#EZukR#_S}EVJo_{VNG^W5`K?Z$8lC+&DZ3utZuW>3<|R*zdf4b& +zMlfYA8xD3LMkV+Sh*IHkDmWoQxg=-3R^@%ym%QZp_wwS)2XNXlb$$P=2tsMT3DJkH +z?tHShpCa)QiYXLwl&D)L=7wx^)M6H}&?MpL9cGg)DKUhuKEt?0)m&utR13)Vdpdfx`oDtg8hAkSFD9Qn +zbD*q07DftZ#(r#&q!@rRx?norB}DqlJIBODDpj;d=xeNj2oTYFLS0obfhHIr#5mC3 +z0&UaaV?f=MV1k(fL#rF;1S0p$O7|4^0DWexMT0?=qSjNIX0^R`f)Lvi%wp%qSXdC- +z(~it9AgrNJf5~LqtIuQ>$*~I`Ga?6lyrSSDlcG7rXzN5F#0DQcSOj&fyRM9pA^svJ +zdGAN#As8_7d`zlrcpc}BF$NK#jJavzP1#MnntAsr5|EsT_yuwMoq#6%X&?wxmU-(I +zCqw=~Edv(VE&a5?+d>rs8bOXhMhU06_$e$b91@eUoaOprMW$GM#C&HneVYWJxYFzZ;;S} +zMeys6tfN)(VWLlzAlvSmDVuq8*VqOOh#4kV+D$|70WGs`v(S{O9mVGy117zYDTHWP +z`2pm;v@u^Xr@UB6BtnY!2V(|w+Zx9V5um6a0m7D7w>-P$-7OD4RRSVgHMRXVSuy#1 +z%2#&!N-FI{OEfq+%CU?@)5~>A2hf7&U@qV$7=liBF;S|zh7b`0m57SsW59<1;&2L; +z6E5t{IBq<|NQiMu)P#{>52wkno +z>iT2&fGkDaouz7b$xCiskWm1pfB<%0>$8wmiG#-M%rl +zJm~_`_ey2HJoisb>?ME~aHR$uPpY~7yv-+;ngJ>jJUcrx&c5vXepcSP55cWpLn}@k;0<0f +zxyiekm!D(->Ap{H+p-6V|0UOx<^uc7jXlx72G5N$y90`Gp2x7PDv?Qkj)o0&t(ayLK=5q&I5Y9W@wV7*`p>HWNZd2m3+b5t@*`K}2= +zll?!_qS1~(Pyvh*fedE&7y%>3KwUXL`q*`jPmU1P!6~hUKSJrH75hIjwvso-vUzWx +zuMl92uP^{7Vxat|n-#9-`*e7D(gdV0X(XEb>nM5;h!-&_)h8tloeHB64nai5VZ7nr +zS*~N2d(=7tuG=Jm-abZ^$?SkV=RpLgg7juqGyqRP^7JGO9<$z2H#!P!YTD+T4G09= +z^eB)Jy`xNAum}ut@&p(*EU;bx4G1w}>QXBG@pa}GpTp$v63gSOeG8yaZhAJUFe}y? +zF~_|TL!Y~40!|U2RXWXNW;k_#rCDJ6DjBH-@})YrZOwpOV*#!Yx4z@dD4n__vv-p9BHv>O8h3jj#T)x84Kt56M3# +zjJ~qrS&WD3ckCrXF8G%L>{ZM$=r+2ltHLJp&zs%DD?;-ee@85+rsdmCb^QD2+_k>Def +z{Yza|umRC~1PY;$L69s93)uk?pf=qGTa+17ian(uDcQts-Prfme3gH8JRepHUN=PfN3Z^}@46?I>Ap&z +z1P${06u?dDe}u^0fEOWyAq>cd&XQy*P6~$B6f&YsU_7zF>jYm_V2Mf05`@dn#S}vj +z#X(ABw1{BbF?D?C>JdBB37_@+d*S0t#5~@wX`2#Vw~VHAF13nN5c<5R=mQobO|vA#fJi9>jxv2qC?ukI!=jNtn;3}*K18&xXjdng +z4;Y};l(6yC^8@xS+(A{dH^dx +z7&iRkW+SL$hszNA~U(Pca$H5K6KkUm0Wqq!j2pf0TvEil_=kj-z14;qG41Z+Li+ +zjqmAj|0(as;n`chWI*;rG=4;j01o%Jx4gYAtomfWh~CQgsH*BO0nZ1#fFdBm6Ek=D +zbV!zI{I6y_wL}Kl3R7o17WVjsM?TE{!5;MsUrzIrKgm9h=f3g}vAXebrqd}+>!}Ip +z%PCcmiSoV=eyl^PUUctexG=$QR-H*U-I=pqtrO}Mjl=z2DleY +zpO=s>(TF{@tr4mT<{SLtB;{H)fj{}FcQBjQL*hF|Y8K?|0|HSDuV5lHF%Xwaq7M*B^Q~{*?P?C^J5<_RDU1tB +zDc^FN^ecVc*4jqN^WKE#S33C%nb&{00ytx&$@JhKlqY+dGusS3{5^=RiFuxv-|tZYNgpUgm^-< +zHIOrU@hi>0zhR|4oZ}R}352>Pn1|(p$~Syq5&0d@zrDOdc1Mf97c-%VR8>c30v*|F{44)zjV=xqSiY +zvmSZL+4-NSR9{kw#+#%!iE(lXdX=6;$Hs$aiW8Tq&NP^-Thfl4DzmDh3C2BVEB@NQ +z{Y#v@`w{GS{yBa^Jm2)TS92hqPycOyfX5#H7gf_Ej!k=o7~5P7JVT)Ooi>XGFG4%7lPPJ^ +z6+YRf$=^;@Rq3bB=js#KzwJZ; +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 +zWL>&)C5zw!{RR2K?}@Sh_n-ajXY +zQpqz+-F!#LweQ=QQ;xFxT`5zpx_3ce| +zzi`NN|L`JP?;Y^qBMGdn#R5jdIjpDT{gr^4aj8sq#BC+YO!`W%-uXwI(E +z@9rX#p2Au)gh5%qLq2Jv9gWa>N*+fbLfjh=?{@HUT&Rc?YA53n6yqG?C?UKy=!e2! +zBW)H0ft=Rj;xu{2O%ztqGEr8fNVaiSIi70LZW3jaykoDumSLFKIrfoY76jrZiTrf* +zoR)@ARG8c?Vs^}7oS=%sg#+F*YTtIj+C&WSaxsx7R(=4{8bXc|l?jlkcuoufLnkgB +zRV5z9iocx*A{W^c$3o}TB((n1khO+A@I0;~7i|M&kFM?UZv^LO1zbLl8cXU=f;>>1v8 +z;S%5a|7>&T`BTI{n&Y&Fj2tV2MXvwjUEH6&$%XsR@DqRO&+@y!{rmj8fAuf%$%pUb +z{@c#5)#-6$ah|1_W=L+GILg!Dl~Zdg{5wCiz$5QodK5;QtEv+}`?d>ui4QS0Slszr9>u3^_3^Hn49ef<#Uyh;9 +z3R;QJf)px>hIx$QT*y6YNu8jjl{nI7tB7_cVM8GdUWGVwHQ}+D!mDN{7w|yg%dw)@ +zMdM8ojxkNHos<=HrA*(-9J1V~!-B`qR%{wz=42XU5+@S?z2@riM}Svee)(mo!n}yc +zhoK~_Rz%S%m2{cP+-r4KgNYZ^l+;UcH9IsyZRg?iz2+T+MGy(Qy%A%d6E|B(B;@TT +z^ExIZkvO73pI5gJp`PHPhWxwo;(=m0Y}!4 +zgjU}?EIhMtDzId6V#&R7dVQ6Lk2LtbmoKu}+ho1f2m^JBK)XmLBU-aZ@LuV4ZXjqm +z2&Xo)O!r`q=D`g<{n3Yc_40KtcLuajv{k1*RHDHcEmYkn=RO;ciex+|O6$SchTZ)@ +zD@l@+xtV1|gnnnAm2;=5&(4}jx>86H7YXJbW;aXCqn=UY0Yz$bRlKkt>{_bag`Ct66hu;sg+$6m6EOXYl9K9E<&P+!8j*QYebPF0z|zL#?VrzT1KN#_)F_eZeHKwnO}Z~ul(7k_{PsZ +z&Aabyv#)(pBEkh62n(~0nNum7?~Lj9M;tqTnuG4J5NC5pxC{1XV{99bk8{r*$Cvn9 +zKYkbQTWs^)%|q&GLM@IaB)N)5W$k1pqI$BUDwYTzYgo{E>!k~LVEp3F?o6UKg3j;{0&7`!KmQk-I>`LJw +z%JpF5d??T>2O{M>cQvStbI$JQpyB;EWV-u1vHDkKK~+rw(F#IHROUs-Q%#b2nKr{Z +zQ?V$Xlx8nZ9h{@lIuG#uFw5Qj$}0kpd%0JT2*j%(7DFzr3^gteoVm~?%sa7QU${)H +zkeXBhW5jB+R^=#|?hrm#lKB~4eC7=X^%WYYZzmahTwX8SYlI)=^rM)$Mgs+UqcLZf +z=cqe3y}&j>6GG_p#+Sd!tN-`Upu-`X+gq%@JIngrD?|^~*_Q!zjlqLgPeT*tM{QaP +zjrEkJqf5-q&oIAsG=y#91begfBSk9uXc7!+ILbM;yvYCI#~)q*9qz?8j@?oC1G**wywg?6+Uq1S(^1am%Djr_EP5v1Vhcs{tgVp>9Zl; +zLzL9QSOlj^lGYIi&Bh!G9PVzjeC{k!S}Q3ZrT3pKG$%wd4WFF2X*gvTp^F^irj>0G +zlYmEs=}dml*>e^i09VYMRMctdk)~*YNy=?#R(`Hba+xB!aV5lDfDA&|eI)j=+y}6E +z_uUc$9zdLb$o7z0FJVO(uo_iXX~V{ifQF)$o5I4Cif2KBL96mP7#g$~^1fG^X~c^= +zV=ljUliNQ2W61yTOZbIF{MV-G>7cX3aQG;U)Xhov}iSvc{o(uGnH(%f6ul>kl +z+uN=WRU88oXL+g-r$)6l0-LkX5yMjIjX +zbQ1)yFg|>N&{5VvO2gAoL-`h`oJ`iT#q58lT3U%pA> +z6Y%6?e~q1bo1ee-H~Gukck+qFIt&Os9#PQ{Up#;qYPI*Q96QExS`XcSGxZsUO{K9i +z!*DYv${cY7WAABbL@Q3oMA>`ckdvQUgiP?m5zc3JW_XFJSgOMx+q*B5c_ld~)|UA* +zA6w*!d$)My-S>Fr-7ep{(GS!V>Jj7$nX;S=Sv@+#?8-X7_N~|0?hN_F`BlF7)-_Je +z)^W|5kWZ9X(Ya9L=pXEowiXI?$E`5qP?D55i)ghLgIL_Cx69f0KYvd!jPs`)UP7V-jK+V=>xD(@a3^ +zYsR3gl@^>S95X0S(c;c`uJGW;K1}q~vuqu^i~sTyKZG8R`JX<&z+aCe{=ZlE;V=t1 +z0s>Br;i}?FevcC5MzfqWT4sBEKQd^Gc_eR{dFh?5247#3!)7ut}(35 +zb82CQ&cO}~v#TVvI@?z+a_qi4sn5>g#~BhivlJ%4i{gxma#d@`IRR4?RH_4%iVYJr +zpbj_+IM)GC&bs%xf-Ag|7+7~ASxV6m=BaGhZlWGv*n=3};KVQlZ{Q__+s6wRP6Kbp +z0J%oDJE2v4RH;C3E16cDxr#_($Y&E_FkhALDP3j7MU_oAl_amM!i%lthZ8m1Z1T_E +z?oeMDbN@$TzWTr?d2VT$|N8o~tRFqYzrA`V_g}lp-xzdwabttW^v=MG8hZmBlpaJ$ +zl9=7y0~-4WxVocz>{~R}k8y53rke>juJyV1wpkYP8KPmGix=Oa_Shk_3-dvt-Q`m_ +z*Mb|RhOI^YtkGABrvOZgR{;(NNRyc3%Zr>`Swsb5=h)odrn%5!{^T-Iv(AxY>kN7W +zj%{40_j|w1m17qew`Xx)=|nMacg8UE%+=?a86EQ0J2zQ7vChLMk8*K)pSn2Ob4y{4 +z``pQ8R?ggx=AI~y%vz{Yj$lI8^OOY8vhmE$tE_4qS|CTU^0S3Em5RP#B&eFr+8)sv +zX(XwFLDTPrgR)c4mMTxaM +zuXrouT@@6jTJtbli!l|Q#~=b!lXv@{Qm9ZJxQf$>H(i+&7bkVre1?S2s3z`RxsU=)({2 +z6X%vWx;)4K`FEe88#Tk&>-tigllQ+5DG(?MZ&B`5MJFNNepztp%9223b1Z%iUZ>u| +zQ`AN#xq?+pbVayi$fPJmei2P+DBhgyNhRM~Jp?Kot!X2ZsFa&Fh4Bf2$?UyKM8pN) +z4;%nq?w~r2z_JA^DhhH7Q8)XWSf8MF{1>-OVilY0TMo-q!ct9nC_|XbbFMTO__Zhg +z3=0cw7!O(4+amq7ZRX#+%4Ja=S!(cS-`VBQUW8~uDMw2~EzV7lxmj6SLihI2-Y$!e +zJj&Mgh;|Yqnv>RY5;vf|H0BF0{ywMv{4vhmb_c`GJ}w*Ld|ve+V6l1xEcI*(>s17$ +z%-#5BSL~qTB6?{=x^RsCJ2Sld&&OQ;|J_f2jQ`|=chMgW`Bpa1;v?_JX~ybZXE^uBBP4On_IM!T +zz?mK%TibFDG0a-T76~aHU4bS=r7Lnp(bl3%;kC$>XDV_9`bE(Y<)UJobub_UH&ejt +z1|}|km%_-W#|-Z?aIXU>sVXobLu;@JC*h{I0}!55jiIrmeKqi%lrB$!YKxhzpSX(l +zlg(|c{)8QlWW%q?b30-{U_9dX#d&J=8gzRs|NieVyltEsYm;X6;JpXlOpZ-6y +z_W13b>x>zcxl*xPpykw~Y&7EIkA8ro{X_0sZt?4{4|w<5EZL~V)>h2hZ^isi|KMvp +zzw|mk{Nq1K*6$(R4ld*$#W||(6F{|Hpj_~k#yX%(cI}BQLlG4+$r<=2ul!b@ov#d8 +zxwFRHU5?p19V;^{JpF4o$wjC&Qj)07((zNAf9H8#-aQO7_jhk>(u^Gs9A9Im=EBt9 +zr#JRlIeLNzf8>WbcKdmv$(;FOA(iz7oJpRswU8p&c3>81d5mxev`TrOLf?q9trQSm +zippAwbFMl=24{W;13w4DFg+9D6CCB=;swB!-`7SH;rC*htnTvw@h|>=|G~0|td%1l +zM9NC7f}ytCkio|CVi!17ej1j^F1MK8i#0Y-wZY^>;6W;JXQ}#6t6Aqtn$X-h;13`B +z1hWS>8JxdBLY-GH?(vIfkHg1mEdSEyxcss6NOx$v6^o-9R7)aeM|=FtW2d>csl4+} +z#`f-z@4WajXP-F1FMRaph{fY~w@HfL@bXrre`9kwj~ELVEVITWme!XVx1Q95uFiA$ +zQjPn6dY;`U57|3BAkRHX(;=-9`mH7}zV#kI@gpDNy;t6)yMM@xi)nXviHZ2y7>tGEOY^Kf{~nw;L0oI#^J4Cb8IMMp6sw6Wbh;@N@p~1c0NW2@&@3$src9Cn +z1^a8xER^Du74#6JO)Q=$gj@Nvs;}4(4h&vevO03WRgo;6_Lq1sIPl2or~mqYvl2U> +zEc%FfY(h>IzgMGIKTX(8dR+;WDDn>z%V72IF*kE~Lx-;p(X+;3so||=LKa2bwSU0t +zt)q;O-NuWb`~+Wn^D6)STVJHMaRt5i4(8f1OM@}Hk;AE{GLF*T$U+DTr;aGc*IOtp +zKJwv@hM}9I&JLsT5X%fP^zrHH37Nx98-(l +zE5kk1MM2U>gE)4^-1$1!Uf(AB_?Wr1MaE9p^cf$StFzG^(1=q`&ZeR5H;xiOsExb9 +zFbZMnV$oKFHIUNC!L}?Y64{Frs^rsLL%}0cHF|uhxg~(Jv?S9~f%o79F*(EJCZ;%D +zvXY_XSa~UqZR&1ieizWO0!Z?JQwrWDYW21RA}Fi%_?l3@ke?Ssz#uS(*T=<$LV4z +z$#Vq_Ua8k3dRde2e)%dV--vkqzrVq*j&QXEi5$5qM34<&b!CAlPLL=jSI-P^ba|O? +zUESuM)ma1&lcAYDXB24e5s?$L%sU)Xgf=dOTmsHe$DKoAn#4PBGKu#A6Lu9jLP1TB +z%7qM6^0p$+U=lJpn0yx}WzJ$zG6Wmep^oBb#p@<)D+-B~5U;4thtDgFqpW1JghY!@ +zBRQhbKngsebV&e}I>z)?!TYO`^Av>;v^rzlvV==}(b9|D!s8gpA^S;Apjoel1(J+& +zMhMGuO|m3qlna}U8iURkiRGb*acDCUR{99ZMy9pG63<-)gU}rf) +zi0v7k?6Oc80f>TAiswS4;JlsEVU;KW?`brfynUt1{M#cIPP7@_EocNT*I)#(M6A0e +zTQ~Q){k~Ni^(L>sb&=0M|11rednVsh?Bv*U~FJi-xvh7pLAu&dcW7=;@WM(ZI +zT1^?NTb#cPK3vK>7xy^RZj+5Yd*cCd1d&E`#zRiId1iYt{@yNUPOmWOi9`FRRolOnWYH(<`WAiggZAdv(D9fRvrkjyG}KXDhfrnDk7?>9TZ_e +zIj_8)L?rbF2VR-&4@lC4SN6sXceV*4XeaJqHND163@(l-KoT5^GZ#_-5mV?gckE_h +zV@+$|=6u;4&3OeiqhGA{msaZ_lm6?7Zl?IFHI6PV5VvbI4iiSZO0VB#sRyU(b6nrp +zZ&iT+?w{v!Rk*7CCyuT?llQ<;xu26D$?b=P&*4OP9g|Y%JHq=5K +zVeuj++;QLp6Ur3fO5}(PzDQK76Gv0GUOY@; +zO7l8W8g8Xt1Bk8cRbDjBQtnoHiD67z|707DqFO>HuQA^kv-aWZ%$>i%UGMjtY&p*9 +z9QV(iL^I*LT;tB$kKl1M#{;@sTS21eE3aPR-EqRb^9hY4A@g~l((fJ|@U>pV`pPQ# +zgtIh(YN;$RnC1db3S)6)-e4Ka7G@Q3wxOwnjGZ`~$p;W25;x6NwD{aYgNvxl8I7t5 +zw$@@coT4ELD3T+S)SDIzKnzqIzEfO4%9Hw!(}g(7Wv-ZtT0}NhOt&i0t_HAE3*X*a +zbEb_ctSb8euPecz`I}n25)@x8@#-+ +zgB*WfI45TpTSSFIrMQ@l>+f*aU3WpFN$7Q-%z$@*FD6SFfoWer|5nc`QZt20z2Q?C +zbxb#5ZbSH4BzQk%es~W$^_WEn2Riv4xGB54pzaEwYaXvK7JygnFH8;p6^SpwV$M`M)C{jF?NtocQ2fjJgeG +zYbkYsdeUWPslyAGHu-G)5})|k!yNVoT>Q$D%yxJ9i$C?lJapj#-}W^=>;{}$U0{@F +z0o1s$x64dAV(sjCvZBGOtco+OK$qc>bJK>U$Wg~*j^C}Kmi@N=7>Pd$kP{3MTv +zOd-%x<#9L#S0vDpnf(RSj(BRG6XU7CItrMD6srtNm}yHG&SR1hwZT$f@Tizv49 +z!zd!!3UEPdu7(+EhO(fB?p#Ip?NX|=@@iQvufV5j?GThoBCU+F5ea}MEX_6OdKbJx +z>~luqn2Ch%c9f58Z!>fBL=YuN&Ob);#+%ITZL^!sf*<2^hZZ}|#2E9!?K`u|b0|Ya +zLp-($E(YK;MlsyG(oJXyd|)|dzEKBNhB$^>Z!vr79^OdjStTbE +zsgfp2wn8Km9R@cAEKKQ7q^Kw8l&I+Olrj}1Tuq4*GHJ4k4X@7|o>#&Dq71`8Jvd~l +zJTJD@7br%}dG$;`#-W8*v7i#_ZIcyV%MMf1?H7J$!KrE+sURz;%@K_91g44#V5@e; +zF~lsAKXLM@md!9KV(x`EF(Sprd6Z^0R>E}H6rh$cKi6bOBcg1CWO+DNf^y9#ym{#c +zk$5zyfP=j6hne*oG$JKU9dQg%u^^md`sieu_#rqkZ3JLD->lauUZ;HBJ69bnA6jc) +zyL^RT{@Qm!kFQHX^-LIA#swD_j~w-Bh)T@i1zRrQ5uuP +zN>qdrP9Tbe2rUgF3XfBRb(L>l6=f)WvLVZ304^gYT4*M$1!7WvH^)BM6KxeCu;+F`ue=fAz9&3(sKh@JAy +z8~c2qc9p}GyZI7xEND(X3H3}|Yw7vHAnaP0hGIoM$(2bw(Zo31)G(YNREdq@XJ8D% +zLxmqz)HKxS?&6B3DlO|W4hZiHcSUM@*8BX)Q%$R2Srx~!t|^D0%F)nZAZV+}>!XaNZol+6xe^F^ukLx? +zyLOW_jX?tzBIHxxplQ|$w@d%;>snGYX-{ha} +zNBo~Yyu!~sc$!$?o10xeP`kmA^%MO4_&m!}RvV`1j_PzSdL?hPe_MHd4SfU4=0yN8 +zA`IXR5?CUIwrU@l5eIH^tSYn%AVupmNNHfx0-;nJ@Z63{_mR5qa7mz3T~@gX=*zH;%MC$;F09ieaCTgx8Yj`}ZP@a>ZRN +z7%}l8f};qVa3GYm2Hdok!6clq)paY^;YjYy+7je*4Sf0QZF%wk)XDQVZX+D9rKfNGRos@;fX +z)fkXl&n2whY~q`F&%vO}?p~dm=Dd_E|D>1D9QBc{O**PD98HWioRH67+UJ9Bzs<=z +z@220)@ckaii92XrewE?oEOR2rcKZvt6e}TVt@+2;4q2mFWSCadGfSJ$#W5zNEF+?c7Sm16N +zTM}L?e&(#&Qne6-fw;}s<}z2&O7CGs6U-Qgq2EyLdBy%CauI{UkYE3`|COab_jh=m +zj6c2o9=A7l_;&Nd{NMc|OCrpS`s`0Uu$rk}h7I9_AoM-cXcO`S?@Qfwm?;UN#FF@I*z<>Q?#_9MsDgKp533iH^Dn#oEU@r6CdThD%nM#x1X +z81&KEC2IG6l-A)DBx!~O-9^EL7dZ(yQKE1cqG^6fR4S#IaKvKzrggPKYBb_$Rvy!8 +zky)=};9+A*6VH|;3GeN0@zR~2;NQ$If+~YJ<$qfJY5p5oe~eot%MQ}SPU-Pr=NVFj4iA_q*vD>td0n;Zh?07INIR1m~X +z&tZj{8;#Dri|-D)e-H#{RHt=gyI-r`BxqPlk>s +zvP1sshfndLJ8ok%_Pn{ZPvRgJ3Pi+{*P9$(dXI-rFXQG`&}@X}8S&b2+}|8KBm^<09S1@u*FyZfG33%|Kekvf#u1F8oz`j8>UfF~aZGCvVi*tNWZI7|icGxy +zBxz?V^CSvD^*q@rQ`2)$GS0QkYbs0xvyqeqTr(F0&>&aK&h8cmo&8_{DnfT>3qKqL +zV{>T=V&}S7YFLh*0~sm7b?Hb6& +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 +z) +zqw#>f&OWYedXiG8L4D4RSH8=_h5L!(h~PbXUFJ`nq&_oGIM$SrTx(u8yh_Ok@w?VV9(-R +zM6TcgD?Ml6$1(x67NV*wv>L2jI9(c9o@tm!Wvk;hG*$1zF_U@?pJiP6?sGi<&p*TK +zKl}@{&fN*4E{KCTAxNhtHN?Sic9wd-OFSHbb6}Mm)rZh-w%$Z6L|b~kV2t*4{Dk`9 +z)zoK<@}W^kw{5Rw5fC*+XOp{FZk3zLt0JaFV%jBZ8?8|d)&I~ew|%e&Wd%P+3xkc4 +zl!L36*m>(+&VBqxIo#bOjJeP;tLH9+^WeSUTnIM<46N$Ibl;VwRVnm--;SePuWLkK +zpn;02cya3RcstA7#MEjbOKS$DyS0nkS>vhnxe$S=P=E$?wdH0LI$9o53 +zUisiBnK`;Z6VF(RoWwaA{&LhP5Y|NDxzQgLh50mFP-Q8V=oepbvUZ63%i296BBhfq@&wEc2)mU9zo3JSR +zQR1%0DsD$ax5dkGwdM|Z)F?z?LlwN)&5gE^m6$RMvXb%{7}O#3Mg#iUsF*-yx)iI5 +zCfG1miHaC9gg3VSl6!nDA)0B@+8VQ;#>7RaKsiwrI{7Sp-@=t&KSmWe%yF$c$A0i} +zw*S?a`Mp7hM?d;F%O{QnPm<-H98e5ISzK5(P=`0JR&3`NcfH}=-MZgK!|xTkyN1zVL8N>#SHml);GEsW3<`=Gm{@>`XDf`$js_Ph +znqu}$O^hRB>tNT0R0Z0lpoE3Ld-*b*&3(?Edw{KL7sEMFGL}x=HZ4F3Vg2|#50&?o +z#WhMhcW!&^*>T>DcYr-a0W$}}SSFYgQx#~yA{$yx45}Jbg)C93OZ3JA`q_|396C`T +z)G0;Y_Nh>M5hYh>r7jT8)EYz;n}ocowt@ite4c@C5sTu`a$=Hm;i4DtB;5AN +zM|kMRKEktK`ZCWw^>s$$5lJl#s8kZUYVK7$vnr7u)w~={hYycMXc&lqM70!GOT(_$ +zx%e)ZKmP|j_e+0=Z(Z3Z`7{4M?F;vk_pcMh!kPPjh=q8}_RGIRq`^d(>FzT0aBX3Y +z_TCQ7jg3$b5wpY3)LSJDoHE2Ti`VFdTZ>T(^?NHID7av3(}t;>@bf=f{l#096vNM& +z8i3j%JXX=OAXDZ(XREV|7mU)P!y96#s^`i}&$52UeGL0uM!hcmy&aC+eIJdvc~Ee1 +zT)dZ1Q(9eGCvq_q{V}NSY2Mv&|G&TfSGE*3{A5I%A>3CdBVnt+Rh>hu@`z4V+HWaY +zN;tXw(SZJVP{gC&9L*LeWjY!_uv38o`_e_uKtASao+EQDToU1!-W)kS-=>qz5*7IY +zHV;tq_r;F!Fk@+Pjt~FoA0=r!p8Q9j<;7>d%Z-DB(9tK8oJ2q@7_Ard+N-ak;%tuxvyC>1i>jaqiY+`?Sk*$USOA9* +z@>Ie@)e?!bT4|=jb!#vH>^KT39}B~t7L1vWYui5DM-d{45G)&d0)waQUwesul6_>Vp#Z;Iz*T55i3 +zwN5_KMXIEx(=^QX^B4s!<8$mVPZtcMmko*}3Hx)aZ(A%hxupzHHXegFGq_CPpk9e< +z3GL+;n>TupxN>l0B0ZXM%+NQ@3AR8&33-PkdDtBWgS+#Ads#hxlvkem7M)I?a}V7^ +zYo4NJn=-lQo|Qy^Ty +zI0{yUn@UqzIorsA&$;^2^Q>REo6g=g`DnyocZZXYzMooqhOluuSEdKc3roRBy!yh! +zq6DuPy{W1i7vJeswFGS{D;}sQ0s+{ely-5UWkzOD3}YOFd_;FVz?l%h7Ds)hxHYM0 +z+g=ncl5~j@q$D*}{gpDmI!C%WATv8>Dr1s(hwX8VoCNSj)J~>zg|nRS8O4PhcKgiF +z&GF!me3YwiUF7XAeTDsVXIVaVEbR38IKz7_csv3@dEMc&ERf^6Tf6MO_a40)H^`g@ +z#mAYI6<)vXH2cE=b13m%huiKrOKYx8cQm9{Q!ZWkF3s5ma{5JGs)bX}>cSESs#Ec0 +zpW&m3V#i^w-YkTvEhtcgt!}b7t+0mK=?y>5^lDoSvFIQKbw%f(vs4f$bi~uzlDeFS;**>J;I!?y+;}Ep+HZ&1mE8i=aw6(_s1Z?FfQKuFRX4<`+Wl +zk>$RGi9w~{cD)J^1K@ex33x&c*#x8pi4cbut>z_DF)=(ao#~*)IHqds5yN~$chs}V +z8%!3z=}^Pq?}ABo6*EpNLbUuI#*Ve%87cKXZFuS(OmDk?l#)~hqcE@=ZPMrw3MC5bE-66f*eR|uw^f$N24m)Tq +zp}w@p@kicA(r(f19I*G+Rc10Ds=Jw27T1?qIdL=~UQv{gjWQ1QcUe7pJL7yD7D+8y +zq!y2f>+|F;CekT5AnNfbv-K9WxQ1sMx>6k|S`LpX{qD4X!-kDunAw$qM_?2eji#C} +zRVvN<%qGf|XQg&VW8uMUthal3NS5bQ^+Rh+n9jm{%+(j3W%0xr_P1^#A{=hq)Pf{(L17EnKX# +z0`XXUXVP~aF7V-~XXdFJc(F7WH*vy6VQbnUW*dIJMarnw9ts0fA&G_g`8sgpV`5+SK@^8DH28s&ku-RpJ0Db1PrU_fb9 +zCn60Ax}Q0MNCcWsY3n`@33($>Ql_2}D$4T(k{1bh^Ea38mI@Ko)*=va9u3Et8lJ=9 +z#e+_zcxi0!L( +z6gz?;Ju-<8wGcnc1HY=OzXcYp!uGve2C?lIv7c#j9kb~eIM*vIEH=1y^}vWjE16F% +zMsMf3mwH;h(Hgk?K4Q}3OD2p@R*qhxMip|paXf*^vv@kx8lmJ0MzQ5CM4FF<8sZz?& +zTMDMxpBADqJN+agn1I;Mp8M9#N|&NG&ExV(>n6D&~VBew;z> +z%dukuL_n|KXK$1<>J2${*KI7Wu7sLSN$2sNz5N@kuAaf;sYf$JQHr>n&BH#uk(T}O +zx%YuS(oE`T;W;eF0i7;##Tt!a80UbBt-jkyTsRdQp4qNRBgU=O{$RZ2V;S|7s*6G> +zhj#9FyYxmQq@cO07y&}H%)LN!55_RuJtV3%0_Q3pkC<6sW$EPE!dp5PW@l;E0&guC +zhh>qAnfNIp-}$~xeBU<8mghM4&x(GFcDU2O~$#96%=JlM6vd&MM$);&_eU6FUm9lRnwh^9VNwhI0{wu +zTC-tx%IQT?AL4a8`6?`KG9O}He05OhEow1?0eg*vdmp-sBd3m&X9eO_6hMcAUby(P +zbIYKPT0BE2{-NAEx<=|fI2R0QHf_*M8~Ct*40p*~Kg5CgceTqAH%YL~#yCNvN;0iY +z(hXW=dP2;o=;Aw6CyAAVO$%f7sP|>^zTZ8hHyR>PzV7q9G;(k2*-p^$h-)uA%lyf+ +z^g6qUa~xi~#;NyzkhIYZo5y^s9XxARvc`?Z-RJ}GndNj +zORYA)m5{3!@P_7YWoM@^Is@H`ZH53G&dQRCq8P{J4gb#cvxkKq7QZJ7$|5!5w8r6R +zNOwFgw2EEWD4dH)k{T{a!t)6uIn+0z?|Y9cj5;HddXvMwZH5O2tlfWaNY=+$#(cX? +ztJWa*zBCSR*uh2bl7d7cG8T~+0lse=@!hYyq5yH`-W(^q16&Z1vcuIW=!Ar3y9+6j +zC9w&dZD{g^=O_^|OIE8i@EEeZ*m_9$S;fxjSV)^VAQ#9ycn?+8)ha>7E2Q<9xq8IT +zV8keD;nkVZZW!-CFpy!VN2}EiEu7=w7z#>-8XaP-7C=!Wq+E%$Z3Wo{55?i}H5S%Z +z84iaf;n6^Y40?ymEUXi`I>sd%Zxf!LLiW2H+3$MN+)M_1dg>o)}ln|@| +zTnb$(JDM7?Rrg79Y^(3#RYO3u>Y8HfDJX^4C_tN}Ru2$(_h6s?!9JaX{Qyc75j9=` +ze5iUyX`Q&)B5kxt8cm`&#X(TYy!z}nSvYk&hkHAOa5o=v=AjRuBFr`#v>Q!)fr1t5 +zu6!)LSy`>px1-3v0r0s`eagpw<8S;8|LMyGR3fp+bN7rbol9$FoVW5tD +zJV42*)!QVl8D5WoTpUM7d%T#nS!vDCt~D5Yc4G0nh57DaB^# +zsw``xmI8oO)`*nrrr7KPnm6qC*tq--SKoT$dyf~{y>X4(9{C6}^NS&&mZH7bOTuvA +zIo#P{|Ke8zgx*>`!p!PgK&N&tzr%PGk=E;MTzfZokFy_mocinn%{XGV*(xF8vemn! +z0huCmfc(UH<+;!N;$PYPUj7m5-}oC@jJf5iPsPHYo(cv|PBI`K%@Df?)Z@j`lAI&01YBgO>`LWU<~>myQJun_M%)t~TGsaHh%-(ZH)P4Vft4XG3WLOl2IcFmk7! +z#;ZMcm19+eQX&Dl%Z3B4zV<3_KmQC{*RGN@8r13ymX4pKceqb$X_dIvD09Byuus3U +zN!HmXZM6e?;$U-=%}eia`I&E{*?`u{F}AK>Mzf5h-DdvuZ8YMT*;b3(`|0^L?cjpZ +zdsD$X9HGd|Q69+=M< +z5{%XwXgTvc&vRtAPxH1Su@~$-6TAxH^UA!5$?S0>o~%$cSb@kZ*CM6cYJ|onZ@EY1 +zMf7y`x0qWxMJ#pHD*_AzI^-H|@^pnh;K0{-sO(-aO4^d2SdyAV{7Ss<_mBHa2 +zdp9nEb0m!!(s~;gC%9%3!mY_Q==D3e{vlbn&#A{h%KXd%?OIBf<;C~~3=vnS|DNO{ +zs0uhl`Y2zvHW34SKg=T3L(~;4Sp==*C=sJU +zm+^SSYZkXQZIk`^St-+cZu5zod3j6lZL(&M-+twov4^lt3D@q@NCRzafOAW +zr^D3Vez!w+Z;PzkAr1+BW2!7!Z{bA3`%>?jsn?5k@eILXmzfx^kx!>esfMgVUfw)b +zf5X~@qqv1UB-BIn^HcE0q+b;wE2V52F1i5^8BdI(LUz-aqZn%{^|0k==BD) +z(*Z705ViDkqFRmq_5sbbMqEq5ds9u&B6+lpVTzhf0yW$vtGHMs!Ix9;^^_YbXQ24g_=l|)))=@JolyF9bY>P@Op?}V%`Q@J&4%|<^xfkk +zBuQFdlTvjVt$__TmaJJ^2M*{K^-D +zp+zp5s`Q&JR294-L{7RiRQSU8ZQ%R1Kyizy+%)13B-8&=MI)RG@kF)n$)V*3L`Vp$ +zMp-E8805puG_+l7C>T#cF+s_>DO5blJ?*4TM$CS100N86gfmNRmS*a#&DJ=vG{gB* +z$8jj?Bc$a21W!Yn3TV!tGorT}aa^|O)|U9~zkCljF3sY*uR|a@Cg7xKobikgdK|uf +zi91dm!)X!1xakZykKVer0hZ_o;t{hDQ-mEIvej-D +zf{0r{uxhOtmXDrgZuJ!VTh}?{|9RF5q#MIs!Ix{UG>p(v<|8f>{Z +zY1WO{e4j`lc8+20*&Af^a!)L9a(0fjnI`R;aBOjj)9VWyU7BaERVRrclALsAj<0S@;%jR(TYI!m +z9c8fFW%v3`dY7)V|MY9DpITw%!TTAH!rx`;9%g|VRL{&%G&f7qbiw$p)uiA6smVR2 +z=PGiJgS{=nfO5#gY{Z*(!u~Nv4b)vGU2XO4=7Va +zqzX1jS@1JCp@Fq3ot|EU*9h;u^vZX6?Q2ib>-A{N&4pR-*=Se{(TPbK^Mrn&ZkJ)N +zOQY2ep)6u#Ws`)?_6-hpZV;z+ywA`=1Tao&!Sh5(oz~1EqhS|68ir$M&ary>EbqMX +zG7`ny_rwq4Vpn()XGPWtj}S5-JTKIe*=MaSSOY;pzYlGF=5PFs!~f|2`%j+~(Fa6P +zY_GMcZbuT)8+93GLmZLmRi74%yb007%*%)h$^FAo#@=Yek#>WR-oDO-W6KeYIcLYNl;JUs +zKm5#p@TtQIy!%ImSRTL&zY)QI48-0R&?Y^<&e0q8=#PW86RK*9FI5L_Rho%K7=s9eBI}sbyjs--}k*ko`CmSr?}UuRlWar@8@~`pm^Y+<9z;$ +z$M}OkJC2^*$lTloCdx;d2z%W3hX?ovAN?nYS{Z2JgeHj%zENZC@d2&h`3uCJtpw#V +zYBacbEMG^nTE-+PN`-|>MnTHEoD+Xp6r0bBd~Ye1%w`%Xa}|xu+PcM+gkt5hk0g#z +zQlZO|LE6Pzk93YWP|RXDbnr1AwELOeQD=MWG`+cVT-b9vEixB^~Tz3EjQqne#T_XYCc*hOw*|LdJsf2Z&)LNn>F4)3_ +zzmfAGe9qUgjE~lN;P?NClI!uiA34vj{=spcKYWVuu}N;dVG`#$Ts1XHtM5os2PeNw +zY4us05|nCHx`}3`E0H0H{nw**e}vh$-9m4EjY(k`tA!cKP*y^`bH!wtD|{r1;&eSY +zkmN+cf&vpDmGp69mSBkI~ZMRRx!KIE#JA +zP`QbBr2Q@m(`kr0^knsr1avz!WT;q^TP!OUK}6*myVcw@4eUj +z&@cb~y+U$pF+9f)@Av6|L6U=`aP+vGvJPB+j6ue0T8u5PoUQO(Z+I!q<~UJe7{sRV +zHImX7&H94I94L@#7;0awa_0WevOITzU7IF&;m8Hr5xn*l+X+HNuNM<&Xtn!v1}TSM +z@ODGl93jJRw_hX))4VMwpNl$oGSR>yG0;WG +zF)L>o?;N2lQ)H;4gykuj`I@lrT}kk;Bi +zz4zXC+E-uP`wtY?s}~1Ial}~RKCHa@NgK>Cg={LJg`LMm~i=^E+kKX#9M<}X%TjM$ld@MTRMOGSDY;eOtia< +z>y+x48nQS0$uLl7U|4AzPWLr$xO0@7Z`pxKEZ#{L+8cR(F(Awh@>FV=x#1R02O$qV +z_b|6^9B1F;EJ}jO0OF9SBCF8nAh1G^H|PqNb5mH?6x}IG!ZFvV&aukV8DU=E?r +zeH!N-t+n}Vz7S}~`RAWt?d)k98>Xm_O;Bz&7@3^P{Aj&*x$8Z6E>H6=av>dfDA>jM +z8T1u#6;dhUc8jwwJVSY81`xz^$Ej?&irUpTQ*LaaR;m%1n6jG8gk(|+Mk-~_cT!^G +zk=_7~T*)`QBKnLTk|{zbHf%wdh{Z*Swr=FMy_@iZ8CK6v5}ke=oeYqr3O;X>dq6mk +zQ~{opxZ7fEb{o$<@F8~Gd`giFI*c +za_F)xLHQMAas;hTQ~BU0(0~0`Bu{*S`Okiar#|%id`wHaPSIUlW#AlPbCf|8Qw}sq +zl(O26IkK$z`kTjjEiM<*c_wByQrfhKLy70i!UbkR +zO}$*jDNT{NCn!8}%Sxe~LwJkw4(SbAdbGFb+)+gV3*{*mE08b%FN<KM;F`Y7X@ +zw=+2L0(yE2lP`ZWx?Dkd!ys8kcuBcj$9jvBCA=#$J1N++wSp27DGP7j!qdRJp&QAm +zwr=L>$70LY4XXA_*UjBMJ4Ph)0x +z?m>VZCSj|O{pvse)?dH0=PzEbEWrQ26QtmwSm*ypDfx}|5;)=<99K@O*Eua;$&L+_ +zpq*M8!t#@EeF?Ku)7g+N8^C!<4t0zTM-YS41oVlQ*EoEBfyXDC9F7%p;W#TB +zZo$v3VwO8u2TYID@#L1D#xdyiiCqa*QCu@yqAX!;(C3docZQ9(TuV7!K4r#ULSYBJ;wj1swu`yaG4nO(~58e9_Cil!@jU8%J +zlqPl#T`gt#f!??)UDrYe{YE{$m|Tp|J({_c$oCJK~_1o=ss7-Ccbk?X|cLS9T+fdpev&N00R^O1H#63!7P04mi +z+$iOeMoPdI6ee7Liiq5$#3YVSfB5rkzHx%q6O?L*l@2b5@w$cTokX^dBbSduyG`0NyfByY +zsbc|8$TB6{Mw^t-8k+4c-8Ii3u_X9m(4;k#N&(%q9?p4=M*(l$A+UoLbhwrN$|}Ed +zbcFA?u1-nD04SM4_DVK<^_QfCfzR5CH*6Z?$(2P0si9I9*mX1hKuJ1r!fzcv%PX(l +z!&nuJQ#dc_+Y)^<%6w!QS0Mobn`$Y6o+Yw*S&*ktwx*- +zIP}QleC{tl%GAECm?S#^GH@6`l>;iJ5N|CYE=$~kb-_5EBEK-KHWALzTbrlrT*hY_ +zEFa^UPoH6W_tk9NyPuKCX*@0iV-b0_Ud&0pToJ)sAP6alqd}G+Yr1W=e9L!(0>8M7 +zE|rjZed%J)VmIaX&2?UP(^me|hg;MtBSropcwDX#iIW7prB<(U{Lo1ree^t~9W#{1 +zMwqGx1g1wx!tx;D{8EcrIlx+jb>N&uYXMS&kcE6YEZ4J>WaW~pOl#HEM#iNz>A^s> +zK344c|CazMiuM0`_ucV#|KcxyKuGy(9`69TUb1k7qiZpBRRSVosfU`M{`yz3X<~$k +z0R8j}_=ATL&3V+-0lIq@d+rFml^$z@3K!BchuWG0?IvX{*hZY)T|0?kU}2C7;(@2z +zA7o;D1UUyM#v4N~QS7J%Y#$piI=&SrN;q%1YqrLoY8xjEVGtvWYmP@tPpj3V*GZV3 +ztdZ(6Mr$JDr~r8I`4a|;N6%ki%ghG0G#rWRf)2oY#sdKeTwSvk*NJ)>gu)s{C`RzY +zGE$W}{lVj;B{E&gZi>az3v{|iIe+pDCyyOr`)$_{_4-(bnIl#RWT3LT1m}uP`l3RC +zE1Sr}+_0=R@g8iN=EK~GGmqcTiN`+2_FG@YjvH>F)*Qi_1fLHwWx+c1!)s7j8n%zE +zD>gwg7|>o>L0gC1vW3RXEQ5Xvq(FP0fm1p|Sl1-3&r%}!_>+AE2_@M_Qpw>_P=s=B +zn3`J2uH4p0iuIxKtdGPhq`9=xlplTb +zOPDMN^mL8Vb0-l0vd|)Dzjr%%2>);&}$7iaq0rqN@)nH +z!p6|yr6jcm-)Ut-Wf6o3A+i&BY|}P(?#K&zcK5zxH{JE7KQH$Bi!UTEzOsJs_uq3* +z@H;>Ko<-;R(|qda3g+wOX9tBHsFa-P^!dJ*UBkYOZXL2rf73|Q%0I#FW!al|0;3{pp@9no3r)9&}EG-{+t +zj8ZaF`#EFi#wB)+1#BPf(HPr;p-L1R%B31NY*IY(dp&BK58M}PX$Z@y{q)?054vf0P~C_n)2dH1^wK!X1bk6%IvUD%!!{48?x=3JsU +z<)-P;?2hgbltw0r{^~=#ppNht&nEokqY;lS!qm2DUUJ=DuG%s~s9<4fnRaYx4H6P# +zvCh+KCqzb)rUo;x40=RiRv;ATc5XtH*NVo(aw!J;P$l +zQ7Hwu^_whLxM>Y#A<;tMBpB}tdW%+)wQiq>yKQdWG>&lwgBo^z5SO_=cheGs)T6yZ +z*^t;pwCy72yC+yq&eBSk=$I8!Jz#Eij>V^+;_**D$k7walqw~>8@5iBQVa$$I9uFn +z*SYo-FGxGLZl+SMas1p8bIWV=qZqsHGy(9%Q`kxsCJ4crL0pLOgM=;nU&{UW{Uu9Z +zdXQQg(HAP4VD}f#Q+wdI+5Yw);@!7yp?v0fQkm&8_B`!m8RHVX69iIG +z3M!mBvq*aAD9M@AeDS$c%+8F{A4C~=(=^GhS-oDLAUiz@`p0FA>NvH$;WaPid%pc0 +z{J?j-gV((L7N#afvyJJmARZP4cLsbr%)?kU1RakIB|T?IeayyPdyrrL5N|ztAKUvY +zbaX&`{4k?0dk2hdW_IgdURhcqJp4FTO5)TY>tk%6sIXyn99^%{D3w4eWTQ%Tw1HLu +zKGT(l=!!%(B$LxMN`WePVb%?Qr|i8kES>N3LeF76?4GGJ)htoPA+2L^VURtuJaYC}ZfDpnW1Q!2mU%KxP&x&`wYe+LG*8f-y!g^(u)#e^;g6{z~ +z6^Xy=XcpB#^Yr2>-*XWhH}2hulsc169{=>mdG72f=JjqWdHCjvAnOtxec*nqhjLIt +zh=4(2SnC*$%^4~s#l}$u-s7yzTt-BBNKIFObB?4JBXG15$+o&@(|Cyi4UU|g=Os5a +zk=moABS~Rmw9XBt&8HuFj#s>F4~<&LAWl(2k=g+}cWN4RFXHK^o?~0L&CJvUfA#b! +zrY6TQ&SI^h+vy{;%H0BGc3R0iO1aQg<3WfF#HllkmqT{%+QR;;b|Y|n=7G=i@y|cO +z%w&_)SPDB>JkC0-_vns8cR>V_p0f-}P_Kt<6rTI)y9f^)=k3ve?oHp!K~<(Y7E&sg +zGxgr+%yw>#5A%lyAE&Z;8#CA3z)Binw9oW3Hnl^LDv2lwWTk@d_OOG9RMu%}No~9` +zOnLI67{GcbP^wJSjal|hjz)c`1Z>^VU{p&=*zEsoaiNnd6#)d~MR>8+I}TWj56Z;d +zH78mtx;8m;evtNl3xI2`@c{oT04Zvb-}~VoKKI?f^vl03g!lzKP86q)&xUj-TW!An +z#(li&^)F{_ZIy#hzrfKKp5>`e{dY_-OQ8FBEr@N3@p4GY3#%v(#yO02BuSb@0_>d< +zn6*CrGkxZ4fYyQ#jR+;ecyuMC+v*YZlWgF%ke0Y>r(t}0lICcQM;?BTcDt7qc0*=` +zAW00flTFH<9uMFDIQwqe%ht`~7@M+jW&-cWu*M*i!gx=VS^%^VJbLOZJGXCTq*@|M +zBZL%1uO2V49@dXxHeDq;9OpH@0 +z4VwpPlrT2YL@GHXYr6au6^qS)mz(V5O@mH1rq$`Padrlm8oIqcPd)t%k3RK08^#(K +z;}GjI2E6e@zz!_B<&j#_GnTG^#>gd=w2cO(ZmF43iY*BcE$_rD+y}4g2|g9 +z-dhqcP^ylsPja;N7<9U9*}jRHW|^7-X(jD;%*yHjttHlr!f4J}OF?P(c3lvV0P7Id +zri<2ArPRT19eL#bvzKZQ|JY;c|0+O=TI2&jAd_Doewd7#}>+4_vJzGASFlyD(_btU$|Xl-5TpbdYe(c&FX-2iRYQv +zgB5J4IChQ;9AI(Ta4!r515smJ6L#&GL^kW-EL%5@v$EWw+N@ocO%WxAX1&Hsx2HUJ +z@M+GTnP&er+Zk95e2Z@Ygq){hz7856wD^;{oL+3v! +zL5U)g&N_$5%XX7k;;fjr9654|4HFZbzp%ikKl?Dxo}1^YnGNf7Ci&@M85$TkPq60D +zQqcE~UPDr^C}cRi31}hd^b>CIhL0_5<<2wDaF-JFYd0Z<2Q{RZC#mJ8>#pYcFCAuX +za+dO$!;HM*jl@B~c)gZ690pq8y`)Q-jr}FAnLotFwHK(;MbzF3%HT<`)>79AiHBY~ +z;NZ!aPk;6)N;5U4$Er+J0xCjfw~m#SK2ekoUqp;X2usn2m*Bk^K6%}i7wjG(HKp3A +zqmMrDU)R?j|2qIuXhlA7_uWh1`~F{fKZ0KctQ0~UW0|bi_~uvM&c}cImwEiR{v+eJ +z-N{}5=*>vuSn`$?mG|ZycpQn(k04)kS}@k5bwHe?U_7z+nNDC|U?H%~Y^V(jRwc2q +z8RmQkAL}tNlqU8aMmERU>r@SAG6v@ +zIQ7CY%4ZMrP1kN_cCtd8UaB+7%(s^L!m)X-**ZBSY*=YE#YmGV_dUoCOa)DX!yAcq_ubfLC+DUlAeNAT`<-R@D#3w +z_}FHY9it>rqn`9LVrLSRQQo710AWL1)XiK*UcRNw?=CD-b(Yf16tN62NJ@BON>qjA +z4RepN?eu3TrEQF?U`Ds#!#dh}ob?&d!Bdk7f$nkS*%yF>4I^W0X;zph4JjqPUdqyZ +z7o8R7VQ!LP@WP=KNKwXn&%g{2h+-NaC#f}w)y+oj{oea!@#JOlrprDZUiqBsj!Si!z8&-qQCars_W1e4<)KIfr*cuhx<2aZaAR +zz}5SAAVgt-1Axto@QLvz<71YEm2({W;(2UsoYF|h_0=iDY85X9lN&cv-m(#+z^evQ +zSOSr2)4f0tqD6&jD6k%um*zS4^g%}B4zJu$VZ)wlkt(I%uhZ^SD3>5gEX}ee)SA?J +zqA1S%gFW{0e8%-g&3XKS%-gHkY(@u6PK+>a^O$PuNK?yYiW3Lk48JdpC+vC>39Dt# +zXg$oe_<101>M&7C6wEV^}Oz +z+3mW#>L}Ypn1Nb6NT4{LUOqaiSvc>FViBhx9XtO~jYu*g9 +zK-K=BhYTDx%_XTGoPd){F;mTeKnXU~6#dANpg6zKwy%BJ)p~l{?14Z0kN^I+0eJ91 +z3-G@cARc^92adn@7k~METFJj&9Ynn8s_ndH?<`OL&cDNNye*?9SCvBm10gY9BE8Qy +zxVtQ)(B*E4*0^Ec-&<_ta1N9Tk!cSnz?Vz-oOou^6cd?@6SYjp)e}%@RFQ#3r9)kO +zYAoa9O+2vH=`q%947*bPvh2kob#{89#?-i{*IQ$;74!7G;wf2SyjG)GZ!-VfNqW_B +zoURfO6N(tT$y*f(CRsy9EmYj4lC1EGX-Ty@gGZ2>6q^JL`VF)aq}KA(@zYF?R*C_i +zF%~4bBfBh^vW3;_dPn>`n@{F_eY`K&)y~^I;%zAL_1@-j#}=<37ZU}6GSsS^ML5wOYk`F~dKr+@AM +zEj^1SMP&N^09zT!jp$siJOza#6(v6LR11vZLb<^=Pc`^QTNF=p#;{2P>n+BdA}BQw +z(h~R1;k+fVo^N{Dc21mGq9bH<4FqHY~}5E^@iJgZ!n9tkiWG@in-FE@Ag +zHm5dQFo}hsu^kA3F%Id~aHyv>K2Z59w#Os}oFf(i)uv{$YN6gB5CWN-ISYnYsfp1B +z##&51OYnZ33*tISYLa>oP_35P*{HDHyR2v)B&+lWbChC3u%vKe=;`Yjra5V82{n|I +zBP{7m{H5wOycZ;?!{t^*)@sres#VRAb7wfbyv*+DanfXXowC*r!$F0{dW)1IdoGX1 +zrN{`E67Ui)F1O=R3|%~2-ZI5QYSUpNuob92#CTL?*y=XkA;|;H5|h2^9$PK((j9Q^ +zM#a-7Qxc~z4pqUlWo@w8&j&~cRGQ=z +z`a;uR8?E#B@iqSZsb%(zXpU5Cym892S6yJ{O +zS{1+E7s|W!DSvnm7Ew68r`98I6nk4rN>wm+C^LTa@DVnTH!;SMdvax+H{(n(EVFp5 +z1EA2%h;;_hE>~H~!T_^i73T5AzDS^TRv?8#MGhi?2|T5m!s98d{jH-vaG6o}H{BdC +zS@$$+3Z{FYGz3FRx?5+lx?ayc*{E_L7^5yE^Qy#q(&J3DpXcc{PZ&B9HzZE#I40Di +z*zyP-2U4MhAQYZ5!WyEi0XvtAi69I;nZ=P>ZTg7{nGZ1iFUD +z;+5uC?mNj$RWnwvvDE9MwRGp_Te@D;?Wt=0rvN_qLH>uAGhjgmtOwDKMh!|PLQNqY${GT`!X8b54dW<{zo7-LCNn-%HVpw2r+ +zRe%U&kyw-!nrVs^3RA1Fxtda)+>rgpDr?qTf3Cky6?*d2!&>C&#V!xw7y0HRk2t0v +zTsjY_bwtJzrzZQo;xx@Z9~e*HI0mWBK2NME23_Ebs0JM<1khVJM_IARH+ +zDUm7zc5(OjiQ`-kZrr5Uy+Kh@0*T&UHC(uE$0VgcaVoQ&J@*Mbns> +z30U1V8=L1YKNe(&JF3! +z3`IAku$)Ox10CRFPmmdi33M>zPdN)FHF)D_#jvp^Gj^;g*U`?ecl>)%NvRZqlJ*43 +zWqhl1s}b|9h(SCwO4eGURsL#S)G6x#Cd6fV?-B~DQI(tLX(cHII-_Se=jnF3ES#Um +z8qZq4%fn9}WBcR?Y2H;scv6!VQF8*&fhH&i*#;6gum)#LZp7g5)`PXU#NthUHN8UQ +zBm_X7L*GhBjU&~y{l=N_B*09;uJ<6@s0c{(g#gM@(h05PcoR{R`H-NBONL{Yf9{I$* +zzxhi5#ntMo0FZn=sJ-{LJ~{K_abm1ZQu)TK$Ngd|I2ub9Ed)ZaQ45+{;AO5_lk&36 +zKWhxppwHU!5=-YVaN*c#1}ohxJcdw#msvdl9vj +z<@5IrYJp&OG-T%DQwk-k{h0GBJ?7U2toGup!{nSVTn@ET1WFNVH3U#T(Uy5cniTo9 +z$XL4lm^1Th96mA6g@u)j;xIltNqKsfKYQ>fR)qwL;;Le-L1;lx(ga#%;LHHvh7s#-Li$k^->5T<2kvKGPl&@+`vLf@rEq}f@&2#v4N!5#~yf+=JStmW4*^bArg>M +z4Vx8uII;KZ6f&uCa<);jzyB-$=EnhhsrF#q`l{3*aF==T!3Xt4iSB35&z=6)!OFQ` +zxNh5&Sy&OekyqCulpLgel1 +z&mTC=!TFe%?P(IHMOrJ?xy+cM)gN$lt<6s*w2N< +zc?P{M)k+2HJ(20LW6M_Vy7N_dKP)DNl-YnyD8c;63$)L-DbF;JN{|kcY#@~+3EsnC +z;MuytQ&v9H9eAxtdR4H3QhD_XdrbkJb*|}`=XB(8fG8oTmjfCVicXht!{MdLW+pz5 +zuPd_oiYr{T5>l&%#fdUxHVo$xTEXJlfKMD;;FfJ;q}CNpAY(0IDPUo>#ar)s8Q;*T +z^XOC0a^&=ROlp{H)TvcUL$EqWzJ_xUipb=mTjhOz)e%GBF>vTLkOT1LoR3vFZG-TR +z)sE-3jR8Ans#*Ofgc?q@D*;hlqHio^QKdRQUT9vVHvolOqcbVX-2^wWf$?ZMM5U?sAwMxI`Gz{AUq8!8cRx^WDr8*~?!AdQew9{h@; +zk+xCZ7D3C_!1P3kb~k0M4MIpG1R5zmcSfK8S3=|sZ0_d&3P1q=!F%sj@8p*BlR~~b +z-T%5r?z*|!Xw)js2PIjlR#{$I;od+0OB};Aqei32^Di7_|Ng7lwQEP_g_L!W(lnFX +zKL6wq4j(wq_>I#;`bTc+U{W*OETLk0G^A0h6DUjUyC^w^iR*Z)C|B2z!s7gT?F<|@b8z9^rCD?s!AHM +z>M$|b8U)$QLl%C)+39F3Cl(cNdtEIvo=c3&=PJW`Xkw&BZ+Vq47^gfkngh`zYzl~i +z$Qkw9yinQ2u4$XI-!gp>PMVEd4XWMg4RKFm6il0GmK}G7Hi7% +zyAv1_B8t53E7Fj@@>7ZeTx3sy9P7Zi;xx&JnSl4jQ%FlL3$7GdO)C4E%_RYrP8spnDc6gyf*Z5l(QDM_i0 +z^h3Xb3q6Z70-Gd!dd~5#<{G!oI*hI$wF03it*uaBoyTpTME`>~P`>M0OuG+Ci>zW%i=FRdVj$~O1v@+t?PdKRS=d7c2vb1R%Yc!qMb0uqcd!|8dFg7cKe +zMj0KgqI`5z88vVbh +zf8-S*KvMF|(Z!4ir~_Hp<^)0hxmedCU0cms|dTxo^Z{5$%ots$g^ijjA8RaGC=jS1hBPMVA#&OEn=m?Ek8Eb8U +zXW<3gHqNrv?eXmC^BMg-(3&vR1YL`>Fc5}HDW}Z~Knz>h3eVaa+r`pT92Opl +zL0}L*#<}5K$}U@Kn>G(8@o68Gbc@vBAk>^XbDF={_e%Ee-ol91w5nqmJwrI?Lu!#b +zXEF~jnI>3W#p?=b>N(v?DY@Z5`SWv*e_KDto^e4Oj3Ql%ss*UMv&7e5jhmT9T1R>D +zEQ@CicBF~Gt#i8+#v=m+Upm@5_(K4EaJU!$CIKYVjePJT4dvYzPZJ*}-|3xS9(q*^ +zN4{SA(mNO%AI%DGAk%()_6uJoO$~!V#EBP95srsA>2X3(s@E|&&)<4MS)@!hJk7=! +zqy}dlc!`uL<=SfYUO1Jlp3~e9B2Q&Jc5oGW|7Z +zeTjg#${n}dz>j?Yckx|se-m40W;nO9!inSauJBvvxlwZtie0nGITLA%9UH=H09o68>!>&DJa_IqPak@LUN7SGqh|?6N>~Y~VV|2k +zOFMCriuQ!k;;bRAROr_0h>XEI1WBp30%~}+XTu{`#v?DQJPI41Vz7ASda(mVTy_#& +z9(*iv(T>NMfNp1!Znw_)?g~?5HBw`S9h**{8?U{Jk!F+W$#Kd--mY{mE5a|#FK5NN +zkg_)`*vX^O7}qu|4uwZ}sROBkk`pQ4ap;r3apY1< +zx2QY*CISTDu8ULlOCWjIw}0<_9{q*3JypZFqA +z9e9q?L>Y?*sQ~cC;$u4;h?S~rnJl9u8CWh%Y@k&Mk&ujaHrn^VJ7jwe4UBBt +ziEb|;vAJ_SMUH&8A8|MhQ9?6FJoT{>`^uh=)i!eB+ILVXMVQzWX4FY(oK>T-&Z9M~ +znUJk>FL2%V4$&*#f!?uosHYk95zFV17mh=}j}Qt}$mh;Zvm7~g?x<%s51&aKAvN}& +zKJ}S@|FPk`qwu!+8w-#EB==nGY<=^$eebV(+%I|OwD&%BZfKf(%gr}3Ix$Kwj*!-q +zt`2zifrEtA09O{o-9Bk&fE0o>iZQW8YfZDFzq$IzCF=z7ViiZ>!%&6Z`y1)^X21(n5OHq#0zxVf9;IYfOKhE) +zV8eznjJ27FYwOG;{W!^|@{%aFtgN;GD6%018Azt5HqfY+hg>x8Gdjz;g=M0|8KGlEHN-jSoo{IId3Z46oiKJQz*6s`JHt7|ms%hVfv#KH;cH@=L9 +z_K5x}NDYOHrbpvh>_(hz%uv^!)PoKrd&f%bFMIC4>Wz36puNFcpV8Ah^=W#kBgo?J +zO02azyn4TdSNsFa$XHgVsD2mMS%$SG@CqYBDy4+yS7-U{=RDg*i^mW5Fixdf3Jv1@ +zkAL{*f8$cessP8|27mxutVPU4QltFlZ~fk%@Xp^Wl?uw0N-CvfVq$_fzTtHl*-ta1 +zS5!u7L@q@rg%kp^xB!EVQ(WSS`+c-XsKnKWc`Fu&C1 +z+I_pI*J@a6GoP!OsY&|%1eI$!s$sy=(lXu`=5QHsGViHIgDsn9GOhRUPa|1v_nBK* +z8hY_24kZ-l&MxuDffq9K32O_E)=*>O1)WvL%Wj`!=k{re_~@L+-m(~#@zn;zG19@p{D3D;cL-Z8zT~QWdgQH?8D!d^g*C&0xjxmLjnFo* +zZ=}!WU7LxmBZ#_)UJKXnBGPzhwBQBRu+MzFf!}>$GgC6b0ihJBb7>%ufA+->{pe4M +zi+k+Afe#q|4=v6AxmE1QnXS9O^NU~j?AZML;_KJeS|(0Y-S71?`uEB6Yivl$IPFNK +zBScWCRI%O;xmQ9FX~pDNnGu~(7bRAjP3mbv*?T;SBA^oTj~NDg3QMiLg7dNf(N``3 +z{)!}JE?-5~crm?}#AXEVN>s`h(7KBdLp_VPl1fFf&`Bs;mt8YzT2ii$V2mrskdqS= +zq>)7;FxFA8mN-ARM3S0903`%CXEXZE_N|*aa`G%Qlj9g;7|DKqp6jpP2hP$@EMIu! +zNoHpATy?QNO3;Iab4!LhUo%3pripX6cn=iW^jedytx?&1J$0Gj(+E^M7wN{|bldGO|L~U0)2|A&N+&mr2j6(zKH_eVNACMF)(v&&vg6LFlgIJwgLw3u(?c2z|U0#{~!`zyyI2)=T3lIQdn02GFOJ&9!-WIj^qG+XoPUi{P*y{9tC#)&AfIfBWl`h>w-R@b(~3 +zMhdAfSp+@)#V43Q-9ywQHnzFa(17)o~e6<4Xk +z^HsJLL;_|8%H1&i{5j` +zNXV0|gn{#nRRgxAXAq~KB-E1_Rmp(m(-<4CF&B^W +zNc%b-G+PPjG1Y*str$Ou1CRgmg$pOX{;7}rROb>nE~P>N{Otuu(f+;H<__8`pZw&9 +z-u}7Ie)(f_b8|O4M0)zv+2G8n7N(-8c#(NsnU15R1?5mO--8>bf-E~wSdXjLsCrMy +zIxIz0>5H5Y#nJNO8GDy|JHJTfUV!XHu3x!Pvf#4l0hizFw{IL{?ITACHjU$OwEG?Y +zfM*zQ#P?-!#HE(O?GaZ<;iD`Gd5C%+#hUlahV<4w!pf0XzOgodY+w`WPW}r +z0}}{bnsWNge8#-(blWI3UT97Hx +zhz-YLE8$!!m|a-JPmVFMp~{g?Ligkv4uQ3XO0~+lQ)f8$nMZi*x7`JRR3iI-JhV1} +zY`ioJDN+F#saP|Lqv2j297sBmW0&faNQ+ZJ>YWb+@_?$Uw_gOu>Z{-Ppnl-qcN&1d +z3jirZRyjx(-uT9Ecyn#b&JS-KYu>IBYjjEJ#0}F@bs&anGbvb&Q_e=0Z0|z^f>br| +ztu~|GE(8*sFQ^@tPs?A722y0`#!{`@d~ec@5XeBHSYYywEmrI<#ut;hQLQ>RL&bq7) +z*}7?#Lq|_CJ28r}hRqX`eCiWlqR)UmyEl+A32nWv8Nsn0&e*_AefL6UK=nvFVV&(CL5bFCE4+aecSDZ%XQG`%P-lAV&C$*4PF +zRYO_fwaB}-z5uz6Epw+OyY@7xHOjePKvBV8cIc+YBcn_id0F;40({Qi?f2T8^`lIb +z%UGM@q8K|!ka0@g8*F5dGUVLBr+M~6PqB4&l8T0MpfmdZstpiAa;=J)@`k!e2@=cZ +zvZ7fvm@@Qif^#l)#_8qd&V&8N*jxT@fCE7D)m@qNQHV<*d0=&)*zopn>+GMGlzfA5 +z-Z<~ozzY$Jn47mY*uQy%W<_V4T1pG9Ow=30b`5DdG)PD?&4$D{fz2K;2CNlW56%~z +zsG?&dy+;)!MT?Za*yKtH0yPZQQGk-ZFiud?p(N-GIFc}X?}k6ChoDjtyi2)m*Eny! +zZh$nms$VaP9uxEU&I{^!OSJGk8#gmq +z52%!6HV}@H%$WeCJ-aIbtt7#EXjxCR7ST?lVGR3_h!KUH(brl*I&bh`FWmw;W&>!b%dXM{~z)8S6$7G*ImWtjnmm2L~F&w_$YgKY~k?n +z)6`u^Vhuq_=UNp99>~*nWn$^~B=vF0)(sjlS|vqN&AwlN%d8A+1YJFI1CVyy8GD$sqJ9b7#kXziDossYObV$6)({yr5)L!ovOX2{k>KQp}hAI@U7qQz3(~E +zY}9|&CK1c4q3wnZrIer~gKV&-r9x(A$eyZDNDn=mBJ-i1!wo%bfn2vy00KOyp>=1N +zrRfS9o}pq8OW!%lYDk+XtZmj6xdM+9mKF&L2Y3P;vza1NaMsuiP>B^Bj}w-xW9*FO +z>CZpPzTG9-{Q=&XY;JJlwpkMExbLBZ{OKpZoJAVna@~G*@7m6rUh{HZ_0pR;b>;$( +zK5>YD`7i%~#?}$u^78B0yL)?fs$9Kq7x#VYNp9LUOR5}=O2}}D+>%IQqZFAqj$6$; +zra%W3l4>21U$6X?jGE$OKg0g{>UqSmLGxj +z-KxJ=00GE3TH<09wfM{5`sJVdv48RYBfWU=n_(n_og+fW$Q9Zvq!l;;(t+?$k2EAcQ{L?e$4F{JU359o=uo0M5^q^2lFE~9 +z1`#7Ze%0Nm6&QQ*whbLNzQOXGQvCb7S4wQ%BDh>mu`{6q}rTBMTNxe39&M7DG5}5>!k`XNWi0i9ktd(L`b&Nt_q(c#UIfcE?AW%MuYc=ndDClO&O;A^SfLuMcM#_!19+;+mZ^q<$!jYNbA_C&$##=gSJ=S_Yn3ih{tp +z&&0-j_r34D<@BpBI^{g}?z>Wo^)-Ne<*ekrcb^7c_le*5)W0{HAN7C-Q%|MtSp&|q +zp@ +z`eB6jf-$E!>^ofTs;D}2LWw2iw~zi6fAZ)@x$XK_Y01ltNz{j3=p1o5e+fif->nqqP$?|=5Y=`^8)8jci6CZoW-S>SG;6nW*}};M}lW1(Ky7g6>Pon%Io&P +zQF7ux{N~%Q|1p5~T?EGicfEM0>T3X52a-$5#7p9|!`SViP4OWl;4rzYrWLlMOwJc+YJ)}f`m +zY$n+Ejvczn{^}&FVT4lD<7vd({Rpj!#cIJ{9Qssty6i5E5-W%D1$U*OXo%cA +z@5<%zxSXKqoW**FOFiJTBK-P|fpiS!sP +z&_*)7QeiM3v9>s%yU?e!;;5zp9*|B9QAXW5?%c8&4&a^!kR0?c+?3RMFmHoMUz1SnegZ=3`+!+QO%FS>N_6Z@l&oE&)S; +zxa9c^@HK$^zh8c6DRdxs!}q@7#Ovli|3;sfpXwQxj+M$P7S1^DUBznpvEc(NhxyaR +z6a1&eLv(rx^*F!@4{k^xT*K7H5|9Gr +z1dT-Ul!>^>g;{L#Q|UZUEFa<4n{LYT5=SRDf_IQp$XOS;a9MKJl9CP! +zt%%5ciZ#X(cqJ8OtR +zFSA~q>l&h!Wzr}ve6pN#oSs{Raw&@%a3;Z}G0MfP_4}k*W}+ZT96`Ozu8Ag-m7#cT +zwV$}NYq8NbQ6=RgYyD6D=%?;|(?7d@+llW#a3Ht@jQ^Qp{A&OyEQM}KFP$VFxZx*W +z^NTeh?hKUrTqK;99$8KTGZ(iBoT4TIc87JQOCxl3idZ+#Xmu?!wF;^7I05TY$BC_l +zb@LDDhX8p=V+LCh473HHVulgX&!sUpy9%py$45>*%1f`gKKr^Pq}~`OjnZ6j55*$S3{f#t4JiGN$BmyBtsdnw;t;R(<3#e%7SJ!#5-qJx~W|2r&?n_S61Bhqjz5S{`U@}2-F8|xh3Uq +z_|p81U&WP+2QShMzUvpi;Y+})KK^T;{9$e6&#BappG~_CA$-ppwO=$)fn*Svq0t%) +zO`Idc=uDHow1s&y2t1H@OCAJ<#M5<_{iOz5>!Y-Eg3KrJO(QvPB1U7&#zvjL>KtOR +zzeuHW6>Ggd7tWpGkq17^#vR+4*f5*B9_E@1#N`O_mlNr)G)wUaga;)u`_*i=(OGE` +zl*)8t$IEt)Q>zREKcxba6u)Jbqy$n$AZkdlz71^AI-y)ivyZ#039IdtgFlV-v2No8>gsM>nyFT^5jCoTZ~7;1_)lZ5 +zd|R9*e?FHEWErUj-kI5;>U{vIwB!SHqJgC>C8e?^5$-bAAK~+$9ViOZ$U9!roWX}O +zE4aa<9h9u+$)v|Ce2rev=g-a`;7zyOk#VPzK}x^3!k!(kV$;;E45Ag{c$GAbv3a}K +z=6Qhl%U{`Hoy1oZz$s!8d}=bi`Mx_}!%c5`GrMlR2{%{*m!OmycEz+NnjE2;I_f?J +zWs4EHkO|dVOr>h*c3PZ2afSm=JjZi$3tY9M#2x!LGc~!HARMP3E6U9gf>&#JByo|L2we2@sd+ +zjl2K1cd5R1f?R%@T%4?We0G{#1k7>ZoxlDA&%LFD_?HfM^F~!CRn9nx^bV^wLg|pDwe765PSA_a5v45vw5p&~2_=dsOhirse6cH-&-L-$;?Mm +zHIB{q8Q-*-SMA$`a3y+CKx%U^2~R0hRJU$s;gP2qdF}{j*V<626lu8L8+w&#QlSZ) +zAw{?uZJai-t~Muit)veGf%t`gdeHcZN!ERWfEcWGN)OrixW$%D>kXY^V0e( +zHtAQ$u)}C770<_(o@eLgQI4NHi*uf1hn@vIeKSW{jI&{42V-MfNzxAe +z!7}aM1vv%17!(C1XA#O9q>vv1P`gMlM4paiIO-n_;L +zM88jc?^ZtZC!gZcT9XYE+ZZGk#Lfd;{;Fq8I*)QL_pq76~BECz&jEg+pSktIhWlN

v9KIKz#VQ8tyE8Fd8Vae%TA8h9q|b4S?VbZ?O_hi%?IvooWAfBAt2 +zIeg$LcHO*{XAb`vp_pW9Vn3rJ+i8qkV&hISX?GAOUHXG1TCLM8cFti^M<^kX9*-FU +z)Pu;)*|c}qIKc-cO63v=7@HU;9`v)AZRIUNAn{UAZgrThH2{au0dZ>StaRzDtzrjj +zBo2;u>fChIHB2|_#7R<6+}Cjj@<k`{j2*jl+{I&o3j`_F!=v#ieV|YoR +z_}5X-EtLbM1EpjvtpS`D9*-}ALHoJ=P$V5MDbJ8@C) +z+_-ByjYgewCysIGsb|=G`!z@r(yVPk1(GxKpXc$X@8RH+f63X?j}r}ARKhwNr}i>B +zc{>xeZCp2z&@4$}3j-suULuQ*lh2ZGt#ib2M4H5er4ll)T@qvHTsS$5M!+#5%E&=T +zLY;2caQf(JR?eP4ryXJoC)y3}xaK-GG%7?%3<3%{fX_2kgdr$(DOY+xjI#-2jWX3B +zz&QwP?l|9SpWRJZ`~Hvk-8J3)$7$kOjN +z2*f=fxJSSHN8f!4___DK{rB&A<&N2Zk_h|FUij^Kf5?nQ}_a0|{ml4OOW +zr$2%`RcCx`9~-B3axSj3yOyxE=9p=c6~GHUpXu+rsXz-T2g5l+>OIj)oAyeJ^4>B6 +zPZFmrF0C*s*9gKfqBurY#&Am0Y4=#Ua2$mpsFXOhVp%gIy!_g$sg;7Etx&-j7+yC$ +z4jn{j8!kAFAsPV@Riy!XT3aT@rk``&loe-_StgIB!U!41MAt#CNwjWJHP1LP~! +zH2qRaM<;|{V1)-S2#jYTO4y-8y2*e?j~wJ>+g{D%Pdv%!^e9q-%e59rQLu}pmz2s) +z%9T;T(T`8??6HHSZjxG4p%O*2l4e7-@rq*Wh-YO0i(SFuz>@T1Lg!JH02PLWVMwpr +zAx$ld=gzRd8DLF9P#z&DRZ03C+Vh7g$&`UB^V#Dbt(&~#_I-qb&Q8Gs9G+qKNvD*; +zK1wFJtGvLPlt6g5yxMgid7`5?PEF~k*CJ_dJ(z^eduqMTUv?jO{~W+2vuLil#``R8 +z-~#}B4IqDu>JtRw!S_C>-g5U_=73-O*e`$Vw+A+P3-BFfpknlF$CEy9^F+1FzQqeHp1Z)cwCu#1g +z6GuHpCTFnD(_J`8K+JN|54 +zjqtA<-_2kA*`MJ`Lr*K~?7HMb3Q9Z0r!ud13T74clA>7#;}pju!I{W0TQN*j1l7PX +zT7t>#4UWzAY0SKWtFONlNiaZb&G~a@*)o#iU4jg2l&fRJ@c`rCe7nI1PYGT#rFq>g +zdyp!?IExUn;8l6y3BxXd>LEnnytOXrtV-YSC4LX?0e(4a@AG4IeX?Ty+O=#U-%R+*(OlBPGfuvy4)b?ukq;NIX-bt +zaa%Lxt#|CBTp9-NWU9l$%S3t=c3r4jLQ+!1UDEa%_^d^6&^Uj;LjLvhkFPxZfs1(? +z0GCWQc;^QHzdKssYbVIxaO%pXI^|C8l<)q)yHnty-SE&azweKll~QTb;@gR +z+D)ZgAvMNJA#y_(JVGevy$pnrSV7udPQ_sDIb`@rDM}wpn(aq_;uk;PAz$yiXwmfE +z2Oo5QgA4Dk0pzPtr#JxeE7*JP{?;~d|E1?*-}q-A@7}Wivu<$b9#OxuC(X59vO_|! +z(psjWo4HZ6$b)XZ_tp#Hgg`ii6hcaM=^dirTlqreDu;82{1b^w4Yt!mbYn(GM>y3r +z-1XW!nVy>9+_?*M2N9h!N4REl1M7xa>CPH2rSR5!o?9CDw_m%-kB>A&oEWKOMwJv$ +zL?EOBe?lRiNju9A*|WzVif*{!xx4SaHv#fL!>cvi}V95=e3Z}JC_{2YHsf2JB!+Z;`hGhnneK* +zUOXwh<9}s+?F9MS$#OS1fPA(h4qbCd0Pf!5#ygfjpCDg1+;GE`4{GChH|p_|0=A+2 +z7U#v7z>i`5s1tq+XaZ%RLPEK}uv)$LWp|*%u%9GJG};^)q|QZYYTEs7Z#8YtuT9@_ +z*J>KKR*Z?y3N20vYnI}~tTiU8E5G{Resh5{iQVGd;eb-+h1G%A3kYW +U4SGmx!~g&Q07*qoM6N<$g0tUl8wLo!q*HRn`6f5rV?*HD)IX5{c diff --git a/patches/server/0004-Reduce-constants-allocations.patch b/patches/server/0004-Reduce-constants-allocations.patch index cb20d6a..f0ba27d 100644 --- a/patches/server/0004-Reduce-constants-allocations.patch +++ b/patches/server/0004-Reduce-constants-allocations.patch @@ -8,51 +8,40 @@ This patch includes code from the lithium project under the GNU Lesser General P Original code by Titaniumtown, licensed under GNU General Public License v3.0 You can find the original code on https://gitlab.com/Titaniumtown/JettPack -diff --git a/src/main/java/com/destroystokyo/paper/PaperCommand.java b/src/main/java/com/destroystokyo/paper/PaperCommand.java -index 8ec20f17a3f8c39ae3ebf3fb630f98b35283ba88..bb220f27f5d472514d9a1620a40ed50fcb31ae16 100644 ---- a/src/main/java/com/destroystokyo/paper/PaperCommand.java -+++ b/src/main/java/com/destroystokyo/paper/PaperCommand.java -@@ -218,7 +218,7 @@ public class PaperCommand extends Command { - case "version": - Command ver = MinecraftServer.getServer().server.getCommandMap().getCommand("version"); - if (ver != null) { -- ver.execute(sender, commandLabel, new String[0]); -+ ver.execute(sender, commandLabel, me.titaniumtown.Constants.EMPTY_string_arr); // JettPack - break; - } - // else - fall through to default diff --git a/src/main/java/com/destroystokyo/paper/util/maplist/EntityList.java b/src/main/java/com/destroystokyo/paper/util/maplist/EntityList.java -index 0133ea6feb1ab88f021f66855669f58367e7420b..027b9a6a917aae43357c7a7b5595e6cf64fdbd22 100644 +index 0133ea6feb1ab88f021f66855669f58367e7420b..5f4ad69862b24b568b9e907563289624d196d6ea 100644 --- a/src/main/java/com/destroystokyo/paper/util/maplist/EntityList.java +++ b/src/main/java/com/destroystokyo/paper/util/maplist/EntityList.java -@@ -17,9 +17,7 @@ public final class EntityList implements Iterable { +@@ -17,9 +17,9 @@ public final class EntityList implements Iterable { this.entityToIndex.defaultReturnValue(Integer.MIN_VALUE); } - protected static final Entity[] EMPTY_LIST = new Entity[0]; -- ++ //protected static final Entity[] EMPTY_LIST = new Entity[0]; // JettPack + - protected Entity[] entities = EMPTY_LIST; + protected Entity[] entities = me.titaniumtown.Constants.EMPTY_entity_arr; // JettPack protected int count; public int size() { diff --git a/src/main/java/com/destroystokyo/paper/util/maplist/IBlockDataList.java b/src/main/java/com/destroystokyo/paper/util/maplist/IBlockDataList.java -index 277cfd9d1e8fff5d9b5e534b75c3c5162d58b0b7..52ec153be9d7177102dd137dfc356e29173f62bd 100644 +index 277cfd9d1e8fff5d9b5e534b75c3c5162d58b0b7..093170c13b3980791373fb240c9ec6c5adfc1519 100644 --- a/src/main/java/com/destroystokyo/paper/util/maplist/IBlockDataList.java +++ b/src/main/java/com/destroystokyo/paper/util/maplist/IBlockDataList.java -@@ -20,9 +20,7 @@ public final class IBlockDataList { +@@ -20,9 +20,9 @@ public final class IBlockDataList { this.map.defaultReturnValue(Long.MAX_VALUE); } - private static final long[] EMPTY_LIST = new long[0]; -- ++ //private static final long[] EMPTY_LIST = new long[0]; // JettPack + - private long[] byIndex = EMPTY_LIST; + private long[] byIndex = me.titaniumtown.Constants.EMPTY_long_arr; // JettPack private int size; public static int getLocationKey(final int x, final int y, final int z) { diff --git a/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java b/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java -index 47b5f75d9f27cf3ab947fd1f69cbd609fb9f2749..d3cdf40330a99af729412a7a537ec705c16cc327 100644 +index 85882eeb86d7b74db0219aa65783946d8083885d..06bcf27bf42ad1b6259999c25fe7ae80eab1263e 100644 --- a/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java +++ b/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java @@ -63,7 +63,7 @@ public final class ChunkEntitySlices { @@ -64,15 +53,16 @@ index 47b5f75d9f27cf3ab947fd1f69cbd609fb9f2749..d3cdf40330a99af729412a7a537ec705 } // Paper end - optimise CraftChunk#getEntities -@@ -189,7 +189,6 @@ public final class ChunkEntitySlices { +@@ -189,7 +189,7 @@ public final class ChunkEntitySlices { protected static final class BasicEntityList { - protected static final Entity[] EMPTY = new Entity[0]; ++ //protected static final Entity[] EMPTY = new Entity[0]; // JettPack protected static final int DEFAULT_CAPACITY = 4; protected E[] storage; -@@ -200,7 +199,7 @@ public final class ChunkEntitySlices { +@@ -200,7 +200,7 @@ public final class ChunkEntitySlices { } public BasicEntityList(final int cap) { @@ -81,7 +71,7 @@ index 47b5f75d9f27cf3ab947fd1f69cbd609fb9f2749..d3cdf40330a99af729412a7a537ec705 } public boolean isEmpty() { -@@ -212,7 +211,7 @@ public final class ChunkEntitySlices { +@@ -212,7 +212,7 @@ public final class ChunkEntitySlices { } private void resize() { @@ -92,15 +82,17 @@ index 47b5f75d9f27cf3ab947fd1f69cbd609fb9f2749..d3cdf40330a99af729412a7a537ec705 this.storage = Arrays.copyOf(this.storage, this.storage.length * 2); diff --git a/src/main/java/me/titaniumtown/Constants.java b/src/main/java/me/titaniumtown/Constants.java new file mode 100644 -index 0000000000000000000000000000000000000000..1a39467fcbb849c79bea21a020b4270a2850e02c +index 0000000000000000000000000000000000000000..60bf30759a26c04c0f79ba739426aab1de955243 --- /dev/null +++ b/src/main/java/me/titaniumtown/Constants.java -@@ -0,0 +1,14 @@ +@@ -0,0 +1,16 @@ +package me.titaniumtown; + +import net.minecraft.core.BlockPos; + +public final class Constants { ++ private Constants() {} ++ + public static final Object[] EMPTY_object_arr = new Object[0]; + public static final int[] EMPTY_int_arr = new int[0]; + public static final int[] ZERO_int_arr = new int[]{0}; @@ -217,7 +209,7 @@ index 0a843e0afbcb1af8e2641515eb244b791b819b8c..c420ce5c1bebdb0abe273d73a61a15e5 OptionSpec optionspec11 = optionparser.accepts("port").withRequiredArg().ofType(Integer.class).defaultsTo(-1, new Integer[0]); OptionSpec optionspec12 = optionparser.accepts("serverId").withRequiredArg(); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index fc3d65885cc704f807ddcb07561b4a529827166c..ed25891919bbd372b042f343d3b3360fb1654ca3 100644 +index e995aa81665bdf582f753acec3f0584f0060c851..f895903aaf0a69c65947c91f7f486f04991434d8 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1371,8 +1371,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop> list = Lists.newArrayList(); @@ -245,7 +237,7 @@ index 1eb912ad97f9663bf6bd336ad739f2552b0a5c9b..9901ffe9de585a73e9ef32c700b1e870 for (int j = 0; j < i; ++j) { diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index d0cfbaf3fd5573f33ad3afc47a35157c0da5233a..1936cd779223f0ca7f6fa266725560fef40c3653 100644 +index 32a39a150a3d2bbae95a726901f3f46363e34ecf..7b80dfb72b191bd86e5e4443efc87713814b6c4c 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -871,7 +871,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -267,7 +259,7 @@ index d0cfbaf3fd5573f33ad3afc47a35157c0da5233a..1936cd779223f0ca7f6fa266725560fe return ret; } diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 60373551c49386652de286127636b61f31e88527..ab084c7590ff777889dccbbb821bb099cdd7e215 100644 +index 0960025c64fe2e8c055fcbf6e695ff90c1f41cd9..f4e12d6a122dc66505289651de105cfac5dd7b86 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -385,7 +385,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser @@ -433,10 +425,10 @@ index e8e60ea8b9e97ed87be78752f398ab25ba8e9a1b..9980df9128dfc51f2afbca8f4aa2031e for (int j = 0; j < i; ++j) { diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index 7fe5908020c4577c1e4d6c00af382cf536351d96..5bad71b56b45085c01ae2b0ab95067c85cad1f61 100644 +index cff0ed9ae6e79f84870343e43574f384dd73ea88..79f5390cbbe014687010b110bcf572bdcff3339d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -227,7 +227,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -233,7 +233,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { return; } // CraftBukkit end @@ -512,10 +504,10 @@ index 2f9f15d99f8b31e9f13f7f32378b2a9e09bcb5e5..b9579e3d1610ddcb5251baa2dd9462e0 @Override diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index a26799f92db1699d2d5173e2e93be29273e1a317..a4e29b171a4f47bafdc9ff278ca00a071b4269c0 100644 +index a2a0bc4874a031c964a5cdb5bc26494cd01351eb..670e2ae1ef532089c0ba76d96f6ca23535599b1d 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -1522,7 +1522,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1521,7 +1521,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public org.bukkit.entity.Entity[] getChunkEntities(int chunkX, int chunkZ) { io.papermc.paper.world.ChunkEntitySlices slices = this.entitySliceManager.getChunk(chunkX, chunkZ); if (slices == null) { diff --git a/patches/server/0009-Add-last-tick-time-API.patch b/patches/server/0009-Add-last-tick-time-API.patch index e95775c..f968642 100644 --- a/patches/server/0009-Add-last-tick-time-API.patch +++ b/patches/server/0009-Add-last-tick-time-API.patch @@ -7,7 +7,7 @@ Original code by YatopiaMC, licensed under MIT You can find the original code on https://github.com/YatopiaMC/Yatopia diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index ed25891919bbd372b042f343d3b3360fb1654ca3..a9bb700ae1496e3c23a19b62fcc4233c18a0209d 100644 +index f895903aaf0a69c65947c91f7f486f04991434d8..d8099a9bac8a6dc48e1096a4d0a56abfad969cd1 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1117,6 +1117,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop explosionDensityCache = new HashMap<>(); // Paper - Optimize explosions public java.util.ArrayDeque redstoneUpdateInfos; // Paper - Move from Map in BlockRedstoneTorch to here -@@ -372,8 +372,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -371,8 +371,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { // CraftBukkit end timings = new co.aikar.timings.WorldTimingsHandler(this); // Paper - code below can generate new world and access timings this.keepSpawnInMemory = this.paperConfig().spawn.keepSpawnLoaded; // Paper @@ -33,23 +33,22 @@ index c81520efe726efa7d6ac61c37f8eadc3cda5bc97..083b68897759640ca041a9d781b7ba7a this.entitySliceManager = new io.papermc.paper.world.EntitySliceManager((ServerLevel)this); // Paper } diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java -index bbf15fbb889670e57bd86377590a1b3abe80b96d..5a16e64d1555a74acca98966f1a6b2269280f366 100644 +index bbf15fbb889670e57bd86377590a1b3abe80b96d..ce61f9e8a835bc5e2d3815e337ed9785f9d06f04 100644 --- a/src/main/java/org/spigotmc/SpigotWorldConfig.java +++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java @@ -435,6 +435,7 @@ public class SpigotWorldConfig this.hangingTickFrequency = this.getInt( "hanging-tick-frequency", 100 ); } -+ /* // JettPack - remove tick limiter ++ /* JettPack - remove tick limiter public int tileMaxTickTime; public int entityMaxTickTime; private void maxTickTimes() -@@ -442,7 +443,7 @@ public class SpigotWorldConfig - this.tileMaxTickTime = this.getInt("max-tick-time.tile", 50); +@@ -443,6 +444,7 @@ public class SpigotWorldConfig this.entityMaxTickTime = this.getInt("max-tick-time.entity", 50); this.log("Tile Max Tick Time: " + this.tileMaxTickTime + "ms Entity max Tick Time: " + this.entityMaxTickTime + "ms"); -- } -+ }*/ + } ++ */ public int thunderChance; private void thunderChance() diff --git a/patches/server/0023-Configurable-flight-checks.patch b/patches/server/0023-Configurable-flight-checks.patch index 27022df..31c662a 100644 --- a/patches/server/0023-Configurable-flight-checks.patch +++ b/patches/server/0023-Configurable-flight-checks.patch @@ -7,7 +7,7 @@ Original code by YatopiaMC, licensed under MIT You can find the original code on https://github.com/YatopiaMC/Yatopia diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index ab084c7590ff777889dccbbb821bb099cdd7e215..1329314774a15be493703dac0031e8849865295f 100644 +index f4e12d6a122dc66505289651de105cfac5dd7b86..8058c98db187aa4525d30ac4bd1e70c6babdaa87 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -342,7 +342,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser @@ -29,19 +29,21 @@ index ab084c7590ff777889dccbbb821bb099cdd7e215..1329314774a15be493703dac0031e884 this.disconnect(io.papermc.paper.configuration.GlobalConfiguration.get().messages.kick.flyingVehicle, org.bukkit.event.player.PlayerKickEvent.Cause.FLYING_VEHICLE); // Paper - use configurable kick message & kick event cause return; diff --git a/src/main/java/wtf/etil/mirai/MiraiConfig.java b/src/main/java/wtf/etil/mirai/MiraiConfig.java -index 667eaabe95e9b44cad64dd5aba5ac693f4d726ed..8740dbbc4068ad329eb53ee13683a77903fe6d02 100644 +index 2849478bde14769d1202ca15ecaa8a341f1043a3..7ff2d1e0124757401b4e70158bbe5ada18614aa3 100644 --- a/src/main/java/wtf/etil/mirai/MiraiConfig.java +++ b/src/main/java/wtf/etil/mirai/MiraiConfig.java -@@ -194,4 +194,11 @@ public class MiraiConfig { - maxBees = getInt("max-bees-in-hive", maxBees); +@@ -144,4 +144,13 @@ public class MiraiConfig { + "Allowing more bees in a hive can reduce the number of ticking hives."); } -+ public static boolean checkFlying = true; -+ public static boolean checkVehicleFlying = true; ++ public static boolean checkFlying; ++ public static boolean checkVehicleFlying; + private static void flightChecks() { -+ checkFlying = getBoolean("checks.flight", checkFlying); -+ checkVehicleFlying = getBoolean("checks.vehicle-flight", checkVehicleFlying); -+ } ++ checkFlying = getBoolean("checks.flight", true, ++ "Whether or not vanilla anticheat should check for players flying."); ++ checkVehicleFlying = getBoolean("checks.vehicle-flight", true, ++ "Whether or not vanilla anticheat should check for passengers flying."); ++ } + } \ No newline at end of file diff --git a/patches/server/0030-Spread-out-and-optimise-player-list-ticksSpread-out-.patch b/patches/server/0030-Spread-out-and-optimise-player-list-ticksSpread-out-.patch index 18c01d5..842a0d1 100644 --- a/patches/server/0030-Spread-out-and-optimise-player-list-ticksSpread-out-.patch +++ b/patches/server/0030-Spread-out-and-optimise-player-list-ticksSpread-out-.patch @@ -48,10 +48,10 @@ index db4b6d7fe91c1a071a833db842f664ec6ba51932..7502f715849fdefc96ad9808cd2070d3 public void broadcastAll(Packet packet) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index abcce6bd0b32d0188751393a6f56f2e82530912c..97dab75ac1ec2b22ac00392b6b22f63fab70b17f 100644 +index 287520f91e22309e1268be1940e0fafb628980a9..384d00b9e5767752ecee946c9c596ff0927b8364 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1729,7 +1729,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1736,7 +1736,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public boolean canSee(org.bukkit.entity.Entity entity) { diff --git a/patches/server/0034-Disable-outdated-build-check.patch b/patches/server/0034-Disable-outdated-build-check.patch deleted file mode 100644 index 411e95f..0000000 --- a/patches/server/0034-Disable-outdated-build-check.patch +++ /dev/null @@ -1,21 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sun, 15 Dec 2019 12:53:59 -0600 -Subject: [PATCH] Disable outdated build check - -Original code by PurpurMC, licensed under MIT -You can find the original code on https://github.com/PurpurMC/Purpur - -diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index dab3d736ae60b255b3151ddcf2b5832c14ecef53..92331bc1893142345a5e70cc6a0c64fdb17f4b74 100644 ---- a/src/main/java/org/bukkit/craftbukkit/Main.java -+++ b/src/main/java/org/bukkit/craftbukkit/Main.java -@@ -270,7 +270,7 @@ public class Main { - System.setProperty(TerminalConsoleAppender.JLINE_OVERRIDE_PROPERTY, "false"); // Paper - } - -- if (Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) { -+ if (false && Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) { // Purpur - Date buildDate = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z").parse(Main.class.getPackage().getImplementationVendor()); // Paper - - Calendar deadline = Calendar.getInstance(); diff --git a/patches/server/0035-Fix-outdated-server-showing-in-ping-before-server-fu.patch b/patches/server/0034-Fix-outdated-server-showing-in-ping-before-server-fu.patch similarity index 100% rename from patches/server/0035-Fix-outdated-server-showing-in-ping-before-server-fu.patch rename to patches/server/0034-Fix-outdated-server-showing-in-ping-before-server-fu.patch diff --git a/patches/server/0036-Dont-send-useless-entity-packets.patch b/patches/server/0035-Dont-send-useless-entity-packets.patch similarity index 79% rename from patches/server/0036-Dont-send-useless-entity-packets.patch rename to patches/server/0035-Dont-send-useless-entity-packets.patch index 8fa7733..c9723b6 100644 --- a/patches/server/0036-Dont-send-useless-entity-packets.patch +++ b/patches/server/0035-Dont-send-useless-entity-packets.patch @@ -7,7 +7,7 @@ Original code by PurpurMC, licensed under MIT You can find the original code on https://github.com/PurpurMC/Purpur diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java -index 9901ffe9de585a73e9ef32c700b1e8702f8786d3..aa1bd3423829900729d413a5f98f4a0b9aaf6135 100644 +index f4569f8e53fc22a8a580fcaebbe773b497c11304..104b4f9165f417c4f71aa526e918c8e47f1c905d 100644 --- a/src/main/java/net/minecraft/server/level/ServerEntity.java +++ b/src/main/java/net/minecraft/server/level/ServerEntity.java @@ -181,6 +181,7 @@ public class ServerEntity { @@ -40,18 +40,19 @@ index 9901ffe9de585a73e9ef32c700b1e8702f8786d3..aa1bd3423829900729d413a5f98f4a0b + public void removePairing(ServerPlayer player) { this.entity.stopSeenByPlayer(player); - player.connection.send(new ClientboundRemoveEntitiesPacket(new int[]{this.entity.getId()})); + // Pufferfish start - ensure main thread diff --git a/src/main/java/wtf/etil/mirai/MiraiConfig.java b/src/main/java/wtf/etil/mirai/MiraiConfig.java -index 8740dbbc4068ad329eb53ee13683a77903fe6d02..0d5ebaad9c3dcedf6554e41074ecaff7659ff510 100644 +index 7ff2d1e0124757401b4e70158bbe5ada18614aa3..15121a29de7a5b6b6ae062449221ad586ead655e 100644 --- a/src/main/java/wtf/etil/mirai/MiraiConfig.java +++ b/src/main/java/wtf/etil/mirai/MiraiConfig.java -@@ -201,4 +201,9 @@ public class MiraiConfig { - checkVehicleFlying = getBoolean("checks.vehicle-flight", checkVehicleFlying); - } +@@ -153,4 +153,10 @@ public class MiraiConfig { + "Whether or not vanilla anticheat should check for passengers flying."); + } -+ public static boolean dontSendUselessEntityPackets = true; -+ private static void dontSendUselessEntityPackets() { -+ dontSendUselessEntityPackets = getBoolean("dont-send-useless-entity-packets", dontSendUselessEntityPackets); ++ public static boolean dontSendUselessEntityPackets; ++ private static void uselessEntityPackets() { ++ dontSendUselessEntityPackets = getBoolean("dont-send-useless-entity-packets", true, ++ "Whether or not server should send entity packets with null movements."); + } + } diff --git a/patches/server/0037-Skip-events-if-there-s-no-listeners.patch b/patches/server/0036-Skip-events-if-there-s-no-listeners.patch similarity index 100% rename from patches/server/0037-Skip-events-if-there-s-no-listeners.patch rename to patches/server/0036-Skip-events-if-there-s-no-listeners.patch diff --git a/patches/server/0038-Fix-the-dead-lagging-the-server.patch b/patches/server/0037-Fix-the-dead-lagging-the-server.patch similarity index 91% rename from patches/server/0038-Fix-the-dead-lagging-the-server.patch rename to patches/server/0037-Fix-the-dead-lagging-the-server.patch index 227c268..8ac8f3b 100644 --- a/patches/server/0038-Fix-the-dead-lagging-the-server.patch +++ b/patches/server/0037-Fix-the-dead-lagging-the-server.patch @@ -7,10 +7,10 @@ Original code by PurpurMC, licensed under MIT You can find the original code on https://github.com/PurpurMC/Purpur diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index e6d25ab2e7e19d9fb993fdad6f650212f560cc1d..a277646003fbec7e4bc8ca301a0934eeeac1151d 100644 +index beab9f74ba3c3ef294485ee74daf165475d29566..f85573a6ea0b670bb42252b17bcf88969f5521b4 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -1870,6 +1870,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1871,6 +1871,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.yRotO = this.getYRot(); this.xRotO = this.getXRot(); this.setYHeadRot(yaw); // Paper - Update head rotation diff --git a/patches/server/0039-Alternative-Keepalive-Handling.patch b/patches/server/0038-Alternative-Keepalive-Handling.patch similarity index 84% rename from patches/server/0039-Alternative-Keepalive-Handling.patch rename to patches/server/0038-Alternative-Keepalive-Handling.patch index 25f7be4..884f0b1 100644 --- a/patches/server/0039-Alternative-Keepalive-Handling.patch +++ b/patches/server/0038-Alternative-Keepalive-Handling.patch @@ -7,7 +7,7 @@ Original code by PurpurMC, licensed under MIT You can find the original code on https://github.com/PurpurMC/Purpur diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index a3b5b52f7e597dc128281eb8ff9c60e0836bab98..531cbee70d491adf5dee3b7c3ee10d0859506245 100644 +index fc37001445d50f88bc274eb501914d9db49dce40..785e9e9b4408c1193cb3680a3b55f90a8f0d5b0a 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -245,6 +245,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser @@ -58,16 +58,18 @@ index a3b5b52f7e597dc128281eb8ff9c60e0836bab98..531cbee70d491adf5dee3b7c3ee10d08 if (this.keepAlivePending && packet.getId() == this.keepAliveChallenge) { int i = (int) (Util.getMillis() - this.keepAliveTime); diff --git a/src/main/java/wtf/etil/mirai/MiraiConfig.java b/src/main/java/wtf/etil/mirai/MiraiConfig.java -index 0d5ebaad9c3dcedf6554e41074ecaff7659ff510..954bc508fea71af719c3203f0d4c93125976fdb8 100644 +index 15121a29de7a5b6b6ae062449221ad586ead655e..eda02eabbdb3c8d2cfe8c524fe9f5dfcca1089d8 100644 --- a/src/main/java/wtf/etil/mirai/MiraiConfig.java +++ b/src/main/java/wtf/etil/mirai/MiraiConfig.java -@@ -206,4 +206,9 @@ public class MiraiConfig { - dontSendUselessEntityPackets = getBoolean("dont-send-useless-entity-packets", dontSendUselessEntityPackets); +@@ -159,4 +159,11 @@ public class MiraiConfig { + "Whether or not server should send entity packets with null movements."); } -+ public static boolean useAlternateKeepAlive = true; -+ private static void useAlternateKeepAlive() { -+ useAlternateKeepAlive = getBoolean("use-alternate-keepalive", useAlternateKeepAlive); ++ public static boolean useAlternateKeepAlive; ++ private static void alternateKeepAlive() { ++ useAlternateKeepAlive = getBoolean("use-alternate-keepalive", true, ++ "Whether or not server should use an alternative keepalive algorithm.", ++ "This can drastically reduce players timeouts due to a bad connection."); + } + } diff --git a/patches/server/0040-Logger-settings-suppressing-pointless-logs.patch b/patches/server/0039-Logger-settings-suppressing-pointless-logs.patch similarity index 60% rename from patches/server/0040-Logger-settings-suppressing-pointless-logs.patch rename to patches/server/0039-Logger-settings-suppressing-pointless-logs.patch index d0f6c62..58aa19b 100644 --- a/patches/server/0040-Logger-settings-suppressing-pointless-logs.patch +++ b/patches/server/0039-Logger-settings-suppressing-pointless-logs.patch @@ -7,31 +7,33 @@ Original code by PurpurMC, licensed under MIT You can find the original code on https://github.com/PurpurMC/Purpur diff --git a/src/main/java/net/minecraft/server/PlayerAdvancements.java b/src/main/java/net/minecraft/server/PlayerAdvancements.java -index de0513b38e5fa0138f1cee6bb633561be12449fc..ef0625c0f860eeedcdc1e3b8801e15631c76cb7a 100644 +index de0513b38e5fa0138f1cee6bb633561be12449fc..c0325b9cb56dc09c005c277a8fdc5970b78093f8 100644 --- a/src/main/java/net/minecraft/server/PlayerAdvancements.java +++ b/src/main/java/net/minecraft/server/PlayerAdvancements.java -@@ -185,6 +185,7 @@ public class PlayerAdvancements { +@@ -184,7 +184,7 @@ public class PlayerAdvancements { + if (advancement == null) { // CraftBukkit start - if (entry.getKey().getNamespace().equals("minecraft")) { -+ if (!wtf.etil.mirai.MiraiConfig.loggerSuppressIgnoredAdvancementWarnings) // Purpur +- if (entry.getKey().getNamespace().equals("minecraft")) { ++ if (!wtf.etil.mirai.MiraiConfig.loggerSuppressIgnoredAdvancementWarnings && entry.getKey().getNamespace().equals("minecraft")) { // Purpur PlayerAdvancements.LOGGER.warn("Ignored advancement '{}' in progress file {} - it doesn't exist anymore?", entry.getKey(), this.file); } // CraftBukkit end diff --git a/src/main/java/net/minecraft/server/level/WorldGenRegion.java b/src/main/java/net/minecraft/server/level/WorldGenRegion.java -index f000c822ed4563b5b840936852bc7d8e030763e3..d37ba3fec0e4011629a5fbc88d377d52267ad395 100644 +index f000c822ed4563b5b840936852bc7d8e030763e3..4538e459f35d2e08fbacee71cec142a2db4b1371 100644 --- a/src/main/java/net/minecraft/server/level/WorldGenRegion.java +++ b/src/main/java/net/minecraft/server/level/WorldGenRegion.java -@@ -293,6 +293,7 @@ public class WorldGenRegion implements WorldGenLevel { - +@@ -294,7 +294,7 @@ public class WorldGenRegion implements WorldGenLevel { return true; } else { -+ if (!wtf.etil.mirai.MiraiConfig.loggerSuppressSetBlockFarChunk) // Purpur // Paper start - if (!hasSetFarWarned) { +- if (!hasSetFarWarned) { ++ if (!wtf.etil.mirai.MiraiConfig.loggerSuppressSetBlockFarChunk && !hasSetFarWarned) { // Purpur Util.logAndPauseIfInIde("Detected setBlock in a far chunk [" + i + ", " + j + "], pos: " + pos + ", status: " + this.generatingStatus + (this.currentlyGenerating == null ? "" : ", currently generating: " + (String) this.currentlyGenerating.get())); + hasSetFarWarned = true; + if (this.getServer() != null && this.getServer().isDebugging()) { diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 531cbee70d491adf5dee3b7c3ee10d0859506245..3c2fc286a481fad43a3c545485ef229760b4cacf 100644 +index 785e9e9b4408c1193cb3680a3b55f90a8f0d5b0a..aa5d0865f4d3c1e68f9fc06e49bea8889318371d 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -2182,7 +2182,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser @@ -40,18 +42,19 @@ index 531cbee70d491adf5dee3b7c3ee10d0859506245..3c2fc286a481fad43a3c545485ef2297 } else { - if (this.isChatExpired(instant)) { + if (!wtf.etil.mirai.MiraiConfig.loggerSuppressSentExpiredChat && this.isChatExpired(instant)) { // Purpur - ServerGamePacketListenerImpl.LOGGER.warn("{} sent expired chat: '{}'. Is the client/server system time unsynchronized?", this.player.getName().getString(), s); + ServerGamePacketListenerImpl.LOGGER.warn("{} sent expired chat: '{}'. Is the client/server system time unsynchronized? c: {} s: {}", this.player.getName().getString(), s, instant.getEpochSecond(), Instant.now().getEpochSecond()); // Paper } diff --git a/src/main/java/net/minecraft/stats/ServerRecipeBook.java b/src/main/java/net/minecraft/stats/ServerRecipeBook.java -index d13ed3069e944d138442ea440ac3eaf8d44c18d3..c19367bdad3997aa7aac609762f9cf731433adfc 100644 +index d13ed3069e944d138442ea440ac3eaf8d44c18d3..f87a9e76f098300f68f62ced69cf1c49aef32b69 100644 --- a/src/main/java/net/minecraft/stats/ServerRecipeBook.java +++ b/src/main/java/net/minecraft/stats/ServerRecipeBook.java -@@ -122,6 +122,7 @@ public class ServerRecipeBook extends RecipeBook { +@@ -121,7 +121,7 @@ public class ServerRecipeBook extends RecipeBook { + ResourceLocation minecraftkey = new ResourceLocation(s); Optional> optional = recipeManager.byKey(minecraftkey); - if (!optional.isPresent()) { -+ if (!wtf.etil.mirai.MiraiConfig.loggerSuppressUnrecognizedRecipeErrors) // Purpur +- if (!optional.isPresent()) { ++ if (!wtf.etil.mirai.MiraiConfig.loggerSuppressUnrecognizedRecipeErrors && !optional.isPresent()) { // Purpur ServerRecipeBook.LOGGER.error("Tried to load unrecognized recipe: {} removed now.", minecraftkey); } else { handler.accept((Recipe) optional.get()); @@ -68,24 +71,34 @@ index b2a15c986c7500a0ce227a54cb61ec3f5378f6f3..d243af83f3159d8a4d56d08dab022b31 if (MinecraftServer.getServer() != null && MinecraftServer.getServer().isDebugging()) { new Exception().printStackTrace(); diff --git a/src/main/java/wtf/etil/mirai/MiraiConfig.java b/src/main/java/wtf/etil/mirai/MiraiConfig.java -index 954bc508fea71af719c3203f0d4c93125976fdb8..8d3dcc1ebacd86412858680a9b3f8c018890b02b 100644 +index eda02eabbdb3c8d2cfe8c524fe9f5dfcca1089d8..65a77864c368545c14d1bb28fb0a91323e286158 100644 --- a/src/main/java/wtf/etil/mirai/MiraiConfig.java +++ b/src/main/java/wtf/etil/mirai/MiraiConfig.java -@@ -211,4 +211,17 @@ public class MiraiConfig { - useAlternateKeepAlive = getBoolean("use-alternate-keepalive", useAlternateKeepAlive); +@@ -166,4 +166,27 @@ public class MiraiConfig { + "This can drastically reduce players timeouts due to a bad connection."); } -+ public static boolean loggerSuppressInitLegacyMaterialError = true; -+ public static boolean loggerSuppressIgnoredAdvancementWarnings = true; -+ public static boolean loggerSuppressUnrecognizedRecipeErrors = true; -+ public static boolean loggerSuppressSetBlockFarChunk = true; -+ public static boolean loggerSuppressSentExpiredChat = true; ++ public static boolean loggerSuppressInitLegacyMaterialError; ++ public static boolean loggerSuppressIgnoredAdvancementWarnings; ++ public static boolean loggerSuppressUnrecognizedRecipeErrors; ++ public static boolean loggerSuppressSetBlockFarChunk; ++ public static boolean loggerSuppressSentExpiredChat; + private static void loggerSettings() { -+ loggerSuppressInitLegacyMaterialError = getBoolean("logger.suppress-init-legacy-material-errors", loggerSuppressInitLegacyMaterialError); -+ loggerSuppressIgnoredAdvancementWarnings = getBoolean("logger.suppress-ignored-advancement-warnings", loggerSuppressIgnoredAdvancementWarnings); -+ loggerSuppressUnrecognizedRecipeErrors = getBoolean("logger.suppress-unrecognized-recipe-errors", loggerSuppressUnrecognizedRecipeErrors); -+ loggerSuppressSetBlockFarChunk = getBoolean("logger.suppress-setblock-in-far-chunk-errors", loggerSuppressSetBlockFarChunk); -+ loggerSuppressSentExpiredChat = getBoolean("logger.suppress-sent-expired-chat", loggerSuppressSentExpiredChat); ++ loggerSuppressInitLegacyMaterialError = getBoolean("logger.suppress-init-legacy-material-errors", true, ++ "Whether or not server should stop saying", ++ "'Initializing Legacy Material Support. Unless you have legacy plugins and/or data this is a bug!'"); ++ loggerSuppressIgnoredAdvancementWarnings = getBoolean("logger.suppress-ignored-advancement-warnings", true, ++ "Whether or not server should stop saying", ++ "'Ignored advancement '{}' in progress file {} - it doesn't exist anymore?'"); ++ loggerSuppressUnrecognizedRecipeErrors = getBoolean("logger.suppress-unrecognized-recipe-errors", true, ++ "Whether or not server should stop saying", ++ "'Tried to load unrecognized recipe: {} removed now.'"); ++ loggerSuppressSetBlockFarChunk = getBoolean("logger.suppress-setblock-in-far-chunk-errors", true, ++ "Whether or not server should stop saying", ++ "'Detected setBlock in a far chunk.'"); ++ loggerSuppressSentExpiredChat = getBoolean("logger.suppress-sent-expired-chat", true, ++ "Whether or not server should stop saying", ++ "'{} sent expired chat: '{}'. Is the client/server system time unsynchronized?'"); + } + } diff --git a/patches/server/0041-Add-5-second-tps-average-in-tps.patch b/patches/server/0040-Add-5-second-tps-average-in-tps.patch similarity index 96% rename from patches/server/0041-Add-5-second-tps-average-in-tps.patch rename to patches/server/0040-Add-5-second-tps-average-in-tps.patch index 49aac16..d05670e 100644 --- a/patches/server/0041-Add-5-second-tps-average-in-tps.patch +++ b/patches/server/0040-Add-5-second-tps-average-in-tps.patch @@ -29,7 +29,7 @@ index fa56cd09102a89692b42f1d14257990508c5c720..f9251183df72ddc56662fd3f02acf216 setListData(vector); } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index e6e16685aff8266c1edd7d6e3a16e65f4dfb5162..a578b872a357b19236ef1217344d3cdeffc64f9b 100644 +index 9f6520d57840b40d506df141bdf755d593b64c27..11b0d23783fed5d96bd96c24adfc9a7f353a18b3 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -287,7 +287,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop -Date: Mon, 3 Jan 2022 16:03:27 +0100 -Subject: [PATCH] Configurable server metrics - - -diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index 43ae13cc8c3c1e7ed183d11fccba3ba3af14c8f4..95aa98a95cc46c4cf90822bf1a22404ab753c9dc 100644 ---- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -@@ -222,7 +222,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface - org.spigotmc.WatchdogThread.doStart(org.spigotmc.SpigotConfig.timeoutTime, org.spigotmc.SpigotConfig.restartOnCrash); - thread.start(); // Paper - start console thread after MinecraftServer.console & PaperConfig are initialized - io.papermc.paper.command.PaperCommands.registerCommands(this); -- com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); -+ if (wtf.etil.mirai.MiraiConfig.serverMetrics) com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Mirai - configurable server metrics - com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // load version history now - io.papermc.paper.brigadier.PaperBrigadierProviderImpl.INSTANCE.getClass(); // init PaperBrigadierProvider - // Paper end -diff --git a/src/main/java/wtf/etil/mirai/MiraiConfig.java b/src/main/java/wtf/etil/mirai/MiraiConfig.java -index d2519c1d1e87dc367b631ac1ea2d5d51af2ebb84..4ef25b6203371b9c22275e1015ea75d870acf8da 100644 ---- a/src/main/java/wtf/etil/mirai/MiraiConfig.java -+++ b/src/main/java/wtf/etil/mirai/MiraiConfig.java -@@ -239,4 +239,9 @@ public class MiraiConfig { - bookAnimationTick = getBoolean("enchantment-table-book-animation-tick", bookAnimationTick); - } - -+ public static boolean serverMetrics = true; -+ private static void allowServerMetrics() { -+ serverMetrics = getBoolean("enable-server-metrics", serverMetrics); -+ } -+ - } -\ No newline at end of file diff --git a/patches/server/0063-lithium-profiler.patch b/patches/server/0061-lithium-profiler.patch similarity index 92% rename from patches/server/0063-lithium-profiler.patch rename to patches/server/0061-lithium-profiler.patch index 94a7a0d..a4160ad 100644 --- a/patches/server/0063-lithium-profiler.patch +++ b/patches/server/0061-lithium-profiler.patch @@ -7,7 +7,7 @@ Original code by CaffeineMC, licensed under GNU Lesser General Public License v3 You can find the original code on https://github.com/CaffeineMC/lithium-fabric (Yarn mappings) diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 1936cd779223f0ca7f6fa266725560fef40c3653..20d9fe4a88c49a9952eb06ee37dbaa0f2908b0a9 100644 +index 7b80dfb72b191bd86e5e4443efc87713814b6c4c..05b895c79accf2f10f54a9868e6b9c10e1e5e687 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -222,6 +222,13 @@ public class ServerLevel extends Level implements WorldGenLevel { diff --git a/patches/server/0064-lithium-entity.fast_hand_swing.patch b/patches/server/0062-lithium-entity.fast_hand_swing.patch similarity index 100% rename from patches/server/0064-lithium-entity.fast_hand_swing.patch rename to patches/server/0062-lithium-entity.fast_hand_swing.patch diff --git a/patches/server/0065-c2me-opts-math.patch b/patches/server/0063-c2me-opts-math.patch similarity index 100% rename from patches/server/0065-c2me-opts-math.patch rename to patches/server/0063-c2me-opts-math.patch diff --git a/patches/server/0066-lithium-entity.fast_powder_snow_check.patch b/patches/server/0064-lithium-entity.fast_powder_snow_check.patch similarity index 100% rename from patches/server/0066-lithium-entity.fast_powder_snow_check.patch rename to patches/server/0064-lithium-entity.fast_powder_snow_check.patch diff --git a/patches/server/0067-lithium-collections.attributes.patch b/patches/server/0065-lithium-collections.attributes.patch similarity index 100% rename from patches/server/0067-lithium-collections.attributes.patch rename to patches/server/0065-lithium-collections.attributes.patch diff --git a/patches/server/0068-lithium-collections.entity_by_type.patch b/patches/server/0066-lithium-collections.entity_by_type.patch similarity index 100% rename from patches/server/0068-lithium-collections.entity_by_type.patch rename to patches/server/0066-lithium-collections.entity_by_type.patch diff --git a/patches/server/0069-lithium-collections.entity_filtering.patch b/patches/server/0067-lithium-collections.entity_filtering.patch similarity index 100% rename from patches/server/0069-lithium-collections.entity_filtering.patch rename to patches/server/0067-lithium-collections.entity_filtering.patch diff --git a/patches/server/0070-lithium-chunk.serialization.patch b/patches/server/0068-lithium-chunk.serialization.patch similarity index 98% rename from patches/server/0070-lithium-chunk.serialization.patch rename to patches/server/0068-lithium-chunk.serialization.patch index a45e792..90c1a54 100644 --- a/patches/server/0070-lithium-chunk.serialization.patch +++ b/patches/server/0068-lithium-chunk.serialization.patch @@ -309,7 +309,7 @@ index acae3eb30e0689048937f479dc3070f0688abdad..9c2b79655f2c63a208c7087d5d897db0 int onResize(int newBits, T object); } diff --git a/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java b/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java -index 08e1309e618377d170c446a1568c21b7bf4e5683..0b4f66d0ef963d6f47b20469b7a1e3f6c3da7c83 100644 +index 18c4f815888fee0c85ebbb485d21063ce0d143fb..59bb7c4ca7202cf80493dcc8da1233c89c5cde40 100644 --- a/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java +++ b/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java @@ -22,8 +22,23 @@ import net.minecraft.util.Mth; @@ -336,7 +336,7 @@ index 08e1309e618377d170c446a1568c21b7bf4e5683..0b4f66d0ef963d6f47b20469b7a1e3f6 private static final int MIN_PALETTE_BITS = 0; private final PaletteResize dummyPaletteResize = (newSize, added) -> { return 0; -@@ -298,30 +313,54 @@ public class PalettedContainer implements PaletteResize, PalettedContainer +@@ -299,30 +314,54 @@ public class PalettedContainer implements PaletteResize, PalettedContainer public synchronized PalettedContainerRO.PackedData pack(IdMap idMap, PalettedContainer.Strategy strategy) { // Paper - synchronize this.acquire(); @@ -408,7 +408,7 @@ index 08e1309e618377d170c446a1568c21b7bf4e5683..0b4f66d0ef963d6f47b20469b7a1e3f6 } private static void swapPalette(int[] is, IntUnaryOperator intUnaryOperator) { -@@ -361,17 +400,37 @@ public class PalettedContainer implements PaletteResize, PalettedContainer +@@ -362,17 +401,37 @@ public class PalettedContainer implements PaletteResize, PalettedContainer @Override public void count(PalettedContainer.CountConsumer counter) { diff --git a/patches/server/0071-Configurable-criterion-triggers.patch b/patches/server/0069-Configurable-criterion-triggers.patch similarity index 78% rename from patches/server/0071-Configurable-criterion-triggers.patch rename to patches/server/0069-Configurable-criterion-triggers.patch index 3cbc132..a0adb4f 100644 --- a/patches/server/0071-Configurable-criterion-triggers.patch +++ b/patches/server/0069-Configurable-criterion-triggers.patch @@ -42,20 +42,23 @@ index f5aca2054dcad52301b9b99e44fbd3723aabdad7..f120e10679d38f3db22315f16a00622a // CraftBukkit start - initialize oldLevel, fire PlayerLevelChangeEvent, and tick client-sided world border if (this.oldLevel == -1) { diff --git a/src/main/java/wtf/etil/mirai/MiraiConfig.java b/src/main/java/wtf/etil/mirai/MiraiConfig.java -index 4ef25b6203371b9c22275e1015ea75d870acf8da..4ace3c19551ea1cc5079d0570f5f0e70f1cae6a5 100644 +index e34fa6934a59fbead5ba4f4329a20507378e727a..6fb5f2f9bb1dc881eff5bc4a6edfcb1d3c7dc161 100644 --- a/src/main/java/wtf/etil/mirai/MiraiConfig.java +++ b/src/main/java/wtf/etil/mirai/MiraiConfig.java -@@ -244,4 +244,13 @@ public class MiraiConfig { - serverMetrics = getBoolean("enable-server-metrics", serverMetrics); +@@ -209,4 +209,16 @@ public class MiraiConfig { + "Disabling it can save MSPT, especially with quite a lot of enchantment tables."); } -+ public static boolean criterionTriggerEnterBlock = true; -+ public static boolean criterionTriggerTick = true; -+ public static boolean criterionTriggerLocation = true; ++ public static boolean criterionTriggerEnterBlock; ++ public static boolean criterionTriggerTick; ++ public static boolean criterionTriggerLocation; + private static void criterionTriggers() { -+ criterionTriggerEnterBlock = getBoolean("criterion-trigger.enter-block", criterionTriggerEnterBlock); -+ criterionTriggerTick = getBoolean("criterion-trigger.tick", criterionTriggerTick); -+ criterionTriggerLocation = getBoolean("criterion-trigger.location", criterionTriggerLocation); ++ criterionTriggerEnterBlock = getBoolean("criterion-trigger.enter-block", true, ++ "Whether or not server should listen to block enter triggers."); ++ criterionTriggerTick = getBoolean("criterion-trigger.tick", true, ++ "Whether or not server should listen to tick triggers."); ++ criterionTriggerLocation = getBoolean("criterion-trigger.location", true, ++ "Whether or not server should listen to location triggers."); + } + } diff --git a/patches/server/0072-Set-item-stuck-sleep-to-15-ticks.patch b/patches/server/0070-Set-item-stuck-sleep-to-15-ticks.patch similarity index 100% rename from patches/server/0072-Set-item-stuck-sleep-to-15-ticks.patch rename to patches/server/0070-Set-item-stuck-sleep-to-15-ticks.patch diff --git a/patches/server/0073-Smarter-statistics-ticking.patch b/patches/server/0071-Smarter-statistics-ticking.patch similarity index 100% rename from patches/server/0073-Smarter-statistics-ticking.patch rename to patches/server/0071-Smarter-statistics-ticking.patch diff --git a/patches/server/0074-lithium-ai.nearby_entity_tracking-and-ai.nearby_enti.patch b/patches/server/0072-lithium-ai.nearby_entity_tracking-and-ai.nearby_enti.patch similarity index 99% rename from patches/server/0074-lithium-ai.nearby_entity_tracking-and-ai.nearby_enti.patch rename to patches/server/0072-lithium-ai.nearby_entity_tracking-and-ai.nearby_enti.patch index 737e2bd..b6710af 100644 --- a/patches/server/0074-lithium-ai.nearby_entity_tracking-and-ai.nearby_enti.patch +++ b/patches/server/0072-lithium-ai.nearby_entity_tracking-and-ai.nearby_enti.patch @@ -600,10 +600,10 @@ index 0000000000000000000000000000000000000000..178fc249777c9997e9586ffe099e54c9 +} \ No newline at end of file diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 139884cead5a6d9d5b5990943e5a4ab4336ad22a..4279b170440faf28a061360d40ed6303d8cc1a97 100644 +index fb8fb1332b88427b7340fdeeff2024455f73f502..9d453f71b85be15b5889636569f93cc66efd6a52 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -153,9 +153,29 @@ import org.bukkit.event.entity.EntityPoseChangeEvent; +@@ -154,9 +154,29 @@ import org.bukkit.event.entity.EntityPoseChangeEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.plugin.PluginManager; // CraftBukkit end diff --git a/patches/server/0075-some-entity-micro-opts.patch b/patches/server/0073-some-entity-micro-opts.patch similarity index 94% rename from patches/server/0075-some-entity-micro-opts.patch rename to patches/server/0073-some-entity-micro-opts.patch index 90bd9c7..41b4ee1 100644 --- a/patches/server/0075-some-entity-micro-opts.patch +++ b/patches/server/0073-some-entity-micro-opts.patch @@ -7,10 +7,10 @@ Original code by Titaniumtown, licensed under GNU General Public License v3.0 You can find the original code on https://gitlab.com/Titaniumtown/JettPack diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 4279b170440faf28a061360d40ed6303d8cc1a97..9fc77dc845fc993ebb9d96f9af107f7e1e8e8a39 100644 +index 9d453f71b85be15b5889636569f93cc66efd6a52..ecc7085ecb33f4a2bc08b49ca0889ca41a015c8c 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -1890,12 +1890,18 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1891,12 +1891,18 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } } @@ -30,7 +30,7 @@ index 4279b170440faf28a061360d40ed6303d8cc1a97..9fc77dc845fc993ebb9d96f9af107f7e public void absMoveTo(double x, double y, double z, float yaw, float pitch) { this.absMoveTo(x, y, z); this.setYRot(yaw % 360.0F); -@@ -4317,6 +4323,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4325,6 +4331,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } // Paper end - block invalid positions diff --git a/patches/server/0076-Dont-eat-blocks-in-non-ticking-chunks.patch b/patches/server/0074-Dont-eat-blocks-in-non-ticking-chunks.patch similarity index 96% rename from patches/server/0076-Dont-eat-blocks-in-non-ticking-chunks.patch rename to patches/server/0074-Dont-eat-blocks-in-non-ticking-chunks.patch index 90c470a..5ea2638 100644 --- a/patches/server/0076-Dont-eat-blocks-in-non-ticking-chunks.patch +++ b/patches/server/0074-Dont-eat-blocks-in-non-ticking-chunks.patch @@ -7,7 +7,7 @@ Original code by PurpurMC, licensed under MIT You can find the original code on https://github.com/PurpurMC/Purpur diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index e134963fa97ea886c7cf4af8ab0ba53b6010fe41..1b731114520a1607b5c42774d86d9ed51f21da3f 100644 +index b7f56d1909272bb02591b6e08aed78943ab96ba1..c67c7ba95537ff39bf4a4f4c490698b49dcb0849 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java @@ -1826,7 +1826,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider diff --git a/patches/server/0077-Fast-speed-check.patch b/patches/server/0075-Fast-speed-check.patch similarity index 71% rename from patches/server/0077-Fast-speed-check.patch rename to patches/server/0075-Fast-speed-check.patch index ce5762c..1d1c1a2 100644 --- a/patches/server/0077-Fast-speed-check.patch +++ b/patches/server/0075-Fast-speed-check.patch @@ -12,14 +12,15 @@ doing questionable/buggy ones, and claiming breathtaking performance improvement any of those Spigot forks! diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 9fc77dc845fc993ebb9d96f9af107f7e1e8e8a39..6b4370f8dffdaebb861ec59d0dad3fe54c696083 100644 +index ecc7085ecb33f4a2bc08b49ca0889ca41a015c8c..c7c4f4489f9226d87b6d9f0f77d25806e8d80b75 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -1224,7 +1224,16 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1225,7 +1225,18 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } this.tryCheckInsideBlocks(); - float f2 = this.getBlockSpeedFactor(); ++ // NFT-Worlds start + float f2; + if (wtf.etil.mirai.MiraiConfig.fastSpeedCheck) { + if (this.getDeltaMovement().x == 0 && this.getDeltaMovement().z == 0) { @@ -30,20 +31,23 @@ index 9fc77dc845fc993ebb9d96f9af107f7e1e8e8a39..6b4370f8dffdaebb861ec59d0dad3fe5 + } else { + f2 = this.getBlockSpeedFactor(); + } ++ // NFT-Worlds stop this.setDeltaMovement(this.getDeltaMovement().multiply((double) f2, 1.0D, (double) f2)); // Paper start - remove expensive streams from here diff --git a/src/main/java/wtf/etil/mirai/MiraiConfig.java b/src/main/java/wtf/etil/mirai/MiraiConfig.java -index 4ace3c19551ea1cc5079d0570f5f0e70f1cae6a5..4da53712474506e80c265ee38e1e1e88f51e3ec9 100644 +index 6fb5f2f9bb1dc881eff5bc4a6edfcb1d3c7dc161..04d08c44f56a4af207b8240ca1d9d34790ead16d 100644 --- a/src/main/java/wtf/etil/mirai/MiraiConfig.java +++ b/src/main/java/wtf/etil/mirai/MiraiConfig.java -@@ -253,4 +253,9 @@ public class MiraiConfig { - criterionTriggerLocation = getBoolean("criterion-trigger.location", criterionTriggerLocation); +@@ -221,4 +221,11 @@ public class MiraiConfig { + "Whether or not server should listen to location triggers."); } -+ public static boolean fastSpeedCheck = true; ++ public static boolean fastSpeedCheck; + private static void speedCheck() { -+ fastSpeedCheck = getBoolean("fast-speed-check", fastSpeedCheck); ++ fastSpeedCheck = getBoolean("fast-speed-check", true, ++ "Whether or not server should use a faster method", ++ "to check when entity delta movement is null."); + } + } diff --git a/patches/server/0078-lithium-cache-iterate-outwards.patch b/patches/server/0076-lithium-cache-iterate-outwards.patch similarity index 100% rename from patches/server/0078-lithium-cache-iterate-outwards.patch rename to patches/server/0076-lithium-cache-iterate-outwards.patch diff --git a/patches/server/0079-lithium-ai.raid.patch b/patches/server/0077-lithium-ai.raid.patch similarity index 100% rename from patches/server/0079-lithium-ai.raid.patch rename to patches/server/0077-lithium-ai.raid.patch diff --git a/patches/server/0080-lithium-block.moving_block_shapes.patch b/patches/server/0078-lithium-block.moving_block_shapes.patch similarity index 100% rename from patches/server/0080-lithium-block.moving_block_shapes.patch rename to patches/server/0078-lithium-block.moving_block_shapes.patch diff --git a/patches/server/0081-lithium-shapes.blockstate_cache.patch b/patches/server/0079-lithium-shapes.blockstate_cache.patch similarity index 100% rename from patches/server/0081-lithium-shapes.blockstate_cache.patch rename to patches/server/0079-lithium-shapes.blockstate_cache.patch diff --git a/patches/server/0082-lithium-gen.patch b/patches/server/0080-lithium-gen.patch similarity index 99% rename from patches/server/0082-lithium-gen.patch rename to patches/server/0080-lithium-gen.patch index d1e4ca3..e2fa87b 100644 --- a/patches/server/0082-lithium-gen.patch +++ b/patches/server/0080-lithium-gen.patch @@ -106,7 +106,7 @@ index 0000000000000000000000000000000000000000..c99eff34c1be07508c88fe9525c3ae1a +} \ No newline at end of file diff --git a/src/main/java/net/minecraft/server/level/WorldGenRegion.java b/src/main/java/net/minecraft/server/level/WorldGenRegion.java -index d37ba3fec0e4011629a5fbc88d377d52267ad395..4967605f46a58ad9888c6a997f950f50d1bd5d1e 100644 +index 4538e459f35d2e08fbacee71cec142a2db4b1371..d9444afba8c65c9e1591726e0e1c7ba7b6749ff0 100644 --- a/src/main/java/net/minecraft/server/level/WorldGenRegion.java +++ b/src/main/java/net/minecraft/server/level/WorldGenRegion.java @@ -53,6 +53,7 @@ import net.minecraft.world.phys.Vec3; diff --git a/patches/server/0083-PaperPR-Stop-large-look-changes-from-crashing-the-se.patch b/patches/server/0081-PaperPR-Stop-large-look-changes-from-crashing-the-se.patch similarity index 100% rename from patches/server/0083-PaperPR-Stop-large-look-changes-from-crashing-the-se.patch rename to patches/server/0081-PaperPR-Stop-large-look-changes-from-crashing-the-se.patch diff --git a/patches/server/0084-PaperPR-Add-more-collision-code-skipping-logic.patch b/patches/server/0082-PaperPR-Add-more-collision-code-skipping-logic.patch similarity index 100% rename from patches/server/0084-PaperPR-Add-more-collision-code-skipping-logic.patch rename to patches/server/0082-PaperPR-Add-more-collision-code-skipping-logic.patch diff --git a/patches/server/0085-vmp-use-linked-map-for-entity-trackers-for-faster-it.patch b/patches/server/0083-vmp-use-linked-map-for-entity-trackers-for-faster-it.patch similarity index 94% rename from patches/server/0085-vmp-use-linked-map-for-entity-trackers-for-faster-it.patch rename to patches/server/0083-vmp-use-linked-map-for-entity-trackers-for-faster-it.patch index 069c23b..e2f886b 100644 --- a/patches/server/0085-vmp-use-linked-map-for-entity-trackers-for-faster-it.patch +++ b/patches/server/0083-vmp-use-linked-map-for-entity-trackers-for-faster-it.patch @@ -9,7 +9,7 @@ Original code by RelativityMC, licensed under MIT You can find the original code on https://github.com/RelativityMC/VMP-fabric (Yarn mappings) diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index 1b731114520a1607b5c42774d86d9ed51f21da3f..3b70c7fc90b9495536a5eaf35a9c5483bd42ec55 100644 +index c67c7ba95537ff39bf4a4f4c490698b49dcb0849..a596cbae5981953aa0813ddfedb4cd3677e3d8f6 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java @@ -114,6 +114,7 @@ import org.bukkit.craftbukkit.generator.CustomChunkGenerator; diff --git a/patches/server/0086-c2me-reduce_allocs.patch b/patches/server/0084-c2me-reduce_allocs.patch similarity index 100% rename from patches/server/0086-c2me-reduce_allocs.patch rename to patches/server/0084-c2me-reduce_allocs.patch diff --git a/patches/server/0087-lithium-ai.sensor.secondary_poi.patch b/patches/server/0085-lithium-ai.sensor.secondary_poi.patch similarity index 100% rename from patches/server/0087-lithium-ai.sensor.secondary_poi.patch rename to patches/server/0085-lithium-ai.sensor.secondary_poi.patch diff --git a/patches/server/0088-Fix-tick-function-tag-running-before-load.patch b/patches/server/0086-Fix-tick-function-tag-running-before-load.patch similarity index 100% rename from patches/server/0088-Fix-tick-function-tag-running-before-load.patch rename to patches/server/0086-Fix-tick-function-tag-running-before-load.patch diff --git a/patches/server/0089-lithium-suffocation.patch b/patches/server/0087-lithium-suffocation.patch similarity index 96% rename from patches/server/0089-lithium-suffocation.patch rename to patches/server/0087-lithium-suffocation.patch index 3621c2e..e63df56 100644 --- a/patches/server/0089-lithium-suffocation.patch +++ b/patches/server/0087-lithium-suffocation.patch @@ -9,10 +9,10 @@ Original license: GNU Lesser General Public License v3.0 Original project: https://github.com/CaffeineMC/lithium-fabric (Yarn mappings) diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 6b4370f8dffdaebb861ec59d0dad3fe54c696083..20d6e75850bb5b7c19dabce78c20e484956fa2f6 100644 +index c7c4f4489f9226d87b6d9f0f77d25806e8d80b75..5dc113137840ffe943f4f9c9f50a78b57d990af1 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2606,39 +2606,64 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2617,39 +2617,64 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return !this.isRemoved(); } diff --git a/patches/server/0090-Optimize-default-values-for-configs.patch b/patches/server/0088-Optimize-default-values-for-configs.patch similarity index 91% rename from patches/server/0090-Optimize-default-values-for-configs.patch rename to patches/server/0088-Optimize-default-values-for-configs.patch index 6cfbdba..3a3abb5 100644 --- a/patches/server/0090-Optimize-default-values-for-configs.patch +++ b/patches/server/0088-Optimize-default-values-for-configs.patch @@ -5,23 +5,41 @@ Subject: [PATCH] Optimize default values for configs diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -index a125abc75ed2bbd905c8fdec442416a45264f531..70b100822193486a63c84bda23398ae8aac3a51d 100644 +index 09827eaa9f6adf49385a33aa60b3a6bf4005a982..49fa028efe1a34d9f37b95866c0824fcf210f338 100644 --- a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java +++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -@@ -216,8 +216,10 @@ public class PufferfishConfig { +@@ -216,7 +216,7 @@ public class PufferfishConfig { + public static boolean enableAsyncEntityTracker; + public static boolean enableAsyncEntityTrackerInitialized; + private static void asyncEntityTracker() { +- boolean temp = getBoolean("enable-async-entity-tracker", false, ++ boolean temp = getBoolean("enable-async-entity-tracker", true, // Mirai - optimize default values for configs + "Whether or not async entity tracking should be enabled."); + if (!enableAsyncEntityTrackerInitialized) { + enableAsyncEntityTrackerInitialized = true; +@@ -227,7 +227,7 @@ public class PufferfishConfig { + public static boolean enableAsyncPathfinding; + public static boolean enableAsyncPathfindingInitialized; + private static void asyncPathfinding() { +- boolean temp = getBoolean("enable-async-pathfinding", false, ++ boolean temp = getBoolean("enable-async-pathfinding", true, // Mirai - optimize default values for configs + "Whether or not async pathfinding should be enabled."); + if (!enableAsyncPathfindingInitialized) { + enableAsyncPathfindingInitialized = true; +@@ -238,8 +238,10 @@ public class PufferfishConfig { public static int maxProjectileLoadsPerTick; public static int maxProjectileLoadsPerProjectile; private static void projectileLoading() { - maxProjectileLoadsPerTick = getInt("projectile.max-loads-per-tick", 10, "Controls how many chunks are allowed", "to be sync loaded by projectiles in a tick."); - maxProjectileLoadsPerProjectile = getInt("projectile.max-loads-per-projectile", 10, "Controls how many chunks a projectile", "can load in its lifetime before it gets", "automatically removed."); + // Mirai start - optimize default values for configs -+ maxProjectileLoadsPerTick = getInt("projectile.max-loads-per-tick", 8, "Controls how many chunks are allowed", "to be sync loaded by projectiles in a tick."); ++ maxProjectileLoadsPerTick = getInt("projectile.max-loads-per-tick", 8, "Controls how many chunks are allowed", "to be sync loaded by projectiles in a tick."); + maxProjectileLoadsPerProjectile = getInt("projectile.max-loads-per-projectile", 8, "Controls how many chunks a projectile", "can load in its lifetime before it gets", "automatically removed."); + // Mirai end setComment("projectile", "Optimizes projectile settings"); } -@@ -235,10 +237,10 @@ public class PufferfishConfig { +@@ -257,10 +259,10 @@ public class PufferfishConfig { "This value determines how far away an entity has to be", "from the player to start being effected by DEAR."); startDistanceSquared = startDistance * startDistance; @@ -69,7 +87,7 @@ index bc72131afa1ae9986ee311a9b371e97c8feb38f8..c54341d03a1ef78d075236968a000e00 public boolean useDimensionTypeForCustomSpawners = false; public boolean strictAdvancementDimensionCheck = false; diff --git a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java -index 32f0cd29d1198fe320d10ccfe0b02f8632ac12aa..d503fd87f968354c1473dbe1679a6071dee523fc 100644 +index e2c612dd55fcb2769fb06f7878b8d0873f2be139..102468a21cd8386f6505b8e3982349c1e7a9943b 100644 --- a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java @@ -114,8 +114,10 @@ public class WorldConfiguration extends ConfigurationPart { @@ -85,15 +103,6 @@ index 32f0cd29d1198fe320d10ccfe0b02f8632ac12aa..d503fd87f968354c1473dbe1679a6071 } public Spawning spawning; -@@ -174,7 +176,7 @@ public class WorldConfiguration extends ConfigurationPart { - public boolean allChunksAreSlimeChunks = false; - @Constraint(Constraints.BelowZeroDoubleToDefault.class) - public DoubleOrDefault skeletonHorseThunderSpawnChance = DoubleOrDefault.USE_DEFAULT; -- public boolean ironGolemsCanSpawnInAir = false; -+ public boolean ironGolemsCanSpawnInAir = true; // Mirai - optimize default values for configs - public boolean countAllMobsForSpawning = false; - public int monsterSpawnMaxLightLevel = -1; - public DuplicateUUID duplicateUuid; @@ -198,8 +200,10 @@ public class WorldConfiguration extends ConfigurationPart { public Behavior behavior; @@ -137,7 +146,7 @@ index 32f0cd29d1198fe320d10ccfe0b02f8632ac12aa..d503fd87f968354c1473dbe1679a6071 public boolean allowPlayerCrammingDamage = false; } -@@ -399,18 +403,34 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -399,18 +403,33 @@ public class WorldConfiguration extends ConfigurationPart { public class Chunks extends ConfigurationPart { public AutosavePeriod autoSaveInterval = AutosavePeriod.def(); @@ -151,7 +160,7 @@ index 32f0cd29d1198fe320d10ccfe0b02f8632ac12aa..d503fd87f968354c1473dbe1679a6071 + public Duration delayChunkUnloadsBy = Duration.of("5s"); + // Mirai end public Reference2IntMap> entityPerChunkSaveLimit = Util.make(new Reference2IntOpenHashMap<>(Registry.ENTITY_TYPE.size()), map -> { - map.defaultReturnValue(-1); +- map.defaultReturnValue(-1); - map.put(EntityType.EXPERIENCE_ORB, -1); - map.put(EntityType.SNOWBALL, -1); - map.put(EntityType.ENDER_PEARL, -1); @@ -181,7 +190,7 @@ index 32f0cd29d1198fe320d10ccfe0b02f8632ac12aa..d503fd87f968354c1473dbe1679a6071 }); } -@@ -424,11 +444,22 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -424,11 +443,22 @@ public class WorldConfiguration extends ConfigurationPart { public TickRates tickRates; public class TickRates extends ConfigurationPart { @@ -209,7 +218,7 @@ index 32f0cd29d1198fe320d10ccfe0b02f8632ac12aa..d503fd87f968354c1473dbe1679a6071 } @Setting(FeatureSeedsGeneration.FEATURE_SEEDS_KEY) -@@ -436,7 +467,7 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -436,7 +466,7 @@ public class WorldConfiguration extends ConfigurationPart { public class FeatureSeeds extends ConfigurationPart.Post { @Setting(FeatureSeedsGeneration.GENERATE_KEY) @@ -218,7 +227,7 @@ index 32f0cd29d1198fe320d10ccfe0b02f8632ac12aa..d503fd87f968354c1473dbe1679a6071 @Setting(FeatureSeedsGeneration.FEATURES_KEY) public Reference2LongMap>> features = new Reference2LongOpenHashMap<>(); -@@ -450,9 +481,9 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -450,9 +480,9 @@ public class WorldConfiguration extends ConfigurationPart { public class Misc extends ConfigurationPart { public int lightQueueSize = 20; @@ -244,7 +253,7 @@ index 5d162f59fc5ef9adf7fa762b137bbcfca745d9c5..c7c8a77e3af96720434e361b04186d57 public static double movedWronglyThreshold; diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java -index 5a16e64d1555a74acca98966f1a6b2269280f366..75584d048d6fe154fc80e5132e72b03fd707d104 100644 +index ce61f9e8a835bc5e2d3815e337ed9785f9d06f04..217c8f8364ba8d1e509dea9ec0de4b6832db8a51 100644 --- a/src/main/java/org/spigotmc/SpigotWorldConfig.java +++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java @@ -150,14 +150,14 @@ public class SpigotWorldConfig @@ -286,11 +295,10 @@ index 5a16e64d1555a74acca98966f1a6b2269280f366..75584d048d6fe154fc80e5132e72b03f - public int miscActivationRange = 16; + public int miscActivationRange = 8; // Paper start -- public int flyingMonsterActivationRange = 32; + public int flyingMonsterActivationRange = 32; - public int waterActivationRange = 16; - public int villagerActivationRange = 32; - public int wakeUpInactiveAnimals = 4; -+ public int flyingMonsterActivationRange = 48; + public int waterActivationRange = 8; + public int villagerActivationRange = 16; + public int wakeUpInactiveAnimals = 2; diff --git a/patches/server/0091-Configurable-map-update-interval.patch b/patches/server/0089-Configurable-map-update-interval.patch similarity index 83% rename from patches/server/0091-Configurable-map-update-interval.patch rename to patches/server/0089-Configurable-map-update-interval.patch index 17bd714..b95a064 100644 --- a/patches/server/0091-Configurable-map-update-interval.patch +++ b/patches/server/0089-Configurable-map-update-interval.patch @@ -27,16 +27,18 @@ index 67b88da702b780f79c0496cb17f1e6f1f8dd6c2b..712707da510977bfa1ce4b991fd8a8f5 // CraftBukkit start java.util.Collection icons = new java.util.ArrayList(); diff --git a/src/main/java/wtf/etil/mirai/MiraiConfig.java b/src/main/java/wtf/etil/mirai/MiraiConfig.java -index 4da53712474506e80c265ee38e1e1e88f51e3ec9..ea398d72cdbec80add81971f3cf34b750e9448ae 100644 +index 04d08c44f56a4af207b8240ca1d9d34790ead16d..0e1ff578af49eaa44508119b16fae67744041150 100644 --- a/src/main/java/wtf/etil/mirai/MiraiConfig.java +++ b/src/main/java/wtf/etil/mirai/MiraiConfig.java -@@ -258,4 +258,9 @@ public class MiraiConfig { - fastSpeedCheck = getBoolean("fast-speed-check", fastSpeedCheck); +@@ -228,4 +228,11 @@ public class MiraiConfig { + "to check when entity delta movement is null."); } -+ public static int mapUpdateInterval = 5; ++ public static int mapUpdateInterval; + private static void mapUpdate() { -+ mapUpdateInterval = getInt("map-update-interval", mapUpdateInterval); ++ mapUpdateInterval = getInt("map-update-interval", 5, ++ "This value defines how often a map refresh, in tick.", ++ "A second is 20 ticks."); + } + } diff --git a/patches/server/0092-Fix-hunger-saturation-depleting-on-peaceful.patch b/patches/server/0090-Fix-hunger-saturation-depleting-on-peaceful.patch similarity index 100% rename from patches/server/0092-Fix-hunger-saturation-depleting-on-peaceful.patch rename to patches/server/0090-Fix-hunger-saturation-depleting-on-peaceful.patch diff --git a/patches/server/0093-Fix-mobs-attacking-themselves.patch b/patches/server/0091-Fix-mobs-attacking-themselves.patch similarity index 100% rename from patches/server/0093-Fix-mobs-attacking-themselves.patch rename to patches/server/0091-Fix-mobs-attacking-themselves.patch diff --git a/patches/server/0094-Fix-brewing-stands-resetting-their-brewTime-when-bei.patch b/patches/server/0092-Fix-brewing-stands-resetting-their-brewTime-when-bei.patch similarity index 100% rename from patches/server/0094-Fix-brewing-stands-resetting-their-brewTime-when-bei.patch rename to patches/server/0092-Fix-brewing-stands-resetting-their-brewTime-when-bei.patch diff --git a/patches/server/0095-lithium-world.tick_scheduler.patch b/patches/server/0093-lithium-world.tick_scheduler.patch similarity index 100% rename from patches/server/0095-lithium-world.tick_scheduler.patch rename to patches/server/0093-lithium-world.tick_scheduler.patch diff --git a/patches/server/0096-Save-Json-list-asynchronously.patch b/patches/server/0094-Save-Json-list-asynchronously.patch similarity index 100% rename from patches/server/0096-Save-Json-list-asynchronously.patch rename to patches/server/0094-Save-Json-list-asynchronously.patch diff --git a/patches/server/0097-Swaps-the-predicate-order-of-collision.patch b/patches/server/0095-Swaps-the-predicate-order-of-collision.patch similarity index 88% rename from patches/server/0097-Swaps-the-predicate-order-of-collision.patch rename to patches/server/0095-Swaps-the-predicate-order-of-collision.patch index 1f87106..a9782e1 100644 --- a/patches/server/0097-Swaps-the-predicate-order-of-collision.patch +++ b/patches/server/0095-Swaps-the-predicate-order-of-collision.patch @@ -8,10 +8,10 @@ Original license: GPLv3 Original project: https://github.com/Akarin-project/Akarin diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 20d6e75850bb5b7c19dabce78c20e484956fa2f6..c5dd7a8f8bf3f294266d17eea3a09c0ed7866957 100644 +index 5dc113137840ffe943f4f9c9f50a78b57d990af1..a02b8f64502326efa758bfa3bb861dc0a77dec65 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2006,8 +2006,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2009,8 +2009,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { public void playerTouch(Player player) {} public void push(Entity entity) { diff --git a/patches/server/0098-Fix-head-rotation-packet-spam.patch b/patches/server/0096-Fix-head-rotation-packet-spam.patch similarity index 89% rename from patches/server/0098-Fix-head-rotation-packet-spam.patch rename to patches/server/0096-Fix-head-rotation-packet-spam.patch index 15a9ff3..640d167 100644 --- a/patches/server/0098-Fix-head-rotation-packet-spam.patch +++ b/patches/server/0096-Fix-head-rotation-packet-spam.patch @@ -7,10 +7,10 @@ Original license: GPLv3 Original project: https://github.com/Electroid/SportPaper diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java -index d03fd8927eebb8df8697cdf7383f66b0b6576d5b..adbc648ab5465b3808b19481650170a8cb57ace3 100644 +index 0423dff716fdd4f60b792e24a4a5a33d150e734d..bcaa1033f570b1934a770bc51b3a49ef634abcf1 100644 --- a/src/main/java/net/minecraft/server/level/ServerEntity.java +++ b/src/main/java/net/minecraft/server/level/ServerEntity.java -@@ -342,8 +342,10 @@ public class ServerEntity { +@@ -346,8 +346,10 @@ public class ServerEntity { } // CraftBukkit start - Fix for nonsensical head yaw diff --git a/patches/server/0099-Cache-block-break-animation-packet.patch b/patches/server/0097-Cache-block-break-animation-packet.patch similarity index 94% rename from patches/server/0099-Cache-block-break-animation-packet.patch rename to patches/server/0097-Cache-block-break-animation-packet.patch index 91ef29b..3097d8f 100644 --- a/patches/server/0099-Cache-block-break-animation-packet.patch +++ b/patches/server/0097-Cache-block-break-animation-packet.patch @@ -7,7 +7,7 @@ Original license: GPLv3 Original project: https://github.com/Electroid/SportPaper diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 20d9fe4a88c49a9952eb06ee37dbaa0f2908b0a9..da074718d933e5460f126bc5c24ba18765e776eb 100644 +index 05b895c79accf2f10f54a9868e6b9c10e1e5e687..50daf0762ae2eded8e5e42db12bcdb06ed183225 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -1539,6 +1539,7 @@ public class ServerLevel extends Level implements WorldGenLevel { diff --git a/patches/server/0100-Use-more-fastutil-data-structures.patch b/patches/server/0098-Use-more-fastutil-data-structures.patch similarity index 100% rename from patches/server/0100-Use-more-fastutil-data-structures.patch rename to patches/server/0098-Use-more-fastutil-data-structures.patch diff --git a/patches/server/0101-Optimize-Math.round-and-Math.hypot-functions.patch b/patches/server/0099-Optimize-Math.round-and-Math.hypot-functions.patch similarity index 80% rename from patches/server/0101-Optimize-Math.round-and-Math.hypot-functions.patch rename to patches/server/0099-Optimize-Math.round-and-Math.hypot-functions.patch index 0f61e15..a0482a6 100644 --- a/patches/server/0101-Optimize-Math.round-and-Math.hypot-functions.patch +++ b/patches/server/0099-Optimize-Math.round-and-Math.hypot-functions.patch @@ -10,7 +10,7 @@ Copyright (c) 2020 Fx Morin diff --git a/src/main/java/carpetfixes/helpers/FastMath.java b/src/main/java/carpetfixes/helpers/FastMath.java new file mode 100644 -index 0000000000000000000000000000000000000000..409475deb22ae19d77c9125531ede823997bb452 +index 0000000000000000000000000000000000000000..2f48a1c71356f7ebc00aaa44b28f6e10b2de1dee --- /dev/null +++ b/src/main/java/carpetfixes/helpers/FastMath.java @@ -0,0 +1,59 @@ @@ -73,27 +73,9 @@ index 0000000000000000000000000000000000000000..409475deb22ae19d77c9125531ede823 + } + } +} -diff --git a/src/main/java/com/destroystokyo/paper/PaperCommand.java b/src/main/java/com/destroystokyo/paper/PaperCommand.java -index bb220f27f5d472514d9a1620a40ed50fcb31ae16..9ec0d9c79413654436082aef93c416e7d7fb9125 100644 ---- a/src/main/java/com/destroystokyo/paper/PaperCommand.java -+++ b/src/main/java/com/destroystokyo/paper/PaperCommand.java -@@ -734,12 +734,12 @@ public class PaperCommand extends Command { - ++relitChunks[0]; - sender.getBukkitEntity().sendMessage(text().color(DARK_AQUA).append( - text("Relit chunk ", BLUE), text(chunkPos.toString()), -- text(", progress: ", BLUE), text((int)(Math.round(100.0 * (double)(relitChunks[0])/(double)pending[0])) + "%") -+ text(", progress: ", BLUE), text((int)(carpetfixes.helpers.FastMath.round(100.0 * (double)(relitChunks[0])/(double)pending[0])) + "%") // Mirai - )); - }, - (int totalRelit) -> { - final long end = System.nanoTime(); -- final long diff = Math.round(1.0e-6*(end - start)); -+ final long diff = carpetfixes.helpers.FastMath.round(1.0e-6*(end - start)); // Mirai - sender.getBukkitEntity().sendMessage(text().color(DARK_AQUA).append( - text("Relit ", BLUE), text(totalRelit), - text(" chunks. Took ", BLUE), text(diff + "ms") +\ No newline at end of file diff --git a/src/main/java/com/destroystokyo/paper/gui/RAMDetails.java b/src/main/java/com/destroystokyo/paper/gui/RAMDetails.java -index f9251183df72ddc56662fd3f02acf21641a2200c..525bbe1a07025179cb32d9182fdde1d472b5852e 100644 +index f9251183df72ddc56662fd3f02acf21641a2200c..ea1bad145e529ac36bf335cf4d5339b2d88b282f 100644 --- a/src/main/java/com/destroystokyo/paper/gui/RAMDetails.java +++ b/src/main/java/com/destroystokyo/paper/gui/RAMDetails.java @@ -81,6 +81,6 @@ public class RAMDetails extends JList { @@ -101,11 +83,11 @@ index f9251183df72ddc56662fd3f02acf21641a2200c..525bbe1a07025179cb32d9182fdde1d4 private static String format(double tps) { - return ( ( tps > 21.0 ) ? "*" : "" ) + Math.min( Math.round( tps * 100.0 ) / 100.0, 20.0 ); -+ return ( ( tps > 21.0 ) ? "*" : "" ) + Math.min( carpetfixes.helpers.FastMath.round( tps * 100.0 ) / 100.0, 20.0 ); // Mirai ++ return ( ( tps > 21.0 ) ? "*" : "" ) + Math.min( carpetfixes.helpers.FastMath.round( tps * 100.0 ) / 100.0, 20.0 ); } } diff --git a/src/main/java/com/destroystokyo/paper/gui/RAMGraph.java b/src/main/java/com/destroystokyo/paper/gui/RAMGraph.java -index c3e54da4ab6440811aab2f9dd1e218802ac13285..db1319c51a5410ee106d023fce759f1e390872e2 100644 +index c3e54da4ab6440811aab2f9dd1e218802ac13285..2a38ea32f2d4a01be556fdf11254d5910c54f997 100644 --- a/src/main/java/com/destroystokyo/paper/gui/RAMGraph.java +++ b/src/main/java/com/destroystokyo/paper/gui/RAMGraph.java @@ -128,7 +128,7 @@ public class RAMGraph extends JComponent { @@ -113,12 +95,12 @@ index c3e54da4ab6440811aab2f9dd1e218802ac13285..db1319c51a5410ee106d023fce759f1e graphics.fillOval(m.x - 2, 100 - used - 2, 5, 5); setToolTipText(String.format("Used: %s mb (%s%%)
%s", - Math.round(data.getUsedMem() / 1024F / 1024F), -+ carpetfixes.helpers.FastMath.round(data.getUsedMem() / 1024F / 1024F), // Mirai ++ carpetfixes.helpers.FastMath.round(data.getUsedMem() / 1024F / 1024F), used, getTime(m.x))); } } diff --git a/src/main/java/gg/pufferfish/pufferfish/flare/collectors/TPSCollector.java b/src/main/java/gg/pufferfish/pufferfish/flare/collectors/TPSCollector.java -index 40447d00aefb5ffedb8a2ee87155a04088f0649f..633a6e313174244cf13ed89b53893ea5900e2828 100644 +index 40447d00aefb5ffedb8a2ee87155a04088f0649f..31cc0a29e89e79f616b3ee329a5528961edaa2de 100644 --- a/src/main/java/gg/pufferfish/pufferfish/flare/collectors/TPSCollector.java +++ b/src/main/java/gg/pufferfish/pufferfish/flare/collectors/TPSCollector.java @@ -25,7 +25,7 @@ public class TPSCollector extends LiveCollector { @@ -127,12 +109,12 @@ index 40447d00aefb5ffedb8a2ee87155a04088f0649f..633a6e313174244cf13ed89b53893ea5 - this.report(TPS, Math.min(20D, Math.round(Bukkit.getServer().getTPS()[0] * 100d) / 100d)); - this.report(MSPT, (double) Math.round(mspt * 100d) / 100d); -+ this.report(TPS, Math.min(20D, carpetfixes.helpers.FastMath.round(Bukkit.getServer().getTPS()[0] * 100d) / 100d)); // Mirai -+ this.report(MSPT, (double) carpetfixes.helpers.FastMath.round(mspt * 100d) / 100d); // Mirai ++ this.report(TPS, Math.min(20D, carpetfixes.helpers.FastMath.round(Bukkit.getServer().getTPS()[0] * 100d) / 100d)); ++ this.report(MSPT, (double) carpetfixes.helpers.FastMath.round(mspt * 100d) / 100d); } } diff --git a/src/main/java/io/papermc/paper/chunk/PlayerChunkLoader.java b/src/main/java/io/papermc/paper/chunk/PlayerChunkLoader.java -index b53402903eb6845df361daf6b05a668608ad7b63..0d43afcdd5db346d0ddf82e06bad5b219721715c 100644 +index b53402903eb6845df361daf6b05a668608ad7b63..df60ee5ec4f98e815499dd1dfe94a0b62d1f1fbf 100644 --- a/src/main/java/io/papermc/paper/chunk/PlayerChunkLoader.java +++ b/src/main/java/io/papermc/paper/chunk/PlayerChunkLoader.java @@ -387,11 +387,11 @@ public final class PlayerChunkLoader { @@ -140,30 +122,62 @@ index b53402903eb6845df361daf6b05a668608ad7b63..0d43afcdd5db346d0ddf82e06bad5b21 protected long getTargetSendPerPlayerAddend() { - return GlobalConfiguration.get().chunkLoading.targetPlayerChunkSendRate <= 1.0 ? 0L : (long)Math.round(1.0e9 / GlobalConfiguration.get().chunkLoading.targetPlayerChunkSendRate); -+ return GlobalConfiguration.get().chunkLoading.targetPlayerChunkSendRate <= 1.0 ? 0L : (long)carpetfixes.helpers.FastMath.round(1.0e9 / GlobalConfiguration.get().chunkLoading.targetPlayerChunkSendRate); // Mirai ++ return GlobalConfiguration.get().chunkLoading.targetPlayerChunkSendRate <= 1.0 ? 0L : (long)carpetfixes.helpers.FastMath.round(1.0e9 / GlobalConfiguration.get().chunkLoading.targetPlayerChunkSendRate); } protected long getMaxSendAddend() { - return GlobalConfiguration.get().chunkLoading.globalMaxChunkSendRate <= 1.0 ? 0L : (long)Math.round(1.0e9 / GlobalConfiguration.get().chunkLoading.globalMaxChunkSendRate); -+ return GlobalConfiguration.get().chunkLoading.globalMaxChunkSendRate <= 1.0 ? 0L : (long)carpetfixes.helpers.FastMath.round(1.0e9 / GlobalConfiguration.get().chunkLoading.globalMaxChunkSendRate); // Mirai ++ return GlobalConfiguration.get().chunkLoading.globalMaxChunkSendRate <= 1.0 ? 0L : (long)carpetfixes.helpers.FastMath.round(1.0e9 / GlobalConfiguration.get().chunkLoading.globalMaxChunkSendRate); } public void onChunkPlayerTickReady(final int chunkX, final int chunkZ) { +diff --git a/src/main/java/io/papermc/paper/command/subcommands/FixLightCommand.java b/src/main/java/io/papermc/paper/command/subcommands/FixLightCommand.java +index 68645bbbab9b4225048b647252d8f462028a9c84..725f532ce4479cf059b3f749eb01372179056581 100644 +--- a/src/main/java/io/papermc/paper/command/subcommands/FixLightCommand.java ++++ b/src/main/java/io/papermc/paper/command/subcommands/FixLightCommand.java +@@ -105,12 +105,12 @@ public final class FixLightCommand implements PaperSubcommand { + ++relitChunks[0]; + sender.getBukkitEntity().sendMessage(text().color(DARK_AQUA).append( + text("Relit chunk ", BLUE), text(chunkPos.toString()), +- text(", progress: ", BLUE), text((int) (Math.round(100.0 * (double) (relitChunks[0]) / (double) pending[0])) + "%") ++ text(", progress: ", BLUE), text((int) (carpetfixes.helpers.FastMath.round(100.0 * (double) (relitChunks[0]) / (double) pending[0])) + "%") + )); + }, + (int totalRelit) -> { + final long end = System.nanoTime(); +- final long diff = Math.round(1.0e-6 * (end - start)); ++ final long diff = carpetfixes.helpers.FastMath.round(1.0e-6 * (end - start)); + sender.getBukkitEntity().sendMessage(text().color(DARK_AQUA).append( + text("Relit ", BLUE), text(totalRelit), + text(" chunks. Took ", BLUE), text(diff + "ms") +diff --git a/src/main/java/io/papermc/paper/command/subcommands/VersionCommand.java b/src/main/java/io/papermc/paper/command/subcommands/VersionCommand.java +index ae60bd96b5284d54676d8e7e4dd5d170b526ec1e..2344ea858eda8e54c2eb3ccbdad464ed5934650c 100644 +--- a/src/main/java/io/papermc/paper/command/subcommands/VersionCommand.java ++++ b/src/main/java/io/papermc/paper/command/subcommands/VersionCommand.java +@@ -14,7 +14,7 @@ public final class VersionCommand implements PaperSubcommand { + public boolean execute(final CommandSender sender, final String subCommand, final String[] args) { + final @Nullable Command ver = MinecraftServer.getServer().server.getCommandMap().getCommand("version"); + if (ver != null) { +- ver.execute(sender, "paper", new String[0]); ++ ver.execute(sender, "paper", me.titaniumtown.Constants.EMPTY_string_arr); // JettPack + } + return true; + } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index a578b872a357b19236ef1217344d3cdeffc64f9b..d565a12648d92b1d446a3b8b38b1e92520954254 100644 +index 11b0d23783fed5d96bd96c24adfc9a7f353a18b3..834ad81056c5a22921495c22d410bdf11666b87e 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -2749,7 +2749,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 21.0 ) ? "*" : "") + Math.min(Math.round(tps * 100.0) / 100.0, 20.0); // only print * at 21, we commonly peak to 20.02 as the tick sleep is not accurate enough, stop the noise -+ return (( tps > 21.0 ) ? "*" : "") + Math.min(carpetfixes.helpers.FastMath.round(tps * 100.0) / 100.0, 20.0); // only print * at 21, we commonly peak to 20.02 as the tick sleep is not accurate enough, stop the noise // Mirai ++ return (( tps > 21.0 ) ? "*" : "") + Math.min(carpetfixes.helpers.FastMath.round(tps * 100.0) / 100.0, 20.0); // only print * at 21, we commonly peak to 20.02 as the tick sleep is not accurate enough, stop the noise } // Paper end } @@ -188,7 +202,7 @@ index a4a6885bea59210192e8a2ce8834372275e7ceb3..6fb805ba6afa000e215e4b7c8da29bf5 } diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 10fe0a33e7d2663e27413b3affe035e91de37255..64f268e7b0d7029c330036817db4ce086bd336a6 100644 +index 10fe0a33e7d2663e27413b3affe035e91de37255..af8012ad3acb294806a18b6aa4fadb1d3fec6b33 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -1496,7 +1496,7 @@ public abstract class LivingEntity extends Entity { @@ -196,7 +210,7 @@ index 10fe0a33e7d2663e27413b3affe035e91de37255..64f268e7b0d7029c330036817db4ce08 CriteriaTriggers.ENTITY_HURT_PLAYER.trigger((ServerPlayer) this, source, f1, amount, flag); if (f2 > 0.0F && f2 < 3.4028235E37F) { - ((ServerPlayer) this).awardStat(Stats.DAMAGE_BLOCKED_BY_SHIELD, Math.round(f2 * 10.0F)); -+ ((ServerPlayer) this).awardStat(Stats.DAMAGE_BLOCKED_BY_SHIELD, carpetfixes.helpers.FastMath.round(f2 * 10.0F)); // Mirai ++ ((ServerPlayer) this).awardStat(Stats.DAMAGE_BLOCKED_BY_SHIELD, carpetfixes.helpers.FastMath.round(f2 * 10.0F)); } } @@ -205,10 +219,10 @@ index 10fe0a33e7d2663e27413b3affe035e91de37255..64f268e7b0d7029c330036817db4ce08 if (f3 > 0.0F && f3 < 3.4028235E37F) { if (this instanceof ServerPlayer) { - ((ServerPlayer) this).awardStat(Stats.DAMAGE_RESISTED, Math.round(f3 * 10.0F)); -+ ((ServerPlayer) this).awardStat(Stats.DAMAGE_RESISTED, carpetfixes.helpers.FastMath.round(f3 * 10.0F)); // Mirai ++ ((ServerPlayer) this).awardStat(Stats.DAMAGE_RESISTED, carpetfixes.helpers.FastMath.round(f3 * 10.0F)); } else if (source.getEntity() instanceof ServerPlayer) { - ((ServerPlayer) source.getEntity()).awardStat(Stats.DAMAGE_DEALT_RESISTED, Math.round(f3 * 10.0F)); -+ ((ServerPlayer) source.getEntity()).awardStat(Stats.DAMAGE_DEALT_RESISTED, carpetfixes.helpers.FastMath.round(f3 * 10.0F)); // Mirai ++ ((ServerPlayer) source.getEntity()).awardStat(Stats.DAMAGE_DEALT_RESISTED, carpetfixes.helpers.FastMath.round(f3 * 10.0F)); } } } @@ -217,10 +231,10 @@ index 10fe0a33e7d2663e27413b3affe035e91de37255..64f268e7b0d7029c330036817db4ce08 if (f3 > 0.0F && f3 < 3.4028235E37F) { if (this instanceof ServerPlayer) { - ((ServerPlayer) this).awardStat(Stats.DAMAGE_RESISTED, Math.round(f3 * 10.0F)); -+ ((ServerPlayer) this).awardStat(Stats.DAMAGE_RESISTED, carpetfixes.helpers.FastMath.round(f3 * 10.0F)); // Mirai ++ ((ServerPlayer) this).awardStat(Stats.DAMAGE_RESISTED, carpetfixes.helpers.FastMath.round(f3 * 10.0F)); } else if (damagesource.getEntity() instanceof ServerPlayer) { - ((ServerPlayer) damagesource.getEntity()).awardStat(Stats.DAMAGE_DEALT_RESISTED, Math.round(f3 * 10.0F)); -+ ((ServerPlayer) damagesource.getEntity()).awardStat(Stats.DAMAGE_DEALT_RESISTED, carpetfixes.helpers.FastMath.round(f3 * 10.0F)); // Mirai ++ ((ServerPlayer) damagesource.getEntity()).awardStat(Stats.DAMAGE_DEALT_RESISTED, carpetfixes.helpers.FastMath.round(f3 * 10.0F)); } } } @@ -229,11 +243,11 @@ index 10fe0a33e7d2663e27413b3affe035e91de37255..64f268e7b0d7029c330036817db4ce08 if (f2 > 0.0F && f2 < 3.4028235E37F && this instanceof net.minecraft.world.entity.player.Player) { - ((net.minecraft.world.entity.player.Player) this).awardStat(Stats.DAMAGE_ABSORBED, Math.round(f2 * 10.0F)); -+ ((net.minecraft.world.entity.player.Player) this).awardStat(Stats.DAMAGE_ABSORBED, carpetfixes.helpers.FastMath.round(f2 * 10.0F)); // Mirai ++ ((net.minecraft.world.entity.player.Player) this).awardStat(Stats.DAMAGE_ABSORBED, carpetfixes.helpers.FastMath.round(f2 * 10.0F)); } if (f2 > 0.0F && f2 < 3.4028235E37F && damagesource.getEntity() instanceof ServerPlayer) { - ((ServerPlayer) damagesource.getEntity()).awardStat(Stats.DAMAGE_DEALT_ABSORBED, Math.round(f2 * 10.0F)); -+ ((ServerPlayer) damagesource.getEntity()).awardStat(Stats.DAMAGE_DEALT_ABSORBED, carpetfixes.helpers.FastMath.round(f2 * 10.0F)); // Mirai ++ ((ServerPlayer) damagesource.getEntity()).awardStat(Stats.DAMAGE_DEALT_ABSORBED, carpetfixes.helpers.FastMath.round(f2 * 10.0F)); } if (f > 0 || !human) { @@ -242,7 +256,7 @@ index 10fe0a33e7d2663e27413b3affe035e91de37255..64f268e7b0d7029c330036817db4ce08 ((net.minecraft.world.entity.player.Player) this).causeFoodExhaustion(damagesource.getFoodExhaustion(), org.bukkit.event.entity.EntityExhaustionEvent.ExhaustionReason.DAMAGED); // CraftBukkit - EntityExhaustionEvent if (f < 3.4028235E37F) { - ((net.minecraft.world.entity.player.Player) this).awardStat(Stats.DAMAGE_TAKEN, Math.round(f * 10.0F)); -+ ((net.minecraft.world.entity.player.Player) this).awardStat(Stats.DAMAGE_TAKEN, carpetfixes.helpers.FastMath.round(f * 10.0F)); // Mirai ++ ((net.minecraft.world.entity.player.Player) this).awardStat(Stats.DAMAGE_TAKEN, carpetfixes.helpers.FastMath.round(f * 10.0F)); } } // CraftBukkit end @@ -251,11 +265,11 @@ index 10fe0a33e7d2663e27413b3affe035e91de37255..64f268e7b0d7029c330036817db4ce08 f2 = (float) -event.getDamage(DamageModifier.BLOCKING); if (f2 > 0.0F && f2 < 3.4028235E37F) { - ((ServerPlayer) this).awardStat(Stats.DAMAGE_BLOCKED_BY_SHIELD, Math.round(originalDamage * 10.0F)); -+ ((ServerPlayer) this).awardStat(Stats.DAMAGE_BLOCKED_BY_SHIELD, carpetfixes.helpers.FastMath.round(originalDamage * 10.0F)); // Mirai ++ ((ServerPlayer) this).awardStat(Stats.DAMAGE_BLOCKED_BY_SHIELD, carpetfixes.helpers.FastMath.round(originalDamage * 10.0F)); } } -@@ -3007,10 +3007,12 @@ public abstract class LivingEntity extends Entity { +@@ -3007,10 +3007,10 @@ public abstract class LivingEntity extends Entity { this.level.getProfiler().push("rangeChecks"); // Paper start - Stop large pitch and yaw changes from crashing the server @@ -263,17 +277,15 @@ index 10fe0a33e7d2663e27413b3affe035e91de37255..64f268e7b0d7029c330036817db4ce08 - this.yBodyRotO += Math.round((this.yBodyRot - this.yBodyRotO) / 360.0F) * 360.0F; - this.xRotO += Math.round((this.getXRot() - this.xRotO) / 360.0F) * 360.0F; - this.yHeadRotO += Math.round((this.yHeadRot - this.yHeadRotO) / 360.0F) * 360.0F; -+ // Mirai start + this.yRotO += carpetfixes.helpers.FastMath.round((this.getYRot() - this.yRotO) / 360.0F) * 360.0F; + this.yBodyRotO += carpetfixes.helpers.FastMath.round((this.yBodyRot - this.yBodyRotO) / 360.0F) * 360.0F; + this.xRotO += carpetfixes.helpers.FastMath.round((this.getXRot() - this.xRotO) / 360.0F) * 360.0F; + this.yHeadRotO += carpetfixes.helpers.FastMath.round((this.yHeadRot - this.yHeadRotO) / 360.0F) * 360.0F; -+ // Mirai end // Paper end this.level.getProfiler().pop(); diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 8d465c3ca7af2a804a4c178f054063d6a1a5ddad..c8fb4679d11c1e046bbe5483f72a7b74f0a36713 100644 +index 8d465c3ca7af2a804a4c178f054063d6a1a5ddad..4e520a7c5bdf0eb3830905859ea106396fa79653 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -1086,7 +1086,7 @@ public abstract class Player extends LivingEntity { @@ -281,7 +293,7 @@ index 8d465c3ca7af2a804a4c178f054063d6a1a5ddad..c8fb4679d11c1e046bbe5483f72a7b74 if (f2 > 0.0F && f2 < 3.4028235E37F) { - this.awardStat(Stats.DAMAGE_ABSORBED, Math.round(f2 * 10.0F)); -+ this.awardStat(Stats.DAMAGE_ABSORBED, carpetfixes.helpers.FastMath.round(f2 * 10.0F)); // Mirai ++ this.awardStat(Stats.DAMAGE_ABSORBED, carpetfixes.helpers.FastMath.round(f2 * 10.0F)); } if (f != 0.0F) { @@ -290,7 +302,7 @@ index 8d465c3ca7af2a804a4c178f054063d6a1a5ddad..c8fb4679d11c1e046bbe5483f72a7b74 this.getCombatTracker().recordDamage(damagesource, f3, f); if (f < 3.4028235E37F) { - this.awardStat(Stats.DAMAGE_TAKEN, Math.round(f * 10.0F)); -+ this.awardStat(Stats.DAMAGE_TAKEN, carpetfixes.helpers.FastMath.round(f * 10.0F)); // Mirai ++ this.awardStat(Stats.DAMAGE_TAKEN, carpetfixes.helpers.FastMath.round(f * 10.0F)); } } @@ -299,7 +311,7 @@ index 8d465c3ca7af2a804a4c178f054063d6a1a5ddad..c8fb4679d11c1e046bbe5483f72a7b74 float f5 = f3 - ((LivingEntity) target).getHealth(); - this.awardStat(Stats.DAMAGE_DEALT, Math.round(f5 * 10.0F)); -+ this.awardStat(Stats.DAMAGE_DEALT, carpetfixes.helpers.FastMath.round(f5 * 10.0F)); // Mirai ++ this.awardStat(Stats.DAMAGE_DEALT, carpetfixes.helpers.FastMath.round(f5 * 10.0F)); if (j > 0) { // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), target.getBukkitEntity(), j * 4); @@ -308,21 +320,21 @@ index 8d465c3ca7af2a804a4c178f054063d6a1a5ddad..c8fb4679d11c1e046bbe5483f72a7b74 if (this.isSwimming()) { - i = Math.round((float) Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F); -+ i = carpetfixes.helpers.FastMath.round((float) Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F); // Mirai ++ i = carpetfixes.helpers.FastMath.round((float) Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F); if (i > 0) { this.awardStat(Stats.SWIM_ONE_CM, i); this.causeFoodExhaustion(level.spigotConfig.swimMultiplier * (float) i * 0.01F, EntityExhaustionEvent.ExhaustionReason.SWIM); // CraftBukkit - EntityExhaustionEvent // Spigot } } else if (this.isEyeInFluid(FluidTags.WATER)) { - i = Math.round((float) Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F); -+ i = carpetfixes.helpers.FastMath.round((float) Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F); // Mirai ++ i = carpetfixes.helpers.FastMath.round((float) Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F); if (i > 0) { this.awardStat(Stats.WALK_UNDER_WATER_ONE_CM, i); this.causeFoodExhaustion(level.spigotConfig.swimMultiplier * (float) i * 0.01F, EntityExhaustionEvent.ExhaustionReason.WALK_UNDERWATER); // CraftBukkit - EntityExhaustionEvent // Spigot } } else if (this.isInWater()) { - i = Math.round((float) Math.sqrt(dx * dx + dz * dz) * 100.0F); -+ i = carpetfixes.helpers.FastMath.round((float) Math.sqrt(dx * dx + dz * dz) * 100.0F); // Mirai ++ i = carpetfixes.helpers.FastMath.round((float) Math.sqrt(dx * dx + dz * dz) * 100.0F); if (i > 0) { this.awardStat(Stats.WALK_ON_WATER_ONE_CM, i); this.causeFoodExhaustion(level.spigotConfig.swimMultiplier * (float) i * 0.01F, EntityExhaustionEvent.ExhaustionReason.WALK_ON_WATER); // CraftBukkit - EntityExhaustionEvent // Spigot @@ -330,11 +342,11 @@ index 8d465c3ca7af2a804a4c178f054063d6a1a5ddad..c8fb4679d11c1e046bbe5483f72a7b74 } else if (this.onClimbable()) { if (dy > 0.0D) { - this.awardStat(Stats.CLIMB_ONE_CM, (int) Math.round(dy * 100.0D)); -+ this.awardStat(Stats.CLIMB_ONE_CM, (int) carpetfixes.helpers.FastMath.round(dy * 100.0D)); // Mirai ++ this.awardStat(Stats.CLIMB_ONE_CM, (int) carpetfixes.helpers.FastMath.round(dy * 100.0D)); } } else if (this.onGround) { - i = Math.round((float) Math.sqrt(dx * dx + dz * dz) * 100.0F); -+ i = carpetfixes.helpers.FastMath.round((float) Math.sqrt(dx * dx + dz * dz) * 100.0F); // Mirai ++ i = carpetfixes.helpers.FastMath.round((float) Math.sqrt(dx * dx + dz * dz) * 100.0F); if (i > 0) { if (this.isSprinting()) { this.awardStat(Stats.SPRINT_ONE_CM, i); @@ -343,11 +355,11 @@ index 8d465c3ca7af2a804a4c178f054063d6a1a5ddad..c8fb4679d11c1e046bbe5483f72a7b74 } } else if (this.isFallFlying()) { - i = Math.round((float) Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F); -+ i = carpetfixes.helpers.FastMath.round((float) Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F); // Mirai ++ i = carpetfixes.helpers.FastMath.round((float) Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F); this.awardStat(Stats.AVIATE_ONE_CM, i); } else { - i = Math.round((float) Math.sqrt(dx * dx + dz * dz) * 100.0F); -+ i = carpetfixes.helpers.FastMath.round((float) Math.sqrt(dx * dx + dz * dz) * 100.0F); // Mirai ++ i = carpetfixes.helpers.FastMath.round((float) Math.sqrt(dx * dx + dz * dz) * 100.0F); if (i > 25) { this.awardStat(Stats.FLY_ONE_CM, i); } @@ -356,7 +368,7 @@ index 8d465c3ca7af2a804a4c178f054063d6a1a5ddad..c8fb4679d11c1e046bbe5483f72a7b74 public void checkRidingStatistics(double dx, double dy, double dz) { if (this.isPassenger()) { - int i = Math.round((float) Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F); -+ int i = carpetfixes.helpers.FastMath.round((float) Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F); // Mirai ++ int i = carpetfixes.helpers.FastMath.round((float) Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F); if (i > 0) { Entity entity = this.getVehicle(); @@ -365,12 +377,12 @@ index 8d465c3ca7af2a804a4c178f054063d6a1a5ddad..c8fb4679d11c1e046bbe5483f72a7b74 } else { if (fallDistance >= 2.0F) { - this.awardStat(Stats.FALL_ONE_CM, (int) Math.round((double) fallDistance * 100.0D)); -+ this.awardStat(Stats.FALL_ONE_CM, (int) carpetfixes.helpers.FastMath.round((double) fallDistance * 100.0D)); // Mirai ++ this.awardStat(Stats.FALL_ONE_CM, (int) carpetfixes.helpers.FastMath.round((double) fallDistance * 100.0D)); } return super.causeFallDamage(fallDistance, damageMultiplier, damageSource); diff --git a/src/main/java/net/minecraft/world/level/block/DaylightDetectorBlock.java b/src/main/java/net/minecraft/world/level/block/DaylightDetectorBlock.java -index 16504b8be08064e61b013fa943f692816612cbd0..38f6759501dcc2a0adb9608a9f639c2411acf277 100644 +index 16504b8be08064e61b013fa943f692816612cbd0..c5b39234822626b4ff948464409ca415250619e9 100644 --- a/src/main/java/net/minecraft/world/level/block/DaylightDetectorBlock.java +++ b/src/main/java/net/minecraft/world/level/block/DaylightDetectorBlock.java @@ -62,7 +62,7 @@ public class DaylightDetectorBlock extends BaseEntityBlock { @@ -378,12 +390,12 @@ index 16504b8be08064e61b013fa943f692816612cbd0..38f6759501dcc2a0adb9608a9f639c24 f += (f1 - f) * 0.2F; - i = Math.round((float) i * Mth.cos(f)); -+ i = carpetfixes.helpers.FastMath.round((float) i * Mth.cos(f)); // Mirai ++ i = carpetfixes.helpers.FastMath.round((float) i * Mth.cos(f)); } i = Mth.clamp(i, (int) 0, (int) 15); diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java b/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java -index 264ca51c2f2a5ff69688372b71ad7355366bac1a..22114707a850079e4adcc31775824ccb33c456b1 100644 +index 264ca51c2f2a5ff69688372b71ad7355366bac1a..01fcbe8445de6d024b17c205d9363faa6b2dfa39 100644 --- a/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java +++ b/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java @@ -249,8 +249,8 @@ public abstract class ChunkGenerator { @@ -392,13 +404,13 @@ index 264ca51c2f2a5ff69688372b71ad7355366bac1a..22114707a850079e4adcc31775824ccb double d1 = (double) (4 * i + i * i1 * 6) + (randomsource.nextDouble() - 0.5D) * (double) i * 2.5D; - int k1 = (int) Math.round(Math.cos(d0) * d1); - int l1 = (int) Math.round(Math.sin(d0) * d1); -+ int k1 = (int) carpetfixes.helpers.FastMath.round(Math.cos(d0) * d1); // Mirai -+ int l1 = (int) carpetfixes.helpers.FastMath.round(Math.sin(d0) * d1); // Mirai ++ int k1 = (int) carpetfixes.helpers.FastMath.round(Math.cos(d0) * d1); ++ int l1 = (int) carpetfixes.helpers.FastMath.round(Math.sin(d0) * d1); BiomeSource worldchunkmanager = this.biomeSource; int i2 = SectionPos.sectionToBlockCoord(k1, 8); int j2 = SectionPos.sectionToBlockCoord(l1, 8); diff --git a/src/main/java/net/minecraft/world/level/storage/loot/functions/LootingEnchantFunction.java b/src/main/java/net/minecraft/world/level/storage/loot/functions/LootingEnchantFunction.java -index 31918fa2eb38e42a5ea5366e559f25ea9d7d59ae..fe0bcd4295e96556d1c5282d6acc426980697675 100644 +index 31918fa2eb38e42a5ea5366e559f25ea9d7d59ae..f512f1e0c46b96f831fdea3073e57c6bfd9c69eb 100644 --- a/src/main/java/net/minecraft/world/level/storage/loot/functions/LootingEnchantFunction.java +++ b/src/main/java/net/minecraft/world/level/storage/loot/functions/LootingEnchantFunction.java @@ -61,7 +61,7 @@ public class LootingEnchantFunction extends LootItemConditionalFunction { @@ -406,12 +418,12 @@ index 31918fa2eb38e42a5ea5366e559f25ea9d7d59ae..fe0bcd4295e96556d1c5282d6acc4269 float f = (float) i * this.value.getFloat(context); - stack.grow(Math.round(f)); -+ stack.grow(carpetfixes.helpers.FastMath.round(f)); // Mirai ++ stack.grow(carpetfixes.helpers.FastMath.round(f)); if (this.hasLimit() && stack.getCount() > this.limit) { stack.setCount(this.limit); } diff --git a/src/main/java/net/minecraft/world/phys/shapes/Shapes.java b/src/main/java/net/minecraft/world/phys/shapes/Shapes.java -index 731c7dd15f131dc124be6af8f342b122cb89491b..24a82111a5485da1e3903977d0519e9ed502f34d 100644 +index 731c7dd15f131dc124be6af8f342b122cb89491b..3ca1a2599a211374cb95e73fdc8c8b3069496660 100644 --- a/src/main/java/net/minecraft/world/phys/shapes/Shapes.java +++ b/src/main/java/net/minecraft/world/phys/shapes/Shapes.java @@ -59,8 +59,8 @@ public final class Shapes { @@ -420,13 +432,13 @@ index 731c7dd15f131dc124be6af8f342b122cb89491b..24a82111a5485da1e3903977d0519e9e double e = max * (double)j; - boolean bl = Math.abs(d - (double)Math.round(d)) < 1.0E-7D * (double)j; - boolean bl2 = Math.abs(e - (double)Math.round(e)) < 1.0E-7D * (double)j; -+ boolean bl = Math.abs(d - (double)carpetfixes.helpers.FastMath.round(d)) < 1.0E-7D * (double)j; // Mirai -+ boolean bl2 = Math.abs(e - (double)carpetfixes.helpers.FastMath.round(e)) < 1.0E-7D * (double)j; // Mirai ++ boolean bl = Math.abs(d - (double)carpetfixes.helpers.FastMath.round(d)) < 1.0E-7D * (double)j; ++ boolean bl2 = Math.abs(e - (double)carpetfixes.helpers.FastMath.round(e)) < 1.0E-7D * (double)j; if (bl && bl2) { return i; } diff --git a/src/main/java/org/spigotmc/TicksPerSecondCommand.java b/src/main/java/org/spigotmc/TicksPerSecondCommand.java -index 0ecac76577eb440a0c3104ef4603acec826c474d..26ff7f68dacad945095d794c1def4752e0775abb 100644 +index 0ecac76577eb440a0c3104ef4603acec826c474d..4813bd6de894d0566e8631d8c71915c38c1da0f8 100644 --- a/src/main/java/org/spigotmc/TicksPerSecondCommand.java +++ b/src/main/java/org/spigotmc/TicksPerSecondCommand.java @@ -52,7 +52,7 @@ public class TicksPerSecondCommand extends Command @@ -434,23 +446,25 @@ index 0ecac76577eb440a0c3104ef4603acec826c474d..26ff7f68dacad945095d794c1def4752 { return ( ( tps > 18.0 ) ? ChatColor.GREEN : ( tps > 16.0 ) ? ChatColor.YELLOW : ChatColor.RED ).toString() - + ( ( tps > 21.0 ) ? "*" : "" ) + Math.min( Math.round( tps * 100.0 ) / 100.0, 20.0 ); // Paper - only print * at 21, we commonly peak to 20.02 as the tick sleep is not accurate enough, stop the noise -+ + ( ( tps > 21.0 ) ? "*" : "" ) + Math.min( carpetfixes.helpers.FastMath.round( tps * 100.0 ) / 100.0, 20.0 ); // Paper - only print * at 21, we commonly peak to 20.02 as the tick sleep is not accurate enough, stop the noise // Mirai ++ + ( ( tps > 21.0 ) ? "*" : "" ) + Math.min( carpetfixes.helpers.FastMath.round( tps * 100.0 ) / 100.0, 20.0 ); // Paper - only print * at 21, we commonly peak to 20.02 as the tick sleep is not accurate enough, stop the noise } // Yatopia start - Last tick time API diff --git a/src/main/java/wtf/etil/mirai/MiraiConfig.java b/src/main/java/wtf/etil/mirai/MiraiConfig.java -index ea398d72cdbec80add81971f3cf34b750e9448ae..db805105fd2a9befb1f4e4fd4b917207ca7d82e5 100644 +index 0e1ff578af49eaa44508119b16fae67744041150..58464d609824c52bd297e9c242c2957e1545c172 100644 --- a/src/main/java/wtf/etil/mirai/MiraiConfig.java +++ b/src/main/java/wtf/etil/mirai/MiraiConfig.java -@@ -263,4 +263,11 @@ public class MiraiConfig { - mapUpdateInterval = getInt("map-update-interval", mapUpdateInterval); +@@ -235,4 +235,13 @@ public class MiraiConfig { + "A second is 20 ticks."); } -+ public static boolean optimizedRound = true; -+ public static boolean optimizedHypot = true; ++ public static boolean optimizedRound; ++ public static boolean optimizedHypot; + private static void fastMath() { -+ optimizedRound = getBoolean("optimize-math-round", optimizedRound); -+ optimizedHypot = getBoolean("optimize-math-hypot", optimizedHypot); ++ optimizedRound = getBoolean("optimize-math-round", true, ++ "Whether or not Math.round should be replaced by a faster version."); ++ optimizedHypot = getBoolean("optimize-math-hypot", true, ++ "Whether or not Math.hypot should be replaced by a faster version."); + } + } diff --git a/patches/server/0102-Faster-Sheep.getOffspringColor.patch b/patches/server/0100-Faster-Sheep.getOffspringColor.patch similarity index 100% rename from patches/server/0102-Faster-Sheep.getOffspringColor.patch rename to patches/server/0100-Faster-Sheep.getOffspringColor.patch diff --git a/patches/server/0103-Implement-Velocity-VarInt-optimizations.patch b/patches/server/0101-Implement-Velocity-VarInt-optimizations.patch similarity index 100% rename from patches/server/0103-Implement-Velocity-VarInt-optimizations.patch rename to patches/server/0101-Implement-Velocity-VarInt-optimizations.patch diff --git a/patches/server/0102-reduce-work-done-by-game-event-system.patch b/patches/server/0102-reduce-work-done-by-game-event-system.patch new file mode 100644 index 0000000..c1386d2 --- /dev/null +++ b/patches/server/0102-reduce-work-done-by-game-event-system.patch @@ -0,0 +1,135 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: peaches94 +Date: Sun, 10 Jul 2022 13:29:20 -0500 +Subject: [PATCH] reduce work done by game event system + +Original license: GPLv3 +Original project: https://github.com/Bloom-host/Petal + +1. going into game event dispatching can be expensive so run the checks before dispatching + +2. euclideangameeventdispatcher is not used concurrently so we ban that usage for improved performance with allays + +diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java +index 50daf0762ae2eded8e5e42db12bcdb06ed183225..fa51185762cf68b9f086d278db2f1d1441315344 100644 +--- a/src/main/java/net/minecraft/server/level/ServerLevel.java ++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java +@@ -1617,6 +1617,7 @@ public class ServerLevel extends Level implements WorldGenLevel { + if (chunk != null) { + for (int j2 = k; j2 <= j1; ++j2) { + flag |= chunk.getEventDispatcher(j2).walkListeners(event, emitterPos, emitter, (gameeventlistener, vec3d1) -> { ++ if (!gameeventlistener.listensToEvent(event, emitter)) return; // petal - if they don't listen, ignore + (gameeventlistener.handleEventsImmediately() ? list : this.gameEventMessages).add(new GameEvent.Message(event, emitterPos, emitter, gameeventlistener, vec3d1)); + }); + } +diff --git a/src/main/java/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java +index 22c309343299e60ed8028229b7f134109001ff35..d5947d29295ddc93ba8ac1c0fc61f7badad582c4 100644 +--- a/src/main/java/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java ++++ b/src/main/java/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java +@@ -85,6 +85,13 @@ public class SculkCatalystBlockEntity extends BlockEntity implements GameEventLi + } + } + ++ // petal start ++ @Override ++ public boolean listensToEvent(GameEvent gameEvent, GameEvent.Context context) { ++ return !this.isRemoved() && gameEvent == GameEvent.ENTITY_DIE && context.sourceEntity() instanceof LivingEntity; ++ } ++ // petal end ++ + public static void serverTick(Level world, BlockPos pos, BlockState state, SculkCatalystBlockEntity blockEntity) { + org.bukkit.craftbukkit.event.CraftEventFactory.sourceBlockOverride = blockEntity.getBlockPos(); // CraftBukkit - SPIGOT-7068: Add source block override, not the most elegant way but better than passing down a BlockPosition up to five methods deep. + blockEntity.sculkSpreader.updateCursors(world, pos, world.getRandom(), true); +diff --git a/src/main/java/net/minecraft/world/level/gameevent/EuclideanGameEventDispatcher.java b/src/main/java/net/minecraft/world/level/gameevent/EuclideanGameEventDispatcher.java +index 0dd708ebe81f73710de51215529c05ec61837dd3..f5b402efa86f824c460db8cac20c1c2b090f82d0 100644 +--- a/src/main/java/net/minecraft/world/level/gameevent/EuclideanGameEventDispatcher.java ++++ b/src/main/java/net/minecraft/world/level/gameevent/EuclideanGameEventDispatcher.java +@@ -13,8 +13,8 @@ import net.minecraft.world.phys.Vec3; + + public class EuclideanGameEventDispatcher implements GameEventDispatcher { + private final List listeners = Lists.newArrayList(); +- private final Set listenersToRemove = Sets.newHashSet(); +- private final List listenersToAdd = Lists.newArrayList(); ++ //private final Set listenersToRemove = Sets.newHashSet(); // petal - not necessary ++ //private final List listenersToAdd = Lists.newArrayList(); // petal + private boolean processing; + private final ServerLevel level; + +@@ -30,7 +30,7 @@ public class EuclideanGameEventDispatcher implements GameEventDispatcher { + @Override + public void register(GameEventListener listener) { + if (this.processing) { +- this.listenersToAdd.add(listener); ++ throw new java.util.ConcurrentModificationException(); // petal - disallow concurrent modification + } else { + this.listeners.add(listener); + } +@@ -41,7 +41,7 @@ public class EuclideanGameEventDispatcher implements GameEventDispatcher { + @Override + public void unregister(GameEventListener listener) { + if (this.processing) { +- this.listenersToRemove.add(listener); ++ throw new java.util.ConcurrentModificationException(); // petal - disallow concurrent modification + } else { + this.listeners.remove(listener); + } +@@ -58,7 +58,7 @@ public class EuclideanGameEventDispatcher implements GameEventDispatcher { + + while(iterator.hasNext()) { + GameEventListener gameEventListener = iterator.next(); +- if (this.listenersToRemove.remove(gameEventListener)) { ++ if (false) { // petal - disallow concurrent modification + iterator.remove(); + } else { + Optional optional = getPostableListenerPosition(this.level, pos, gameEventListener); +@@ -72,6 +72,8 @@ public class EuclideanGameEventDispatcher implements GameEventDispatcher { + this.processing = false; + } + ++ // petal start ++ /* + if (!this.listenersToAdd.isEmpty()) { + this.listeners.addAll(this.listenersToAdd); + this.listenersToAdd.clear(); +@@ -81,6 +83,8 @@ public class EuclideanGameEventDispatcher implements GameEventDispatcher { + this.listeners.removeAll(this.listenersToRemove); + this.listenersToRemove.clear(); + } ++ */ ++ // petal end + + return bl; + } +diff --git a/src/main/java/net/minecraft/world/level/gameevent/GameEventListener.java b/src/main/java/net/minecraft/world/level/gameevent/GameEventListener.java +index e5601afe8b739da518f36ae306f5e0cb252238f0..bc8f04424c5e8c416d6988f0e06d8cadbb400ca7 100644 +--- a/src/main/java/net/minecraft/world/level/gameevent/GameEventListener.java ++++ b/src/main/java/net/minecraft/world/level/gameevent/GameEventListener.java +@@ -12,4 +12,10 @@ public interface GameEventListener { + int getListenerRadius(); + + boolean handleGameEvent(ServerLevel world, GameEvent.Message event); ++ ++ // petal start - add check for seeing if this listener cares about an event ++ default boolean listensToEvent(net.minecraft.world.level.gameevent.GameEvent gameEvent, net.minecraft.world.level.gameevent.GameEvent.Context context) { ++ return true; ++ } ++ // petal end + } +diff --git a/src/main/java/net/minecraft/world/level/gameevent/vibrations/VibrationListener.java b/src/main/java/net/minecraft/world/level/gameevent/vibrations/VibrationListener.java +index e45f54534bbf054eaf0008546ff459d4c11ddd50..e49d0d1c2a539fcd7e75262c4010475193964287 100644 +--- a/src/main/java/net/minecraft/world/level/gameevent/vibrations/VibrationListener.java ++++ b/src/main/java/net/minecraft/world/level/gameevent/vibrations/VibrationListener.java +@@ -162,6 +162,13 @@ public class VibrationListener implements GameEventListener { + return true; + } + ++ // petal start ++ @Override ++ public boolean listensToEvent(GameEvent gameEvent, GameEvent.Context context) { ++ return this.receivingEvent == null && gameEvent.is(this.config.getListenableEvents()); ++ } ++ // petal end ++ + public interface VibrationListenerConfig { + + default TagKey getListenableEvents() { diff --git a/patches/server/0103-reduce-sensor-work.patch b/patches/server/0103-reduce-sensor-work.patch new file mode 100644 index 0000000..9d2d9d0 --- /dev/null +++ b/patches/server/0103-reduce-sensor-work.patch @@ -0,0 +1,49 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: peaches94 +Date: Sun, 10 Jul 2022 15:44:38 -0500 +Subject: [PATCH] reduce sensor work + +Original license: GPLv3 +Original project: https://github.com/Bloom-host/Petal + +this patch is focused around the sensors used for ai +delete the line of sight cache less often and use a faster nearby comparison + +diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java +index af8012ad3acb294806a18b6aa4fadb1d3fec6b33..c4c32d3f2ee242e3fdd9d57270b8a9d938014351 100644 +--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java ++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java +@@ -998,12 +998,14 @@ public abstract class LivingEntity extends Entity { + } + + if (entity != null) { +- ItemStack itemstack = this.getItemBySlot(EquipmentSlot.HEAD); ++ // petal start - only do itemstack lookup if we need to ++ //ItemStack itemstack = this.getItemBySlot(EquipmentSlot.HEAD); + EntityType entitytypes = entity.getType(); + +- if (entitytypes == EntityType.SKELETON && itemstack.is(Items.SKELETON_SKULL) || entitytypes == EntityType.ZOMBIE && itemstack.is(Items.ZOMBIE_HEAD) || entitytypes == EntityType.CREEPER && itemstack.is(Items.CREEPER_HEAD)) { ++ if (entitytypes == EntityType.SKELETON && this.getItemBySlot(EquipmentSlot.HEAD).is(Items.SKELETON_SKULL) || entitytypes == EntityType.ZOMBIE && this.getItemBySlot(EquipmentSlot.HEAD).is(Items.ZOMBIE_HEAD) || entitytypes == EntityType.CREEPER && this.getItemBySlot(EquipmentSlot.HEAD).is(Items.CREEPER_HEAD)) { + d0 *= 0.5D; + } ++ // petal end + } + + return d0; +diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java +index a60cca663da4200d482c19d0b41a9514825a1e9b..c39ceda8e9314dd8338ade29d92baa0c8173d2c9 100644 +--- a/src/main/java/net/minecraft/world/entity/Mob.java ++++ b/src/main/java/net/minecraft/world/entity/Mob.java +@@ -849,10 +849,10 @@ public abstract class Mob extends LivingEntity { + return; + } + // Paper end ++ int i = this.level.getServer().getTickCount() + this.getId(); // petal - move up + this.level.getProfiler().push("sensing"); +- this.sensing.tick(); ++ if (i % 10 == 0) this.sensing.tick(); // petal - only refresh line of sight cache every half second + this.level.getProfiler().pop(); +- int i = this.level.getServer().getTickCount() + this.getId(); + + if (i % 2 != 0 && this.tickCount > 1) { + this.level.getProfiler().push("targetSelector");