From 62693c2229e067e549a467f8733826a9a3953e07 Mon Sep 17 00:00:00 2001 From: Dustin Norberg Date: Wed, 23 Sep 2026 14:49:44 -0400 Subject: [PATCH] Add blank symbol and link-panel pages (#18) --- README.md | 5 + docs/ASSET_PROVENANCE.md | 15 ++ docs/PORTING.md | 1 + docs/WRITING_DATA.md | 20 +++ gradle.properties | 2 +- .../gametest/WritingDataGameTests.java | 55 ++++++++ .../dnorberg/rivencraft/item/PageItem.java | 131 ++++++++++++++++++ .../rivencraft/registry/ModCreativeTabs.java | 1 + .../registry/ModDataComponents.java | 14 ++ .../rivencraft/registry/ModItems.java | 6 + .../rivencraft/writing/PageContent.java | 95 +++++++++++++ .../assets/rivencraft/lang/en_us.json | 6 + .../assets/rivencraft/models/item/page.json | 17 +++ .../models/item/page_link_panel.json | 6 + .../rivencraft/models/item/page_symbol.json | 6 + .../models/item/page_symbol_biome_native.json | 4 + .../page_symbol_celestial_normal_time.json | 4 + .../item/page_symbol_feature_caves.json | 4 + .../item/page_symbol_lighting_normal.json | 4 + .../item/page_symbol_terrain_standard.json | 4 + .../item/page_symbol_weather_normal.json | 4 + .../models/item/page_unresolved.json | 6 + .../assets/rivencraft/textures/item/page.png | Bin 0 -> 297 bytes .../textures/item/page_link_panel.png | Bin 0 -> 941 bytes .../rivencraft/textures/item/page_symbol.png | Bin 0 -> 1348 bytes .../item/page_symbol_biome_native.png | Bin 0 -> 12141 bytes .../page_symbol_celestial_normal_time.png | Bin 0 -> 11991 bytes .../item/page_symbol_feature_caves.png | Bin 0 -> 12239 bytes .../item/page_symbol_lighting_normal.png | Bin 0 -> 12567 bytes .../item/page_symbol_terrain_standard.png | Bin 0 -> 12669 bytes .../item/page_symbol_weather_normal.png | Bin 0 -> 11988 bytes .../textures/item/page_unresolved.png | Bin 0 -> 1348 bytes .../data/rivencraft/recipe/page.json | 13 ++ 33 files changed, 422 insertions(+), 1 deletion(-) create mode 100644 docs/ASSET_PROVENANCE.md create mode 100644 src/main/java/net/dnorberg/rivencraft/item/PageItem.java create mode 100644 src/main/java/net/dnorberg/rivencraft/writing/PageContent.java create mode 100644 src/main/resources/assets/rivencraft/models/item/page.json create mode 100644 src/main/resources/assets/rivencraft/models/item/page_link_panel.json create mode 100644 src/main/resources/assets/rivencraft/models/item/page_symbol.json create mode 100644 src/main/resources/assets/rivencraft/models/item/page_symbol_biome_native.json create mode 100644 src/main/resources/assets/rivencraft/models/item/page_symbol_celestial_normal_time.json create mode 100644 src/main/resources/assets/rivencraft/models/item/page_symbol_feature_caves.json create mode 100644 src/main/resources/assets/rivencraft/models/item/page_symbol_lighting_normal.json create mode 100644 src/main/resources/assets/rivencraft/models/item/page_symbol_terrain_standard.json create mode 100644 src/main/resources/assets/rivencraft/models/item/page_symbol_weather_normal.json create mode 100644 src/main/resources/assets/rivencraft/models/item/page_unresolved.json create mode 100644 src/main/resources/assets/rivencraft/textures/item/page.png create mode 100644 src/main/resources/assets/rivencraft/textures/item/page_link_panel.png create mode 100644 src/main/resources/assets/rivencraft/textures/item/page_symbol.png create mode 100644 src/main/resources/assets/rivencraft/textures/item/page_symbol_biome_native.png create mode 100644 src/main/resources/assets/rivencraft/textures/item/page_symbol_celestial_normal_time.png create mode 100644 src/main/resources/assets/rivencraft/textures/item/page_symbol_feature_caves.png create mode 100644 src/main/resources/assets/rivencraft/textures/item/page_symbol_lighting_normal.png create mode 100644 src/main/resources/assets/rivencraft/textures/item/page_symbol_terrain_standard.png create mode 100644 src/main/resources/assets/rivencraft/textures/item/page_symbol_weather_normal.png create mode 100644 src/main/resources/assets/rivencraft/textures/item/page_unresolved.png create mode 100644 src/main/resources/data/rivencraft/recipe/page.json diff --git a/README.md b/README.md index f0e2bde..8afd39e 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,11 @@ and randomly seeded, persistent vanilla-like Ages created from page-free Descriptive Books. Instability and full symbol-to-world grammar interpretation have not been ported yet. +Milestone 4 now includes stackable blank Pages plus server-created symbol, +unresolved-symbol, and baseline link-panel states. Page visuals follow the +legacy runtime-composition rules; written-page creation will become available +through the Writing Desk work that follows. + ## Linking Book Craft a Linking Book from a vanilla book and an ender pearl, then use it in the diff --git a/docs/ASSET_PROVENANCE.md b/docs/ASSET_PROVENANCE.md new file mode 100644 index 0000000..57bb3a3 --- /dev/null +++ b/docs/ASSET_PROVENANCE.md @@ -0,0 +1,15 @@ +# Asset provenance + +Rivencraft reuses selected assets from +[Mystcraft Legacy](https://github.com/Mystcraft/Mystcraft-Legacy) under that +project's GNU LGPL v3 license. Rivencraft itself uses the same license. + +| Rivencraft asset | Upstream asset | Upstream revision | Changes | +| --- | --- | --- | --- | +| `assets/rivencraft/textures/item/page.png` | `assets/mystcraft/textures/items/page_background.png` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Namespace/path rename only | +| `assets/rivencraft/textures/item/page_link_panel.png` | `page_background.png` and `PageBuilder.BasicPageSprite` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Reproduces the legacy 160 px scale, black panel at `(25,30)`–`(135,75)`, and 128 px resample | +| `assets/rivencraft/textures/item/page_symbol*.png` and `page_unresolved.png` | `page_background.png`, `textures/symbolcomponents.png`, `WordData`, `ModSymbols`, and `PageBuilder.PageSprite` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Static 1.21.1 renditions of the legacy runtime-composed four-word symbol pages; `normal_time` uses the legacy Full Length poem | + +Mystcraft Legacy identifies XCompWiz as its project developer and includes the +full LGPL v3 text in its root `LICENSE` file. Rivencraft's root `LICENSE` +provides the same license terms. diff --git a/docs/PORTING.md b/docs/PORTING.md index 4a36824..0350d02 100644 --- a/docs/PORTING.md +++ b/docs/PORTING.md @@ -70,6 +70,7 @@ not interpret symbols into Age generation, which remains Milestone 5 work. ## Provenance rules - New code uses the `net.dnorberg.rivencraft` package. +- Reused legacy art is recorded in [ASSET_PROVENANCE.md](ASSET_PROVENANCE.md). - Adapted Mystcraft code retains its upstream copyright notice and is tracked in a nearby source comment or commit. - Generated, binary, and third-party dependency content is not copied from the diff --git a/docs/WRITING_DATA.md b/docs/WRITING_DATA.md index 2297d9c..bc061c6 100644 --- a/docs/WRITING_DATA.md +++ b/docs/WRITING_DATA.md @@ -44,3 +44,23 @@ Removing a data pack never removes its IDs from saved writing. A missing ID is resolved as client-safe **Unresolved Symbol** display metadata while retaining the original namespaced ID for diagnostics and later restoration. This is deliberately different from treating an unknown symbol as valid grammar. + +## Pages + +The single stackable `rivencraft:page` item has a bounded, persistent +`rivencraft:page_content` component. Its explicit states are blank, symbol, +unresolved symbol, and baseline link panel. Symbol and unresolved-symbol pages +retain their namespaced symbol reference; unresolved pages can be inspected and +removed but are rejected as usable writing until their data pack returns. + +Only server-side writing operations may turn a blank page into a known symbol +page or link panel. The shared `PageItem` creation and validation gates reject +new pages for identifiers absent from the server catalog. Later Writing Desk +and Book Binder packets must call these gates rather than accepting page +contents supplied by a client. + +The item model uses server-assigned custom-model data derived from the symbol +identifier. Built-in pages reproduce Mystcraft Legacy's four-word poem +composition from its page background and symbol-component sheet. Data-pack +symbols without a bundled resource-pack model use the legacy question-mark +fallback while keeping their real identifier and display metadata. diff --git a/gradle.properties b/gradle.properties index 40104cb..69a52aa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -35,7 +35,7 @@ mod_name=Rivencraft # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=LGPL-3.0-or-later # The mod version. Rivencraft uses the x.y.z.b policy documented in README.md. -mod_version=0.3.1.0 +mod_version=0.3.2.0 immersive_portals_version=6.0.7 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. diff --git a/src/main/java/net/dnorberg/rivencraft/gametest/WritingDataGameTests.java b/src/main/java/net/dnorberg/rivencraft/gametest/WritingDataGameTests.java index 80b269f..961ebe2 100644 --- a/src/main/java/net/dnorberg/rivencraft/gametest/WritingDataGameTests.java +++ b/src/main/java/net/dnorberg/rivencraft/gametest/WritingDataGameTests.java @@ -5,13 +5,18 @@ import io.netty.buffer.Unpooled; import java.util.List; import net.dnorberg.rivencraft.Rivencraft; import net.dnorberg.rivencraft.writing.OrderedWriting; +import net.dnorberg.rivencraft.writing.PageContent; import net.dnorberg.rivencraft.writing.SymbolCatalog; import net.dnorberg.rivencraft.writing.SymbolReference; import net.dnorberg.rivencraft.writing.WritingEntry; +import net.dnorberg.rivencraft.item.PageItem; +import net.dnorberg.rivencraft.registry.ModDataComponents; import net.minecraft.gametest.framework.GameTest; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.gametest.GameTestHolder; import net.neoforged.neoforge.gametest.PrefixGameTestTemplate; @@ -63,6 +68,56 @@ public final class WritingDataGameTests { helper.succeed(); } + @GameTest(template = "empty") + public static void pageStatesPersistAndNetworkRoundTrip(GameTestHelper helper) { + SymbolReference known = reference("rivencraft:terrain/standard"); + SymbolReference removed = reference("example:removed_symbol"); + List states = List.of( + PageContent.BLANK, + PageContent.symbol(known), + PageContent.unresolved(removed), + PageContent.LINK_PANEL + ); + + for (PageContent state : states) { + var json = PageContent.CODEC.encodeStart(JsonOps.INSTANCE, state).result().orElseThrow(); + PageContent persistentCopy = PageContent.CODEC.parse(JsonOps.INSTANCE, json).result().orElseThrow(); + helper.assertValueEqual(persistentCopy, state, "Page content must persist exactly"); + + FriendlyByteBuf buffer = new FriendlyByteBuf(Unpooled.buffer()); + PageContent.STREAM_CODEC.encode(buffer, state); + helper.assertValueEqual(PageContent.STREAM_CODEC.decode(buffer), state, + "Page content must network-sync exactly"); + } + helper.succeed(); + } + + @GameTest(template = "empty") + public static void pageItemPreservesContentAndRejectsForgedUnknownSymbols(GameTestHelper helper) { + SymbolReference known = reference("rivencraft:terrain/standard"); + SymbolReference unknown = reference("example:forged_symbol"); + ItemStack page = PageItem.createSymbolPage(known); + CompoundTag serialized = (CompoundTag) page.saveOptional(helper.getLevel().registryAccess()); + ItemStack restored = ItemStack.parseOptional(helper.getLevel().registryAccess(), serialized); + helper.assertValueEqual(restored.get(ModDataComponents.PAGE_CONTENT.get()), PageContent.symbol(known), + "Symbol page content must survive an ItemStack save/load"); + helper.assertValueEqual( + restored.get(ModDataComponents.PAGE_SYMBOL_DISPLAY.get()), + SymbolCatalog.display(known), + "Server-selected display metadata must survive for remote clients" + ); + + ItemStack recovered = PageItem.createRecoveredPage(unknown); + helper.assertFalse(PageItem.isUsableWriting(recovered), + "An unresolved page must remain recoverable without becoming valid writing"); + try { + PageItem.createSymbolPage(unknown); + helper.fail("The server must reject new pages for unknown symbols"); + } catch (IllegalArgumentException expected) { + helper.succeed(); + } + } + private static SymbolReference reference(String id) { return new SymbolReference(ResourceLocation.parse(id)); } diff --git a/src/main/java/net/dnorberg/rivencraft/item/PageItem.java b/src/main/java/net/dnorberg/rivencraft/item/PageItem.java new file mode 100644 index 0000000..7ff7fa3 --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/item/PageItem.java @@ -0,0 +1,131 @@ +package net.dnorberg.rivencraft.item; + +import java.util.List; +import net.dnorberg.rivencraft.registry.ModDataComponents; +import net.dnorberg.rivencraft.registry.ModItems; +import net.dnorberg.rivencraft.writing.PageContent; +import net.dnorberg.rivencraft.writing.SymbolCatalog; +import net.dnorberg.rivencraft.writing.SymbolDisplayMetadata; +import net.dnorberg.rivencraft.writing.SymbolReference; +import net.minecraft.ChatFormatting; +import net.minecraft.core.component.DataComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.component.CustomModelData; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; + +/** One stackable Page item whose server-owned component identifies its writing state. */ +public final class PageItem extends Item { + public PageItem(Properties properties) { + super(properties); + } + + public static ItemStack createSymbolPage(SymbolReference reference) { + if (!SymbolCatalog.isKnown(reference)) { + throw new IllegalArgumentException("Cannot create a page for unknown symbol " + reference.id()); + } + return create(PageContent.symbol(reference)); + } + + public static ItemStack createLinkPanelPage() { + return create(PageContent.LINK_PANEL); + } + + /** Restores saved unknown references without granting them validity for new writing operations. */ + public static ItemStack createRecoveredPage(SymbolReference reference) { + return create(PageContent.unresolved(reference)); + } + + public static PageContent content(ItemStack stack) { + PageContent content = stack.get(ModDataComponents.PAGE_CONTENT.get()); + return content == null ? PageContent.BLANK : content; + } + + /** Server-side gate for Desk and Binder inputs; unresolved pages remain removable but not usable. */ + public static boolean isUsableWriting(ItemStack stack) { + if (!stack.is(ModItems.PAGE.get())) { + return false; + } + PageContent resolved = content(stack).resolve(); + return resolved.kind() == PageContent.Kind.BLANK + || resolved.kind() == PageContent.Kind.LINK_PANEL + || resolved.isResolvedSymbol(); + } + + @Override + public Component getName(ItemStack stack) { + PageContent content = content(stack); + return switch (content.kind()) { + case BLANK -> Component.translatable("item.rivencraft.page.blank"); + case LINK_PANEL -> Component.translatable("item.rivencraft.page.link_panel"); + case UNRESOLVED_SYMBOL -> Component.translatable("item.rivencraft.page.unresolved"); + case SYMBOL -> symbolName(stack, content.symbol().orElseThrow()); + }; + } + + @Override + public void appendHoverText(ItemStack stack, TooltipContext context, + List tooltipComponents, TooltipFlag tooltipFlag) { + PageContent content = content(stack); + if (content.kind() == PageContent.Kind.BLANK) { + tooltipComponents.add(Component.translatable("item.rivencraft.page.blank.description") + .withStyle(ChatFormatting.GRAY)); + return; + } + if (content.kind() == PageContent.Kind.LINK_PANEL) { + tooltipComponents.add(Component.translatable("item.rivencraft.page.link_panel.description") + .withStyle(ChatFormatting.GRAY)); + return; + } + SymbolReference reference = content.symbol().orElseThrow(); + SymbolDisplayMetadata metadata = content.kind() == PageContent.Kind.SYMBOL + ? stack.getOrDefault(ModDataComponents.PAGE_SYMBOL_DISPLAY.get(), SymbolCatalog.display(reference)) + : SymbolDisplayMetadata.unresolved(reference); + if (metadata.resolved()) { + tooltipComponents.add(Component.translatable(metadata.descriptionTranslationKey()) + .withStyle(ChatFormatting.GRAY)); + } else { + tooltipComponents.add(Component.translatable( + "symbol.rivencraft.unresolved.description", reference.unresolvedName()) + .withStyle(ChatFormatting.RED)); + } + tooltipComponents.add(Component.literal(reference.id().toString()).withStyle(ChatFormatting.DARK_GRAY)); + } + + private static ItemStack create(PageContent content) { + ItemStack stack = new ItemStack(ModItems.PAGE.get()); + stack.set(ModDataComponents.PAGE_CONTENT.get(), content); + stack.set(DataComponents.CUSTOM_MODEL_DATA, new CustomModelData(modelIndex(content))); + if (content.kind() == PageContent.Kind.SYMBOL) { + stack.set(ModDataComponents.PAGE_SYMBOL_DISPLAY.get(), + SymbolCatalog.display(content.symbol().orElseThrow())); + } + return stack; + } + + private static Component symbolName(ItemStack stack, SymbolReference reference) { + SymbolDisplayMetadata metadata = stack.getOrDefault( + ModDataComponents.PAGE_SYMBOL_DISPLAY.get(), SymbolCatalog.display(reference)); + return metadata.resolved() + ? Component.translatable(metadata.nameTranslationKey()) + : Component.translatable("item.rivencraft.page.unresolved"); + } + + private static int modelIndex(PageContent content) { + return switch (content.kind()) { + case BLANK -> 0; + case LINK_PANEL -> 1; + case UNRESOLVED_SYMBOL -> 2; + case SYMBOL -> switch (content.symbol().orElseThrow().id().toString()) { + case "rivencraft:terrain/standard" -> 100; + case "rivencraft:biome/native" -> 101; + case "rivencraft:lighting/normal" -> 102; + case "rivencraft:weather/normal" -> 103; + case "rivencraft:celestial/normal_time" -> 104; + case "rivencraft:feature/caves" -> 105; + default -> 3; + }; + }; + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java b/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java index 91d4902..c418f47 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java @@ -19,6 +19,7 @@ public final class ModCreativeTabs { .displayItems((parameters, output) -> { output.accept(ModItems.DESCRIPTIVE_BOOK.get()); output.accept(ModItems.LINKING_BOOK.get()); + output.accept(ModItems.PAGE.get()); }) .build()); diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModDataComponents.java b/src/main/java/net/dnorberg/rivencraft/registry/ModDataComponents.java index 6415a23..a356657 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModDataComponents.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModDataComponents.java @@ -3,6 +3,8 @@ package net.dnorberg.rivencraft.registry; import net.dnorberg.rivencraft.Rivencraft; import net.dnorberg.rivencraft.book.LinkTarget; import net.dnorberg.rivencraft.book.AgeReference; +import net.dnorberg.rivencraft.writing.PageContent; +import net.dnorberg.rivencraft.writing.SymbolDisplayMetadata; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; @@ -39,6 +41,18 @@ public final class ModDataComponents { .networkSynchronized(ByteBufCodecs.STRING_UTF8) .cacheEncoding() .build()); + public static final DeferredHolder, DataComponentType> PAGE_CONTENT = + DATA_COMPONENTS.register("page_content", () -> DataComponentType.builder() + .persistent(PageContent.CODEC) + .networkSynchronized(PageContent.STREAM_CODEC) + .cacheEncoding() + .build()); + public static final DeferredHolder, DataComponentType> PAGE_SYMBOL_DISPLAY = + DATA_COMPONENTS.register("page_symbol_display", () -> DataComponentType.builder() + .persistent(SymbolDisplayMetadata.CODEC) + .networkSynchronized(SymbolDisplayMetadata.STREAM_CODEC) + .cacheEncoding() + .build()); private ModDataComponents() { } diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModItems.java b/src/main/java/net/dnorberg/rivencraft/registry/ModItems.java index 7eeb238..60c0cf4 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModItems.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModItems.java @@ -3,6 +3,7 @@ package net.dnorberg.rivencraft.registry; import net.dnorberg.rivencraft.Rivencraft; import net.dnorberg.rivencraft.item.DescriptiveBookItem; import net.dnorberg.rivencraft.item.LinkingBookItem; +import net.dnorberg.rivencraft.item.PageItem; import net.minecraft.world.item.Item; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredItem; @@ -21,6 +22,11 @@ public final class ModItems { LinkingBookItem::new, new Item.Properties().stacksTo(1) ); + public static final DeferredItem PAGE = ITEMS.registerItem( + "page", + PageItem::new, + new Item.Properties().stacksTo(64) + ); private ModItems() { } diff --git a/src/main/java/net/dnorberg/rivencraft/writing/PageContent.java b/src/main/java/net/dnorberg/rivencraft/writing/PageContent.java new file mode 100644 index 0000000..fac5637 --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/writing/PageContent.java @@ -0,0 +1,95 @@ +package net.dnorberg.rivencraft.writing; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import io.netty.buffer.ByteBuf; +import java.util.Locale; +import java.util.Objects; +import java.util.Optional; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; + +/** Persistent contents of a Page item. Unknown symbols remain explicit and recoverable. */ +public record PageContent(Kind kind, Optional symbol) { + public static final PageContent BLANK = new PageContent(Kind.BLANK, Optional.empty()); + public static final PageContent LINK_PANEL = new PageContent(Kind.LINK_PANEL, Optional.empty()); + private static final Codec KIND_CODEC = Codec.STRING.comapFlatMap( + value -> { + try { + return DataResult.success(Kind.valueOf(value.toUpperCase(Locale.ROOT))); + } catch (IllegalArgumentException exception) { + return DataResult.error(() -> "Unknown page content kind: " + value); + } + }, + value -> value.name().toLowerCase(Locale.ROOT) + ); + private static final Codec RECORD_CODEC = RecordCodecBuilder.create(instance -> instance.group( + KIND_CODEC.fieldOf("kind").forGetter(PageContent::kind), + SymbolReference.CODEC.optionalFieldOf("symbol").forGetter(PageContent::symbol) + ).apply(instance, PageContent::new)); + public static final Codec CODEC = RECORD_CODEC.flatXmap(PageContent::validate, PageContent::validate); + public static final StreamCodec STREAM_CODEC = StreamCodec.of( + PageContent::encode, PageContent::decode); + + public PageContent { + Objects.requireNonNull(kind, "kind"); + symbol = Objects.requireNonNull(symbol, "symbol"); + boolean needsSymbol = kind == Kind.SYMBOL || kind == Kind.UNRESOLVED_SYMBOL; + if (needsSymbol != symbol.isPresent()) { + throw new IllegalArgumentException("Page contents do not match kind " + kind); + } + } + + public static PageContent symbol(SymbolReference symbol) { + return new PageContent(Kind.SYMBOL, Optional.of(symbol)); + } + + public static PageContent unresolved(SymbolReference symbol) { + return new PageContent(Kind.UNRESOLVED_SYMBOL, Optional.of(symbol)); + } + + /** Re-resolves persisted data against the authoritative current server catalog. */ + public PageContent resolve() { + if (kind != Kind.SYMBOL && kind != Kind.UNRESOLVED_SYMBOL) { + return this; + } + SymbolReference reference = symbol.orElseThrow(); + return SymbolCatalog.isKnown(reference) ? symbol(reference) : unresolved(reference); + } + + public boolean isResolvedSymbol() { + return kind == Kind.SYMBOL; + } + + private static DataResult validate(PageContent content) { + boolean needsSymbol = content.kind == Kind.SYMBOL || content.kind == Kind.UNRESOLVED_SYMBOL; + return needsSymbol == content.symbol.isPresent() + ? DataResult.success(content) + : DataResult.error(() -> "Page contents do not match kind " + content.kind); + } + + private static void encode(ByteBuf buffer, PageContent content) { + ByteBufCodecs.VAR_INT.encode(buffer, content.kind.ordinal()); + content.symbol.ifPresent(reference -> SymbolReference.STREAM_CODEC.encode(buffer, reference)); + } + + private static PageContent decode(ByteBuf buffer) { + int ordinal = ByteBufCodecs.VAR_INT.decode(buffer); + if (ordinal < 0 || ordinal >= Kind.values().length) { + throw new IllegalArgumentException("Unknown page content kind ordinal " + ordinal); + } + Kind kind = Kind.values()[ordinal]; + Optional symbol = kind == Kind.SYMBOL || kind == Kind.UNRESOLVED_SYMBOL + ? Optional.of(SymbolReference.STREAM_CODEC.decode(buffer)) + : Optional.empty(); + return new PageContent(kind, symbol); + } + + public enum Kind { + BLANK, + SYMBOL, + UNRESOLVED_SYMBOL, + LINK_PANEL + } +} diff --git a/src/main/resources/assets/rivencraft/lang/en_us.json b/src/main/resources/assets/rivencraft/lang/en_us.json index ba2e668..21a54a2 100644 --- a/src/main/resources/assets/rivencraft/lang/en_us.json +++ b/src/main/resources/assets/rivencraft/lang/en_us.json @@ -6,6 +6,12 @@ "item.rivencraft.linking_book.unbound": "Unbound — sneak-use to bind", "item.rivencraft.linking_book.destination": "%s (%s, %s, %s)", "item.rivencraft.linking_book.return": "Return Link", + "item.rivencraft.page": "Page", + "item.rivencraft.page.blank": "Blank Page", + "item.rivencraft.page.blank.description": "Ready for writing at a Writing Desk.", + "item.rivencraft.page.link_panel": "Link Panel Page", + "item.rivencraft.page.link_panel.description": "The baseline panel required to assemble a Descriptive Book.", + "item.rivencraft.page.unresolved": "Unresolved Symbol Page", "message.rivencraft.linking_book.bind_hint": "Sneak-use to bind this book to your current location", "message.rivencraft.linking_book.unbound": "This Linking Book is unbound", "message.rivencraft.linking_book.bound": "Linking Book bound as %s", diff --git a/src/main/resources/assets/rivencraft/models/item/page.json b/src/main/resources/assets/rivencraft/models/item/page.json new file mode 100644 index 0000000..6ebfeba --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/item/page.json @@ -0,0 +1,17 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "rivencraft:item/page" + }, + "overrides": [ + { "predicate": { "custom_model_data": 1 }, "model": "rivencraft:item/page_link_panel" }, + { "predicate": { "custom_model_data": 2 }, "model": "rivencraft:item/page_unresolved" }, + { "predicate": { "custom_model_data": 3 }, "model": "rivencraft:item/page_symbol" }, + { "predicate": { "custom_model_data": 100 }, "model": "rivencraft:item/page_symbol_terrain_standard" }, + { "predicate": { "custom_model_data": 101 }, "model": "rivencraft:item/page_symbol_biome_native" }, + { "predicate": { "custom_model_data": 102 }, "model": "rivencraft:item/page_symbol_lighting_normal" }, + { "predicate": { "custom_model_data": 103 }, "model": "rivencraft:item/page_symbol_weather_normal" }, + { "predicate": { "custom_model_data": 104 }, "model": "rivencraft:item/page_symbol_celestial_normal_time" }, + { "predicate": { "custom_model_data": 105 }, "model": "rivencraft:item/page_symbol_feature_caves" } + ] +} diff --git a/src/main/resources/assets/rivencraft/models/item/page_link_panel.json b/src/main/resources/assets/rivencraft/models/item/page_link_panel.json new file mode 100644 index 0000000..c0d519f --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/item/page_link_panel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "rivencraft:item/page_link_panel" + } +} diff --git a/src/main/resources/assets/rivencraft/models/item/page_symbol.json b/src/main/resources/assets/rivencraft/models/item/page_symbol.json new file mode 100644 index 0000000..86d5800 --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/item/page_symbol.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "rivencraft:item/page_symbol" + } +} diff --git a/src/main/resources/assets/rivencraft/models/item/page_symbol_biome_native.json b/src/main/resources/assets/rivencraft/models/item/page_symbol_biome_native.json new file mode 100644 index 0000000..251bac9 --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/item/page_symbol_biome_native.json @@ -0,0 +1,4 @@ +{ + "parent": "minecraft:item/generated", + "textures": { "layer0": "rivencraft:item/page_symbol_biome_native" } +} diff --git a/src/main/resources/assets/rivencraft/models/item/page_symbol_celestial_normal_time.json b/src/main/resources/assets/rivencraft/models/item/page_symbol_celestial_normal_time.json new file mode 100644 index 0000000..38bb083 --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/item/page_symbol_celestial_normal_time.json @@ -0,0 +1,4 @@ +{ + "parent": "minecraft:item/generated", + "textures": { "layer0": "rivencraft:item/page_symbol_celestial_normal_time" } +} diff --git a/src/main/resources/assets/rivencraft/models/item/page_symbol_feature_caves.json b/src/main/resources/assets/rivencraft/models/item/page_symbol_feature_caves.json new file mode 100644 index 0000000..621bce9 --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/item/page_symbol_feature_caves.json @@ -0,0 +1,4 @@ +{ + "parent": "minecraft:item/generated", + "textures": { "layer0": "rivencraft:item/page_symbol_feature_caves" } +} diff --git a/src/main/resources/assets/rivencraft/models/item/page_symbol_lighting_normal.json b/src/main/resources/assets/rivencraft/models/item/page_symbol_lighting_normal.json new file mode 100644 index 0000000..747cbfb --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/item/page_symbol_lighting_normal.json @@ -0,0 +1,4 @@ +{ + "parent": "minecraft:item/generated", + "textures": { "layer0": "rivencraft:item/page_symbol_lighting_normal" } +} diff --git a/src/main/resources/assets/rivencraft/models/item/page_symbol_terrain_standard.json b/src/main/resources/assets/rivencraft/models/item/page_symbol_terrain_standard.json new file mode 100644 index 0000000..562ebd7 --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/item/page_symbol_terrain_standard.json @@ -0,0 +1,4 @@ +{ + "parent": "minecraft:item/generated", + "textures": { "layer0": "rivencraft:item/page_symbol_terrain_standard" } +} diff --git a/src/main/resources/assets/rivencraft/models/item/page_symbol_weather_normal.json b/src/main/resources/assets/rivencraft/models/item/page_symbol_weather_normal.json new file mode 100644 index 0000000..07c4ed6 --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/item/page_symbol_weather_normal.json @@ -0,0 +1,4 @@ +{ + "parent": "minecraft:item/generated", + "textures": { "layer0": "rivencraft:item/page_symbol_weather_normal" } +} diff --git a/src/main/resources/assets/rivencraft/models/item/page_unresolved.json b/src/main/resources/assets/rivencraft/models/item/page_unresolved.json new file mode 100644 index 0000000..0270473 --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/item/page_unresolved.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "rivencraft:item/page_unresolved" + } +} diff --git a/src/main/resources/assets/rivencraft/textures/item/page.png b/src/main/resources/assets/rivencraft/textures/item/page.png new file mode 100644 index 0000000000000000000000000000000000000000..632f573246d0cd9b1c4b2fbab4666b626e617c26 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S`0VrE{6US4X6f{C7i zo^j8!=>b4BvpiiKLn7SYPJheUV8G*IyrFtW;{&6q(^y!ZR4(vgV*0|l<0!|n10oAJGt@Z5D?S%|E7-?rD*UIIzu_ax7rP)0 l;SL`6X-P~xZ?^lmnTu$sZZAYL$MSD+10A~3)w#1%--Y|lYP^SbkAcjlelHUTI&w>uxm1+p*h zntW~Fv_<_zmv&9Qx_9dFjoruAcb(kas~{sLz|Ui6t_?KDP)9l3&-SFT!37|Pvn0qb zm_g*V+S|Wx)&9n%8(#ql7I;J!GcfQS24TkI`72U@g6t)pzOL-AIK_puWj8Wb?ga{| zmbgZgq$HN4S|t~y0x1R~10yqC14~^a;}Am&D-#1NQ&VjN11kdqgX>QZplHa=PsvQH z#I3=xE4BuxK?80>NoHF&k=6qNr55uyuE7tQEO6*oYsbPo|buH_7?3|XjoLynQ?vFa(fN95d zJU1=gIae;>+r@YqG4I4CRb9LRvrf^2e;(o?CK#&xbtieRVe5E(ZTTu{)upx+ZV& z^%m(p3<2&&oh$+EL4Oq<$|XE$V_>|X*WmB;!zhJ;EddoZFdtZ-_W1P6zdvue#n&?` z)L(tbxa-PV-(9(}4SJQilM7np z8yF=T82_+N(B4v`%eX+{;j80c^%=M(uZwvk$uRZy?h~>;t;tyy1rx1j*i6_V^Y5gx zq=*A=_2d4U$k*$Ay9+Kqaz0*U`jJIYH=}M_=A^t?b6zAhT_~{SmU|$5j_0h@r1JMh Qz%;_(>FVdQ&MBb@08O-OC;$Ke literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rivencraft/textures/item/page_symbol.png b/src/main/resources/assets/rivencraft/textures/item/page_symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..3fdbcef3488d31fe2cef0107c49b6db093d53da6 GIT binary patch literal 1348 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 AY5)KL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rivencraft/textures/item/page_symbol_celestial_normal_time.png b/src/main/resources/assets/rivencraft/textures/item/page_symbol_celestial_normal_time.png new file mode 100644 index 0000000000000000000000000000000000000000..eb763e9d187eeafc22b894ceb852f7cc78921556 GIT binary patch literal 11991 zcmZ{qWl$Vlw6!NV1cJM}dvFWxZo%E%U4y&31PCtbR_)hApx>fhb zEkdT4p_%TUbM{{ASvy)qNg4%-00{ztpvcNdsDa1ef8Pjj;Qu~hlQHl>W+tPi2!Z(0 zfak*?kjHNZ}Kf0TnxLfd>xmth+2nQPnH!~X_ zGY6*zJ1_rxF8=o%jBITDY;2p?XleiJ00$>?8%v-6`+(ZoayoDT-T%CUyN!c|o4bjF z^Z$L!Lr3%-I0o8%K8*M+Bpsa+bhWE-@ zmzT4?cEaKh-e#rxiXNW^;Hp!59nkvP*gII;_p$&u;g2N z9e4R&zuOM{4+NlEd#7H`;n_c+p!H!$@G|{!_j7I+jN=zVUXeZ`b=|`A_;n4B027K3 z8Z4(#tQsqki}I0~hRKrBH=p2>(kH1JF*F)hK7`$%SCMD$i!nA4NKE+mkf%3=A|Ez` zKef~b=B)Ty|0Xe>78YZ}k}6XznJ-tN+ojv(ph6@f$9?$#$sCGYJdv)!k&TL{;hK?? zk`tuoX3U_YbZxUQisb%%uZI7Dj%j9PW^AvLCTG?6=)AQgX-r18DWx!7p?V-pv`(^0 zwMb()Ig#)K9o8Tz!q)9Q9=_YG0Goo>CK`37?Kkh{klipmR}Ksvoum-065T_SNk*)l zv85U`6a{v_aIu7*Z80)D(`n(+inp5jHI9Slc;aQ6>S={afu0=EE;Cti{Bgd_a;4iD zcdW7)hDO2YWrRafski5EDhXF?Y|o0?x-#Eld#v>SnyG_!g7k4J9a7{Kj$FR!HMTzf zi?Q722#at0-Nl(Pv$RBI7}u9+hcX3^#Kom}7s)BeJz_uM`^cLF{&oEd$Nws8Q9c=p zTiQYqYV9?6T5y9q!C&(@m5C_NE0zDgR?SE0eYNt~Mc+9#{Mi6-*U+SgCaeR(*^b-MaJrg{zrsuyi9J>K89 zAusiy79A;ERzAVP!-QL^E8>?bZpa6;x~atVUun7mk3Wi>?^QqFmzd$ceoV?Q=00wY zbq%!q@n_y<->X{Gg9kk!{m-~4N0>WxH$Tx)iGYVczxUmiz+~m>Q@T2<&vSw`N_1iW=H%WVT zZa8=G-2QH(O27VoAs_NI-W<+4sS|nVRH(N)VPH~?2ro$K2)$_RehP8lL3M16WR9R_ zVUkVDSiG9*evFF9a71cQzdvyz{Y)l+|H<$Z*_to>EqrK`=k4_`t5SdOKTySLA&UpJ zEB0F_Q|HD{5qse6lSe2Vr;z3UTR*yWeA%+D__#V(zsY|5=+&!2C(KG24c)PjoSQ9k zc@-zw0SgmKK3d0(k<|kG{6OmE-GeE=Cidg#%K62W*}>qi{m1mN*PBIFlh{}(nvTX3 zY6ficvSshH2ZKLgNr-9)V zPqARSf0KEegy+Buj)exhYovmW?hx><33*Iq70tM^DUJ_! zJiZTd;Y0)8Y!&5X`Mbxn(}WrO(33n91xv=lmo3>=?heY)a{O@Xmi9rZcZ)H=*){KD}?b{mR4> z-dRlr^MNH(H7i%nQdjU`%+^_#ya$vt0S-pV4fyWcJ2lelc$+@ScPuo5jnVGxO^_ikMr zilIIvc$Xu8ZnQ#cmXlQrwHTf9(B-PfaidxjVDrz^PP9i4_pv!$`kL2J6|Y}qLyh%L zWSV`$WC|79lfvdq)Y#djK>Hk1DxU<)l@G4Va&!t-wCA%rW#$N;oA3FNK(PY9rz1;o zQ*nZ_az>+%;!9d*-{1Z}J@d#Tr0`#pqtGGpyjcD`Sr-@K*{1oSJ^o)VVML969Fbu8 z=r#16ik*5yrEH%+;gbd#zHtm;GcF`+>Je{&J@l{*En-u;n{aBI-6O|BGMlzJ-yT&* z$8<3FQ9>$G$%;9dcq??ex?QCE#@+?T{{t2JOmy%iBMLbxdc<#m;G_Ko8^3oKm4pF$cuI}}3rThJXZY$)u3(v$JL=C3t`D}w z>4!d}$9v{frgL_ntoQESD)D)&v5qHoWEG5aKp#Zg!~Q$VFEj%w1w_&w0RlG@2FbEW z;T4s3B^5Q9igs73(W5>OwOQo|y>ok)GpkPBcW);#W_Pe=wMg*MGqlJ14~jS-@wx*A zH3OikxPfg?QkN+Dgg`r`O%a2%fO{}$M?p)@jTA&S92@|;U!c68hF-85xz+UwR6;@f zc%(GzR|=8%{T5*s1Bb1Ou9J}wnLKsNOC_)@F_FTZ*TkKV4B6fmZvEnb1kX`18U@{= zzg*&yUfjLN&Hm;A*Sxy%0+ED;6hguNbVitQeOi)x zc+^^gk=}Xx!||#yC3`57G|CzGM~Va)n*O)TjSX7wdo2j0MrvU8iF?b{Pgb_6!9?@C zQ^Y@5g*Ofo8!F?*sK6e4?K;!v5&*<0-ymuU)7j>TQmIr z@T>%6lht$A2ePQuld|TL#H&#$20Oi@<7Va2h43H0Mve_c(UL}BKqV{|3z_*$&cm6# zZE?gjr8t0LAwkVxrAZLPxR(Cr{_mSdIBB{%``yM_Y>kB$a)jjPR?#}@5ghSOE&};9 zk{YS-a*Zw2ut9v@l7Cf=fMmy26Vr;tP&#SkV?pkZjhX>;v#(Oj6(xtmS-C-ezun|m z7aM|x7z#jV`|s(_`!CQ$YOWO#m{xT^f6hdzkxSR9o6XtDM#T=|;3}r6MoN{4v84XG zgLiHZKwgqQJR`NV_Ks68P4~Zgpq^u(KGE9$>ZQjHyF3B}uGh`g_y`0jtE$Dx18Qx) zz+0rnlhx?Nc+(QdF9G!VAtaSL>kBPaZvY5y$v@--4}2y8U=Y^Q$^(^H8IOr^}z>EnkpL0 zJjr1Z?dIq2?|w?r?fZlW`u!>Ls(~h_QI*Y}boWcte+wi?u4?C_NqLT}ulKR2KEG2j z?CWQqZ%&kx3e(@)G#M5aiVuzbI~TqyNxpzj@60*yr9R=5h{jIg8jtTuru0}(uVo}L zAVBfg z@HcHv2#kTGeBNpvTJARE%C11Pp4&EXJAx7YP^FrjhSnGJ{66L_r;DF|n%11lrJRt7 zECnZ*aPekNnT)yjf6Vz7Z7DqNeX?bfI|rD~fkshLogY^Y^vW7bSA5^(&Ux&f zY8oq9r#%(Z2}Cgd*Tf6u?)zZzAy(jwI$wU0cskLG6(xaMe01J;U1Ai_uSZ%?)Leqv zrXL|iS&Wf>|11jD0r*SmIbUoOgdaYpSlgccG75Byx)TwSR!B=G4Lm?J4Df^pet{v~ z)v(LkMgPSjz=h>##AS}#)3tb)AOM>33-ypGheQ}jLAvShNDD;Ek8@_m5t-;dT!f!1GgG(+j1@MgJvdh6E7jelO1<%{iBdHb z12}yd&9HbVx-15EyFhIT8j2i^B-dD&5^>`9V5PH_icKCDSIffx*Itw#^e{m_TKoR1 ziwDW(>ti60^yecdd2ekA`0tlcwLUo&uh1}_wozr+0~ZW-y<;M( zYziAe)9I?=c-54kn3nC2-M5#MLss{Zg+alqI~K1A^I(5Mf1%N}60+)}RN4^G|H1ll zk1rRV_j>j;b#VCqWN$D%3+D?ap;^HVmpMns5+3IAQS{te@&>C_7_(pKz>1R5 ztPC6ZJCJgr? zqucGv$IAz3n4xPd%y2@aaH8~bi7ND&llO=3D+LB&P7~NSykDsjRB>|`chxnLgzMVk zPTdKsGOSd9@C}f^Gf0-7XP{0LZpazTaC{eFD0Q@_>*-{`*OtOe4~-TkBRUlG>|Q(H z#3s1iS^8!TAzVLUq`bo{%9kaHD!PxBMO9}p0$hTnB+f#42P*v(Otaj`e)B_~pth`@ zl?b8s-iBs+@^bl3DQ&B3O-uSuMh~prFG+Z$=%c!>6+EAWG2WaI5}BCKdFWY8Jw<;P zg)hvn?IA@dUbK}_h!V}CbqGPE!*b}duGBeC#7 zqovD@(-8l1&Pry#3&rngljm~xM8&XUkN3js5Se2I+WGS=+p+tmTk=uugd}J#1UVhF z)Gir$Z-&jGcYAOzO;KeBH3k47rr?3I(_;0~54G9);q1?xXqgfXl z?5{_7;A?M2E4o}_z~R841|zyr3LQE8h}3;tiSz>v=2w9{ z{W_lC{*13P2ye!gWnNihmMBuY#ea9ztSfqZt_mZ|AEY;`#gz~xaIrC}n#Evt00 z!2vi7%&i$9YycY1moInz7c4?7G?aca0etF|9$R@sZ9Hh#vJC?lJ|kR#f2tA>kDDnG zKI6S67}IUz4Gv^2f8$S-=EhFRckC-K3Cso;ykA20Kov@`h#At@{bhd&%HNrEmc zR)R4i*IMr>iK7*ZpD!gzM`Ss7^dEp9z?6vu?5JD8=}G0FX9>lm$Eia1w3M^=vabccwU#r1gQxBL`SQ2X1@uchcD>z2XY>qLrO-!HaA}L z_FD`MgM6ma`X|;u7nSC2b_O7eqIvrt|lvaRJhuHW3YyVD6&r}4tDl@wHk?wm|w1fNN>fQgKtrffcHE75-1+&`yZY8=o zD`~`WN=20c`^!?b|G}OR(BeV&TUf8pW2l$j&-MmJY$si-U|*H~7hc%q5(Wf5&_BD) zxSq_`tR&GLj(IWz?fzhE7nN|7gI5l3mmsc%@`#I7>T{?kt`X zD!5a1-A%a$dRi<<71+S|>0-I~{S6x=-UkVTu&^h3ywt#^|D8=WJIy;{)}5`ggNLEQ zpbw&+9Lq%(q|4m6z9F9o6c9HLuC z0VhXCt=Id7-?t8NGanY-c0drqC={tRilerzg6=-aI#qfZf4tocdVHZ|Npwn7suF%a zOqj==W7ylR-*V*oB%#_16cpGA%Uz{WpmDoA_;TXbfx=5aRL6*h6iI8h3pne`ww>Q{ zn+>dutjo0_mQSlnv|O=*FEB2bkI+$uB4zSbItQ7}fC1pZvGO^>0yt3LSIEG5jRGfA1N zMJ5{dvVSS*&-dAK8+BYNKPefb?)bdb&dA^YBxIhk!4sERo@XM`GKmZUgfPn;4%n*; ztc6T&wkM}U?8h`r;WIWGK-H(_Cd;^rA@k?^&de{`%~4!xad!Rf^A;5D1n147k(^^~ zF%pXG5 ziUU?-A4t1jvSPK5M`V@F$M<^oE=`-WRM2MP;VFiq6ADDtFlxTg=x{+<@9S~Ouw)j^ zR)VbR3-y5TH(DO$X`4CF8_TO5%)IBq7Z1u>Dq=I=*^>)<9?vMF!GLn#EJwvXI3BUR z1|QfhR~ow4RzbB|4eW+VY$KaBsU(tozwWqtK=7L<1R(A0nrt@G8@rjNkLG~O-?_cF zc0B1lc}oGouejtvXTg0-Q|`hQPaK!fc6i>3No>($Kc~nA>FA4ABd4X|SMz#FSK68Y zM+b~;)q_upZK%!vF z@BJebHYC?~Coo)ul7%}a9rh?J)I@iMl6VL=CWo6)1|zIghN!HiK9#pByQzOk26idF zyIiws5b@pJg3$HYyKJ(r76xy$Vv|8GxVAG?Ie?VN;~Hcl`-A6 zo}H$60xoCO@92=^t{M}t_}HatN;ZYD<@n1fY`XPNiT(#E|!IXGD_U zKim;=5mTsC7v~0|Iki<7c00X|-@43tBdL$}VY}k<>B#a*<@u}XhAWj&uyXpS_Wz<( zpf=HZ@Q_VG*xbtAR6hQuR5fTnr#`zha?{Q&p(<-)cw9U!a7yTWVHEWIZsIIJu*->( zRirt6hJEVn<_(A1c2sP9aeZ^-)RYlGj{pj*vTpHt%^mGG&T8YiwM94PSXC!pd;k4| z!f*YX;B$Rx?s3FB0$o2Kwm3QV2hT2nPSWr~GtOZ&5B*@;2^%gp3F7?P#nzI=N?GOT zLiWE;pQi=b#)BR%1psL8dED0j{&XyivBUJ|56Y$}=?64GBKGyBe(!caj|n`#{GC!A z-s^mxTYyDGMNQ;==z}lwJ}Kb@4etvXBmQ3$<_!Z9(#1+WfSkW{Hbg(}*V5 ztJ!PCApKna%AYtt#`#;8(3u~wYk;BR%=$-IHy`5?mD5z4m_DuPm4^!>D6rKx{IvIf zJ$VAwJcj~>Gb9^ZY?s6S66X&;m!`+rzvzr812lsP*@|sL6R)_-TrZ`I+aar{#+-+J zw~k@Cr$!oOt0}T>zdM+20ImOt!U_$AN~`k?-SOM_@M@i8Nsu%sWk$N~ap{+rmo!=- zd=eG6k9#Pna-bo@gmLA-oUxq;JROAX`<=M4ldw|xaM=o5;X^!)ju!8naT!d6gMxpK zH9z0CMuKM0=&{c6{q;C7#h$&fm~WjKDuis}tm}C@vCyTqGh;1I;@^wFgiC33h>_Q7 zwO-8fBsh1~#)E*iV5OrVeT?I)1pds)T&f3RuQ5XF&=8>Q`?rQK?z@7e*d8Cp;r_+A zPoz5WqC7#cG?-#jv(dS4Lx3acQsS&&;-F2Yi^}sz#jFOTgkA8s_zM$-b-7k_mLmUq z+xbqK4`M}Z1_9zk{Dy;xfq&WKYt~QKnnJrD&S!zMmX^TlGm#rRx&JL9B%}QsZAz#m zI_UMU6=0#5RRdvC#OQeiO9!+BJUPg^YWB%2MVAY7z=Q(0$7i1Xw@#d9DtOXeY zvw!nD)R59gC_=^Uw9HFXW9Q~tuSZ5)3H1CBn0;#=3y7+s8urmZ@^*F7n&5IV z%m>V(k)Nx;W`G50J^Q|ho(q|bj|C>En*L`MXZ|PQ23g4MI*7CqVc3!&6$2JU-Edh# zGk_43$-KD!r}j!_IFNKGe5k?D$w(CgLk%FXjK#hIgtzE>Y2^116RMu_#mVSi&iy~m z&F$%l2?kqTeboNWU((2j@DhLPkF^@DO`O+A@~{VEyYc}nuf-y71z=&*aT{kC04ZGT zIPy&)|2TBZZ4y9J%q+g5mGPulmK?!+`RV{(-3+wtTGCw2ZQKw&6ob}V>(<;3Tk=Ar zN+Yy<#Qig6N9L;(I&rCVl~$3;C?X7n-{saf3~f7U5wJp*r1RqV*2^_1{93Txj1LGJ zemZ0!ujmOQH>&bjX`UW|jK|YSXC!NO?Dg*YQ|IeQn+sptL%NU7Y1Xx@CFj^w^Way_W& zgC0*Di`Z-%ICa$esa)e?_&+fggPMcg2Rp$QHx#`E941}Up}#!_(hM}WvuP5H^wC;| zzOICT$u>3J&CEJk8C$1;)mO&~W`6*0ql`gPfFst5jrOj}21^>ue83ub*33x#|FpV* zbyB;bh0aga`vMi|nxHZ!ngfG#N>1mFFqAAQ--MErD`8Ai@&0c}AMCxvQ&()<>R=^I_ z_&rojw%A~TNmae$JS-ZX=v(-k@vyp-9g&DeH4uq=Xi75{K(j1opGQW7 z5!Sxd!Bb+fz_ZygENa6+;^Nv537tP{49iA!`B@~w$K&7nOVcqqz??RA4Q5V4fQIQS zVG-Pj%K9Rwp|H>Bn9gc_c3Rfl7$gW)LCLEWPwLhNxbyIyYZC#sWr?FIcGcw9gUB~e z$T_I3{oD8xLOs7xe=e;kE;maN=yib1t?%RpGlNRQlnOHo4R-<rDa%{1leTHjy>0X*upi>5%u;L`;U|`tr7|@`i!zWho~l0heUWRhZC8*P) zuTAVk@1}g;er$kadoMURG{kx}*qaKtbi+@KC4dA#!k2_bh^=!DoAd+2j0F`?yS%oK zfbB>Tl_-IcqN}x?Tt1(3f`6WhK~>h)lu2&^`>T(lu#Iee`4FM097dQJ`AYjEJ$=MJc<1 z2CEUtV}U39JX?Y988?ZzgcTApl2(1j&b{dAHkE62}ZkMphv6-4c@bE=Q7`JX5Fmyt6w-)#vv(zXs|5) zCZPyNwmlL)OvV-tB)NS3Fe|oIgntaaFr8!n&p-AF)HRrG0EA8=!A?vga!gsKKEw|Z9Cn=^F}l7 zW0{!5Uh8SHR7uk(;28eALoU&ZwI1BOKOkA{NA13*0#!eupf@UKao_}`uy4?HutAUV z75nMXFY9*)0X;cx*ITP@c=xD_aCl74kOL+q+dqu@0Qw&-o!sYoz%r**U!6m*fU`aS zuWVBZj7ol`DpIW)p8Q(xXNOK7UGMMRgavY~g!u5(rpBoDeUcW3k4l;jgw2Zifaw6O z!G4JPS!I;{xcPKlOTp0+W2_-{M5&eeK1GDp?b|eua~&E?6!*z;6MrEWV*|dMud|;& zOelH)ben#H6m{`p#Sw7(wB17el|K|R4oa0SZ_{IBs@8yjS8B!0T#cL}CBs6Je!PuS zUqa@e$fSV0521E~@Q4xNDt=EdwpJ9UEppCU8;?>rQ%D*y$GcgHl%hTxGaGIE;HNEO zn=TXMaLc^jeG0~qdf1OaCTjLxkjUxI{z3(ea}p)wC3j2s-FIylN^HfH4*hHT@0PJzID1fMY(%!8sARaR&=rPU3QM%wl}iRnXw^ zoL-q}oo;QUV=LqB$@f0M41mL}>aP|pGx?VVpLb31>1iq2s-1>%73wl&%_2Ed!aKC2 z)5anemzytUr1$GgJRix>gZ)V9ei4a>nvP0_hVJEW`6>k$A$32$I%I9r-C6^}>7vpS zrxAjm#3*FmWh)Jr2^5&e+p$95|5J?>Z1W@TXvK0VDozNxUls+f!D%#g69{y6P=@|x z$FI*Nt>xwRrtC{SoeOYEo7ZKF8H$_NnQ}oPz@7kD01u)WFj?{PVzhaXJ9YM@oGd^K zU$|~j8Kkq_K2La7tn*)sc;Opmhs2~afB(mQ(GvGrD~>8f#<1B z@3=o{_u(W9aZ`4WR{Y;JmV4SL=*c6xpZCqo{~NsiHS-pPqi>b+>nIq7-st6lND@6= zE?NZ5+`C^E$TSq@^``j7knc~U!tYKE<@MuyiXvSXfti`jj1us<;bf+lM}fb{eAer= zoRO%J|KpC#n}9Y%O4zhVM~Jw1fQoBh`!@~4ar}c68O;8IXro_80nF*n0mqr(7ja+# z@2JP6+_mn9 zyIeSnnRVtI&UxRxpZ$BD2sIUXbW{>l2n2!-eJi5@UOzwoAR~hRyTnX}zze0>TMcCh z#G4+x9}I!qJ%7Fnfw*x%Ab*V^5TP^(gwQdwQC$RlfM}{HF9Ugc{+HWQlmy;EaeS-m z0)b$3J^#Sui)2||K|WZ2XiY+umAr5R++Gie zOuy0Pe*p+bU1I@f_8e+25vpYpXd^holCoQ=zW-fdtgy-}@PQN!iJp?H;~{hGzKx8c z6sE}zPIFX(^WJox%Nn_aCqBNvDSC)geCnsTe91~HmLp^Hk$uK~+PS(aK|Lc&&4rS9 zV0^d68V^-aEGM{Y&(z#CIy99{q4dAE(dZwiBJrHLa5;B*;_mnelKZA1w9x#T#s~*C zf{E!lRV8zdg`9qRG5ToZqz(s&v!EEXbI+AiL`cqKg>vfh5br(D$?d?4`KG(MT0xj` z(y98&Xdo2@MemU;7NyGFXM@m_;)*-C*(^2{BepePNx?t}l6$#{g*KOE5_W@9^Zo;K z2x)<#qN@x?I#cE58`X7Nf8rU%zq@2arYo_$v^}9T$e69?J&WQvtEZj}M(mG*2ZrGi ztB3rsq;!s{#rjW<4I-ps*<;$^Sz&vts%j8XlYI= z`c)xSl6I>^NI=@3^Khbz7*>v#GUdY72EKY`afU(X;K5~|#9^oM42~3oFo(QF#^DKT z#m9nh?C^tlX;?s%anct*VQn*FlER-g*~#6E`CY@{Ht(b~dGGkU%$jDeK)_RI@GMWP z_1YtyttBXz<1M;EkfdZD9=<}Kd%luU!sG}R7z5J7J;U(}%1G0AB|Q4f$ev|!P0j%b zIZxOU$vOdzSWb6kwJal^bM|6m;z@jagGa1^-13=B;(FKK0rBc&VPbpHub12KVvuyk z@VRu9FLih3oY!M5X`47JVqwacdc*uP4#au+zfyj#N=$EmQyDVL!EkOss~%|od!SWg zU8plNNgTZ5fQlHn>6~7Vcei60?&4tT^m}qSXyk~JlMhYvv;Xpfs%orM#mw*Jsi$HG zH$yMm%=YY7$whn2Q%;jtfBd!TiOcnRibrB+_NB`;SR({iHcqLPPj~c1_z;cBTvjjd zka_+ReD!Nl3DThI+qg_jC51Ywwdd!Y9~)e+*wE}&N|5l|nS2RI3Z!Jct9_KoSq)e{ z5+=Vp6yX#5tWqF_Co5NG_Ucco-SC&8LrJ!zyoq9p%fr#vaU;lBrWg`=@#FL3b(Du5 z?wG5Njp4D#as}FAe-~O9Fw@Tc+JD~!eCg|lB(8UYtuV>w&IOkEXGviPJ4FduI~MJX ztl`O7FMZQd{)x2nu+NvDx2BE2bz>2bzV&wIxs{zVU@x)Q>CN=A@$sA;tj%z%UnHO2 zDir;z-@*Wn@cX=_E%i!7PV6%!^1*U))Y95I*b6~j(_U6H4A8~mPhX46vZFVN5;tfl zF3U$*z$HWCTUfuid081W>q**c;~=@0$#I4m$0O9ZU7eo72rK6gn(G~CybssiAjbx& zDx5FF+hthc$+_V*T0BBn#(u&?pf@ExNhA8auu)jrCuOI}a5?e;fy6CY zoA>uzBPf8)y9ya zp~dEFv!L)1pWgar4zZhc3xz6_P_hXnFAmFO&;N?tB0j~<5d6i7^ghbwW_w*(p)_M} zmqa45{nKw8<4LNdh|Cs^UVcJ*9CB-F8o~cAS-59g1Yx=Dw{gNEN~vXV^#=BA_}ZsK zD_QxKwXa)LMt(79|D7h>!o;4LU zD{`Sm>_KdvZX&G+IlCDK!%Keao871=ur}kfNk>k?V_LtMX#aS-y*iPhn~D>pS13b| zdwfRRY)FAo6cw6k?;mi0N{BkBUV_(rHB5kUpjS<)-rwN7)B9UX@QY&P8usgBKgYnh zw&u5>_y$~ceVqH{f9tnnCW)oSxQW2Hc`%nKZ>dKr{&dJ0o6XeC02QhGNOs)XKv6y5 zxN@92AmggX%fht|RgRV^Qa|lTIKS^=Z|mN;Jj?o6m#@J@?nbD*4ky;}XCCRqvpKUt zV{n{%2IUpXX4cGgm4)4ObXMiABew&^VoxkOi`t;YB(GbdkyeP^FlYIgFew{qq)oBi z0eGZaSB{%9a9g$IH@<&r=5<*6F%AsQVReu4c(PJK@Q{GWl+7f9lp_6=#U7)liI1On ztslFtF@Cyej+P~f!NXs$s>U&NlS=rj^TJ-078l#e(&KXet$lkF=36ln*0<5KcV%2V z*Pv%Gv@$}zlnIj7P`W6jEq0c4q_Uu48_I>x?H`ZmQrr63cyV-sq}Te;NoW?X)x3XGc2MP z6N(O3!?mu(fem%FuOfpzg@&O&ZmmVz8|rehH&QmF*tK=_dqTWB;++3x+n1A_V)mxE z$!31>^1NX}(SQ|RPgxpiM!_1~a`Tm|cjw#1%qh-iRf+uyF@^Q{2}2?8Ciy+aK_RcL z#*FKWQlihFDh@~GuXeiRn%?|cy0H^A+w=yr!2dB&{nbFC z(~DP%`$WWK8-;$a3A-1xneod;l+Cuz%1WMpS!o>ytr$cF zL!*<4z+NvYv(ulHELdo8_|R@T;8h(fSZwpRdnd`$)Z(twJ={P}rZ^&8Z6aE%D1JyM zBT1nnhJ<-v5B3diQE-PnHM8zZhx#32C<;0TC9An5=C(;<0!~oh#4@Z8wblHiNh}vgASH*j3&*yj*x#Xaf~Y!vhpvswwaZ&I=B+4Gg+@Zu z1~hf76Ymz!mevOT8!R0hL`v9D{D4fR%1pj)ic-kXRtEz#%KE|=OR*Dz=8cZn5}Mtb z*OXck6)|e~DiHw=k!)TzQ@~pod^}7KZ_@GQ0yFmaoLRb0&?^~PWfp~y=-u#D+1em) z@ohH>iNyQL%jGXrcW-E-bq)ox*hCE3Q5#5W6(YuS=_W}f9OJQL^m<$qU2ClI2Trj; zUE8sCLLbsFC3kCE3RyVJ`&olguB|Mma8V<^a}JHx>Dzrx^lgkQdTP6U&w1k<%82jG zV@>x3&RZ%lIvC+)uGZ-B^hl=Oxo3+2DVtE^8=%G1^rnaAAE>Gy9i)co21n zI#$AfY%;2#UTuIdF9UbNVwp^5AUs3oPt8g;{;aOPGeMuiWWR;?*d(L^6=a-*Kmh(M z%l;ecj$_){uN2d=9EqM?|D!;bxP<%6kLfu9-gSQ3(* z1?7T5YrYaWbK~|aM0MG6QRAK|uGJ za{x(}rtA$AmqG|BYyq^!uPf^my-0}i4eHD7JvR8r`ERxLSey8_?qaCAU1zi%6r>O` zrY)UsJjHUz#&(+6k92rmk}Ua2`+8q+fu1mSq#GvZSH}^uw3gpenge!4W~-JIxGP{e zw5Y_WSI|+jhWG!ZRFWeji9thPqF1}-&`e9Zb+U9|DwC>tX3m z*$b}sKxE$EB~2JKY7bnYv&`0e&wUNJ_H5zd@o?d5i^koF{Is`A$2C0s{lI*B`)j3$ zXl(cF3DR;HE%ZWHuK0(;j-0M&;navhqv1e_BEOfZ1)?y&Wwps=6)|C-3M$f&OhW%j zZWEVvdk&LN!_P<~QlZf`+?VxBhM+}s?T$AAAB8Hto@^hSDCBBVUE zKi1&8Iy9-EIH^=DM!qg7s&R&v-PRwEr$w^oT2d#2883uJYDgP=NP;Mh`G`3({tPHY znf(j36%+MNkD6fy1#2^>dc+8k8ftv2jpv{=Q$#tqhjrApb&WNAO3%^7eX&1t$vo+|b(HjPO>a;q{Bh&Ln zRvzZ9z{!4SVzAqAM@lEN|HFWlp3vQFEfb92XkOA*3pt;W!<1}eNOQ*XsoLeHS*-Qn zANMO;U8q{Ff5-k65D+7WExs2$UO@R!^D!q=G&hFDlyU=AAdqR#X7FYQMv;^M{RevW zK>yi=fcDPU_;ega867O6Lbll-hDUycx9*E2H4zLA6;HtB*P{#${k9aM|tm z0+Z7Cnk6`_%Gry{X`Bkz*{zGl49F%mgXOm-R%D=sE0`K~%kn05Y`r ztG~wHtRFgMTk(HJ{=Si~Ezrx1(np0WjxBT*4lUf&)($l7&vs8_x(pqSKs+95T1cS(ZOK|&eeY^ z^zVm{YHb5ddt}Pi3@G2DW8sxKMX&|CrI|{s*DId( zuF=q9emeYP1}B@?WL5Ocl^isuUZbL~g3(bTzhGcr%q?t*o9$Qgzh_{taxojd(eim} zo!RGkR!>~4;i*?*k%NDUiAXGz?V0srtQ9C$?ctHR$LF})#oGchpC87E@oS zUXp<26~3{*w?_@dF|3H=YyuLN&Hvw=uK#V5ra_CYv{qXB)5$bkcEA}*r?gVI#|89* zCWDR3AJ6NN2btiPBgJF1Q0gZ+^ul)|{pMWBsKj8hNmoZUpn_o&k|}5yAOKpSHB+~7 zdDs6oR<1;A(E^h64bosBXKFyyCg2*#uKK}j<{Rnb#)2xYDTZe;=HpQ;T+vX765jFN zLBkUHfAc=K5933dgzwCVf8|dU>%d^W^NT#D)Y2RzHJ_#iBhVSr8L6q1Y5nK3*m@6C zSc3{C>s(zLekLYH(qmDIba#&`3yM_Ryy=kaWeS)|q~)~qpiYXI&_iDu*c+m|hdo_V zm7u88_Q^XQ7+}v0;oLYp-3ntG=&eMI?G&^&L_J+yw-tbjblg%E1-o|mTJ_8B51!+D zja@MM`+EH)DNSWKmw!4MkbgXZL->N^UMxk$z)O|*biE?33T_o)#d{5|>W?;?ng)t|#zazzfw*P=|DMj; z#5RLyb|PX>8x)r<6X9H4F;AM<*>Ld5yI-^0gVptE-l$$De#pZ7Yj=Dqsj|m0rJFJt z=q-OHr=|7Zi`T|v>4aMU6gH?|A`ci3|I@}xX3K>|U}~!D&J4%`ZFg`&BGzqtV8ZRH zH&j%)T(oRd#Y9_yP0QViJ2OwZ?siJypM)hSut#Li?db&5Y+*(^UDup(jF zcH}e!SN{OJ#VI9zLDS&yFk;>ri2@bJ%0)0w9I4N4;a?qG#_0 z-it@0C<8X>Lap2>#_@d~+uhArfSs}CIw5! zb;>nPHh-l|^1Gc)rSIb{7F+Io%Zx~{?SwE}>lfR9qG4xAfNz=}hFbVkQo#n0IsRIT z#EG#s{zJ5~-lr1i2Rdl6d!_UpDqq>?Drho#^FF#cFg}(7G@ienTYJjM+WeZ1)u9$8 zl`M6OjO@S#_Vb% znK~ZO=Rj`wwl>iH7n%mIlYp)2<01ZrtmQGS6EuwfLNUMw@0JN>wd!*yp{7u!t`&ax zlD%+hgHx~0gzpmTJ-EeHrLhrD8*#VIR%V9Lou~fV?t>p~kL+-1{d%1eMUYC6WKmve z9~V=WLE``8|23)iZ^;CwsWI=ciRDdw4@c#mSP<_92&=iJl%l{eYR+5&D;R1u z^GcnB9*SchM+h5=vFKNjzlKQD@cAZUmdh#2gh%|u3h>WWV0sElOY97Sheo3pm3>R8 z`fK^?hY`k22;&dDci3bm0I}N234ghkD%ZdvFzwv99A6L*ZY~Ny-tb(0klKfjp3CB? zadiTMjU{A?r}lF7@-{wh|J1WZ%vX#;@(bcw70%pUH)_?Nbz~GSHa)-PTL8SyyT7B2 z8Zd2@PR!_LWJJo9=a+p8`STr|d5oIZ$sbQaR+3VpLb6Exk1$8@B9|@QthtPEt9&!o z9VC%oZvk3SfA!f{2 zoUUuW?jKM}d-vI*aVn~MK z@o&?XBDl0#jfDfqD`1I(^v^Z_2cC8{t6*rI;WE@xkJV{BkLW1erD@R~3^@Q3IBzR3 zePoAe%uIHitJ<$Ni0*TUeT)4rSH4;J@ESmu^)7ZcH8q1SAP?Pb`z_zO4>tS56sY7& zlFdBo|rGoLw2#nV5UzyApddK%*f zT=Z%_OMGgcPlIk1O7vZLxeT0qnSey)(*!nXYxDt$b%!Xglb+%`wmDF!0>->_M#p=ZY&e6Hga8sry&l$1~$=k_CKpRW~TczSJO zngV-DH91e4AAH5=?ZijA8PxhML~70OQ`gkR1f0LD_<1F4-h>lx{b1R2c6S(+E!Q~n zXcOpk5EGS_QW604Z>PnK06wn+?)fyFeA~1_oz0Y`l*gV^soDin2xXtW?|F}jF7*t> zenyn+xb3B}5ctXmHk;TFjU8tP6L4=YbVCW(oe5v&Z9~@0qzKEp7Y{Ef znDaE46IeE@{3}$s7`lUd9&g(MOfIhYM`z~hJLqZHk5}G8EpX*ycdDHT@LBU2fBJQy zvJq-K7Z(5b#sd9dF7uxbJ0>A&(-Npw5lj+cB0jpN+AjK-s&@Kr2x)ls|BY2UaZi}) zCS`So*x&ffJCl(7!lqlO282SVJ*=9_kr2uT(IkJ4Rc`73nFr2GtX|mQa(Ty*7E2< z0|Mj6&DWkXlA0SLaSTvyGOo$6~W|ueMHe8>Rq2auQYtarG zI_%y1?}K*|=xRmURI6iO6MS*{TipQd(u_6k7D7)!0UeI;K4wLe?Q>9d@|{{uEj75M^sx`w;9ll}+b zv*vH)oCV+HCPm)nx=esgQ4KTx-3AuM$xS%DIQq-*C5RmzNe`V`x{rO@D{v zBVriILSnUl0H)NGH27nqs;w(etK+{#;Q9X`f0flj;C+W!iKg!)v?TC>Tt;1@Tq}3{ zUf)Vb%M&ZX#1d2nP`7mc6hs4oSX}mnhT#X!r^!mUrATN?i<`2&7$7DjsjC`yG<}4fq4bu`RXPR2x5HY!pwaSiQr2*;A`E z{p$}90XY^3Z~^^Owp_XDr5rDJd*u=NTOOprhg=*ykpRq7Ps$j$GR_gBl#MAe&`~)r z^WKpoerO50zpAcwz0|vz;J?Ntz!BJ6VOUC#D_l>3&#*csS=~*S>XcFfY7ewWNMZpoGg3Wx;3TjFZejNJFGIt{x-a;|C?39Xp!<#%+N6NdiX^6dNypAV z<}-RJ7r<0>oP4A$hCzBI5^S&-`FVSGOb>1m(}G`>L1*&>!0L0V&W`}M!otg&6c8eL zAf^0XvVEvSRoVF&c;?yc?_}F^5!aLz30UOgWkC{N%Jlig5ij6BiqeW>Epaip2;p%k zTSyg$YsbsNofTqYJ!wlF`s~MY)QdHOIsEixz6S z6=@EPv!E{RwjV27I6s!lw!oZvWjnADQj`sb!Gj+>hu}iR#C1Vo=*xcNRn3g=(YW{w z*Iazq$Bqp7p>DQ~Z*g2*ug{Zm{H08EMfImGPVdea!1Kf2O}|)f!jsCU9+r_$L&4zE z0L?Py3=shV*iYZ^B$|!nQ?>X`XP)kf-(A`r%qI_BV;*I{Q+V$tEqv_fiIb&05^(oe z4Q5tlU-^%5A<|)Er`0Q@h1GqXzb;ukcP?9+?}iDu63u>FPx=#ksAo>6exXFhmBN#2 zd8TB16(iJQLdohGK@%`Vz@Z7!m1ya?JpX*s)}84!df4a#9FrRP#efqw_u!UClc=vt zNpRcK47-3&AzH=~RL^uW`fhmVTz%>HsH*=R(|goXV2ZEy1)SlaaGKnF-Fw>|j07wo znUIX}{aUTbU(Ub=_a9;e^cGB+S&FMB4oWy9`jU`|TudAU(mQ6o0oV zDD}Y7{G5&D(hgr6YG999#11`5nhA?m>0fyPEriVFTW z9qWG<^&On?TR~r-6qS6T77&9wDzKrTuC4sizRrkOJSH-BmS2ODEzb1>e&+q&P=N1Cl?hHtT#Jkx_bDKOE{^-@It z{kyR~g$kxZ`U@OhYr6Cjr`;N6W^27?nFSW`13V353MvQ|ET5XA0aqif3u#u%}2z(F16%0n_(yjjia=vp!AQfwoSk22p`bHqadn-u&1i z42wPA8&|Axy{H6e=xI!N47e~=5fsB(h$rpUK>&1!4RNd()DKj;gt%VmI0_g5R0n2- zT~}*hkp)R>dn1Lyp%h5=0b+|G){?$u<#g_y`F&z*8?dgMo_~GBm2*JSaRX}~zCiNd z?^GMH93$kjk8QXA;qExZ|3}o5(^{LuJ6FG%?`T}q!Vs$tso%vi=OP9kvCI2G0blBzU!(rEW*Er|FR`iU(GbxS z5x_Ly{ST42TG**k6yfFHxjHl63b7Wi#6jj^DTWgjFyH|{Q5q0VQ9o(4xI4vES#=38 zVDS+{BVT=Vb4T49;5=vBJ~)R0v9iJbbOhh{56Nq*o&ND++lkSvuL!%`|9fzJSoYFjWQ zk&0hV@(S1%);A|);K$UsUxB8a5gvMlfwtl9qsF{x&aSu$pxFbQ=xD3>1-#FG@_lZ&?2lJiA%&MBO+I8R0dCjQbb-<*s4J82{w7Eg_Cbu!21u&gVX;B%!%7oSjaX_(Gd@kN2baYCEz)cax32!IR6 z^7_>6U*y1u3JyW2`shNgYOgQ&V@sg6f+GcP*!rV%NjxqI>5UriKRW38K6ePv4aPvz z0TR;DW(vyohWv`~XIg0H06Ps8UnalNGH0H}r{6XJiH0?o$qd@)JvZArtx%`_p8eI!i(XwF>O@LRu2=cN)DBOB{~A7Iulh05lr-LeCy1Aobxf zXtG6`V*&z==D&UcqJ8uC!VUN=UYF@_;_la0r0@`MOuL?|_<*gLx9#D&mKF$s7cMF}45x zTQwVhO!F2LplKK8WL+-Acq6T6cmnPX)cfor&fJR#%)6G>tPZU;Sx=9c6z2o)VQ)bR zc`mm9WYlFU-X&$@DSK=1I5hu^8C{kHIAQOQBHzI{Z9Ia;%y*;jfDsw(H!fh3LW@eK zwl}otbq!UtXzhnrYVTG;yY?&rQ<2SpuQIvh0yTZ}VhiUP4ucu&Sl@*yk{YPx{6739 z@|TMFH~z+-l1J@dA+}g*FuGLc&3yNAT0wk)Ce$jXfALmD;N0{6ADU*12>J1cln;ug z2+xA{(Wt)yg}I6*TgL3s@So7c6|;9s4(>v%3LEOVCH+SM|uom}5^9{`Ppu+_bW z4OQnV4&O>uXg(7w>aIWmr$vAODHtbcE)L=MdWaJl$^e;u|s3I>mKUrr8 zSsfqb06VWgG3^Bp2_1+@48^7PIAjI$ojNT{3=t)jT zC2k(h|1!m6F@H9nZ{(=>Eb9Uj6ZM7Q5YFx2Nw?80Sf!8VDD8*{Y)IPAg#m;Pz|u4~ zcEk(o3QExkt0Gt<%zE58GY+I@f0qCt#7{zC(o zhN;|k9k6piCB7_dI}|n`)*VQ*YB!jFIC6J zl)|uowo`5Pb8z#Lz$EWf<9jdA~GI;xG{06zUqnZUBF2vl4@6WY2;I!`e*#!XM zfp?dO%};Z>;LCv>+FauRZ{w^1%$(aWpAMrK9_wn&h1r1~n=MfDb^;y`G)H&7oi4%L z;}dYIjTz!X(_#SokdyoP9{C@oy%pcmHUeU*7SGlS)4t0JAHn7zLHLv)lSs7>*)fG! zpV9pYRj8cpBT`!cjsA=Uwr3okdx4~)R(<-&K37Sx)mBmgOu(Zs`s#;&>(e~>FNc1^ z_`@xI`C36sU1VXhBT_gb!i)c|b_fp!2_PvNfIEmvDw`qgoDTt~b3^>;M9{ekr)bLp zm}~gNr!t{P*w`f9|8lanKDLP|==_W*tC_Vj=oki!`|aE7#dLi%Rwj5zINGaqAj*?) zC_29Jrf-_l4|_)7+j5=Vo$F&G2)N#ewB6sl20VIf5x*sag*=WB&V-uZIL}K>@JUO* zLva*hp8p&^f;z3??k!h$6wiPo7aRqafOYc{$E?e1e=FKf%HNX|ITxnpC9=Tdh6^`2n0-sl$_)50&(AS!~2fcp8<3R7IXKkBM7c- zq!sOE0YA6N0jpL4dPDXyJt{)n6a3+E7&M%G(Y@2;h=@D#-aqmRGe8;zI0sRBLnr$1 z?G#;Ybm@PVdBxWjz)~yYLjo}qLN|=AIz*0G^$JNg*oa>1k$V}R@D}eI!0*ng2#hg3 z$#172y$J*NXv-Er5EERYN+vtKpjcpSgB9i*D%W4WHV_FA z*dbdYKoc6tOtl3%VPhw9cki|N%yyP17*uIG8j~hkzt0^eEFe8XOiY%cDZFzw^qgZtLFG6B##LHSG`D?0T|jsa zz~Z9@Y!(lLuGtGsk9i>hJ3&aX5Rc8Ql@I#v`oUJMV}xm_r6V2kV501gcyVQCG~!`2 z&$*#FCQ8n}gF1NIXXGc_W)Xbc)|lbuwa2Z3zF!x8@?QKQSaF8Ae?)0BY-LXRgf;q; zSVK-6-^P5q@Xoz3F6vR{IYlULu?AB(GJ5CX)!D+>C>Mu7=QYL=HS<9SuP3lefE{)l z==|(vvPu^mEHx$uA@Pm89qrvYAD=T@%klS#zVBq#z%B6HPxAgJ zoiFC?#86*y}Cy`|SyCywvGRCuMpdatMbsw#5r=zbW;}Hzm=* zuo3)eW}DpTfE|79zh8^n zPFE;_a8o;j(TDY$+t+w7e#e4lIFLBeE0mzeJ@xjh7bOQws6jX4ImZwgjS#3TCzF2D zZWJ}P)3xTR2^>>-Bg0j>^tJ~N!<8YBK;X*>T%@{+j0)!uAz8m`|y;A;1}WR!M|ppj)G~$i*lWdgfN|B++K7@Po!N-+0$x zs3#9>>U_p$eSO7H6%m0fmlw~@T${+04SQMdP`>&>vt21*Jc?>dH!r?gL^K=p75ijf zHN7PnfOFub3&6Nkzi22YXN!P%V{rh2A|RRCz<4J-vj2XG^tB6zX*IVoabA-{Ja7y_ zj1ctF#0_cyqRnN!JA-ZSP3y0bPTKW4==R_jUlkY*ZP)6Wf9w6TxU2{|Cdm6{Hao(H z7=W;6m}HS;f%@%Kmj!j=rnvIZ))ff*5!KEUlUD-#s=j9FZaYjR$QD>%tcG^i!>-1u zNzMWfc{=3>w*gQ%om8AIU|)R6QwJIj#BOuz0@AX-P=Om^ABThmRP?7w1tmB{Fk?qV rpwTlAM>9#N=Bo3To};ItK8X`Kltp9ua0q~uIs_`KBJ)GaIPiY}%CVq+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rivencraft/textures/item/page_symbol_lighting_normal.png b/src/main/resources/assets/rivencraft/textures/item/page_symbol_lighting_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..e5a43dc39e6a7df0819fa37da092382e8353d57f GIT binary patch literal 12567 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rivencraft/textures/item/page_symbol_terrain_standard.png b/src/main/resources/assets/rivencraft/textures/item/page_symbol_terrain_standard.png new file mode 100644 index 0000000000000000000000000000000000000000..baacfc2984c3adf88d9eaf3d913da4bb9c1e33c0 GIT binary patch literal 12669 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 L<;2QG^#lGNQzLvF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rivencraft/textures/item/page_symbol_weather_normal.png b/src/main/resources/assets/rivencraft/textures/item/page_symbol_weather_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ad202f499392bf6e5bc6f3961961d06e4fcb7e GIT binary patch literal 11988 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 iM_ML5jeN@Zj^X&q35+w=M4bg@3I