From 24e2a9e88ddb373122d4b6bf7f0ad12685846c65 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Fri, 11 Nov 2016 16:37:45 +0100 Subject: [PATCH] Finished crafting page. --- .../mod/booklet/InitBooklet.java | 20 +++++------ .../mod/booklet/gui/GuiBooklet.java | 2 ++ .../mod/booklet/gui/GuiEntry.java | 31 ++++++++++++++++-- .../mod/booklet/gui/GuiMainPage.java | 2 +- .../mod/booklet/gui/GuiPage.java | 27 +++++++-------- .../mod/booklet/page/ItemDisplay.java | 1 + .../mod/booklet/page/PageCrafting.java | 28 ++++++++++++++-- .../mod/booklet/page/PageTextOnly.java | 13 +++++--- .../mod/util/StringUtil.java | 1 - .../gui/booklet/guiBookletGadgets.png | Bin 2384 -> 2760 bytes 10 files changed, 91 insertions(+), 34 deletions(-) diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/InitBooklet.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/InitBooklet.java index 14fcd2528..add7a2005 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/InitBooklet.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/InitBooklet.java @@ -75,20 +75,20 @@ public final class InitBooklet{ if(!ActuallyAdditionsAPI.ALL_CHAPTERS.contains(chapter)){ ActuallyAdditionsAPI.ALL_CHAPTERS.add(chapter); chapCount++; - } - for(IBookletPage page : chapter.getAllPages()){ - List items = page.getItemStacksForPage(); - List fluids = page.getFluidStacksForPage(); + for(IBookletPage page : chapter.getAllPages()){ + pageCount++; - if((items != null && !items.isEmpty()) || (fluids != null && !items.isEmpty())){ - if(!ActuallyAdditionsAPI.BOOKLET_PAGES_WITH_ITEM_OR_FLUID_DATA.contains(page)){ - ActuallyAdditionsAPI.BOOKLET_PAGES_WITH_ITEM_OR_FLUID_DATA.add(page); - infoCount++; + List items = page.getItemStacksForPage(); + List fluids = page.getFluidStacksForPage(); + + if((items != null && !items.isEmpty()) || (fluids != null && !items.isEmpty())){ + if(!ActuallyAdditionsAPI.BOOKLET_PAGES_WITH_ITEM_OR_FLUID_DATA.contains(page)){ + ActuallyAdditionsAPI.BOOKLET_PAGES_WITH_ITEM_OR_FLUID_DATA.add(page); + infoCount++; + } } } - - pageCount++; } } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiBooklet.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiBooklet.java index bcabecb10..45aac8756 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiBooklet.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiBooklet.java @@ -15,6 +15,7 @@ import de.ellpeck.actuallyadditions.mod.util.AssetUtil; import de.ellpeck.actuallyadditions.mod.util.StringUtil; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -56,6 +57,7 @@ public abstract class GuiBooklet extends GuiBookletBase{ @Override public void drawScreen(int mouseX, int mouseY, float partialTicks){ + GlStateManager.color(1F, 1F, 1F); this.mc.getTextureManager().bindTexture(RES_LOC_GUI); drawModalRectWithCustomSizedTexture(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize, 512, 512); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiEntry.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiEntry.java index bd1ed8d56..c234ce7b0 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiEntry.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiEntry.java @@ -12,13 +12,17 @@ package de.ellpeck.actuallyadditions.mod.booklet.gui; import de.ellpeck.actuallyadditions.api.booklet.IBookletChapter; import de.ellpeck.actuallyadditions.api.booklet.IBookletEntry; +import de.ellpeck.actuallyadditions.api.booklet.IBookletPage; import de.ellpeck.actuallyadditions.api.booklet.internal.GuiBookletBase; import de.ellpeck.actuallyadditions.mod.booklet.button.EntryButton; +import de.ellpeck.actuallyadditions.mod.booklet.misc.BookletUtils; +import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import java.io.IOException; import java.util.List; @SideOnly(Side.CLIENT) @@ -27,11 +31,13 @@ public class GuiEntry extends GuiBooklet{ //The page in the entry. Say you have 2 more chapters than fit on one double page, then those 2 would be displayed on entryPage 1 instead. private final int entryPage; private final IBookletEntry entry; + private final List chapters; public GuiEntry(GuiScreen previousScreen, GuiBookletBase parentPage, IBookletEntry entry, int entryPage){ super(previousScreen, parentPage); this.entryPage = entryPage; this.entry = entry; + this.chapters = entry.getChaptersForGuiDisplaying(this, null /*TODO Insert search bar text here*/); } public GuiEntry(GuiScreen previousScreen, GuiBookletBase parentPage, IBookletEntry entry, IBookletChapter chapterForPageCalc){ @@ -48,12 +54,11 @@ public class GuiEntry extends GuiBooklet{ super.initGui(); int idOffset = this.entryPage*(BUTTONS_PER_PAGE*2); - List chapters = this.entry.getChaptersForGuiDisplaying(this, null /*TODO Insert search bar text here*/); for(int x = 0; x < 2; x++){ for(int y = 0; y < BUTTONS_PER_PAGE; y++){ int id = y+x*BUTTONS_PER_PAGE; - if(chapters.size() > id+idOffset){ - IBookletChapter chapter = chapters.get(id+idOffset); + if(this.chapters.size() > id+idOffset){ + IBookletChapter chapter = this.chapters.get(id+idOffset); this.buttonList.add(new EntryButton(id, this.guiLeft+14+x*142, this.guiTop+11+y*13, 115, 10, chapter.getLocalizedNameWithFormatting(), chapter.getDisplayItemStack())); } else{ @@ -63,6 +68,26 @@ public class GuiEntry extends GuiBooklet{ } } + @Override + protected void actionPerformed(GuiButton button) throws IOException{ + if(button instanceof EntryButton){ + int actualId = button.id+this.entryPage*(BUTTONS_PER_PAGE*2); + + if(this.chapters.size() > actualId){ + IBookletChapter chapter = this.chapters.get(actualId); + if(chapter != null){ + IBookletPage[] pages = chapter.getAllPages(); + if(pages != null && pages.length > 0){ + this.mc.displayGuiScreen(BookletUtils.createPageGui(this.previousScreen, this, pages[0])); + } + } + } + } + else{ + super.actionPerformed(button); + } + } + @Override public void addItemRenderer(ItemStack renderedStack, int x, int y, float scale, boolean shouldTryTransfer){ diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiMainPage.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiMainPage.java index b4829a1c6..fadc2c625 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiMainPage.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiMainPage.java @@ -52,7 +52,7 @@ public class GuiMainPage extends GuiBooklet{ if(ActuallyAdditionsAPI.BOOKLET_ENTRIES.size() > button.id){ IBookletEntry entry = ActuallyAdditionsAPI.BOOKLET_ENTRIES.get(button.id); if(entry != null){ - this.mc.displayGuiScreen(new GuiEntry(null, this, entry, 0)); + this.mc.displayGuiScreen(new GuiEntry(this.previousScreen, this, entry, 0)); } } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiPage.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiPage.java index 4f811bfc3..2ec3f79ed 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiPage.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiPage.java @@ -15,6 +15,7 @@ import de.ellpeck.actuallyadditions.api.booklet.internal.GuiBookletBase; import de.ellpeck.actuallyadditions.mod.booklet.page.ItemDisplay; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -111,6 +112,15 @@ public class GuiPage extends GuiBooklet{ @Override public void drawScreen(int mouseX, int mouseY, float partialTicks){ + super.drawScreen(mouseX, mouseY, partialTicks); + + for(int i = 0; i < this.pages.length; i++){ + IBookletPage page = this.pages[i]; + if(page != null){ + GlStateManager.color(1F, 1F, 1F); + page.drawScreenPre(this, this.guiLeft+6+i*142, this.guiTop+7, mouseX, mouseY, partialTicks); + } + } for(ItemDisplay display : this.itemDisplays){ display.drawPre(); } @@ -118,22 +128,13 @@ public class GuiPage extends GuiBooklet{ for(int i = 0; i < this.pages.length; i++){ IBookletPage page = this.pages[i]; if(page != null){ - page.drawScreenPre(this, this.guiLeft+6+i*142, this.guiTop+7, mouseX, mouseY, partialTicks); - } - } - - super.drawScreen(mouseX, mouseY, partialTicks); - - for(ItemDisplay display : this.itemDisplays){ - display.drawPost(mouseX, mouseY); - } - - for(int i = 0; i < this.pages.length; i++){ - IBookletPage page = this.pages[i]; - if(page != null){ + GlStateManager.color(1F, 1F, 1F); page.drawScreenPost(this, this.guiLeft+6+i*142, this.guiTop+7, mouseX, mouseY, partialTicks); } } + for(ItemDisplay display : this.itemDisplays){ + display.drawPost(mouseX, mouseY); + } } @Override diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/ItemDisplay.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/ItemDisplay.java index 50c4ea1b7..ed6e4ba55 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/ItemDisplay.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/ItemDisplay.java @@ -19,6 +19,7 @@ import de.ellpeck.actuallyadditions.mod.util.ModUtil; import de.ellpeck.actuallyadditions.mod.util.StringUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; import net.minecraft.util.text.TextFormatting; diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/PageCrafting.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/PageCrafting.java index 7f07d7f91..65a0e3cc8 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/PageCrafting.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/PageCrafting.java @@ -11,13 +11,19 @@ package de.ellpeck.actuallyadditions.mod.booklet.page; import de.ellpeck.actuallyadditions.api.booklet.internal.GuiBookletBase; +import de.ellpeck.actuallyadditions.mod.booklet.gui.GuiBooklet; import de.ellpeck.actuallyadditions.mod.util.ModUtil; +import de.ellpeck.actuallyadditions.mod.util.StringUtil; import de.ellpeck.actuallyadditions.mod.util.Util; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.ShapedRecipes; import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraftforge.fml.client.config.GuiUtils; import net.minecraftforge.fml.relauncher.ReflectionHelper; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.oredict.ShapedOreRecipe; import net.minecraftforge.oredict.ShapelessOreRecipe; @@ -26,6 +32,7 @@ import java.util.List; public class PageCrafting extends BookletPage{ + private String recipeTypeLocKey; private boolean isWildcard; private final List recipes; @@ -43,6 +50,19 @@ public class PageCrafting extends BookletPage{ return this; } + @Override + @SideOnly(Side.CLIENT) + public void drawScreenPre(GuiBookletBase gui, int startX, int startY, int mouseX, int mouseY, float partialTicks){ + super.drawScreenPre(gui, startX, startY, mouseX, mouseY, partialTicks); + + gui.mc.getTextureManager().bindTexture(GuiBooklet.RES_LOC_GADGETS); + GuiUtils.drawTexturedModalRect(startX+5, startY+6, 20, 0, 116, 54, 0); + + gui.renderScaledAsciiString("("+StringUtil.localize(this.recipeTypeLocKey)+")", startX+6, startY+65, 0, false, 0.65F); + + PageTextOnly.renderTextToPage(gui, this, startX+6, startY+80); + } + @Override public void initGui(GuiBookletBase gui, int startX, int startY){ super.initGui(gui, startX, startY); @@ -87,12 +107,14 @@ public class PageCrafting extends BookletPage{ width = shaped.recipeWidth; height = shaped.recipeHeight; stacks = shaped.recipeItems; + this.recipeTypeLocKey = "booklet."+ModUtil.MOD_ID+".shapedRecipe"; } else if(recipe instanceof ShapelessRecipes){ ShapelessRecipes shapeless = (ShapelessRecipes)recipe; for(int i = 0; i < shapeless.recipeItems.size(); i++){ stacks[i] = shapeless.recipeItems.get(i); } + this.recipeTypeLocKey = "booklet."+ModUtil.MOD_ID+".shapelessRecipe"; } else if(recipe instanceof ShapedOreRecipe){ ShapedOreRecipe shaped = (ShapedOreRecipe)recipe; @@ -109,6 +131,7 @@ public class PageCrafting extends BookletPage{ stacks[i] = input instanceof ItemStack ? (ItemStack)input : (((List)input).isEmpty() ? null : ((List)input).get(0)); } } + this.recipeTypeLocKey = "booklet."+ModUtil.MOD_ID+".shapedOreRecipe"; } else if(recipe instanceof ShapelessOreRecipe){ ShapelessOreRecipe shapeless = (ShapelessOreRecipe)recipe; @@ -116,6 +139,7 @@ public class PageCrafting extends BookletPage{ Object input = shapeless.getInput().get(i); stacks[i] = input instanceof ItemStack ? (ItemStack)input : (((List)input).isEmpty() ? null : ((List)input).get(0)); } + this.recipeTypeLocKey = "booklet."+ModUtil.MOD_ID+".shapelessOreRecipe"; } for(int x = 0; x < width; x++){ @@ -128,11 +152,11 @@ public class PageCrafting extends BookletPage{ copy.setItemDamage(0); } - gui.addItemRenderer(stack, startX+10+x*18, startY+10+y*18, 1F, true); + gui.addItemRenderer(copy, startX+6+x*18, startY+7+y*18, 1F, true); } } } - gui.addItemRenderer(recipe.getRecipeOutput(), startX+50, startY+50, 1F, false); + gui.addItemRenderer(recipe.getRecipeOutput(), startX+100, startY+25, 1F, false); } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/PageTextOnly.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/PageTextOnly.java index e331d0226..87c391676 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/PageTextOnly.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/PageTextOnly.java @@ -11,6 +11,7 @@ package de.ellpeck.actuallyadditions.mod.booklet.page; import de.ellpeck.actuallyadditions.api.booklet.internal.GuiBookletBase; +import net.minecraft.client.renderer.GlStateManager; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -22,12 +23,16 @@ public class PageTextOnly extends BookletPage{ @Override @SideOnly(Side.CLIENT) - public void drawScreenPost(GuiBookletBase gui, int startX, int startY, int mouseX, int mouseY, float partialTicks){ - super.drawScreenPost(gui, startX, startY, mouseX, mouseY, partialTicks); + public void drawScreenPre(GuiBookletBase gui, int startX, int startY, int mouseX, int mouseY, float partialTicks){ + super.drawScreenPre(gui, startX, startY, mouseX, mouseY, partialTicks); + renderTextToPage(gui, this, startX+6, startY+5); + } - String text = this.getInfoText(); + @SideOnly(Side.CLIENT) + public static void renderTextToPage(GuiBookletBase gui, BookletPage page, int x, int y){ + String text = page.getInfoText(); if(text != null && !text.isEmpty()){ - gui.renderSplitScaledAsciiString(text, startX+6, startY+5, 0, false, 0.75F, 120); + gui.renderSplitScaledAsciiString(text, x, y, 0, false, 0.75F, 120); } } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/util/StringUtil.java b/src/main/java/de/ellpeck/actuallyadditions/mod/util/StringUtil.java index 0c674c609..2a9b942b0 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/util/StringUtil.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/util/StringUtil.java @@ -53,7 +53,6 @@ public final class StringUtil{ return ""; } - @SideOnly(Side.CLIENT) public static void renderScaledAsciiString(FontRenderer font, String text, int x, int y, int color, boolean shadow, float scale){ GlStateManager.pushMatrix(); diff --git a/src/main/resources/assets/actuallyadditions/textures/gui/booklet/guiBookletGadgets.png b/src/main/resources/assets/actuallyadditions/textures/gui/booklet/guiBookletGadgets.png index 2a797458a39495f81ce15f38598743c0a6c65422..3c519266ea74d00d7487dd72c929c6d6b7d56eaf 100644 GIT binary patch literal 2760 zcmeHJX;jlm67OUZ0uh7}7#0Wwol&!LiR-~72?7&=kwcV40SPRJ=oq<=04C~6bPysU zgMbn+>Ak7ohkJN84 zJ!4~w$;^q|eDQDjvF~1_;$y=_>V5Y-nZp%*mp14fK3Yc}x}ID;!}CbVSFw+*fm^4n z&IWehvdOVYlf<3=@y8#kd}_%H>QPMz|8;=L|0IV^^X7 zgMU_&9|knk?1|{cpux$TEbz7}aPaukQ%5(aMStgIEE90^ z`qtKxY@_)}l*smpgQ0`0ukQ2G(#;P==#fUuCql#7=ocs681G z6k}d4tWAzF%#52zZSX&G&(}+?Ks2K8ScN@KqX^q3~}9Yr@=pG3Vh)_53MH?>1^e1Jz#N)&V{dQnb8j+E|u4 zx*T7uy7$b7Hw6$Z}R!Zmbcuv%#9$ztjN&inHJGRxC zFEnA%AifAFP&pZ?@CUdvLBmu_9WZlEx3%B!zOXImaDsl7e9u$GO7N-7y4+>5HdQ(y z>AiDWhrnoD-8_(wM$&9`kXm0={`yFI>h$0s_Q^1BUv^+c{NCp1hNq2 zI^dt+mmQTIS*Au8*=Ym)Z?nGAelIL*5nQ}sIGplOxH>H~V;p|hxa@ZN)shHDGd}dl zvVpu0g4c;2b(8MIr`xDVg>_Y-VOn+Lfq1OMvRmK$*__{Y6>5|e>t9Ic_{*y?rGQeh zs@pi=g9C5wj(WSqPRH|6i>c zrsv#YZz@ypVNlMz{@W`N&8zGu6d{4KT88SY+3Ma`*1Xui+bY^zJ~Q-cxBU`@sOB8) z1%xxh#P#T=akPkVvbl=1bzXkIh3ZHNf1W=33-uF!YvhPsN}uraK+WOK0qJbwR7qL0 z?BPTJP+C5%?q%OO04v&f3?>sVFm(tG2$g{<&%xR=TsM>Sb0m@rrS>eWZ;;`s4WVU1-|3 zwBalAPN5D25$6DZ7M!ZCm>aCKb2AwhFclJ!-LQb$jy-0dAb2_A4ffA`pa(?kSkD5~ zNLxH}38K-dcIK4eW-F04oLg(T(4x0)2yNma@!oo^@YLeCm0-KG1AK)XGq}_&y$h8- z3-C+s1h&X_+Ub`Ez{O4HM57$ZW;7{Oi9jx1^9JQk93m|MqcO3ycmJ9|PO}#7vsf06 z*e0=suODz~;5c^F4s*s}!Uw35vASRC#zbjBP>)w+wpds8&>ftAW=ae{cOS(QXB2oEJ>yFQmun*zqi!eyH7V;J9n+6`0YYr&FKCFRHtPF2!a&#N z_8kzf+JyQckzhAn{Xr4Lnb(4KbwDp>SLFqW?wtOILpY5eO8A=2I zi-yvNFPb<3<51Psi|VkXYny@QUz>j=;s3W1FeQ;nWL;#mc+-N~Z_pPLxVm^aR~;Z- F_#F`$oJjxx literal 2384 zcmeH}`%}_s6o+3}Fcmd-*U{3{+8tYWCCRcYBHCru)NG~FT#c|4F9~6kX$llGWx2(6 zSy3{oZPOeLrRlPg0U|$vwy_)!#n4F&wJ*bbI#{EGw+El zo5LLK-R%JYjuGJ-VgZ0bTNtplflOld^;F0p$f41p00=oK3keCG?e>N5*bjhH`G*BN z-cw11oO9?A(HrMzY`wl-6Y%zy-x%bYPv00%Cs0%AIi&0qu#c2Zq5D%(=nDh=m-+`R zTaU;b0l-!iu_1Kpp`CAgl>4{k%$L(rYr9JQtDn(EHieNBuP>)0>5l%A+A)7gK~>MzS<+0 z-ux#yc(ggQtzonbTg@NfUnoyjz$vs?ONEx7yvyOCS=7;z3B$6V$GOwu?`7y0q^0(dWXe z3`-(8=BEUuoe&|qcW(z2@fzvOH3i%s7kD)-P%PxfL`6Me<8K`GDPcK9|s>7#ltVGqNc)tBY_Az--u~?Ic`A> z%1-p9rzJ1;OBYL{x&BFsNpRyttna{qsjO)HplL@k3_LpLCcT}h8bY><5N~4IDhL&u`+c0( z<5%SbI-ZJAvAwr%-`=6u)4Oh^e~SWXCC3FI`SPz^sYg{)!JCm6mcOap@AAfKh!Vc? z)NV8o0M?sIw~)jZxfXwD>~eu!wYX27omL>Hdd{Yecd6AoT|xU&1H6#s4cyj{v-ionYL^yp1>+=E&$lxG?Qse-GM&4Dgb&vWGcS&5uHEL|(2RuJN?2rfS3m zxikdyP*9dP?BqP%O~f-N#(YyY1$`8Ecxo#Shx?%Z1l(7HEW}Q?y0Ln1iX94kzta44 z3@>m`UbN3|X?svEOxDj#{O7nSHik?lzYkKs=v!s!H&>9Lo}6_HspI1HMq?bC&E_na z*4@DSam-ezwg)IJE!JwwQZ9A{yU-XG)~|9}Oa0Ni>7}G%2;*IzLEDx|%pCN-6vSVf z$A$EWY5>WsKUAEaN~d~5sG&u8Er07kl$cR9^fHh4`M#ZrJA5yzcCMG0@Q5GZ%DH5D z#)%EU<=oB7WUMj9+t18>DX_WIpnwDS#TZt171tc_FyMJjLoOD>KIAnzouZR;tRNN* z&^9~F${LMT4V^{XtbXJV2;V9|6e68RO&`IG^G}LGq1-xpgiV8yo&>`;tMyZ{!T93F z;xqV9XlkEL$h~0+7=v|E!>ss0JpDGX{_Rt}nJl@`b`g6w&!UFl6ry`~ON+X#QYfEt zG2E9;JT`;Um_pq>JR+19%bqS#if_R?1u-TvGN+TODUIn|UUPfNk@y9WD!E;*(oPSf zie1oqfBcC?bAhj}#S*9HI#MF!YJQ|bkuwSLi8H(x=w&MLIcQENUn9p*lF%r-2&IzgEap1_a7